山东大学操作系统实验报告4进程同步实验_第1页
山东大学操作系统实验报告4进程同步实验_第2页
山东大学操作系统实验报告4进程同步实验_第3页
山东大学操作系统实验报告4进程同步实验_第4页
山东大学操作系统实验报告4进程同步实验_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机科学与技术学院实验报告 实验题目:实验四、进程同步实验学号:日期: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文件

3、。(2)新建ipc.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; s

5、hm_flg = IPC_CREAT | 0644; buff_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;

6、 cons_sem = set_sem(cons_h,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 get

7、s tobacco and papern",getpid(); if(buff_ptr0='B')printf("%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(

8、*cget_ptr%2=0)buff_ptr0='D'elsebuff_ptr0='E'up(cmtx_sem); up(prod_sem); return EXIT_SUCCESS; Producer:#include "ipc.h"int 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

9、 *)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;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_v

10、al = 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)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"

11、;,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("%d The producer gives glue and papern",getpid(); sleep(rate);up(pmtx_sem); up(cons_sem); return EXIT_SUCCESS; Ipc.h:#include

12、"ipc.h"int 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); fgets(line, BUFSZ,pf); while(!feof(pf) m = n = 0;fgets(line, BUFSZ,pf); while(linem = ' &

13、#39;) 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

14、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(sem_id,&buf,1) &l

15、t;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

16、");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; 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&qu

17、ot;,shm_h) < 0 ) if(shm_id = shmget(shm_h,shm_number,shm_flg) <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; m<shm_number; m+) shm_bufm = 0;if(s

18、hm_buf = (char *)shmat(shm_id,0,0) < (char *)0) perror("get shareMemory error"); exit(EXIT_FAILURE); return 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) perror("

19、;messageQueue set error"); exit(EXIT_FAILURE); return msq_id; 实验结果:分析:多进程的系统中避免不了进程间的相互关系。进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。通常的情况是两个或两个以上的进程需要同时访问某个共享变量。我们一般将发生能够问共享变量的程序段称为临界区。两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。解决互斥问题应该满足互斥和公平两个原则,即任意时刻只能允许一个进程处于同一共享变量的临界区,而且不能让任一进程无限期地等待。进程同步是进程之间直接的相互作用,是合作进程

20、间有意识的行为,典型的例子是公共汽车上司机与售票员的合作。只有当售票员关门之后司机才能启动车辆,只有司机停车之后售票员才能开车门。司机和售票员的行动需要一定的协调。同样地,两个进程之间有时也有这样的依赖关系,因此我们也要有一定的同步机制保证它们的执行次序。 信号量机制就是其中的一种。信号灯机制即利用pv操作来对信号量进行处理。PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):将信号量S的值减1,即S=S-1; 如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 V(S):将信号量S的值加1,即S=S+1; 如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。信号量的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论