操作系统原理 进程通信共享内存
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实践报告书课程名称:操作系统原理
题目:进程通信-共享内存
学生姓名:
专业:计算机科学与技术(网络方向)
班别:计科本113班
学号:1104402308
指导老师:
日期:2013 年06 月25 日
目录
一、基本要求 (2)
二、流程图分析 (3)
三、共享内存描述和使用 (10)
3.1共享内存的概述 (10)
3.2共享内存的原理 (11)
3.3共享内存的分配 (12)
3.4 共享内存的访问 (13)
3.5共享内存的应用 (13)
3.6共享内存的意义 (14)
四、实验构思 (14)
4.1 main()的使用 (14)
4.2 shmget()调用 (16)
4.3 fork()的调用 (16)
4.4 子进程调用shmat() (17)
4.5子进程调用shmdt() (17)
4.6 父进程调用 shmctl() (17)
4.7父进程调用shmat(),shmdt(),shmctl() (18)
五、实验的调试与测试 (18)
六、实验结果 (20)
七、源程序 (21)
八、实验感受 (23)
九、参考文献 (24)
一、基本要求
1.1实验题目:进程通信共享内存
1.2实践目的:用代码实现进程通信共享内存
1.3实践内容:用C语言代码创建进程,实现进程通信共享内存(父进程和子进程通过共享内存实现信息的交流)
1.4实验环境:linux操作系统及gcc工具
二、流程图分析
图1-1
如图1-1首先父进程调用shmget()函数建立一个共享内存,该函数返回一内存的标识符。
图1-2
如图1-2父进程调用fork()产生一个子进程
图1-3
如图1-3子进程调用shmat()函数将该共享内存连接到自己的虚存空间中
图1-4
如图1-4写完数据后,子进程调用shmdt()函数断开与该进程的连接
如图1-5
如图1-5父进程调用shmctl()函数得到关于这块共享内存的相关信息,并打印出来
图1-6
如图1-6父进程调用shmat()函数将这块共享内存连接到自己的虚存空间
图1-7
如图1-8父进程调用shmdt()函数断开与该共享内存的连接
图1-8
如图1-8父进程调用shmctl()函数,销毁该共享进程。
三、共享内存描述和使用
3.1共享内存的概述
针对消息缓冲需要占用CPU进行消息复制的缺点,操作系统提
供了一种进程间直接进行数据交换的通信方式——共享内存。顾名思义,这种通信方式允许多个进程共享同一块物理内存空间来实现进程之间的信息交换,其特点是没有中间环节,直接将共享的内存页面通过附接,映射到相互通信的进程各自的虚拟地址空间中,从而使多个进程可以直接访问同一个物理内存页面,如同访问自己的私有空间一样(但实质上不是私有的而是共享的)。因此这种进程间通信方式是在同一个计算机系统中的诸进程间实现通信的最快捷的方法,而它的局限性也在于此,即共享内存的诸进程必须共处同一个计算机系统,有物理内存可以共享才行。
3.2共享内存的原理
共享内存是由IPC为一个进程所创建并且出现在这个进程的地
址空间中的一段特殊的地址序列。其他的进程可以将同样的共享内存段关联到他们自己的地址空间中。所有的进程都可以访问这段内存地址,就如同这段内存是由malloc所分配的。如果一个进程写入共享内存,这些改变立即就可以为访问相同共享内存的其他进程所见。就其自身而言,共享内存并没有提供任何共享方法。并没有自动的方法来阻止在第一个进程完成写入共享内存之前第二个进程开始读取共
享内存。
3.3共享内存的分配
要使用一块共享内存,进程必须首先分配它。随后需要访问这个
进程释放该共享内存块。
尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。
分配一个新的共享内存块会创建新的内存页面。因为所有进程都希望共享对同一块内存的访问,只应由一个进程创建一块新的共享内存。再次分配一块已经存在的内存块不会创建新的页面,而只是会返回一个标识该内存块的标识符。一个进程如需使用这个共享内存块,则首先需要将它绑定到自己的地址空间中。这样会创建一个从进程本身虚拟地址到共享页面的映射关系。当对共享内存的使用结束之后,这个映射关系将被删除。当再也没有进程需要使用这个共享内存块的时候,必须有一个(且只能是一个)进程负责释放这个被共享的内存页面。
所有共享内存块的大小都必须是系统页面大小的整数倍。系统页面大小指的是系统中单个内存页面包含的字节数。进程通过调用shmget来分配一个共享内存块。
该函数的第二个参数指定了所申请的内存块的大小。因为这些内存块是以页面为单位进行分配的,实际分配的内存块大小将被扩大到页面大小的整数倍。
3.4 共享内存的访问
要让一个进程获取对一块共享内存的访问,这个进程必须先调用shmat(SHared Memory Attach,绑定到共享内存)。将 shmget 返
用于映射。
3.5共享内存的应用
共享内存的通信方式是通过将可以共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的,因此,这些进程之间的读写操作的同步问题操作系统无法实现,必须由诸共享该内存的进程去控制。另外,由于内存实体存在于计算机系统中,所以只能由处于同一个计算机系统中的诸进程共享。以上两点是共享内存通信的缺点,但是它提供了诸进程直接读写信息,无须复制,因而方便快捷的进程间通信方式,适用于信息量大且操作频繁的场合。