进程
进程的定义
为了使参与并发执行的每个
程序
(含数据)都能独立运行
,在操作系统中必须为之配置一个专门的数据结构,称为进程控制块(Process Control block,PCB)
。系统利用PCB
来描述进程的基本情况
和活动过程
,进而控制和管理进程。这样,由程序段
、相关的数据段
和PCB
三部分便构成了进程实体
(简称进程)
例如:所谓创建进程,实质上是创建进程实体中的PCB;而撤消进程,实质上是撤消进程的PCB
- 进程是程序的一次执行。
- 进程是一个
程序
及其数据
在处理机上顺序执行
时所发生的活动。 - 进程是具有独立功能的程序在一个数据集合上运行的过程,它是
系统
进行资源分配
和调度
的一个独立单位
。
进程与程序的比较
进程和程序是两个截然不同的概念,除了进程具有程序所没有的PCB结构外,还具有下面一些特征:
-
动态性:
进程的实质是进程实体的执行过程
,因此,动态性就是进程的最基本的特征。动态性还表现在:“它由创建而产生,由调度而执行,由撤消而消亡”——而程序则只是一组有序指令的集合,并存放于某种介质上,其本身并不具有活动的含义,因而是静态的
-
并发性:多个进程实体同存于内存中,且能在一段时间内同时运行。引入进程的目的也正是为了使其进程实体能和其它进程实体并发执行
——而程序(没有建立PCB)是不能参与并发执行的
-
独立性:在传统的OS中,独立性是指进程实体是一个能
独立运行
、独立获得资源
和独立接受调度
的基本单位
——而程序未建立PCB,不能作为一个独立的单位参与运行
-
异步性:是指进程是按异步方式运行的,即按各自独立的、不可预知的速度向前推进
——而程序若参与并发执行,会产生其结果的不可再现性(多次运行结果不一致)
线程
如果说,在OS中
引入进程
的目的是为了使多个程序能并发执行
,以提高资源利用率和系统吞吐量
那么,在操作系统中再引入线程
,则是为了减少
程序在并发执行时所付出的时空开销
,使OS具有更好的并发性。
进程的基本属性
-
进程是一个可拥有
资源的独立单位
,一个进程要能独立运行,它必须拥有一定的资源,包括用于存放程序正文、数据的磁盘和内存地址空间,以及它在运行时所需要的IO设备、已打开的文件、信号量等; -
进程同时又是一个可
独立调度和分派的基本单位
,一个进程要能独立运行,它还必须是一个可独立调度和分派的基本单位。每个进程在系统中有唯一的PCB,系统可根据其PCB感知进程的存在,也可以根据其PCB中的信息,对进程进行调度,还可将断点信息保存在其PCB中。反之,再利用进程PCB中的信息来恢复进程运行的现场。
正是由于进程有这两个基本属性,使进程成为一个能独立运行的基本单位,进而构成了进程并发执行的基础
程序在并发执行所需付出的时空开销
为使程序能并发执行,系统必须进行以下的一系列操作:
- 创建进程:系统在创建一个进程时,必须为它分配其所必需的、除处理机以外的所有资源,如内存空间、IO设备,以及建立相应的PCB
- 撤消进程:系统在撤消进程时,又必须先对其所占有的资源执行回收操作,然后再撤消PCB
- 进程切换:对
进程
进行上下文切换
时,需要保留当前进程的CPU环境
,设置新选中进程的CPU环境,因而须花费不少的处理机时间
由于进程是一个资源的拥有者,因而在创建、撤消和切换中,系统必须为之付出较大的时空开销。这就限制了系统中所设置进程的数目,而且进程切换也不宜过于频繁,从而限制了并发程度的进一步提高
线程——作为调度和分派的基本单位
由于进程“太重”,致使为实现多处理机环境下的进程的创建、调度、分派,都需花费较大的时间和空间开销
因此将上述进程的两个基本属性拆开,由线程承担起调用和分派的基本单位
,可以有效地改善多处理机系统的性能
线程与进程的比较
-
调度的基本单位:
传统OS中,
进程
是作为独立调度和分派的基本单位,因而进程是能独立运行的基本单位。在每次被调度时,都需要进行上下文切换
,开销较大。在引入
线程
的OS中,已把线程作为调度和分派的基本单位,因而线程是能独立运行的基本单位。当线程切换时,仅需保存和设置少量寄存器内容
,切换代价远低于进程。在同一进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,必然就会引起进程的切换。
-
并发性:
进程之间
可以并发执行、进程中的多个线程
之间亦可并发执行、进程中的所有线程
都能并发执行、不同进程中的线程
也能并发执行例如,在文字处理器中可以设置三个线程:第一个线程用于显示文字和图形,第二个线程从键盘读入数据,第三个线程在后台进行拼写和语法检查。
-
拥有资源:
进程
可以拥有资源,并作为系统中拥有资源的一个基本单位。线程
本身并不拥有系统资源,而是仅有一点必不可少的、能保证独立运行的资源。每个线程中都应具有一个用于控制线程运行的
线程控制块TCB
、用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈线程除了拥有自己的少量资源外
,还允许多个线程共享该进程所拥有的资源,主要表现在:属于同一进程的所有线程都具有相同的地址空间,这意味着,线程可以访问该地址空间中的每一个虚地址;此外,还可以访问进程所拥有的资源,如已打开的文件、定时器、信号量机构等的内存空间和它所申请到的IO设备等
-
独立性:
同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。
原因:为防止进程之间彼此干扰和破坏,每个进程都拥有一个独立的地址空间和其它资源,除了共享全局变量外,不允许其它进程的访问。但是同一进程中的不同线程往往是为了提高并发性以及进行相互之间的合作而创建的,它们共享进程的内存地址空间和资源,如每个线程都可以访问它们所属进程地址空间中的所有地址,由一个线程打开的文件可以供其它线程读、写
-
系统开销:
创建或撤消进程时
,系统都要为之分配和回收进程控制块、分配或回收其它资源,如内存空间和IO设备等。OS为此所付出的开销,明显大于线程创建或撤消时所付出的开销在进程切换时
,涉及到进程上下文的切换,而线程的切换代价也远低于进程的
程序、进程、线程之间形象比喻
将一个工厂比作程序的话,工厂本身是静态的、它本身提供了进程和线程进行工作的必要资源
CPU可以视为发电厂为工厂提供的电力,要是没有电力的支撑,工厂内的众多车间就不能运行
工厂中的车间可以视作进程,车间内有工厂为车间提供的设备,场地等等,也有从外面获取的加工材料等
车间中的工人可以视为线程,他们相互合作(或独立)完成一道产品的工序