所谓前趋图(PG),是指一个有向无环图,可记为DAG,用于描述进程之间执行的先后顺序,具体见书上P35。
没有前趋的结点称为初始结点,没有后继的结点称为终止结点,每个结点都有一个重量,代表当前结点的程序量或程序的执行时间。
注:有循环则非前趋图
程序由若干程序段组成,在执行时,需要按照某种先后次序顺序执行,仅当前一段程序完成时,才运行后一段程序。
特征:1.顺序性 处理机严格按照顺序执行。2.封闭性 程序在封闭环境下运行,除了本程序以外不受任何外界因素影响。3.可再现性 只要环境与初始条件相同,无论怎么执行,得到的结果均相同。
为解决系统资源利用率低的问题,引入了并发执行,不存在前趋关系的程序之间才可以并发执行。
特征:1.间断性 并发执行时,由于共享系统资源,以及为完成同一项任务而相互合作,导致这些程序之间形成了相互制约的关系。因此并发程序具有”执行-暂停-执行“这种间断性的活动规律。2.失去封闭性 资源共享,不再封闭 3.不可再现性 由于失去了封闭性,导致了失去了可再现性(调用同一资源并改变其信息的情形,先后顺序不同结果不同)
进程控制块(PCB):为保证并发执行的每个程序(含数据)都能独立的运行,配备了进程控制块,描述了描述信息、调度信息、资源管理与处理机状态。
进程实体:由程序段、相关的数据段与PCB三部分组成。
进程是进程实体的运行过程,是系统资源分配和调度的一个独立单位。
动态性:进程由创建而产生、调度而执行、撤销而消亡,而程序则是静态的,不具备活动的含义。
并发性:多个进程存在于内存中并在同一时间段内同时执行。
独立性:进程是一个能够独立运行、获得资源和接收调度的基本单位。
异步性:进程按异步方式运行。
就绪态:已准备好运行。
执行态:已获得CPU,正在执行。
阻塞态:由于发生某些事件无法继续执行的状态,执行收到阻塞。此时将处理机分配给另一个进程,受阻进程处于暂停状态。
图片见课本
创建状态:创建需要申请空白PCB,写入控制和管理进程的信息-分配运行时资源-转入就绪状态插入就绪队列。若此时进程资源无法被满足,则不能被调度运行,此状态称为创建状态。
终止状态:终止需要将PCB清空,并将空间返还给系统。若进程自然结束或被其他原因终结,将进入终止状态,此后不能再执行,但在系统中保留记录。
图片见课本
操作于某个进程时,进程将挂起,此时进程处于静止状态。
作为独立运行基本单位的标志
能实现间断性运行方式
提供进程管理者所需要的信息
提供进程调度所需要的信息
实现与其他进程的同步与通信
进程标识符:唯一的标识一个进程,通常有内部标识符(系统提供,唯一数字标识符)和外部标识符(创建者提供,由字符组成)两种。
处理机状态:也称为处理机上下文,由各种寄存器内容组成,包括了通用寄存器、指令计数器(下一条指令地址)、程序状态字PSW(状态信息、条件码、执行方式、中断屏蔽标志等)、用户栈指针(存放过程与系统调用参数及调用地址)。进程被切换时,状态信息应被保存在PCB中,以便重新执行时能从断点继续执行。
程序调度信息:包含进程状态、优先级、调度所需要的其他信息以及事件(阻塞原因)。
进程控制信息:包含程序和数据的地址(以便再次执行时能够找到程序和数据)、进程同步和通信机制、资源清单(执行所需的全部资源)、链接指针(下一个PCB的首地址)。
线性方式:系统所有的PCB都在一张线性表中。
链接方式:按照优先级PCB链接为一个队列。
索引方式:根据进程状态,建立索引表。
与硬件联系紧密的模块、驱动程序及调用频率高的模块,将他们常驻内存,称为OS内核。
通常将处理机分为两种状态:
系统态:又称管态、内核态,权限高。
用户态:又称目态,权限低,只能执行规定的指令,访问指定的寄存器和存储区。
中断处理:是内核最基本的功能,操作系统赖以活动的基础。
时钟管理:是内核的一项基本功能。
原语操作:所谓原语,就是由若干条指令构成,用于完成一定功能的一个过程。它与一般过程的区别在于他们是“原子操作”,也就是说,一个操作要么全做,要么不做,是一个不可分割的基本单位,不能被中断。原子操作在系统态下执行,常驻内存。
进程管理:通常放在内核当中,提高OS性能。
存储器管理:同样放在内核中。
设备管理:大部分放在内核当中。
在OS中,允许一个进程(父进程)创建另一个进程(子进程),由此形成了一个进程的层次结构。父子进程之间存在资源的继承与归还。
注:在 w i n d o w s windows windows中,进程不具备层次结构概念,所有进程地位相同,而是通过可传递的句柄,来实现控制与被控制的关系。
用于描述进程关系的一棵有向树。
用户登录、作业调度、提供服务、应用请求
前三者都是通过系统内核为用户创建一个新进程,而应用请求是由用户进程自己创建新进程。
OS调用 C r e a t e Create Create创建原语按照如下步骤创建新进程:
申请空白PCB、为新进程分配运行所需的,包括逻辑与物理的资源、初始化PCB(标识信息、处理机状态信息、处理机控制信息),若就绪队列能够接纳新进程,便插入就绪队列。
正常结束:执行完成。
异常结束:发生了诸如越界错误、保护错误、非法指令、特权指令错误、TLE、等待超时、运算错误、I/O错误等异常后终止。
外界干预:进程因外界请求终止运行。
OS调用终止原语,执行如下操作:
根据被终止进程的标识符,检索出该进程的PCB,读出状态。
若正处于执行,应立即终止执行,并置调度标志为真,表示应重新调度。
若还有子进程,将子进程也终止。
全部资源归还父进程或系统。
将PCB从队列中移除,等待其他程序搜集信息。
向系统请求共享资源失败
等待某种操作完成
新数据尚未到达
等待新任务的到达
进程通过调用 B l o c k Block Block阻塞原语将自己阻塞,执行如下操作:
进程立即停止执行,PCB中“执行”改为”阻塞“,并插入阻塞队列,最后转调度程序重新调度,将处理机分配给另一就绪进程。
被阻塞时期待的事情发生后,有关进程调用 W a k e u p Wakeup Wakeup唤醒原语,将PCB从阻塞队列中移入就绪队列中。
挂起原语 S u s p e n d Suspend Suspend,激活原语 A c t i v e Active Active。
间接相互制约关系:进程并发执行时,由于共享系统资源,导致这些并发执行的进程形成相互制约的关系。对于临界资源,必须保证只能互斥访问,因此这些进程形成了所谓间接制约的关系。对于这类资源,必须由系统统一分配,用户要使用之前,必须现申请,而不允许用户进程直接使用。
直接相互制约关系:多个进程为了完成同一个任务而相互合作,形成了直接制约关系。
一次只允许一个进程访问的资源。消费者生产者问题是一个著名的进程同步问题。大致描述了:为了使生产者与消费者并发执行,在两者之间加入了有 n n n个缓冲区的缓冲池,生产者放入,消费者拿出,两进程以异步方式运行,但必须保持同步,不能从空缓冲区取,也不能向满缓冲区放。
每个进程中访问临界资源的那段代码称为临界区。保证各进程互斥进入自己的临界区,即可实现对临界资源的互斥访问。
空闲让进、忙则等待、有限等待(保证在有限的时间内进入自己的临界区,避免”死等“状态)、让权等待(若不能进入临界区,立即释放,避免”忙等“)
计算机提供硬件指令,解决互斥问题。初始锁为开,进入的进程要先对锁进行测试,若未开则等待,若已开则立即锁上。测试与关锁必须连续,防止多个进程同时检测到打开。
进入锁测试之前关闭中断,直到锁测试完成并上锁之后才打开,如此,进程在进入临界区执行期间,计算机系统不会响应中断,不会引发调度,也不会发生进程或线程的切换,保证了测试与关锁的连续性和完整性。
但是关中断有许多缺点:滥用关中断可能导致严重后果、关中断时间长影响系统效率、不适合多CPU系统。
测试并建立的指令,不可分割,即为一条原语。
对换指令,为临界资源设置全局布尔变量,但易忙等,不符合让权等待原则。
荷兰科学家迪杰斯特拉提出的信号量机制是一种卓有成效的进程同步机制。
最初由迪杰斯特拉将整型信号量定义为一个用于标识资源数目的整型量S,除了初始化,仅能通过两个标准的原子操作 w a i t ( S ) wait(S) wait(S)和 s i g n a l ( S ) signal(S) signal(S)来访问,这两个操作被称为P、V操作,描述如下:
wait(S){
while(S<=0);//查看、等待临界资源由空闲
S--;
}
signal(S){//释放临界资源
S++;
}
整型信号量中的 w a i t wait wait操作,只要信号量 S < = 0 S<=0 S<=0就会不断测试,容易忙等。因此除了表示资源数目的 v a l u e value value以外,还需要一个进程链表指针 l i s t list list,用于链接上述所有等待进程。
代码描述为:
typedef struct{
int value;
struct process_control_block *list;
}sem;
wait(sem *S){
S->value--;
if(S-value<0)block(S->list);//若满,则放入等待链表
}
signal(sem *S){
S->value++;
if(S->value<=0)wakeup(S->list);//若仍有等待,则唤醒第一个等待进程
}
此问题若不考虑互斥与同步问题,易造成 C o u n t e r Counter Counter的不定性。本小节将利用信号量机制来解决生产者-消费者问题。
假定在缓冲池中有n个缓冲区,这时可利用互斥信号量 m u t e x mutex mutex实现诸多进程对缓冲池的互斥作用,利用信号量 e m p t y empty empty与 f u l l full full分别表示空缓冲区和满缓冲区的数量。代码描述如下:
int in = 0, out = 0;
item buffer[n];
sem mutex = 1, empty = n, full = 0;
void producer(){
do{
producer an item nextp;
...
wait(empty);//查询是否有空缓冲区,若有则占用
wait(mutex);//查询互斥信号量,若无互斥占用则占用
buffer[in]=nextp;
in=(in+1)%n;
signal(nutex);//释放时先更改mutex
signal(full);//随后释放缓冲区
}while(TRUE);
}
void consumer(){
do{
wait(full);
wait(mutex);
nextc=buffer[out];
out=(out+1)%n;
signal(mutex);
signal(empty);
consumer the item in nextc;
...
}while(TRUE);
}
void main(){
cobegin
producer();consumer();
coend;
}
五个哲学家在圆桌上坐,每两人之间有一根筷子,共五根,饥饿时试图取得其左右的筷子,拿到一双筷子即可进餐。
筷子都为临界资源,一段时间仅可供一位哲学家使用。代码描述如下:
sem cho[5] = { 1, 1, 1, 1, 1};
do{
wait(cho[i]),wait(cho[(i+1)%5]);
//eat
signal(cho[i]),signal(cho[(i+1)%5]);
//think
}while(TRUE);
那么若所有哲学家同时拿起同一侧的筷子,则死锁。
于是有如下解决方案:1. 至多四名哲学家拿起同一侧的筷子。 2.仅仅左右均可用时拿起筷子。 3.奇数偶数号哲学家拿筷子顺序相反。
写操作必须单独进行,读操作可以与其他读操作一起进行
目的:为了减少程序在并发执行时所付的时空开销(创建进程时分配资源,建立PCB、撤销进程时回收资源与撤销PCB、进程切换时保留、更改处理机环境),使OS具有更好的并发性。
线程作为调度和分派的基本单位,即并不把作为调度和分派的基本单位也同时作为拥有资源的单位。
引入线程后,把线程当作调度和分派的基本单位,线程切换时,仅需要保存和设置少量寄存器内容,切换代价小。
引入线程后,不仅进程可以并发,同一个或不同进程的多个线程同样也能并发执行,使得OS有更好的并发性,提高系统资源利用率和吞吐量。
进程拥有资源,但线程并不拥有系统资源,而仅保留一点必不可少的、能保证独立运行的资源。同时允许多个线程共享拥有的资源,可以访问进程拥有的资源。
同一进程的不同线程之间的独立性要小于不同进程之间的独立性,因为防止进程被彼此干扰破坏,每个进程都独立拥有地址空间和其他资源。而同一进程的不同线程则是为了提高并发性以及相互合作而创建的,共享内存地址空间和资源。
进程开销明显大于线程。
传统进程只能在同一个处理机上运行,而线程可在多个处理机上运行。
4、程序并发执行时为什么会失去封闭性和可再现性? P38
因为并发执行的程序共享系统资源,失去了封闭性,又因为失去了封闭性,调用同一资源先后顺序不同可能造成结果不同,失去了可再现性。
5、在操作系统中为什么要引入进程的概念?他会产生什么样的影响? P39
多道程序环境下,并发执行的程序失去了封闭性和可再现性,因此通常的程序时不能够并发执行的,否则程序的运行就失去了意义。为了程序能够并发执行,并且能够对程序加以描述和控制,引入了进程的概念。进程的加入使之能够并发执行,且更便于描述与控制,使系统资源利用率更高,吞吐量更大。
7、试说明PCB的作用具体体现在哪几个方面?为什么说PCB是进程存在的唯一标志? P44
PCB的作用主要体现在如下几个方面:1.能作为独立运行的标志。 2.能实现间断性运行方式。 3.提供进程管理所需要的信息。 4.能提供进程调度所需要的信息。 5.实现与其他进程的同步和通信。 PCB的信息中中含有进程标识符,进程标识符用于唯一地标识一个进程,因此PCB是进程存在的唯一标志。
8、PCB提供了进程管理和进程调度所需要的哪些信息? P45
进程管理:程序和数据的地址、进程同步和通信机制、资源清单、链接指针。
进程调度 :进程状态、进程优先级、进程调度所需要的其他信息、事件。
11、试说明进程在三个状态之间转换的典型原因。 P40
就绪->执行:进程调度
执行->阻塞:I/O请求
阻塞->就绪:I/O完成
执行->就绪:时间片完
12、为什么要引入挂起状态?该状态有哪些性质? P41
基于系统和用户的如下需要:终端用户的需要、父进程请求、负荷调节的需要、操作系统的需要。处于挂起状态的进程不能接受处理机调度。
13、在进程切换时,所要保存的处理机状态信息有哪些? P45
通用寄存器、指令计数器、程序状态字PSW、用户栈指针。
14、试说明引起进程创建的主要事件。 P49
用户登录、作业调度、提供服务与应用请求。
15、试说明引起进程被撤销的主要事件。 P50
程序执行完毕正常结束、程序发生异常结束、因外界请求干预结束。
16、在创建一个进程时所要完成的主要工作是? P49
申请空白PCB,为新进程分配资源,初始化PCB,若就绪队列能够接纳新进程,将新进程插入就绪队列。
17、在撤销一个进程时所要完成的主要工作是? P50
根据进程标识符,检索PCB,读出进程状态,若处于执行状态,立即终止,修改调度标志为真表示应重新调度,若还有子进程,将子进程也终止,将所有资源归还给父进程或系统,移除该进程的PCB。
18、试说明引起进程阻塞或被唤醒的主要事件是什么? P50
阻塞:向系统请求共享资源失败、等待某种操作完成、新数据尚未到达、等待新任务的到达。
唤醒:阻塞时期待的事件完成。
19、为什么要在OS中引入线程? P81
进程在操作时的时空开销太大,且在多处理机系统上的,进程只能运行在一个处理机上。引入线程,可以使系统拥有更高的资源利用率与吞吐量。
21、试从调度性、并发性、拥有资源及系统开销方面对线程与进程比较。 P81
调度性:传统OS中,进程作为调度的基本单位,每次调度时开销较大。而引入线程后,线程是调度的基本单位,线程切换时仅需保存和设置少量寄存器内容,切换代价远小于进程。
并发性:引入线程的OS中,不仅进程可以并发,同一个进程的所有线程也可以并发执行,同样,不同进程中的线程也可以并发执行。
拥有资源:进程是系统拥有资源的一个基本单位,而线程并不拥有系统资源,而是仅有一点必不可少,保证独立运行的资源。
系统开销:创建撤销进程时,系统要为之分配回收PCB和其他资源。而线程的开销远小于进程。