初步认识共享内存(并不全面)

2024-06-22 19:58

本文主要是介绍初步认识共享内存(并不全面),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

共享内存是系统处于多个进程之间通讯的考虑,而预留的一块内存区。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及内核(即进程不再通过执行任何进入内核的系统调用来彼此传递数据).共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。

两个不同进程A和B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到B对共享内存中的数据的更新。
     当然,既然是共享,必然需要某种共享机制,互斥锁、信号量等
共享内存方式,进程可以直接读取内存,而不需要数据的拷贝,因此速度挺快。


举个例子,【客户服务器文件复制程序】(即同一系统中一个进程读source文件数据发送给另一个进程写道destination文件中)中的通常步骤:
    1、服务器从输入文件读,该文件的数据由内核读入自己的内存空间,然后从内核复制到服务器进程
    2、服务器往一个管道、FIFO或消息队列以一条消息的形式写入这些数据。这些IPC形式通常需要把这些数据从进程复制到内核。
    3、客户从该IPC通道读出这些数据,这通常需要把这些数据从内核复制到进程
    4、最后,将这些数据从由write函数的第二个参数指定的客户缓冲区复制到输出文件


这里总共需要四次数据复制,而且这四次是在内核和进程间进行的,往往开销很大
然而,通过让两个或两个以上进程共享一个内存区,就绕过了上述的问题。当然,这些进程必须协调或同步对该共享去内存的使用。
因此,现在步骤如下:
    1、服务器使用(譬如)一个信号量取得访问某个共享内存区对象的权力。
    2、服务器将数据从输入文件读入到共享内存区对象。read函数的第二个参数指向这个共享内存区对象
    3、服务器读入完毕时,使用一个信号量通知客户
    4、客户将这些数据从该共享内存区对象写出到输出文件中



从这里看出,总共复制了两次,即从文件到共享内存区和从共享内存区到文件
要强调的是,默认情况下通过fork派生的子进程并不与其父进程共享内存区



void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
//mmap函数把一个文件或者一个POSIX共享内存区对象映射到调用进程的地址空间
//使用此函数有3个目的:
//1、使用普通文件以提供内存映射I/O
//2、使用特殊文件以提供匿名内存映射
//3、使用sem_open以提供无亲缘关系进程间的POSIX共享内存区
//其中addr可以指定描述符被映射到的进程内存空间的起始地址,常为空指针,告诉内核自己去选择地址
//

这篇关于初步认识共享内存(并不全面)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据