资源说明:这个是很经典的问题
实验题目: 生产者与消费者(综合性实验)
实验环境: C语言编译器
实验内容:
① 由用户指定要产生的进程及其类别,存入进入就绪队列。
② 调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源被阻塞则进入相应的等待队列,调度程序调度就绪队列中的下一个进程。进程运行结束时,会检查对应的等待队列,激活队列中的进程进入就绪队列。运行结束的进程进入over链表。重复这一过程直至就绪队列为空。
③ 程序询问是否要继续?如果要转直①开始执行,否则退出程序。
实验目的:
通过实验模拟生产者与消费者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。
实验要求:
每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程类型标号、进程系统号、进程状态、进程产品(字符)、进程链指针等等。
系统开辟了一个缓冲区,大小由buffersize指定。
程序中有三个链队列,一个链表。一个就绪队列(ready),两个等待队列:生产者等待队列(producer);消费者队列(consumer)。一个链表(over),用于收集已经运行结束的进程
本程序通过函数模拟信号量的操作。
参考书目:
1)徐甲同等编,计算机操作系统教程,西安电子科技大学出版社
2)Andrew S. Tanenbaum著,陈向群,马红兵译. 现代操作系统(第2版). 机械工业出版社
3)Abranham Silberschatz, Peter Baer Galvin, Greg Gagne著. 郑扣根译. 操作系统概念(第2版). 高等教育出版社
4)张尧学编著. 计算机操作系统教程(第2版)习题解答与实验指导. 清华大学出版社
实验报告要求:
(1) 每位同学交一份电子版本的实验报告,上传到202.204.125.21服务器中。
(2) 文件名格式为班级、学号加上个人姓名,例如:
电子04-1-040824101**.doc
表示电子04-1班学号为040824101号的**同学的实验报告。
(3) 实验报告内容的开始处要列出实验的目的,实验环境、实验内容等的说明,报告中要附上程序代码,并对实验过程进行说明。
基本数据结构:
PCB* readyhead=NULL, * readytail=NULL; // 就绪队列
PCB* consumerhead=NULL, * consumertail=NULL; // 消费者队列
PCB* producerhead=NULL, * producertail=NULL; // 生产者队列
over=(PCB*)malloc(sizeof(PCB)); // over链表
int productnum=0; //产品数量
int full=0, empty=buffersize; // semaphore
char buffer[buffersize]; // 缓冲区
int bufferpoint=0; // 缓冲区指针
struct pcb { /* 定义进程控制块PCB */
int flag; // flag=1 denote producer; flag=2 denote consumer;
int numlabel;
char product;
char state;
struct pcb * processlink;
……
};
processproc( )--- 给PCB分配内存。产生相应的的进程:输入1为生产者进程;输入2为消费者进程,并把这些进程放入就绪队列中。
waitempty( )--- 如果缓冲区满,该进程进入生产者等待队列;linkqueue(exe,&producertail); // 把就绪队列里的进程放入生产者队列的尾部
void signalempty()
bool waitfull()
void signalfull()
void producerrun()
void comsuerrun()
void main()
{ processproc();
element=hasElement(readyhead);
while(element){
exe=getq(readyhead,&readytail);
printf("进程%d申请运行,它是一个",exe->numlabel);
exe->flag==1? printf("生产者\n"):printf("消费者\n");
if(exe->flag==1)
producerrun();
else
comsuerrun();
element=hasElement(readyhead);
}
printf("就绪队列没有进程\n");
if(hasElement(consumerhead))
{ printf("消费者等待队列中有进程:\n");
display(consumerhead);
}
else {
printf("消费者等待队列中没有进程\n");
}
if(hasElement(producerhead))
{ printf("生产者等待队列中有进程:\n");
display(producerhead);
}
else {
printf("生产者等待队列中没有进程\n");
}
}
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。