• 第一章:简介


    1.1:概述

    IPC是进程间通信(interprocess communication)的简称。传统上该术语描述的是运行在某个操作系统上的进程间的各种消息传递(message passing)的方式。

    在Unix操作系统过去30年的演变史中,消息传递经历了如下几个发展阶段。

    • 管道(pipe),管道的问题在于它们只能在具有共同祖先的进程间使用,不过该问题已随着有名管道(FIFO)的引入而解决。
    • System V消息队列是在20世纪80年代早期加到System V内核中的。
    • Posix 消息队列是有Posix实时标准加入的。
    • 远程过程调用出现在20世纪80年代中期。

    看一看由Unix提供的各种同步形式的演变同样颇有收益:

    • 需要某种同步形式(往往是为了多个进程同时修改同一文件)的早期程序使用文件系统的诡秘特性。
    • 记录上锁是在20年代80年代早期加入到Unix内核中的,然后在1988年有Posix.1标准化。
    • System V信号量是在System V消息队列加入System V内核的同时(20世纪80年代早期)伴随System V共享内存区加入的。
    • Posix信号量和Posix共享内存区也是由Posix实时标准加入。
    • 互斥锁(mutex)和条件变量(condition variable)是由Posix线程标准定义的两种同步形式。尽管往往用于线程间的同步,它们也能提供不同进程间的同步。
    • 读写锁是另一种形式的同步。它们还没有被Posix标准化。

    1.2:进程、线程与信息共享

    注意:没有任何东西限制任何IPC技术只能使用两个进程。

    1.3:IPC对象的持续性

    我们可以把任意类型的IPC的持续性(persistence)定义成该类型的一个对象一直存在多长时间。

    (1)随进程持续的(process-persistent)IPC对象一直存在到打开该对象的最后一个进程关闭该对象为止。例如管道和FIFO就是这种对象。

    (2)随内核持续的(kernel-persistent)IPC对象一直存在到内核重新自举或显示删除该对象为止。例如System v的消息队列、信号量和共享内存区就是此类对象。Posix的消息队列、信号量和共享内存区必须至少是随内核持续的。但也可以是随文件系统持续的,具体取决于实现。

    (3)随文件系统持续的(filesystem-persistent)IPC对象一直存在到显示删除该对象为止。即使内核重新自举了,该对象还是保持其值。Posix消息队列、信号量和共享内存如果是使用映射文件实现的(不是必需条件),那么它们就是随文件系统持续的。

    1.4:名字空间

    当两个或多个无亲缘关系的进程使用某种类型的IPC对象来彼此交换信息时,该IPC对象必须有一个某种形式的名字或标识符,这样其中一个进程(往往是服务器)可以创建该IPC对线,其余进程可以指定同一个IPC对象。

    在以后各章具体讲述某种形式的IPC时,我们将使用另外的命名约定。对于一种给定的IPC类型,其可能的名字的集合就合称为它的名字空间。名字空间很重要,因为对于除普通的管道以外的所有形式的IPC来说,名字是客户与服务器彼此连接以交换消息的手段。

    下图汇总了不同形式IPC所用的命名约定:

    1.5:fork、exec和exit对IPC对象的影响

    我们需要理解fork、exec和_exit函数对于所讨论的各种形式的IPC的影响。下图对此做了总结:

    1.6:出错处理:包裹函数

    这些错误处理函数就是作者在真正调用的函数上封装了一层了,添加了对错误的判断,并打印错误信息等操作,看一下源码就明白怎么回事了。

    1.7:Unix标准

    这些是有关Unix标准化的东西,了解一下就够了。

    1.8:书中IPC例子索引表

    为分析各种特性,全书主要使用了三种交互模式:

    (1)文件服务器:客户--服务器应用程序,客户向服务器发送一个路径名,服务器把该文件的内容返回给客户。

    (2)生产者-消费者:一个或多个线程或进程(生产者)把数据放到一个共享缓冲区中,另有一个或多个线程或进程(消费者)对该共享缓冲区的数据进行操作。

    (3)序列号持续增1:一个或多个线程或进程给一个共享的序列号持续增1。该序列号有时在一个共享文件中,有时在共享内存中。

    第一个例子分析各种形式的消息传递,另外两个例子则分析各种类型的同步和共享内存区。

    1.9:小结

    IPC传统上是Unix中一个杂乱不堪的领域。虽然有了各种各样的解决办法,但没有一个是完美的。我们的讨论分成4个主要领域:

    (1)消息传递(管道、FIFO、消息队列)

    (2)同步(互斥锁、条件变量、读写锁、信号量)

    (3)共享内存区(匿名共享内存区、具名共享内存区)

    (4)过程调用(Solaris门、Sun RPC)

    各种类型的IPC对象的持续性可以是进程持续的、内核持续的以及文件系统持续的。

    各种类型的IPC对象的另一个特性是名字空间,也就是使用IPC对象的进程、线程标识各个IPC对象的方式。

  • 相关阅读:
    键盘ASCII码
    Pandas常用功能总结
    TensorFlow之多核GPU的并行运算
    Linux中目录以及路径问题
    菜鸟的服务器进阶
    ORA-02447: cannot defer a constraint that is not deferrable
    ORA-25153: Temporary Tablespace is Empty解决方法
    查询当前会话进程号
    Oracle中的USEREVN()
    Oracle物理结构与逻辑结构
  • 原文地址:https://www.cnblogs.com/lit10050528/p/5471209.html
Copyright © 2020-2023  润新知