文档介绍:该【山大操作系统实验五 】是由【雨林书屋】上传分享,文档一共【8】页,该文档可以免费在线阅读,需要了解更多关于【山大操作系统实验五 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。山东大学软件学院操作系统实验报告实验题目:进程互斥实验实验目的:进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。 观察和体验非对称性互斥问题的并发控制方法。进一步了解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){ ,顾客类似写者进程。最后,通过不断的调试,使我熟练了在 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("the consumer%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){//仍然有空间printf("我是顾客%d,进入理发店\n",getpid());printf("我是顾客%d,正在等待室等待\n",getpid());msg_send(wait_msg,WAIT_ID_ROOM,getpid(),0);//进入等待室sem_v(wait_lock_semid,2,0);//通知等待室有人了}exit(0);}sleep(3);//}return0;}