• 进程间通信

  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. gcc编译命令

    g++ demo.cpp -o demo.exe

  2. Java中对象的上转型对象

    1. 定义 如果B类是A类的子类或间接子类,当用B类创建对象b并将这个对象b的引用赋给A类对象a时,如: A a;a = new B();ORA a;B b = new B();a = b; 则称A类 ...

  3. SKTexture类

    继承自 NSObject 符合 NSCodingNSCopyingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framewo ...

  4. Android SimpleAdapter GridView (网格图片点击放大显示)

    GridView网格视图 GridView网格视图是按照行,列分布的方式来显示多个组件,通常用于显示图片或是图标等,在使用网格视图时,首先需要要在屏幕上添加GridView组件. 常用属性: 1. a ...

  5. 二分图的最大匹配-hdu-3729-I'm Telling the Truth

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3729 题目意思: 有n个学生,老师询问每个学生的排名,每个学生都告诉了一个排名区间,求可能的最多的学 ...

  6. hdu3308LCIS(线段树,点更新,段查寻,查寻时一定要注意跨越时如何计算)

    Problem Description Given n integers. You have two operations: U A B: replace the Ath number by B. ( ...

  7. MVC jsp+servlet+javabean 连接Mysql数据库測试demo

    本文介绍的是怎样使用MVC架构去实现jsp+servlet+javabean连接数据库 首先我们应该了解什么是MVC: MVC包含三个部分 : ①View:由各种JSP页面组成. ②Controlle ...

  8. [转] gdb的基本工作原理

    转自: http://www.spongeliu.com/linux/howgdbwork/ 还是面某M的时候,面试官问我:“用过gdb么?” 答:“用过,调了两年bug了”.“那好,给我解释下gdb ...

  9. git clone之后自动checkout文件处理

    这个问题发生是因为不同操作系统的行结束符不一致导致的,可在clone之后在仓库根目录修改.gitattributes文件 简单处理的话,注释* text=auto这行即可.也可根据不同系统,做相应设定 ...

  10. 本篇文章主要是对jquery+ajax+C#实现无刷新操作数据库数据的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    我们知道同步执行和异步执行的区别,为了更好的提高用户的体验,我们都会采用异步方式去处理一些问题,毕竟单线程的同步可能回造成卡死等现象,很不友好,所以可以使用ajax来完成用户的体验,现在我们就来说说如 ...