[Linux系统编程]进程间通信—system V

进程间通信—system V

  • 1. System V 共享内存(Shared Memory)
    • 1.1 共享内存的建立过程
    • 1.2 共享内存函数
  • 2. System V 消息队列(Message Queues)
  • 3. System V 信号量(Semaphores)
  • 4. 总结

前言:
之前所提的管道通信是基于文件的,OS没有做过多的设计工作。
system V 进程间通信:OS特地设计的通信方式。想尽一切办法让不同的进程看到同一份资源(由OS提供)。

system V通信方式为:共享内存、消息队列、信号量。
共享内存、消息队列是以传送数据为目的;信号量是为了保证进程同步与互斥而设计的,属于通信范畴。

以下是 System V IPC 的三种主要组件的详细讲解:

1. System V 共享内存(Shared Memory)

在进程间通信(IPC进程间通信)中,共享内存(Shared Memory)是一种非常高效的方式,它允许不同的进程直接访问同一块内存区域,从而避免了数据复制和大量的上下文切换。使用共享内存,多个进程可以直接访问同一份内存资源,使得它们之间的通信速度非常快,通常用于高性能的系统和应用中。故共享内存允许多个进程共享同一块物理内存区域。所有进程都可以直接读写共享内存,这样就能避免复制数据,提高效率。它是 System V IPC 中速度最快的通信方式。

共享内存的工作原理基于内存映射:

系统创建一个特定的内存区域,并将该区域映射到多个进程的地址空间。每个进程可以通过直接访问这块内存区域来读写数据。共享内存区域通常会在进程的地址空间中作为一个特殊的内存区域被映射,可以由多个进程并发访问。为了使得多个进程能够看到同一份资源,需要通过操作系统提供的 API 来创建、映射和访问共享内存区域。
在这里插入图片描述

上图所示讲解:

1、物理内存映射到进程的地址空间中
现代操作系统使用虚拟内存技术,让每个进程有独立的虚拟地址空间,而不直接使用物理内存的地址。这使得进程在访问内存时,只知道自己的虚拟地址,而操作系统会负责将这些虚拟地址映射到实际的物理内存地址。这个过程叫做 内存映射。

2、如何实现——修改页表,在虚拟地址空间中开辟空间

在现代操作系统中,每个进程都拥有一张页表,用于记录虚拟地址与物理地址之间的映射关系。页表将虚拟地址空间划分为一个个页,每一页有对应的物理内存页。

虚拟地址:这是程序运行时使用的地址,进程看到的地址。
物理地址:这是实际内存中数据的存储位置。

当一个进程需要访问某个虚拟地址时,操作系统通过页表查找该虚拟地址对应的物理地址。如果映射已经建立,硬件可以直接访问物理内存。如果没有映射,操作系统会触发 页面错误(Page Fault),并负责加载数据或分配新的物理内存页。
修改页表 就是指操作系统在管理虚拟内存时,动态地更新页表,将某个虚拟地址映射到一个物理地址。这种修改通常发生在操作系统进行内存分配、程序加载时,或者进程在运行过程中需要更多内存时。

3、有没有能力?——用系统接口,完成所谓的开辟空间,建立映射

操作系统通过一组 系统调用(System Calls) 来提供管理虚拟内存的能力。这些系统调用允许程序请求操作系统为其分配虚拟内存,并为该内存区域建立物理内存的映射。

内存分配:当一个程序或进程需要更多的内存时,它会调用操作系统提供的内存分配函数(比如 malloc(),brk(),mmap() 等),操作系统根据进程的请求,为它分配一块 虚拟内存。

映射物理内存:操作系统会在物理内存中找到一块可用区域,然后通过更新页表,将这块虚拟内存区域与物理内存页进行映射。操作系统通过页表来管理这些映射关系,确保进程访问虚拟地址时能正确地映射到物理地址。

4、用系统接口,完成所谓的开辟空间,建立映射,开辟虚拟空间后返回给用户,都是OS做的

在操作系统中,进程无法直接操作硬件或内存。所有关于虚拟内存的管理和分配都由操作系统负责。操作系统为进程提供了 系统调用接口,通过这些接口,进程可以请求内存分配、释放内存等操作。

