实验二进程同步实验综述_第1页
实验二进程同步实验综述_第2页
实验二进程同步实验综述_第3页
实验二进程同步实验综述_第4页
实验二进程同步实验综述_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、实验二进程同步一、实验目的:掌握基本的同步算法,理解经典进程同步问题的本质;学习使用Lmux的进程同步机制, 掌握相关API的使用方法;能利用信号量机制,采用多种同步算法实现不会发生死锁的诉 学家进餐程序。二、实验平台:虚拟机:VMWaie9以上操作系统:Ubuntu 12.04以上编辑器:Gedit | Vim编译器:Gcc三、实验内容:(1)以哲学家进餐模型为依据,在Linux控制台环境下创建5个进程,用semget函数创 建一个信号量集(5个信号量,初值为1),模拟诃学家的思考和进餐行为:每一位哲学家饥 饿时,先拿起左手筷子,再拿起右手筷子;筷子是临界资源,为每一支筷子定义1个互斥信 号

2、量;想拿到筷子需要先对信号量做P操作,使用完释放筷子对信号量做V操作。 伪代码描述:semaphore chopstick5= 14,1,1,1;第1位行学家的活动可描述为:doprmtf(n%d is thinkingn”,i);prmtf(n%d is hungry*JiH,i);wait(chopstick 订);拿左筷子wait(chopstick (i+l)%5);拿右筷子piinttf%d is 亡adngn”,i);signal(chopstick i);放左筷子signal(chopstick (i+l)%5);放右筷子 while tme;运行该组进程,观察进程是否能一直运行

3、下去,若停滞则发生了什么现象?并分析原因。(2)解决哲学家进餐问题可采用如下方法:a.仅当哲学家的左、右两只筷子均可用时, 才允许他拿起筷子进餐:b.至多只允许有4位竹学家同时去拿左边的筷子,最终能保证至少 有一位哲学家能够进餐;c.规定奇数号哲学家先拿起他左手的筷子,然后再拿起他右手的筷 子,而偶数号哲学家则先拿起他右手的筷子,然后再拿起他左手的筷子。方法a在示例程序 中给出,请用方法b和c写出不会发生死锁的竹学家进餐程序。(3)设计程序,实现生产者/消费者进程(线程)的同步与互斥。在该程序中创建4个进程 (或线程)模拟生产者和消费者,实现进程(线程)的同步与互斥。实验结果:使用a方法结果诉

4、学家就餐问题whtcmisswhtentss:/Deslctop$ gee a.c:a whtcmisswhtenissViftuelBox:/Desktop$ /a 0 is thinking4 is thinking3 is thinking2 ts thinking1 is thinking3 is hungry4 is hungry1 is hungry4 is eating2 is hungry0 ts hungry4 is thinking3 is eating3 is thinking2 ts eating4 is hungry2 is thinking1 ts eating3

5、is hungry1 is thinking0 is eating2 ts hungry使用b方法解决诃学家就餐问题源码如下:include include include include include include include include include include include include union semun iiit val;stmct semid_ds *buf;unsigned short *anay;stmct semuifo *_buf;#define ERR_EXIT(m) do perror(m); exit(EXIT_FAILURE); wlule

6、(O)获取互斥信号量void wait_mutex(mt mutex)stmct sembuf sb=O,-l,O;semop(mutex,&sb,l);对互斥信号量进行操作 取得筷子void wait_v(int seinid.iiit num)stmct sembuf sb=nunK-l,0;semop(seimd,&sbj);释放筷子void signal_p(int semid,mt num)stmct sembuf sb=numJ,0; semop(seimd,&sbj);释放互斥变量mutexvoid signaLmutex(int senudO)stmct sembuf sb=0

7、丄0; semop(senudO.&sb); /pli函数void ph(int numjnt senud.mt senudO) mt left=num; mt iight=(num+l)%5;血(;)printf(M%d is thuikingii,num);sleep(l);printf(M%d is hungrySJum);sleep(l);/wait操作,控制哲学家最多4人能进餐wait_mutex(senudO);wait_v(senud,left);wait_v(senud,iight);printf(M%d is eatmgii,num);sleep(l);/signal 操作s

8、ignal_p(seimd.nglit);释放右筷子 signal_p(semid. left);/释放左快子 signal_mutex(senudO);/释放互斥信号量主函数mtaigc.chai *argv)mt semidsenudO;创建两个信号量集semidO=semget(IPC_PRIXTE, 1 JPC.CREAT | 0666); seinid=semget(IPC_PRIATE?5.IPC_CREAT | 0666);/union semun su;su.val=l;inti;fbr(i=0;i5;i+)/semctlQ系统调用在一个信号量集(或集合中的单个信号量)上执行各

9、种控制操作 seme tl(s 亡 mid 丄 SETVAL, su);设定senudO信号量的初始值union semun suO;su0.val=4;semctl(seinidO.O.SETVAL,suO);创建4个子进程iiit num=0;pid_t pid;fbr(i=l;i5;i+)pid=forkQ;if(pid0) ERR_EXITC,fbrkM); if(pid=O) num=i;break:第num个竹学家要做的事ph(num,senud,senudO);return 0;执行结果whtcmisswhtcmlss/itu3lBox:/Dskt:op$ gcc b.c b w

