操作系统实验报告。
一、 实验题目: linux或windows或unix环境下,采用系统调用中的信号量、p、v操作,编程解决理发师问题:一个理发店由一间等候室w和一间工作室b组成。
顾客可以从外面大街上进入w等候理发。两个房间的入口是并排的,且共享一扇日本式可滑动的推拉门(门总是挡住一个入口)。顾客在工作室内理完发,可由b的旁门出去。
w中有n把椅子,顾客必须坐着等候。理发师可由门上小窗查看w中无人就睡觉,否则开门,并叫一位顾客入内理发。顾客每进入一位,都拉铃通知理发师。
若把顾客和理发师都视为进程,请用p、v操作写出进程的同步算法。
二、 实验目的:了解并掌握进程通信与进程同步机制。
三、 实验要求:在windows环境下,采用系统调用,编程实现读者、写者问题,具体的要求为:一个数据集(如一个文件或记录)为多个并发进程所共享,其中一些进程只要求读该数据集的内容,这些进程称为“读者”,而另一些进程则要求修改该数据集的内容,这些进程称为“写者”。
具体要求是:允许多个读者同时读该数据集的内容,但是,若有一个写者在写,则其他读者不能读,若有一个写者在写或有其他读者在读,则其他写者均被拒绝。当一个写者正在写,而有多个读者与写者在等待时,写者应优先唤醒。
读者进去读、等待,写者进去写、等待等状态均在屏幕上打印出来。
四、 实验原理及算法。
原理:本实验采用pv操作,具体操作顺序如下:
semaphore s,s1,s2;
检查能否进入等候区,s2检查理发师是否空闲s1是互斥信号量,检查门是否能开。
process 顾客。
p(&s);/查看是否能够进入等候区。
p(&s1);/检查门是否能够打开,顾客推门进入理发店;
v(&s1);/释放门资源,拉铃通知理发师并坐着等待理发;
v(&s2);/唤醒理发师。
proess理发师。
p(&s2);/检查理发师是否空闲。
p(&s1);/查看门是否能开,开门叫一位顾客入内理发;
v(&s1);/释放门资源。
v(&s);/释放等候区资源,顾客理完发从b的旁门出去;
算法:本次实验即反复调用p、v函数,根据上述顺序,进行一些资源的开发与释放后,进行p、v操作,来完成实验要求。
linux操作系统环境下c的编译:
---编辑环境一般采用vi;
---编译命令: g++ 源文件名可执行文件名。
用到的相关系统调用。
---shmget( )开辟共享存储区。
---semget():用于产生一个信号量数组或查找已创建的信号量数组的描述字。其中,semkey是用户指定的关键字,count规定信号量数组的长度,flag为操作标志。
--semop():用于进行p、v操作。其中,semid是semget返回的描述字,oplist是用户提供的操作数组的指针,count是该数组的大小。
semop返回最后被操作的信号量在操作完成前的值。oplist中的每个元素包含三个内容;信号量序号、欲进行的操作值和标识。
基本使用格式。
gcc [ 选项] 《文件名》
必须包含的头文件:
#include
#include
#include
#include
#include <>
用到的数据结构:sembuf
p操作的实现:
设置oplist中的欲进行的操作值为-1, 后执行semop。
例如程序段如下:
structsembuf psembuf;
semid = semget (semkey,2, 0777);
= first;
= sem_undo;
semop(semid, &psembuf, 1);
v操作的实现:
设置oplist中的欲进行的操作值为1, 后执行semop。
例如程序段如下:
structsembuf psembuf;
semid = semget (semkey,2, 0777);
= first;
= sem_undo;
semop(semid, &psembuf, 1);
五、 主要数据结构。
*生产者。#include
#include
#include
#include
#include <>
#include <>
#define shmkey 9075 /*共享存储区的键*/
#define semkey_barber 9085
#define semkey_customer 9086
#define semkey_mutex 9087 /*信号量数组的键*//注意:上面的键在系统中必须唯一*/
#define buff_len 1 /*缓冲区可以存放10个产品*/
#define product_len 32 /*每个产品是一个字符串:<=32字符*/
int p(intsemid)
int v(intsemid)
voidset_sembuf_struct(structsembuf *sem,intsemnum, intsemop,intsemflg)
六、 流程图。
p、v操作的流程图:否。是。
否。是。
七、 实验测试结果及结果分析。
测试结果:结果分析:
由上面在linux系统下进行操作的截图可知,在预先设置了等候区的位置数为5之后,输入customer指令,系统自动引入一位顾客,输入barber指令后,系统指示理发师对客人进行理发操作。
八、 课程设计总结。
经过本次实验,对pv操作有了更深层次的理解,平时在上。
课时,仅仅是对该操作有书面上的了解,包括后来在期末考试复习阶段,也只是对题目上面的理解。具体到课程设计上,刚开始按照老师的要求写出了简单的流程,然后开始编写程序。程序编写好之后,发现对linux系统的了解少之又少,操作也很有问题。
在同学的帮助下,学会了怎样在电脑原有程序下安装linux系统,并且学会了在linux系统中对所编写的程序的操作。可以说,自己得到的收获是相当大的。并且自身对linux系统也产生了一定的兴趣,接下来会找时间做具体研究。
九、 源程序清单。
*生产者。#include
#include
#include
#include
#include <>
#include <>
#define shmkey 9075 /*共享存储区的键*/
#define semkey_barber 9085
#define semkey_customer 9086
#define semkey_mutex 9087 /*信号量数组的键*//注意:上面的键在系统中必须唯一*/
#define buff_len 1 /*缓冲区可以存放10个产品*/
#define product_len 32 /*每个产品是一个字符串:<=32字符*/
*下面的p,v是对系统调用的简单封装*/
int p(intsemid)
structsembufp_buf;p_p_
p_if(semop(semid,&p_buf,1)==1)/*semop参见课件ppt*/
elsereturn (0);
int v(intsemid)
structsembufv_buf;/*structsembuf 参见课件ppt*/v_v_
v_if(semop(semid,&v_buf,1)==1)
elsereturn (0);
main()
char *p_buffer;/*共享存储区地址*/
intshmid;/*共享存储区id*/
intsemid_barber,semid_customer,semid_mutex;/*信号量集合id*/
shmid=shmget(shmkey,buff_len * product_len,0777);/连接共享存储区:2 存放in,out的值*/
p_buffer=(char*)shmat(shmid,0,0);/取共享存储区地址*/
semid_mutex=semget(semkey_mutex,1,0777);/获取全局信号量id*/
semid_barber=semget(semkey_barber,1,0777);
semid_customer=semget(semkey_customer,1,0777);
/*从屏幕接收产品*/
/*进入临界区*/
p(semid_barber);/对私有信号量作p操作*/
p(semid_mutex);/对公有信号量作p操作*//二者顺序不能换*/
printf("a waiting customer enter in the studio");
shmdt(p_buffer); 离开缓冲区*/
sleep(10);
/*离开临界区*/
v(semid_customer);
操作系统课程设计报告
西安郵電大學。院系名称 计算机学院。专业名称 软件工程。班级 1104 学生姓名 赵大伟。学号 8位 04113124 指导教师 舒新峰。设计起止时间 2013.11.10 2013.11.20 1 通过观察 分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在posix 规范中...
操作系统课程设计报告
课程设计。课程名称操作系统。题目名称多级文件系统 2 学生学院计算机学院 专业班级。学号。学生姓名。指导教师。年月日。目录。一 课程设计 6 二 开发工具及环境 6 三 设计内容 6 四 结构图 8 五 部分 9 六 运行截图 11 七 参考文献 15 八 心得体会 15 本课程设计要求设计一个模拟...
操作系统课程设计报告
实验一进程管理。一 实验目的。1 开发一个函数,建立进程控制块和资源控制块结构,并实现相关数据结构的初始化。2 开发一系列操作,由进程调用这些操作,达到控制进程申请或释放各种资源的目的。通过实验理解进程的概念,进程的组成 pcb结构 进程的并发执行和操作系统进行进程管理的相关原语 主要是进程的创建 ...