操作系统实验四--同步机构.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实验四--同步机构

实验四同步机构一、实验内容模拟实现用同步机构避免并发进程执行时可能出现的与时间有关的错误。二、实验目的进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。我们把如干个进程都能进行访问和修改地那些变量成为公共变量。由于进程是并发执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后,所得到的结果与访问公共变量的时间有关。为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。一般说,同步机构是由若干条原语——同步原语——所组成。本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。三、实验题目模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。四、实验步骤程序中使用的数据结构及符号说明struct spcb{ char name;//进程名字 char state;//进程状态 char why;//等待原因 int dd ;//断点};typedef struct spcb pcb;pcb producter,consumer,*process,*process1;//各个进程控制块int s1,s2,i,j,in,out,pc,m;char array[10];char c,x;int pa[6],sa[6];流程图初始化程序:模拟实验的程序从初始化程序入口启动,初始化工作包括对信号量S1、S2赋初值,对生产者、消费者进程的PCB初始化。初始化后转向处理器调度程序,其流程如图1:图 1 :初始化流程处理器调度程序:在计算机系统中,进程并发执行时,任一进程占用处理器执行完一条指令后就有可能被打断而让出处理器由其他进程运行。故在模拟系统中也类似处理,每当执行一条模拟的指令后,保护当前进程的现场,让它成为非运行状态,由处理器调度程序按随机数再选择一个就绪进程占用处理器运行。处理器调度程序流程见图2:图2:处理器调度程序流程模拟处理器指令执行程序:按“指令计数器”PC之值执行指定的质量,且PC加1指向下一条指令。模拟处理器指令执行的程序流程见图3和图4:图 3:模拟处理器指令执行(1)模拟P(S) (2)模拟V(S)图 4: 模拟PV操作的执行另外,为了使得模拟程序有一个结束条件,在图3中附加了“生产者运行结束”的条件判断,模拟时可以采取人工选择的方法实现。图4给出了P(S)和V(S)模拟指令执行过程的流程。源代码#include stdio.h#include stdlib.h#include conio.h#include windows.h#define NULL 0struct spcb{ char name;//进程名字 char state;//进程状态 char why;//等待原因 int dd ;//断点};typedef struct spcb pcb;pcb producter,consumer,*process,*process1;int s1,s2,i,j,in,out,pc,m;char array[10];char c,x;int pa[6],sa[6];int p(int s) /* p操作原语 */{s=s-1;if(s0){process-state=B; /* B表示阻塞*/process-why=s;}else{process-state=W; /* W表示就绪*/}return(s);}int v(int s) /*v操作原语*/{s=s+1;if(s=0){process1-state=W;}process-state=W;return(s);}char RanChar(){char arr[10]={a,b,c,d,e,f,g,h,i,j};return arr[abs(rand()%10)];}void put(){Sleep(1000);array[in]=RanChar();in=(in+1)%10;printf( product a char is %c!\n ,array[in-1]);int k = 0; for(m=0;m10;m++){if (array[m]!= ) {printf(%c,array[m]);k = k+1;}}printf(缓冲池中有%d个产品\n,k);}void get(){Sleep(1000);x=array[out]; printf(\n%c get a char fron buffer,x);printf(\n); array[out]= ;out=(out+1)%10; int k = 0; for(m=0;m10;m

文档评论(0)

haocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档