第5章 进程的通信

5.1 进程为什么 要进行通信

  •   父进程、子进程之间的通信:进程作为人造科学,通信是必须的;如果没有同学进程之间的协作将打上一个大的折扣;比如进程fork 出子进程来进程工作,这时父进程需要时刻管理子进程的状态;如果子进程一直忙绿,父进程可以再fork 一些子进程来并发工作;如果子进程空闲了很久,就直接把进程kill掉,释放资源,所以进程通信是必须的。
  •  微服务的远程过程调用RPC:client ---tcp、udp --> 访问service
  • 进程之前的通信---IPC(Inter-Porcess Communication)
  •  进程至少有一个线程,所以进程的通信,一定程度上也就是线程的通信;一般称为线程同步 

5.2 进程对白: 管道、记名管道、套接字

  • 通信最简单的方式就是:对白,就像我们说话一样,一方发出声音,通过传输介质(空气、光缆),另一方接收信息;这种模式我们抽象成“管道” 。管道就是2个进程通信的介质,一个进程写入,另外一个进程读;是一种点--点的通信方式。管道的创建方式有2种:一种是shell 用“|” 来表示,前面是写入,后面是读取;另外一种是调用系统函数 popen pipe 来创建一个管道,然后调用管道的函数进行数据的写入和读取!
  • 记名管道: 当2个不相关的进行进行通信时,必须要创建记名管道,就是给管道起了一个名字,让进程可以找到这个管道,然后进行通信
  • 套接字:socket 就是一种微服务的远程通信方式,创建一个sever bing 一个port,然后启动listen;创建一个client scoket,并新建一个connection,并发送给server 的链接请求,建立链接后完成数据的send和rev 的工作。


5.3 信号

使用管道和套接字确实很方便进程间通信,但是二者都需要新建立管道和socket ,建立需要占用系统资源;既然占用系统资源新建了socket,那必须要尽量多的完成通信,否则会造成资源浪费!而且管道和socket 都是建立通信,所以2个进程的通信都是自愿的,即有些通信我可以不接受,有些我可以接受!

  • 这时我们引入信号的概念: kill -9 pid ,信号的使用场景:
  • 迫使对方进程必须做出回应
  • 不想建立任何链接,临时突然想跟另外一个进程进行通信
  • 传输的信号量微小,使用管道和socket 不划算


5.4  信号量

信号量的作用类似于火车轨道的旗语,防止2个火车到同一轨道,造成2辆火车撞车!具体后面介绍


5.5 共享内存

当2个进程需要共享大量数据时上面 pipe 、socket、siginal 等就不是很适应了;此时我们就引入“共享内存” 的概念,共享内存就是两个进程共同拥有同一片内存,对于这片内存的任何内容,二者均可以访问。要使用共享内存进行通信,一个进程首先要创建一片内存空间专门作为通信使用,其他进程则将该片内存映射到自己(虚拟)的内存空间。这样,读写自己地址空间中对应共享内存的区域时,就是在和其他进程进行通信。

  • 共享内存跟管道思路差不多 ,都是先建立一个管道或者内存,然后完成进程间的通信;但是管道是一端写入,一端读取;但共享内存是2端都可以写、都可以读。但共享内存的缺点就是管理复杂,因为2端都可以读写,肯定是造成脏数据的可能性,所以要做好数据的保护!
  • 共享内存必须在同一台物理机器上的2个进程使用,比起socket 这个缺点也是比较明显


5.6 消息队列(中间件)

消息队列实质就是一个queue,不过这个queue里面放的是message,所谓的message 实质也是包含代码需要的信息数据的一个“数据体”,程序获取到这个数据体后根据代码的逻辑完成对这个message的处理。作为queue 不用care “数据体”内部data 的含义,只需要做好put、pop 的动作就好,然后根据queue 最大size 进行判断,如果queue 满了根据约定好的策略进行丢弃message即可。
  • queue 把新的message put 到queue 的最后面,处理一个message时,从queue 的最前面pop 出来一个message;
  • 从这个角度看有点类似于管道,但不是管道;消息队列有自己的特性:
  • 消息queue 没有固定的读、写,任何进程都可以读、写;而且消息队列可以支持多个进程同时写入、获取queue的“数据体”






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值