1 / 17
文档名称:

实验四:同步机构实验报告.docx

格式:docx   大小:49KB   页数:17页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

实验四:同步机构实验报告.docx

上传人:pppccc8 2020/9/24 文件大小:49 KB

下载得到文件列表

实验四:同步机构实验报告.docx

相关文档

文档介绍

文档介绍:实验四:同步机构实验报告院级名号学部姓学一、 实验内容:模拟实现用同步机构避免发生进程执行吋可能出现的与吋间有关的错误。二、 实验目的:进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统屮的多个进程轮流地占用处理器运行。我们把若干个进程都能进行访问和修改的那些变量称为公共变量。由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与吋间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。为了防止这类错误,系统必须耍用同步机构来控制进程对公共变量的访问。一般说,同步机构是由若干条原语——同步原语——所组成。本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行吋同步机构的作用。三、 实验题目:模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。四、 此次用到的数据结构知识如下:typedefstructPcb{charname[10];〃进程名charstate[10]; 〃运行状态charreason[10]; 〃若阻塞,其原因intbreakp; 〃断点保护}Pcb,*link;structPcb*next;〃阻塞吋的顺序进程名耳犬态等待原因断点后继进程进程控制块结构定义两个进程:linkpl;//生产者进程,linkcl;//消费者进程。pc程序计数器和linkready;就绪队列,linkb_sl;s1阻塞队列,linkb_s2;s2阻塞队列。五、实验源代码:分为四个头文件。1、 8・h头文件代码如下:#include<>#include<ctype・h>#include<>/*maHoc()等*/#include<>/*INTJIAX等*/#include<>/*EOF=Z或F6),NULL*/#include<>/*atoi()*/#include<>/*eof()*/#include<>/*floor(),ceil(),abs()*/#include<>/*exit()*/★include<iostream>usingnamespacestd;★include<>^defineBUF10//缓存的大小#defineMAX20//最大可以输入的字符2、 ://数据结构的定义和全局变量typedefstruetPcb{charname[10]; //进程名charstate[10]; //运行状态intbreakp;charreason[10]; //若阻塞,其原因//断点保护structPcb^next; //阻塞时的顺序}Pcb,*1ink;intsl,s2;//信号量linkpl;//生产者进程linkcl;//消费者进程charstr[MAX];//输入的字符串charbuffer[BUF];//缓冲池intlen;//输入长度intsp=O;//string的指针intin=O;//生产者指针intout=0;//消费者指针chartemp;//供打印的临时产品charrecpLMAX];//生产记录intrpl=O;//生产记录指针charrec_c[MAX];//消费记录intrp2=0;//消费记录指针linkready;//就绪队列linkb_sl;//si阻塞队列linkb_s2;//s2阻塞队列intpc;//程序计数器intcount;//t;//:voidinit(); //初始化voidp(ints); //P操作voidv(ints); //V操作voidblock(ints);//阻塞函数voidwakeup(ints);//唤醒函数voidcontrol(); //处理机调度voidprocessor();//处理机执行voidprint(); //打印函数voidinit(){//初始化sl=BUF;s2=0;pl=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为生产者strcpy(pl->name,"Producer");strcpy(pl->state,"Ready");strcpy(pl->reason,"Null");pl->breakp=:O;pl-〉next二NULL;c1=(1ink)malloc(sizeof(Pcb));//建立新的结点,并初始化为消费者strcpy(cl->name,"Consumer");strcpy(cl->state,"Ready");strcpy(cl->reason,"Null");cl->breakp=:O;cl->next=NULL;ready二