UNIX网络进程间通信漫谈(1)
- 进程间通信
IPC是进程间通信的简称,指的是运行在某个操作系统上的不同进程间各种消息传递方式,在Unix操作系统过去30年的演变史中,消息传递经历了如下几个阶段:
- 管道,管道是第一个广泛使用的IPC形式,管道分为有名管道和无名管道,无名管道只可以在父子进程间通信,有名管道可以在非父子进程间通信。
- System V消息队列,它们可以用在同一主机上有亲缘关系或无亲缘关系的进程间,当今多数Unix版本都支持此种机制。
- Posix消息队列,Posix消息队列是Posix实时标准,支持任何进程间的通信。
- RPC,远程过程调用是从一个系统上某个程序调用另一个系统上某个函数的一种方法,同样也适用于同一主机上的客户和服务器之间。
有了进程间通信,那么就需要进程间同步,下面是Unix提供的各种同步形式的演变:
- 记录上锁
- System V信号量
- Posix信号量
- 互斥锁和条件变量
- 读写锁
说到这里有必要提起两个标准,那就是Posix,System V。POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。System V, 曾经也被称为 AT&T System V,是Unix操作系统众多版本中的一支,基于System V的系统也实现了自己的一套标准。先如今这两种标准都很流行,但是POSIX操作简单,通用性强,逐渐被众多unix系统采用。
- 管道
管道通过read,write函数读取数据,通过pipe函数创建,创建子管道时调用fork函数,提供单路数据流(有些也提供全双工管道,大部分提供半双工,用在shell中),其典型用途是通过创建父子进程的方式提供进程间的通信手段,如下图所示:
例如到我们在shell中输入一个像下面的命令时: who|sort|lp, 这三个进程间的通信如下图所示,只提供单项数据流,当需要一个双向数据流时,我们必须创建两个管道,每个方向一个:
命名管道的正真优势表现在服务器可以是一个长期运行的进程(例如守护进程),使用与一个服务器多个客户端的情况。管道服务器是迭代服务器,它以串行方式每次处理一个客户请求,它们易遭受拒绝服务攻击(发送请求,但不取走数据)。但即使是并发服务器,同样会遭受拒绝服务攻击(多次请求,知道大道最大FD限制)
- Posix消息队列
消息队列可认为是一个消息链表。有足够写权限的线程可往队列中放置消息,有足够读权限的线程可从队列中取走消息。每个消息都是一个记录,它由发送者赋予一个优先级。在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。这个管道相反,管道是先有读出者,才可以写。队列里面的消息可以是一个进程写入的,然后另一个进程读出。mq_open创建一个新队列或打开一个已经存在的队列,mq_close关闭队列,mq_unlink则删除队列名。往一个队列中放置消息使用mq_send,从一个队列中读出消息使用mq_receive。队列属性的查询与设置使用mq_getattr和mq_setattr,函数mq_notity可以注册一个信号或线程,当有消息被放置到队列上时发送。队列中的每个消息被赋予一个小整数优先级,mq_receive每次被调用时总是返回最高优先级的最早消息。
- 进程间同步
- 互斥锁和条件变量
互斥锁指代相互排斥,它是最基本的同步形式。互斥锁用于保护临界区,以保证任何时刻只有一个线程或进程在执行代码。尽管我们说互斥锁保护的是临界区,实际上保护的是在临界区中被操作的数据。也就是说,互斥锁通常用于保护由多个线程或进程分享的共享数据。条件变量是用于等待,每个条件变量总是有一个互斥锁与之关联。当条件变量被发送信号后,系统立即调度等待在其上的线程,该线程开始运行,并取得互斥锁,开始访问临界区。另外一个重要的锁称为读写锁,这些读写锁的分配规则如下:
- 只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读
- 仅当没有线程持有某个给定的读写锁用于读或用于写时,才可以分配该读写锁用于写
某些应用中读写数据比修改数据频繁,这些应用可以是读写锁。提高读写的并发度。
UNIX网络进程间通信漫谈(1)的更多相关文章
- Unix网络编程--卷二:进程间通信
Unix网络编程--卷二:进程间通信 本书是一部Unix网络编程的经典之作!进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机网络应用程序的必要条件.本书从对Po ...
- UNIX网络编程 卷2:进程间通信
这篇是计算机类的优质预售推荐>>>><UNIX网络编程 卷2:进程间通信(第2版)> UNIX和网络专家W. Richard Stevens的传世之作 编辑推荐 两 ...
- UNIX网络编程卷2进程间通信读书笔记(一)—概述
http://blog.chinaunix.net/uid-12868584-id-92807.html 写的灰常好,我就转载了 一.什么是进程间通信 IPC是进程间通信的简称,所谓进程通信,就是不同 ...
- Unix网络单词汇总
Chrome开发者工具 Elements(元素).Network(网络).Sources(源代码:调试JS的地方).Timeline(时间线).Profiles(性能分析).Resources(资源: ...
- Unix/Linux进程间通信(一):概述
序 Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进 ...
- Unix/Linux进程间通信(二):匿名管道、有名管道 pipe()、mkfifo()
1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
- Unix网络编程_卷1卷2
1. UNIX 网络编程(第2版)第1卷:套接口API和X/Open 传输接口API PDFhttp://www.linuxidc.com/Linux/2014-04/100155.htm UNIX网 ...
- 【UNIX网络编程】FIFO
管道作为进程间通信的最古老方式,它的缺点是没有名字,因此仅仅能用在有亲缘关系的父子进程之间.对于无亲缘关系的进程间.无法用管道进行通信.FIFO能够完毕无亲缘关系的进程间的通信.FIFO也被称为命名管 ...
随机推荐
- House Robber——LeetCode
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- Java学习日记-2 零零碎碎
一.使用Scanner类进行控制台的输入 文档中Scanner类的定义为A simple text scanner which can parse primitive types and string ...
- Spreadsheet Calculator 电子表格计算器 (Uva 215)
原题:https://uva.onlinejudge.org/external/2/215.pdf 有一个M x N的表格,每个单元格是个数字或者表达式.表达式由单元格编号和+ - 号组成 输出单元格 ...
- js创建及操作数组
一:创建数组 1:使用Array构造函数(new可以省略): var colors = new Array();创建length值为20的的数组: var colors = new Array(20) ...
- [ES6] ... spread operator
var parts = ['shoulders', 'knees']; var lyrics = ['head', ...parts, 'and', 'toes']; // ["head&q ...
- vim 开发配置(转载)
原文:http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html 花了很长时间整理的,感觉用起来很方便,共享一下. 我的vim配置主要有 ...
- Android(java)学习笔记252:ContentProvider使用之内容观察者01
1. 内容观察者 不属于四大组件,只是内容提供者ContentProvider对应的小功能. 如果发现数据库内容变化了,就会立刻观察到. 下面是逻辑图: 当A应用中银行内部的数据发生变化的 ...
- 利用ParameterizedType获取泛型参数类型
//利用ParameterizedType获取java泛型的参数类型 public class Demo { public static void main(String[] args) { ...
- hdu 5062
题意:将10^0-10^6之间属于 "Beautiful Palindrome Number" 的数个数打印出来,所谓 "Beautiful Palindrome Nu ...
- css书写步骤
CSS整体书写步骤1:CSS RESET 重置2:CSS GLABAL 全局属性3: CSS分模块属性,(先写默认样式和设计图相差最大的部分,先大块布局,后细致调整) <style>/*C ...