计算机组成原理07——程序装载

程序装载涉及ELF或PE格式的解析,要求内存空间连续且不固定位置。分段解决了地址映射,但产生内存碎片。内存交换通过将程序写入硬盘再读回,合并碎片,但影响性能。内存分页则将内存切分为固定大小的页,按需加载,减少碎片并优化内存交换,通过缺页错误机制实现动态加载。
摘要由CSDN通过智能技术生成

程序装载

程序装载难处

要想装载器解析ELF或者PE格式的可执行文件,把对应的指令和数据加载到内存。装载器需要满足两个要求。

第一,可执行程序加载后占用的内存空间应该是连续的

第二,我们需要同时加载很多个程序,并且不能让程序自己规定在内存中加载的位置

如何解决难处?

我们可以在内存中,找到一段连续的内存空间,然后分配给装载的程序,把这段连续的内存空间地址和整个程序指令里指定的内存地址做一个映射。

我们把指令里用到的内存地址叫做虚拟内存地址,实际在内存硬件里面的空间地址叫做物理内存地址

我们维护一个虚拟内存到物理内存的映射表,这样实际程序指令执行的时候,会通过虚拟内存地址找到对应的物理内存地址,然后执行。因为是连续的内存地址空间,我们只需要维护映射关系的起始位置和对应的空间大小即可。

内存分段

这种找出一段连续的物理内存和虚拟内存地址进行映射的方法我们叫分段

在这里插入图片描述

分段解决了程序本身不需要关心具体的物理内存地址的问题,但是它会产生内存碎片

在这里插入图片描述

针对内存碎片我们的解决办法叫内存交换

我们可以把上图的Python程序写到硬盘上,然后再从硬盘读回来到内存里面。不过读回来的时候,不在原来的位置,而是紧跟着512MB的内存后面。这样就把两个空余的128MB的内存碎片合并,解决了内存碎片的问题。

但是硬盘的访问速度要比内存慢的多,所以内存交换的时候整个机器会显得卡顿。

内存分页

问题出在内存碎片和内存交换的空间太大,那么少出现一些碎片,而且在交换的时候让需要交换的大小小一点,就可以解决这个问题。在计算机管理内存里面,就叫做内存分页

和分段这样分配一整段连续的空间给到程序相比,分页是把整个物理内存空间切成一段段固定尺寸的大小,而对应的程序所需要占用的虚拟内存空间,也会同样切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,我们叫做。这样通过内存交换释放一些内存的页出来,一次性写入磁盘的只有少数的几个页,不会花很多时间,降低机器的性能。

更进一步,分页使我们在加载程序的时候,不需要一次性都把程序加载到物理内存中。而是只在程序运行中,需要用到对应的虚拟内存页里面的指令和数据时,再加载到物理内存中去。

当要读取特定的页时,发现数据并没有加载到物理内存,会触发CPU的缺页错误。操作系统回捕捉到这个错误然后将对应的页从存放在磁盘上的虚拟内存里取出来,加载到物理内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直饿着肚子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值