Linux SystemV(共享内存(*)、消息队列、信号量)

news2024/9/20 23:36:31

个人主页:仍有未知等待探索-CSDN博客

专题分栏: Linux

目录

​编辑

一、共享内存

1、原理

理解:

2、操作+具体理解

1.概括

2.创建共享内存

共享内存的生命周期?

key是什么?

进程怎么知道,共享内存是否存在?

shmget的返回值?

其他进程是怎么知道用户设置的key?

3.共享内存挂接到地址空间

数据安全(*)

4.内存空间的管理

二、消息队列

1、原理

2、接口

发送消息和接收消息

生命周期

三、信号量

1、五个概念

2、对于信号量的理论的理解

信号量对共享内存进行访问的过程:

信号量的分类:

信号量能用一个全局的变量进行替代吗?

数据安全:

3、信号量的操作

1.创建

2.管理

3.操作

四、共同点

os是如何吧对应的共享内存,消息队列,信号量统一管理起来的?


一、共享内存

1、原理

理解:

  • 上述的操作都是os完成的。
  • os必须提供对应步骤的系统调用。
  • 共享空间可以在系统中存在很多份,供不同的进程同时进行通信。
  • os要对共享内存进行管理。先描述再组织。共享内存,不是简单的一段内存空间,也要有描述并管理共享内存的数据结构和匹配的算法!
  • 共享内存 = 内存空间(数据)+ 共享内存的属性。
  • 共享内存不提供对共享内存的任何保护机制

  • 共享内存生命周期随内核,文件生命周期随进程

2、操作+具体理解

1.概括

2.创建共享内存

#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg); --- 创建共享空间
// 函数的返回值是shmid是共享内存在用户层面的标识符,是一个整数。
// key:用户设置的标识符,标识共享内存,要有唯一性。
// size:共享内存的大小,建议设置成4096的整数倍
// shmflg:共享内存的权限
// IPC_CREAT:如果要创建的共享内存不存在,创建;如果存在,获取共享内存并返回。 --- 用来获取
// IPC_EXCL:单独使用没有意义。
// IPC_CREAT | IPC_EXCL:如果要创建的共享内存不存在,创建;如果就存在,出错返回。 --- 用来创建 

#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id); --- 形成key
// pathname:创建共享内存的路径
// proj_id:项目号,自定义设置,没有要求

创建的时候需要加上共享内存的权限,类似于:IPC_CREAT | IPC_EXCL | 0666。

共享内存的生命周期?

共享内存的生命周期随系统,而不是进程。

key是什么?

标识共享内存的编号。

进程怎么知道,共享内存是否存在?

如果是os创建key值得话,本地进程知道,其他进程获取不到。所以要自己设置key值,key值也要具有唯一性。

通过查找key值存不存在就知道对应的共享内存是否存在。

shmget的返回值?

返回用户层面的共享内存标识符(shmid)。

  • shmid用于对共享内存进行操作。
  • key用于查找共享内存是否存在。
其他进程是怎么知道用户设置的key?

通过同样的规则,利用ftok系统调用。

3.共享内存挂接到地址空间

#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg); --- 挂接
int shmdt(const void *shmaddr); --- 去挂接
 

数据安全(*)

共享内存不提供对共享内存的任何保护机制 --- 会造成数据不一致问题。

共享内存是所有进程IPC速度最快的,因为共享内存大大减少了数据的拷贝次数!

共享内存的大小是4096的整数倍。

4.内存空间的管理

#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • cmd是对内存空间管理的各种选项:

  • buf是存储的内存空间的属性。如果是要获取共享内存状态,buf是输出型参数;如果是要修改共享内存状态,buf是修改完成的共享内存状态,然后底层会把buf拷贝到内核中。

二、消息队列

1、原理

一个进程,向另一个进程发送有类型的数据块的方式。

2、接口

接口都是类似于共享内存的。

发送消息和接收消息

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);

const void*msgp:发送的消息数据块的地址。
struct msgbuf:消息队列数据块。
struct msgbuf
{
    long mtype;
    char mtext[1];
}

生命周期

 消息队列的生命周期随系统。

三、信号量

1、五个概念

  1. 共享资源:多个执行流(cpu)能看到同一份资源。
  2. 临界资源:被保护起来的资源。(保护的方式,同步和互斥)
  3. 互斥:在任何时刻,只能有一个进程在访问共享资源。

  4. 资源:只要是资源就要被程序员访问的。--- 资源被访问,就是通过代码访问(朴素)代码 = 访问共享资源的代码(临界资源) + 不访问共享资源的代码(非临界资源)。

  5. 所谓的对共享资源的保护,本质是对访问共享资源的代码进行保护。(这里的共享资源就是临界区)

