您的位置:首页 > 其它

进程间通信浅析

2016-07-03 22:58 176 查看
在计算机科学中,进程间通信和进程间通信(IPC),专指一个机制的操作系统提供了允许过程它管理共享数据。通常,应用程序可以使用的IPC归类为客户端和服务器,其中客户机请求的数据和服务器响应客户机请求。许多应用是客户端和服务器,如在常见的分布式计算。用于实现IPC方法分为哪些变化基于类别软件要求,诸如性能和模块化的要求,以及系统的情况下,诸如网络带宽和延迟。

下面是维基百科中的总结,大家可以看看





管道就不多说了,如果又需要可以看本人前一篇微博。

共享内存

通常由一个进程创建,其余进程对这块内存区进行读写。得到共享内存有两种方式:映射/dev/mem设备和内存映像文件。前一种方式不给系统带来额外的开销,但在现实中并不常用,因为它控制存取的是实际的物理内存;常用的方式是通过shmXXX函数族来实现共享内存:

int shmget(key_t key, int size, int flag); /* 获得一个共享存储标识符*/

该函数使得系统分配size大小的内存用作共享内存;

void *shmat(int shmid, void *addr, int flag); /* 将共享内存连接到自身地址空间中*/

如果一个进程通过fork创建了子进程,则子进程继承父进程的共享内存,既而可以直接对共享内存使用,不过子进程可以自身脱离共享内存。

shmid为shmget函数返回的共享存储标识符,addr和flag参数决定了以什么方式来确定连接的地址,函数的返回值即是该进程数据段所连接的实际地址。此后,进程可以对此地址进行读写操作访问共享内存。

对于共享内存,linux本身无法对其做同步,需要程序自己来对共享的内存做出同步计算,而这种同步很多时候就是用信号量实现。

获得共享资源

本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。信号量,分为互斥信号量,和条件信号量。一般说来,为了获得共享资源,进程需要执行下列操作:

(1)测试控制该资源的信号量;

(2)若此信号量的值为正,则允许进行使用该资源,进程将信号量减去所需的资源数;

(3)若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1);

(4)当进程不再使用一个信号量控制的资源时,信号量值加其所占的资源数,如果此时有进程正在睡眠等待此信号量,则唤醒此进程。

其他信息

套接字通信并不为Linux所专有,在所有提供了TCP/IP协议栈的操作系统中几乎都提供了socket,而所有这样操作系统,对套接字的编程方法几乎是完全一样的。



接下来,分析一下他们的特点:

管道:速度慢,容量有限

消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。

信号量:不能传递复杂消息,只能用来同步

共享内存区:能够很容易控制容量,速度快 ,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了一块内存的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息