17. 进程间通信 2010-03-02 12:49 191人阅读 评论(0) 收藏
2010-03-02 12:49
204 查看
前述,可将数据存放在使用锁保护的临时文件中即可实现一定意义上的共享数据,但此方法代价高,所以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的文件对象。
版权声明:本文为博主原创文章,未经博主允许不得转载。
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的文件对象。
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- 19(终). 系统启动 2010-03-02 13:00 191人阅读 评论(0) 收藏
- iOS开发之圆角指定 分类: ios技术 2015-05-25 16:26 191人阅读 评论(0) 收藏
- winfrom 操作 INI 文件 分类: WinForm 2014-07-22 12:49 156人阅读 评论(0) 收藏
- 输出对象的备份、还原 分类: python 小练习 2014-03-28 11:47 191人阅读 评论(0) 收藏
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - System V进程间通信基础 分类: Linux --- 应用程序设计 2014-11-11 13:08 51人阅读 评论(0) 收藏
- 博客工具入门之Google Analytics 2010-07-01 14:10 191人阅读 评论(0) 收藏
- PHP从零单排(四)PHP中的文件上传处理 分类: PHP 2014-04-21 11:13 191人阅读 评论(0) 收藏
- windows进程间通信 . 分类: VC++ 2013-10-09 16:27 567人阅读 评论(0) 收藏
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - System V进程间通信之消息队列 分类: Linux --- 应用程序设计 2014-11-11 13:16 71人阅读 评论(0) 收藏
- 命名管道实现进程间通信--石头、剪刀、布游戏 分类: linux 2014-06-01 22:50 467人阅读 评论(0) 收藏
- shell脚本调试 分类: 学习笔记 linux ubuntu 2015-07-14 12:49 53人阅读 评论(0) 收藏
- 基于贪心算法的几类区间覆盖问题 2014-01-21 12:13 191人阅读 评论(0) 收藏
- 18. 程序的执行 2010-03-02 12:56 131人阅读 评论(0) 收藏
- winform Execl数据 导入到数据库(SQL) 分类: WinForm C# 2014-05-09 20:52 191人阅读 评论(0) 收藏
- VAssistX使用 分类: cocos2d其他 2015-07-11 09:51 14人阅读 评论(0) 收藏
- Berkeley DB基础教程 分类: H3_NUTCH 2014-05-29 15:21 2212人阅读 评论(0) 收藏
- 在pc上 运行android 4.2 分类: Android开发 2014-05-30 10:53 53人阅读 评论(0) 收藏
- android程序在模拟器上运行时是项… 分类: Android开发 2014-05-30 10:53 64人阅读 评论(0) 收藏
- 网络工作室暑假后第一次培训资料(ADO.NET创建访问数据集)整理 分类: ASP.NET 2012-10-05 20:10 911人阅读 评论(0) 收藏
- Android开发:标准体重计算器应用的… 分类: Android开发 2014-05-30 10:53 85人阅读 评论(0) 收藏