Linux的常见IPC机制简介

IPC机制:Inter-Process Communication,进程间通信机制

本文简述的IPC机制有:管道pipe、命名管道FIFO、信号、信号量、消息队列、共享内存、内存映射

 

1、管道pipe

pipe又叫无名管道,用于一个进程及其亲属进程(其父进程或子孙进程)之间通信,管道的本质其实是一个文件,但外部不能调用;管道的使用是单向的,一个进程从其一端写入,另一个进程从管道另一端读出,创建管道的时候需要指定数据流动方向。无名管道常用于父子进程之间通信,但也存在使用上的很多限制:只能用于父子进程间通信,且不能独立于进程存在,即pipe的生存周期和其附属的进程是一致的,这也是这种管道没有必要命名的一个原因。

2、命名管道FIFO

命名管道FIFO在设计上克服了无名管道pipe的主要缺陷,FIFO是一个可以在系统中独立、长期存在且具有路径名的文件,实现了不相关进程间通信而不止局限于父子进程间通信。这种管道独立于进程存在,且能被各种进程调用,所以其自己需要一个名称,又叫有名管道。FIFO除了在打开方式上与pipe有区别,在使用方式上和pipe是一样的。

3、信号Signal

信号是一种软件层面的中断实现,常用于处理紧急的中断事件,比如我们敲下Ctrl+C或Ctrl+Z以中断一个程序、浮点运算溢出、内存访问错误等,都会产生信号;除了对异常情况的处理,信号也用于Shell命令向一些进程发送指令。进程可以选择对Signal采取特定操作,比如忽略、阻塞、由进程处理、由内核默认处理的操作。

4、信号量semaphore

信号量和信号没有关联,是两种IPC机制,只是中文翻译上有很大的相似性而已。信号量常用于实现进程间同步和互斥,除了用户自定义的一些信号量变量,Linux自己也有一套数据结构表示信号量,并能通过系统调用来使用。

5、消息队列Message Queue

消息队列常用于进程间的数据交流通信,其相比于管道的优势在于,可以对数据消息的类型进行分类;消息队列可以独立于进程存在,并且通常是数据单向流动的,多个进程可以各自向消息队列添加消息,通常只有一个进程从消息队列中取出消息进行处理。在模块化的程序设计中,消息队列入口经常被用作模块的接口。消息队列传输的数据通常不大,主要是传递关键数据并标记消息类型,用作指令的传递。

6、共享内存Share Memory

对于稍微大一点的数据,使用消息队列可能会效率低下,因为可能会有很多进程在向一个消息队列发消息,而只有一个进程取出消息并执行,如果这些发消息的进程中有使用同样的资源,其资源的同步上可能会出错。这时可以使用共享内存的方式,让多个进程访问(通常是读出)一个资源。共享内存的思想是,用指针访问一个全局统一规定的地址,这段内存可以被多个进程读取,加快了内存访问的速度,裁剪了数据封装、传递、解析的过程。

7、内存映射Memory Mapping

一个计算机的内存大小是有限的,故计算机组成结构中有硬盘的概念,硬盘的存在是为了弥补内存不可重现、存储量有限的缺点。共享内存是在内存中实现的,当需要访问很大的数据的时候,把这种数据放到共享内存中会占用内存很大的空间,降低系统效率,这时可以使用内存映射的方式。内存映射与共享内存类似,但存在一个从硬盘中地址映射的过程,所以可以访问存储在硬盘中的更大数据。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值