在共享存储器系统中,相互通信的进程共享某些数据结构或是共享存储区,进程之间能够通过这些空间进行通信。根据进程之间共享对象的类型将共享存储器系统分为两种:基于共享数据结构的通信方式、基于共享存储区的通信方式。
基本介绍
- 中文名:共享存储器系统
- 外文名:Shared-Memory System
- 两种类型:共享数据结构、共享存储区
- 共享数据结构:效率低,只适用于传递少量信息
- 共享存储区:效率高,可以传送较多的数据
- 针对Linux:共享区的建立、操纵、附接与断开
定义
共享存储器系统的方式是指,相互通信的进程共享某些数据结构或共享存储区来交换或传递数据。
类型
共享数据结构
进程之间能够通过某种类型的数据结构交换信息,如生产者-消费者问题中,便是利用有界缓冲区这种数据结构进行通信。在这种方式中,设定共享数据结构及对进程间同步的处理都是程式设计师的职责,这无疑增加了程式设计师的负担,而作业系统却只需提供共享存储器。这种通信方式的效率低,因此只适用于传递少量信息。
共享存储区
在提供这种通信方式的系统中,存储器中划出一块共享存储区,进程间可通过对共享存储区中的数据进行读或写来实现通信。进程在通信前应向系统申请共享存储区中的一个分区,并指定该分区的关键字,若系统已经给其他进程分配了这样的分区,则将该分区的描述符返回给申请者,接着,申请者把获得的共享存储区连线到本进程上,此后便可像读、写普通存储器一样地读、写存储分区。此种方法效率高,可以传送较多的数据。
共享存储实现
共享存储区的建立
当进程要利用共享存储区与另一进程进行通信时,必须先利用系统调用shmget()建立一块共享存储区,并提供该共享存储区的名字key和共享存储区以位元组为单位的长度size等参数。若系统中已经建立了指定的共享存储区,则该系统调用将返回该共享存储区的描述符shmid;若系统未建立,便为进程建立一个指定大小的共享存储区。
共享存储区的操纵
如同讯息机制一样,可以用系统调用shmctl()对共享存储区的状态信息进行查询,如长度、所连线的进程数、创建者标识符等等;也可设定或修改其属性,如共享存储区的许可权、当前连线的进程计数等;还可用来对共享存储区加锁或解锁,以及修改共享存储区标识符等。
共享存储区的附接与断开
当进程已经建立了共享存储区或已获得了其描述符后,还应利用系统给调用shmat()将该共享存储区附接到用户给定的某个进程的虚地址shmaddr上,并指定该存储区的访问属性,即指明该区是唯读,还是可读可写。此后,该共享存储区便成为该进程虚地址空间的一部分。进程可採取与对其虚地址空间一样的存取方法来访问。当进程不再需要该共享存储区时,再利用系统调用shmdt()把该区与进程断开。