ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:18.36KB ,
资源ID:156031      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-156031.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验三分析解析.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

操作系统实验三分析解析.docx

1、操作系统实验三分析解析实验三 P 、 V 原语的模拟实现一、实验目的1)理解信号量相关理论;2)掌握记录型信号量结构;3)掌握 P、 V 原语实现机制。二、 实验内容本实验针对操作系统中信号量相关理论进行实验,要求实验者输入实验指导书提供的代码并进行测试。代码主要模拟信号量的 P 操作( down )和 V 操作( up)。1)信号量信号量也称为信号锁,主要应用于进程间的同步和互斥,在用于互斥时,通常作为资源锁。信号量通常通过两个原子操作 dwon(P) 和 up(V) 来访问。 dwon 操作使信号量的值 +1,up 操作使信号量的值 -1。2)记录型信号量记录型信号量采用了 “让权等待 ”

2、的策略,存在多个进程等待访问同一临界资源的情况,所以记录型信号量需 要一个等待链表来存放等待该信号量的进程控制块或进程号。在本实验中,使用记录型信号量。三、实验要求1)输入给定代码;2)进行功能测试并得出正确结果。3)分析 dwon 和 up 函数功能模块;4)在实验报告中画出 dwon 和 up 函数流程图;5)撰写实验报告。四、程序清单#include basic.hsemphore sem5; /deinfe 5 semphorespnode * pr20; /define 0-19 total 20 process/down operationvoid down(char * snam

3、e,int pid)int fflag,pflag;pnode *p,*p1;semphore *s;fflag=0;pflag=0;for(int i=0;i5;i+)if(!strcmp(semi.name,sname)/find semaphore by name 根据名字找到信号量s=; / 将找到的信号量存入 sfflag=1; / 设置信号量标志位 fflag 为 1,表示找到了信号量break;for(i=0;inode-pid = pid)p1 = pri; / 存入 p1pflag=1; / 设置进程标志位 pflag 为 1,表示找到了 pcbbreak;if(!

4、fflag) /semaphore is not exist 如果找不到资源信号量printf(the semphore %s is not exist!n,sname); / 输出没有该信号量 return;if(!pflag) /pid is not exist 如果找不到 pcb 进程printf(the process %d is not exist!n,pid); / 输出没有该 pcb 进程 return;s-count-; /semaphore! s value -1 被该 pcb 进程占用的资源信号量减 1if(s-count=0) /this pcb get the sema

5、phore 如果当前资源信号量没有被用完s-curpid = p1-node-pid; / 当前 pcb 进程就占用该信号量elseif(s-wlist) /the link is not NULL, add the pcb to the last 如果等待链表不为空,就去/找等待链表的尾部插入;若当前 pcb 进程所占用的信号量没有了,就将该进程放到该进程/链表的尾部去等待for(p=s-wlist;p-next;p=p-next);p-next=p1;else /this pcb is the first pcb be added to the down list 若等待链表为空,则该 p

6、cb 进/程是一个等待的 pcb 进程,直接插入s-wlist=p1;/up operationvoid up(char *sname) / 释放资源信号量int fflag=0;for(int i=0;inode-pid;/ 信号量被在等待链表中的第一个 pcb/进程占用semi.wlist = semi.wlist-next; /等待链表指向下一个等待的pcb 进程elseprintf(the semphore %s is not exist!n,sname);/ 若找不到该信号量就输出/show semphore infomationvoid showdetail()int i;pnod

7、e *p;printf(n);for(i=0;i5;i+)if(semi.countnode-pid);p=p-next;elseprintf(%s : ,semi.name);printf(n);/*/void init()/init semaphorestrcat(sem0.name,s0);strcat(sem1.name,s1);strcat(sem2.name,s2);strcat(sem3.name,s3);strcat(sem4.name,s4);for(int i=0;i5;i+)semi.wlist=NULL;semi.count=1;/init processfor(i=0

8、;inode=new pcb;pri-node-pid=i;pri-brother=NULL;pri-next=NULL;pri-sub=NULL;void main()short cflag,pflag;char cmdstr32;char *s,*s1,*s2;initerror();init();for(;)cflag=0;pflag=0;printf(cmd:);scanf(%s,cmdstr);if(!strcmp(cmdstr,exit) /exit the programbreak;if(!strcmp(cmdstr,showdetail)cflag = 1;pflag = 1;

9、showdetail();elses = strstr(cmdstr,down); /create processif(s)cflag=1;/getparameters1 = substr(s,instr(s,()+1,instr(s,)-1);s2 = substr(s,instr(s,)+1,instr(s,)-1);if(s1 & s2)down(s1,atoi(s2);pflag=1;elses=strstr(cmdstr,up);/delete processif(s)cflag=1;s1 = substr(s,instr(s,()+1,instr(s,)-1);if(s1)up(s

10、1);pflag=1;if(!cflag)geterror(0);else if(!pflag)geterror(1);/*/五、测试要求1) 至少进行 10 次以上的 wait 和 signal 操作;2) 要求 wait 操作出现进程等待队列;3) 对有等待队列的信号量进行 signal 操作。六、实验指导实验中提供了 5 个信号量( s0-s4)和 20 个进程( pid 0-19 )。在程序运行过程中可以键入 down up 命令和 showdetail 命令显示每个信号量的状态。具体输入解释如下:1)dwon 获取信号量操作( P 操作)。参数: 1 sname 2 pid 。示例:

