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也被称为命名管 ...
随机推荐
- C++ Template Specialization (模板特化)
个人理解这个东西说白了就是当模板类(或函数)的类型参数为某特定值时用对应的特化定义代之. 看个例子吧 #include <iostream> using namespace std; te ...
- Centos6.x/Oracle11G 自动化静默安装配置脚本
部分脚本截图如下,要想玩转联系Ruiy哥提供脚本下载路径,附件在本博客的文件栏中维护,为了避免懒人一味的索取别人的劳动成果特此如此; 想玩的Ruiy mail to you! 快6.1了,6.1娃子们 ...
- 迁移ADT/ANT构建的Android项目至Gradle,a walk through。
LibModule 配置更新 9 months ago app 配置更新 9 months ago gradle/wrapper 配置更新 9 months ago screenshots ...
- python用parammiko模块实现linux的远程操作
parammiko 可以实现远程的带密码登录,解决ssh远程登陆需要交互的问题 (当然很多其他的,如tcl也可以).但这个用python做比较简单 1.parammiko 的安装 1.1.依赖模块 ...
- html+javascript实现可拖动弹出层、对话框、可提交
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org ...
- angularjs改变路由时控制器每次都执行两次
原因如下: 代码里面也初始化了控制器 模板配置了一个控制器
- [原创小知识] 如何优雅的判断 ie 版本
之前一直不怎么做低版本ie的前端,毕竟ie的大半江山都被chrome 霸占,但大部分情况下,却还是要去兼容下那些老顽固.一切的原因,都是因为当年微软的年轻气盛,喜欢另起炉灶,真是很无语. 通常我们去h ...
- android api 中文 (73)—— AdapterView
前言 本章内容是android.widget.AdapterView,版本为Android 2.3 r1,翻译来自"cnmahj",欢迎大家访问他的博客:http://androi ...
- Linux下查看所有用户(shell脚本获取)
在Linux系统中,使用者账号管理最重要的两个文件是/etc/password和/etc/shadow.在/etc/password文件中,每一行都代表一个账号,但是有很多账号是系统账号.比如:b ...
- Ubuntu12.04下使用valgrind内存测试工具测试Qt程序
1. 到官网http://valgrind.org/downloads/上下载valgrind最新版本: 2. 解压源码,执行./configure;make;make install后,默认安装到/ ...