版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验二 进程同步一、实验目的:掌握基本的同步算法,理解经典进程同步问题的本质;学习使用Linux的进程同步机制,掌握相关API的使用方法;能利用信号量机制,采用多种同步算法实现不会发生死锁的哲学家进餐程序。二、实验平台:虚拟机:VMWare9以上操作系统:Ubuntu12.04以上编辑器:Gedit | Vim编译器:Gcc三、实验内容:(1)以哲学家进餐模型为依据,在Linux控制台环境下创建5个进程,用semget函数创建一个信号量集(5个信号量,初值为1),模拟哲学家的思考和进餐行为:每一位哲学家饥饿时,先拿起左手筷子,再拿起右手筷子;筷子是临界资源,为每一支筷子定义1个互斥信号量;想拿
2、到筷子需要先对信号量做P操作,使用完释放筷子对信号量做V操作。伪代码描述:semaphore chopstick5=1,1,1,1,1; 第i位哲学家的活动可描述为: do printf("%d is thinkingn",i); printf("%d is hungryn",i); wait(chopsticki); /拿左筷子 wait(chopstick(i+1) % 5); /拿右筷子 printf("%d is eatingn",i); signal(chopsticki); /放左筷子 signal(chopstick(i
3、+1) % 5); /放右筷子 whiletrue; 运行该组进程,观察进程是否能一直运行下去,若停滞则发生了什么现象?并分析原因。(2)解决哲学家进餐问题可采用如下方法:a.仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐;b.至多只允许有4位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐;c.规定奇数号哲学家先拿起他左手的筷子,然后再拿起他右手的筷子,而偶数号哲学家则先拿起他右手的筷子,然后再拿起他左手的筷子。方法a在示例程序中给出,请用方法b和c写出不会发生死锁的哲学家进餐程序。 (3)设计程序,实现生产者/消费者进程(线程)的同步与互斥。在该程序中创建4个进程(或
4、线程)模拟生产者和消费者,实现进程(线程)的同步与互斥。实验结果:使用a方法结果哲学家就餐问题使用b方法解决哲学家就餐问题源码如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#include <stdbool.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#incl
5、ude <sys/ipc.h>#include <sys/sem.h>#include <sys/wait.h>union semunint val;struct 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)struct sembuf sb=0,-1,0;semop(mutex,&sb,1);
6、/对互斥信号量进行操作/取得筷子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)struct sembuf sb=0,1,0;semop(semid0,&sb,1);/ph函数void ph(int num,int semid,i
7、nt semid0)int left=num;int right=(num+1)%5;for(;)printf("%d is thinkingn",num);sleep(1);printf("%d is hungryn",num);sleep(1);/wait操作,控制哲学家最多4人能进餐wait_mutex(semid0);wait_v(semid,left);wait_v(semid,right);printf("%d is eatingn",num);sleep(1);/signal操作signal_p(semid,right)
8、;/释放右筷子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;int i;for(i=0;i<5;i+)/semctl()系统调用在一个信号量集(或集合中的单个信号量)上执行各种控
9、制操作semctl(semid,i,SETVAL,su);/设定semid0信号量的初始值union semun su0;su0.val=4;semctl(semid0,0,SETVAL,su0);/创建4个子进程int num=0;pid_t pid;for(i=1;i<5;i+)pid=fork();if(pid<0) ERR_EXIT("fork");if(pid=0) num=i;break;/第num个哲学家要做的事ph(num,semid,semid0);return 0;执行结果使用c方法解决哲学家就餐问题#include <stdio.h&
10、gt;#include <stdlib.h>#include <string.h>#include <stdint.h>#include <stdbool.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/wait.h>union semunin
11、t val;struct 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(num,&sb,1);/释放筷子void signal_p(int semid,int num)struct sembuf sb=num,-1,0;semop(num,&sb,1);/科
12、学家要做的事void ph(int semid,int num)for(;)/死循环/判断哲学家的编号是奇数还是偶数/奇数先申请左边的筷子,偶数先申请右边的筷子if(num%2!=0)/判断奇数printf("%d is thinkingn",num);sleep(1);printf("%d is hungryn",num);sleep(1);/wait操作wait_v(semid,num);wait_v(semid,(num+1)%5);printf("%d is eatingn",num);sleep(1);/signal操作si
13、gnal_p(semid,(num+1)%5);signal_p(semid,num);if(num%2=0)/判断偶数printf("%d is thinkingn",num);sleep(1);printf("%d is hungryn",num);sleep(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)int semid;/
14、创建5个信号量semid=semget(IPC_PRIVATE,5,IPC_CREAT | 0666);union semun su;su.val=1;int i;for(i=0;i<5;i+)/注意第二个参数也是索引semctl(semid,i,SETVAL,su);/创建4个子进程pid_t pid;int num=5;for(i=0;i<4;i+)pid=fork();if(pid<0) ERR_EXIT("fork");if(pid=0) num=i;break;/哲学家要做的事ph(semid,num);return 0;生产者和消费者的同步与互
15、斥源代码如下:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#define N 2 / 消费者或者生产者的数目#define M 10 / 缓冲数目int in = 0; / 生产者放置产品的位置int out = 0; / 消费者取产品的位置int buffM = 0; / 缓冲初始化为0, 开始时没有产品sem_t empty_sem; / 同步信号量, 当满了时阻止生产者放产品se
16、m_t full_sem; / 同步信号量, 当没产品时阻止消费者消费pthread_mutex_t mutex; / 互斥信号量, 一次只有一个线程访问缓冲int product_id = 0; /生产者idint prochase_id = 0; /消费者id/* 打印缓冲情况 */void print()int i;for(i = 0; i < M; i+) printf("%d ", buffi);printf("n");/* 生产者方法 */ void *product()int id = +product_id;while(1) / 用
17、sleep的数量可以调节生产和消费的速度,便于观察 sleep(1); /sleep(1); sem_wait(&empty_sem); pthread_mutex_lock(&mutex); in = in % M; printf("product%d in %d. like: t", id, in); buffin = 1; print(); +in; pthread_mutex_unlock(&mutex); sem_post(&full_sem); /* 消费者方法 */void *prochase()int id = +procha
18、se_id;while(1) / 用sleep的数量可以调节生产和消费的速度,便于观察 sleep(1);/sleep(1); sem_wait(&full_sem); pthread_mutex_lock(&mutex); out = out % M; printf("prochase%d in %d. like: t", id, out); buffout = 0; print(); +out; pthread_mutex_unlock(&mutex); sem_post(&empty_sem);int main()pthread_t i
19、d1N;pthread_t id2N;int i;int retN;/ 初始化同步信号量int ini1 = sem_init(&empty_sem, 0, M); int ini2 = sem_init(&full_sem, 0, 0); if(ini1 && ini2 != 0) printf("sem init failed n"); exit(1); /初始化互斥信号量 int ini3 = pthread_mutex_init(&mutex, NULL);if(ini3 != 0) printf("mutex init failed n"); exit(1); / 创建N个生产者线程for(i = 0; i < N; i+) reti = pthrea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年江西省《保密知识竞赛必刷100题》考试题库附答案详解【达标题】
- 青海省第五人民医院青海省肿瘤医院招聘急救医师及检验师灵活用工(临时聘用)考试备考题库及答案解析
- 2026年县乡教师选调考试《教育学》考前冲刺测试卷包带答案详解(考试直接用)
- 2026山西太原市迎泽区选聘公益性岗位人员40人考试参考题库及答案解析
- 2025年注册消防工程师之《消防安全技术实务》通关题库附答案详解(a卷)
- 2026上海崇明区教育事务服务保障中心后勤保障人员招聘1人考试备考题库及答案解析
- 2026四川德阳市人民医院非全日制工作人员招聘1人笔试备考试题及答案解析
- 2026岳麓山实验室、湖南农业大学第一批高层次人才公开招聘30人笔试参考题库及答案解析
- 2026广西百色市西林县驮娘江水务有限责任公司招聘7人考试备考题库及答案解析
- 2026年押题宝典县乡教师选调考试《教育学》题库及参考答案详解1套
- 酒店委托经营管理合同-(5000字)1
- 第十五届全国电力行业职业技能竞赛(碳排放管理员)考试题库(含答案)
- 敦煌文化之旅智慧树知到期末考试答案章节答案2024年杭州师范大学
- 【S医药公司销售人员招聘体系优化探究开题报告文献综述9800字】
- 重力坝毕业设计
- T-CSEM 0024-2024 智慧消防 火灾防控系统建设要求
- 动脉取栓术后护理查房课件
- 《电机原理及拖动(第3版)》彭鸿才(习题与思考题解答)
- GB/T 18926-2008包装容器木构件
- 朱自清:桨声灯影里的秦淮河课件
- 配饰礼仪课件
评论
0/150
提交评论