您的位置:首页 > 其它

进程间通信方法总结

2015-10-28 15:57 295 查看

无名管道(或称为管道)

具有两个对外端口,一个称为读端,一个称为写端。一个进程在管道的写端写数据,另一个进程从管道的读端读取数据。

管道仅局限于父进程与子进程之间的通信。

管道通信的特点:

1.管道通讯是单向的,有固定的读端和写端。

2. 数据被进程从管道读出后,在管道中该数据就不存在了。

3. 当进程去读取空管道的时候,进程阻塞。

4. 当进程往满管道写数据时,进程阻塞。

5. 系统常量PIPE_BUF规定了内核的管道缓冲区大小。

有名管道(或称为FIFO)

与无名管道最大的区别就是可用于任意两个进程间通信。

当open一个fifo时,非阻塞标志(O_NONBLOCK)会产生如下影响:

1、一般情况下(没有指定O_NONBLOCK),只读open要阻塞到某个其他进程为写而打开这个FIFO为止。类似的,只写open要阻塞到某个其他进程为读而打开它为止。

2、如果指定了O_NONBLOCK,则只读open立即返回。但是,如果没有进程为读而打开一个fifo,那么只写open将返回-1,并将errno设置成ENXIO。

消息队列

消息队列是消息的链表,存储在内核中,由消息队列标识符标识。其读写原则符合队列的先进先出原则。当然,这并不完全是这样的。我们可根据消息队列的每一条消息的标识符去读取指定的消息。

信号量

信号量是一个计数器,用于为多个进程提供对共享数据的访问,其值实则表征有多少个共享资源单位可供共享应用。为了获得共享资源,进程需要执行下列操作:

1、测试控制该资源的信号量。

2、若此信号量的值为正,则进程可以使用该资源。在这种情况下,进程会将信号量值减1,表示他使用了一个资源单位。

3、否则,若此信号量的值为0,表明无可用资源,则进程进入休眠状态,直至其他进程不再使用共享资源,信号量的值增1,此时信号量大于0,处于休眠的进程被唤醒。返回步骤1。

常用的信号量形式被称为二元信号量,他控制单个资源,其初始值为1。

共享内存

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

互斥量

互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行设置(加锁),在访问完成后释放互斥量(解锁);常常使用一个整型量表示,0表示解锁。
互斥量与信号量的区别:
1、互斥量用于线程的互斥,信号量用于线程的同步。
2、互斥量值只能为0/1,信号量值可以为非负整数。

记录锁
引用计数
临界区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息