准备面试的过程中,可能由于时间比较紧,市面上大量的面经扑面而来,面经确实可在兵荒马乱之时有用武之地,不过是短暂的,下面给大家分享下进程间的几种通信方式。
1管道
学习软件工程规范的时候,我们知道瀑布模型,在整个项目开发过程分为多个阶段,上一阶段的输出作为下一阶段的输入。各个阶段的具体内容如下图所示
最初我们在学习Linux基本命令使用的时候,我们经常通过多个命令的组合来完成我们的需求。比如说我们想知道如何查看进程或者端口是否在使用,会使用下面的这条命令
这里的
实际上就是管道的意思。
前面部分作为
后面的输入,很明显是单向的传输,这样的管道我们叫做匿名管道,自行创建和销毁。既然有匿名管道,应该就有带名字的管道命名管道。如果你想双向传输,可以考虑使用两个管道拼接即可。
创建命名管道的方式
test即为管道的名称,在Linux中一切皆文件,管道也是以文件的方式存在,咋们可以使用ls-l查看下文件的属性,它会p标识。
下面我们向管道写入内容
echotest
此时按道理来说咋们已经将内容写入了test,没有直接输出是因为我们需要开启另一个终端进行输出(可以理解为暂存管道)
cattest
ok,我们发现管道内容被读出来,同时echo退出。那么管道这种通信方式有什么缺点?我们知道瀑布模型的软件开发模式是非常低下的,同理采用管道进行通信的效率也很低,因为假设现在有AB两个进程,A进程将数据写入管道,B进程需要等待A进程将信息写完以后才能读出来,所以这种方案不适合频繁的通信。那优点是什么?
最明显的优点就是简单,我们平时经常使用以致于都不知道这是管道。鉴于上面的缺点,我们怎么去弥补呢?接着往下看
2消息队列
管道通信属于一股脑的输入,能不能稍微温柔点有规矩点的发送消息?
答:可以的。消息队列在发送数据的时候,按照一个个独立单元(消息体)进行发送,其中每个消息体规定大小块,同时发送方和接收方约定好消息类型或者正文的格式。
在管道中,其大小受限且只能承载无格式字节流的方式,而消息队列允许不同进程以消息队列的形式发送给任意的进程。
但是当发送到消息队列的数据太大,需要拷贝的时间也就越多,所以还有其他的方式?继续看
3共享内存
使用消息队列可以达到不错的效果,但是如果我们两个部门需要交换比较大的数据的时候,一发一收还是不能及时的感知数据。能不能更好的办法,双方能很快的分享内容数据,答:有的,共享内存
我们知道每个进程都有自己的虚拟内存空间,不同的进程映射到不同的物理内存空间。那么我们可不可以申请一块虚拟地址空间,不同进程通过这块虚拟地址空间映射到相同的屋里地址空间呢?这样不同进程就可以及时的感知进程都干了啥,就不需要再拷贝来拷贝去。
我们可以通过shmget创建一份共享内存,并可以通过ipcs命令查看我们创建的共享内存。此时如果一个进程需要访问这段内存,需要将这个内存加载到自己虚拟地址空间的一个位置,让内核给它一个合法地址。使用完毕接触板顶并删除内存对象。
那么问题来了,这么多进程都共享这块内存,如果同时都往里面写内容,难免会出现冲突的现象,比如A进程写了数字5,B进程同样的地址写了6就直接给覆盖了,这样就不友好了,怎么办?继续往下看
4信号量
为了防止冲突,我们得有个约束或者说一种保护机制。使得同一份共享的资源只能一个进程使用,这里就出现了信号量机制。
信号量实际上是一个计数器,这里需要注意下,信号量主要实现进程之间的同步和互斥,而不是存储通信内容。
信号量定义了两种操作,p操作和v操作,p操作为申请资源,会将数值减去M,表示这部分被他使用了,其他进程暂时不能用。v操作是归还资源操作,告知归还了资源可以用这部分。
5信号
从管道----消息队列-共享内存/信号量,有需要等待的管道机制,共享内存空间的进程通信方式,还有一种特殊的方式--信号
我们或许听说过运维或者部分开发需要7*24小时值守(项目需要上线的时候),当然也有各种监管,告警系统,一旦出现系统资源紧张等问题就会告知开发或运维人员,对应到操作系统中,这就是信号。
在操作系统中,不同信号用不同的值表示,每个信号设置相应的函数,一旦进程发送某一个信号给另一个进程,另一进程将执行相应的函数进行处理。也就是说先把可能出现的异常等问题准备好,一旦信号产生就执行相应的逻辑即可。
6套接字
上面的几种方式都是单机情况下多个进程的通信方式,如果我想和相隔几千里的小姐姐通信怎么办?
这就需要套接字socket了。其实这玩意随处可见,我们平时的聊天,我们天天请求浏览器给予的响应等,都是这老铁。
7总结
分享了一下几种进程间通信方式,希望大家能知其然并知其所以然,机械式的记忆容易忘记哦。
管道消息队列共享内存信号量信号套接字所有私藏资料我都贡献出来了!!
我写了一套页的Java学习手册,以及珍藏四本Java人必读4大神器,分享到知乎已经3万赞了!
整个资料包内容专注Java技术,包括:
Java概述,基本语法,数组;面向对象,多态,接口,异常;集合框架,IO流,多线程,企业级框架,HTML;数据库,spring,Javaweb,项目实战;GitHub,IDEA,算法,面试题等相关内容...
如果你想获得完整PDF可以通过以下方式获得:
(Java基础精选视频)
资料获取方式:
转发加