例如,mmap() 是一种常用的内存映射系统调用,能够请求操作系统将一个文件或一块物理内存映射到进程的虚拟地址空间中。操作系统收到这些请求后,会根据需要分配或映射合适的内存块,并更新页表。

开辟虚拟空间:操作系统根据进程请求开辟虚拟内存空间,将这些虚拟地址空间通过页表映射到物理内存。

返回给用户:当操作系统完成内存分配和映射后,会将这块分配好的虚拟内存区域的地址返回给进程,进程可以在此区域进行读写操作。

这些内存管理和映射的过程都是由操作系统通过系统调用来实现的,程序员无需直接操作物理内存,而是通过系统接口请求内存。

1.1 共享内存的建立过程

1、申请共享内存(开辟好物理内存)
2、将共享内存挂接(建立映射关系)到地址空间
3、上述1、2完成即开始通信
4、去关联(修改页表,取消映射关系)共享内存
4、释放共享内存(将内存归还给OS)

shm 是 共享内存(Shared Memory) 的简称,是操作系统中一种用于进程间通信(IPC,Inter-Process Communication)的机制。通过共享内存,多个进程可以访问同一块物理内存区域,从而在进程间快速交换数据。

共享内存(Shared Memory)是什

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

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

相关文章

R语言——获取数据1

参考资料:学习R 数据的来源可以由很多。R内置有许多数据集,而在其他的附件包中能找到更多的数据。R能从各式各样的来源中读取,且支持大量的文件格式。 1、内置的数据集 R的基本分发包有一个datasets,里面全是示例数据集。很多其他…

HTTP 请求方法

HTTP 请求方法 引言 HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一。它定义了客户端与服务器之间通信的规则。HTTP请求方法,也称为HTTP动词,是客户端向服务器发送请求时使用的操作类型。本文将详细介绍HTTP请求方法的概念、分类、常用方法及其在实际应用中的…

python函数装饰器

python函数装饰器 声明:博主并没有系统学习过python语言,在实际项目中遇到关于python不懂的语法,这里仅作为个人学习积累笔记 1.1 python函数相关基础 深入了解python函数装饰器移步:Python 函数装饰器 下面的笔记来源于上述链接…

OpenCV 图形API(7)用于将笛卡尔坐标(x, y)转换为极坐标(magnitude, angle)函数cartToPolar()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算二维向量的大小和角度。 cartToPolar 函数计算每个二维向量 (x(I), y(I)) 的大小、角度,或同时计算两者: magnitude…

什么是向量搜索Vector Search?

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…

搜索工具Everything下载安装使用教程(附安装包)

文章目录 前言一、搜索工具Everything介绍二、搜索工具Everything使用步骤1.软件下载2.版本选取3.启动软件4.文件搜索 前言 本教程将详细为您介绍 Everything 的下载、安装与使用方法,助您快速上手,充分利用这款工具的强大功能,告别文件查找…

element-plus中,Upload上传组件的使用 + 后端处理

目录 一. 案例一&#xff1a;用户更换个人头像 1.前端实现 2.后端实现 ①引入阿里云oss的依赖 ②编写AliOSSUtils工具类 ③编写controller层 ④编写service层 ⑤编写mapper层 3.效果展示 4.重点理解 结语 一. 案例一&#xff1a;用户更换个人头像 1.前端实现 <…

HarmonyOS-ArkUI Rcp模块类关系梳理

前言 本文重点解决的是&#xff0c;按照官网学习路径学习Tcp模块内容时&#xff0c;越看越混乱的问题。仿照官网案例&#xff0c;书写代码时&#xff0c;产生的各种疑惑。比如&#xff0c;类与类之间的关系&#xff0c;各种配置信息究竟有多少&#xff0c;为什么越写越混乱。那…

【云计算物理网络】数据中心网络架构设计

云计算的物理基础&#xff1a;数据中心网络架构设计 一、技术背景&#xff1a;从“三层架构”到“云原生网络”二、技术特点&#xff1a;云数据中心网络的四大支柱三、技术细节&#xff1a;CLOS架构的实现挑战四、未来方向&#xff1a;从“连接设备”到“感知服务”结语&#x…

