操作系统之进程

一.进程的描述

1.进程的定义

(1)进程是程序的一次执行

(2)进程是一个程序及其数据在处理机上的顺序执行时所发生的活动

(3)进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立的单位

综上所述,进程就是进程实体的运行过程,是系统进行资源分配和调度的一个独立的单位

2.进程的特点

进程具有程序没有的PCB结构(进程控制块)

(1)动态性

它是进程最基本的特征。表现在“由创建而产生,由调度而执行,由撤销而消亡”

(2)并发性

多个进程实体同存在于内存中,且能在一段时间内同时运行

(3)独立性

进程实体能独立运行、独立获得资源和独立接受调度的基本单位

(4)异步性

进程按照异步方式运行,即按各自独立的、不可预知的速度向前推进。

3.进程的基本状态及其转换

A.进程的三种基本状态

(1)就绪状态

指进程已经准备好运行准备好运行的状态,即进程已经分配到除CPU之外的所有必要的资源后,只要再获得CPU,便可以立即执行。

如果系统中有许多的处于就绪状态的进程,通常将它按照一定的策略(如优先级策略)排成一个队列,称该队列为就绪队列。

(2)执行状态

指进程已获得CPU,其程序正在执行的状态。

(3)阻塞状态

指正在执行的进程由于发生某事件(例如IO请求,申请缓冲区失败等)暂时无法继续执行时的状态,即进程的执行收到阻塞。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态,一般将这种暂停状态称为阻塞状态。

通常系统也会将处于阻塞状态的进程排成一个队列,称该队列为阻塞队列。

根据阻塞原因的不同,会设置多个阻塞队列。

B.三种基本状态的转换

阻塞--->就绪:当IO完成时或所等待的事情发生

执行--->就绪:运行进程用完时间片

就绪--->执行:调度程序选择一个新的进程运行

执行--->阻塞:需要外部IO

状态转换图中,运行状态--->阻塞状态的原因:程序需要外部IO或者进程执行了P操作

注:就绪--->阻塞,阻塞--->运行在操作系统中是不可实现的

4.进程管理中的数据结构

进程控制块PCB的作用

PCB的作用是使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其他进程并发执行的过程。

(1)作为独立运行基本单位的标志。

(2)能实现间断性运行方式

(3)提供进程管理所需要的信息

(4)提供进程调度所需要的信息

(5)实现与其他进程的同步与通信

进程控制块中的信息

(1)进程标识符:用于唯一的标识一个进程一个进程通常由两种表示符

外部表示符:方便用户对进程的访问,由创建者提供,通常由字母,数字组成。

内部标识符:为了方便系统对进程的使用,赋予每个进程一个唯一的数字标识

(2)处理机状态:也称为处理机的上下文。主要由处理机的各种寄存器组成

(3)进程调度信息

(4)进程控制信息

二.进程控制

1.操作系统内核

现代操作系统通常将OS划分为若干层次,再将OS的不同功能分别设置在不同的层次中。

为了防止OS本身以及关键数据遭受到应用程序的破坏,通常将处理机的执行状态分割为系统态和用户态两种。

系统态:又称为管态,也称为内核态。它具有较高的特权,能够执行一切指令,访问所有寄存器和存储区。

用户态:又称为目态,具有较低特权的执行状态,仅能执行规定的指令,访问特定的寄存器和存储区。

一般情况下,应用程序只能在用户态运行,不能执行OS指令及访问OS区域,这样可以防止应用程序对OS的破坏。

大多数的内核包含了一下两种功能

(1)支持功能

其中三种最基本的功能是:中断处理、时钟管理、原语操作

(2)资源管理功能

进程管理

存储器管理

设备管理

2.进程的创建

A.进程的层次结构

在OS中,允许一个进程创建另一个进程,通常会把创建进程的进程称为父进程,而把被创建的进程称为子进程。

子进程可以继承父进程所拥有的资源。当子进程撤销时,应该将其从父进程那里获得的资源归还给父进程。同时在撤销父进程时,也要同时撤销父进程所有的子进程。

进程不能拒绝其子进程的继承权

B.进程图

所谓的进程图就是用于描述进程间关系的一棵有向树。

C.引起创建进程的事件

D.进程的创建

3.进程的终止

A.引起进程终止的事件

a.正常结束

表示进程的任务已经完成,准备退出运行

b.异常结束

常见的异常事件:

