山大操作系统实验五_第1页
山大操作系统实验五_第2页
山大操作系统实验五_第3页
山大操作系统实验五_第4页
山大操作系统实验五_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

v1.0可编辑可修改v1.0可编辑可修改PAGEPAGE8v1.0可编辑可修改PAGE山东大学软件学院操作系统实验报告实验题目:进程互斥实验实验目的:进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。观察和体验非对称性互斥问题的并发控制方法。进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。实验要求:理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识为什么会出现进程饥饿现象本实验的饥饿现象是怎样表现的怎样解决并发进程间发生的饥饿现象您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识根据实验程序、调试过程和结果分析写出实验报告。硬件环境:CPU:P4/内存:256MB硬盘:10GB软件环境:-Linux操作系统Gnome桌面'gccversionvigeditOpenOffice实验步骤:问题分析假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。算法设计说明该解法利用消息队列的每条消息代表每个顾客,将进入等候室的顾客组织到一个队列,将坐入沙发的顾客组织到另一个队列。理发师从沙发队列请出顾客,空出的沙发位置再从等候室请入顾客进入沙发队列。三个理发师进程使用相同的程序段上下文,所有顾客使用同一个程序段上下文。这样可避免产生太多进程,以便节省系统资源。intsem_p(intsemid,intindex,intipc_nowait){程间的互斥2.理发师类似读者进程,顾客类似写者进程。最后,通过不断的调试,使我熟练了在Linux环境下编程的技巧,对进程的创建与控制更加熟悉。附录A:本实验全部程序源代码及注释#ifndefCZW_IPC_H_INCLUDED#defineCZW_IPC_H_INCLUDED#include<>#include<sys/>#include<sys/>intsem_create(constchar*pathname,intproj_id,intnsems,intinit_value){key_tkeyid;intsemid,i;if((keyid=ftok(pathname,proj_id))==-1){perror("ftokerror!");return-1;}if((semid=semget(keyid,nsems,IPC_CREAT|0666))<0){perror("semgeterror!");return-1;}for(i=0;i<nsems;i++){semctl(semid,i,SETVAL,init_value);}returnsemid;}intsem_delete(constchar*pathname,intproj_id){key_tkeyid;intsemid,i;if((keyid=ftok(pathname,proj_id))==-1){perror("ftokerror!");return-1;}if((semid=semget(keyid,0,0666))<0){perror("semgeterror!");return-1;}if(semctl(semid,0,IPC_RMID)<0){perror("semdeletefail!");return-1;}return1;}intsem_set(intsemid,intindex,intvalue){if(index==-1){,10);sem_delete(".",11);msg_delete(".",31);sem_delete(".",110);exit(0);}intmain(){intwait_semid=sem_create(".",10,3,0);intwait_lock_semid=sem_create(".",11,4,0);intwait_msg=msg_create(".",31);intcash_semid=sem_create(".",110,1,1);debug&&printf("\twait_semidis%d\n",wait_semid);debug&&printf("\twait_lock_semidis%d\n",wait_lock_semid);debug&&printf("\twait_msgis%d\n",wait_msg);debug&&printf("\tcash_semidis%d\n",cash_semid);sem_set(wait_semid,0,3);sem_set(wait_semid,1,4);sem_set(wait_semid,2,13);pid_tpid[3]={0};inti;intbarber_id,barber_status,barber_consumer;structex5msgbufmsg;for(i=0;i<3;i++){if((pid[i]=fork())<0){perror("forkerror!");exit(EXIT_FAILURE);}elseif(pid[i]==0){barber_id=i+1;barber_status=0;debug&&printf("\tI'mbarber%d,mypidis%d\n",barber_id,getpid());break;}}if(pid[2]==0){while(1){if(barber_status==0){if(sem_p(wait_lock_semid,0,1)==-2){,10,0,0);intwait_lock_semid=sem_create(".",11,0,0);intwait_msg=msg_create(".",31);debug&&printf("\twait_semidis%d\n",wait_semid);debug&&printf("\twait_lock_semidis%d\n",wait_lock_semid);debug&&printf("\twait_msgis%d\n",wait_msg);debug&&printf("\twait_semid_0is%d\n",sem_show(wait_semid,0));pid_tpid=0;structex5msgbufmsg;inti;intconsumer_status;if((pid=fork())<0){perror("forkerror!");exit(EXIT_FAILURE);}elseif(pid==0){//childprocesswhile(1){sem_p(wait_lock_semid,1,0);//等待沙发上有人sem_p(wait_semid,0,0);//等待理发师有空if(msg_get(wait_msg,&msg,WAIT_ID_SOFA,0)<0){perror("messagegeterror!");exit(-1);}msg_send(wait_msg,WAIT_ID_CHAIR,,0);printf("theconsumer%d==>chair,wait%dseconds\n",,(time(NULL)-);//sofa==>chairsem_v(wait_semid,1,0);//沙发上有空位了sem_v(wait_lock_semid,0,0);//通知有人来理发了}return0;}if((pid=fork())<0){perror("forkerror!");exit(EXIT_FAILURE);}elseif(pid==0){//childprocesswhile(1){sem_p(wait_lock_semid,2,0);//等待室内有人sem_p(wait_semid,1,0);//沙发上有空位if(msg_get(wait_msg,&msg,WAIT_ID_ROOM,0)<0){perror("messagegeterror!");exit(-1);}msg_send(wait_msg,WAIT_ID_SOFA,,0);printf("theconsumer%d==>sofa,wait%dseconds\n",,(time(NULL)-);//room==>sofasem_v(wait_semid,2,0);//等待室空出1个位子sem_v(wait_lock_semid,1,0);//通知沙发上有人了}return0;}while(1){if((pid=fork())<0){perror("forkerror!");exit(EXIT_FAILURE);}elseif(pid==0){//if((consumer_status=sem_p(wait_semid,2,1))==-2){//检查理发店(等待室)是否已满printf("我是顾客%d,理发店满了,我走人了。。。\n",getpid());//full}elseif(consumer_status==0){//仍然有空间

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论