欢迎来到天天文库
浏览记录
ID:15054499
大小:195.00 KB
页数:11页
时间:2018-08-01
《信号量机制共享存储区通信》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、本科生实验报告(五)姓名:学院:计算机科学学院专业:信息管理与信息系统班级:信管一班实验课程名称:操作系统实验日期:2013年12月5日指导教师及职称:实验成绩:开课时间:2012—2013学年一学期实验题目信号量机制、共享存储区通信小组合作姓名班级信管1班学号一、实验目的理解进程通信的原理,掌握信号量通信机制,熟悉信号量的构造、信号量的通信。理解进程通信的原理,掌握共享存储区通信机制,熟悉共享区的连接与断开,数据的发送与获取。二.实验环境Windows7,VirtualMachines,RedHatLinux三、实验内容(1)分别调用semget()、semop()、semctl(
2、)实现多个进程间的通信。编写一程序实现进程互斥共享文件的信号量的使用。(2)分别调用shmget()、shmat()、shmctl()实现多个进程间的通信。编写两程序,一个向共享段写信息,一个从共享段读信息。(3)调试并分析结果。四、实验过程与分析1、信号量的使用(1)参考程序,如图4.1。图4.1信号量的使用(2)运行结果,如图4.2所示。图4.216-6.c运行结果(3)结果分析:在linux系统V中,一个或多个信号量构成一个信号量集合。使用信号量机制用来实现进程间的同步和互斥,允许并发进程一次对一组信号量进行相同或不同的操作。每个P,V操作不限于减1或加1,而是可以加减任何整数
3、。在进程终止时,系统可以根据需要自动消除所有被进程操作过的信号量的影响。在第一个例子的程序中创建了5个并发子进程,互斥地对文件进行写操作,将自己的进程号写到文件中去,信号量的初值为1,当地一个进程执行update_file函数时首先将信号量值-1,(相当于P操作)致使其它进程等待无法操作文件,直到其结束后,将其值变为1后(相当于V操作),其它进程并发竞争对文件的写操作,并将自己的pid写入文件中。在linux中信号量机制的执行既步骤如下所示:(1)信号量的定义: structsemaphore{ spinlock_tlock; unsignedintcount; struct
4、list_headwait_list; }; 在linux中,信号量用上述结构体表示,我们可以通过该结构体定义一个信号量。 (2)信号量的初始化: 可用voidsema_init(structsemaphore*sem,intval);直接创建,其中val为信号量初值。 也可以用两个宏来定义和初始化信号量的值为1或0: DECLARE_MUTEX(name):定义信号量name并初始化为1 DECLARE_MUTEX_LOCKED(name):定义信号量name并初始化为0 还可以用下面的函数初始化: voidinit_MUTEX(structsemaphore*s
5、em);//初始化信号量的值为1 voidinit_MUTEX_LOCKED(structsemaphore*sem);//初始化信号量的值为0 (3)信号量的原子操作: p操作: *voiddown(structsemaphore*sem);//用来获取信号量,如果信号量值大于或等于0,获取信号量,否则进入睡眠状态,睡眠状态不可唤醒 *voiddown_interruptible(structsemephore*sem);//用来获取信号量,如果信号量大于或等于0,获取信号量,否则进入睡眠状态,等待信号量被释放后,激活该程。 *voiddown_trylock(struc
6、tsemaphore*sem);//试图获取信号量,如果信号量已被其他进程获取,则立刻返回非零值,调用者不会睡眠 v操作: *voidup(structsemaphore*sem);//释放信号量,并唤醒等待该资源进程队列的第一个进程2、进程从共享段读写信息(1)进程从共享段写信息参考程序,如图4.3所示;进程从共享段读信息参考程序,如图4.4所示。图4.3进程从共享段写信息图4.4进程从共享段读信息(2)运行结果,如图4.5和图4.6所示。图4.516-7.c的运行结果图4.616-8的运行结果(3)结果分析共享主存段为进程提供了直接通过主存进行通信的有效手段,不像消息缓存机制
7、那样需要系统提供缓存,也不像pipe机制那样需要事先建立一个特殊文件,而是有通信双方直接访问某些共享虚拟存储器空间。在系统V中,系统管理一组共享主存段控制块。通信进程在使用共享主存段以前,首先提出申请,系统为止分配存储空间并返回共享主存段标识号。一个共享段建立后,进程把它被附加到自己的虚拟存储空间中。一个进程可以附加多个共享主存段。一个主存段一旦被附加到进程的虚拟机空间后,对它的访问以其他虚拟机的访问完全相同。但为了保证共享主存段数据完整性,通信的进程之间
此文档下载收益归作者所有