现在的位置: 首页 > 综合 > 正文

进程(Process)和线程(Thread)

2013年09月18日 ⁄ 综合 ⁄ 共 2518字 ⁄ 字号 评论关闭

进程(Process)和线程(Thread)

1.Process特点

(1)进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;

(2)进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;

(3)从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。

2.引入Thread目的:在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。

3.相同点:都是按特定顺序执行的指令序列/有自己的执行控制块-->拥有自己的寄存器、状态及调度策略等。

4.关系以及不同点

(1)进程存在于操作系统内,并对应于用户可看作为程序或应用程序的事物。另一方面,线程存在于进程内。因此,线程有时也称作“轻量进程”。一个进程至少包括一个线程,通常将该线程称为主线程,一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓的多线程。

(2)多个进程的存在使得计算机能够一次执行多个任务。而多个线程的存在使得进程能够分解工作以便并行执行。在多处理器计算机上,进程或线程可以在不同的处理器中运行。这使得真正的并行处理成为可能。

(3)并行处理处理并不总是能够成功。有时候必须要同步线程。一个线程可能必须等待另一个线程的结果,或者一个线程可能需要独占访问另一个线程正在使用的资源。同步问题是多线程应用程序中出现bug的一个常见原因。有时候线程可能最终等待的是永远不会变得可用的资源。这导致了一种称为“死锁”的状况。

(4)进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响;线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源大效率差,不适合并发。

5.实际应用:

(1)例如有一个Web服务器要进程的方式并发地处理来自不同用户的网页访问请求的话,可以创建父进程和多个子进程的方式来进行处理,但是创建一个进程要花费较大的系统开销和占用较多的资源。除外,这些不同的用户子进程在执行的时候涉及到进程上下文切换,上下文切换是一个复杂的过程。所以,为了减少进程切换和创建的开销,提高执行效率和节省资源,人们在操作系统中引入了"线程thread"的概念。

(2)对开发人员来说,线程之间的数据共享比进程之间的容易得多。在unix上,进程间数据共享是通过管道、SOCKET、共享内存、信号灯等通信机制实现的,在 windows 上也有一套类似的机制。而线程间数据共享只需要共享全局变量即可。多进程无疑比多线程程序更健壮一些,但是代价也是比较大的,特别在进程数或者线程数较多的情况下。

6.举例

例子1:进程就好比淮海战役,而线程就好比淮海战役中的某一次战斗。

(1)进程只是一个资源的集合体,拥有地址空间、寄存器、调度策略等,而线程是(利用这些资源)真正的执行单元;就好像淮海战役只是资源集合体,它拥有作战地点、兵营、作战策略等资源,而战斗才是这次战役真正的执行者。

(2)进程在执行过程中拥有独立的内存单元,多个线程共享内存(只能共享所在进程中的内存);就好像淮海战役拥有自己独立的武器和士兵(平津战役是不可以使用这些资源的),而淮海战役的每次战斗却可以共享这些武器和士兵。补充①:对于某一火炮or特种兵(暂用cache表示)的使用,物不能复制人不能分身,a战斗(a线程)在使用这一cache时,b战斗(b线程)就要排队等候a战斗执行完毕才可以使用这个cache,如果a战斗打的昏天黑地,b战斗就等不到这一cache,后面的战斗也无法进行,这样就形成了"死锁"。补充②:进程之间可以共享内存,但它却拥有自己的栈空间和独立的执行序列,即线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)。铁打的兵营流动的兵,兵营是不可以共享的。

(3)每个独立线程都包含程序运行的入口、顺序执行序列和程序的出口,正因为如此多线程才可以在应用程序中使多个部分并发执行。但这并不意味着线程能够独立应用,线程必须依靠进程的调度控制才可以使用;就好像淮海战役的每次战斗都可形成一个独立的单元,都拥有进攻、防御、行军都动作,也正因为如此,多个战斗可以并发执行。但一次战役必须统一调度控制才会取得胜利,否则就会被敌人击破,从而是整个战役(整个进程)崩溃。

(4)从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU 时间片等资源的基本单位,是为正在运行的程序提供的运行环境;就好像淮海战役,从我们角度看,淮海战役就是一个战斗执行过程,从将军角度看,淮海战役代表为每个战区分配多少兵力,多长时间必须攻下山头,是在为整个战役提供一个执行环境。

例子2:线程指的是你的CPU运行时能开的几个通道,就像公路上有几条车道,原来的CPU能开一个线程,也就是只能同时做一个事情,走一辆车子;现在的CPU就先进多了,INTEL的双线程技术,就是能开两条路来走车子,所以比单车道要先进!而进程是针对你的系统来说的,进程就是在运行的程序,就好像一条公路,这条公路可以有一个通道(单线程的进程)、也可以有多个通道(多线程的进程)。

例子3:在Windows 3.x下,进程是最小运行单位,你每启动一个程序,就启动了一个进程;在Windows 3.x以后,线程是最小单位,每个进程可以启动多个线程(它们彼此共享所在进程中的虚拟空间,所以会出现多个线程操作一片内存的情况),比如每下载一个文件可以单独开一个线程。

7.进程与程序的区别
程序是一组指令的集合,它是存储在计算机系统的硬盘中的静态文件,没有执行的含义。而进程是一个动态的实体,有自己的生命周期。一般说来,一个进程肯定与一个程序相对应,并且只有一个,但是一个程序可以有多个进程,或者一个进程都没有。简单地说,进程是程序的一部分,程序运行的时候会产生进程。

8.总结:线程是进程的一部分,进程是程序的一部分。

 

【上篇】
【下篇】

抱歉!评论已关闭.