1.进程和线程关系及区别
http://blog.youkuaiyun.com/yaosiming2011/article/details/44280797
定义:
- 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动。进程是系统进行资源分配和调度的一个独立单位。
- 线程是进程的一个实体,是CPU调度和分派的基本单位,一个进程可以拥有多个线程,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(程序计数器,寄存器,栈),但是它可以与同属一个进程的其他的线程共享进程所拥有的全部资源。
关系:
- 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程可以并发执行。
线程进程的区别:
- 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径。
- 线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。
- 对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
线程私有和共享那些资源?进程私有和共享那些资源?
- 线程私有:线程栈,寄存器,程序计数器
- 线程共享:堆,地址空间,全局变量,静态变量
- 进程私有:地址空间、堆栈、寄存器、全局变量
- 进程共享:进程目录、代码段、公共数据、进程ID
进程PCB
- 进程id:系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
- 进程的状态,有就绪、运行、挂起、停止等状态。
- 进程切换时需要保存和恢复的一些CPU寄存器。
- 描述虚拟地址空间的信息。
- 描述控制终端的信息。
- 当前工作目录
- umask掩码
- 文件描述符表,包含很多指向file结构体的指针。
- 和信号相关的信息。
- 用户id和组id。
- 会话和进程组。
- 进程可以使用的资源上限。
2.进程间、线程间通信方式小结
http://blog.youkuaiyun.com/Alexlee1986/article/details/21227417
进程:
- 管道(Pipe)及有名管道(named pipe)
- 信号(Signal)
- 报文(Message)队列(消息队列)
- 共享内存
- 信号量(semaphore)
- 套接字(Socket)
- 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
- 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
- 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
- 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
- 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
- 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
父子进程
读时共享写时复制!!!
父子相同处:全局变量、.data、.text、堆、栈、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式。
父子不同处:1. 进程ID、 2. fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器)
6.未决信号集
线程:互斥锁,信号量,临界区
3.进程间调度算法
http://blog.youkuaiyun.com/xuzhiwangray/article/details/50564702
- 时间片轮转调度算法.
- 先来先服务调度算法
- 优先级调度算法
- 高响应比优先调度算法:根据“响应比 = (进程执行时间+进程等待时间)/进程执行时间”这个公式得到的响应比来进行调度。
- 多级反馈队列调度算法 :将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。
4.同步与异步的区别
同步,就是实时处理(如打电话),比如服务器一接收到客户端请求,马上响应,这样客户端可以在最短时间内得到结果,但如果多个客户端,或者一个客户端发出的请求很频繁,服务器无法同步处理,就会造成涌塞。
异步,就是分时处理(如收发短信),服务器接收到客户端请求后并不是立即处理,而是等待服务器比较空局的时候加以处理,可以避免涌塞。
对于写程序,同步往往会阻塞,没有数据过来,我就等着,异步则不会阻塞,没数据来我干别的事,有数据来去处理这些数据。