




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验四:同步机构实验报告学 院: 专业班级: 姓 名: 学 号:一、实验内容:模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。二、实验目的:进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。我们把若干个进程都能进行访问和修改的那些变量称为公共变量。由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。一般说,同步机构是由若干条原语同步原语所组成。本实验要求学生模拟PV操作同步
2、机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。三、实验题目:模拟PV操作同步机构,且用PV操作解决生产者消费者问题。四、此次用到的数据结构知识如下: typedef struct Pcb char name10; /进程名char state10; /运行状态char reason10; /若阻塞,其原因int breakp; /断点保护struct Pcb *next; /阻塞时的顺序进程名状态等待原因断点后继进程 Pcb,*link; 进程控制块结构 定义两个进程: link p1;/生产者进程,link c1;/消费者进程。pc程序计数器和link ready; 就绪
3、队列,link b_s1; s1阻塞队列,link b_s2; s2阻塞队列。五、实验源代码:分为四个头文件。1、a.h头文件代码如下:#include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<stdio.h> /* EOF(=Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include<io.h&g
4、t; /* eof() */ #include<math.h> /* floor(),ceil(),abs() */ #include<process.h> /* exit() */ #include <iostream> using namespace std; #include <time.h> #define BUF 10 /缓存的大小 #define MAX 20 /最大可以输入的字符2、b.h头文件代码如下:/数据结构的定义和全局变量typedef struct Pcb char name10; /进程名char state10; /运
5、行状态char reason10; /若阻塞,其原因int breakp; /断点保护struct Pcb *next; /阻塞时的顺序Pcb,*link;int s1,s2; /信号量link p1;/生产者进程link c1;/消费者进程char strMAX; /输入的字符串char bufferBUF; /缓冲池int len; /输入长度int sp=0; /string的指针int in=0; /生产者指针int out=0; /消费者指针char temp; /供打印的临时产品char rec_pMAX;/生产记录int rp1=0;/生产记录指针char rec_cMAX;/消
6、费记录int rp2=0;/消费记录指针link ready; /就绪队列link b_s1; /s1阻塞队列link b_s2; /s2阻塞队列int pc; /程序计数器int count; /字符计数器int con_cnt; /消费计数器3、c.h头文件代码如下:void init(); /初始化void p(int s); /P操作void v(int s); /V操作void block(int s);/阻塞函数void wakeup(int s);/唤醒函数void control(); /处理机调度void processor();/处理机执行void print(); /打印
7、函数void init() /初始化s1=BUF;s2=0;p1=(link)malloc(sizeof(Pcb);/建立新的结点,并初始化为生产者strcpy(p1->name,"Producer");strcpy(p1->state,"Ready");strcpy(p1->reason,"Null");p1->breakp=0;p1->next=NULL;c1=(link)malloc(sizeof(Pcb);/建立新的结点,并初始化为消费者strcpy(c1->name,"Consu
8、mer");strcpy(c1->state,"Ready");strcpy(c1->reason,"Null");c1->breakp=0;c1->next=NULL;ready=p1;ready->next=c1;/初始化为生产进程在前,消费进程在后c1->next=NULL;b_s1=NULL;b_s2=NULL;/阻塞进程为NULLpc=0;con_cnt=0; /消费计数器void p(int s)if(s=1) /p(s1)s1-;if(s1<0) block(1); /阻塞当前生产进程el
9、seprintf("t* s1信号申请成功!n");ready->breakp=pc; /保存断点else /p(s2)s2-;if(s2<0) block(2);/阻塞当前消费进程elseprintf("t* s2信号申请成功!n");ready->breakp=pc; /保存断点void v(int s)if(s=1) /v(s1)s1+;if(s1<=0)wakeup(1); /唤醒生产进程ready->breakp=pc; /保存断点else /v(s2)s2+;if(s2<=0) wakeup(2);/唤醒消
10、费进程ready->breakp=pc; /保存断点void block(int s)/阻塞函数的定义link p;int num1=0;int num2=0;if(s=1)/生产进程strcpy(p1->state,"Block");/改变状态strcpy(p1->reason,"S1");/说明原因p=b_s1;while(p)num1+;p=p->next;/p的值为NULL,表示队尾if(!b_s1)b_s1=p1;elsep=p1;p1->next=NULL;printf("t* p1生产进程阻塞了!n&
11、quot;);ready->breakp=pc; /保存断点ready=ready->next;/在就绪队列中去掉,指向下一个num1+;else/消费进程strcpy(c1->state,"Block");strcpy(c1->reason,"S2");p=b_s2;while(p)num2+;p=p->next;/p的值为NULL,表示队尾if(!b_s2)b_s2=c1;elsep=c1;ready->breakp=pc; /保存断点ready=ready->next;/在就绪队列中去掉,指向下一个c1-&
12、gt;next=NULL;printf("t* c1消费进程阻塞了!n");num2+;printf("t* 阻塞的生产进程个数为:%dn",num1);printf("t* 阻塞的消费进程个数为:%dn",num2);void wakeup(int s)/唤醒函数的定义link p;link q=ready;if(s=1) /唤醒b_s1队首进程,生产进程队列p=b_s1;b_s1=b_s1->next;/阻塞指针指向下一个阻塞进程strcpy(p->state,"Ready");strcpy(p-&
13、gt;reason,"Null");while(q)/插入就绪队列q=q->next;q=p;p->next=NULL;printf("t* p1生产进程唤醒了!n");else /唤醒b_s2队首进程,消费进程队列p=b_s2;b_s2=b_s2->next;/阻塞指针指向下一个阻塞进程strcpy(p->state,"Ready");strcpy(p->reason,"Null");while(q->next)/插入就绪队列q=q->next;q->next=p;
14、p->next=NULL;printf("t* c1消费进程唤醒了!n");void control() /处理器调度程序int rd;int num=0;link p=ready; if(ready=NULL) /若无就绪进程,结束return;while(p) /统计就绪进程个数num+;p=p->next;/最终p变为NULLprintf("t* 就绪进程个数为:%dn",num);time_t t; srand(unsigned) time(&t);rd=rand()%num;/随机函数产生随机数if(rd=1)p=ready
15、;ready=ready->next;ready->next=p;p->next=NULL;strcpy(ready->state,"Run");strcpy(ready->next->state,"Ready");else strcpy(ready->state,"Run");pc=ready->breakp;void processor() /模拟处理器指令执行if(strcmp(ready->name,"Producer")=0) /当前进程为生产者swi
16、tch(pc) case 0:/produceprintf("t* 生产者生产了字符%cn",strsp);rec_prp1=strsp;/添加到生产记录 sp=(sp+1)%len;pc+;ready->breakp=pc; /保存断点break;case 1: /p(s1)pc+;p(1);break;case 2: /putbufferin=rec_prp1; /放到缓冲区printf("t* %c字符成功入驻空缓存!n",bufferin);rp1+; in=(in+1)%BUF;pc+;ready->breakp=pc; /保存断点
17、break;case 3: /v(s2)pc+;printf("t* 释放一个s2信号n");v(2);break;case 4:/goto01 printf("t* 生产进程goto 0 操作n");pc=0;count-; /剩余字符个数减1printf("t* 剩余字符count=%d个n",count);ready->breakp=pc; /保存断点if(count<=0) /生产结束printf("t* 生产者结束生产!n");strcpy(p1->state,"Stop&qu
18、ot;);strcpy(p1->reason,"Null");ready->breakp=-1;ready=ready->next;/在就绪队列中去掉 else /当前进程为消费者switch(pc)case 0: /p(s2)pc+;p(2); break;case 1: /getprintf("t* 消费者取字符!n");temp=bufferout;out=(out+1)%BUF;pc+;ready->breakp=pc; /保存断点break;case 2: /v(s1)pc+;printf("t* 释放一个s1
19、n");v(1);break;case 3: /consumeprintf("t* 消费了字符%cn",temp);rec_crp2=temp;/添加到消费记录rp2+;con_cnt+;if(con_cnt>=len)strcpy(c1->state,"Stop");/完成态c1->breakp=-1;return;pc+;ready->breakp=pc; /保存断点break;case 4: /goto0printf("t* 消费进程goto 0 操作n");pc=0;ready->bre
20、akp=pc; /保存断点void print()int i,j;printf("生产者消费者模拟n");printf("* 模拟过程的字符串为:t");printf("%sn",&str);printf("* 已生产:");for(j=0;j<=rp1;j+)printf("%c",rec_pj);printf("n* 空缓存:");for(j=rp2;j<=rp1;j+)printf("%c",bufferj);printf("n* 已消费:");for(j=0;j<=rp2;j+)printf("%c",rec_cj);printf("n进程控制块的信息n");printf("进程名tt状态t等待原因t断点n");printf("%st%st%stt%dnn",p1->name,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 杭州电子科技大学《建筑与家居木制品》2023-2024学年第二学期期末试卷
- 济南幼儿师范高等专科学校《学前儿童家庭教育与社区教育》2023-2024学年第二学期期末试卷
- 湖南工业职业技术学院《Python实训》2023-2024学年第二学期期末试卷
- 贵州师范学院《社会设计》2023-2024学年第二学期期末试卷
- 重庆医药高等专科学校《软件工程综合设计》2023-2024学年第二学期期末试卷
- 2024年电脑刺绣机项目资金申请报告代可行性研究报告
- 儿童系列玩具包装设计
- 环境艺术设计专业毕业设计
- 2025年新疆伊犁农四师国有资产投资有限责任公司招聘笔试参考题库含答案解析
- 2025年贵州中国城投建设集团第四工程局有限公司招聘笔试参考题库含答案解析
- 三位数加减三位数竖式计算题200道及答案
- 农产品质量追溯系统方案
- DB1310-T 223-2020 小麦节水绿色丰产栽培技术规程
- 215kWh工商业液冷储能电池一体柜用户手册
- 教育学研究答辩模板
- 《钢铁是怎样炼成的》读书分享课件
- 2024-2030年中国耐火材料行业供需分析及发展前景研究报告
- 中小学(幼儿园)公共安全教育教师说课比赛评分细则
- 2024【小学组】汉字听写大会竞赛考试题库(含答案)
- 艺术概论智慧树知到答案2024年宁波财经学院
- 部门级安全培训考试题附答案【考试直接用】
评论
0/150
提交评论