2013年5月8日星期三

进程间通信的方法


通信目的:
   #数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
    #共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
    #通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
    #资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
    #进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

进程间通信主要包括  管道,  信号  (包括消息队列, 信号量, 共享存储),  套接字  (SOCKET)


管道包括三种:
1)普通管道PIPE: 通常有两种限制,一是半双工,只能单向传输;二是只能在父子或者兄弟进程间使用.
2)流管道s_pipe: 去除了第一种限制,可以双向传输.
3)命名管道name_pipe: 去除了第二种限制,可以在不相关的进程之间进行通讯.


信号( sinal ):操作系统通过信号来通知进程系统中发生了某种预先规定好的事件(一组事件中的一个),它也是用户进程之间通信和同步的一种原始机制.

在一个信号的生命周期中有两个阶段:生成和传送。当一个事件发生时,需要通知一个进程,这时生成一个信号。当进程识别出信号的到来,就采取适当的动作来传送或处理信号。在信号到来和进程对信号进行处理之间,信号在进程上挂起(pending).

内核为进程产生信号,来响应不同的事件,这些事件就是信号源。主要的信号源如下:
    #异常:进程运行过程中出现异常;
    #其它进程:一个进程可以向另一个或一组进程发送信号;
    #终端中断:Ctrl-C,Ctrl-\等;
    #作业控制:前台、后台进程的管理;
    #分配额:CPU超时或文件大小突破限制;
    #通知:通知进程某事件发生,如I/O就绪等;
    #报警:计时器到期。

每一个信号都有一个缺省动作,它是当进程没有给这个信号指定处理程序时,内核对信号的处理。有5种缺省的动作:
    #异常终止(abort):在进程的当前目录下,把进程的地址空间内容、寄存器内容保存到一个叫做core的文件中,而后终止进程。
    #退出(exit):不产生core文件,直接终止进程。
    #忽略(ignore):忽略该信号。
    #停止(stop):挂起该进程。
    #继续(continue):如果进程被挂起,则恢复进程的运行。否则,忽略信号。

信号最初的设计目的主要是用来处理错误,内核把进程运行过程中的异常情况和硬件的信息通过信号通知进程。如果进程没有指定对这些信号的处理程序,则内核处理它们,通常是终止进程。作为一种IPC机制,信号有一些局限:
    #信号的花销太大。发送信号要做系统调用;内核要中断接收进程、要管理它的堆栈、要调用处理程序、要恢复被中断的进程等。
    #信号种类有限,只有31种,而且信号能传递的信息量十分有限。
    #信号没有优先级,也没有次数的概念。
    #信号对于事件通知很有效,但对于复杂的交互操作却难以胜任。

信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

消息队列( message queue ) : 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。


套接字( socket ):所有提供了TCP/IP协议栈的操作系统中几乎都提供了socket,而所有这些操作系统,对套接字的编程方法几乎是完全一样的.


管道与系统IPC之间的优劣比较:

管道: 优点是所有的UNIX都支持, 并且在最后一个访问管道的进程终止后,管道就被完全删除;缺陷是管道只允许单向传输或者用于父子进程之间.

系统IPC: 优点是功能强大,能在毫不相关进程之间进行通讯; 缺陷是关键字KEY_T使用了内核标识,占用了内核资源,并且只能被显式删除,而且不能使用SOCKET的一些机制,例如select,epoll等.



进程间通信各种方式效率比较
类型
无连接
可靠
流控制
记录
消息类型优先级
普通PIPE
N
Y
Y

N
流PIPE
N
Y
Y

N
命名PIPE(FIFO)
N
Y
Y

N
消息队列
N
Y
Y

Y
信号量
N
Y
Y

Y
共享存储
N
Y
Y

Y
UNIX流SOCKET
N
Y
Y

N
UNIX数据包SOCKET
Y
Y
N

N


没有评论:

发表评论