• 进程间通信

  IPC是进程间通信的简称,指的是运行在某个操作系统上的不同进程间各种消息传递方式,在Unix操作系统过去30年的演变史中,消息传递经历了如下几个阶段:

  1. 管道,管道是第一个广泛使用的IPC形式,管道分为有名管道和无名管道,无名管道只可以在父子进程间通信,有名管道可以在非父子进程间通信。
  2. System V消息队列,它们可以用在同一主机上有亲缘关系或无亲缘关系的进程间,当今多数Unix版本都支持此种机制。
  3. Posix消息队列,Posix消息队列是Posix实时标准,支持任何进程间的通信。
  4. RPC,远程过程调用是从一个系统上某个程序调用另一个系统上某个函数的一种方法,同样也适用于同一主机上的客户和服务器之间。

  有了进程间通信,那么就需要进程间同步,下面是Unix提供的各种同步形式的演变:

  1. 记录上锁
  2. System V信号量
  3. Posix信号量
  4. 互斥锁和条件变量
  5. 读写锁

  说到这里有必要提起两个标准,那就是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每次被调用时总是返回最高优先级的最早消息。      

  • 进程间同步
  • 互斥锁和条件变量

  互斥锁指代相互排斥,它是最基本的同步形式。互斥锁用于保护临界区,以保证任何时刻只有一个线程或进程在执行代码。尽管我们说互斥锁保护的是临界区,实际上保护的是在临界区中被操作的数据。也就是说,互斥锁通常用于保护由多个线程或进程分享的共享数据。条件变量是用于等待,每个条件变量总是有一个互斥锁与之关联。当条件变量被发送信号后,系统立即调度等待在其上的线程,该线程开始运行,并取得互斥锁,开始访问临界区。另外一个重要的锁称为读写锁,这些读写锁的分配规则如下:

  1. 只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读
  2. 仅当没有线程持有某个给定的读写锁用于读或用于写时,才可以分配该读写锁用于写

  某些应用中读写数据比修改数据频繁,这些应用可以是读写锁。提高读写的并发度。    

  

  

  

UNIX网络进程间通信漫谈(1)的更多相关文章

  1. Unix网络编程--卷二:进程间通信

    Unix网络编程--卷二:进程间通信 本书是一部Unix网络编程的经典之作!进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机网络应用程序的必要条件.本书从对Po ...

  2. UNIX网络编程 卷2:进程间通信

    这篇是计算机类的优质预售推荐>>>><UNIX网络编程 卷2:进程间通信(第2版)> UNIX和网络专家W. Richard Stevens的传世之作 编辑推荐 两 ...

  3. UNIX网络编程卷2进程间通信读书笔记(一)—概述

    http://blog.chinaunix.net/uid-12868584-id-92807.html 写的灰常好,我就转载了 一.什么是进程间通信 IPC是进程间通信的简称,所谓进程通信,就是不同 ...

  4. Unix网络单词汇总

    Chrome开发者工具 Elements(元素).Network(网络).Sources(源代码:调试JS的地方).Timeline(时间线).Profiles(性能分析).Resources(资源: ...

  5. Unix/Linux进程间通信(一):概述

    序 Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进 ...

  6. Unix/Linux进程间通信(二):匿名管道、有名管道 pipe()、mkfifo()

    1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...

  7. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)

    RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三  多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...

  8. Unix网络编程_卷1卷2

    1. UNIX 网络编程(第2版)第1卷:套接口API和X/Open 传输接口API PDFhttp://www.linuxidc.com/Linux/2014-04/100155.htm UNIX网 ...

  9. 【UNIX网络编程】FIFO

    管道作为进程间通信的最古老方式,它的缺点是没有名字,因此仅仅能用在有亲缘关系的父子进程之间.对于无亲缘关系的进程间.无法用管道进行通信.FIFO能够完毕无亲缘关系的进程间的通信.FIFO也被称为命名管 ...

随机推荐

  1. HDOJ(HDU) 1862 EXCEL排序(类对象的快排)

    Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<= ...

  2. java NIO的多路复用及reactor模式【转载】

    关于java的NIO,以下博客总结的比较详细,适合初学者学习(http://ifeve.com/java-nio-all/) 下面的文字转载自:http://www.blogjava.net/hell ...

  3. [置顶] Putty管理私钥文件

    openssh中,ssh_keygen产生的私钥,id_rsa这种密钥putty是不认识的,必须先把它转换成ppk格式, Windows上如果你安装了git,它里面bin目录下就有ssh_keygen ...

  4. php开启错误提示

    1.在php.ini文件里加上下面两句 display_errors = Onerror_reporting = E_ALL | E_STRICT 2.在Apache的 httpd.conf文件里加上 ...

  5. windows 编程—— 头文件 指引

    定义    相关头文件 #define UNICODE  <WINUSER.h> <WINNT.h>  <WINBASE.h> #define _UNICODE   ...

  6. Yii自定义错误提示消息

    英文原文: http://www.yiiframework.com/wiki/1/how-to-customize-the-error-message-of-a-validation-rule/ Va ...

  7. sourceTree添加git密钥步骤

    给多个远程服务器比如https://github.com/wangjian2014/wjtest/blob/master/wj.txt添加public密钥 本地服务器添加private密钥     S ...

  8. mockito学习

    mockito学习 写一个测试用例,如果在测试类上面添加了注解@RunWith(SpringJUnit4ClassRunner.class),必须添加@ContextConfiguration(&qu ...

  9. (转)select 1 from ... sql语句中的1代表什么意思? .

    select  1 from ..., sql语句中的1代表什么意思?查出来是个什么结果?         select 1 from table;与select anycol(目的表集合中的任意一行 ...

  10. 打开的IE网页不是最大化的解决方法

    方法一:先把所有的IE窗口关了;只打开一个IE窗口;最大化这个窗口;关了它;OK,以后的默认都是最大化的了 方法二:先关闭所有的IE浏览器窗口,用鼠标右键点击快速启动栏的IE浏览器图标,在出现的快捷菜 ...