1、20092010第II学期 操作系统原理,课堂练习,有一个阅览室共50个座位。用一张表来管理它,每个表目记录座号以及读者姓名。读者进入时要先在表上登记,退出时要注销登记。试用信号量及其P、V操作来描述各个读者“进入”和“注销”工作之间的同步关系。,20092010第II学期 操作系统原理,分析,50个座位是读者共同使用的资源,因此要用一个资源分配信号量来管理它; 读者“进入”阅览室时,要申请座位。只有申请到座位才能进入,否则应该等待到座位的释放; 没有读者时,不能做“注销”工作,必须等到有了读者才能做。 因此,可以设置两个信号量: S1初值为50,管理座位的分配; S2初值为0,控制“注销”与
2、“进入”互斥使用登记表。,20092010第II学期 操作系统原理,算法,退出登记 Begin P(S2) 注销登记 V(S2) V(S1) End,进入登记 Begin P(S1) P(S2 进入登记 V(S2) End,20092010第II学期 操作系统原理,课堂练习,桌上有一只盘子,每次只能放入一只水果。 爸爸专向盘子中放苹果,妈妈专向盘子中放桔子。 一个儿子专等吃盘子中的桔子,一个女儿专等吃盘子里的苹果。 试用PV操作设计出能使爸爸、妈妈、儿子和女儿正确同步的算法。 如果盘子可以放N个水果呢?,20092010第II学期 操作系统原理,分析,互斥资源 盘子(四个人) 同步资源 盘子(
3、四个人) 苹果(爸爸与女儿) 桔子(妈妈与儿子) 信号量,20092010第II学期 操作系统原理,process son begin L3: P(sg); (5) 从plate中取桔子; V(sp); (6) 吃桔子; goto L3; end;,process daughter begin L4: P(sg2); (7) 从plate中取苹果; V(sp); (8) 吃苹果; goto L4; end;,process father begin L1: 削一个苹果; P(sp); (1) 把苹果放入plate; V(sg2); (2) goto L1; end;,process mothe
4、r begin L2: 剥一个桔子; P(sp); (3) 把桔子放入plate; V(sg1);(4) goto L2; end;,sp:semaphore;/* 盘子里可以放水果数 */ sg1:semaphore; /* 盘子里有桔子 */ sg2:semaphore; /* 盘子里有苹果 */,sp := 1; /* 盘子里允许放入一个水果*/ sg1 := 0; /* 盘子里没有桔子 */ sg2 := 0; /* 盘子里没有苹果*/,有没有互斥 问题?,process father begin 削一个苹果; P(N) p(mutex) 苹果放入plate; v(mutex) V(s
5、g2); end;,process mother begin P(N) bo orange; p(mutex) orange放入plate; v(mutex) V(sg1); end;,process son begin p(sg1) p(mutex) qu orange v(mutex) V(N) end;,process daughter begin p(sg2) p(mutex) qu apple v(mutex) V(N) end;,盘子可以放N个水果,20092010第II学期 操作系统原理,有一个空缓冲区 容量是N 有三个进程p1,p2,p3 ,p1进程produce()产生一个正
6、整数, put()将这个数放入 缓冲区,p2进程getodd()从缓冲区中取一个奇数并用countodd()计数,p3进程geteven()从缓冲区中取一个偶数,并用counteven计数,请用信号量机制描述算法,20092010第II学期 操作系统原理,int odd = 0; /奇数信号量 int even = 0; /偶数信号量 int empty = N; /缓冲区空单元信号量 int full = 0; / 缓冲区满单元信号量,20092010第II学期 操作系统原理,void main() while (1) p1(); p2(); p3(); ,20092010第II学期 操作系
7、统原理,p1() while (1) p(empty); produce(); / 产生一个正整数 if (产生的数为奇数) v(odd); else 产生的数为偶数 v(even); v(full); ,20092010第II学期 操作系统原理,p2() while (1) p(full); p(odd); getodd(); / 从缓冲区中取一个奇数 countodd(); / 计算奇数的个数 v(empty); ,20092010第II学期 操作系统原理,void p3() while (1) p(full); p(even); geteven(); / 从缓冲区中取一个偶数 count
8、even(); / 计算偶数的个数 v(empty); ,20092010第II学期 操作系统原理,课堂练习,设有一台计算机,有两条I/O通道,分别接一台卡片输入机和一台打印机。卡片机把一叠卡片逐一输入到缓冲区B1中,加工处理后再搬到缓冲区B2中,并在打印机上打印,问(10分): 系统要设几个进程来完成这个任务?各自的工作是什么? 这些进程间有什么样的相互制约关系? 用P、V操作写出这些进程的同步算法。,20092010第II学期 操作系统原理,分析,系统可设三个进程来完成这个任务:R进程负责从卡片输入机上读入卡片信息,输入到缓冲区B1中;C进程负责从缓冲区B1中取出信息,进行加工处理,之后将
9、结果送到缓冲区B2中;P进程负责从缓冲区B2中取出信息,并在打印机上印出。 R进程受C进程影响,B1放满信息后R进程要等待等C进程将其中信息全部取走,才能继续读入信息;C进程受R进程和P进程的约束:B1中信息放满后C进程才可从中取出它们,且B2被取空后C进程才可将加工结果送入其中;P进程受C进程的约束:B2中信息放满后P进程才可从中取出它们,进行打印,20092010第II学期 操作系统原理,分析,信号量含义及初值: B1full 缓冲区B1满,初值为0; B1empty缓冲区B1空,初值为1;表示B1缓冲区初始为空闲状态 B2full 缓冲区B2满,初值为0; B2empty缓冲区B2空,初
10、值为1;表示B2缓冲区初始为空闲状态,20092010第II学期 操作系统原理,算法,P(B2full); 从B2中取出信息进行打印; V(B2empty);,P(B1full); 从B1中取出信息; V(B1empty); 加工信息; P(B2empty); 结果送入B2; V(B2full);,P(B1empty); 输入信息写入缓冲区B1; V(B1full);,R进程 C进程 P进程,20092010第II学期 操作系统原理,理发师问题,爱睡觉的理发师问题Dijkstra,1968.一个理发店有两间相连的屋子.一间是私室,里面有一把理发椅,另一间是等候室,有一个滑动门和N把椅子.理发师
11、忙的时候,通向私室的门被关闭,新来的顾客找一把空椅子坐下,如果椅子都被占用了,则顾客只好离去.如果没有顾客,则理发师在理发椅上睡觉,并打开通向私室的门.理发师睡觉时,顾客可以叫醒他理发.请编写理发师和顾客的程序,正确实现同步互斥问题.,20092010第II学期 操作系统原理,理发师问题,S1,S2:semaphore; S1:=0;S2:=n; 顾客: begin P(S2); /申请占用椅子 V(S1); /给理发师一个信号 坐在椅子上等待理发; end; 理发师: begin L2:P(S1); /检查是否有顾客理发。若无,则睡眠等待 给一个顾客理发; V(S2); /让已经理完发的顾客
12、退出理发店,让等待的顾客中的一位进入 goto L2; end,20092010第II学期 操作系统原理,barber,wait:semaphore; barber,wait:=0; entry:semaphore; entry:=1; int count=0; Cobegin,20092010第II学期 操作系统原理,Cobegin 顾客: 理发师: P(entry); repeat: if count=n then exit; P(barber) count:=count+1; 理发;if count1 then until false; begin endV(entry); P(wait); end; else V(entry); V(barber); 理发; P(entry); count:=count-1; if count1 then V(wait); V(entry); end; Coend;,