一个程序最多能占用的内存大小

news2025/1/10 22:34:56

因为内存资源总是稀缺的,即便在拥有百 G 内存的机器上,我们都可以轻易把内存填满。为了解决这个问题,就需要用到虚拟化技术。
GC 是面试的高频重点知识,同时也是程序员日常开发需要理解的部分。学习 GC 有助于你优化你开发应用的性能,特别是遇到内存不够用不会束手无策。今天我们先学习内存的虚拟化技术。
内存是稀缺的,随着应用使用内存也在膨胀。当程序越来复杂,进程对内存的需求会越来越大。从安全角度考虑,进程间使用内存需要隔离。

内存的虚拟化技术

为什么内存不够用?

要理解一个技术,就必须理解它为何而存在。总体来说,虚拟化技术是为了解决内存不够用的问题,那么内存为何不够用呢?主要是因为程序越来越复杂。比如说我现在给你录音的机器上就有 200 个进程,目前内存的消耗是 21G,我的内存是 64G 的,但是多开一些程序还是会被占满。 另外,如果一个程序需要使用大的内存,比如 1T,是不是应该报错?如果报错,那么程序就会不好写,程序员必须小心翼翼地处理内存的使用,避免超过允许的内存使用阈值。以上提到的这些都是需要解决的问题,也是虚拟化技术存在的价值和意义。那么如何来解决这些问题呢? 历史上有过不少的解决方案,但最终沉淀下的是虚拟化技术。接下来我为你介绍一种历史上存在过的 Swap 技术以及虚拟化技术。

交换(Swap)技术

Swap 技术允许一部分进程使用内存,不使用内存的进程数据先保存在磁盘上。注意,这里提到的数据,是完整的进程数据,包括正文段(程序指令)、数据段、堆栈段等。轮到某个进程执行的时候,尝试为这个进程在内存中找到一块空闲的区域。如果空间不足,就考虑把没有在执行的进程交换(Swap)到磁盘上,把空间腾挪出来给需要的进程。
在这里插入图片描述
上图中,内存被拆分成多个区域。 内核作为一个程序也需要自己的内存。另外每个进程独立得到一个空间——我们称为地址空间(Address Space)。你可以认为地址空间是一块连续分配的内存块。每个进程在不同地址空间中工作,构成了一个原始的虚拟化技术。比如:当进程 A 想访问地址 100 的时候,实际上访问的地址是基于地址空间本身位置(首字节地址)计算出来的。另外,当进程 A 执行时,CPU 中会保存它地址空间的开始位置和结束位置,当它想访问超过地址空间容量的地址时,CPU 会检查然后报错。上图描述的这种方法,是一种比较原始的虚拟化技术,进程使用的是基于地址空间的虚拟地址。但是这种方案有很多明显的缺陷,比如:

  1. 碎片问题:上图中我们看到进程来回分配、回收交换,内存之间会产生很多缝隙。经过反反复复使用,内存的情况会变得十分复杂,导致整体性能下降。
  2. 频繁切换问题:如果进程过多,内存较小,会频繁触发交换。
    你可以先思考这两个问题的解决方案,接下来我会带你进行一些更深入地思考——首先重新
    Review 下我们的设计目标。
  3. 隔离:每个应用有自己的地址空间,互不影响。
  4. 性能:高频使用的数据保留在内存中、低频使用的数据持久化到磁盘上。
  5. 程序好写(降低程序员心智负担):让程序员不用关心底层设施。
    现阶段,Swap 技术已经初步解决了问题 1。关于问题 2,Swap 技术在性能上存在着碎片、频繁切换等明显劣势。关于问题 3,使用 Swap 技术,程序员需要清楚地知道自己的应用用多少内存,并且小心翼翼地使用内存,避免需要重新申请,或者研发不断扩容的算法——这让程序心智负担较大。经过以上分析,需要更好的解决方案,就是我们接下来要学习的虚拟化技术。

虚拟内存

虚拟化技术中,操作系统设计了虚拟内存(理论上可以无限大的空间),受限于 CPU 的处理能力,通常 64bit CPU,就是 264 个地址。
在这里插入图片描述
虚拟化技术中,应用使用的是虚拟内存,操作系统管理虚拟内存和真实内存之间的映射。操作系统将虚拟内存分成整齐小块,每个小块称为一个页(Page)。之所以这样做,原因主要有以下两个方面。

  • 一方面应用使用内存是以页为单位,整齐的页能够避免内存碎片问题。
  • 另一方面,每个应用都有高频使用的数据和低频使用的数据。这样做,操作系统就不必从应用角度去思考哪个进程是高频的,仅需思考哪些页被高频使用、哪些页被低频使用。如果是低频使用,就将它们保存到硬盘上;如果是高频使用,就让它们保留在真实内存中。
    如果一个应用需要非常大的内存,应用申请的是虚拟内存中的很多个页,真实内存不一定需要够用

