操作系统原理教程(第3版)第三章课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《操作系统原理教程(第3版)第三章课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 原理 教程 第三 课件
- 资源描述:
-
1、 多道程序系统中进程是并发执行的,并发进程之间存在着相互制约关系,为了协调进程之间的相互制约关系,就需要实现进程的低级通信。系统之间之所以有这种关系是由于系统之间之所以有这种关系是由于以下两方面的原因造成的:以下两方面的原因造成的:(1)(1)各并发进程对资源的共享各并发进程对资源的共享 互斥关系互斥关系:通过共享资源而使进程之间产生的关系叫做间接制约关系间接制约关系,又叫做互斥关系。用“进程-资源-进程”描述。例例 进程P1和P2在运行中都要使用打印机,为了使各进程输出的完整性,打印机的使用必须独占。一旦系统将打印机分配给进程P1,那么进程P2必须等待。P1-打印机-P2(2)(2)系统中存
2、在若干协作进程系统中存在若干协作进程 同步关系同步关系:一个用户作业涉及一组并发进程(输入、计算和输出进程),这些进程须相互协作共同完成这项任务。进程之间的这种制约关系叫做直接直接制约关系制约关系。互斥是同步的一种特殊情况。低级通信低级通信:进程之间的这种相互依赖又相互制约、相互合作又相互竞争的关系,也即进程的同步与互斥关系,也叫进程之间的低级通信低级通信。共享资源引起进程之间的互斥共享资源引起进程之间的互斥几个基本概念:几个基本概念:l 共享资源共享资源:慢速的硬设备,如打印机等资源,软件资源,如共享变量、共享文件等。l 临界资源临界资源:一次仅允许一个进程使用的资源。具有这种特点的上述资源
3、。临界资源:上一章打印机的例子:临界资源:上一章打印机的例子:如何避免这种情况发生,关键是防止多个进如何避免这种情况发生,关键是防止多个进程同时读或写共享数据。换句话就是必须程同时读或写共享数据。换句话就是必须互斥的使用共享变量互斥的使用共享变量in。l 临界区临界区(critical section):就是并发执行的进程访问临界资源的那个必须互斥执行的程序段。2.6.1 进程之间的互斥进程之间的互斥 l为进一步说明临界资源的概念,下面举一个著名的进程同步问题的例子:l生产者_消费者问题。l在生产者与消费者问题中,描述的是生产者与消费者的关系。有一个生产者进程生产产品,并将所生产的产品提供给一
4、个消费者进程去消费。为了使生产者与消费者并发进行,在两者之间设置了一个具有n个缓冲区的缓冲池,尽管生产者与消费者都以异步的方式进行,但是它们之间必须保持一定的同步关系。即消费者进程不允许到空缓冲区去取产品,也不允许生产者进程向一个已装满产品,且尚未取走的缓冲区投放产品。我们利用一个数组表示上述具有n个缓冲区的缓冲池。使用输入指针in指示下一个可以放产品的缓冲区,每放一个产品指针加1。用一个输出指针out指示下一个可以取从中取产品的缓冲区,每当消费者进程从缓冲区取走一个产品输出指针加1由于缓冲区使用的是循环缓冲数组方式,所以输入加1表示为in=(in+1)mod n同样输出加1表示为out=(o
5、ut+1)mod n当(in+1)mod n=out,表示缓冲区满。初始状态in=out表示缓冲区空。此外还要设置一个表示缓冲区产品数量的变量counter初值为0,每投放一个产品counter加1,消费者每取走一个产品counter减1生产者与消费者共享下列变量:Var n,integer;Type item=“”;Var buffer:arry0,1,2,n-1of item;In,out:0,1,.n-1;Counter:0,1,n;In和out初始化为1。Noop表示控操作;While condition do no-op语句表示重复测试条件(condition)直到条件为假false
6、.生产者使用一个局部变量nextp,用于存放每次刚刚生产出来的产品,消费者使用一局部变量nextc存放每次将要消费的产品。则有程序:Producer:repeat produce an item in nextp;.while counter=n do no-op;bufferin:=nextp;In:=(in+1)mod n;Counter:=counter+1;Until fase;Consumer:repeat while counter=0 do no-op;nextc:=bufferout;out:=(out+1)mod n counter:=counter-1;consumer t
7、he item in nextc;until false这个程序显然是正确的,串行运行也是正确的,但是如果并行运行结果就不一定正确:其问题出现在两个进程共享了变量counter。其生产者加1操作和消费者的减1操作,在计算机上实现时可用下面语句描述:其生产者加1操作:Register1:=counter;Register1:=register1+1;Counter:=register1;消费者减1操作:Register2:=counter;Register2:=register2-1;Counter:=register2;假设现在counter当前值为5如果顺序执行先生产者后消费者执行一遍cou
8、nter内的值为5,但按如下顺序执行:Register1:=counter;register1=5Register1:=register1+1;register1=6Register2:=counter;register2=5Register2:=register2-1;register2=4Counter:=register1;counter=6Counter:=register2;counter=4正确值应该是5,可执行结果为4.又是结果还可能是6。表明程序并运行时已失去了再现性。这就是因为counter变量属于临界资源,而生产者与消费者没有互斥的访问它们,对counter的访问具有很大的
9、任意性,故产生了不确定性,解决问题的关键是将counter作为临界资源来处理,即要求生产者和消费者互斥访问。进程之间的互斥进程之间的互斥l临界区临界区(critical section):就是并发执行的进程访问临界资源的那个必须互斥执行的程序段。l在实现互斥时如果采取整体的程序采取互斥运行将会大大降低进程的并发性。事实上每个进程访问某个临界区的代码只是一小段,因此只需控制进程互斥的进入这一小段代码。我们将这一小段代码叫做临界区。l为此进程在进入临界区之前应对临界区进行检查,看是否被访问的标志,我们将这一段代码成为进入区(entry section),l同样退出临界区应将其标志为未被访问,这一段
10、代码称为退出区(exit section)l此外的代码可成为剩余区(remainder section)l于是可以将访问临界资源的循环进程描述为 repeat entry section critical section Exit section Remainder sectionUntil false任何时刻最多只有一个进程位于临界区。有空让进当已有进程处于其临界区时,后到达的进程只能在外等待。无空等待不应该使要进入临界区的进程无限期地等待在临界区之外。有限等待不能进入临界区的进程,应先释放处理机,转换到阻塞状态。让权等待 为了正确而有效地使用临界资源,系统中为了正确而有效地使用临界资源,系
11、统中的并发进程需要遵循如下四个准则:的并发进程需要遵循如下四个准则:有空让进;无空等待;有限等待;让权等待。2.2.解决进程之间互斥的方法解决进程之间互斥的方法 (1)(1)关中关中断断 解决进程互斥的最简单办法是当一个进程正在临界区执行时,关闭所有的中断。当进程退出临界段时,再开中断。之后其它要进入临界区的进程就可进入。描述如下:关中断关中断(disable)(disable)critical sectioncritical section 开中断开中断(enable)(enable)优点优点:简单。缺点缺点:限制了进程并发执行的能力。在多多处理机处理机情况下,这种方法不灵。l锁位变量锁位变
12、量W W :为每个临界资源设置一个,以指示该资源当前的状态。系统初始化时,将W置为0。lTestsetTestset指令可定义如下:(2)(2)使用使用测试和设置指令测试和设置指令(test and set)(test and set)testset testset(int w)l:if(w=0)w=1;else goto l;/一条机器指令,其执行不可被中断。Const int n=/Const int n=/*进程数进程数 */int w;int w;void p(int i)void p(int i)while(TRUE)while(TRUE)testset(w);testset(w);
13、w=0;w=0;显然,采用这种加锁语句,由于进程循环测试,白白浪费了CPU的时间。这种现象又叫做“忙等待”。void main()void main()w=0;w=0;p(1);p(2);p(1);p(2);p(n);p(n);同步的原因同步的原因:一组进程要合作完成一项任务。例例 两个用户进程通过共享缓冲区完成其计算和打印任务。2.6.22.6.2 进程之间的同步进程之间的同步共享缓冲区计算进程打印进程计算进程在缓冲区满时等待,打印进程在缓冲区空时等待。两个进程这种由于速度不匹配引起速度不匹配引起的的关系,需要进行同步处理同步处理。为了解决进程之间的同步,引入信号量机制信号量机制。l1965
14、年,荷兰学者Dijkstra提出的一种同同步机制步机制。l基本原理基本原理:两个或多个进程可以通过简单的信号机制,进行同步。为此,需要引入一个称作的特殊变量信号量信号量。2.6.3 2.6.3 信号量和信号量和PVPV操作操作typedef struct semaphore int value;/表示该类资源的可用数量 struct process*pointer;/等待使用该类资源的进程排成队列的队列头指针。sem;v 对信号量s只允许执行P、V操作。v P、V操作由原语组成,执行过程中不可分割。信号量的类型描述:信号量的类型描述:Sem s;P P(S)S)操作原语:操作原语:void w
15、ait(sem s)s.value=s.value-1;/表示申请一个资源 if(s.value0)/申请资源不成功,阻塞等待。add this process to s.pointer;block();/“让让权等待权等待”V(S)V(S)操作原语:操作原语:void signal(sem s)s.value=s.value+1;/释放一个资源(或通过信号量s发消息)if(s.value=0)remove a process P from s.pointer;wakeup(P);/唤醒进程P。l显然,P、V操作的引入,克服了加锁操作的忙等待while(TRUE)while(TRUE)循环循环
16、 现象,有效提高了系统的效率。l操作系统正是利用信号量的状态对进程和资源进行管理和控制的。l对于互斥使用的资源,引入一个互斥信号量,用mutex表示。其初值为1。1.1.利用信号量实现进程之间的互斥利用信号量实现进程之间的互斥int mutex=1;int mutex=1;P1P1:P(mutex);P(mutex);critical section V(mutex);V(mutex);P2P2:P(mutex);P(mutex);critical section V(mutex);V(mutex);l用信号量可以方便地解决n个进程互斥地使用临界资源,实现临界区的互斥执行问题。信号量的取值范围
17、是+1+1-(n-1)-(n-1)。l信号量的值为负的含义:说明临界区中有一个进程正在执行,有若干个进程正在等待进入。等待的进程数为信号量值的绝对值。例例 若P、V操作的信号量初值为1,当前值为-3,则表示有 3个等待进程。例例 用信号量实现计算进程与打印进程之间的同步过程。假定计算进程和打印进程共享使用一个单一个单缓冲的缓冲区缓冲的缓冲区。要解决两者之间的同步,需要引入两个同步信号量s1和s2。lS1S1:表示缓冲区是否空闲,初值为1;lS2S2:表示缓冲区中是否有可供打印的计算结果,初始值为0。2.2.利用信号量实现进程之间的同步利用信号量实现进程之间的同步共享缓冲区计算进程 Pc打印进程
18、 Pp int s1=1 int s1=1,s2=0;s2=0;Pc Pc:compute next number;compute next number;P(s1);P(s1);add the number to buffer;add the number to buffer;V(s2);V(s2);Pp Pp:P(s2);P(s2);take next number from buffer;take next number from buffer;V(s1);V(s1);print the number;print the number;能否用一能否用一个同步信个同步信号量?号量?l计算机
19、中的并发进程,可以抽象成生产者和消费者问题进行解决。l生产者生产者:运行中的进程当其释放一个资源或发一个信号时,可把它看成该资源或信号的生产者,l消费者消费者:当运行中的进程申请一个资源或接收一个信号时,又可把它看成该资源或信号的消费者。电话号码:买一个手机,消费一个空资源。电话号码:买一个手机,消费一个空资源。例例 上述例子中l计算进程:计算进程:被被打印数据的生产者;空缓冲的消费者l打印进程:打印进程:被被打印数据的消费者;空缓冲的生产者3.3.利用信号量解决生产者和消费者问题利用信号量解决生产者和消费者问题 例例 l假定有一组生产者和消费者进程,通过一个有界缓冲区发生联系。l正常情况下,
20、生产者与消费者可并发地释放或取得缓冲区的产品。l限制条件:l缓冲区满:生产者要等待;l缓冲区空,消费者要等待。l设共享缓冲区容量为k。l存取缓冲区的限制:生产者/消费者互斥地使用缓冲区。生产者进程和消费者需要同步存取缓冲区信息。emptyempty:表示空缓冲块的个数,初值为k k;fullfull:有数据的缓冲块个数,初值为0 0。mutexmutex:互斥访问临界区的信号量,初值为1 1(因为多个生产者互斥,相当变量(因为多个生产者互斥,相当变量countercounter)。生产者1生产者2生产者M放产品指针 i消费者1消费者2消费者N取产品指针 jbuffer k(可以是一个循环栈)i
21、nt mutex=1,empty=k,full=0,i=0,j=0;DataType buffer k;Producer:produce a product x;P(empty);/申请空缓冲块 P(mutex);/实现对共享缓冲区的互斥访问 buffer i=x;/放入产品 i=(i+1)%k;V(mutex);V(full);/有数据的缓冲块个数加1 Consumer:P(full);/申请有数据的缓冲块 P(mutex);/实现对共享缓冲区的互斥访问 y=buffer j;/取产品 j=(j+1)%k;V(mutex);V(empty);/空缓冲块的个数加1 注意注意 每个进程中的P操作
22、的次序是很重要的。P操作放置不当,就可能死锁死锁。读读/写问题写问题:有一个多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;一些进程(reader)只读取这个数据区;一些进程(writer)只往数据区中写数据。读写必须满足以下条件:1.允许任意多的读进程可以同时读;2.一次只有一个写进程可写;4.4.读者读者(reader)和写者和写者(writer)问题问题l计数器readcount:记录同时读的读者数,初值为0。l读互斥信号量rmutex:使读者互斥地访问共享变量readcount,初值为1。l读写互斥信号量wrmutex:实现读写互斥和写写互斥地访问共享文件,初值为1。读
23、写同步的实现读写同步的实现int rmutex=1,wrmutex=1,readcount=0;Reader:P(rmutex);/互斥访问readcount if readcount=0 then P(wrmutex);readcount+;V(rmutex);读文件;P(rmutex);readcount=readcount-1;if readcount=0 then V(wrmutex);V(rmutex);Writer:P(wrmutex);写文件;V(wrmutex);l这也是一个典型的同步问题,是一大类并发控制问题的例子。l假设有5个哲学家,花费一生的时光思考和吃饭。在桌子上放着5
24、只叉子。一个哲学家一次只能拿起一只叉子;仅当拿有两只叉子时才能吃饭;吃完,放下两只叉子。l每只叉子都用一个信号量表示。lsemaphore fork5l所有fork的元素被初始化为1。哲学家 i 的操作:do P(forki);P(fork(i+1)%5);eat V(forki);V(fork(i+1)%5);thinkwhile(1);可能导致死锁/饥饿最后一个人只能得到一把叉子不能吃饭将饿死l最多只允许四个哲学家同时坐在桌子上。l只有左右两只叉子都可用时才允许他拿起叉子(他必须在临界区内拿起两只叉子)。l使用非对称解决。奇数哲学家先拿起他左边的叉子,接着拿起他右边的叉子;偶数哲学家先拿起
25、他右边的叉子,接着拿起他左边的叉子。l信号量:编程负担重,易出错。l管程(Monitor):一种新的进程间同步机制。l管程比信号量容易控制。l基本思想基本思想:是把信号量及其pv操作原语封装在一个对象内部,将共享变量及对共享变量能够进行的所有操作集中在一个模块中。l管程管程:是关于共享资源的数据结构及一组针对该资源的操作过程所构成的软件模块。l管程管程提供互斥机制:一次只有一个进程能在管程内活动。从而,保证管程数据的一致性。l组成组成:局部于该管程的共享数据的说明,对共享数据执行的一组操作过程的说明,共享数据的初值设置语句。mutexshow:Monitor /管程名字 busy:boolea
展开阅读全文