2、对于信号量的理论的理解

  • 信号量是用来保护临界资源的。
  • 信号量的本质是一个计数器。                            

    类似于电影院买票:

    电影院:共享资源(临界资源)

    买票:申请信号量。--- 如果某场电影没有票了,就意味着,信号量为0,不能被申请。

    票数:信号量的初始值。

  • 申请信号量本质:就是对公共资源的一种预定机制。

信号量对共享内存进行访问的过程:

1、申请信号量。计数器减减操作。

2、访问共享内存。

3、释放信号量。计数器加加操作。

信号量的分类:

多元 和 二元。

二元信号量(类比超级vip):只有 1 or 0 --- 互斥。对共享资源进行整体使用。

多元信号量:网吧中的电脑,对于电脑,有很多台,其信号量大于2。

信号量能用一个全局的变量进行替代吗?

信号量不能用一个全局变量gcount当计数器。

1、全局变量不能被所有进程看到。

2、gcount不是原子。

数据安全:

IPC信号量和共享内存,消息队列一样,也必须先让不同的进程看到同一个“计数器”!--- 意味着信号量也是一个公共资源!! --- 保护临界资源安全的前提是信号量是安全的。

-- -> 安全的 -> P操作

++ -> 安全的 -> V操作

PV --- 安全 --- 原子性

3、信号量的操作

  • 允许用户一次申请多个信号量。

  • 信号量集 --- 用数组来维护。

1.创建

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);

这些参数和共享内存的一样的含义。

2.管理

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);

3.操作

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, size_t nsops);

sem_op == 1,就是加加操作。
sem_op == -1,就是减减操作。

sops是个结构体,包含下列的属性。

四、共同点

1、划分为同一个标准:system V。

2、XXXget,XXXctl,生命周期随系统的。

3、都有XXXid_ds的struct结构,第一个属性都是struct ipc_perm;

os是如何吧对应的共享内存,消息队列,信号量统一管理起来的?

 谢谢大家!

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

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

相关文章

使用 FlexboxLayout 实现灵活布局

在 Android 开发中&#xff0c;有时我们需要让子视图根据内容和可用空间灵活排列。这时候&#xff0c;FlexboxLayout 是一个非常强大的工具&#xff0c;它类似于 CSS 中的 flexbox&#xff0c;允许我们轻松创建响应式布局。在这篇博客中&#xff0c;我们将详细介绍如何在 Andro…

原创度检测工具,快速检测文章原创值

原创度检测工具是帮助我们快速了解文章质量的工具&#xff0c;它能以最短的时间帮助我们了解到一篇文章的原创值是多少&#xff0c;并且还能帮助我们分析文章中哪些内容质量高&#xff0c;哪些内容质量低&#xff0c;从而对低质量的内容进行修改&#xff0c;达到提升整篇文章质…

Android App开发教学: 利用MediaPipe实现即时脸部侦测功能

前言 在Android开发中&#xff0c;实现即时脸部侦测功能是一个具有挑战性且引人注目的任务。幸运的是&#xff0c;Google的MediaPipe库为我们提供了一个简单且高效的解决方案。MediaPipe是一个开源的跨平台机器学习框架&#xff0c;可以用于各种视觉计算任务&#xff0c;包括脸…

C#泛型委托,约束

一、泛型委托 泛型的委托有很多&#xff0c;但掌握常见的泛型委托应用即可 委托可以定义它自己的类型参数。 引用泛型委托的代码可以指定类型参数以创建封闭式构造类型。 public delegate void Del<T>(T t);//Del<T> 是一个泛型委托 public static void Notify…

音频剪辑怎么剪?这4种裁剪方法快学起来

无论是音乐创作、播客录制还是专业的声音设计&#xff0c;高质量的音频剪辑都是创造引人入胜作品的关键。 然而&#xff0c;对于初学者或是专业人士而言&#xff0c;找到合适的音频剪辑工具&#xff0c;并掌握其使用方法&#xff0c;是通往成功道路上的第一步。 那么&#xf…

Python数据库操作必备:事务隔离级别全解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在数据库操作中&#xff0c;事务隔离是保证数据一致性和并发控制的重要机制。事务隔离级别决定了一个事务可以看到其他事务的哪些更改&#xff0c;常见的隔离级别包括未提交读&#xff08;Read Uncommitted&…

Java海康门禁设备 对接人脸下发API

海康门禁机设备API接口对接 引言&#xff1a; 我本人在对接海康门禁机设备的时候遇到了两个 问题1&#xff1a;人脸下发失败的问题&#xff0c;是根据官方的Demo&#xff0c;遇到的问题&#xff0c;可以参考一下 这个问题我排查了很久&#xff0c;最终发现是海康给的Demo里面…

EasyX自学笔记3(割草游戏2)

在上一篇笔记之中我们还留有许多bug&#xff0c;如派蒙不会转头、派蒙是鬼没影子、斜向速度过快、会跑出界外的问题在此一并处理。 在上一章里我们知道需要玩家类、敌人类、子弹类三种&#xff0c;但是其包含的是他们的运行逻辑和变量。而播放动画帧也有许多函数我们也将其封装…