页(Page)和页表

操作系统将虚拟内存分块,每个小块称为一个页(Page);真实内存也需要分块,每个小块我们称为一个 Frame。Page 到 Frame 的映射,需要一种叫作页表的结构。
在这里插入图片描述
上图展示了 Page、Frame 和页表 (PageTable)三者之间的关系。 Page 大小和 Frame 大小通常相等,页表中记录的某个 Page 对应的 Frame 编号。页表也需要存储空间,比如虚拟内存大小为 10G, Page 大小是 4K,那么需要 10G/4K = 2621440 个条目。如果每个条目是64bit,那么一共需要 20480K = 20M 页表。操作系统在内存中划分出小块区域给页表,并负责维护页表。页表维护了虚拟地址到真实地址的映射。每次程序使用内存时,需要把虚拟内存地址换算成物理内存地址,换算过程分为以下 3 个步骤:

  1. 通过虚拟地址计算 Page 编号;
  2. 查页表,根据 Page 编号,找到 Frame 编号;
  3. 将虚拟地址换算成物理地址。
    如果页大小是 4K,假设程序要访问地址:100,000。那么计算过程如下。
  4. 页编号(Page Number) = 100,000/4096 = 24 余1619。 24 是页编号,1619 是地址偏移量(Offset)。
    2.查询页表,得到 24 关联的 Frame 编号(假设查到 Frame 编号 = 10)。
    3.换算:通常 Frame 和 Page 大小相等,替换 Page Number 为 Frame Number 物理地址 = 4096 * 10 + 1619 = 42579。

MMU

上面的过程发生在 CPU 中一个小型的设备——内存管理单元(Memory ManagementUnit, MMU)中。如下图所示:
在这里插入图片描述
当 CPU 需要执行一条指令时,如果指令中涉及内存读写操作,CPU 会把虚拟地址给 MMU,MMU 自动完成虚拟地址到真实地址的计算;然后,MMU 连接了地址总线,帮助 CPU 操作真实地址。这样的设计,就不需要在编写应用程序的时候担心虚拟地址到物理地址映射的问题。我们把全部难题都丢给了操作系统——操作系统要确定MMU 可读懂自己的页表格式。所以,操作系统的设计者要看 MMU 的说明书完成工作。难点在于不同 CPU 的 MMU 可能是不同的,因此这里会遇到很多跨平台的问题。解决跨平台问题不但有繁重的工作量,更需要高超的编程技巧,Unix 最初期的移植性(跨平台)是 C 语言作者丹尼斯·里奇实现的。
MMU 需要查询页表(这是内存操作),而 CPU 执行一条指令通过 MMU 获取内存数据,难道可以容忍在执行一条指令的过程中,发生多次内存读取(查询)操作?难道一次普通的读取操作,还要附加几次查询页表的开销吗?当然不是,这里还有一些高速缓存的设计.

页表条目

上面我们笼统介绍了页表将 Page 映射到 Frame。那么,页表中的每一项(页表条目)长什么样子呢?下图是一个页表格式的一个演示。
在这里插入图片描述
页表条目本身的编号可以不存在页表中,而是通过偏移量计算。 比如地址 100,000 的编号,
可以用 100,000 除以页大小确定。

  • Absent(“在”)位,是一个 bit。0 表示页的数据在磁盘中(不再内存中),1 表示在内存中。如果读取页表发现 Absent = 0,那么会触发缺页中断,去磁盘读取数据。

  • Protection(保护)字段可以实现成 3 个 bit,它决定页表用于读、写、执行。比如 000代表什么都不能做,100 代表只读等。

  • Reference(访问)位,代表这个页被读写过,这个记录对回收内存有帮助。

  • Dirty(“脏”)位,代表页的内容被修改过,如果 Dirty =1,那么意味着页面必须回写到磁盘上才能置换(Swap)。如果 Dirty = 0,如果需要回收这个页,可以考虑直接丢弃它(什么也不做,其他程序可以直接覆盖)。

  • Caching(缓存位),描述页可不可以被 CPU 缓存。CPU 缓存会造成内存不一致问题,

  • Frame Number(Frame 编号),这个是真实内存的位置。用 Frame 编号乘以页大小,就可以得到 Frame 的基地址。
    在 64bit 的系统中,考虑到 Absent、Protection 等字段需要占用一定的位,因此不能将64bit 都用来描述真实地址。但是 64bit 可以寻址的空间已经远远超过了 EB 的级别(1EB =2的20次方TB),这已经足够了。在真实世界,我们还造不出这么大的内存呢。

