进程间通信方法总结
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,信号量值可以为非负整数。
记录锁
引用计数
临界区
相关文章推荐
- 进程间通信之深入消息队列的详解
- 第14章进程间通信
- 进程间通信之管道与有名管道
- Linux环境进程间通信(二): 信号(上)
- Android 使用 AIDL 实现进程间通信,使用基本类型作为输入和输出参数
- 信号发送函数kill()和raise()
- 信号捕捉函数alarm()和pause()(转)
- 信号处理函数signal()和信号集函数组
- 利用Use32.dll的SendMessage实现 进程间通信
- Linux进程间通信共享内存
- Android利用LocalSocket实现Java端进程与C端进程之间的IPC
- 进程间通信
- Unix IPC进程间通信
- 进程间通信
- Linux 0.11下信号量的实现和应用
- 进程间通信简单实现之SendMessage/PostMessage
- 进程间通信 - 匿名管道
- [操作系统原理] 进程之间8种通信方式
- 进程间通信---共享内存
- 进程间通信--信号(进程间通信唯一的异步方式)