[Linux] 第 14 章 信号量,共享内存和消息队列
IPC
*1 信号量 : 用于管理对资源的访问。
*2 共享内存 : 用于在程序之间高效的共享数据。
*3 消息队列 : 在程序之间传递数据的一种简单方法。
@1 信号量 『
编写线程程序时,不管他是运行在多用户系统上,多进程系统上,还是运行在多用户
多进程的系统上,通常发现程序存在一部分临界代码,我们确保只有一个进程可以进入
这个临界代码并拥有对资源独占式的访问权。
进程A的执行线程 进程B的执行线程
------------->信号量的P操作<-------------
| | |
| | |
V V V
进程A的非 临界区域 进程B的非
临界区域部分 | 临界区域部分
| | ^
| V |
-------------> 信号量的V操作 --------------- 任一时刻只允许一个执行线程进入临界区域
』
@2 共享内存
共享内存是3个IPC机制中的第二个。它允许两个不相关的进程访问同一逻辑内存。共享内存是在两个
正在运行的进程之间传递数据的一种非常有效的方式。但大多数共享内存的具体实现,都把由不同进
程之间共享的内存安排为同一段物理内存。
共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。
其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有进程都可以访问共享内存中的
地址,就像它们是由malloc分配的一样。如果某个进程向共享内存写入了数据,所做的改动将立刻
被可以访问同一段共享内存的任何其他进程看到。
共享内存为在多个进程之间共享和传递数据提供了一种有效的方式。我们一般是用共享内存来提供
对大块内存区域的有效访问,同时通过传递小消息来同步对该内存的访问。
** 每个进程的逻辑地址空间到可用物理内存的映射关系。
@3 消息队列
IPC机制 之 消息队列
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。而且,每个数据块都被认为
含有一个类型,接受进程可以独立地接收含有不同类型值的数据块。好消息是:我们可以发送消息
来几乎完全避免命名管道的同步和阻塞问题。
@4 IPC状态命令
用于从命令行上访问IPC信息以及清理游离的IPC机制。它们是ipcs和ipcrm命令,这两个命令对于
开发程序非常有用。IPC机制一个让人烦恼的问题是:编写错误的程序或因为某些原因而执行失败
的程序将把它的IPC资源(如消息队列中的数据)遗留在系统中,并且这些资源在程序结束后很长时间
仍然在系统中游荡。这将导致对程序的新调用执行失败,因为程序期望以一个干净的系统来启动,
但事实上却发现一些遗留的资源。状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC
机制的方法。
-1--显示信号量状态---------删除
$ ipcs -s $ ipcrm -s 768(semid)
-2--显示共享内存状态-----删除的话是
$ ipcs -m $ ipcrm -m <id>
-3--显示消息队列状态----删除一个的话是
$ ipcs -q $ ipcrm -q <id>
*1 信号量 : 用于管理对资源的访问。
*2 共享内存 : 用于在程序之间高效的共享数据。
*3 消息队列 : 在程序之间传递数据的一种简单方法。
@1 信号量 『
编写线程程序时,不管他是运行在多用户系统上,多进程系统上,还是运行在多用户
多进程的系统上,通常发现程序存在一部分临界代码,我们确保只有一个进程可以进入
这个临界代码并拥有对资源独占式的访问权。
进程A的执行线程 进程B的执行线程
------------->信号量的P操作<-------------
| | |
| | |
V V V
进程A的非 临界区域 进程B的非
临界区域部分 | 临界区域部分
| | ^
| V |
-------------> 信号量的V操作 --------------- 任一时刻只允许一个执行线程进入临界区域
』
@2 共享内存
共享内存是3个IPC机制中的第二个。它允许两个不相关的进程访问同一逻辑内存。共享内存是在两个
正在运行的进程之间传递数据的一种非常有效的方式。但大多数共享内存的具体实现,都把由不同进
程之间共享的内存安排为同一段物理内存。
共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。
其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有进程都可以访问共享内存中的
地址,就像它们是由malloc分配的一样。如果某个进程向共享内存写入了数据,所做的改动将立刻
被可以访问同一段共享内存的任何其他进程看到。
共享内存为在多个进程之间共享和传递数据提供了一种有效的方式。我们一般是用共享内存来提供
对大块内存区域的有效访问,同时通过传递小消息来同步对该内存的访问。
** 每个进程的逻辑地址空间到可用物理内存的映射关系。
@3 消息队列
IPC机制 之 消息队列
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。而且,每个数据块都被认为
含有一个类型,接受进程可以独立地接收含有不同类型值的数据块。好消息是:我们可以发送消息
来几乎完全避免命名管道的同步和阻塞问题。
@4 IPC状态命令
用于从命令行上访问IPC信息以及清理游离的IPC机制。它们是ipcs和ipcrm命令,这两个命令对于
开发程序非常有用。IPC机制一个让人烦恼的问题是:编写错误的程序或因为某些原因而执行失败
的程序将把它的IPC资源(如消息队列中的数据)遗留在系统中,并且这些资源在程序结束后很长时间
仍然在系统中游荡。这将导致对程序的新调用执行失败,因为程序期望以一个干净的系统来启动,
但事实上却发现一些遗留的资源。状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC
机制的方法。
-1--显示信号量状态---------删除
$ ipcs -s $ ipcrm -s 768(semid)
-2--显示共享内存状态-----删除的话是
$ ipcs -m $ ipcrm -m <id>
-3--显示消息队列状态----删除一个的话是
$ ipcs -q $ ipcrm -q <id>