• 17. 进程间通信 20100302 12:49 191人阅读 评论(0) 收藏


           前述,可将数据存放在使用锁保护的临时文件中即可实现一定意义上的共享数据,但此方法代价高,所以unix内核都包含了一组系统调用,这些系统调用不用与文件系统打交道就可支持进程间通信,分析常见的通信方式:

    1.       管道:
    它被视为文件,但在已安装的文件系统中无相应映射,POSIX只定义了半双工管道,但有些unix实现了全双工管道如System V Release 4。由于管道的实现方式,它完全可用于任意进程使用。在系统调用层面,管道一经创建,可用read、write操作,所以对每个管道必须创建一个索引节点对象及两个文件对象被VFS使用。这时,inode对象的i_pipe指向pipe_inode_info结构,它的bufs字段指向存有16个pipe_buffers对象的数组,其中每个对象代表一个管道缓冲区。它们组织成一个环形缓冲区。为避免对管道数据结构的竞争条件,内核用inode对象中i_sem信号量来实现同步。这里的VFS对象组成pipefs特殊文件系统,这种文件系统没有在系统目录树上安装,所以看不到,即pipefs文件系统将管道完全整合到VFS层。它在内核初始化期间被注册并安装。创建管道时先在pipefs文件系统中分配索引节点、再分配pipe_inode_info,将它的地址存在inode对象的i_pipe字段,将bufs即缓冲区中对象的字段清0。随后为管道的读与写通道各分配一个文件对象及一个文件描述符,最后分配一个目录项对象,用它把两个文件对象和索引节点对象连接再将新索引节点插入pipefs文件系统中,将两个文件描述符返回给用户态进程。
    2.       FIFO
    又名命名管道,它解决了管道不能在非亲进程间共享的问题,它也由特殊的文件系统实现,Linux2.6中,它几乎与管道的实现相同,仅有两点要注意区别:FIFO的索引节点出现在系统目录树上面而非pipefs文件系统,且FIFO是双向通信的管道。
    3.       System V IPC
    IPC的数据结构是在进程请求IPC资源时动态创建,每个IPC资源只有在进程显式释放时被销毁。一个IPC资源也可在非亲进程中使用。对于一个IPC资源有两个关键标识:IPC标识符与IPC关键字。作用类似于文件描述符与文件路径名。为减少非亲进程间误用IPC资源的可能,分配给资源的IPC标识符总大于给同类型的前一个资源分配的标识符。一个IPC标识符=sXm+i,s初始为0,每分配一次加1,M在Linux2.6中为IPCMNI宏。每种IPC资源类型都拥有ipc_ids数据结构,其中指出了此类资源已分资源数,最大位置索引等,而每一个IPC资源与kern_ipc_perm结构关联,它含有用户组ID及关键字及标识符。80x86体系中只有一个“多路复用”的ipc()系统调用来实现三种IPC资源的函数,而Linux在HP的Alpha体系结构及Intel的IA-64上为每个IPC函数提供单独系统调用。
    a)    IPC信号量
    它相比内核信号量的复杂点在于每个IPC信号量表示一集合而非单一数值,且它要实现进程死亡时恢复进程对IPC信号量的操作。后者的实现是通过sem_undo数据结构记录每次进程对IPC信号量的改变。这个数据结构被每个进程的链表链起来。同时每信号量又有一个链表链起sem_undo。在进程结束时do_exit()会调用exit_sem()来遍历前一链表,完成平息错乱的任务。每个IPC信号量都分配一个挂起请求队列标识正在等待信号的进程。每个ipc_ids数据结构中有一个数组,每个元素是一个IPC信号资源,即kern_ipc_perm,每个信号量有前述的undo链表及请求队列。
    b)    IPC消息
    由固定大小首部和可变长正文组成,用一个整数标识消息。同样,ipc_ids类型变量的ipc_id_ary包含一个kern_ipc_kerm指针数组。IPC消息队列以双向循环链表实现,而每个消息由msg_msg与msg_msgseg组成,对应于消息头、正文。每条消息分开存于一或多个动态分配的页中,每一页起始放置消息头。
    c)    IPC共享内存
    这个很有用。它将数据存在共享内存区的数据结构中,进程要访问时在地址空间中增加一个新内存区。同上述,ipc_ids的ipc_id_arry包含一个shmid_kernel指针数组。该数据结构最重要字段是shm_file,它存放文件对象地址。因为Linux2.6中IPC共享内存与属于shm特殊文件系统的一个文件相关联,且shm文件系统在系统目录树中无安装点,用户不可通过VFS调用。但它是由在进程线性地址空间创建文件的一个新共享内存实现。Vm_area_struct描述IPC共享内存的内存区,vm_file指回特殊文件系统shm的文件对象。
     

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    aspnetpager 详解
    删除sql数据库日志的方法
    Asp.Net 自带的分布式事务(TransactionScope)的代码块
    VS2010项目放到VS2008下的方法
    SQL Server 2005中的SSIS维护计划
    XML格式与DataTable、DataSet、DataView格式的转换
    .NET公共执行类
    C#学习BackgroundWork
    <winform>源代码
    C#学习Thread
  • 原文地址:https://www.cnblogs.com/qqmomery/p/4700455.html
Copyright © 2020-2023  润新知