首页 > 编程知识 正文

java难题(mq消息队列面试题)

时间:2023-05-06 19:00:48 阅读:79306 作者:3019

有一次面试的时候,有人问我过程之间有什么交流方法,但我从来没有经过深思熟虑和整理,所以说不好。 我想大家都知道过程中有什么样的交流方式,很多人应该是通过“死记硬背”记住的。 因此,今天的这篇文章将详细说明他们是如何交流的,尽量了解他们的不同和优缺点等。 这样,以后让面试官给你举个例子,你也能马上抓住它。

1、管道

看看Linux上的句子

netstat -tulnp | grep 8080

我想学习过Linux命名的人都知道这个句子的意思。 其中|“在管道意义上,将上一个命令的输出作为下一个命令的输入。 此处将netstat -tulnp的输出结果作为名为grep 8080的命令的输入。 如果两个进程进行通信,则可以使用此管道进行通信。 而且,我们知道这条竖线没有名字,所以这个通信方式叫做匿名管道。

另外,该通信方式是单向的,只能将第一个命令的输出作为第二个命令的输入,如果进程之间想相互通信,就需要制作两个管道。

有匿名管道意味着有命名管道。 接下来创建命名管道吧。

mkfifo测试

此命令创建名为test的管道。

然后,一个进程在此管道中写入数据,另一个进程读取中的数据。

echo 'this is a pipe' test //写入数据

此时,如果未读取管道内容,则此命令将继续停止在此处,并且只有在另一个进程读取了test内容时,此命令才会结束。 然后用另一个进程读取

阅读cat 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的进程所以信号量也是进程之间的通信方式。

5 .插座

以上列出的共享内存、管道、信号和消息队列都有多个进程在一台主机之间通信,但两个相距几千英里的进程能通信吗?

答案是必须的。 这个时候,叫插座的男人会有帮助。 例如,我们平时从浏览器发送http请求,服务器返回对应的数据,这是采用套接字的通信方式。

总结

因此,进程之间的通信方法如下:

1、管道

2、消息队列

3、共享内存

4、信号量

5 .插座

到此为止,但之前看到进程间的通信方式时,我正在背诵。 我不理解他们的关系,优缺点,为什么会有这样的通信方式。 所以我最近花了一点时间研究

整理好这篇文章后,我相信读了这篇文章,能更好地理解各种通信方式的由来。

吵死了,最近有点

对不住各位,好久没写原创文章了。有点偷懒,哈哈。不过呢,我接下来会好好写文章的了,希望大家多多支持。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。