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