进程
进程即为执行程序,作为现代分时操作系统的工作单元。
每个进程有自己独立的数据,堆以及堆栈段。理论上每个进程间的工作是独立的,互不交涉的,即使执行同一个文件,两个不同进程间也是互不影响的。
进程状态
new: 正在创建
running: 正在执行
waiting: 等待事件发生(I/O完成获得中断信号)
ready: 等待分配处理器
termimated: 执行完成
计算器系统中,每个处理器一次只能运行一个进程,所以在创建好一个进程后都会进入ready状态,等待调度器分配处理器执行。在执行过程中,如果需要加载文件(需要调动I/O)或着等待用户输入等事件发生,那么进程会进入waiting状态,将CPU空闲出来,供其他进程使用。当文件加载完成或者用户输入完成,满足进行进行执行的条件,则状态会调整到ready状态,等待调度器分配处理器继续执行进程程序。不过,系统中有个中断产生,必须去处理该中断事件的时候,也会将进程暂停,进入waiting状态,使得系统能够优先处理中断。当进行执行完后即进入terminated状态。
进程通讯
一般来说,进程的数据是各自独有的,相互之间无法直接访问。如果一个进程要影响其他进程或者受其他进程影响,或者两个进程间交换信息,则需要一种通信机制。
进程间的通信有两种基本模型:共享内存和消息传递。
共享内存
顾名思义,共享内容就是开辟一个内存空间,允许多个进程访问,通过在共享空间中读写,达到交换数据的目的。在使用共享内存的时候,必须保证不同进程在同一位置不能同时写入数据。
消息传递系统
这种机制类似于网络的通信,进程利用操作系统提供的机制,调用send()操作,向目标进程发送数据,而接收进程调用receive()操作接收消息。
线程
一个进程至少拥有一个线程,线程可理解为进程中正在执行的操作。
多线程:一个进程中同时在进行过个操作。如浏览器中,在显示图像和文本的同时还在不断接收网络数据。
多线程的优点:
响应性。一个进程不会因为局部冗长的操作而无法及时处理用户的操作,增加用户的相应程度。
资源共享。线程能够访问对应进程下的所有数据,这很方便进行不同线程间的数据交互。若采用多个单线程的进程,进程间的消息共享必须通过进程通信机制进行。由于进程间的资源是独立的,所以执行相同代码的两个进程必须将代码加载两份,而进程中的多个线程间可以共享同一份代码数据。
经济。进程创建的时候需要分配适当的内存和资源,代价非常昂贵。线程只需要共享已有的资源即可。
可伸缩性。多线程进程可通过多核处理器并行运行。而单线程进程不管多少个处理器,都只能利用一个处理器运行。
个人总结
进程是提供了程序运行的空间或者环境,线程是利用了进程申请得到的资源进行工作的一个流程。随着计算机的发展,尤其是多核处理器的发展,一个进程中只进行一个线程操作太过浪费申请来的资源(数据,代码,文件等),而且单线程容易某些错误中断或者耗时操作而阻塞。而多线程操作就有上述所说的优点,耗时操作可单独作为一个线程,单独分配一个处理器进行处理,使得该操作不会影响到进程的其他事件的响应,提高进行的响应性。多线程的运行(尤其在多核处理器上)可加速一些相同且独立的操作(由线性执行变为了并行执行)。
参考资料
[1] 《操作系统概念》 [美]Abraham Slberschatz, Peter B. Galvin, Greg Gagne