大页面问题

假设有一个应用,初始化后需要 12M 内存,操作系统页大小是 4K。那么应该如何设计呢?为了简化模型,下图中,假设这个应用只有 3 个区域(3 个段)——正文段(程序)、数据段(常量、全局变量)、堆栈段。一开始我们 3 个段都分配了 4M 的空间。随着程序执行,堆栈段的空间会继续增加,上不封顶。
在这里插入图片描述
上图中,进程内部需要一个页表存储进程的数据。如果进程的内存上不封顶,那么页表有多少个条目合适呢? 进程分配多少空间合适呢? 如果页表大小为 1024 个条目,那么可以支持10244K = 4M 空间。按照这个计算,如果进程需要 1G 空间,则需要 256K 个条目。我们预先为进程分配这 256K 个条目吗? 创建一个进程就划分这么多条目是不是成本太高了?为了减少条目的创建,可以考虑进程内部用一个更大的页表(比如 4M),操作系统继续用 4K
的页表。这就形成了一个二级页表的结构,如下图所示:
在这里插入图片描述
这样 MMU 会先查询 1 级页表,再查询 2 级页表。在这个模型下,进程如果需要 1G 空间,也只需要 1024 个条目。比如 1 级页编号是 2, 那么对应 2 级页表中 [2
1024, 3*1024-1] 的部分条目。而访问一个地址,需要同时给出一级页编号和二级页编号。整个地址,还可以用64bit 组装,如下图所示:
在这里插入图片描述

MMU 根据 1 级编号找到 1 级页表条目,1 级页表条目中记录了对应 2 级页表的位置。然后MMU 再查询 2 级页表,找到 Frame。最后通过地址偏移量和 Frame 编号计算最终的物理地址。这种设计是一个递归的过程,因此还可增加 3 级、4 级……每增加 1 级,对空间的利用都会提高——当然也会带来一定的开销。这对于大应用非常划算,比如需要 1T 空间,那么使用 2级页表,页表的空间就节省得多了。而且,这种多级页表,顶级页表在进程中可以先只创建需要用到的部分,就这个例子而言,一开始只需要 3 个条目,从 256K 个条目到 3 个,这就大大减少了进程创建的成本。

总结

目前我们主要都是在用 64bit 的机器。因为 2的64次方数字过于大,即便是虚拟内存都不需要这么大的空间。因此通常操作系统会允许进程使用非常大,但是不到 2的64次方 的地址空间。通常是几十到几百 EB(1EB = 106TB = 109GB)。

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

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

相关文章

1分钟用上ChatGPT,国内用户福音

众所周知的原因,要想在国内使用ChatGPT,肯定是要“折腾一番”的。 但是对于绝大多数普通小白,有没有比较容易的方法就用上官方的ChatGPT呢? 是可以的 最简单的方法就是调用OpenAI官方的API接口 就可以用“曲线救国”的方式用上…

免费部署你的私人 ChatGPT 网页应用

免费部署你的私人 ChatGPT 网页应用 1、注册Github账号,拷贝仓库 第一步、打开GitHub官网,点击右上角Sign up注册即可 第二步、打开开源项目【Chatgpt-next-web】,点击fork,点击Create fork完成操作 2、选择免费的容器【vercel】或者【r…

AI新晋“顶流”ChatGPT将对财务数字化带来哪些影响?

近期ChatGPT持续火热,2个月内,成为最快达成月活超过1亿的现象级应用。无论是科研人员、技术人员还是普通大众都对此非常关注,并惊讶于它强大的对话能力,ChatGPT也在国内持续霸榜热搜,成为大家茶余饭后的热点话题。毫无…

Mentor Pads中的关键技巧和工作方法

凡是从事电子设计的PCB工程师,都会知道在PCB设计工作中提高效率和质量的重要性,只有合理运用EDA软件的关键技巧和工作方法,可加速PCB设计流程,降低错误率,确保项目的成功交付。本文将以Mentor Pads软件为例&#xff0c…

Qt5安装及组件选择(Qt 5.12)

Qt5安装及组件选择(Qt 5.12.0) 如下图所示,安装Qt时有选择组件这一步,全部安装未免太占磁盘控件,只需安装我们所需要的组件即可。接下来就分析分析各个组件的作用及含义。 “Qt 5.12.0”节点下面是 Qt 的功能模块&a…

红黑树封装set和map(插入部分)

文章目录 前言1.设计大致思路2.改造封装红黑树1.插入节点2.迭代器的实现 3.map和set的封装1.代码实现2.简单测试 前言 之前我们实现了红黑树的插入的部分,本文主要介绍将之前实现的红黑树封装成map和set。我们是以学习的角度来封装容器,不用非要把库中容…

