操作系统实验二模拟生产者和消费者问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二生产者和消费者问题模拟
一、实验目的:
调试、修改、运行模拟程序,通过形象化的状态显示,使学生理解进程的概念,了解同步和通信的过程,掌握进程通信和同步的机制,特别是利用缓冲区进行同步和通信的过程。通过补充新功能,使学生能灵活运用相关知识,培养创新能力。
二、实验内容及要求:
(1)、调试、运行给出的程序,从操作系统原理的角度验证程序的正确性;
(2)、发现并修改程序中的原理性错误或不完善的地方;
(3)、鼓励在程序中增加新的功能。完成基本功能的,得基本分;添加新功能的加分;
(4)、在程序中适当地加入注释;
(5)、认真进行预习,阅读原程序,发现其中的原理性错误,完成预习报告;
(6)、实验完成后,要认真总结,完成实验报告。
三、实现:
数据结构
struct pcb {//pcb
char *name;
int status;
int time;/* times of execution */
};
struct pipetype {//记录缓冲区状况的表
int num_data;//缓冲区数据数目
int producer_ptr;//写指针
int consumer_ptr;//读指针
deque
int pipe[PIPESIZE];//缓冲区
生产者进程
P(empty);
P(mutex);
产品送往缓冲区;
V(mutex);
V(full);
具体实现——
void runp(int output,pcb &p,int *pipe,pipetype &pipetb) { /* run producer */
p.status=RUN;
printf("run PRODUCER. product %d.\t",output);
if(pipetb.num_data==PIPESIZE) { //相当于P(empty);
pipetb.prod_wait.push_back(output);
printf("The buffer is full. The 生产者进程is 阻塞. Now there is %d producers blocked.\n",pipetb.prod_wait.size());
}
else { //如果P通过,把数据放到缓冲区里
pipe[pipetb.producer_ptr]=output;
pipetb.num_data++;
//pipetb->producer_ptr++;
pipetb.producer_ptr=(pipetb.producer_ptr+1)%PIPESIZE;
p.status=FINISH;
printf("The 生产者进程is 结束.\n");
p.time++;
}
if(pipetb.consu_waite_size) { //相当于V(full);唤醒消费者进程pipetb.consu_waite_size--;
printf("A 消费者进程is 被唤醒and 运行. Consuming: %d. Now there is %d consumers blocked.\n",output,pipetb.consu_waite_size);
pipe[pipetb.consumer_ptr]=-1;
pipetb.consumer_ptr=(pipetb.consumer_ptr+1)%PIPESIZE;
pipetb.num_data--;
}
}
消费者进程
P(full);
P(mutex);
从缓冲区中取出产品;
V(mutex);
V(empty);
具体实现——
void runc(pcb &p,int *pipe,pipetype &pipetb) { /* run consumer */ int c;
p.status = RUN;
printf("run CONSUMER.\t");
if(pipetb.num_data==0) { //相当于P(full);
pipetb.consu_waite_size++;
printf("The buffer is empty. The 消费者进程is 阻塞. Now there is %d consumcers blocked.\n",pipetb.consu_waite_size);
}
else { //如果P通过,从缓冲区拿一个数据,顺序为从前向后循环
c = pipe[pipetb.consumer_ptr];
pipe[pipetb.consumer_ptr]=-1;
//pipetb->consumer_ptr++;
pipetb.consumer_ptr=(pipetb.consumer_ptr+1)%PIPESIZE;
pipetb.num_data--;
p.status=FINISH;
printf("Use %d. The 消费者进程is 结束.\n",c);
p.time++;
}
if(pipetb.prod_wait.size()) { //相当于V(empty);唤醒生产者进程
pipe[pipetb.producer_ptr]=pipetb.prod_wait.front();
pipetb.num_data++;
pipetb.prod_wait.pop_front();
printf("A 生产者进程is 被唤醒and 运行. Now there is %d producers blocked.\n",pipetb.prod_wait.size());
pipetb.producer_ptr=(pipetb.producer_ptr+1)%PIPESIZE;
}
}
四、运行结果: