进程和线程

来源:互联网 发布:头条号视频剪辑软件 编辑:程序博客网 时间:2024/06/01 10:24

1.进程

计算机上的所有可运行的软件,通常也包括操作系统,被组织成若干顺序进程,简称进程(process)。进程是一个正在执行程序的实体,包括程序计数器、寄存器和变量的当前值。

每个进程拥有它自己的虚拟CPU,但实际中一个CPU只能真正一次运行一个进程,真正的CPU在进程间进行快速切换。例如,用户打开视频编辑程序,并指令它按照一定格式转换一个小时的视频,然后在等待的过程中打开网页上网,同时,一个被周期性唤醒,用来检查进来的e-mail的后台进程会开始运行。这时,我们就有了(至少)三个活动进程:视频编辑器、web浏览器以及e-mail接收器。操作系统周期性地挂起一个进程然后启动运行另一个进程。一个进程暂时被这样挂起后,在随后的某个时刻里,该进程再次启动时的状态必须与先前暂停时完全相同,因此进程被挂起时该进程的所有信息都应该被保存下来。例如,为了同时读入信息,进程打开了若干文件。同每个被打开的文件有关的是指向当前位置的指针(即下一个将读出的字节或记录)。在一个进程被挂起时,所有这些信息都应该被保存起来,以便下次再次启动该进程之后,所执行的读调用才能读到正确的数据。在许多操作系统中,与一个进程有关的所有信息,除了该进程自身地址空间的内容以外,均存放在操作系统的一张表中,称为进程表(process table),进程表是数组(或链表)结构,当前存在的每个进程都要占用其中一项。

值得注意的是,如果一个程序运行了两遍,则算作两个进程。例如,我们可能经常两次去启动同一个字处理软件,或在有两个可用的打印机的情况下同时打印两个文件。像“两个进程恰好运行同一个程序”这样的事实其实无关紧要,因为它们是不同的进程。操作系统能够使它们共享代码,因此只有一个副本放在内存中,但那只是一个技术性的细节,不会改变有两个进程正在运行的概念。

1.1进程的创建

有4种主要事件导致进程的创建:

1)系统初始化

启动操作系统时,通常会创建若干个进程。其中有些是前台进程,也就是同用户(人类)交互并且替他们完成工作的那些进程。其他的是后台进程,这些进程与特定的用户没有关系,相反,却具有某些专门的功能。例如,设计一个后台进程来接收发来的电子邮件,这个进程在一天的大部分时间都在睡眠,但是当电子邮件到达时就突然被唤醒了。也可以设计另一个后台进程来接收对该机器中web页面的访问请求,在请求到达时唤醒该进程以便服务该请求。停留在后台处理诸如电子邮件、web页面、新闻、打印之类活动的进程称为守护进程(daemon)。在UNIX中,可以用ps程序列出正在运行的进程;在Windows中,可使用任务管理器。

2)执行了正在运行的进程所调用的进程创建系统调用

除了在启动阶段创建进程之外,新的进程也可以以后创建。一个正在运行的进程经常发出系统调用,以便创建一个或多个新进程协助其工作。在所要从事的工作可以容易地划分成若干个相关的但没有相互作用的进程时,创建新的进程就特别有效果。例如,如果有大量的数据要通过网络调取并进行顺序处理,那么可以创建一个进程取数据,并把数据放入共享缓存区中,而让第二个进程取走数据项并处理之。在多处理机中,让每个进程在不同的CPU上运行会使整个作业运行得更快。

3)用户请求创建一个新进程

在交互系统中,键入一个命令或者点(双)击一个图标就可以启动一个程序。这两个动作中的任何一个都会开始一个新的进程,并在其中运行所选择的程序。在基于命令行的UNIX系统中运行程序X,新的进程会从该进程接管开启它的窗口。在Microsoft Windows中,多数情形都是这样的,在一个进程开始时,它并没有窗口,但是它可以创建一个(或多个)窗口。在UNIX和Windows系统中,用户可以同时打开多个窗口,每个窗口都运行一个进程。通过鼠标用户可以选择一个窗口并且与该进程交互。

4)一个批处理作业的初始化

该创建进程的情形仅在大型机的批处理系统中应用。用户在这种系统中(可能是远程地)提交批处理作业。在操作系统认为有资源可运行另一个作业时,它创建一个新的进程,并运行输入队列中的下一个作业。

1.2进程的终止

进程终止通常由以下条件引起:

1)正常退出(自愿的)

2)出错退出(自愿的)

3)严重错误(非自愿)

4)被其他进程杀死(非自愿)

2.线程

线程是CPU调度和分派的基本单位,由线程ID、程序计算器、寄存器和堆栈组成。

3.进程和线程的比较

进程和线程有很多类似的性质,因此人们习惯上也称线程为轻量级进程(lightweight process,LWP),也是CPU调度和分派的基本单元;而传统意义上的进程则被称为重量级进程(heavyweight process,HWP)。下面,主要从调度、并发性、系统开销、拥有资源等方面对线程和进程进行比较。

调度

在传统的操作系统中,CPU调度和分派的基本单位是进程。而在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位,从而使传统进程的两个属性分开,线程便能轻装运行,这样可以显著地提高系统的并发性。同一个进程中线程的切换不会引起进程切换,从而避免了昂贵的系统调用。但是在由一个进程中的线程切换到另一进程中的线程时,依然会引起进程切换。

并发性

在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行,因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统的吞吐量。例如,在一个未引入线程的单CPU操作系统中,若仅设置一个文件服务进程,当它由于某种原因被封锁时,便没有其他的文件服务进程来提供服务。在引入了线程的操作系统中,可以在一个文件服务进程中设置多个服务线程。当第一个线程等待时,文件服务进程中的第二个线程可以继续运行;当第二个线程封锁时,第三个线程可以继续执行,从而显著地提高了文件服务的质量以及系统的吞吐量。

系统开销

不论是引入了线程的操作系统,还是传统的操作系统,进程都是拥有系统资源的一个独立单位,它可以拥有自己的资源。一般来说线程自己不拥有系统资源(也有一点必不可少的资源),但它可以访问其隶属进程的资源。亦即一个进程的代码段、数据段以及系统资源(如已打开的文件、I/O设备等),可供同一进程的其他所有线程共享。

拥有资源

由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,操作系统所付出的开销将显著地大于在创建或撤销线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运行的进程的CPU环境的设置。而线程切换只需保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。此外,由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现也变得比较容易。在有的系统中,线程的切换、同步和通信都无需操作系统的干预。

4.进程和线程的区别

1)线程是CPU调度和分派的基本单元;进程是系统进行资源分配和调度的基本单元。

2)同个进程内的多个线程共享一个地址空间;各个进程拥有各自的地址空间(独立)。

3)一般来说,线程自己不拥有系统资源(也有一点必不可少的资源),但它可以访问隶属其进程的资源,即一个进程的代码段、数据段和系统资源可供同一进程内的所有线程共享;进程是拥有系统资源的一个独立单位,它可以拥有自己的资源。

4)同一进程内的线程间的切换、同步和通信比进程间的容易,进程切换时,耗费资源较大,效率要差一些。

5)由于在创建或撤销进程时,系统要为之分配或回收资源,因此,操作系统所付出的开销都要显著大于创建或撤销线程时的开销。

6)进程有独立的地址空间,当一个进程崩溃之后,在保护模式下不会对其他进程有影响。而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮。

7)由于各个线程都可以访问同一个进程地址空间中的每一个内存地址,所以一个线程可以读、写或甚至清除另一个线程的堆栈,线程之间是没有保护的。而进程则不然。


参考:《现代操作系统》

http://stackoverflow.com/questions/200469/what-is-the-difference-between-a-process-and-a-thread

https://software.intel.com/sites/default/files/m/5/7/f/a/b/12568-2.1.1_e7_ba_bf_e7_a8_8b_e4_b8_8e_e8_bf_9b_e7_a8_8b_e7_9a_84_e5_8c_ba_e5_88_ab.pdf

http://luckyclouds.iteye.com/blog/676487

0 0
原创粉丝点击