window11 通过cmd命令行安装 oh my zsh 的教程

步骤 1&#xff1a;安装 WSL 2 和 Ubuntu 1. 以管理员身份打开 CMD wsl --install -d Ubuntu此命令会自动安装 WSL 2 和 Ubuntu 发行版。 安装完成后重启系统。 初始化 Ubuntu 在开始菜单中打开 Ubuntu&#xff0c;设置用户名和密码。 步骤 2&#xff1a;在 WSL 的 Ubunt…

gdb 调试命令记录

启动调试 gdb ./待调试的程序 #不带参数 (gdb) run #带参数 gdb --args ./your_program arg1 arg2 arg3 (gdb) run arg1 arg2 arg3 #图形化代码界面 (gdb) layout src基础调试命令 命令缩写作用run [args]r运行程序&#xff08;可带命令行参数&#xff09;break <locatio…

STM32F103低功耗模式深度解析:从理论到应用实践(上) | 零基础入门STM32第九十二步

主题内容教学目的/扩展视频低功耗模式什么是低功耗&#xff0c;模式介绍&#xff0c;切换方法。为电池设备开发做准备。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、低功耗模式概述1.1 为什么需要低功耗模式&#xff1f;1.2 基本实现原理 二、低功耗模式的本…

JavaScript instanceof 运算符全解析

JavaScript instanceof 运算符全解析 核心语义: 判断一个对象(object)是否属于某个构造函数(constructor)或类的实例,基于原型链(prototype chain)实现类型检测。 一、JavaScript 中的基础用法 1. 语法结构 object instanceof constructor 返回值:布尔值(true/fal…

电脑基础之word基础操作

word是常用的办公软件之一&#xff0c;用于文档编辑&#xff0c;如合同/报告撰写、论文等‌。 一、简介 word文档最早由微软推出&#xff0c;通过Microsoft Office Word软件创建和编辑。由于涉及版权付费问题&#xff0c;大多数个人使用盗版软件。后来金山出了WPS office免费软…

深度解析Python代码中的广告信息提取与JSON处理

哈喽,大家好,我是木头左! 在当今数字化时代,广告无处不在,而从广告中提取关键信息并进行处理则成为了一项重要的技能。本文将深入剖析一段Python代码,该代码旨在从给定的JSON格式字符串中提取广告相关信息,并对其进行解析和处理。通过这段代码,将展示如何运用Python的j…

base64在线解码工具

我们经常会用到base64编码&#xff0c;相应的base64解码成为日常必备&#xff0c;所有我们需要拥有一个base64在线解码工具 base64在线解码工具

Linux——进程信号(3)(信号保存与信号捕捉)

进程信号3 信号保存信号相关概念详解信号集&#xff08;sigset_t&#xff09;及操作函数详解 信号捕捉信号捕捉的详细流程解析信号捕捉的核心概念信号捕捉的完整流程&#xff08;以 SIGQUIT 为例&#xff09; 信号保存 信号相关概念详解 1.核心概念 (1) 信号递达&#xff08…

批量在 txt 记事本文件的指定位置插入行,如在最末尾位置插入行

我们在网上下载的小说经常可以看到内容中每隔多少行都会现一些网站名称和联系方式等广告信息&#xff0c;这些都是固定或者随机插入在小说正文中的。那是怎么样实现在文本文件中指定位置插入这些行的呢&#xff1f;今天就给大家介绍一下如何在 txt 记事本文件或者其它类型的文本…

python的内存管理机制

目录 内存分配方式自动内存管理内存分配策略 垃圾回收机制引用计数垃圾回收对象创建和引用关系引用计数的状态删除变量 标记 - 清除垃圾回收 内存分配的区域划分栈内存堆内存 内存管理的优化内存池技术对象共享 Python 的内存管理机制是其运行效率和安全性的重要保障&#xff0…

火山引擎coze用户市场

火山引擎 **Coze**&#xff08;扣子&#xff09;的用户市场主要集中在 **需要快速构建和部署智能对话应用的企业及开发者群体**&#xff0c;覆盖多个行业与场景。以下是具体分析&#xff1a; --- ### **一、核心用户群体** 1. **企业用户** - **互联网/科技公司**&#…