手机版

第3章第3讲进程管理_3

发布时间:2024-11-17   来源:未知    
字号:

进程管理

主讲教师:赵俊峰

进程管理

多道程序的设计进程进程间的相互作用管程进程通信进程调度线程系统内核

信号量同步的缺点程

–同步操作分散:信号量机制中,同步操作分散在各个进程中,使用不当就可能导致各进程死锁(如P、V操作的次序错误、重复或遗漏)

–易读性差:要了解对于一组共享变量及信号量的操作是否正确,必须通读整个系统或者并发程序;–不利于修改和维护:各模块的独立性差,任一组变量或一段代码的修改都可能影响全局;

–正确性难以保证:操作系统或并发程序通常很大,很难保证这样一个复杂的系统没有逻辑错误;

管程—管程的引入

1974年,Hoare和Hanson所提出;其基本思想是把信号量及其操作原语封装在一个对象内部。即:将共享变量以及对共享变量能够进行的所有操作集中在一个模块中

管程的定义:管程是关于共享资源的数据及一组针对该资源的操作过程所构成的软件模块

管程可增强模块的独立性:

–系统按资源管理的观点分解成若干模块,用数据表示抽象系统资源

–分析了共享资源和专用资源在管理上的差别,按不同的管理方式定义模块的类型和结构,使同步操作相对集中,从而增加了模块的相对独立性

管程是一个语言级别的构造,它的正确性由编译器负责保证。–计算机一条哲学原理:你不行时,将困难交于他人 管程的概念和机制已在Pascal、Modula-2和Java 等语言中被实现 Java:管程是指由synchronized修饰的线程,在同一时间内只能有一个线程对该方法进行访问,只有当一个线程结束对该方法的访问后,下一个线程才能对其访问

管程

基本思想:

–共享变量以及对共享变量能够进行的所有操作

集中在一个模块中

–把分散在各个进程中的临界区集中起来进行管理,并把系统中的共享资源用数据结构抽象地

表示出来

临界区访问的是共享资源的代码段,建立一个

“秘书”程序管理来到的访问,

“秘书”每次仅让一个进程访问

–便于共享资源的管理

–实行了互斥访问

“秘书”程序即为管程

管程

引入管程后的变化

–共享资源的管理可借助于数据结构及在其上的实施操作

的若干过程来进行

–对共享资源的申请和释放通过过程在数据结构上的操作

来实现

代表共享资源的数据结构及在其上操作的一组过程即为管程,管程被请求资源的进程所调用

管程是一种集中式同步机制

优点:

–引入管程可提高代码的可读性,便于修改和维护,正确

性易于保证:

–采用集中式同步机制。一个操作系统或并发程序由若干

个这样的模块所构成,一个模块通常较短,模块之间关

系清晰

管程—管程的定义

monitorexample

integeri;

conditionc;

procedureproducer( );

end;

procedureconsumer( );

end;

end monitor;管程的定义:管程是由一组变量、数据结构和函数所构成的一种特殊的软件模块。

管程—管程的主要特性

模块化:一个管程是一个基本程序单位,可以单独编译;

抽象数据类型:管程是一种特殊的数据类型,其中不仅有数据,而且有对数据进行操作的代码

信息封装:管程是半透明的,管程中的外部过程(函数)实现了某些功能,至于这些功能是怎样实现的,在其外部则是不可见的

管程—管程的限制

共享性:

–管程中的移出过程可被所有要调用管程的过程的进程所共享

安全性:

–管程的局部变量只能由该管程的过程存取,不允许进程或其他管程来直接存取,一个管程的过程也不应该存取任何非局部于它的变量 互斥性:

–在任一时刻,共享资源的进程可访问管程的管理该资源的过程,但最多只有一个调用者真正地进入管程,而任何其他调用者必须等待,直到访问者退出

管程—管程的实现要素

管程中的共享变量在管程外部是不可见的,外部只能通过调用管程中所说明的外部过程(函数)来间接地访问管程中的共享变量;

为了保证管程共享变量的数据完整性,规定管程互斥进入;

管程通常是用来管理资源的,因而在管程中应当设有进程等待队列以及相应的等待及唤醒操作;

管程—管程的实现

管程中的多个进程进入

–当一个进入管程的进程执行等待操作时,它应当释放管程的互斥权;当一个进入管程的进程执行唤醒操作时(如P唤醒Q),管程中便存在两个同时处于活动状态的进程,如何避免两个进程同时位于管程当中呢:

P等待,Q先执行,直到它退出管程或者再次被阻塞;P继续执行,等它退出管程后Q再执行;P在执行signal操作后立即退出管程,即

把signal作为管程函数的最后一条语句。

管程—管程的实现

入口等待队列:因为管程是互斥进入的,所以当一个进程试图进入一个巳被占用的管程时它应当在管程的入口处等待,因而在管程的入口处应当有一个进程等待队列,称作入口等待队列

紧急等待队列:如果进程P唤醒进程Q,则P等待Q继续,如果进程Q在执行又唤醒进程R,则Q等待R继续,...,如此,在管程内部,由于执行唤醒操作,可能会出现多个等待进程(已被唤醒,但由于管程的互斥进入而等待),因而还需要有一个进程等待队列,这个等待队列被称为紧急等待队列。它的优先级应当高于入口等待队列的优先级

管程—管程的实现

条件变量(condition)

引入原因:

–由于管程通常是用于管理资源的,因而在管程内部,应当存在某种等待机制

–当进入管程的进程因资源被占用等原因不能继续运行时使其等待

在管程内部可以说明和使用一种特殊类型的变量----条件变量。

–每个表示一种等待原因,并不取具体数值——相当于每个原因对应一个队列

管程—管程的实现

条件变量:用来描述等待的原因。每个条件变量表示一种等待的原因,它不取具体的数值。对条件变量的操作:wait和signal;

当一个管程函数发现它不能继续执行下去时,使用wait操作,使得调用它的进程进入阻塞状态,同时允许其他的进程进入管程;而signal操作的作用是唤醒某个正在等待的进程;

通过wait和signal操作即可实现进程间同步关系; wait操作和signal操作有点类似于P、V原语,但条件变量不取具体的数值,不进行信号的累加,因此在signal操作发出信号前,必须有wait操作在等待,否则该信号就丢失了。

管程—管程的实现

同步操作原语cwait和csignal:针对条件变量c,cwait(c)将自己阻塞在c队列中,csignal(c)将c队列中的一个进程唤醒

–cwait(c):

如果紧急等待队列非空,则唤醒第一个等待者; 否则释放管程的互斥权,执行此操作的进程排入c队列尾部

–紧急等待队列与c队列的关系:紧急等待队列是由于管程的互斥进入而等待的队列,而c队列是因资源被占用而等待的队列

–csignal(c):

如果c队列为空,则相当于空操作,执行此操作的进程继续;

否则唤醒第一个等待者,执行此操作的进程排入紧急等待队列的尾部

管程结构示意图

等待调用的

进程队列入口

管程等待区域

condition C1管程局部变量

条件变量wait(C1)

………

condition Cn过程1

………

wait(Cn)

Urgent queue过程k

初始化代码

signal

出口

第3章第3讲进程管理_3.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
    ×
    二维码
    × 游客快捷下载通道(下载后可以自由复制和排版)
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
    × 常见问题(客服时间:周一到周五 9:30-18:00)