进程管理是一个具有独立功能的程序关于数据集合的一次可以并发执行的运行活动,是系统进行资源分配和调度的基本单位。相对于程序,进程是动态的概念,而程序是静态的概念,是指令的集合。进程具有动态性和并发性,需要一定的资源来完成任务。在大多数操作系统中,进程是进行资源分配和调度的基本单位。
一.进程的状态
一个进程从创建产生到销毁的整个生命期间,有时候占有处理器执行,有时候虽然可以运行,但是分配不到处理器,有时候虽然有空闲的处理器,但是因等待某个事件的发生而无法执行,这一切都说明进程和程序不相同,它是活动的且有状态变化的。
1.1三态模型
进程具有三种最基本的状态,分别是运行、就绪和阻塞,如下图所示:
1.2五态模型
由于进程的不断创建,系统资源特别是内存资源已不能满足所有进程运行的要求。这时就必须将某些进程挂起,放到磁盘对换区,暂时不参加调度,以均衡负载。进程挂起的原因可能是系统出现故障,或者是用户调试程序,也可能是需要检查问题。
活跃就绪是指进程在内存并且可被调度的状态。静止就绪是指进程被对换到外存时的就绪状态,是不能被直接调度的状态,只有当内存中没有活跃就绪态进程,或者挂起就绪态进程具有更高的优先级,系统才能把挂起就绪态进程调回内存,并转换为活跃就绪。活跃阻塞状态是指进程已在内存,一旦所等待的事件发生,便进入活跃就绪状态。静止阻塞状态是指进程对换到外存时的阻塞状态,一旦所等待的事件发生,便进入静止就绪状态。
二.信号量与PV操作
在多道程序系统中,由于资源共享与进程合作,使各进程之间可能产生两种形式的制约关系,一种是间接相互制约,例如,在仅有一台打印机的系统,同一时刻只能有一个进程分配到到打印机,其他进程必须阻塞;另一种是直接相互制约,例如进程A通过单缓冲去向进程B提供数据,当改缓冲区为空时,进程B不能获取所需的数据而阻塞,一旦进程A将数据送入缓冲区,进程B就被唤醒,反之,当缓冲区满时,进程A被阻塞,仅当进程B取走缓冲区的数据时,才唤醒进程A。
进程同步主要源于进程合作,是进程之间共同完成一项任务时直接发生相互作用的关系,为进程之间的直接制约关系。
进程互斥主要源于资源共享是进程之间的间接制约关系。在多道程序系统中,每次只允许一个进程访问的资源称为临界资源,进程互斥要求保证每次只有一个进程使用临界资源。在每个进程中访问临界资源的程序段称为临界区,进程进入临界区要满足一定的条件,以保证临界资源的安全使用和系统的正常运行。
(1)信号量
信号量是一个二元组(S,Q) , 其中S 是一个整形变量,初值为非负数为一个初始状态为空的等待队列。在多道程序系统中,信号量机制是一种有效的实现进程同步与互斥的工具。信号量的值通常表示系统中某类资源的数目,若它大于 0 , 则表示系统中当前可用资源的数量;若它小于 0 , 则表示系统中等待使用该资源的进程数目,即在该信号量队列上排队的P C B 的个数。信号量的值甚可变的,由PV操作来改变。
PV操作是对信号量进行处理的操作过程,而且信号量只能由PV操作来改变。P操作是对信号量减去1,意味着请求系统分配一个单位资源,若系统无可用资源,则进程变为阻塞状态;V操作是对信号量加1,意味着释放一个资源,加1后若信号量小于等于0,则从就绪队列中唤醒一个进程,执行V操作的进程继续执行。
(2)实现互斥模型
使用信号量机制实现进程互斥时,需要为临界资源设置一个互斥信号量S,其初始值通常为1。在每个进程中将临界区代码至于P(S)和V(S)之间。必须成对使用PV原语。PV原语不能次序颠倒,重复或者遗漏。
(3)实现同步模型
使用信号量机制实现进程同步时,需要为进程设置一个同步信号量S,其初始值通常为0。在进程需要同步的地方分别插入P(S)和V(S)。一个进程使用P原语的时候,另一个进程往往使用V原语与之对应。
三.死锁问题
当若干个进程竞争使用资源时,如果每个进程都占了一定的资源,又申请使用了已被另一个进程占用,且不能争夺的资源,则所有这些进程都进入阻塞状态,不能继续运行了,即系统有两个或者两个以上的进程无限期的等待,系统处于停滞状态,这种现象就称为死锁。产生死锁的4个必要条件如下:
(1)互斥条件 任意时刻只允许一个进程使用资源
(2)不剥夺条件。进程已经占用的资源,不会被剥夺。
(3)请求与保持条件。进程在请求其余资源时,不主动释放已经占有的资源。
(4)环路条件。环路中每一条边是进程在请求另一个进程已经占有的资源。
对死锁的处理,常用的方法有死锁的预防,避免和检测与解除等方法。
死锁预防:就是采用某种策略,限制并发进程对资源的请求,使系统在任何时候都不满足产生死锁的条件。
死锁避免:就是将限制条件弱化,允许死锁的存在,但不让它发生,设置一种安全状态,进程按照某种顺序来为期分配资源。
死锁检测与解除:死锁检测是指系统保存资源的请求和分配信息,利用某种算法对这些信息加以检查,以判断是否存在死锁。
四.线程管理
线程是进程的活动成分,是处理器分配资源的最小单位,它可以共享进程的资源与地址空间,通过线程的活动,进程可以提供多种服务或者实现子任务并行。每个进程创建时只有一个线程,根据需要在运行的时候创建更多的线程。
4.1 线程的实现方式
线程基本上不拥有系统资源,只拥有在运行中必不可少的资源。一个线程可以创建和撤销另一个线程;同个进程中的多个线程可以并发执行。线程的实现方式主要有三种:
4.2线程与进程的比较
通常一个进程有多个线程,至少有一个。进程与线程的区别主要有以下五个方面: