信号量机制、共享存储区通信_第1页
信号量机制、共享存储区通信_第2页
信号量机制、共享存储区通信_第3页
信号量机制、共享存储区通信_第4页
信号量机制、共享存储区通信_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本科生实验报告(五)姓名:学院:计算机科学学院专业:信息管理与信息系统 班级:信管一班实验课程名称:操作系统实验日期: 2013 年 12月5日指导教师及职称:实验成绩:开课时间:20122013 学年 一 学期实验题目信号量机制、共享存储区通信小组合作姓名班级信管1班学 号一、实验目的理解进程通信的原理,掌握信号量通信机制,熟悉信号量的构造、信号量的通信。理解进程通信的原理,掌握共享存储区通信机制,熟悉共享区的连接与断开,数据的发送与获取。二实验环境Windows 7,Virtual Machines,Red Hat Linux三、实验内容(1)分别调用semget()、semop()、se

2、mctl()实现多个进程间的通信。编写一程序实现进程互斥共享文件的信号量的使用。(2)分别调用shmget()、shmat()、shmctl()实现多个进程间的通信。编写两程序,一个向共享段写信息,一个从共享段读信息。(3)调试并分析结果。四、实验过程与分析1、信号量的使用(1) 参考程序,如图4.1。图4.1 信号量的使用(2) 运行结果,如图4.2所示。图4.2 16-6.c运行结果(3) 结果分析:在linux系统V中,一个或多个信号量构成一个信号量集合。使用信号量机制用来实现进程间的同步和互斥,允许并发进程一次对一组信号量进行相同或不同的操作。每个P,V操作不限于减1或加1,而是可以加

3、减任何整数。在进程终止时,系统可以根据需要自动消除所有被进程操作过的信号量的影响。在第一个例子的程序中创建了5个并发子进程,互斥地对文件进行写操作,将自己的进程号写到文件中去,信号量的初值为1,当地一个进程执行update_file函数时首先将信号量值-1,(相当于P操作)致使其它进程等待无法操作文件,直到其结束后,将其值变为1后(相当于V操作),其它进程并发竞争对文件的写操作,并将自己的pid写入文件中。在linux中信号量机制的执行既步骤如下所示:(1)信号量的定义:struct semaphore spinlock_t lock;unsigned int count;struct lis

4、t_head wait_list;在linux中,信号量用上述结构体表示,我们可以通过该结构体定义一个信号量。(2)信号量的初始化:可用void sema_init(struct semaphore *sem, int val);直接创建,其中val为信号量初值。也可以用两个宏来定义和初始化信号量的值为1或0:DECLARE_MUTEX(name) : 定义信号量name并初始化为1DECLARE_MUTEX_LOCKED(name) : 定义信号量name并初始化为0还可以用下面的函数初始化:void init_MUTEX(struct semaphore *sem); /初始化信号量的值为

5、1void init_MUTEX_LOCKED(struct semaphore *sem); /初始化信号量的值为0(3)信号量的原子操作:p操作:* void down(struct semaphore *sem); /用来获取信号量,如果信号量值大于或等于0,获取信号量,否则进入睡眠状态,睡眠状态不可唤醒* void down_interruptible(struct semephore *sem); /用来获取信号量,如果信号量大于或等于0,获取信号量,否则进入睡眠状态,等待信号量被释放后,激活该程。* void down_trylock(struct semaphore *sem);

6、 /试图获取信号量,如果信号量已被其他进程获取,则立刻返回非零值,调用者不会睡眠v操作:* void up(struct semaphore *sem); /释放信号量,并唤醒等待该资源进程队列的第一个进程2、进程从共享段读写信息 (1) 进程从共享段写信息参考程序,如图4.3所示;进程从共享段读信息参考程序,如图4.4所示。图4.3 进程从共享段写信息图4.4 进程从共享段读信息(2) 运行结果,如图4.5和图4.6所示。图4.5 16-7.c的运行结果图4.6 16-8的运行结果(3) 结果分析共享主存段为进程提供了直接通过主存进行通信的有效手段,不像消息缓存机制那样需要系统提供缓存,也不

7、像pipe机制那样需要事先建立一个特殊文件,而是有通信双方直接访问某些共享虚拟存储器空间。在系统V中,系统管理一组共享主存段控制块。通信进程在使用共享主存段以前,首先提出申请,系统为止分配存储空间并返回共享主存段标识号。一个共享段建立后,进程把它被附加到自己的虚拟存储空间中。一个进程可以附加多个共享主存段。一个主存段一旦被附加到进程的虚拟机空间后,对它的访问以其他虚拟机的访问完全相同。但为了保证共享主存段数据完整性,通信的进程之间要互斥的进行访问。当通信进程不再需要该共享主存段时,可使用命令将其与进程分离,从而使其进程的虚空间删除。在该例中首先进程向共享段写信息。该进程创建了长度为16k的共享

8、主存段,并将共享段附加到了地址空间为Addr的地址上。然后从共享段的起始单元开始写入020个自然数。等待接收进程读。首先要使用shmget得到共享存储区句柄(可以新建或连接已有的共享存储区,以关键字标识),然后使用shmat挂接到进程的存储空间(这样才能够访问)。然后进程从共享段读信息的例子,该进程首先将进程写信息共享段的共享段连接到自己的地址空间,之后,判断共享段是否有信息,若无,则等待,否则,读信息并显示。write进程创建了长度16k的共享主存段,并将共享段附加到了地址空间为addr的地址上,也显示了addr的值,然后从共享段的起始单元开始写入0-20个自然数,然后将首地址赋值为20,故

9、读进程read运行后,第一个数显示20,后面是1-19。这个程序最好在root下运行,在一般用户下运行不出结果。五、实验总结由实验可知:共享存储区是linux系统中通信速度最高的一种通信机制。该机制可使若干进程共享主存中的某一个区域,且使该区域出现(映射)在多个进程的虚地址空间中。另一方面,一个进程的虚地址空间中又可连接多个共享存储区,每个共享存储区都有自己的名字。当进程间欲利用共享存储区进行通信时,必须先在主存中建立一共享存储区,然后将它附接到自己的虚地址空间上。此后,进程对该区的访问操作,与对其虚地址空间的其它部分的操作完全相同。共享主存段在系统调用时,首先得申请一个共享主存段之后才能对共享存储进行操作。应当指出,共享存储区机制只为进程提供了用于实现通信的共享存储区和对共享存储区进行操作的手段,然而并未提供对该区进行互斥访问及进程同步的措施。因而当用户需要使用该机制时,必须自己设置同步和互斥措施才能保证实现正确的通信。对于已申请到通信所需要的共享段,进程需把它附加到自己的虚拟空间后才能对其进行读写。将共享段附加到申请通信的进程空间函数调用语法:#include<sys/sem.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论