10、htcntsswhtcmtss-VIrtualBox:-/Desktops ./b 0 is thinking4 is thinking3 Is thinking2 is thinking1 is thinking0 is hungry4 is hungry3 ts hungry2 is hungry1 is hungry0 is eoting2 is eating0 ts thinking4 is eating2 is thinking1 is eating0 is hungry4 Is thinking3 is eating2 is hungry1 is thinking使用c方法解决诃学

11、家就餐问题#include #include #include #include #include #include #include #include #include #include #include #include Junion semuniiit val;stmct semid_ds *buf; unsigned short *airay;stmct semuifo *_buf;;define ERR_EXIT(m) dopenor(m); exit(EXIT_FAILURE); wliile(O)取得筷子void wait_v(int seiiud.iiit num)stmct

12、sembuf sb=miml,0;semop(num.&sb, 1);释放筷子void signal_p(iiit semid,mt num)stmct sembuf sb=miml,0;semop(num.&sb, 1);科学家要做的事void ph(int senud.mt num)for(;) 死循坏判断哲学家的编号是奇数还是偶数奇数先申请左边的筷子,偶数先申请右边的筷子if(num%2!=0)/判断奇数printf(M%cl is thuikuigiiM jium);sleep(l);printf(M%cl is hungiyji,num);sleep(l);/wait操作wait_v

13、(senudaium);wait_v(senud,(num+printf(M%cl is eatmgkiinum);sleep(l);/signal 操作signal_p(seinid.(num+1 )%5); signal_p(seiiud4ium); if(num%2=0) 判断偶数printfCd is thuikniguinum); sleep(l);printf(M%cl is hungiyu,num); sleep(l);/wait操作 wait_v(senud,(num+ wait_v(senudaium);/signal 操作 signal_p(senud4ium);signa

14、l_p(seiiud.(num+1 )%5);mt mam(mt aigcchai *argv)mt semid;创建5个信号量seinid=semget(IPC_PRIATE,5,IPC_CREAT | 0666); union semun su;su.val=l;inti;fbr(i=0;i5;i+)注意第二个参数也是索引 semctl(senudd,SETAL,su); 创建4个子进程pid_t pid;mt num=5; fbr(i=0;i4;i+)pid=fbrkQ;if(pid0) ERR_EXIT(HfbrkH); if(pid=O) num=i;break;哲学家要做的事ph(

15、sennd4ium);return 0;ISISISISISISISISISis tsISISTSISISxs-virtuaIBox:-/Desktops gcc c.c o c -VtrtualBox:/D”ltop$ /cthinking thinking thinking thinking thinking hungry hungry hungry hungry hungry eating thinking eating eating thinking hungry thinking thinking hungry thinking生产者和消费者的同步与互斥源代码如下:include i

16、nclude include include include defineN 2/消费者或者生产者的数目define M 10 /缓冲数目mtm = 0;/生产者放置产品的位置mt out = 0; /消费者取产品的位置mt bufftM = 0;/缓冲初始化为0,开始时没有产品sem_t empty_sem; /同步信号量,当满了时阻止生产者放产品 sem_t fblLsem; /同步信号量,当没产品时阻止消费者消费 ptluead_mutex_t mutex; /互斥信号量,一次只有一个线程访问缓冲 mt produced = 0; 生产者 idint prochase.id = 0; /

17、消费者 id/*打印缓冲情况*/void priiit()int i;fbr(i = 0; i M; i+)pnntff%d ”, buffli);pnntf(HnM);/*生产者方法*/void *productQint id = +pioduct_id;while(l)/用sleep的数量可以调节生产和消费的速度,便于观察 sleep(l);/sleep(l);senvwait(&einpty_sem); ptluead_mutex_lock (&mutex);ill = ill % M;pimtf(nproduct%d in %d. like: tH, id. in);pnntO;ptl

18、uead_mutex_unlock (&mutex); sem_post(&hill_sum);/*消费者方法/void *prochase()int id = +prochase_id;wlule(l)/用sleep的数量可以调节生产和消费的速度,便于观察 sleep ;/sleep ;sem_wait(&fbll_s 亡 m); ptluead_mutex_lock (&mutex);out = out % M;printf(,procliase%d in %d. like: f id, out);buyout = 0; pnntO; +out;ptluead_mutex_unlock (

19、&mutex);sem_post(&empty_s 亡 m);mtptluead_t idlN;ptluead_t id2N;inti;int retN;/初始化同步信号量int ini! = sem_init(&亡mpty_sem, 0, M);int ini2 = sem_init(&full_sem. 0、0);& iiii2 != 0)piintfpsem uut failed iin);exit(l);/初始化互斥信号量int ini3 = ptlnead_mutex_iiiit (& mutex. NULL);if(iiii3 != 0)priiitf(nmutex init failedexit(l);/创建N个生产者线程fbr(i = 0; i N; i+)reti = ptluead-create(NULL, product, (void *)(&i);if(ieti != 0)pimtHMpioduct%d creation foiled i); exit(l);创建N个消费者线程fbr(i = 0; i N; i+)reti = ptluead-create(&id2i, NULL, prochase, NULL);if(ie

温馨提示

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

评论

0/150

提交评论