一文彻底搞懂虚拟地址空间

news2024/9/22 15:30:34

aed25bff46314110b5aa233918f51a3c.jpg虚拟地址空间:传统的进程管理每个进程都占连续的物理内存空间,如果内存爆满需要将很久没用的但还在内存中的整个进程拷贝到硬盘中,等需要用时重新加载回内存。现代计算机使用虚拟地址空间,虚拟地址空间每个进程的4g并不是真的有,像是老板给员工画大饼,如果努力有可能达到,职位可能只有两个,因为整个计算机实际运行内存才8g。为了减少内存移动,提高利用率,隔离进程保护安全,加入了虚拟的地址,把内存分割成很多页(一个页4k)映射存储,需要经过MMU芯片转换才能访问实际物理内存。因为4k很小,所以可以嵌入很多被使用的内存块中间,而不像传统的进程那样即使夹杂在进程A和B有100mb,但我需要150mb,而E和F之间也有60mb,如果分开存储那够了,但不好意思一个进程内存不允许切开,C得暂时避让。
  虚拟地址空间包括内核区和用户区,用户区从上到下是栈、映射区、堆、未初始化默认为0的全局区(static静态区)、已初始化的全局区、常量区(字符串以及const常量)、代码区。全局变量区、堆区是每个应用进程独享的内存。内核区是系统管理的代码,每台电脑只有一个实体(物理内存),共享区是动态链接库代码,把常用的功能都集成在里面多个应用可共用。
  而代码区是进程共享的,即函数的语句,指使着如何运算,他们之间的逻辑关系,运用哪个数据进行怎样的操作,比如y=x*x+3;全部都是已知指令,但是该数据可以是地址间接引用如变量x,具体的内容是变化的,到栈区去找,也可以是固定的立即数3。函数别称功能、方法,是代码集合,可重复调用,可看成一个榨汁机,而参数就是放进去的水果,函数里面的代码就是榨汁机的功能,就是无论把什么果放进去都是一样的流程,即绞碎。但结果也会由于放进的水果不同而产生的果汁也不一样。也可以把函数里面的内容(栈区中的临时变量)当成草稿纸上的计算,而要写在试卷的答案是函数返回值。为什么要有函数?调用者无需关心底层事情,比如一个蛋糕师,他可能懂得奶油是怎么来的,但是为了方便直接买来(调用函数),然后再和水果、面包等拼装成蛋糕。为什么叫形式参数?因为函数代码只是假设有这个变量时该怎么操作,相当于练功夫时把身前的空气当作人,起占位作用。栈区是每个线程独享,是函数的运行地,

 

堆区是隐式链表,由block组成,每个block保存着内存块区域大小以及使用状态。malloc的原理,有最佳适配,就是需要开辟的内存和左右已用块之间夹着的空闲块相差值最小,提高空间利用率;首次适配算法:从头开始扫描,一有空闲块大于将要开辟的大小就立即占用,时间较短但可能造成空隙大浪费空间。因为堆区一开始不知道要使用多少内存,需要动态开辟,堆区一开始向系统申请一块大内存(128k到几mb),然后零售给程序中的各函数使用。调用malloc时,只是分配了对应的虚拟地址空间。只有当访问该部分内存时产生缺页反应才会真正分配物理内存并将物理内存和虚拟内存建立映射关系。。free只是归还给虚拟空间,并未真正释放,如果有malloc函数扫描到之前的释放的块那可直接使用,而不用向系统频繁申请空间。等到调用malloc函数时查找块从头到尾遍历完了实在没有空闲块就会移动堆区有效指针break以实现扩容,是内核调用,花费时间。如果用到了新的页面就要分配物理页。如果指针在同一个页面里面移动就不用。
在虚拟地址空间中文件映射段(动态库/共享区)mmap是用来将硬盘中的文件映射到内存中以加快效率,直接在内核缓冲区操作减少复制在用户缓冲区的过程。2.也可以作为dll系统库共享区3.还可以作为堆的功能,如果heap堆区满了再向上推break指针以实现真正的扩容,但是当要申请的空间大于128k,直接使用mmap申请开辟,释放时不是归还给程序管理,而是可以直接单独释放对应的物理内存。堆区高地址部分的块释放后还有堆顶指针brk附近的连续空闲内存大于128K时,将进行真正意义上的内存回收,才把堆指针往下降;如果高地址的块还没free,在它下面的块即使free也不会单独释放。

 

 

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

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

