进程之间究竟有哪些通信?方式?如何通信?

文章来自帅地玩编程
进程之间究竟有哪些通信?方式?如何通信?
1、管道
我们来看?一条 Linux 的语句句

netstat -tulnp | grep 8080

 学过 Linux 命名的估计都懂这条语句句的含义,其中”|“是管道的意思,它的作?用就是把前?一条命令的输出

作为后?一条命令的输?入。在这?里里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输?入。如
果两个进程要进?行行通信的话,就可以?用这种管道来进?行行通信了了,并且我们可以知道这条竖线是没有名字
的,所以我们把这种通信?方式称之为匿匿名管道。
并且这种通信?方式是单向的,只能把第?一个命令的输出作为第?二个命令的输?入,如果进程之间想要互相
通信的话,那么需要创建两个管道。
居然有匿匿名管道,那也意味着有命名管道,下?面我们来创建?一个命名管道。

makefifo test

这条命令创建了了?一个名字为 test 的命名管道。
接下来我们?用?一个进程向这个管道?里里?面写数据,然后有另外?一个进程把?里里?面的数据读出来。

 

echo "this is a pipe">test

 

这个时候管道的内容没有被读出的话,那么这个命令就会?一直停在这?里里,只有当另外?一个进程把 test ?里里

?面的内容读出来的时候这条命令才会结束。接下来我们?用另外?一个进程来读取

cat < test//读数据

我们可以看到,test ?里里?面的数据被读取出来了了。上?一条命令也执?行行结束了了。
从上?面的例例?子可以看出,管道的通知机制类似于缓存,就像?一个进程把数据放在某个缓存区域,然后等
着另外?一个进程去拿,并且是管道是单向传输的。
这种通信?方式有什什么缺点呢?显然,这种通信?方式效率低下,你看,a 进程给 b 进程传输数据,只能等
待 b 进程取了了数据之后 a 进程才能返回。
所以管道不不适合频繁通信的进程。当然,他也有它的优点,例例如?比较简单,能够保证我们的数据已经真
的被其他进程拿?走了了。我们平时?用 Linux 的时候,也算是经常?用。
2、消息队列列
那我们能不不能把进程的数据放在某个内存之后就?马上让进程返回呢??无需等待其他进程来取就返回呢?
答是可以的,我们可以?用消息队列列的通信模式来解决这个问题,例例如 a 进程要给 b 进程发送消息,只需
要把消息放在对应的消息队列列?里里就?行行了了,b 进程需要的时候再去对应的 消息队列列?里里取出来。同理理,b 进
程要个 a 进程发送消息也是?一样。这种通信?方式也类似于缓存吧。
netstat -tulnp | grep 8080
mkfifo test
echo "this is a pipe" > test // 写数据
cat < test // 读数据
这种通信?方式有缺点吗?答是有的,如果 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

进程之间究竟有哪些通信?方式?如何通信?

上一篇:vmware安装 linux centos7


下一篇:2、shell脚本格式