FPGA采集CameraLink相机Base模式解码输出,附带工程源码和技术支持

目录 1、前言2、CameraLink协议基础3、目前我已有的CameraLink收发工程4、设计方案输入CameraLink相机LVDS视频解码视频缓存视频输出软件配置 5、vivado工程详解6、上板调试验证7、福利:工程代码的获取 1、前言 FPGA实现CameraLink视频编解码目前有两种方案&#x…

华为OD机试真题 Java 实现【分界线】【2023Q1 100分】

一、题目描述 电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字剪切下来,剪拼成匿名信。现在有一名举报人,希望借鉴这种手段,使用英文报刊完成举报操作。 但为…

day15 - 使用图像金字塔进行图像拼接

在我们之前的学习过程中,使用的都是恒定大小的图像,但是在某些情况下,我们需要使用不同分辨率的(相同)图像。例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将…

vim各模式下常见指令集

vim简介 vim其实就是一款写代码的软件或者编辑器。vs2019能够编写编译调试运行代码,它的功能非常的集成,因此它被称为集成开发环境。但是vim只是编辑,他的核心工作就是文本编写,就是单纯写代码,因此它的功能是不集成的…

chatgpt赋能python:Python概览:了解Python的优势和应用领域

Python概览:了解Python的优势和应用领域 介绍Python Python是一门高级编程语言,由Guido van Rossum在1989年创建,旨在提高开发人员的开发效率和代码质量。Python有着良好的代码可读性和简洁性,因此它已成为全球最受欢迎的编程语…

如何在 IDEA 中生成 Maven 依赖关系图?

文章目录 1、查看依赖关系图2、保存至本地查看3、exclude IDEA提供了查看依赖关系的方式,如下: 1、查看依赖关系图 点击IDEA右侧的maven工具栏,展开maven操作界面。 进入maven操作界面,点击查看maven之间的依赖关系按钮 然后就可…

代码随想录算法训练营day51 | 309. 最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,股票问题总结

代码随想录算法训练营day51 | 309. 最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,股票问题总结 309. 最佳买卖股票时机含冷冻期解法一:动态规划 714.买卖股票的最佳时机含手续费解法一:动态规划 股票问题总结 309. 最…

矿井水除总氮工艺详解

一、项目概述 项目背景: 1、水资源浪费长期以来,采煤对地下水造成了严重破坏。绝大部分矿井水,被以直排方式,流入河道、田野,这不仅造成水资源的白白浪费,也污染了环境。社会对此反响强烈的同时,煤矿企业也…

BT131-ASEMI代理KY原装双向可控硅BT131

编辑:ll BT131-ASEMI代理KY原装双向可控硅BT131 型号:BT131 品牌:韩景元\KY 封装:TO-92 特性:可控硅 正向电流:1A 反向耐压:600V 触发电压: 0.62~0.8 V 引脚数量…

ES(Elasticsearch)的docker安装部署教程

0、 服务器版本信息 Red Hat 4.8.5-44 CentOS Linux release 7.9.2009 (Core) 1、ES部署 1.1 拉取docker镜像 docker pull elasticsearch:7.10.1拉取成功的镜像,可以使用如下命令查看: docker images 上图2年之前表示该elasticsearch的7.10.1镜像版…

从传统 IT 容灾转向“全栈云容灾”|什么是更适合政企的云

凌晨 3 点,在某医院的自助缴费机前,一位医患家属正愁眉紧锁,手中的医保卡已经刷了无数遍,可次次都提示缴费失败,至亲的手术已经迫在眉睫… 早上 8 点,是上班族在通勤途中打开新闻 app 刷新闻的高峰&#x…

vue3+vite 中使用百度地图【两种方式】

vue3vite项目中使用百度地图 方式一:直接使用百度地图的ak方式二:使用vue-baidu-map-3x插件 方式一:直接使用百度地图的ak 提前准备: 创建一个vite项目申请好的百度地图ak值 百度地图使用: 在创建好的vite项目的入…

python 编译安装与脚本安装

编译安装的一般步骤: 安装依赖,安装依赖的第三方的工具,yum可以解决 编译安装的包中都有:configure 文件 进行预编译:检查你的环境是否合格 ./configure --prefixxxx 生成编译的文件:MakeFile python安装&…

Taobao.item_search-淘宝商品列表接口、关键词搜索淘宝商品列表接口

淘宝商品列表接口是淘宝开放平台提供的一个接口,可以返回符合指定条件的商品列表,开发者可以根据自己的需要在自己的应用中使用。 请求方式 淘宝商品列表接口使用 HTTP GET 请求方式。 请求 URL 请求URL如下:http://o0b.cn/opandy 请求参…