山东大学操作系统实验六Word文件下载.docx
- 文档编号:15156026
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:13
- 大小:101.33KB
山东大学操作系统实验六Word文件下载.docx
《山东大学操作系统实验六Word文件下载.docx》由会员分享,可在线阅读,更多相关《山东大学操作系统实验六Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
实验要求:
在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行车,如果同时有相向的火车行驶将会撞车。
请模拟实现两个方向行车,而不会出现撞车或长时间等待的情况。
您能构造一个管程来解决这个问题吗?
硬件环境:
实验室计算机
软件环境:
Ubuntu08.4-Linux操作系统
BASH_VERSION='
3.2.33
(1)-release
gccversion4.1.2
gedit2.18.2
OpenOffice2.3
实验步骤:
1.实验说明:
管程-Monitor
管程是一种高级抽象数据类型,它支持在它的函数中隐含互斥操作。
结合条件变量和其他一些低级通信原语,管程可以解决许多仅用低级原语不能解决的同步问题。
利用管程可以提供一个不会发生死锁或饥饿现象的对象;
哲学家就餐问题和Java语言中的synchronized对象都是很好的管程的例子.
管程封装了并发进程或线程要互斥执行的函数。
为了让这些并发进程或线程在管程内互斥的执行,进入管程的进/线程必须获取到管程锁或二值信号量
条件变量ConditionVariables
条件变量提供了一种对管程内并发协作进程的同步机制。
如果没有条件变量,管程就不会有很有用。
多数同步问题要求在管程中说明条件变量。
条件变量代表了管程中一些并发进程或线程可能要等待的条件。
一个条件变量管理着管程内的一个等待队列。
如果管程内某个进程或线程发现其执行条件为假,则该进程或线程就会被条件变量挂入管程内等待该条件的队列。
如果管程内另外的进程或线程满足了这个条件,则它会通过条件变量再次唤醒等待该条件的进程或线程,从而避免了死锁的产生。
所以,一个条件变量C应具有两种操作C.wait()和C.signal()。
当管程内同时出现唤醒者和被唤醒者时,由于要求管程内的进程或线程必须互斥执行,因此就出现了两种样式的条件变量:
MesaStyle(signal-and-continue):
唤醒者进程或线程继续执行,被唤醒者进程或线程等到唤醒者进程或线程阻塞或离开管程后再执行。
HoareStyle(signal-and-wait):
被唤醒者进程或线程立即执行,唤醒者进程或线程阻塞,直道被唤醒者阻塞或离开管程后再执行。
实验6单行道(过桥)问题可以通过管程很好的解决。
可以把单行道/桥封装为一个管程类,桥上通过的车辆是进入管程的进/线程,可以通过创建多个车辆进/线程并随机产生它们的行进方向,并指定桥上可同时行驶的车辆的个数来模拟该问题的各种现场随机情况。
一个正确的实验结果应能实现在各种随机现场情况下车辆进程不会逆向上桥(死锁),也不会使车少方向上的车辆无机会上桥(饥饿).
在linux系统中可以利用进程间通信(interprocesscommunication)IPC中的3个对象:
共享内存、信号灯数组、消息队列,来解决协作并发进程间的同步与互斥的问题。
1)共享内存是OS内核为并发进程间交换数据而提供的一块内存区(段)。
如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映射到自己私有的地址空间中。
如果一进程更新了段中数据,那么其他进程立即会看到这一更新。
进程创建的段也可由另一进程读写。
linux中可用命令ipcs-m观察共享内存情况。
$ipcs-m
------SharedMemorySegments--------
keyshmidownerpermsbytesnattchstatus
0x00000000327682student6003932162dest
0x00000000360451student6001966082dest
0x00000000393220student6001966082dest
key共享内存关键值
shmid共享内存标识
owner共享内存所由者(本例为student)
perm共享内存使用权限(本例为student可读可写)
byte共享内存字节数
nattch共享内存使用计数
status共享内存状态上例说明系统当前已由student建立了一些共享内存,每个都有两个进程在共享。
2)信号灯数组是OS内核控制并发进程间共享资源的一种进程同步与互斥机制。
linux中可用命令ipcs-s观察信号灯数组的情况。
$ipcs-s
------SemaphoreArrays--------
keysemidownerpermsnsems
0000000163844apache6001
0x4d00f259294920beagleind6008
0x00000159425995student6441
semid信号灯的标识号
nsems信号灯的个数
其他字段意义同以上共享内存所述。
上例说明当前系统中已经建立多个信号灯。
其中最后一个标号为425996是由student建立的,它的使用权限为644,信号灯数组中信号灯个数为1个。
3)消息队列是OS内核控制并发进程间共享资源的另一种进程同步机制。
linux中可用命令ipcs-q观察消息队列的情况。
$ipcs-q
------MessageQueues--------
keymsqidownerpermsused-bytesmessages
0x000001c80root64481
msgmid消息队列的标识号
used-bytes消息的字节长度
messages消息队列中的消息条数
其他字段意义与以上两种机制所述相同。
上例说明当前系统中有一条建立消息队列,标号为0,为root所建立,使用权限为644,每条消息8个字节,现有一条消息。
4)在权限允许的情况下您可以使用ipcrm命令删除系统当前存在的IPC对象中的任一个对象。
ipcrm-m21482删除标号为21482的共享内存。
ipcrm-s32673删除标号为32673的信号灯数组。
ipcrm-q18465删除标号为18465的消息队列。
5)在linux的proc文件系统中有3个虚拟文件动态记录了由以上ipcs命令显示的当前IPC对象的信息,它们分别是:
/proc/sysvipc/shm共享内存
/proc/sysvipc/sem信号量
/proc/sysvipc/msg消息队列
我们可以利用它们在程序执行时获取有关IPC对象的当前信息。
6)IPC对象有关的系统调用函数原型都声明在以下的头文件中:
#include<
sys/types.h>
sys/ipc.h>
创建一段共享内存系统调用语法:
sys/shm.h>
intshmget(key_tkey,intsize,intflags);
key共享内存的键值,可以为IPC_PRIVATE,也可以用整数指定一个
size共享内存字节长度
flags共享内存权限位。
shmget调用成功后,如果key用新整数指定,且flags中设置了IPC_CREAT位,则返回一个新建立的共享内存段标识符。
如果指定的key已存在则返回与key关联的标识符。
不成功返回-1
令一段共享内存附加到调用进程中的系统调用语法:
char*shmat(intshmid,char*shmaddr,intflags)
shmid由shmget创建的共享内存的标识符
shmaddr总为0,表示用调用者指定的指针指向共享段
flags共享内存权限位
shmat调用成功后返回附加的共享内存首地址
令一段共享内存从到调用进程中分离出去的系统调用语法:
intshmdt(char*shmadr);
shmadr进程中指向附加共享内存的指针
shmdt调用成功将递减附加计数,当计数为0,将删除共享内存。
调用不成功返回-1。
创建一个信号灯数组的系统调用有语法:
sys/sem.h>
intsemget(key_tkey,intnsems,intflags);
key信号灯数组的键值,可以为IPC_PRIVATE,也可以用整数指定一个
nsems信号灯数组中信号灯的个数
flags信号灯数组权限位。
如果key用整数指定,应设置IPC_CREAT位。
semget调用成功,如果key用新整数指定,且flags中设置了IPC_CREAT位,则返回一个新建立的信号等数组标识符。
如果指定的整数key已存在则返回与key关联的标识符。
操作信号灯数组的系统调用语法:
intsemop(intsemid,structsembuf*semop,unsignednops);
semid由semget创建的信号灯数组的标识符
semop指向sembuf数据结构的指针
nops信号灯数组元素的个数。
semop调用成功返回0,不成功返回-1。
控制信号灯数组的系统调用语法:
intsemctl(intsemid,intsemnum,intcmd,unionsemunarg);
semnum该信号灯数组中的第几个信号灯
cmd对信号灯发出的控制命令。
例如:
GETVAL返回当前信号灯状态
SETVAL设置信号灯状态
IPC_RMID删除标号为semid的信号灯
arg保存信号灯状态的联合体,信号灯的值是其中一个基本成员
unionsemun{
intval;
/*valueforSETVAL*/
......
};
semctl执行不成功返回-1,否则返回指定的cmd的值。
创建消息队列的系统调用语法:
#include<
sys/msg.h>
intmsgget(key_tkey,intflags)
key消息队列的键值,可以为IPC_PRIVATE,也可以用整数指定一个
flags消息队列权限位。
msgget调用成功,如果key用新整数指定,且flags中设置了IPC_CREAT位,则返回一个新建立的消息队列标识符。
成功返回-1。
追加一条新消息到消息队列的系统调用语法:
sys.msg.h>
intmsgsnd(intmsqid,structmsgbuf*msgp,size_tmsgsz,intmsgflg);
msqid由消息队列的标识符
msgp消息缓冲区指针。
消息缓冲区结构为:
structmsgbuf{
longmtype;
/*消息类型,必须大于0*/
charmtext[1];
/*消息数据,长度应于msgsz声明的一致*/
}
msgsz消息数据的长度
msgflg为0表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东大学 操作系统 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)