版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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.h" semphore sem5; /deinfe 5 semphorespnode * pr20; /define 0-19 total 20 process/down operation void down(char * sname,i
3、nt pid) int fflag,pflag; pnode *p,*p1; semphore *s; fflag=0; pflag=0; for(int i=0;i<5;i+) if(!strcmp(,sname)/find semaphore by name根据名字找到信号量 s=; /将找到的信号量存入s fflag=1; /设置信号量标志位fflag为1,表示找到了信号量 break; for(i=0;i<20;i+) /find pcb by pid根据pid找到pcb进程 if(pri->node->pid = pid)
4、p1 = pri; /存入p1 pflag=1; /设置进程标志位pflag为1,表示找到了pcb break; if(!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); /输出没有该pc
5、b进程 return; s->count-; /semaphore! s value -1被该pcb进程占用的资源信号量减1 if(s->count>=0) /this pcb get the semaphore如果当前资源信号量没有被用完 s->curpid = p1->node->pid; /当前pcb进程就占用该信号量 else if(s->wlist) /the link is not NULL, add the pcb to the last如果等待链表不为空,就去/找等待链表的尾部插入;若当前pcb进程所占用的信号量没有了,就将该进程放到该
6、进程/链表的尾部去等待 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若等待链表为空,则该pcb进/程是一个等待的pcb进程,直接插入 s->wlist=p1; /up operation void up(char *sname) /释放资源信号量 int fflag=0; for(int i=0;i<5;i+) if(!strcmp(,sname) /find the semap
7、hore by name由名字找到要释放的资源信号量 fflag=1; /将资源信号量标志设为1 break; if(fflag) /find it 如果找到 semi.count+; /该资源信号量加1表示释放 if(semi.wlist) /there are processes in the down list若等待链表中有请求该资源信号/量的pcb进程 semi.curpid = semi.wlist->node->pid;/信号量被在等待链表中的第一个pcb/进程占用semi.wlist = semi.wlist->next; /等待链表指向下一个等待的pcb进程
8、else printf("the semphore '%s' is not exist!n",sname);/若找不到该信号量就输出 /show semphore infomation void showdetail() int i; pnode *p; printf("n"); for(i=0;i<5;i+) if(semi.count<=0) printf("%s (current_process %d): ",,semi.curpid); p=semi.wlist; while(p)
9、 printf("%5d",p->node->pid); p=p->next; else printf("%s : ",); printf("n"); /*/ void init() /init semaphore strcat(,"s0"); strcat(,"s1"); strcat(,"s2"); strcat(,"s3"); strcat(s
10、,"s4"); for(int i=0;i<5;i+) semi.wlist=NULL; semi.count=1; /init process for(i=0;i<20;i+) pri = new pnode; pri->node=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; i
11、niterror(); init(); for(;) cflag=0; pflag=0; printf("cmd:"); scanf("%s",cmdstr); if(!strcmp(cmdstr,"exit") /exit the program break; if(!strcmp(cmdstr,"showdetail") cflag = 1; pflag = 1; showdetail(); else s = strstr(cmdstr,"down"); /create process if
12、(s) cflag=1; /getparameter s1 = 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; else s=strstr(cmdstr,"up");/delete process if(s) cflag=1; s1 = substr(s,instr(s,'('
13、)+1,instr(s,')')-1); if(s1) up(s1); 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 命令显示每个信号量的状态。具体输入解释如下:
14、 1) dwon 获取信号量操作(P 操作)。 参数: 1 sname 2 pid 。 示例: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,1
15、8,19.这是删除s0信号量中的0号进程,此时进程1占用该信号量这是删除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号进程申请信号量先释放资源成功了,然后为0号进程申请信号量,
16、再释放0号进程八、实验思考1) 读懂down和up操函数,并画出这两个函数的流程。 答:函数分析如上述代码,并加以注释2)如何修改 down 操作,使之能一次申请多个信号量? 答:假设可一次获取三个信号量 down(s1,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,a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030智慧物业管理行业市场前景供需分析及投资评估规划研究报告
- 漳州市人民医院运动医学急诊处理考核
- 2025-2030智慧消防行业技术应用现状分析及智能化发展趋势研究报告书
- 2025-2030智慧消防系统应用研究及投资方向分析
- 2025-2030智慧法律行业市场分析技术发展投资前景研究
- 苏州市中医院特殊血型抗原抗体检测技术操作考核
- 2025-2030智慧校园管理系统技术应用教育改革发展方向分析评估报告
- 吉安市人民医院移植免疫监测与干预考核
- 九江市人民医院超声报告书写规范考核
- 宁德市中医院内瘘穿刺技术专项考核
- 2025至2030中国直链烷基苯行业投资风险及供需态势趋势预测报告
- 固碳增汇策略-洞察及研究
- 企业科研成果管理制度
- 余料使用管理制度
- 解三角形中四边形周长(边长)和面积问题(中上难度)
- CJ/T 486-2015土壤固化外加剂
- 回收电池仓库管理制度
- T/JSSL 0005-2022取用水管理技术规范
- 血透病人干体重管理
- 2025年机器视觉应用试题及答案
- 2025至2030中国工业蒸汽行业运营趋势及未来前景研究报告
评论
0/150
提交评论