IPC 机制简介
概述
在Unix早期发展中,做出重大贡献的两大主力Bell实验室和伯克利大学(BSD)在IPC(InterProcess Communication)方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“System V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。大牛人W.Richard Stevens 著有的《UNIX Network Programming》经典大作,含两卷:卷一就是socket网络通信,卷二是单机的IPC。
POSIX是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由开源领袖RMS应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统界面)的缩写,而X则表明其对Unix API的传承。Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。
从上面可以看出,Sys V IPC和POSIX IPC可以认为是对同一个东西的不同实现而已。两者有相同的IPC工具——信号量、共享内存、消息队列,虽然Sys V和POSIX提供的接口有些差异,但基本概念是一致的。
需要注意的是,POSIX提供了消息队列的通知机制(参考 mq_notify()函数),而Sys V不提供类似的功能。相对而言,Sys V IPC 的历史更为悠久,并且先后在所有的平台上都得到实现,接口比较复杂。POSIX IPC 是在Sys V IPC 出现很长一段时间以后才被设计出来的,这使得它有机会吸收Sys V的优缺点,是以POSIX在设计上能够超越它的前辈,并提供了更为简洁、对程序员也更有爱的接口。鉴于Sys V IPC年龄太大,我以为POSIX IPC API才代表未来的趋势。
进程间信息共享方式:
1、 左边的两个进程共享存留于文件系统中某个文件上的某些信息,为访问这些信息,每个进程都得穿越内核(例如read、write、lseek等)。
2、 中间两个进程共享驻留于内核中的某些信息,例如pipe、消息队列、信号量,访问共享信息的每次操作涉及对内核的一次系统调用。
3、 右边的两个进程有一个双方都能访问的共享内存区,每个进程可以不经过内核直接访问它,但共享该内存区的进程需要某种形式的同步。
IPC对象的持续性:
1、 随进程持续,IPC对象一直存在到打开该对象的最后一个进程关闭该对象为止,例如pipe和fifo;
2、 随内核持续,IPC对象一直存在到内核重新自举或显式删除该IPC对象为止,例如信号量、消息队列、共享内存;
3、 随文件系统持续,IPC对象一直存在到显式删除该对象为止;
IPC对象的标识符
当两个或多个无亲缘关系的进程使用某种类型的IPC对象来交换信息时,该IPC对象必须有一个名字,这样其中一个进程可以创建该IPC对象,其余进程则可以指定同一个IPC对象。对于一种给定的IPC类型,其可能的名字的集合称为它的name space。
IPC类型 |
持续性 |
name space |
IPC打开后的标识符 |
pipe fifo |
随进程 |
(无名) 路径名 |
描述符 |
TCP socket UPD socket Unix socket |
IP + port IP + port 路径名 |
||
POSIX互斥锁 POSIX条件变量 POSIX读写锁 fcntl记录锁 |
(无名) (无名) (无名) 路径名 |
pthread_mutex_t指针 pthread_cond_t指针 pthread_rwlock_t指针 描述符 |
|
POSIX消息队列 POSIX有名信号量 POSIX基于内存信号量 POSIX共享内存 |
随内核 |
POSIX IPC名字 POSIX IPC名字 (无名) POSIX IPC名字 |
mqd_t值 sem_t指针 sem_t指针 描述符 |
System V消息队列 System V信号量 System V共享内存 |
key_t键 key_t键 key_t键 |
System V IPC标识符 |
POSIX IPC
消息队列 |
信号量 |
共享内存 |
|
Include |
<mqueue.h |
<sys/sem.h> |
<sys/shm.h> |
创建或打开IPC |
mq_open mq_close mq_unlink |
sem_open sem_close sem_unlink |
shm_open shm_unlink |
sem_init sem_destroy |
|||
控制IPC |
mq_getattr mq_setattr |
ftruncate fstat |
|
IPC操作函数 |
mq_send mq_receive mq_notify |
sem_wait sem_trywait sem_post sem_getvalue |
mmap munmap |
SystemV IPC
消息队列 |
信号量 |
共享内存 |
|
Include |
<sys/msg.h> |
<sys/sem.h> |
<sys/shm.h> |
创建或打开IPC |
msgget |
semget |
shmget |
控制IPC |
msgctl |
semctl |
shmctl |
IPC操作函数 |
msgsnd msgrcv |
semop |
shmat shmdt |
RPC
本地过程调用(local procedure call),就是被调用的过程(函数)与调用过程处于同一个进程中,这也是我们所熟悉的函数调用方式。
远程过程调用(remote procedure call, RPC),被调用过程和调用过程处于不同的进程中。通常称调用者为Client,被调用的过程为Server。
RPC又分两种情况:
1、单台主机上的RPC(门调用),即调用者和被调用者在同一台主机上面;
2、主机间的PRC,需要借助网络传输;
IPC 机制简介的更多相关文章
-
【Android - IPC】之Binder机制简介
参考资料: 1.<Android开发艺术探索>第二章2.3.3 Binder 2.[Android Binder设计与实现-设计篇] 3.[Android Binder机制介绍] 1. 什 ...
-
Android之IPC机制
Android IPC简介 任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来实现IPC,还 ...
-
Android的IPC机制(一)——AIDL的使用
综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道. ...
-
《Android开发艺术探索》读书笔记 (2) 第2章 IPC机制
2.1 Android IPC简介 (1)任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来 ...
-
Android中的IPC机制
Android IPC简介 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程 ...
-
Android开发艺术探索——第二章:IPC机制(上)
Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化 ...
-
linux各种IPC机制(进程通信)
linux各种IPC机制 (2011-07-08 16:58:35) 原文地址:linux各种IPC机制(转)作者:jianpengliu 原帖发表在IBM的developerworks网站 ...
-
[转帖]linux各种IPC机制
linux各种IPC机制 docker中的资源隔离,一种就是IPC的隔离.IPC是进程间通信. 下面的文章转载自https://blog.csdn.net/yyq_9623/article/detai ...
-
An*id的IPC机制-Binder概述
在Linux系统中,是以进程为单位分配和管理资源的.出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭.但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项 ...
随机推荐
-
Jquery中ajax方法data参数的用法
$.ajax({ type: "POST", url: "some.php", data: "name=John&location ...
-
Bzoj1711 [Usaco2007 Open]Dining吃饭
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 872 Solved: 459 Description 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食 ...
-
oracle怎么卸载(转)
Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.到目前仍在数据库市场上占有主要份额.劳伦斯·埃里森和他的朋友,之前的同事 Bob ...
-
Web前端性能优化之图片优化
我自己的Blog:http://blog.cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到了互联网内容总量的62%,也就是说超过 ...
-
[Sqoop]利用sqoop对mysql运行DML操作
业务背景 利用sqoop对mysql进行查询.加入.删除等操作. 业务实现 select操作: sqoop eval \ --connect jdbc:mysql://127.0.0.1:3306/m ...
-
Django 2.0 Release note阅读简记
最前面就是大家都知道的这个版本开始只支持py3.4+,而且下一个大版本就不支持3.4,再就是建议所有插件开始放弃1.11 1.最惊艳的变化,就是URL配置正则表达式的简化,旧的: url(r'^art ...
-
[译]ASP.NET Core揭秘 - Razor Pages
原文 什么是Razor Pages? Razor pages是ASP.NET Core 2.0的新特性,它被设计用来更快的开发页面,比传统的MVC模式更便捷. 创建项目 为了使用Razor Pages ...
-
Git 忽略特定文件或文件夹
在代码编译过程中,可能会生成一些目标文件或其他我们不希望提交到服务器的文件或文件夹, 但是因为是生成出来的文件/文件夹,在每次使用git status 查看状态的时候git系统总会提示这些 文件或文件 ...
-
Python 学习 第十篇:正则表达式 - re
规则表达式(Regular Expression, RE),又称作正则表达式,通常用于检索.替换符合指定规则的文本,正则表达式定义的规则,称作模式(Pattern),即正则表达式的作用是从文本中查找到 ...
-
bootstrap代码(一)
一般在个人博客上使用的较为频繁,用于显示代码的风格.在Bootstrap主要提供了三种代码风格:1.使用<code></code>来显示单行内联代码2.使用<pre> ...