11、 down(s1,2) 。进程号为 2 的进程申请名字为 s1 的信号量。2)up 释放信号量操作( V 操作)。参数 1 sname。示例: up(s1)。释放信号量名字为 s1 的信号量。3)showdetail 显示各信号量状态及其等待队列。4)exit 退出命令行 。七、实验过程这是为每个进程申请的信号量的状态0 号信号量拥有进程0,1,2,3;1 号信号量拥有进程 4,5,6,7; 2 号信号量拥有进程8,9,10,11;3 号信号量拥有进程12,13,14,15; 4 号信号量拥有进程 16,17,18,19.这是删除 s0 信号量中的 0 号进程,此时进程 1 占用该信号量这是删

12、除 s1 信号量中的 4 号进程,此时进程 5 占用该信号量这是删除 s2 信号量中的 8 号进程,此时 9 号进程占用该信号量这是删除 s3 信号量的两个进程这是为 0 进程申请了 s0 号信号量,然后又释放了 s0 信号量中的 3 号进程这是先释放 0 号, 4 号进程,然后为 0 号进程申请 s0 号信号量这是先释放进程号为 0 和 1 的进程,然后再为 1 号进程申请 s1 信号量这是为进程号为 1,2,3, 4 的进程先申请 s0 信号量,然后再释放进程,直至全部释放完毕这是先为进程号为 1,2, 3, 4 的进程申请信号量,然后释放 1 进程,再为 1 号进程申请信号量先释放资源成

13、功了,然后为 0 号进程申请信号量,再释放 0 号进程八、实验思考1)读懂 down 和 up 操函数,并画出这两个函数的流程。答:函数分析如上述代码,并加以注释down函数流程图开始Sname , pidN是否存在输入的信号量Y是否存在输入的进程号NYCount -Count =0YY等待队列N是否为空信号量不存在 添加到队列的最后 置于等待队列队首 进程不存在up函数流程图开始SnameN是否存在输入的信号量YCount +是否有进程处于等待队列Y等待队列依次获得资源 显示所输入信号浪不存在2)如何修改 down 操作,使之能一次申请多个信号量?答:假设可一次获取三个信号量down(s1,

14、s2,s3,1)s1 = substr(s,instr(s,()+1,instr(s, ,)-1);s1s = substr(s,instr(s,)+1,instr(s, );s2 = substr(s1s,0,instr(s1s,)-1);s2s = substr(s1s,instr(s1s,)+1,instr(s1s, );s3 = substr(s2s,0,instr(s2s,)-1);s3s = substr(s2s,instr(s2s,)+1,instr(s2s, );s4 = substr(s3s,0,instr(s3s,)-1);if(s1 & s2 & s3 & s4)down(s1,atoi(s4);down(s2,atoi(s4);down(s3,atoi(s4);pflag = 1;3)在某个时刻,一个进程最多可以等待多少个信号量?答:一个进程最多可以等待的信号量数目不限。九、实验总结这次实验主要是为进程申请资源信号量, 然后在等待链表中排队, 等待进程调用。 down()函数和 up()函数分别对应于教材上的 wait() 函数与 signal() 函数,分别为申请资源与释放资源。在运行的过程中, 也出现了一些问题, 比如说, 如下图所示的问题, 会出现进程卡死的问题,现在我还不是很清楚问题的原因究竟是什么。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2