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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

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

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

2、们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一过程重复进行。 请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。硬件环境:处理器:Intel Core i3-2350M CPU 2.30GHz 4 图形:Intel Sandybridge Mobile x86/MMX/SSE2内存:4G操作系统:32位磁盘:20.1 GB软件环境:ubuntu13.04实验步骤:(1)新建定义了producer和consumer共用的IPC函数原型和变量的ipc.h文件。(2)新建ipc.

3、c文件,编写producer和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; b

5、uff_ptr = (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,

6、sem_val,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) pr

7、intf(%d The 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; P

8、roducer:#include 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_

9、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,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(b

10、uff_ptr0-D=producerid) down(prod_sem); down(pmtx_sem); *pput_ptr = (*pput_ptr+1)%3; if(*pput_ptr=0) buff_ptr0 = A; printf(%d The producer gives tobacco and papern,getpid(); if(*pput_ptr=1) buff_ptr0 = B; printf(%d The producer gives tobacco and gluen,getpid(); if(*pput_ptr=2) buff_ptr0 = C; printf(%

11、d The producer gives glue and papern,getpid(); sleep(rate); up(pmtx_sem); up(cons_sem); return EXIT_SUCCESS; Ipc.h:#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,r) = NULL) perror(Proc file not open); exit(EXIT_FAILURE); fget

12、s(line, BUFSZ,pf); while(!feof(pf) m = n = 0; fgets(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;

13、 int down(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(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(se

14、m_id,&buf,1) 0) perror(up error ); exit(EXIT_FAILURE); 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_a

15、rg.val = sem_val; if(semctl(sem_id,0,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_number,shm_flg)

16、0) perror(shareMemory set error); exit(EXIT_FAILURE); if(shm_buf = (char *)shmat(shm_id,0,0) (char *)0) perror(get shareMemory error); exit(EXIT_FAILURE); for(m=0; mshm_number; m+) shm_bufm = 0; if(shm_buf = (char *)shmat(shm_id,0,0) (char *)0) perror(get shareMemory error); exit(EXIT_FAILURE); retu

17、rn shm_buf; int set_msq(h_t msq_h,int msq_flg) int msq_id; if(msq_id = get_ipc_id(/proc/sysvipc/msg,msq_h) 0 ) if(msq_id = msgget(msq_h,msq_flg) 0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。信号量的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该

18、资源的进程个数。信号量的值仅能由PV操作来改变。一般来说,信号量S30时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。使用多于 4 个的生产者和消费者,以各种不同的启动顺序、不同的执行速率检测以上示例程序和独立实验程序也能满足同步的要求。因为使用信号量满足进程互斥的要求,任意时刻进入临界区的进程只有一个。而进程是通过信号量唤醒阻塞进程,依然可以实现进程同步。调试过程中遇到的主要问题及解决过程:(1)在修改程序时,最开始使用了read()、schedual()、lock(),但是编译出现错误。解决方法:使用sleep()函数。(2)exit()缺少头文件。解决方法:加头文件#include。(3)sleep()等linux系统调用缺少头文件。解决方法:加头文件#include体会和收获:经过本次实验,初步了解操作系统的进程同步的过程。我对生产者-消费者问题的解决办法有了更全面的认识,同时对调试代码更加熟练。本次实验最大的体会就是,做东西要细心,在写代码的过程中,稍不留意就给后期调试工作带来很多问题。

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

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