ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:439.31KB ,
资源ID:1075956      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/1075956.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(山东大学操作系统实验报告4进程同步实验.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、山东大学操作系统实验报告4进程同步实验 山东大学操作系统实验报告4进 程同步实验 计算机科学与技术学院实验报告 实验题目:实验四、进程同步实验 学号: 日期:20120409 班级:计基地12 姓名: 实验目的加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案了 Linux系统 IPC进程同步工具的用法,练习并发协作进程的同步与互斥操作的编与调试技术实验内容抽烟者问题假设一个系统中有三个抽烟者进程每个抽烟者不断地卷烟并抽烟抽烟者卷起并抽掉一颗烟需要有三种材料烟草纸和胶水一个抽烟者有烟草一个有纸,另一个有胶水。系统中还有两

2、个供应者进程,它们无限地供应所有种材料但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者卷起并抽掉一颗烟后会发信号通知供应者让它继续提供另外的两种材料。这过程重复进行 请用以上介绍 IPC同步机制编程实现该问题要求的功能 硬件环境CPUi3-2350MIntel?Cor42.30GHzMobileIntel?Sandybridgex86/MMX/SSE24G内存3操作系统:20.1 GB 磁盘: 软件环境: ubuntu13.04 实验步骤: (1)新建定义了producer和consumer共用的 文件。ipc.h函数原型和变量的IPC (2)新建ipc.c文件,编写produce

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

4、者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。 运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。 结论分析与体会: 实现方式: Consumer: #include ipc.h int main(int argc,char *argv) int rate = 3; int consumerid=atoi(argv1); buff_h = 101; buff_number = 1; cget_h = 103; cget_number = 1; shm_flg = IPC_CREAT | 0644; buff_ptr

5、 = (char *)set_shm(buff_h,buff_number,shm_flg); cget_ptr = (int *)set_shm(cget_h,cget_number,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; cons_sem = set_sem(cons_h,sem_val

6、,sem_flg); sem_val = 1; cmtx_sem = set_sem(cmtx_h,sem_val,sem_flg); if(consumerid=0)*cget_ptr=0;while(1) if(buff_ptr0-A=consumerid)down(cons_sem); down(cmtx_sem); sleep(rate); if(buff_ptr0=A) printf(%d The consumer has glue.nThe consumer gets tobacco and papern,getpid(); if(buff_ptr0=B) printf(%d Th

7、e consumer has paper.nThe consumer gets tobacco and gluen,getpid(); if(buff_ptr0=C) printf(%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; else buff_ptr0=E; up(cmtx_sem); up(prod_sem); return EXIT_SUCCESS; Produce#inc

8、lude ipc.hint main(int argc,char *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,buff_number,shm_flg); pput_ptr = (int *)set_shm(pput_h,pput_number,shm_flg);prod_h = 201;pmtx_h = 202; cons_h = 301;

9、 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; cons_sem = set_sem(cons_h,sem_val,sem_flg); sem_val = 1; pmtx_sem = set_sem(pmtx_h,sem_val,sem_flg); if(producerid=0) buff_ptr0=D; *pput_ptr=0; while(1) if(buff_ptr0-D=producerid)

10、 down(prod_sem); down(pmtx_sem); *pput_ptr = (*pput_ptr+1)%3; if(*pput_ptr=0)buff_ptr0 = A;printf(%dTheproducergivestobaccoandpapern,getpid(); if(*pput_ptr=1)buff_ptr0 = B;printf(%dTheproducergivestobaccoandgluen,getpid(); if(*pput_ptr=2)buff_ptr0 = C;printf(%dTheproducergivesglueandpapern,getpid();

11、 sleep(rate);up(pmtx_sem); up(cons_sem); return EXIT_SUCCESS; Ipc.#include ipc.hint get_ipc_id(char *proc_file,h_t h) FILE *pf; int m,n; char lineBUFSZ,columBUFSZ; if(pf = fopen(proc_file,) = NULL) perror(Proc file not open); exit(EXIT_FAILURE); fgets(line, BUFSZ,pf); while(!feof(pf) m = n = 0; fget

12、s(line, BUFSZ,pf); while(linem = ) m+; while(linem != ) column+ = linem+; column = 0; if(atoi(colum) != h) continue; n=0; while(linem = )m+; while(linem != )column+ = 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 =

13、-1; buf.sem_number = 0;buf.sem_flg = SEM_UNDO; if(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_number = 0; buf.sem_flg = SEM_UNDO; if(semop(sem_id,&buf,1) 0) perror(%up error ); exit(EXIT_FAILURE);

14、 return EXIT_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,0,SETVAL,sem_arg) 0) perror(semaphore set error); exit(EXIT_FAILURE); retu

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1