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,需要借助网络传输;

  • 相关阅读:
    java反编译工具
    Eclipse反编译插件: Jodeclipse与JadClipse
    Apk修改利器:ApkToolkit v2.1
    新浪微博2.5.1 for Android 去广告
    java
    第K顺序统计量
    身份证号码
    pop3
    google
    Exception
  • 原文地址:https://www.cnblogs.com/chenny7/p/3682822.html
Copyright © 2011-2022 走看看