山东大学操作系统实验报告4进程同步实验

上传人:枫** 文档编号:562525571 上传时间:2023-07-31 格式:DOCX 页数:12 大小:287.73KB
返回 下载 相关 举报
山东大学操作系统实验报告4进程同步实验_第1页
第1页 / 共12页
山东大学操作系统实验报告4进程同步实验_第2页
第2页 / 共12页
山东大学操作系统实验报告4进程同步实验_第3页
第3页 / 共12页
山东大学操作系统实验报告4进程同步实验_第4页
第4页 / 共12页
山东大学操作系统实验报告4进程同步实验_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《山东大学操作系统实验报告4进程同步实验》由会员分享,可在线阅读,更多相关《山东大学操作系统实验报告4进程同步实验(12页珍藏版)》请在金锄头文库上搜索。

1、实验题目:实验四、进程同步实验学号:日期:20120409班级:计基地12姓名:实验目的:加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥 操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。了解Lin ux 系统中IPC进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程 与调试技术。实验内容:抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。 抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草, 一个有纸,另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三 种材料,但每次仅轮流提供三种材料中的两种。得到缺

2、失的两种材料的抽烟者在 卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一 过程重复进行。 请用以上介绍的IPC同步机制编程,实现该问题要求的功能。硬件环境:处理器:Intel CoreX 4图形:Intel Sandybridge Mobile x86/MMX/SSE2 内存:4G操作系统:32位磁盘:20.1 GB软件环境: ubu ntu13.04实验步骤:(1) 新建定义了 producer和consumer共用的IPC函数原型和变量的ipc.h文件。(2) 新建ipc.c文件,编写producer和consumer共用的IPC的具体相应函数。(3) 新建Produ

3、cer文件,首先定义producer的一些行为,利用系统调用,建立共享内存区 域,设定其长度并获取共享内存的首地址。然后设定生产者互斥与冋步的信号灯,并为他们 设置相应的初值。当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他, 当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。(4) 新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域, 并设定他的长度并获取共享内存的首地址。然后设定消费者互斥与同步的信号灯,并为他们 设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当 共享内存区域已空时,信号

4、等也会提示生产者不能再从共享内存中取出相应的内容。运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。结论分析与体会:实现方式:Consumer:#in elude ipc.hint main(int argc,char *argv) int rate = 3;int con sumerid=atoi(argv1); buff_h = 101;buff_number = 1;cget_h = 103;cget_number = 1;shm_flg = IPC_CREAT | 0644;buff_ptr = (char *)set_shm(buff_h,buf f_nu mber,

5、shm_flg); cget_ptr = (int *)set_shm(cget_h,cget _nu mber,shm_flg); prod_h = 201;pmtx_h = 202;cons_h = 301;cmtx_h = 302;sem_flg = IPC_CREAT | 0644;sem_val = buff_number;prod_sem = set_sem(prod_h,sem_val,sem_flg);sem_val = 0;con s_sem = set_sem(c on s_h,sem_val,sem_flg); sem_val = 1;cmtx_sem = set_sem

6、(cmtx_h,sem_val,sem_flg);if(con sumerid=0)*cget_ptr=0;while(1)if(buf f_ ptr0-A=co nsumerid)dow n(con s_sem);dow n( cmtx_sem); sleep(rate);if(buf f_ ptr0=A)pri ntf(%d The consumer has glue.nThe consumer gets tobacco and papern ,getpid();if(buf f_ ptr0=B)pri ntf(%d The consumer has paper.nThe consumer

7、 gets tobacco and gluen ,getpid();if(buf f_ ptrO=C)pri ntf(%d The consumer has tobacco.、nThe consumer gets glue and papern ,getpid();*cget_ptr = (*cget_ptr+1);if(*cget_ptr%2=0)buff_ptr0=D;elsebuff_ptr0=E;up(cmtx_sem); up(prod_sem); -return EXIT_SUCCESS;Producer:#in elude ipc.hint main(int argc,char

8、*argv)int rate=3;int producerid二atoi(argv1);buff_h=101;buff_number=1;pput_h=102;pput_number=1;shm_flg=IPC_CREAT|0644;buff_ptr = (char *)set_shm(buff_h,buf f_nu mber,shm_flg); pput_ptr = (int *)set_shm(pput_h,pput_ nu mber,shm_flg); prod_h = 201;pmtx_h = 202;cons_h = 301;cmtx_h = 302;sem_flg = IPC_CR

9、EAT|0644;sem_val = buff_number;prod_sem = set_sem(prod_h,sem_val,sem_flg);sem_val = 0;con s_sem = set_sem(c on s_h,sem_val,sem_flg);sem_val = 1;pmtx sem = set sem(pmtx h,sem val,sem flg);if(producerid=0)buff_ptrO=D; *pput_ptr=O; - while(1)if(buf f_ ptr0-D=producerid) dow n( prod_sem);dow n( pmtx_sem

10、);*pput_ptr = (*pput_ptr+1)%3; if(*pput_ptr=0) buff_ptr0 = A;pri ntf(%dThepapern ,getpid();if(*pput_ptr=1) buff_ptr0 = B; pri ntf(%dThegluen ,getpid();producergivestobaccoandproducergivestobaccoandif(*pput_ptr=2)buff_ptr0 = C;pri ntf(%d The producer gives glue and papern ,getpid(); sleep(rate);up(pm

11、tx_sem);up(c on s_sem); -return EXIT_SUCCESS;Ipc.h:#in elude ipc.hint get_ipc_id(char *proc_file,h_t h) FILE *pf;int m,n;char lineBUFSZ,columBUFSZ;if(pf = fope n(proc_file,r) = NULL) perror(Proc file not ope n); exit(EXIT_FAILURE);fgets(li ne, BUFSZ, pf);while(!feof(pf)m = n 二 0;fgets(li ne, BUFSZ,

12、pf); while(li nem=) m+;while(li nem !=) colum n+ = linem+;column = 0; if(atoi(colum) != h)continue;n=0;while(li nem=) m+;while(li nem !=) colum n+ = linem+;column = 0; m = atoi(colum); fclose(pf); return m; fclose(pf); return -1;int down(int sem_id) struct sembuf buf; buf.sem_op = -1; buf.sem _nu mb

13、er = 0; buf.sem_flg = SEM_UNDO; if(semop(sem_id, &buf,1) 0) perror(dow n error ); exit(EXIT_FAILURE); return EXIT_SUCCESS;int up( int sem_id) struct sembuf buf; buf.sem_op = 1; buf.sem _nu mber = 0; buf.sem_flg = SEM_UNDO; if(semop(sem_id, &buf,1) 0) perror(up error ); exit(EXIT_FAILURE);return EXIT

14、_SUCCESS;int set_sem(h_t sem_h, int sem_val, int sem_flg) int sem_id;Sem_uns sem_arg;if(sem_id = get_ipc_id(/proc/sysvipc/sem,sem_h) 0 ) if(sem_id = semget(sem_h,1,sem_flg) 0) perror(semaphore create error); exit(EXIT_FAILURE);sem_arg.val = sem_val; if(semctl(sem_id,O,SETVAL,sem_arg) 0) perror(semaphore set error); exit(EXIT_FAILURE);return sem_id; -char * set_shm(h_t shm_h, int shm_number, int shm_flg) int m,shm_id;char * shm_buf;if(shm_id = get_ipc_id(/proc/sysvipc/shm,shm_h) 0 ) if(shm_id = shmget(shm_h,shm _nu mber,shm_flg)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号