实验二进程同步实验报告

上传人:pu****.1 文档编号:504136481 上传时间:2023-01-10 格式:DOCX 页数:8 大小:68.57KB
返回 下载 相关 举报
实验二进程同步实验报告_第1页
第1页 / 共8页
实验二进程同步实验报告_第2页
第2页 / 共8页
实验二进程同步实验报告_第3页
第3页 / 共8页
实验二进程同步实验报告_第4页
第4页 / 共8页
实验二进程同步实验报告_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《实验二进程同步实验报告》由会员分享,可在线阅读,更多相关《实验二进程同步实验报告(8页珍藏版)》请在金锄头文库上搜索。

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

2、 个互斥信 号量;想拿到筷子需要先对信号量做P操作,使用完释放筷子对信号量做V操作。 伪代码描述:semaphore chopstick5=1,1,1,1,1; 第 i 位哲学家的活动可描述为:doprintf(%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+1) % 5);/放右筷子whiletrue;运行该组进程,观察

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

4、验步骤:一、Linux的信号量机制为了简化对多个信号量的操作,Linux系统中提出了信号量集的概念。一个信号量集对 象中可以容纳多个信号量,System V信号量的分配和操作是以信号量集为单位的。1. 进程利用信号量获得共享资源的步骤:a. 测试控制该资源的信号量;b. 若信号量为正,则进程可以使用该资源;使用资源时,进程将该信号量减1(P操作);不再使用资源时,进程将该信号量值加1 (V操作);c. 若信号量为0,则进程进入睡眠状态P操作和V操作都原子操作。2. 创建或打开信号量集semge t()系统调用创建一个新信号量集或获取一个既有信号量集的表示符。函数原型:#include int

5、semget(key_t key, int nsems, int flag);返回值:成功返回信号量集ID,出错返回-1。nsems信号量集中信号量个数;flags: IPC_CREAT, IPC_EXCL,权限组合;第一个参数key是整数值(唯一非零),不相关的进程可以通过它访问一个信号量,它代表 程序可能要使用的某个资源,程序对所有信号量的访问都是间接的,程序先通过调用semget 函数并提供一个键,再由系统生成一个相应的信号标识符(semget函数的返回值),只有 semget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量 标识符。如果多个程序使用相同的k

6、ey值,key将负责协调工作。第三个参数sem_flags是一组标志,当想要当信号量不存在时创建一个新的信号量,可以和 值IPC_CREAT做按位或操作。设置了 IPC_CREAT标志后,即使给出的键是一个已有信号量的 键,也不会产生错误。而IPC_CREAT | IPC_EXCL则可以创建一个新的,唯一的信号量,如 果信号量已存在,返回一个错误。 注意:建立信号量集时每个信号量的初始值不确定。3. 信号量控制操作seme tl()系统调用在一个信号量集或集合中的单个信号量上执行各种控制操作。函数原型:#include int semctl (int semid, int semnum, in

7、t emd, /*union semun arg*/)semnum:信号量编号或0表示对指定信号量做控制操作;emd:操作命令,实施的控制操作;emd参数:IPC_STATIPC_SETIPC_RMID获取信号量集的属性设置信号量集的属性删除信号量集GETVAL返回semnum信号量的值SETVAL设置semnum信号量的值GETALL获取所有信号量的值SETALL设置所有信号量的初始值第四个参数是union semununion semunint val;struet semid_ds *buf; unsigned short *array; 例:定义一个信号量集,含3个信号量,初始值分别为

8、(2,5,1) 。semid = semget(IPC_PRIVATE,3,IPC_CREAT|IPC_EXCL|0777);unsigned short vals3 = 2,5,1;union semnu se;se.array = vals;semelt(semid,0,SETALL,se);4. 信号量集操作semop()系统调用在semid标识的信号量集中的信号量上执行一个或多个up或down操 作,可用于进程间的同步和互斥。函数原型:#include int semop(int semid, struct sembuf *semop, size_t nops);返回:成功返回 0,出

9、错返回-1。Struct sembufunsigned sem_num; /*member # in set*/short sem_op; /*operation(negative, 0, positive*/short sem_flg; /*IPC_NOWAIT,SEM_UNDO*/例:对上文定义的信号量集 semid 中的 3 个信号量,分别执行如下操作:1: p(1); 2: p(3); 3: v(3); 其 semop 的操作语句为:struct sembuf ops3 = 0, -1, SEM_UNDO, 1,-3, SEM_UNDO,2,3, SEM_UNDO; semop(sem

10、id, ops ,3);5. 组合权限说明0666 文件或目录的所有者、所有者所在组、其他用户对该对象均可读、可写 rw-rw-rw-0777 文件或目录的所有者、所有者所在组、其他用户对该对象均可读、可写、可执行 rwxrwxrwx 附:示例程序(左、右两只筷子均可用时才允许拿起筷子)#include #include #include #include #include #include #include #include #include #include #include #include #ifdef _SEM_SEMUN_UNDEFINEDunion semunint val;st

11、ruct semid_ds *buf;unsigned short *array;struct seminfo *_buf;#endif#define ERR_EXIT(m) do perror(m); exit(EXIT_FAILURE); while(0)int wait_1chopstick(int no,int semid)struct sembuf sb = no,-1,0;int ret;ret = semop(semid,&sb,1); if(ret 0) ERR_EXIT(semop);return ret;int free_1chopstick(int no,int semi

12、d)struct sembuf sb = no,1,0;int ret;ret = semop(semid,&sb,1); if(ret 0) ERR_EXIT(semop);return ret;#define DELAY (rand() % 5 + 1)void wait_for_2chopstick(int no,int semid)int left = no;int right = (no + 1) % 5;struct sembuf buf2 = left,-1,0, right,-1,0; semop(semid,buf,2);void free_2chopstick(int no

13、,int semid)int left = no;int right = (no + 1) % 5;struct sembuf buf2 = left,1,0, right,1,0;semop(semid,buf,2);void philosophere(int no,int semid)srand(getpid();for(;) #if 0printf(%d is thinkingn,no); sleep(DELAY);printf(%d is hungryn,no); wait_for_2chopstick(no,semid); printf(%d is eatingn,no); slee

14、p(DELAY);free_2chopstick(no,semid);#elseint left = no;int right = (no + 1) % 5;printf(%d is thinkingn,no); sleep(DELAY);printf(%d is hungryn,no); wait_1chopstick(left,semid); sleep(DELAY); wait_1chopstick(right,semid);printf(%d is eatingn,no); sleep(DELAY);free_1chopstick(left,semid); free_1chopstick(right,semid);#endifint main(int argc,char *argv)int semid;semid = semget(IPC_PRIVATE,5,IPC_CREAT | 0666); if(semid 0) ERR_EXIT(semid);union semun

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号