进程通信方式

进程通信方式

1、管道(BIO)

例举一个我最常用的linux命令

ps -ef|grep java

其中 | 就是管道的意思,它的作用就是把前面的输出 ps -ef(列出所有进程),作为 grep java 的输入。最终完成列出所有包含java字符的进程信息。由于这条竖线是没有名字的,所以它被定义为匿名管道。而且它只能单向传递,所以它也叫单向管道。
如果想创建一个命名管道可以通过 mkfifo命令创建,创建后可以使用输入>对其输入数据,之后用<输出读取数据。只有完成一个完整的输入输出才能完成一个完整的处理流程,完整的命令才会执行结束
例如

mkfifo data
ps -ef > data
cat < data

只有当cat < data成功执行后 ps -ef才会成功结束,资源才会被释放。
所以它的劣势很明显了,处于bio的阶段,不完全执行完就会阻塞。因而有了升级方案消息队列。

2、消息队列(nio)

消息队列就很好理解了进入到了nio的时代,a进程是生产者,生产的数据放到消息队列(一般是阻塞队列)中,这时a进程可以继续做自己的事,b进程获取a进程的信息时只需要从消息队列中获取。
在真实的生产环境中,a进程会发送庞大的数据,这时消息队列的劣势就体现出来了,发送消息和获取消息就会耗费很多的资源和时间。所以就有了共享内存的出现。

3、共享内存

非要强行比喻一下的话共享内存可以说是epoll
系统加载一个进程的时候,分配给进程的内存并不是实际物理内存,而是通过分段分页表映射的内存空间。那么我们可以让两个进程各自拿出一块虚拟地址空间来,然后映射到相同的物理内存中,这样一来两个进程虽然有着独立的虚拟内存空间,但有一部分却映射到了相同的物理内存,这就是共享内存了。
en一旦共享,我们就想到了临界资源的竞争了。这也就是共享内存的弊端。

4、信号量

共享内存最大的问题就是多进程竞争内存的问题,就像类似于我们平时说的线程安全问题。信号量就时用来解决这个问题的。

信号量的本质就是一个计数器,用来实现进程之间的互斥与同步。例如信号量的初始值是 1,然后 a 进程来访问内存1的时候,我们就把信号量的值设为 0,然后进程b 也要来访问内存1的时候,看到信号量的值为 0 就知道已经有进程在访问内存1了,这个时候进程 b 就会访问不了内存1。所以说,信号量也是进程之间的一种通信方式

5、Socket

远程的进程通信,比如我们最常用的ssh登录命令,就是我们这里的登录请求和目标主机上的登录处理进程进行的通信了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章