下载 > 资源分类 >  课程资源 >  C/C++ > 生产者与消费者 进程调度模拟(c++)

生产者与消费者 进程调度模拟(c++)

这个是很经典的问题
实验题目: 生产者与消费者(综合性实验) 
实验环境: 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");
}
}
...展开收缩
综合评分:3.9(14位用户评分)
直接下载 开通VIP会员 免积分下载

评论共有3条

name
jeremyhuang812014-05-27 09:53:25
做得友好一点就好了
name
yoday292012-12-25 15:30:04
做得友好一点就好了
name
tea_and_coffe2012-03-07 22:37:29
调度程序从就绪队列中提取一个就绪进程运行。如果申请的资源被阻塞则进入相应的等待队列

评论资源

您不能发表评论,可能是以下原因:

登录后才能评论

待评论资源
 

热门专辑

关闭
img

spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip

CSDN VIP年卡 4000万程序员的必选现在开通,立省522元
下载
img

生产者与消费者 进程调度模拟(c++)

会员到期时间: 剩余下载个数: 剩余C币:0 剩余积分:
VIP下载

积分不足!

资源所需积分 当前拥有积分
您可以选择
开通VIP年卡
4000万
程序员的必选
600万
绿色安全资源
现在开通
立省522元
或者
购买C币兑换积分 C币抽奖
img
资源所需积分 当前拥有积分 当前拥有C币
5 4 45
(仅够下载10个资源)
VIP年卡
全站1200个资源免积分下载
下载
img
资源所需积分 当前拥有积分 当前拥有C币
5 0 0
VIP年卡
全站1200个资源免积分下载
C币充值开通VIP年卡
img
资源所需积分 当前拥有积分 当前拥有C币
5 4 45
您的积分不足,将扣除 10 C币
VIP年卡
全站1200个资源免积分下载
下载
下载

兑换成功

你当前的下载分为234开始下载资源
你还不是VIP会员
开通VIP会员权限,免积分下载
立即开通

你下载资源过于频繁,请输入验证码

你下载资源过于频繁,请输入验证码

您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:webmaster@csdn.net!

举报

若举报审核通过,可奖励20下载分

  • 举报人:
  • 被举报人:
  • 举报的资源分:
  • *类型:
  • *详细原因: