Linux学习记录—— 이십일 进程间通信(3)信号量和消息队列

news2024/10/7 14:25:02

文章目录

  • 1、消息队列
  • 2、信号量
    • 1、了解概念
    • 2、信号量理解
  • 3、接口
  • 4、理解IPC


1、消息队列

两个进程ab之间系统维护一个队列结构,a进程往队列里放信息,信息编号为1,b进程往队列里放信息,信息编号为2;之后开始读取数据的时候,a就会读2的数据,b就会读1的数据。系统中有很多很多的消息队列,系统就会建立一个结构体来管理这些数据。

创建一个消息队列的接口是msgget

在这里插入图片描述

masflg参数就是IPC_CREAT IPC _EXCL, key之前写过,在这里就是一个共享内存的号。查看命令ipcs -q,删除ipcrm -q。接口删除则是这样

在这里插入图片描述

在这里插入图片描述

用man来查看。消息队列有msgsnd, msgrcv发送和接受接口。消息队列发送的消息是一个结构体类型,一个long变量,一个柔性数组,数组是要发的消息,long变量则是数据类型

消息队列是比较老旧的知识,不推荐使用,用起来也不是很舒服,完全有更好的通信方案使用。

2、信号量

1、了解概念

所有人都能看到的资源是公共资源,为了保护这个资源,系统在任何一个时刻,都只允许一个进程在进行共享资源的访问,这个就是互斥。

对于任何一个时刻,都只允许一个执行流在进行访问的共享资源叫做临界资源。比如管道。

临界资源是通过代码访问的,凡是访问临界资源的代码的区域,叫做临界区。

原子性是指要么做要么做完的两种确定状态的属性。

2、信号量理解

信号量也叫信号灯,它相当于一个计数器count,用来描述资源数量,这个资源就是临界区里可以存储的资源。任何一个执行流,想访问临界资源中的一个子资源的时候,不能直接访问,需要先申请信号量资源,也就是看看临界区里还有多少可以存储的位置,申请成功一个count就减1,;当离开临界区时,就要释放对应的临界资源,count就是加1。如果count为0,申请信号量这个进程就会被挂起。count一直为0,进程就一直阻塞,知道count又大于0。

每一个进程都会在进入临界区之前申请信号量,出去时释放信号量。

无论进程都需要先看到信号量才行。系统把信号量做成一个共享资源,信号量的+±-也具有原子性。

申请信号量资源当作P操作,释放信号量资源当作V操作,信号量的相关操作其实就是PV操作。

由于进程需要看到同一个计数器资源,所以信号量被归类到了进程间通信。

如果计数器是1,当有一个进程申请好信号量资源,count减为0后,其它进程就无法拿到资源,这就形成了一个二元信号量,也就是一个互斥功能。

3、接口

semget接口,它有key,semflg参数,semflg有两个选项IPC_CREAT IPC_EXCL,但中间还有一个参数nsems,这个参数的意思就是信号量的个数,也就是说一个进程可以一次性申请多个信号量,查看信号量就是ipcs -s,杀掉信号量就是ipcrm -s + 信号量编号。

semctl接口也可以用来删除,semctl接口有semnum的参数,代表要对哪一个信号量进行操作,cmd参数则是对应一些选项,而它还有其他参数,是一些可变参数,用man查看会看到更多详细信息。

semop接口则是操作信号量,参数中semid表示要操作的信号量;struct sembuf* sops参数是一个需要显式定义的结构体,里面要有哪个信号量,要做的操作,flag则是有一些自己的选项,可以选默认。

4、理解IPC

共享内存有自己的数据结构。

在这里插入图片描述

这是用户层可以看到的数据结构,系统底层有更多的信息,它只是给了用户可以看到的信息。

信号量,共享内存,消息队列的结构体中有很多共同点,比如第一个变量struct ipc_perm shm/sem/msg_perm。

系统会定义一个数组,放的就是struct ipc_perm* ipc_id_arr[]类型的,所以是一个指针数组,其中的元素指向struct ipc_perm类型的变量,也就是像信号量等结构体的第一个变量,指向第一个也就指向了整个结构体。所以这样就可以将内核中的所有ipc资源统一以数组的方式进行管理。如果想访问共享内存的其它元素,那就把这个数组强制转换类型成共享内存的结构体类型就好了。这对于系统是可以优化好的。

上面写的perm变量是什么?其实就是多态。信号量,消息队列结构体中的这个变量就是基类,指针数组的元素指向一个子类对象,就使用了对应的perm。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HADOOP伪分布式安装步骤

HADOOP安装步骤 一.创建Hadoop用户 二.更新apt和安装vim编辑器 更新apt: sudo apt-get install update安装VIM编辑器: apt install vim在弹出的提示中输入yes(y) 三、安装SSH和配置SSH无密码登录 apt install openssh-serverssh登录: ssh localh…

Vue2组件通信专题

组件通信专题 一、vue2中常用的6中组件通信方式 1. props 适用于的场景:父子组件通信 注意事项: 如果父组件给子组件传递数据(函数):本质其实是子组件给父组件传递数据。 如果父组件给子组件传递数据&#xff08…

【致敬未来的攻城狮计划】— 连续打卡第七天:(电脑重装系统)学习RA产品家族选型手册

系列文章目录 1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下 2.开发环境的选择和调试(从零开始,加油) 3.欲速则不达,今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

大数据hadoop课程实验总结

1一.安装hadoop 本门课程使用的是centos7.2 64位操作系统,原生hadoop2.7.7,java1.7版本。 安装centos7.2系统: 创建系统的同时创建一个名为hadoop的账户。这一步不难,此处就不再详说。 没有hadoop用户可以创建一个Hadoop用户: …

ChatBox安装--ChatGPT的桌面客户端

