一、实验目的: 了解和熟悉共享存储机制
|
编制一长度为 1k 的共享存储区发送和接收的程序。 |
三、实验步骤及结果: //把实验运行过程和相关代码,或者实验结果等截图拷贝过来 1、了解共享存储区的机制 共享存储区(Share Memory)是 UNIX 系统中通信速度最高的一种通信机制。该机制可使若干进程共享主存中的某一个区域,且使该区域出现(映射)在多个进程的虚地址空间中;每个共享存储区都有自己的名字。 如图所示: 进程 A 将建立的共享存储区附接到自己的 AA’区域,进程 B 将它附接到BB’区域。 【注意:使用共享存储区机制时,必须自己设置同步和互斥措施才能保证实现正确的通信】 2、使用gedit命令创建文件存放使用共享存储区的代码 3、利用gcc命令编译程序,检查代码是否错误 修改方式:修改标点符号;添加头文件 【对应wait函数与fork函数】 【编译通过】 4、了解与共享存储区机制有关的系统调用 其中: key 是共享存储区的名字; size 是其大小(以字节计); flag 是用户设置的标志,如 IPC_CREAT。IPC_CREAT 表示若系统中尚无指名的共享存储区,则由核心建立一个共享存储区;若系统中已有共享存储区,便忽略 IPC_CREAT。 其中: shmid 是共享存储区的标识符; addr 是用户给定的,将共享存储区附接到进程的虚地址空间; flag 其值为 SHM_RDONLY 时,表示只能读;其值为 0 时,表示可读、可写; 该系统调用的返回值是共享存储区所附接到的进程虚地址viraddr。 其中:addr是要断开连接的虚地址,亦即以前由连接的系统调用 shmat( )所返回的虚地址 其中: buf 是用户缓冲区地址; cmd 是操作命令。命令可分为多种类型: (1)用于查询有关共享存储区的情况。如其长度、当前连接的进程数、共享区的创建者标识符等; (2)用于设置或改变共享存储区的属性。如共享存储区的许可权、当前连接的进程计数等; (3)对共享存储区的加锁和解锁命令; (4)删除共享存储区标识符等。 5、执行程序并分析运行结果 实验现象: 在运行过程中:每当 client 发送一次数据后,server 要等待大约 0.1 秒才有响应。同样,之后 client 又需要等待大约 0.1 秒才发送下一个数据。 分析: 出现上述应答延迟的现象是程序设计的问题。 当 client 端发送了数据后,并没有任何措施通知 server 端数据已经发出,需要由 client 的查询才能感知。此时,client 端并没有放弃系统的控制权,仍然占用 CPU 的时间片。 只有当系统进行调度时,切换到了 server 进程,再进行应答。这个问题,也同样存在于 server 端到 client 的应答过程中。 【程序每执行一次,shmid的值加1】 |
1、比较两种通信机制(消息队列机制与共享区机制)中数据传输的时间和性能 由于两种机制实现的机理和用处都不一样,难以直接进行时间上的比较。如果比较其性能,应更加全面的分析。 (1)消息队列的建立比共享区的设立消耗的资源少。前者只是一个软件上设定的问题,后者需要对硬件的操作,实现内存的映像,当然控制起来比前者复杂。如果每次都重新进行队列或共享的建立,共享区的设立没有什么优势。 (2)当消息队列和共享区建立好后,共享区的数据传输,受到了系统硬件的支持,不耗费多余的资源;而消息传递,由软件进行控制和实现,需要消耗一定的 cpu 的资源。从这个意义上讲,共享区更适合频繁和大量的数据传输。 (3)消息的传递,自身就带有同步的控制。当等到消息的时候,进程进入睡眠状态,不再消耗 cpu 资源。而共享队列如果不借助其他机制进行同步,接收数据的一方必须进行不断的查询,白白浪费了大量的 cpu 资源。可见,消息方式的使用更加灵活。 |
共享区机制更适用于频繁和大量的数据传输,实现共享区机制的关键同样在于灵活调用涉及到的函数,完成信息的发送与接收。 |