![山东大学操作系统实验5进程互斥实验_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-10/22/fd5b6ef3-01a4-4cac-acf4-f26af499cae5/fd5b6ef3-01a4-4cac-acf4-f26af499cae51.gif)
![山东大学操作系统实验5进程互斥实验_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-10/22/fd5b6ef3-01a4-4cac-acf4-f26af499cae5/fd5b6ef3-01a4-4cac-acf4-f26af499cae52.gif)
![山东大学操作系统实验5进程互斥实验_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-10/22/fd5b6ef3-01a4-4cac-acf4-f26af499cae5/fd5b6ef3-01a4-4cac-acf4-f26af499cae53.gif)
![山东大学操作系统实验5进程互斥实验_第4页](http://file2.renrendoc.com/fileroot_temp3/2021-10/22/fd5b6ef3-01a4-4cac-acf4-f26af499cae5/fd5b6ef3-01a4-4cac-acf4-f26af499cae54.gif)
![山东大学操作系统实验5进程互斥实验_第5页](http://file2.renrendoc.com/fileroot_temp3/2021-10/22/fd5b6ef3-01a4-4cac-acf4-f26af499cae5/fd5b6ef3-01a4-4cac-acf4-f26af499cae55.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机科学与技术学院实验报告实验题目:实验五.进程互斥实验学号:日期:2014.4班级:计基地12 姓名:实验目的:进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。观察和体验非对称性互斥问题的并发控制方法。进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。实验要求:理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。在理发
2、店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?根据实验程序、调试过程和结果分析写出实验
3、报告。硬件环境:内存:1G 操作系统:32位磁盘:32 G软件环境:ubuntu11.02gcc4.8实验步骤:1、了解实验目的,掌握与进程间通信IPC中的3个对象:共享内存、信号灯数组、消息队列及有关的系统调用,并熟练掌握。2、阅读实验题目并分析实验的需求。 实验题目:理发店问题 (1) 首先创建ipc.h文件,在里面定义生产者/消费者共用的IPC函数的原型和变量。(2) 然后创建ipc.c文件,在里面定义生产者/消费者共用的IPC的具体的相应函数。(3)声明两个消息队列,当沙发空闲时则会将空闲的消息放入相应的队列中,让顾客可以进入沙发中,当理发师空闲时,也会将相应的消息放入队列中,从而可以
4、让顾客到理发椅上进行理发。(4)在消息队列中实现,当等待室里的人数少于十三个时,若从消息队列中获得信息,则顾客可以进入,当沙发上有空位时,在等待室的人可以进入沙发等待。(5)创建customer文件cons,里面声明两个消息队列,当获得允许进入的信息时,顾客进入等待室,当顾客理完发则会离开,同时向消息队列中发送信息。(6)创建barbour文件bar,在里面声明三个队列,当理发师就绪则会向队列中发送消息,若顾客收到消息就会去理发,当顾客离开时,也会向队列中发送一条消息。同时理发师理发与收账是互斥的。通过上述的文件就可以实现相应的功能。3、分析清楚实验要求,便开始用编程语言进行编程,将分析的思路
5、用编程语言实现。4、 完成编写程序,要进行运行调试,找到编写中的错误,进行进一步的修改,直到程序运行过程中不再出现错误。5、 完成程序的调试与修改,保存程序,对编程的过程进行总结,找到编程中的不足,并完成实验报告。实现方式:编写以下文件直接在命令行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 c
6、onsumer 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 *.oipc.h:#include #include #include #include #include #include #include #define BUFSZ 256 int get_ipc_id(char *proc_file,key_t key); char
7、*set_shm(key_t shm_key,int shm_num,int shm_flag);int set_msq(key_t msq_key,int msq_flag); int set_sem(key_t sem_key,int sem_val,int sem_flag); int down(int sem_id);int up(int sem_id); /*信号灯控制用的共同体*/ typedef union semuns int val; Sem_uns;typedef struct msgbuf long mtype; char mtext1; Msg_buf; key_t b
8、uff_key2; int buff_num;int *buff_ptr2; key_t pput_key2;int pput_num;int *pput_ptr2;key_t prod_key;key_t pmtx_key;int prod_sem;int pmtx_sem;key_t cons_key; key_t cmtx_key; int cons_sem; int cmtx_sem; int sem_val; int sem_flg; int shm_flg; ipc.c:#include ipc.hint get_ipc_id(char *proc_file,key_t key)
9、FILE *pf; int i,j; char lineBUFSZ,columBUFSZ; if(pf = fopen(proc_file,r) = NULL) perror(Proc file not open);exit(EXIT_FAILURE); fgets(line, BUFSZ,pf); while(!feof(pf) i = j = 0;fgets(line, BUFSZ,pf); while(linei = ) i+; while(linei != )columj+ = linei+; columj = 0; if(atoi(colum) != key) continue; j
10、=0;while(linei = )i+; while(linei != )columj+ = linei+;columj = 0; i = atoi(colum); fclose(pf); return i; fclose(pf);return -1; /* * 信号灯上的down/up操作 * semid:信号灯数组标识符 * semnum:信号灯数组下标 * buf:操作信号灯的结构 */ int down(int sem_id) struct sembuf buf; buf.sem_op = -1; buf.sem_num = 0;buf.sem_flg = SEM_UNDO; if(
11、semop(sem_id,&buf,1) 0) perror(down error ); exit(EXIT_FAILURE); return EXIT_SUCCESS; int up(int sem_id)struct sembuf buf; buf.sem_op = 1; buf.sem_num = 0; buf.sem_flg = SEM_UNDO;if(semop(sem_id,&buf,1) 0) perror(up error ); exit(EXIT_FAILURE); return EXIT_SUCCESS; /* * set_sem函数建立一个具有n个信号灯的信号量 * 如果
12、建立成功,返回 一个信号灯数组的标识符sem_id * 输入参数: * sem_key 信号灯数组的键值 * sem_val 信号灯数组中信号灯的个数 * sem_flag 信号等数组的存取权限 */ int set_sem(key_t sem_key,int sem_val,int sem_flg) int sem_id; Sem_uns sem_arg;if(sem_id = get_ipc_id(/proc/sysvipc/sem,sem_key) 0 ) if(sem_id = semget(sem_key,1,sem_flg) 0) perror(semaphore create e
13、rror);exit(EXIT_FAILURE); /设置信号灯的初值sem_arg.val = sem_val; if(semctl(sem_id,0,SETVAL,sem_arg) 0) perror(semaphore set error); exit(EXIT_FAILURE); return sem_id; /* * set_shm函数建立一个具有n个字节 的共享内存区 * 如果建立成功,返回 一个指向该内存区首地址的指针shm_buf * 输入参数: * shm_key 共享内存的键值 * shm_val 共享内存字节的长度 * shm_flag 共享内存的存取权限 */ char
14、 * set_shm(key_t shm_key,int shm_num,int shm_flg) int i,shm_id;char * shm_buf; if(shm_id = get_ipc_id(/proc/sysvipc/shm,shm_key) 0 ) if(shm_id = shmget(shm_key,shm_num,shm_flg) 0) perror(shareMemory set error); exit(EXIT_FAILURE); if(shm_buf = (char *)shmat(shm_id,0,0) (char *)0) perror(get shareMem
15、ory error); exit(EXIT_FAILURE); for(i=0; ishm_num; i+) shm_bufi = 0;if(shm_buf = (char *)shmat(shm_id,0,0) (char *)0) perror(get shareMemory error); exit(EXIT_FAILURE); return shm_buf; int set_msq(key_t msq_key,int msq_flg) int msq_id; if(msq_id = get_ipc_id(/proc/sysvipc/msg,msq_key) 0 ) if(msq_id
16、= msgget(msq_key,msq_flg) 0) perror(messageQueue set error); exit(EXIT_FAILURE); return msq_id; Cons:#include ipc.h int main(int argc,char *argv) sem_val = 1;sem_val = 0; buff_num=13;pput_num=4;sem_val = buff_num;buff_key0=104;pput_key0=105;buff_key1=106;pput_key1=107;prod_key = 201; pmtx_key = 202;
17、 cons_key = 301; cmtx_key = 302;shm_flg=IPC_CREAT|0644;sem_flg = IPC_CREAT | 0644; prod_sem = set_sem(prod_key,sem_val,sem_flg); cons_sem = set_sem(cons_key,sem_val,sem_flg); cmtx_sem = set_sem(cmtx_key,sem_val,sem_flg);buff_ptr0= (int *)set_shm(buff_key0,buff_num,shm_flg); pput_ptr0= (int *)set_shm
18、(pput_key0,pput_num,shm_flg);buff_ptr1= (int *)set_shm(buff_key1,buff_num,shm_flg);pput_ptr1= (int *)set_shm(pput_key1,pput_num,shm_flg);down(cons_sem); down(cmtx_sem); sleep(3);if(*pput_ptr14) buff_ptr1*pput_ptr1=getpid(); *pput_ptr1=*pput_ptr1+1; printf(%d people come to the barber shopn,getpid();
19、 sleep(3); printf(%d people sit on the sofa n,getpid();elseif(*pput_ptr00)rate=0;pid=buff_ptr10;printf(-n);printf(barber %d was waked up and start working on %d peoplen,getpid(),pid);for(i=0;i0) buff_ptr1*pput_ptr1-1=buff_ptr00; printf(people %d sits on the sofan,buff_ptr00); for(i=0;i*pput_ptr0-1;i
20、+) buff_ptr0i=buff_ptr0i+1; *pput_ptr0=*pput_ptr0-1;else*pput_ptr1=*pput_ptr1-1;printf(people %d finishs and pay to the barber %dn,pid,getpid();printf(people %d finishs paying and leave the shopn,pid);elseprintf(barber %d is sleepingn,getpid();if(rate!=1)rate=1;printf(barber %d starts sleepingn,getp
21、id();printf(-n); sleep(3); up(pmtx_sem); up(cons_sem); return 1; 实验结果:理发师1理发师2理发师3顾客进程1顾客进程2总结:总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?通过进程同步实验,我明白了进程互斥机制,(1)非对称性互斥是指并发进程有且仅有一个可以执行某一段代码(称为临界区),具体是那个进程进入临界区是有临界区之前的代码(称为进入区)决定的,当进入临界区的调度机制是非对称,即某些进程具有优先进入的权利称为非对称的,例如此时有一个理发师从沙发室叫走了一个顾客,需要一个顾客从等候室进入沙发室,此时恰巧新来了以顾客,此时顾客进程和理发师进程都想要进入临界区(修改或查询等候室顾客数目),但按照正常人的思维,肯定是理发师先访问临界区,修改等候室顾客数目,然后是新来顾客访问临界区,查询是否可以进入理发店。(2)进程饥饿指当等待时间给进程推进和响应带来明显影响称为进程饥饿。产生饥饿的主要原因是:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 道德与法治七年级上册8.1 《生命可以永恒吗》听课评课记录
- 湘教版数学七年级上册《3.2 等式的性质》听评课记录
- 新北师大版数学一年级下册《谁的红果多》听评课记录
- 独立住宅买卖协议书(2篇)
- 【2022年新课标】部编版七年级上册道德与法治7.3 让家更美好 听课评课记录
- 鲁教版地理六年级下册8.3《撒哈拉以南非洲》听课评课记录1
- 湘教版数学七年级下册《2.1.4多项式的乘法(2)》听评课记录2
- 湘教版数学八年级下册《2.3中心对称》听评课记录
- 商务星球版地理八年级下册活动课《区际联系对经济发展的影响》听课评课记录
- 苏科版数学八年级下册11.3《用反比例函数解决问题》听评课记录2
- 知识产权保护执法
- 手术安全管理之手术部位标识安全
- 2022年版煤矿安全规程
- 高质量社区建设的路径与探索
- 数字化时代的酒店员工培训:技能升级
- 足球守门员扑救技巧:扑救结合守护球门安全
- 《学术规范和论文写作》课件全套 第1-10章 知:认识研究与论文写作 - 引文规范
- 带式输送机滚筒出厂检验规范
- 起重机更换卷筒施工方案
- 《信息检索基础知识》课件
- 具有履行合同所必须的设备和专业技术能力的承诺函-设备和专业技术能力承诺
评论
0/150
提交评论