进程间通讯

之前再跟同学交流面试经验的时候,有小伙伴在讲述自己面试经历的时候,多次被问到了进程间通讯这个问题,由此可见这个知识点的重要程度可想而知了。
首先,在脑海里试想一下面试官如果问你“进程间通讯的方式有哪些?”你会怎么去回答。有的小伙伴就说了,这个还不简单了,不就是那几个吗,这个有什么难的!进程间通讯方式有管道、消息队列、信号量、共享内存如果你只能想到这些,那么我建议你回去还是好好看看这个模块的内容吧,这样回答问题,会让面试官很尴尬,面试官在心里肯定会鄙视你O(n^2)次的!那么到底该怎么回答这个问题呢?
我的思路是,首先你可以描述一下进程间通讯的含义,然后再按照每一个方式来展开描述,而不是简单的说明这几个专有名词。
先来看看,什么是进程间通讯呢?所谓的进程间通讯,其实就是操作系统为了解决复杂问题,或者复杂任务,单进程无法解决这样的问题,并且在完成这些任务的过程中,子任务之间需要而产生一定的数据传递,的一种运作方式。
先来看看管道

管道

管道是借助文件系统,在多个进程之间创建一个通讯信道,所有进程通过自己打开的文件描述符操作同一块内存空间,从而实现数据的传递。
管道分为有名管道和无名管道。
有名管道
在磁盘上会存在一个管道标识符,但是管道文件标识并不占用磁盘block空间,只占用一个inode节点,而真实的数据会缓存到内存空间上。
无名管道
不会存在管道文件标识,其原理是借助父子进程之间共享fork之前打开的文件描述符,其数据内容存放在内存缓存中。无名管道仅能用于父子进程之间。

有名管道和无名管道的区别

  1. 有名管道可以在任意进程间进行通讯,无名管道只能在父子进程之间通讯;
  2. 有名管道通讯是双向的,任意一端都可读可写,但同一时间只能一端读一端写,无名管道通讯是单向的,不能用于网络间通讯,只能一端读另一端写。

管道的数据都是内存空间缓存的。根据无名管道和有名管道的提点可以看出,尽管无名管道没有管道文件,但它和有名管道的数据内容都是存放在内存缓存中的。

根据管道的定义,我们可以知道,管道是一种半双工通讯,因为在同一通讯时刻,数据只能单方向的传输,但是并不是所有的管道都是半双工通讯的,存在全双工通讯的管道。

消息队列

消息队列是在同一类型上符合先进先出的规定,消息队列使用链表保存消息,具有特定的格式,存放在内存中,由消息队列标识符标识,消息队列允许一个或者多个进程的写入与读取消息。消息队列可以实现消息的随机查询,不一定以先进先出的顺序读取,也可以按照类型进行读取,其本质是一种类的优先级队列。消息队列实现的是进程间数据数据的定向发送与接收。

消息队列的使用:
1.接收消息的进程,只接收指定类型的消息,对其他消息一概不管,发送方可以指定接收方。
2.消息队列并不是严格意义上的先进先出,而是特定类型上的先进先出

信号量

信号量不同于管道和消息队列。信号量主要做的是进程同步的控制。这里涉及到的知识点有进程同步异步、临界资源与临界区、原子操作、P、V操作。
先来介绍一下进程同步和进程异步。进程同步是指,进程的执行必须按照一定的顺序进行。而所谓的进程异步指的是进程的执行都是相互独立的,当一个异步调用发发出后,调用方不能立即得到结果时,进程不会阻塞,而是需要某些内核机制来通知其处理。
说完进程同步异步,再来说说临界资源和临界区。所谓的临界资源指的是,同一时刻只能被一个进程访问使用的资源,临界资源可以有多份。而临界区指的是访问临界资源的代码区域。
接着来看一下原子操作,原子操作指的是不能被终止,也不能被暂停的操作,该操作一旦开始,只能等待其结束。
P操作:信号量-1;V操作:信号量+1
现在我们来介绍一下信号量,信号量类似于一个计数器,当信号量的值大于0时,记录临界资源的个数,当信号量等于0时,进程访问临界资源时必须阻塞。信号量利用这样的机制,来实现对进程同步的控制。

信号量的内核对象维护的是信号量集,其本质是信号量数组。

共享内存

共享内存是通过内核对象,将多个进程中的一个虚拟地址映射到内核对象所申请的一块物理内存上,因此当有进程向共享内存写入数据时,其他进程都可以访问这些数据,从而实现进程间数据的传递。
消息队列是最快的进程间通讯方式,但是进程间使用这块共享内存空间时,必须做同步控制

共享内存的特点:
1.多个进程共同操作一块物理内存,所以进程是同步的;
2.进程直接通过虚拟地址操作物理内存,而不需要对数据进行拷贝,所以共享内存是最快的进程间通讯方式。

几种进程通讯方式的比较

上面介绍了这几种进程通讯方式,接下来我们把他们放在一起来比较一下:
在这里插入图片描述
看完这些,你是不是已经知道了该怎么回答面试官这个问题?其实啊,面试的时候面试官向你提问主要是想了解你对某个知识点的掌握程度,同时对你的思维能力,语言表达能力,抗压能力进行的综合测试,所以面试的小伙伴在回答的问题的时候一定要思路明确,不要过度紧张,只需要将自己对知识点的理解表述清楚就好了,如果做到这些,相信你离心仪的offer已经不远了,好了,以上就是这些!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值