【Linux】system V 消息队列 | system V 信号量(简单赘述)

简介: 【Linux】system V 消息队列 | system V 信号量(简单赘述)

这两部分主要是了解即可,为后面学习做铺垫

1 . system V 消息队列(了解)


486c33c2dd564ba496ef704666e30138.png

为了让两个进程间通信 创建一个队列queue

进程A可以通过消息队列的系统调用接口,把自己的数据块链入队列中

进程B也可以把自己的数据块链入队列中

这个队列就是一种共享资源

进程A想要读取数据时,只需要在队列中读取不是自己的数据

接口

创建消息队列 , 输入 man msgget 指令

3f757dd625354399945eb7b26e6031b2.png

key值含义与msgflg选项 不懂具体可以看 :system v 共享内存

返回值为消息队列的标识符


e49b170611424bdbbeb6fbeccff3166a.png

操作系统要把多种消息队列管理起来,先描述在组织,每一个消息队列都有自己的结构体对象,对应的结构体对象包含当前消息队列的属性

查看消息队列

输入 ipcs -q 指令

0e0a43a6d8d84782b61128cb86bc3681.png

删除消息队列 ipcs -q msqid值 即可删除

2.system V 信号量 (了解)

1.进程互斥等概念的理解


把大家都能看到的资源称为公共资源

1. 互斥:在任何时刻,都只允许一个执行流在进行共享资源的访问

2.临界资源 把任何一个时刻,只允许一个执行流在进行访问的共享资源,叫做临界资源

3. 临界区临界资源是要通过代码访问的,凡是访问临界资源的代码叫做临界区

4. 原子性 进行某些计算机操作时,要么不做要么就做完,只有两种确定状态的属性

不关心中间状态,只要求结果


2.认识信号量

通过一个故事来进行理解

想要去放映厅A看电影,这个放映厅是对所有人都共享的

但是每个人都是有自己的座位的,不能随便找个地方就坐


进放映厅是都需要买票的,买票的本质是:

1.对座位资源的预订机制

(买票的时候座位就已经属于你了)

2.确报不会因为多放出去特定的座位资源,而导致冲突

(不可能出现买票的人比座位多的情况发生)


每一个人可以看作一个执行流,当想访问某一个内存空间时,通过买票预订机制就不会出现访问空间出现冲突


如果放映厅是顶级VIP级别,只有一个座位 ,当这个座位对应的票被预订了,其他人就不会预定了,所以看电影期间,不会有人打扰,就相当于完成互斥功能


信号量又称为信号灯

本质是一个计数器 即描述资源数量的计数器 假设为count

任何一个执行流,想访问临界资源的一个资源时,不能直接访问

如想看电影就直接冲入放映厅里随便找个座位,不管谁叫都不起来,不可以这样做的


必须先申请信号量资源,count 作为资源数量就会减1 即count–

只要申请信号量成功, 就一定能拿到一个子资源


进入自己的临界区,访问自己的临界资源

离开就要释放信号量资源,即count++ ,只要计数器进行了增加,就表示对应的资源进行了归还


96160f74db8045f0b9bfc231a5cebc5c.png

进入临界区前申请信号量(P操作),退出临界区前释放信号量(V操作)


进程通过执行代码来申请,必须遵循规则,都必须先申请信号量,再释放信号量

遵循规则的前提是:所有的进程都得看到信号量

这样信号量本身就变成共享资源,这就需要信号量保证自身++或- -操作是原子的(要么就不加,要么就加完了),来保证自身安全


3. 接口

获取信号量

输入 man semget 指令


34a5c6e5425d42618aafd79e036417ea.png

key值与semflg选项可以去上面去寻找对应链接

nsems代表信号量数

返回的是信号量的计数器


ipcs -s 查看信号量


5b26a33f6e1b4889a49c27b6552c87cf.png

ipcrm -s +信号量id 删除信号量

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