ChatBox 是什么 是开源的 ChatGPT API (OpenAI API) 桌面客户端,Prompt 的调试与管理工具,支持 Windows、Mac 和 Linux。 > github地址 下载链接 支持的平台: Windows : 请下载.msi安装包 Mac:请下载.dmg(推荐…

【微服务笔记13】微服务组件之Config配置中心基础环境搭建

这篇文章,主要介绍微服务组件之Config配置中心基础环境搭建。 目录 一、Config配置中心 1.1、什么是配置中心 1.2、Config配置中心特点 二、搭建Config配置中心 2.1、配置Git仓库 2.2、创建ConfigServer服务端 (1)引入依赖 &#xff…

性能测试,监控磁盘读写iostat

性能测试,监控磁盘读写iostat iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU使用情况。同vmstat一样,ios…

【iOS-#import <> ““, @class和C- #include<> ““, 】

前言 寒假分享会的遗漏问题总结 引入 在C/CPP语言里&#xff0c;引入某个头文件的操作 #include<iostream> #include<string>也有 #include "string"同样在OC里面 引入某个类会用到 #import关键字 #import "LoginViewController.h" #im…

web开发HTML生成PDF的三种解决方案(服务器端mpdf、html2canvas.js、浏览器打印、PDF虚拟打印机)

系列文章目录 python数据可视化开发(4)&#xff1a;爬取对应地址的pdf文档并分类保存到本地文件夹&#xff08;爬虫&#xff09;php使用mPDF实战案例分析字符串太长时文本变小无法自动分页的解决方案web开发HTML生成PDF的三种解决方案&#xff08;服务器端mdf、h2pdf.js、浏览…

Nuxt.js - 超详细实现路由 “伪静态“,将浏览器网页路径 URL 链接后面加上 .html 后缀名称(可以自定义任何结尾后缀名称)详细示例教程

前言 正常的项目,路由都是 /index | /user/add 这种,但有一个办法可以让其后面带上 .html,比如:/index.html。 本文 在 Nuxt.js 项目中,描述了如何实现伪静态详细教程,让页面路由后面都跟上一段自定义后缀名,比如 .html / .asp, 你可以按照本文的教程,最终得到伪静态…

阿赵的MaxScript学习笔记分享十四《Struct结构体的使用和面向对象的思考》

MaxScript学习笔记目录 大家好&#xff0c;我是阿赵 之前写了一些MaxScript的学习笔记&#xff0c;里面实现的功能不算很复杂&#xff0c;所以都是使用了偏向于面向过程的方式去编写的。 我本人其实是比较习惯用面向对象的方式去编写代码。关于面向过程和面向对象之间的优缺点…

3.5 方程组的状态与解的迭代改善

学习目标&#xff1a; 如果我要学习方程组的状态与解的迭代改善&#xff0c;我会采取以下步骤&#xff1a; 学习迭代方法的基本理论&#xff1a;首先&#xff0c;我会学习迭代方法的基本概念、原理和公式&#xff0c;包括雅可比迭代法、高斯-赛德尔迭代法和逐次超松弛迭代法等…

融合CDN行为分析动态加速解决方案

网络延迟对电商企业产生了巨大的负面影响&#xff0c;延迟是电子商务的杀手&#xff0c;网站访客等待的时间越长&#xff0c;最终实现转化的可能性就越小&#xff0c;同时他们对你的网站品牌的认可度也就越低&#xff0c;快速的网站内容交付是具有全球意识的电商企业不可或缺的…

Qt优秀开源项目之十八:QtService

QtService是一个用于实现Windows服务或unix守护进程的开源项目 github地址&#xff1a;https://github.com/qtproject/qt-solutions/tree/master/qtservice 源码可以编译成动态库&#xff0c;也可以直接在项目中引用源码 源码目录qtservice/examples中包含了三个例子&#xff0…

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

文章目录 1 . system V 消息队列(了解)接口查看消息队列 2.system V 信号量 (了解)1.进程互斥等概念的理解2.认识信号量3. 接口 这两部分主要是了解即可&#xff0c;为后面学习做铺垫 1 . system V 消息队列(了解) 为了让两个进程间通信 创建一个队列queue 进程A可以通过消息队…

Python——第2章 数据类型、运算符与内置函数

目录 1 赋值语句 2 数据类型 2.1 常用内置数据类型 2.1.1 整数、实数、复数 2.1.2 列表、元组、字典、集合 2.1.3 字符串 2.2 运算符与表达式 2.2.1 算术运算符 2.2.2 关系运算符 2.2.3 成员测试运算符 2.2.4 集合运算符 2.2.5 逻辑运算符 2.3 常用内置…

Kubernetes 笔记(15)— 应用保障、容器资源配额、容器状态探针概念及使用

作为 Kubernetes 里的核心概念和原子调度单位&#xff0c;Pod 的主要职责是管理容器&#xff0c;以逻辑主机、容器集合、进程组的形式来代表应用&#xff0c;它的重要性是不言而喻的。 在上层 API 对象的基础上&#xff0c;一起来看看在 Kubernetes 里配置 Pod 的两种方法&…

dell t630服务器风扇控制笔记记录(耗时一天)

1、打开虚拟控制台得用IE&#xff1b; 2、Dell PowerEdge T640 加装显卡之后风扇狂转问题解决 - 知乎 感谢知乎Billy&#xff0c; 操作步骤&#xff1a; 1、查看iDrac版本&#xff0c;必须在3.30.30.30及以下&#xff0c;之后的版本关闭了手动控制风扇转速的权限&#xff0…

从视图树到GPU:探索Android渲染机制

简介 在 Android 中&#xff0c;渲染技术可以分为 CPU 渲染和 GPU 渲染两种方式。CPU 渲染是直接使用 CPU 处理数据&#xff0c;并将其显示在屏幕上&#xff0c;而 GPU 渲染则是将数据传递给 GPU 进行处理和显示。 具体的渲染技术如下&#xff1a; Canvas绘图&#xff1a;An…

多层感知器介绍

一、概览 现实世界中很多真实的问题都不是线性可分的&#xff0c;即无法使用一条直线、平面或者超平面分割不同的类别&#xff0c;其中典型的例子是异或问题&#xff08;Exclusive OR&#xff0c;XOR&#xff09;&#xff0c;即假设输入为x1和x2&#xff0c;如果它们相同&…