二十四、信号、管道、消息队列和共享内存

简介: 二十四、信号、管道、消息队列和共享内存

1、信号-signal


信号是软件对中断通知事件的处理。


Examples:SIGFPF,SIGKILL,SIGUSR1,SIGSTOP,SIGCONT


软件接收到信号是会有以下几种处理方式:


Catch:指定信号处理函数被调用


Ignore:依靠操作系统默认操作,Example:Abort,memory,dump,suspend or resume process


Mask:闭塞信号因此不会传送,但当处理同种类型的信号时,可能知识暂时不会传送


应用程序信号处理和内核的交互过程如下图所示:



63258d1595da454aae96697ed7f6e33c.png


2、管道-pipe



管道是用来进行数据交换的,其本质是内核中的一块缓冲区buffer。


在Linux中的分页显示目录的功能可以通过下述语句进行实现:


ls | more

其中,ls和more都是shell创建进程,他们通过管道来进行数据交换,如下图所示:

d5502a1e44434300aa2ad54c5776228d.png



进程ls和more不关系是从哪里读取或者写入到哪里,在内存中实际上ls将数据会输出到内存中的一块buffer(缓冲区),而more会从内存缓冲区buffer中取数据。buffer的大小是有限,当管道buffer填满之后,ls会进入sleep状态;同样,当管道buffer中没有数据时,more也会进入sleep状态。




3、消息队列-message queue


消息队列也是数据传输的一种机制,管道是父进程为子进程建立的数据连接关系,若进程之间不是同一个父进程,则管道没法工作;消息队列可以实现多个不相关的进程通过消息队列来传递数据,同时消息队列中传递的数据可以是结构化的数据。消息队列按照FIFO的方式来管理消息,消息队列对信息处理的方式如下图所示:


755ddbcd4f984dc2b732db4a10c3de6f.png

4、共享内存-share memory


前面两种管道和消息队列都是间接通信的方式,共享内存是一种直接通信的方式。几个进程之间共享一块内存空间。每一个进程都有自己私有的地址空间,但在每个地址空间中,又明确地设置了共享内存段。直接读写方式,不用send和receive来完成数据共享,其优点是可以使得进程凯苏方便地共享数据,其不足是必须同步数据访问。共享内存示意图如下图所示:



4a982aa141b244aa86875e39790ea9ef.png






相关文章
|
2月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
250 14
|
1月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
126 48
|
2月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
185 20
|
7月前
|
消息中间件 Linux 开发者
Linux进程间通信秘籍:管道、消息队列、信号量,一文让你彻底解锁!
【8月更文挑战第25天】本文概述了Linux系统中常用的五种进程间通信(IPC)模式:管道、消息队列、信号量、共享内存与套接字。通过示例代码展示了每种模式的应用场景。了解这些IPC机制及其特点有助于开发者根据具体需求选择合适的通信方式,促进多进程间的高效协作。
273 3
|
7月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
116 0
|
7月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
在操作系统中,进程间通信(IPC)是至关重要的,它提供了多种机制来实现不同进程间的数据交换和同步。本篇文章将详细介绍几种常见的IPC方式,包括管道、信号、消息队列、共享内存、信号量和套接字,帮助你深入理解并合理应用这些通信方式,提高系统性能与可靠性。
534 0
|
8月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
8月前
|
消息中间件 Java C语言
消息队列 MQ使用问题之在使用C++客户端和GBase的ESQL进行编译时出现core dump,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
6月前
|
消息中间件
手撸MQ消息队列——循环数组
队列是一种常用的数据结构,类似于栈,但采用先进先出(FIFO)的原则。生活中常见的排队场景就是队列的应用实例。在数据结构中,队列通常用数组实现,包括入队(队尾插入元素)和出队(队头移除元素)两种基本操作。本文介绍了如何用数组实现队列,包括定义数组长度、维护队头和队尾下标(front 和 tail),并通过取模运算解决下标越界问题。此外,还讨论了队列的空与满状态判断,以及并发和等待机制的实现。通过示例代码展示了队列的基本操作及优化方法,确保多线程环境下的正确性和高效性。
82 0
手撸MQ消息队列——循环数组