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

下载本文档

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

文档简介

实验2的过程是同步的一、实验目的:掌握基本同步算法,学习使用Linux理解经典的过程同步问题的本质的过程同步机制,掌握相关API的使用方法,使用信号量的机制,可以用多个同步算法实现不发生死锁的哲学家的饮食程序。二、实验平台:虚拟机: VMWare9或更高版本操作系统: Ubuntu 12.04以上编辑器: Gedit | Vim编译器: Gcc三、实验内容:(1)根据哲学家的饮食模型,在Linux控制台环境中建立5个过程,使用semget函数建立一个信号量集(5个信号量,初始值为1 ),模拟哲学家的思考和饮食行为:每个哲学家饿时,拿左手筷子,拿右手筷子为了得到为每个筷子定义一个互斥信号量,首先需要对信号量进行p操作,释放筷子,对信号量进行v操作。伪代码说明:semaphanorechopstick 5= 1,1,1,1 ;第I位哲学家的活动do 1222222222222222222226打印( % dis thinkingn ,I );打印( % dshunryn ,I );wait(chopsticki ); 拿左筷子wait(chopstick(i 1) % 5; 拿右筷子打印( % din eatingn ,I );signal(chopsticki ); 放左筷子signal(chopstick(i 1) % 5; /放右筷子whiletrue;执行该组的过程,观察该过程是否能持续执行,并分析其原因,以观察停滞时会发生什么。(2)要解决哲学家的饮食问题,a .只有哲学家的左右筷子可用的情况下,才能采用允许拿筷子吃饭的方法b .最多4个哲学家同时拿左筷子,最终能保证至少一个哲学家能吃饭的c .奇数号方法a用示例程序显示,用方法b和c写不发生死锁的哲学家的饮食程序。(3)设计程序,实现生产者/消费者进程(线程)的同步和排他。 此程序创建了四个模拟生产者和消费者的流程(或线程),以实现流程(线程)的同步和排他。实验结果:用a法解决了哲学家吃饭的问题用b法解决哲学家的饮食问题源代码如下#include#include#include#include#include#include#include#include#include#include#include#includeunion semun举止PPS;结构semid _ ds * buf;unsigned short *array;struct seminfo *_buf;#define ERR_EXIT(m) do perror(m) exit(EXIT_FAILURE) while(0)/获取排他信号量void wait_mutex(int mutex )举止结构sembuf sb= 0,- 1,0 ;操作semop(mutex、sb、1) /排他信号量以下拿筷子void wait_v(int semid,int num )举止struct sembuf sb=num,- 1,0 ;semop(semid、sb、1 )以下放开筷子void signal_p(int semid、int num )举止struct sembuf sb=num,1,0 ;semop(semid、sb、1 )以下/释放互斥变量mutexvoid signal_mutex(int semid0)举止structsembufsb= 0,1,0 ;semop(semid0、sb、1 )以下/ph函数void ph(int num,int semid,int semid0)举止int left=num;int right=(num 1)%5;for (; (请参见)举止打印( % dis thinkingn ,num );休眠(1)printf(%dshunryn ,num );休眠(1)/wait操作,控制哲学家最多4人可以吃饭wait_mutex(semid0)wait_v(semid,left )wait_v(semid,right )打印( % di seatingn ,num );睡眠(1)/signal操作signal_p(semid,right) /放开右筷子signal_p(semid,left) /释放左速子signal_mutex(semid0) /释放排他信号量以下以下/主函数int main(int argc,char *argv )举止int semid、semid0;/创建两个信号量集semid0=semget(IPC_PRIVATE,1,IPC_CREAT | 0666 )semid=semget(IPC_PRIVATE,5,IPC_CREAT | 0666 )/union semun su;su.val=1;PS;for(i=0; i5; PS )举止/semctl ()系统调用在一个信号量集(或集中的一个信号量)上执行各种控制操作semctl(semid、I、SETVAL、su )以下设定semid0信号量的初始值union semun su0;su0.val=4;semctl (semid 0,0,SETVAL,su0 )/创建四个子进程int num=0;pid_t pid;for(i=1; i5; PS )举止pid=fork ();PS (PS0) err _ exit ( fork ); 以下PS (PS=0) S=I; break; 以下以下第二个哲学家应该做的事ph (数字、semid、semid0)返回0;以下执行结果用c法解决哲学家的饮食问题#include#include#include#include#include#include#include#include#include#include#include#includeunion semun举止PPS;结构semid _ ds * buf;unsigned short *array;struct seminfo *_buf;#define ERR_EXIT(m) do perror(m) exit(EXIT_FAILURE) while(0)拿筷子void wait_v(int semid,int num )举止struct sembuf sb=num,- 1,0 ;semop (编号、sb、1 )以下放开筷子void signal_p(int semid、int num )举止struct sembuf sb=num,- 1,0 ;semop (编号、sb、1 )以下/科学家应该做的事void ph(int semid,int num )举止for (; 死循环。举止/判断哲学家的号码是奇数还是偶数/奇数先申请左边的筷子,偶数先申请右边的筷子PS (PS % 2!=0)/奇数判定printf(%disthinkingn ,num );休眠(1)printf(%dshunryn ,num );休眠(1)/wait操作wait_v(semid,num )wait_v(semid,(num 1)%5)打印( % di seatingn ,num );休眠(1)/signal操作signal_p(semid,(num 1)%5)signal_p(semid,num )以下PS (数字%2=0)判断偶数printf(%disthinkingn ,num );休眠(1)printf(%dshunryn ,num );休眠(1)/wait操作wait_v(semid,(num 1)%5)wait_v(semid,num )/signal操作signal_p(semid,num )signal_p(semid,(num 1)%5)以下以下以下int main(int argc,char *argv )举止PR semid/创建五个信号量semid=semget(IPC_PRIVATE,5,IPC_CREAT | 0666 )union semun su;su.val=1;PS;for(i=0; i5; PS )举止请注意/第二个参数也是索引semctl(semid、I、SETVAL、su )以下/创建四个子进程pid_t pid;int num=5;for(i=0; i4; PS )举止pid=fork ();PK (PS0) err _ exit ( fork ); 以下PS (PS=0) PS=I; break; 以下以下/哲学家应该做的事ph(semid,num )返回0;以下生产者和消费者的同步和排他源代码如下所示:#include#include#include#include#include#define N 2 /消费者或生产者的数量#define M 10 /缓冲区数int in=0; /生产者放置产品的地方输入输出=0; /消费者取产品的地方int buff=0; /缓冲区初始化为0,最初没有产品sem_t empty_sem; /同步信号量,满时阻止生产者出产sem_t full_sem; /同步信号量,没有产品时停止消费者消费pthread_mutex_t mutex; /互斥信号量,一次只能访问一个线程缓冲区int product_id=0; /生产者idint prochase_id=0; /消费者id/*打印缓冲区时*/void打印()举止PS;for(i=0; PS; PS )printf(%d ,buffi );printf(n );以下/*生产者的方法*/void *product ()举止int id= product_id;while(1)举止可以用sleep的数量调节生产和消费的速度,容易观察休眠(1)/sleep(1)sem_wait(empty_sem )pthread_mutex_lock(mutex )in=in % M;打印(产品% din % d.like :t 、id、in );buffin=1;print ();in;pthread_mutex_unlock(mutex )sem_post(full_sem )以下以下/

温馨提示

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

评论

0/150

提交评论