山大操作系统实验5
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进程同步实验
张咪
软件四班一、实验目的
总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?根据实验程序、调试过程和结果分析写出实验报告。
二、实验要求
理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。
三、实验环境
实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路
约束:
1.设置一个count变量来对顾客进行计数,该变量将被多个顾客进程互斥地访问并修改,通过一个互斥信号量mutext来实现。
count>20时,就不进入理发店。
7 3 count<3时,count++,顾客坐在椅子上等待理发。 2.只有在理发椅空闲时,顾客才能做到理发椅上等待理发师理发,否则顾客便必须等待;只有当理发椅上有顾客时,理发师才可以开始理发,否则他也必须等待。可通过信号量empty 和full来控制。 3.理发师为顾客理发时,顾客必须等待理发的完成,并在理发完成后理发师唤醒他,使用一个信号量finish来控制; 4.顾客理完发后必须向理发师付费,并等理发师收费后顾客才能离开;而理发师则需等待顾客付费,并在收费后唤醒顾客以允许他离开,这可分别通过两个信号量payment和receipt 来控制。 初值:计数int count=0 信号量empty=3;full=0;room=13;sofa=4;finish=0;pay=0;receipt=0; mutex=1; 理发师进程 while(1) { wait(full); //等待理发椅上有顾客 剪头发 signal(finish); //通知顾客理发完成 wait(pay); //等待顾客付费 wait(mutex);//在任一时刻只能记录一个顾客的付款 收费 signal(mutex); signal(receipt); //通知顾客收费完毕 } 顾客进程 wait(mutex); //count既用于判断,也要修改,所以为临界资源,用mutex管理互斥if(count>20) {//顾客大于20人 signal(mutex); 离开理发店 } else{//顾客小于20人 count=count+1;//进入理发店 if(count>7) { //count>7,说明理发椅和沙发上都有人,需要到等待室等待signal(mutex); wait(room);//申请进入等待室 在等待室等 wait(sofa); //申请沙发 signal(room);//释放等待室 坐在沙发上等 wait(empty);//等待理发椅为空 申请到理发椅 signal(sofa); //释放沙发 } else if(count>3){//说明理发椅上都有人,需要坐到沙发上等待 signal(mutex); wait(sofa);//申请沙发 坐在沙发上等 wait(empty);//等待理发椅为空 申请到理发椅 signal(sofa);//释放沙发 } else{//count<3,可以坐到理发椅上等待 signal(mutex); wait(empty); //申请理发椅 } 坐在理发椅上等待理发 signal(full); //通知理发师开始理发 理发 wait(finish); //等待理发完毕 付款 signal(payment); //通知理发师已付款 wait(receipt); //等待理发师收款 理发师收费完成,顾客离开理发椅 signal(empty); //释放理发椅 wait(mutex); //对count 临界资源操作,用mutex完成互斥count=count-1; //离开理发店 signal(mutex); } 七、调试及实验结果 1、创建makefile文件 hdrs = ipc.h opts = -g -c c_src = cons.c ipc.c c_obj = cons.o ipc.o p_src = bar.c ipc.c p_obj = bar.o ipc.o all: producer consumer consumer: $(c_obj) gcc $(c_obj) -o consumer cons.o: $(c_src) $(hdrs) gcc $(opts) $(c_src) producer: $(p_obj) gcc $(p_obj) -o producer bar.o: $(p_src) $(hdrs) gcc $(opts) $(p_src) clean: rm cons bar *.o 2.执行make命令,结果出现了许多由于粗心造成的编译错误