山大操作系统实验五
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东大学软件学院操作系统实验报告
实验题目:进程互斥实验
实验目的:
进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。观察和体验非对称性互斥问题的并发控制方法。进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。
实验要求:
理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。
在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。
请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。
总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识为什么会出现进程饥饿现象本实验的饥饿现象是怎样表现的怎样解决并发进程间发生的饥饿现象您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识根据实验程序、调试过程和结果分析写出实验报告。
硬件环境:
CPU: P4/ 内存:256MB 硬盘: 10GB
软件环境:
-Linux 操作系统
Gnome 桌面 '
gcc version
vi
gedit
OpenOffice
实验步骤:
1.问题分析
假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。
在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。
2.算法设计说明
该解法利用消息队列的每条消息代表每个顾客,将进入等候室的顾客组织到一个队列,将坐入沙发的顾客组织到另一个队列。理发师从沙发队列请出顾客,空出的沙发位置再从等候室请入顾客进入沙发队列。三个理发师进程使用相同的程序段上下文,所有顾客使用同一个程序段上下文。这样可避免产生太多进程,以便节省系统资源。
int sem_p(int semid, int index, int ipc_nowait) { 程间的互斥2.理发师类似读者进程,顾客类似写者进程。最后,通过不断的调试,使我熟练了在Linux环境下编程的技巧,对进程的创建与控制更加熟悉。
附录 A:本实验全部程序源代码及注释
#ifndef CZW_IPC_H_INCLUDED
#define CZW_IPC_H_INCLUDED
#include<>
#include
#include
int sem_create(const char *pathname, int proj_id, int nsems, int init_value) { key_t keyid;
int semid, i;
if((keyid = ftok(pathname, proj_id)) == -1) {
perror("ftok error!");
return -1;
}
if((semid = semget(keyid, nsems, IPC_CREAT | 0666)) < 0) {
perror("semget error!");
return -1;
}
for(i = 0; i < nsems; i++) {
semctl(semid, i, SETVAL, init_value);
}
return semid;
}
int sem_delete(const char *pathname, int proj_id) {
key_t keyid;
int semid, i;
if((keyid = ftok(pathname, proj_id)) == -1) {
perror("ftok error!");
return -1;
}
if((semid = semget(keyid, 0, 0666)) < 0) {
perror("semget error!");
return -1;
}
if(semctl(semid, 0, IPC_RMID) < 0) {
perror("sem delete fail!");
return -1;
}
return 1;
}
int sem_set(int semid, int index, int value) {
if(index == -1) {
, 10);
sem_delete(".", 11);
msg_delete(".", 31);
sem_delete(".", 110);
exit(0);
}
int main() {
int wait_semid = sem_create(".", 10, 3, 0);
int wait_lock_semid = sem_create(".", 11, 4, 0);
int wait_msg = msg_create(".", 31);
int cash_semid = sem_create(".", 110, 1, 1);
debug && printf("\twait_semid is %d\n", wait_semid);