(a)越界错

(b)保护错

(c)非法指令

(d)特权指令错

(e)运行超时

(f)等待超时

(g)算数运算错

(h)IO故障

c.外界干预

(a)操作员或操作系统干预

如果系统发生死锁等情况时,由操作员或者操作系统采用终止某些进程的方式使系统从死锁中解脱出来

(b)父进程请求,

当子进程已经完成父进程所要求的任务时,父进程可以请求结束该子进程

(c)因父进程终止,指当父进程终止时,它的所有的子进程也应当结束。

B.进程的终止过程

终止指定进程的过程

a.根据被终止的进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态;

b.若被终止进程正处于被执行状态,应立即终止该进程的执行,并置调度标志为真,用于该进程被终止后应重新进行调度;

c.若该进程还有子孙进程,还应将其所有的子孙进程都予以终止,以防它们成为不可控的进程;

d.将被终止的进程所拥有的全部资源或者归还给父进程,或者归还给系统;

e.将被终止的进程PCB从所在队列或链表中移除,等待其他程序来搜索信息。

4.进程的阻塞和唤醒

A.引起进程阻塞和唤醒的事件

有下述几类事件会引起进程阻塞或者被唤醒

a.向系统请求共享资源失败

b.等待某种操作的完成

c.新数据尚未到达

d.等待新任务的到达

B.进程阻塞的过程

由进程调用阻塞原语block将自己阻塞

阻塞是进程自身的一种主动行为。进入block过程中,由于该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由执行改为阻塞,并将PCB插入到阻塞队列。

C.进程唤醒过程

当被阻塞进程所期待的事件发生时,由中断处理进程或其他产生该事件的进程调用唤醒原语,将期待该事件的进程唤醒。

wakeup执行的过程:

首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中现行状态由阻塞改为就绪,然后将该PCB插入到就绪对列。

注意:

block和wakeup原语是一对作用刚好相反的原语,在使用的过程中,必须成对使用,即在某进程中调用了阻塞原语,则必须在与之相合作的、或其他相关的进程中安排一条相应呃唤醒原语。

5.进程的挂起与激活

(1)进程的挂起

当系统中出现了引入进程挂起的事件时,OS将利用挂起原语suspend将指定进程或处于阻塞状态的进程挂起。

suspend的执行过程:

首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞;为了方便用户或父进程考察该进程的运行情况,而把该进程的PCB复制到某指定的内存区域;最后,若被挂起的进程正在执行,则转向调度程序重新调度。

(2)进程的激活过程

当系统中发生激活进程的事件时,OS将利用激活原语active,将指定进程激活。激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪:若为静止阻塞,便将之改为活动阻塞。

注意:

假如采用的是抢占调度策略,则每当有静止就绪进程被激活而插入就绪队列时,便应检查是否要进行重新调度,即由调度程序将被激活的进程与当前进程两者的优先级进行比较,如果被激活进程的优先级低,就不必重新调度;否则,立即剥夺当前进程的运行,把处理机分配给刚刚被激活的进程

三.进程同步

1.进程同步的基本概念

进程同步机制的主要任务是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源,并能很好的相互合作,从而使程序的执行具有可再现性。

(1)两种形式的制约关系

(2)直接相互制约关系

2.同步机制应遵循的原则

为实现进程互斥地进入自己的临界区,可以用软件的方法,更多的是在系统中设置专门的同步机构来协调各进程之间的运行。所有同步机制都应遵循以下四条准则:

(1)空闲让进

当无线程处于临界区的时候,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效的利用临界资源

(2)忙则等待

当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问

(3)有限等待

对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,避免进入“死等”状态

(4)让权等待

当进程不能进入自己的临界区,应立即释放处理机,以免进程陷入“忙等”状态

3.信号量机制

信号量按联系进程的关系分成二类:

公用信号量(互斥信号量):它为一组需互斥共享临界资源的并发进程而设置,它代表永久性的共享的临界资源,每个进程均可对它施加P、V操作,即都可申请和释放该临界资源,其初始值置为1。

专用信号量(同步信号量):它为一组需同步协作完成任务的并发进程而设置,它代表消耗性的专用资源,只有拥有该资源的进程才能对它施加P操作(即可申请资源),而由其合作进程对它施加V操作(即释放资源)。

具体的分类如下:

(1)整型信号量

