zoukankan      html  css  js  c++  java
  • IPC 机制简介

    IPC 机制简介

    概述

    在Unix早期发展中,做出重大贡献的两大主力Bell实验室和伯克利大学(BSD)在IPC(InterProcess Communication)方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“System V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。大牛人W.Richard Stevens 著有的《UNIX Network Programming》经典大作,含两卷:卷一就是socket网络通信,卷二是单机的IPC。

    POSIX是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由开源领袖RMS应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统界面)的缩写,而X则表明其对Unix API的传承。Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。

    从上面可以看出,Sys V IPC和POSIX IPC可以认为是对同一个东西的不同实现而已。两者有相同的IPC工具——信号量、共享内存、消息队列,虽然Sys V和POSIX提供的接口有些差异,但基本概念是一致的。

    需要注意的是,POSIX提供了消息队列的通知机制(参考 mq_notify()函数),而Sys V不提供类似的功能。相对而言,Sys V IPC 的历史更为悠久,并且先后在所有的平台上都得到实现,接口比较复杂。POSIX IPC 是在Sys V IPC 出现很长一段时间以后才被设计出来的,这使得它有机会吸收Sys V的优缺点,是以POSIX在设计上能够超越它的前辈,并提供了更为简洁、对程序员也更有爱的接口。鉴于Sys V IPC年龄太大,我以为POSIX IPC API才代表未来的趋势。

    进程间信息共享方式:

    1、  左边的两个进程共享存留于文件系统中某个文件上的某些信息,为访问这些信息,每个进程都得穿越内核(例如read、write、lseek等)。

    2、  中间两个进程共享驻留于内核中的某些信息,例如pipe、消息队列、信号量,访问共享信息的每次操作涉及对内核的一次系统调用。

    3、  右边的两个进程有一个双方都能访问的共享内存区,每个进程可以不经过内核直接访问它,但共享该内存区的进程需要某种形式的同步。

    IPC对象的持续性:

    1、  随进程持续,IPC对象一直存在到打开该对象的最后一个进程关闭该对象为止,例如pipe和fifo;

    2、  随内核持续,IPC对象一直存在到内核重新自举或显式删除该IPC对象为止,例如信号量、消息队列、共享内存;

    3、  随文件系统持续,IPC对象一直存在到显式删除该对象为止;

    IPC对象的标识符

    当两个或多个无亲缘关系的进程使用某种类型的IPC对象来交换信息时,该IPC对象必须有一个名字,这样其中一个进程可以创建该IPC对象,其余进程则可以指定同一个IPC对象。对于一种给定的IPC类型,其可能的名字的集合称为它的name space。

    IPC类型

    持续性

    name space

    IPC打开后的标识符

    pipe

    fifo

    随进程

    (无名)

    路径名

    描述符

    TCP socket

    UPD socket

    Unix socket

    IP + port

    IP + port

    路径名

    POSIX互斥锁

    POSIX条件变量

    POSIX读写锁

    fcntl记录锁

    (无名)

    (无名)

    (无名)

    路径名

    pthread_mutex_t指针

    pthread_cond_t指针

    pthread_rwlock_t指针

    描述符

    POSIX消息队列

    POSIX有名信号量

    POSIX基于内存信号量

    POSIX共享内存

    随内核

    POSIX IPC名字

    POSIX IPC名字

    (无名)

    POSIX IPC名字

    mqd_t值

    sem_t指针

    sem_t指针

    描述符

    System V消息队列

    System V信号量

    System V共享内存

    key_t键

    key_t键

    key_t键

    System V IPC标识符


    POSIX IPC

    消息队列

    信号量

    共享内存

    Include

    <mqueue.h

    <sys/sem.h>

    <sys/shm.h>

    创建或打开IPC

    mq_open

    mq_close

    mq_unlink

    sem_open

    sem_close

    sem_unlink

    shm_open

    shm_unlink

    sem_init

    sem_destroy

    控制IPC

    mq_getattr

    mq_setattr

    ftruncate

    fstat

    IPC操作函数

    mq_send

    mq_receive

    mq_notify

    sem_wait

    sem_trywait

    sem_post

    sem_getvalue

    mmap

    munmap


    SystemV IPC

    消息队列

    信号量

    共享内存

    Include

    <sys/msg.h>

    <sys/sem.h>

    <sys/shm.h>

    创建或打开IPC

    msgget

    semget

    shmget

    控制IPC

    msgctl

    semctl

    shmctl

    IPC操作函数

    msgsnd

    msgrcv

    semop

    shmat

    shmdt


    RPC

    本地过程调用(local procedure call),就是被调用的过程(函数)与调用过程处于同一个进程中,这也是我们所熟悉的函数调用方式。

    远程过程调用(remote procedure call, RPC),被调用过程和调用过程处于不同的进程中。通常称调用者为Client,被调用的过程为Server。

    RPC又分两种情况:

    1、单台主机上的RPC(门调用),即调用者和被调用者在同一台主机上面;

    2、主机间的PRC,需要借助网络传输;

  • 相关阅读:
    jQuery 语法
    jQuery 简介
    把数据存储到 XML 文件
    XML 注意事项
    XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。
    通过 PHP 生成 XML
    XML 命名空间(XML Namespaces)
    XML to HTML
    XMLHttpRequest 对象
    使用 XSLT 显示 XML
  • 原文地址:https://www.cnblogs.com/chenny7/p/3682822.html
Copyright © 2011-2022 走看看