《2022年操作系统概论实践作业》由会员分享,可在线阅读,更多相关《2022年操作系统概论实践作业(21页珍藏版)》请在金锄头文库上搜索。
1、章节作业第 1 章 Shell 命令操作实践作业(1)在当前登录用户的主目录下创建子目录mysub,进入 mysub 目录。答: mkdir mysub & cd mysub(2)显示当前目录路径。答: pwd(3)显示用户名和用户主目录答: echo $HOME $USER(4)将用户主目录添加到可执行文件搜索路径答: export PATH=$PATH:$HOME(5)显示添加后的可执行文件搜索路径答: echo $PATH(6)列出主目录下所有以”.ba”或“ .pr”打头的文件名及其属性并将其存入my1 文件中答: ls -l $HOME/*.ba $HOME/*.pr my1(7)列
2、出进程状态信息中含tty 的进程,并将其存入my2 文件中答: ps -ef | grep tty my2(8)将 my1 和 my2 串联成一个新文件my3 答: cat my1 my2 my3(9)将当前目录下的所有文件压缩归档到myf.tar.gz 文件中答: tar cvf myf.tar.gz *(10)将 my3 移动到上级目录中答: mv my3 ./(11)删除文件 my1 和 my2 答: rm my1 my2(12)启动 vi 文本编辑程序答: vi(13)在 vi 中输入 (3) (11)步的操作命令,并将其存入文件mysh 答: 按 i 进入编辑模式,按esc 退出编辑
3、模式,按: 输入命令:save mysh, 输入命令:wq保存退出(14)将 vi 放入后台运行答: vi &(15)将文件 mysh 访问权限改为文件主可执行答: chmod +x mysh(16)将文件 mysh 复制到上级目录中答: cp mysh ./(17)令 vi 返回前台,从中追加睡眠1 分钟和返回前台的命令,从vi 保存退出答: fg 后面追加sleep 60 & fg(18)以后台运行方式启动mysh 答: mysh &(19)找到执行睡眠命令的的进程号答: ps -fu $USER | grep mysh | awk print $2(20)用发送信号命令向睡眠命令进程号发
4、送终止信号,让mysh 停止执行。答: kill -15 pid 第 2 章 与处理器管理有关的系统功能调用实践作业名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 21 页 - - - - - - - - - 参照 “ 强化实践能力培养课程内容” 中 “ 进程创建和执行的实践能力培养考核选例”和“ 线程的创建及线程间管道通信实践能力培养考核选例” 程序,编写一个能建立两个子进程的程序 (父进程 ),让这三个进程并发执行完成以下二元函数的计算:其中由父进程完成:f(x,y)
5、 = f(x) + f(y) 由子进程 1 完成阶乘计算:f(x) = f(x-1) * x (x 1) f(x)=1 (x=1) 由子进程 2 完成非波纳奇序列:f(y) = f(y-1) + f(y-2) (y 2) f(y)=1 (y=1,2) 答:#include int fx(int x); int fy(int y); void main() int x,y; printf(please input x:); scanf(%d,&x); int ffx,ffy; ffx=fx(x); printf(please input y:); scanf(%d,&y); ffy=fy(y);
6、 int z; z=ffx+ffy; printf(%d,z); int fx(int x) int ffx; if(x=1) ffx=1; else ffx=fx(x-1)*x; return ffx; int fy(int y) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 21 页 - - - - - - - - - int ffy; if(y=1|y=2) ffy=1; else if(y2) ffy=fy(y-1)+fy(y-2); return ffy; 第
7、 3 章 与存储管理有关的操作系统算法实践作业参照“强化实践能力培养课程内容”中“内存页面置换算法实践能力培养考核选例”程序,编写一个能演示LRU 内存页面置换算法的程序,它可根据给定的一组页面引用序列号和实存页数, 显示 LRU 置换页的过程, 能统计和报告 LRU 置换算法情况下依次淘汰的页号、缺页次数(页错误数)和缺页率。答: #includestdio.h #includestdlib.h void CopyL(intSour,int Dist ,int x); /数组 Sour 复制到数组Dist,复制到 x 个数void SetDI(intDiscL); / 随机生成磁道数void
8、 Print(intPri,int x); / 打印输出数组Pri void DelInq(int Sour,intx,int y); / 数组 Sour 把 x 位置的数删除,并把y 前面的数向前移动, y 后的数保持不变(即会出现 2 个 y) void FCFS(int Han,intDiscL); / 先来先服务算法(FCFS) void SSTF(int Han,intDiscL); / 最短寻道时间优先算法(SSTF) int SCAN(int Han,intDiscL,int x,int y); / 扫描算法 (SCAN) void CSCAN(int Han,intDiscL)
9、; / 循环扫描算法 (CSCAN) /void N_Step_SCAN(intHan1,int DiscL); /N 步扫描算法 (NStepScan) void PaiXu(); / 寻道长度由低到高排序void Pri(); int NAll=0; int Best52; /用作寻道长度由低到高排序时存放的数组int Limit=0; /输入寻找的范围磁道数i int Jage; float Aver=0; int main() int i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
10、 - - 第 3 页,共 21 页 - - - - - - - - - int DiscLine10; / 声明准备要生成的随机磁道号的数组 int Hand; /磁道数 int Con=1; int n; while(Con=1) Jage=0; printf(n 请输入初始的磁道数(0n65536) printf( 超出范围 !); else printf( *n); printf( *磁盘调度算法*n); printf( *n); printf(* 1.先来先服务算法(FCFS) *n); printf( * 2.最短寻道时间优先算法(SSTF) *n); printf( * 3.扫描算
11、法 (SCAN) *n); printf( * 4.循环扫描算法 (CSCAN) *n); printf( *n); scanf(%d,&n); if(n=0) exit(0); printf(n); switch(n) case 1: SetDI(DiscLine); / 随机生成磁道数FCFS(Hand,DiscLine); /先来先服务算法(FCFS) break; case 2: SetDI(DiscLine); / 随机生成磁道数SSTF(Hand,DiscLine); /最短寻道时间优先算法(SSTF) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
12、- - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 21 页 - - - - - - - - - break; case 3: SetDI(DiscLine); / 随机生成磁道数SCAN(Hand,DiscLine,0,9); / 扫描算法 (SCAN) break; case 4: SetDI(DiscLine); / 随机生成磁道数CSCAN(Hand,DiscLine); /循环扫描算法 (CSCAN) break; case 5: SetDI(DiscLine); / 随机生成磁道数SetDI(DiscLine); / 随机生成磁道数FCFS
13、(Hand,DiscLine); /先来先服务算法(FCFS) SSTF(Hand,DiscLine); /最短寻道时间优先算法(SSTF) SCAN(Hand,DiscLine,0,9); /扫描算法 (SCAN) CSCAN(Hand,DiscLine); / 循环扫描算法 (CSCAN) PaiXu(); /寻道长度由低到高排序printf(nn+ 寻道长度由低到高排序:); for(i=0;i5;i+) printf(%4d ,Besti0); break; printf(nn+ 是否继续 (按 0 结束 ,按 1 继续)?); scanf(%5d,&Con); / 数组 Sour 复
14、制到数组Dist,复制到 x 个数void CopyL(intSour,int Dist ,int x) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 21 页 - - - - - - - - - int i; for(i=0;i=x;i+) Disti=Souri; / 打印输出数组Pri void Print(intPri,int x) int i; for(i=0;i=x;i+) printf(%5d,Prii); / 随机生成磁道数void SetDI(intD
15、iscL) int i; for(i=0;i=9;i+) DiscLi=rand()%Limit;/随机生成 10 个磁道号 printf(+ 需要寻找的磁道号:); Print(DiscL,9); / 输出随机生成的磁道号 printf(n); / 数组 Sour 把 x 位置的数删除,并把y 前面的数向前移动,y 后的数保持不变(即会出现2个 y) void DelInq(intSour,int x,int y) int i; for(i=x;iy;i+) Souri=Souri+1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
16、 - - 名师精心整理 - - - - - - - 第 6 页,共 21 页 - - - - - - - - - x+; / 先来先服务算法(FCFS) void FCFS(int Han,intDiscL) int RLine10; /将随机生成的磁道数数组Discl 复制给数组RLine int i,k,All,Temp; /Temp是计算移动的磁道距离的临时变量 All=0; /统计全部的磁道数变量 k=9; / 限定 10 个的磁道数 CopyL(DiscL,RLine,9); / 复制磁道号到临时数组RLine printf(n+ 按照 FCFS算法磁道的访问顺序为:); All=H
17、an-RLine0; for(i=0;i=9;i+) Temp=RLine0-RLine1;/求出移动磁道数,前一个磁道数减去后一个磁道数得出临时的移动距离if(Temp0) Temp=(-Temp);/移动磁道数为负数时,算出相反数作为移动磁道数printf(%5d,RLine0); All=Temp+All;/求全部磁道数的总和DelInq(RLine,0,k);/每个磁道数向前移动一位k-; BestJage1=All;/Best1存放移动磁道数 BestJage0=1; /Best0存放算法的序号为:1 Jage+;/排序的序号加1 Aver=(float) All)/10;/求平均寻
18、道次数 printf(n+ 移动磁道数 : ,All); printf(n+ 平均寻道长度 :*%0.2f* ,Aver); / 最短寻道时间优先算法(SSTF) void SSTF(int Han,intDiscL) int i,j,k,h,All; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 21 页 - - - - - - - - - int Temp; /Temp是计算移动的磁道距离的临时变量 int RLine10; / 将随机生成的磁道数数组Discl 复
19、制给数组RLine int Min; All=0; /统计全部的磁道数变量 k=9; / 限定 10 个的磁道数 CopyL(DiscL,RLine,9); / 复制磁道号到临时数组RLine printf(n+ 按照 SSTF算法磁道的访问顺序为:); for(i=0;i=9;i+) Min=64000; for(j=0;jHan) / 如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLinej-Han; / 求出临时的移动距离else Temp=Han-RLinej; / 求出临时的移动距离if(TempMin) / 如果每求出一次的移动距离小于Min,执行下一句 Min
20、=Temp; /Temp临时值赋予Min h=j; /把最近当前磁道号的数组下标赋予h All=All+Min; /统计一共移动的距离printf(%5d,RLineh); Han=RLineh; DelInq(RLine,h,k); / 每个磁道数向前移动一位k-; BestJage1=All;/Best1存放移动磁道数 BestJage0=2;/Best0存放算法的序号为:2 Jage+;/排序序号加1 Aver=(float)All)/10;/求平均寻道次数 printf(n+ 移动磁道数 : ,All); printf(n+ 平均寻道长度 :*%0.2f* ,Aver); 名师资料总结
21、 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 21 页 - - - - - - - - - / 扫描算法 (SCAN) int SCAN(int Han,intDiscL,int x,int y) int j,n,k,h,m,All; int t=0; int Temp; int Min; int RLine10; /将随机生成的磁道数数组Discl 复制给数组RLine int Order; Order=1; k=y; m=2; / 控制 while 语句的执行,即是一定要使当前
22、磁道向内向外都要扫描到 All=0; /统计全部的磁道数变量 CopyL(DiscL,RLine,9); / 复制磁道号到临时数组RLine printf(n+ 按照 SCAN 算法磁道的访问顺序为:); Min=64000; for(j=x;jHan) / 如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLinej-Han; / 求出临时的移动距离else Temp=Han-RLinej; / 求出临时的移动距离if(Temp=Han) / 判断磁道的移动方向,即是由里向外还是由外向里Order=0; t=1; Han=RLineh; 名师资料总结 - - -精品资料欢迎下
23、载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 21 页 - - - - - - - - - DelInq(RLine,h,k); / 每个磁道数向前移动一位 k-; while(m0) if(Order=1) /order是判断磁盘扫描的方向标签,order 是 1 的话,磁道向内移动 for(j=x;j=y;j+) h=-1; Min=64000; for(n=x;n=k;n+) / 判断离当前磁道最近的磁道号 if(RLinen=Han) Temp=Han-RLinen; if(TempMin) Min
24、=Temp; /Temp临时值赋予Min h=n; / 把最近当前磁道号的数组下标赋予h if(h!=-1) All=All+Min; / 叠加移动距离printf(%5d,RLineh); Han=RLineh; /最近的磁道号作为当前磁道DelInq(RLine,h,k); k-; Order=0; /当完成向内的移动,order 赋予 0,执行 else 语句,使磁道向外移动m-; / 向内完成一次,m 减一次,保证while 循环执行两次 else /order是 0 的话,磁道向外移动名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - -
25、 - - - 名师精心整理 - - - - - - - 第 10 页,共 21 页 - - - - - - - - - for(j=x;j=y;j+) h=-1; Min=64000; for(n=x;n=Han) Temp=RLinen-Han; if(Temp5) BestJage1=All;/Best1存放移动磁道数 BestJage0=3;/Best0存放算法的序号为:3 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 21 页 - - - - - - - -
26、- Jage+;/排序序号加1 Aver=(float)All)/10;/求平均寻道次数printf(n+ 移动磁道数 : ,All); printf(n+ 平均寻道长度 :*%0.2f* ,Aver); if(t=1) printf(n+ 磁道由内向外移动); else printf(n+ 磁道由外向内移动); return(Han); / 循环扫描算法 (CSCAN) void CSCAN(int Han,intDiscL) int j,h,n,Temp,m,k,All,Last,i; int RLine10; /将随机生成的磁道数数组Discl 复制给数组RLine int Min; i
27、nt tmp=0; m=2; k=9; All=0; /统计全部的磁道数变量 Last=Han; CopyL(DiscL,RLine,9); / 复制磁道号到临时数组RLine printf(n+ 按照 CSCAN算法磁道的访问顺序为:); while(k=0) for(j=0;j=9;j+) / 从当前磁道号开始,由内向外搜索离当前磁道最近的磁道号 h=-1; Min=64000; for(n=0;n=Han) Temp=RLinen-Han; if(Temp=0) tmp=RLine0; for(i=0;iRLinei) tmp=RLinei; Han=tmp;/把最小的磁道号赋给Han
28、Temp=Last-tmp;/求出最大磁道号和最小磁道号的距离差All=All+Temp; BestJage1=All;/Best1存放移动磁道数 BestJage0=4;/Best0存放算法的序号为:4 Jage+;/排序序号加1 Aver=(float)All)/10;/求平均寻道次数 printf(n+ 移动磁道数 : ,All); printf(n+ 平均寻道长度 :*%0.2f* ,Aver); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 21 页 - -
29、 - - - - - - - void PaiXu() int i,j,Temp; for(i=0;i5;i+) for(j=0;jBestj+11) / 如果前一个算法的移动磁道距离大于后一个移动磁道数,执行下面语句 Temp=Bestj+11; / 从这起下三行执行冒泡法将移动距离大小排序,排完后则执行每个算法的排序Bestj+11=Bestj1; Bestj1=Temp; Temp=Bestj+10; / 将每个算法的序号用冒泡法排序Bestj+10=Bestj0; Bestj0=Temp; 第4章与文件管理有关的系统功能调用实践作业参照“强化实践能力培养课程内容”中“文件操作实践能力培
30、养考核选例”程序,请构造一个能管理文本文件的学生成绩表的简单数据库管理系统。设文本文件的学生成绩表中每条学生成绩记录有3 个字段构成:学号20 个字节,姓名20 个字节,成绩10 个字节,字段间用空格分割对齐。简单数据库管理系统具有基本的功能有:追加一条记录, (仅允许文件主)按学号读出一条记录,按学号升序列出所有记录. (提示:可建立一个学生成绩表文件和一个以学号为主键的索引文件。)答:#include #include #include #define LEN sizeof(struct score) #define DEBUG 名师资料总结 - - -精品资料欢迎下载 - - - - -
31、 - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 21 页 - - - - - - - - - #include typedef struct score charno20;/记录号charnumber20;/*学号 */ charname20;/*姓名 */ chargrades10;/成绩structscore *next;/下一个节点score; int m,n; score* load(score *head) score*p1,*p2; intm=0; charfilepn10; FILE*fp; printf( 请输入
32、文件路径机文件名n); scanf(%s,filepn); if(fp=fopen(filepn,r+)=NULL) printf( 不能打开文件 n); exit(0); p1=(score*)malloc(LEN); head=NULL; while(!feof(fp) n=n+1; if(n=1)head=p1; elsep2-next=p1; p2=p1; p1=(score*)malloc(LEN); fscanf(fp,%s%s %s %s ,p1-no,p1-number,p1-name,p1-grades); p2-next=p1; 名师资料总结 - - -精品资料欢迎下载 -
33、 - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 21 页 - - - - - - - - - p1-next=NULL; n+; fclose(fp); returnhead; / 追加score *append(score *head) score*p1,*p2,*p3; p3=(score*)malloc(LEN); printf( 输入学生信息:n); printf( 记录号学号姓名成绩 n); scanf(%s%s %s %s,p3-no,p3-number,p3-name,p3-grades); p1=
34、head; if(head=NULL) / 如果链表为空head=p3; p3-next=NULL; else if(p1-next=NULL) p1-next=p3; p3-next=NULL; else while(p1-next!=NULL)/若是还没有到尾端的话 p2=p1; p1=p1-next; p1-next=p3; p3-next=NULL; n+; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 21 页 - - - - - - - - - retur
35、nhead; 第5章 与设备管理有关的操作系统算法实践作业参照“强化实践能力培养课程内容”中“磁盘移臂调度算法实践能力培养考核选例”程序编写一个能演示“最短寻找时间优先算法Sstf ”的程序。 s 该程序能分析出“ , 即能统计和报告出“ 最短寻找时间优先算法” 下磁头响应请求的顺序、移臂的总量和掉头的次数。答: #include stdio.h #include stdlib.h void CopyL(int Sour,int Dist ,int x); /数组 Sour 复制到数组Dist,复制到 x 个数void SetDI(int DiscL); / 随机生成磁道数void Print
36、(int Pri,int x); / 打印输出数组Pri void DelInq(int Sour,int x,int y); / 数组 Sour 把 x 位置的数删除,并把y 前面的数向前移动, y 后的数保持不变(即会出现2 个 y) void SSTF(int Han,int DiscL); / 最短寻道时间优先算法(SSTF) void PaiXu(); / 寻道长度由低到高排序void Pri(); int NAll=0; int Best52; / 用作寻道长度由低到高排序时存放的数组int Limit=0; / 输入寻找的范围磁道数i int Jage; float Aver=0
37、; int main() int i; int DiscLine10; / 声明准备要生成的随机磁道号的数组int Hand; / 磁道数int Con=1; int n; while(Con=1) Jage=0; printf(n 请输入初始的磁道数(0n65536) printf( 超出范围 !); else printf( *n); printf( * 磁盘调度算法*n); printf( *n); printf( * 2.最短寻道时间优先算法(SSTF) *n); printf( *n); scanf(%d,&n); if(n=0) exit(0); 名师资料总结 - - -精品资料欢
38、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 21 页 - - - - - - - - - printf(n); switch(n) case 2: SetDI(DiscLine); / 随机生成磁道数SSTF(Hand,DiscLine); /最短寻道时间优先算法(SSTF) break; printf(nn+ 是否继续 (按 0 结束 ,按 1 继续 )?); scanf(%5d,&Con); / 数组 Sour 复制到数组Dist,复制到x 个数void CopyL(int Sour,int D
39、ist ,int x) int i; for(i=0;i=x;i+) Disti=Souri; / 打印输出数组Pri void Print(int Pri,int x) int i; for(i=0;i=x;i+) printf(%5d,Prii); / 随机生成磁道数void SetDI(int DiscL) int i; for(i=0;i=9;i+) DiscLi=rand()%Limit;/ 随机生成10 个磁道号 printf(+ 需要寻找的磁道号:); Print(DiscL,9); / 输出随机生成的磁道号printf(n); / 数组 Sour 把 x 位置的数删除,并把y
40、前面的数向前移动,y 后的数保持不变(即会出现 2 个 y) void DelInq(int Sour,int x,int y) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 21 页 - - - - - - - - - int i; for(i=x;iy;i+) Souri=Souri+1; x+; / 最短寻道时间优先算法(SSTF) void SSTF(int Han,int DiscL) int i,j,k,h,All; int Temp; /Temp 是计算
41、移动的磁道距离的临时变量int RLine10; / 将随机生成的磁道数数组Discl复制给数组RLine int Min; All=0; / 统计全部的磁道数变量k=9; / 限定 10 个的磁道数CopyL(DiscL,RLine,9); / 复制磁道号到临时数组RLine printf(n+ 按照 SSTF算法磁道的访问顺序为:); for(i=0;i=9;i+) Min=64000; for(j=0;jHan) / 如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLinej-Han; / 求出临时的移动距离else Temp=Han-RLinej; / 求出临时的移动
42、距离if(TempMin) / 如果每求出一次的移动距离小于Min ,执行下一句 Min=Temp; /Temp 临时值赋予Min h=j; / 把最近当前磁道号的数组下标赋予h All=All+Min; / 统计一共移动的距离printf(%5d,RLineh); Han=RLineh; DelInq(RLine,h,k); / 每个磁道数向前移动一位k-; BestJage1=All;/Best1 存放移动磁道数BestJage0=2;/Best0 存放算法的序号为:2 Jage+;/排序序号加1 Aver=(float)All)/10;/ 求平均寻道次数printf(n+ 移动磁道数 :
43、 ,All); printf(n+ 平均寻道长度 :*%0.2f* ,Aver); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 21 页 - - - - - - - - - void PaiXu() int i,j,Temp; for(i=0;i5;i+) for(j=0;jBestj+11) / 如果前一个算法的移动磁道距离大于后一个移动磁道数,执行下面语句 Temp=Bestj+11; / 从这起下三行执行冒泡法将移动距离大小排序,排完后则执行每个算法的排序Be
44、stj+11=Bestj1; Bestj1=Temp; Temp=Bestj+10; /将每个算法的序号用冒泡法排序Bestj+10=Bestj0; Bestj0=Temp; 第6章 与并发进程有关的系统功能调用实践作业参照“强化实践能力培养课程内容”中“进程的同步与互斥实践能力培养考核选例”程序和“文件操作实践能力培养考核选例”程序, 请在计算机上实现教材第6章习题 6要求的功能。答:这四个进程实际上是两个生产者R1,R2 和两个消费者W1,W2.各自生成的不同产品中各自的消费对象去消费,他们共享一个的缓冲器。由于缓冲器只能存放一个数,所以,R1和 R2在存放时必须互斥。而 R1和 W1、R
45、2 和 W2 之间存在同步。 为了协调他们之间的工作可定义三个信号量:S: 表示能否把数存入缓冲器B,初始值为1。S1:表示 R1是否已向缓冲器存入从键盘上读入的一个数,初始值为0,S2:表示 R2是否已向缓冲器存入从磁盘上读入的一个数,初始值为0。begin S,S1,S2:semaphore; S:=1;S1:=S2:=0; cobegin process R1 x1:integer; begin L1:从键盘读入一个数; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页
46、,共 21 页 - - - - - - - - - x1:=读入的数;P(S); B:=x1; V(S1); goto L1; end; process R2 x2:integer; begin L2:从磁盘读入一个数; X2:=读入的数;P(S); B:=x2; V(S2); goto L2; end; process W1 y:integer; begin L3:P(S1); y:=B;V(S); 打印 y 中的数;goto L3; end; process W2 z:integer; begin L4:P(S2); z:=B;V(S); 打印 z 中的数;goto L4; end; coend; end. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 21 页 - - - - - - - - -