最初由Dijkstra把整型信号量定义为一个整型量,除初始化外,仅能通过两个标准的原子操作(Atomic Operation) wait(S)和signal(S)来访问。

这两个操作一直被分别称为P、V操作。 wait和signal操作可描述为:

S .value>0 ;表示可供使用资源数

S .value=0 ;表示资源已被占用,无其它进程等待。

S .value<0(=-n) ;表示资源已被占用,还有n个进程因等待资源而阻塞。

wait(S){

while(S<=0);

S--;

}

signal(S){

S++;

}

wait(S)和signal(S)是两个原子操作,因此,它们在执行时是不可中断的。即当一个进程在修改某信号量时,没有其他进程可以同时对该信号量进行修改。此外在wait操作中,对S值的测试和做S=S-1操作都是不可中断的。

(2)记录型信号量

在整型信号量机制中的wait操作,只要是信号量S≤0, 就会不断地测试。因此,该机制并未遵循“让权等待”的准则, 而是使进程处于“忙等”的状态。记录型信号量机制,则是一种不存在“忙等”现象的进程同步机制。但在采取了“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。

所包含的数据项的描述如下

typedef struct{

int value;

struct process_control_block *list;

}semaphore;

在记录型信号量机制中,S.value的初值表示系统中某类资源的数目, 因而又称为资源信号量,对它的每次wait操作,意味着进程请求一个单位的该类资源,因此描述为S.value=S.value-1;

当S.value<0时,表示该类资源已分配完毕,因此进程应调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表S.L中。可见,该机制遵循了“让权等待”准则。 此时S.value的绝对值表示在该信号量链表中已阻塞进程的数目。

对信号量的每次signal操作,表示执行进程释放一个单位资源,故S.value=S.value+1操作表示资源数目加1。 若加1后仍是S.value≤0,则表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应调用wakeup原语,将S.L链表中的第一个等待进程唤醒。如果S.value的初值为1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量。

wait(S)和signal(S)操作的描述如下:

wait(semaphore *S){

S->value--;//先减再判断

if(S->value<0) block(S->list);

//block(S.L)原语是将该进程自我阻塞,置为等待状态,并将它的PCB插入信号量队列S.L的末尾。

}

signal(semaphore *S){

S->value++;

if(S->value<=0) wakeup(S->list);

//wakeup(S.L)原语是唤醒信号量等待队列S.L中的第一个进程,将其改为就绪态,插入就绪队列

}

(3)AND型信号量

在两个进程中都要包含两个对Dmutex和Emutex的操作。

AND同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源,也不分配给他。

亦即,对若干个临界资源的分配,采取原子操作方式:要么全部分配到进程,要么一个也不分配。 由死锁理论可知,这样就可避免上述死锁情况的发生。为此,在wait操作中,增加了一个“AND”条件,故称为AND同步,或称为同时wait操作, 即Swait(Simultaneous wait)。

Swait(Simultaneouswait)的操作如下:

(4)信号量集

一般的信号量集有以下几种特殊情况:

A.Swait(S,d,d)。此时在信号量集中只有一个信号量S,但允许它每次可以申请d个资源,当现有资源数少于d时,不予分配。

B.Swait(S,1,1)。此时的信号量集已蜕化为一个一般的记录型信号量(S>1)或互斥信号量(S=1)。

C.Swait(S,1,0)。这是一种特殊且很有用的信号量操作。当S>=1,允许多个进程进入特定区;当S变为0后,将阻止任何进程进入特定区。

换言之,它相当于是一个可控的开关。

4.利用信号量实现进程互斥

为使多个进程能互斥地访问某临界资源,只需为该资源设置一个互斥信号量mutex,并设其初值为1,并规定每个进程在进入临界区CS前必须申请资源,即对互斥信号量mutex施加P操作,在退出临界区CS后必须释放资源,即对互斥信号量mutex施加V操作;即将各进程的临界区CS置于P(mutex)和V(mutex)操作之间。

5.利用信号量实现前趋关系

还可以用信号量来描述程序或语句之间的前趋关系。设有两个进程P1,P2。P1中有语句S1;P2中有语句S2。若要实现在S1执行后再执行S2这种前趋关系,只需要使进程P1和P2共享一个公用信号量S,并赋予其初志为0,将signal(S)操作放在语句S1后面,而在S2语句前面插入wait(S)操作。即在进程P1中用S1;signal(S);在进程P2中,用wait(S);S2;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值