骏马金龙

网名骏马金龙,钟情于IT世界里的各种原理和实现机制,强迫症重症患者。爱研究、爱翻译、爱分享。特借此一亩三分田记录自己成长点滴!!!
我本问道人,道心不坚,必将与道无缘!

每天3分钟操作系统修炼秘籍(19):进程间通信(5):消息队列和信号

点我查看秘籍连载

消息队列

消息队列(Message Queue)用于在进程之间传递较小的数据,进程可以向一个或多个消息队列中放入数据(消息),其它进程可以从消息队列中按照各种方式(例如最典型的先进先出FIFO方式)取出消息,从而实现进程间通信。

消息队列是一种生产者消费者模型,生产者生产消息放入队列,等待被消费者消费走。如果消息队列已满,生产者被阻塞,如果队列已空,消费者被阻塞。当然,按照不同设计方式,可能会以通知的方式替代阻塞行为。

在分布式系统中,也常使用消息队列模型(如RabbitMQ、Kafka)在多个服务程序之间异步地传递消息。

信号

在现实生活中,红绿灯就是非常常见的信号灯,人在收到红绿灯代表的信号后,就会做出对应的处理:红灯停、绿灯行、黄灯亮了等一等。

Linux中的绝大多数信号都是由内核发送的,所以在发送信号给某进程之前,需要先陷入内核。

Linux中定义了很多信号类型,这些信号都有默认的处理方式(例如红灯亮的信号,人的默认处理方式是停下),但程序内也可以自定义信号的处理方式(例如,红灯亮了偏不停)。当内核将相关信号发送给进程,该进程接收到这些信号后,会触发对应的信号处理程序去处理该信号,从而打断该进程的正常执行流程。

在shell中,也支持信号机制,可通过kill命令发送信号给指定进程。可能这里会出现一个疑惑,刚才说信号绝大多数是由内核发送的,为什么kill命令(bash下有两个kill命令,一个是bash内置kill命令,一个是外置kill命令,但无论如何,都是用户进程)对应的进程能够发送信号给其它进程?这是因为kill发送的信号先是传递给内核的,内核再将这个信号传递给对应进程。所以这里需要进行一次上下文切换。

posted @ 2019-11-18 13:19  骏马金龙  阅读(...)  评论(...编辑  收藏