相关文章

【ROS2】高级:安全-检查网络流量

目标:捕获和检查原始 ROS 2 网络流量。 教程级别:高级 时间:20 分钟 内容 概述 先决条件 运行演示 安装 tcpdump启动说话者和听者显示未加密的发现数据包显示未加密的数据包 启用加密显示加密的发现数据包显示加密数据包 概述 ROS 2 通信安全…

【Unity】Android Failed to transform Error while dexing.

文章目录 一、背景二、问题描述三、原因和解决方法 一、背景 1、Unity 2021.3.33f1 2、Firebase 11.7.0 3、升级至API-34 二、问题描述 错误信息 Failed to transform play-services-measurement-api-21.5.0.aar (com.google.android.gms:play-services-measurement-api:21.5.…

【yolov8】3、yolov8 环境安装 【GPU版】

pycharm下载安装 yolov8 环境安装 【GPU版】 1、要求1.1 什么是 CUDA 和 CUDNN1.2 查看cuda版本的3种方法(版本在10.2以上的可以忽略本章节):1.3 没有找到NIVDIA图标,确认是否有英伟达显卡 2、pycharm下载安装进入官网 3、yolov8…

【数据分享】2013-2022年我国省市县三级的逐日SO2数据(excel\shp格式\免费获取)

空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000——2022年的省市县三级的逐日PM2.5数据和2013-2022年的省市县三级的逐日CO数据(均可查看之前的文章获悉详情)! 本次我们分享的是我国2013——2022年的省…

【从零开始实现stm32无刷电机FOC】【实践】【5/7 stm32 adc外设的高级用法】

目录 采样时刻触发采样同步采样 点击查看本文开源的完整FOC工程 本节介绍的adc外设高级用法用于电机电流控制。 从前面几节可知,电机力矩来自于转子的q轴受磁力,而磁场强度与电流成正比,也就是说电机力矩与q轴电流成正相关,控制了…

【C++】类和对象——默认成员函数(下)

目录 前言拷贝构造1.概念2.特征3.总结 赋值重载运算符重载赋值运算符重载探讨传引用返回和传值返回的区别 const成员取地址及const取地址操作符重载 前言 上一讲我们已经说了关于C的默认成员函数中的两个——构造和析构函数。所谓默认成员函数也就是:用户没有显示定…

《背包乱斗》为什么好玩 苹果电脑怎么玩《背包乱斗》游戏 mac怎么玩steam windows游戏

在当今竞争激烈的游戏市场中,《背包乱斗》以其独特的魅力在众多作品中脱颖而出,吸引了大量玩家的关注和喜爱。其创新的游戏机制和不断迭代的内容,加之出色的视觉效果和社区建设,使其成为了游戏界的一股清流。 一、《背包乱斗》为…

钡铼EdgeIO系统BL206对接MQTT、Modbus TCP、OPC UA

钡铼EdgeIO系统BL206提供双网口支持交换机级联功能,支持标准MQTT协议、Modbus TCP协议、OPC UA协议,由耦合器与IO模块组成,采用Web配置,内置云驱动、可编程逻辑控制功能,用户点击即可连接云平台。耦合器自带诊断功能&a…

计算机三级嵌入式笔记(一)—— 嵌入式系统概论

目录 考点1 嵌入式系统 考点2 嵌入式系统的组成与分类 考点3 嵌入式系统的分类与发展 考点4 SOC芯片 考点5 数字(电子)文本 考点6 数字图像 考点7 数字音频与数字视频 考点8 数字通信 考点9 计算机网络 考点10 互联网 考纲(2023&am…

某宝同款度盘不限速后台系统源码

简介: 某宝同款度盘不限速后台系统源码,验证已被我去除,两个后端系统,账号和卡密系统 第一步安装宝塔,部署卡密系统,需要环境php7.4 把源码丢进去,设置php7.4,和伪静态为thinkphp…

新手小白的pytorch学习第七弹------分类问题模型

目录 1. 准备分类数据1.1 输入和输出的形状 shape1.2 将数据转换为张量,同时将我们的数据集转换为训练集和测试集 2 创建模型方法一:自定义forward()方法二:nn.Sequential()方法三:自定义forward()nn.Sequential() 用 pytorch 使用…

【Leetcode】十六、深度优先搜索 宽度优先搜索 :二叉树的层序遍历

文章目录 1、深度优先搜索算法2、宽度优先搜索算法3、leetcode102:二叉树的层序遍历4、leetcode107:二叉树的层序遍历II5、leetcode938:二叉搜索树的范围和 1、深度优先搜索算法 深度优先搜索,即DFS,从root节点开始&a…

Cadence23学习笔记(七)

三种信号联通的方式: 如何旋转元器件:先像下图一样选中器件,之后按住快捷键R即可旋转: 设置栅格大小: 这里的栅格数值越大,格点越密集。 放置分页符号: cadence中分页的话必须放置分页符&#…

充电站新主流——分体式直流充电桩

在全球对可持续发展和环境保护的高度关注下,电动汽车市场的迅猛增长催生了对充电设施建设的迫切需求。为此,一种名为分体式充电桩的创新充电设备应运而生,以其卓越的性能和独特优势,预示着未来充电技术的新趋势。为了增进公众对分…

PY32F002B单片机 ISP 串口下载注意事项

一、PY32F002B ISP 串口下载的连接方式 仿真上的 VCC 和 GND 连接到 MCU 的 VCC 和 VSS, 仿真的 TX 接 MCU 的 RX,RX 接 MCU 的 TX。 二、因为 PY32F002B 没有 BOOT,需要用 ISP 串口下载的话需要下载串口引导程序。 下载这个目录下的 IAP…

FPGA实验1:简单逻辑电路

一、实验目的及要求 学习Create-SOPC实验平台的使用方法;熟悉Quartus II 软件平台和使用 VHDL 语言设计电路的方法;学习简单逻辑电路的设计、仿真和硬件测试。 二、实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计半加器,进行波…

摸鱼大数据——Spark Structured Steaming——物联网数据分析案例

1、数据模拟器代码 1- 创建一个topic, 放置后续物联网的数据 search-log-topic ./kafka-topics.sh --bootstrap-server node1.itcast.cn:9092,node2.itcast.cn:9092 --create --topic search-log-topic --partitions 3 --replication-factor 2 2- 将代码放置到项目中: import…

浅谈芯片验证中的仿真运行之 timescale (五)提防陷阱

一 仿真单位 timeunit 我们知道,当我们的代码中写清楚延时语句时,若不指定时间单位,则使用此单位; 例如: `timescale 1ns/1ps 则 #15 语句表示delay15ns; 例:如下代码,module a 的timescale是1ns/1ps, module b 是1ps/1ps; module b中的clk,频率是由输入参…

【LeetCode】222. 完全二叉树的个数

什么是计算机基础?如果本题能够用二分二进制二叉树的方式解出本题,那么我可以认为你的计算机基础就很好了。很久以来,我一直认为自己的计算机基础好,但是自刷题以来,跟网上这么多优秀的同学相比,我发现我实…

vxe-grid 实现配置式form搜索条件 form搜索条件框可折叠 配置式table

文章目录 效果图代码 效果图 代码 <template><div class"app-container"><vxe-grid refxGrid v-bind"gridOptions" v-if"tableHeight" :height"tableHeight"><template #billDate"{ data }"><e…