记一次面试:进程之间究竟有哪些通信方式?
有一次口试的时辰,被问到历程之间有哪些通讯方法,不外因为之前没深入思索且清算过,说的并欠好。想必各人也都知道历程有哪些通讯方法,然则我猜许多人都是靠着”背“来影象的,以是本日的这篇文章,讲给各人具体着讲授他们是怎样通讯的,让各人只管可以或许领略他们之间的区别、优弱点等,这样的话,往后头试官让你举例子,你也可以或许随手拈来。 1、管道 我们来看一条 Linux 的语句
学过 Linux 定名的预计都懂这条语句的寄义,个中”|“是管道的意思,它的浸染就是把前一条呼吁的输出作为后一条呼吁的输入。在这里就是把 netstat -tulnp 的输出功效作为 grep 8080 这条呼吁的输入。假如两个历程要举办通讯的话,就可以用这种管道来举办通讯了,而且我们可以知道这条竖线是没著名字的,以是我们把这种通讯方法称之为匿名管道。 而且这种通讯方法是单向的,只能把第一个呼吁的输出作为第二个呼吁的输入,假如历程之间想要相互通讯的话,那么必要建设两个管道。 居然有匿名管道,那也意味着有定名管道,下面我们来建设一个定名管道。
这条呼吁建设了一个名字为 test 的定名管道。 接下来我们用一个历程向这个管道内里写数据,然后有其它一个历程把内里的数据读出来。
这个时辰管道的内容没有被读出的话,那么这个呼吁就会一向停在这里,只有当其它一个历程把 test 内里的内容读出来的时辰这条呼吁才会竣事。接下来我们用其它一个历程来读取
我们可以看到,test 内里的数据被读取出来了。上一条呼吁也执行竣事了。 从上面的例子可以看出,管道的关照机制相同于缓存,就像一个历程把数据放在某个缓存地区,然后等着其它一个历程去拿,而且是管道是单向传输的。 这种通讯方法有什么弱点呢?显然,这种通讯方法服从低下,你看,a 历程给 b 历程传输数据,只能守候 b 历程取了数据之后 a 历程才气返回。 以是管道不得当频仍通讯的历程。虽然,他也有它的利益,譬喻较量简朴,可以或许担保我们的数据已经真的被其他历程拿走了。我们平常用 Linux 的时辰,也算是常常用。 2、动静行列 那我们能不能把历程的数据放在某个内存之后就顿时让历程返回呢?无需守候其他历程来取就返回呢? 答是可以的,我们可以用动静行列的通讯模式来办理这个题目,譬喻 a 历程要给 b 历程发送动静,只必要把动静放在对应的动静行列里就行了,b 历程必要的时辰再去对应的 动静行列里取出来。同理,b 历程要个 a 历程发送动静也是一样。这种通讯方法也相同于缓存吧。 这种通讯方法有弱点吗?答是有的,假如 a 历程发送的数据占的内存较量大,而且两个历程之间的通讯出格频仍的话,动静行列模子就不大得当了。由于 a 发送的数据很大的话,意味发送动静(拷贝)这个进程必要花许多时刻来读内存。 哪有没有什么办理方案呢?答是有的,请继承往下看。 3、共享内存 共享内存这个通讯方法就可以很好着办理拷贝所耗损的时刻了。 这个也许有人会问了,每个历程不是有本身的独立内存吗?两个历程怎么就可以共享一块内存了? 我们都知道,体系加载一个历程的时辰,分派给历程的内存并不是现实物理内存,而是假造内存空间。那么我们可以让两个历程各自拿出一块假造地点空间来,然后映射到沟通的物理内存中,这样,两个历程固然有着独立的假造内存空间,但有一部门却是映射到沟通的物理内存,这就完成了内存共享机制了。 4、信号量 共享内存最大的题目是什么?没错,就是多历程竞争内存的题目,就像相同于我们平常说的线程安详题目。怎样办理这个题目?这个时辰我们的信号量就上场了。 信号量的本质就是一个计数器,用来实现历程之间的互斥与同步。譬喻信号量的初始值是 1,然后 a 历程来会见内存1的时辰,我们就把信号量的值设为 0,然后历程b 也要来会见内存1的时辰,看到信号量的值为 0 就知道已经有历程在会见内存1了,这个时辰历程 b 就会会见不了内存1。以是说,信号量也是历程之间的一种通讯方法。 5、Socket 上面我们说的共享内存、管道、信号量、动静行列,他们都是多个历程在一台主机之间的通讯,那两个相隔几千里的历程可以或许举办通讯吗? 答是必需的,这个时辰 Socket 这家伙就派上用场了,譬喻我们平常通过赏识器提倡一个 http 哀求,然后处事器给你返回对应的数据,这种就是回收 Socket 的通讯方法了。 总结 以是,历程之间的通讯方法有: 1、管道 2、动静行列 3、共享内存 4、信号量 5、Socket 讲到这里也就完结了,之前我看历程之间的通讯方法的时辰,也算是死记硬背,并没有去领略他们之间的相关,优弱点,为什么会有这种通讯方法。
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |