重学计算机组成原理(8)-程序是如何被装载的(下)

简介: 重学计算机组成原理(8)-程序是如何被装载的(下)

3 内存分页

既然问题原因是:

  • 内存碎片
  • 内存交换的空间太大

则解决方案自然就是想着:

  • 怎么少出现内存碎片
  • 当需内存交换时,让需交换写入或从磁盘装载的数据更少一点


于是内存管理给出了 内存分页(Paging) 方案。


和分段这样分配一整段连续的空间给到程序相比,分页是把整个物理内存空间切成一段段固定尺寸的大小。而对应程序所需占用的虚拟内存空间,也会切成一段段固定尺寸的大小。


这一个个连续&&尺寸固定的内存空间,叫页(Page)。

从虚拟内存 =》物理内存的映射,不再是拿整段连续的内存的物理地址,而是按一个个页,一般来说:

页 的 尺 寸 < < 整 个 程 序 的 大 小 页的尺寸 << 整个程序的大小页的尺寸<<整个程序的大小


Linux下,通常设置成4KB,可查看:

  • Linux设置的页大小

image.png

  • macOS 的内存页大小

image.png

由于内存空间都是预先划分好的,也就没有不能使用的碎片,而只有被释放出来的很多4K的页。

即使内存空间不够,需要让现有的、正在运行的其他程序通过内存交换释放出一些内存页出来,一次性写入磁盘的也只有少数的一个页或几个页,不会花太多时间,让整个机器被内存交换的过程给卡住。

image.png

分页的方式使得加载程序的时候,不再需要一次性把程序加载到物理内存中。

可在进行虚拟内存、物理内存页之间的映射后,并不真的把页加载到物理内存,而是只在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存。


os也就是这么做的,当要读取特定的页,却发现数据并未加载到物理内存,就会触发来自CPU的缺页错误(Page Fault)。

os会捕捉到这个错误,然后将对应页,从存放在硬盘上的虚拟内存读出,加载到物理内存。

这使得可以运行那些远大于我们实际物理内存的程序。同时,任何程序都无需一次性加载完所有指令和数据,只需加载当前所需的。


通过虚拟内存、内存交换和内存分页技术组合,最终得到了一个让程序无需考虑实际物理内存地址、大小和当前分配空间的解决方案。

这些技术和方法,对于我们程序的编写、编译和链接过程都是透明的。这也是我们在计算机的软硬件开发中常用的一种方法,就是加入一个间接层。


通过引入虚拟内存、页映射和内存交换,程序不再需考虑对应真实内存地址、程序加载、内存管理等问题。

任一程序只需把内存当成是一块完整而连续的空间来直接使用即可,其它都是 os 保姆帮你做好的。

4 总结

在虚拟内存、内存交换和内存分页这三者结合之下,要运行一个程序,“必需”的内存是很少的。CPU只需要执行当前的指令,极限情况下,内存也只需要加载一页就好了。

再大程序,也可分成一页。每次,只在需要用到对应的数据和指令的时候,从硬盘上交换到内存里面来就好了。

以现在4K内存一页的大小,640K内存也能放下足足160页呢,也无怪乎在比尔·盖茨会说出“640K ought to be enough for anyone”。


不过硬盘的访问速度比内存慢很多,所以我们现在的计算机没有几G内存都不好意思卖。


除了程序分页装载这种方式之外,还有其他优化内存使用的方式:“动态装载”,请见后文分解。

FAQ

在Java这样使用虚拟机的编程语言里,程序是怎么装载到内存里的?也和本文一样,通过内存分页和内存交换的方式加载到内存里面来的么?

JVM已是上层应用,无需考虑物理分页,一般更直接是考虑对象本身空间大小,物理硬件管理统一由承载JVM的os解决。


参考

  • 深入浅出计算机组成原理
  • 《程序员的自我修养——链接、装载和库》的第1章和第6章
目录
相关文章
|
6月前
|
存储
计算机组成原理(5)----CPU的基本结构
计算机组成原理(5)----CPU的基本结构
169 0
|
6月前
|
存储 Unix 程序员
计算机组成原理(5)----指令系统(2)
计算机组成原理(5)----指令系统
633 1
|
6月前
|
存储 人工智能 C语言
计算机组成原理(5)----指令系统(1)
计算机组成原理(5)----指令系统
99 1
|
存储 NoSQL 网络协议
关于操作系统、计算机组成原理、编译系统、数据库原理、计算机网络原理总结
关于操作系统、计算机组成原理、编译系统、数据库原理、计算机网络原理总结
152 0
|
12月前
|
存储 编译器 芯片
【计算机组成原理】知识点巩固 - 存储器概述
【计算机组成原理】知识点巩固 - 存储器概述
4519 1
|
存储 编译器 C语言
计算机底层知识之汇编语言
汇编语言和本地代码是一一对应的 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ 不会转换成本地代码的伪指令 推荐阅读指数 ⭐️⭐️⭐️ 汇编语言的语法是操作码 + 操作数 推荐阅读指数⭐️⭐️⭐️⭐️⭐️ mov指令 推荐阅读指数 ⭐️⭐️⭐️ 对栈进行push 和 pop 推荐阅读指数 ⭐️⭐️⭐️ 函数调用机制 推荐阅读指数 ⭐️⭐️⭐️⭐️⭐️ 函数内部的处理 推荐阅读指数 ⭐️⭐️⭐️⭐️⭐️ 全局变量用的内存空间 推荐阅读指数 ⭐️⭐️⭐️ 循环处理的实现方法 推荐阅读指数 ⭐️⭐️⭐️⭐️⭐️
110 0
计算机底层知识之汇编语言
#计算机组成原理# (学第四章先看!!)第四章 存储器简述
#计算机组成原理# (学第四章先看!!)第四章 存储器简述
73 1
#计算机组成原理# (学第四章先看!!)第四章 存储器简述
|
存储 算法 JavaScript
计算机底层知识之内存
计算机是进行数据处理的设备,而程序表示的就是处理顺序和数据结构。由于处理对象(数据)是存储在内存和磁盘上的,因此我们今天来聊聊内存和磁盘。
224 0
|
存储 JavaScript 算法
计算机组成原理系列(二):计算机编码全解析
你是不是工作了很多年了,一直没搞清楚计算机中的各种编码规则,虽然平时都会使用,但是内部机制原理一直都是之其然而不知其所以然,开发中也会经常涉及到这块内容,但都没有太多重视
|
Linux C语言
重学计算机组成原理(九)- 动态链接
把对应的不同文件内的代码段,合并到一起,成为最后的可执行文件 链接的方式,让我们在写代码的时候做到了“复用”。 同样的功能代码只要写一次,然后提供给很多不同的程序进行链接就行了。 “链接”其实有点儿像我们日常生活中的标准化、模块化生产。
1465 0