操作系统实验二模拟生产者和消费者问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 prod_wait;//生产者等待队列(保存的是生产的数据)int consu_waite_size;//消费者等待队列,只记录消费者等待数目}; pipetype pipetb;

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;

}

}

四、运行结果:

相关文档
最新文档