【Linux】消息队列信号量

2024-09-04 17:52
文章标签 linux 信号量 队列 消息

本文主要是介绍【Linux】消息队列信号量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

消息队列

原理

接口

指令

信号量

概念

对于信号量理论的理解

信号量的操作

 信号量的指令


消息队列

原理

消息队列提供了一个从一个进程向另外一个进程发送一个数据块的方法,每个数据块都有一个类型。对消息队列的的管理也是先描述,再组织!

接口

我们发现,消息队列和共享内存的接口极其相似,消息队列的属性也保存在ipc_perm结构体中,这个结构以中的第一个元素也是__key。

与共享内存不同的是,共享内存需要挂载到地址空间,消息队列是要收发节点,

msgsnd是用来向消息队列中发数据,msgid是消息队列的id,msgp是待发数据块的起始地址,msgsz是要发的数据块一共有多少字节,msgflg默认设置为0。

msgrcv是用来收数据,msgid是从哪个消息队列接受数据,msgp要收的数据块,msgsz是要收的数据块的大小,msgtyp是所收数据的类型,msgflg默认设置为0。

我们具体来看msgp,

 msgp是一个指针,指向struct msgbuf结构体,将来如果我们想发消息,可以这样:

为什么它们消息队列和共享内存的接口都是很相似的呢?原因就是它们都是System V标准。消息队列的生命周期也是随内核的

指令

我们怎么查看消息队列呢?可以使用 ipcs -q 查看,使用ipcs -q msqid来删除消息队列。

信号量

概念

对于信号量,我们首先要理解5个概念,

  1. 多个执行流(进程),能看到的一份资源,是共享资源。
  2. 被保护起来的资源,叫临界资源,保护资源的方式主要是同步和互斥。同步就是,只有一个进程写了,另一个进程才能读,我不写,你就不能读。
  3. 互斥:任何一个时刻只能有一个进程在访问共享资源。
  4. 只要是资源,就要被程序员访问,资源被访问,就是通过代码访问。在这些代码中,包括访问共享资源的代码不访问公共资源的代码访问共享资源的代码叫做临界区不访问公共资源的代码叫做非临界区
  5.  所谓对共享资源进行保护,本质是对访问共享资源的代码进行保护,这就是临界区。对临界区的保护其实就是在访问临界区之前做一些工作,如加锁、解锁。

对于信号量理论的理解

信号量,也叫信号灯,目的是来保护共享资源,进而变成临界资源(即一段代码)。信号量的本质就是一个计数器,比如count==25,

现在来讲一个小故事:我们都电影院看过电影,电影院有很多座位,我只要把这个座位的票买了,我就能拥有这个座位,看电影买票的本质,是对资源的  预定  机制!我们最担心,超出资源个数的卖票。我们可以用一个计数器保证票数的安全性。电影院就相当于临界资源,买票相当于申请信号量,票数相当于信号量的初始值。申请信号量本质就是对公共资源的一种预定机制。所以,我们的步骤应该是  申请信号量--访问共享内存--释放信号量,信号量就是一把计数器,是对临界资源进行预先申请的计数器,只要申请信号量成功了,临界资源中一定有一部分是属于你的。

另外,可能还会存在超级VIP电影院,票数只有一张,同样也要申请信号量,在你看电影期间,任何人申请不到信号量,这不就是互斥吗!!!相当于把共享资源整体使用。对共享资源整体使用,其实不就是资源只有一个吗?这种信号量只有1和0计数器值,叫做二元信号量。所以,信号量分为二元信号量多元信号量,二元信号量就是把整个资源当成整体,如果把整体资源当成很多份,那就是多元信号量。


我们可不可以用一个全局变量来充当信号量呢?不能!!!主要有两个原因:

  1. 全局变量不能被所有进程看到。
  2. gcount++/--,不是原子的。

因此,信号量也必须和共享内存、消息队列一样,也必须先让不同的进程看到同一个“计数器”。为什么信号量被纳入进程间通信的范畴呢?因为在进程间通信时,信号量也要被不同的进程看到同一块资源。也就是说,在访问公共资源(共享资源)之前,先要申请信号量,访问之后,释放信号量。

//申请信号量--
访问公共资源(共享资源)
//释放信号量++
-----------------
//也就是
if(gcount>0)gcount--;
elsewait;

不同的进程看到同一个“计数器”,这意味这什么呢?这意味着信号量也是一个公共资源!!!信号量是保护临界资源安全的,那这就要求信号量本身就是安全的。

信号量--    ->  必须是安全的    ->称为P操作

信号量++    ->  也必须是安全的    ->称为V操作

总称叫做PV操作。PV操作必须是安全的,原子性。

所以,如果现在我们有一块儿共享内存和一段访问它的代码,在访问之前要进行P操作,访问之后要进行V操作。

信号量的操作

我们只需简单了解一下信号量的操作:

 信号量的指令

ipcs -s     ------      查看信号量

ipcrm  -s  semid   ------       删除信号量

现在,我们已经学习了共享内存、消息队列、信号量,那么OS是如何把这三者管理起来的呢?首先,它们都使用System V标准。再者,它们的接口都是通过xxxget、xxxctl来获取和删除资源。我们还发现它们都有xxxid_ds的数据结构,这个数据结构里第一个成员都是struct ipc_perm,这里简单了解一下即可~。

这篇关于【Linux】消息队列信号量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136617

相关文章

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

Linux下屏幕亮度的调节方式

《Linux下屏幕亮度的调节方式》文章介绍了Linux下屏幕亮度调节的几种方法,包括图形界面、手动调节(使用ACPI内核模块)和外接显示屏调节,以及自动调节软件(CaliseRedshift和Reds... 目录1 概述2 手动调节http://www.chinasem.cn2.1 手动屏幕调节2.2 外接显

Linux(centos7)虚拟机没有IP问题及解决方案

《Linux(centos7)虚拟机没有IP问题及解决方案》文章介绍了在CentOS7中配置虚拟机网络并使用Xshell连接虚拟机的步骤,首先,检查并配置网卡ens33的ONBOOT属性为yes,然后... 目录输入查看ZFhrxIP命令:ip addr查看,没有虚拟机IP修改ens33配置文件重启网络Xh

linux实现对.jar文件的配置文件进行修改

《linux实现对.jar文件的配置文件进行修改》文章讲述了如何使用Linux系统修改.jar文件的配置文件,包括进入文件夹、编辑文件、保存并退出编辑器,以及重新启动项目... 目录linux对.jar文件的配置文件进行修改第一步第二步 第三步第四步总结linux对.jar文件的配置文件进行修改第一步进

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.