学习Java的日子 Day68 jQuery操作节点,Bootstrap

jQuery 1.jQuery操作DOM DOM为文档提供了一种结构化表示方法&#xff0c;通过该方法可以改变文档的内容和展示形式 在访问页面时&#xff0c;需要与页面中的元素进行交互式的操作。在操作中&#xff0c;元素的访问是最频繁、最常用的&#xff0c;主要包括对元素属性attr、内容…

《Hadoop大数据技术与实践》+ 数仓版本

基础概念 随着数字化时代的到来&#xff0c;数据量的爆炸性增长使得传统的数据处理和分析方法变得不够高效&#xff0c;因此大数据技术应运而生。 数据分类 结构化数据&#xff1a;固定格式的SQL数据库等半结构化数据&#xff1a;json非结构化数据&#xff1a;图片、音视频 …

探索sqlmap的奥秘:Python中的强大SQL注入检测工具

文章目录 **探索sqlmap的奥秘&#xff1a;Python中的强大SQL注入检测工具**第一部分&#xff1a;背景介绍第二部分&#xff1a;sqlmap是什么&#xff1f;第三部分&#xff1a;如何安装sqlmap&#xff1f;第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第…

Grafana+Influxdb(Prometheus)+Apache Jmeter搭建可视化性能测试监控平台

此性能测试监控平台&#xff0c;架构可以是&#xff1a; GrafanaInfluxdbJmeterGrafanaPrometheusJmeter Influxdb和Prometheus在这里都是时序性数据库 在测试环境中&#xff0c;压测数据对存储和持久化的要求不高&#xff0c;所以这里的组件可以都通过docker-compose.yml文件…

制氧机在造纸工业中的作用

在现代造纸工业中&#xff0c;制氧机扮演着至关重要的角色&#xff0c;为整个生产流程带来了诸多显著的优势和改进。 制氧机能够优化纸浆的漂白过程。传统的漂白方法可能效果不佳&#xff0c;且对环境造成较大压力。而通过制氧机制备的高纯度氧气参与漂白反应&#xff0c;能大大…

Langchain pandas agent - Azure OpenAI account

题意&#xff1a;Langchain pandas代理 - Azure OpenAI账户 问题背景&#xff1a; I am trying to use Langchain for structured data using these steps from the official document. 我正在尝试使用 Langchain 处理结构化数据&#xff0c;按照官方文档中的这些步骤进行操作…

软件测试第2章 黑盒测试和白盒测试对比

目录 一、黑盒测试 二、白盒测试 三、黑盒测试 VS 白盒测试 一、黑盒测试 1、它只检查程序功能是否能按照需求规格说明书的规定正常使用&#xff0c;程序是否能适当地接受输入数据而产生正确的输出信息。 2、黑盒测试也称功能测试&#xff0c;通过测试来检测每个功能是否能…

《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(4)-再识Wireshark

1.简介 按照以前的讲解和分享路数&#xff0c;宏哥今天就应该从外观上来讲解WireShark的界面功能了。 2.软件界面 由上到下依次是标题栏、主菜单栏、主菜单工具栏、显示过滤文本框、打开区、最近捕获并保存的文件、捕获区、捕获过滤文本框、本机所有网络接口、学习区及用户指…

文件上传漏洞(三,靶场详解)

前言&#xff1a; 本文基于github上的upload-labs&#xff0c;PHP study以及bp抓包软件进行操作。 靶场环境搭建及pass-1.pass-2请转到&#xff1a;文件上传漏洞&#xff08;二&#xff0c;靶场搭建及漏洞利用&#xff09; 一&#xff0c;pass-3。 查看源码可知&#xff0c…

OJ-0815

题目 示例1 输入 bb1234aa 输出 10示例2 输入 bb12-34aa 输出 -31示例3 输入 bb0012-0034aa 输出 -31题解 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);long res 0;String s scanner…

在WinCC(TIA Portal)项目中,如何正确的使用面板,模板,弹出窗口和滑入窗口?

WinCC(TIA Portal)中提供了许多设计元素和组态对象,使得组态工作变得简单,文档中简要介绍了这些内容. WinCC(TIA Portal) 中提供了许多设计元素和组态对象&#xff0c;使得组态工作变得简单,文档中简要介绍了这些内容。 在 WinCC(TIA Portal) 中使用以下选项有助于提高组态过程…

git是什么/基本指令

git作用 去中心化&#xff0c; 分布式版本控制器 新增术语&#xff1a;仓库区&#xff0c; 工作区&#xff0c; 暂存区 具体见下板书 常用git命令 git clone 仓库网址 git status 查看仓库状态 git add newfile 临时添加到git仓库 git commit -m 正式添加git仓库 g…