python进阶之进程间通信方式之一消息队列

来源:互联网 发布:ubuntu 删除开机启动 编辑:程序博客网 时间:2024/06/05 06:44
        为了和其他系统保持兼容,Linux 也提供三种首先出现在 UNIX System V 中的 IPC 机制。这三种机制分别是:消息队列、信号量以及共享内存。System V IPC 机制主要有如下特点:
如果进程要访问 System V IPC 对象,则需要在系统调用中传递唯一的引用标识符。
对 System V IPC 对象的访问,必须经过类似文件访问的许可检验。对这些对象访问权限的设置由对象的创建者利用系统调用设置。对象的引用标识符由 IPC 机制作为访问对象表的索引,但需要一些操作来生成索引。在 Linux 中,所有表示System V IPC 对象的数据结构中都包含一个 ipc_perm 结构,该结构中包含了作为对象所有者和创建者的进程之用户标识符和组标识符,以及对象的访问模式和对象的访问键。访问键用来定位System V IPC 对象的引用标识符。系统支持两种访问键:公有和私有。如果键是公有的,则系统中所有的进程通过权限检查后,均可以找到System V IPC 对象的引用标识符。但是,只能通过引用标识符引用 System V IPC 对象。Linux 对这些 IPC 机制的实施大同小异,我们在这里只主要介绍其中两种:消息队列和信号量。
11.7.1 消息队列
       一个或多个进程可向消息队列写入消息,而一个或多个进程可从消息队列中读取消息,这种进程间通讯机制通常使用在客户/服务器模型中,客户向服务器发送请求消息,服务器读取消息并执行相应请求。在许多微内核结构的操作系统中,内核和各组件之间的基本通讯方式就是消息队列。例如,在 MINIX 操作系统中,内核、I/O 任务、服务器进程和用户进程之间就是通过消息队列实现通讯的。
       Linux 为系统中所有的消息队列维护一个 msgque 链表,该链表中的每个指针指向一个 msgid_ds 结构,该结构完整描述一个消息队列。当建立一个消息队列时,系统从内存中分配一个 msgid_ds 结构并将指针添加到 msgque 链表。
      
        

      
      
     
      
      
 
       图 11-7 是 进程通信的示意图。
从图中可以看出,每个 msgid_ds 结构都包含一个 ipc_perm 结构以及指向该队列所包含的消息指针,显然,队列中的消息构成了一个链表。另外,Linux 还在 msgid_ds 结构中包含一些有关修改时间之类的信息,同时包含两个等待队列,分别用于队列的写入进程和队列的读取进程。图 11-7 System V IPC 机制--消息队列
消息队列的写入操作和读取操作是类似的,以消息的写入为例,步骤如下:
        1. 当某个进程要写入消息时,该进程的有效 uid 和 gid 首先要和 ipc_perm 中的访问模式进行比较。如果进程不能写入,系统调用返回错误,写操作结束。
        2. 如果该进程可以向消息队列写入,则消息可以复制到消息队列的末尾。在进行复制之前,必须判断消息队列当前是否已满。消息的具体内容和应用程序有关,由参与通讯的进程约定。
        3. 如果消息队列中当前没有空间容纳消息,则写入进程被添加到该消息队列的写等待队列,否则,内核分配一个 msg 结构,将消息从进程的地址空间中复制到 msg 结构,然后将 msg 添加到队列末尾,这时,系统调用成功返回,写操作结束。
        4. 调用调度程序,调度程序选择其他进程运行,写操作结束。
如果有某个进程从消息队列中读取了消息,则系统会唤醒写等待队列中的进程。
读取操作和写入操作类似,但进程在没有消息或没有指定类型的消息时进入等待状态。
原创粉丝点击