当前位置:首页 > 模拟PV操作同步机构,且用PV操作解决生产者 - 消费者问题
实验四:同步机构实验报告
学 院:
专业班级: 姓 名:
学 号:
一、实验内容:
模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。
二、实验目的:
进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。
我们把若干个进程都能进行访问和修改的那些变量称为公共变量。由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。一般说,同步机构是由若干条原语——同步原语——所组成。本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。
三、实验题目:
模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。
四、此次用到的数据结构知识如下:
typedef struct Pcb{
char name[10]; //进程名 char state[10]; //运行状态 char reason[10]; //若阻塞,其原因 int breakp; //断点保护 struct Pcb *next; //阻塞时的顺序
进程名 状态 等待原因 断点 后继进程 }Pcb,*link;
进程控制块结构
定义两个进程: link p1;//生产者进程,link c1;//消费者进程。pc程序计数器和 link ready; 就绪队列,link b_s1; s1阻塞队列,link b_s2; s2阻塞队列。
五、实验源代码:
分为四个头文件。 1、a.h头文件代码如下: #include
#include
#include
#include
#define BUF 10 //缓存的大小
#define MAX 20 //最大可以输入的字符 2、b.h头文件代码如下: //数据结构的定义和全局变量 typedef struct Pcb{
char name[10]; //进程名 char state[10]; //运行状态 char reason[10]; //若阻塞,其原因 int breakp; //断点保护
struct Pcb *next; //阻塞时的顺序
}Pcb,*link;
int s1,s2; //信号量 link p1;//生产者进程 link c1;//消费者进程
char str[MAX]; //输入的字符串 char buffer[BUF]; //缓冲池 int len; //输入长度 int sp=0; //string的指针 int in=0; //生产者指针 int out=0; //消费者指针 char temp; //供打印的临时产品 char rec_p[MAX];//生产记录 int rp1=0;//生产记录指针 char rec_c[MAX];//消费记录 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(); //打印函数
void init(){ //初始化 }
void p(int s){
ready=p1;
ready->next=c1;//初始化为生产进程在前,消费进程在后 c1->next=NULL; b_s1=NULL;
b_s2=NULL;//阻塞进程为NULL pc=0;
con_cnt=0; //消费计数器
c1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为消费者 strcpy(c1->name,\strcpy(c1->state,\strcpy(c1->reason,\c1->breakp=0; c1->next=NULL; s1=BUF; s2=0;
p1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为生产者 strcpy(p1->name,\strcpy(p1->state,\strcpy(p1->reason,\p1->breakp=0; p1->next=NULL;
共分享92篇相关文档