重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

《深入浅出计算机组成原理》学习笔记Day4-创新互联

程序装载与虚拟内存
    • 1. 虚拟内存
    • 2. 内存分段
    • 3. 内存分页
    • 4. 总结
    • 参考

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、网站空间、营销软件、网站建设、渠县网站维护、网站推广。1. 虚拟内存

在链接器把多个文件合并成一个最终可执行文件之后,当要运行这些可执行文件的时候,其实是通过一个装载器来解析 ELF 或者 PE 格式的可执行文件。

装载器会把对应的指令和数据加载到内存里面来,让 CPU 去执行。

一个可行的装载器需要满足两个要求:

  1. 可执行程序加载后占用的内存空间应当连续。执行指令的时候,程序计数器是顺序地一条一条指令执行下去。
  2. 能够同时加载多个程序,并且不能让程序自己规定在内存中加载的位置。现在的计算机会同时运行很多个程序,一个程序想要的内存地址可能已经被其他加载了的程序占用了。

虚拟内存就是一个很好的方法。
我们可以在内存里面找到一段连续的内存空间,然后分配给装载的程序,
接下来把这段连续的内存空间地址和程序指定的内存地址做一个映射。

其中,程序指定的内存地址叫做虚拟内存地址(Virtual Memory Address),实际在内存硬件的空间地址叫做物理内存地址(Physical Memory Address)。

对于每个程序来说,它看到的都是同样的内存地址——虚拟内存地址。我们只需要维护一个虚拟内存到物理内存的映射表,这样实际程序执行的时候,会通过虚拟内存地址找到对应的物理内存地址,然后执行。

2. 内存分段

这种找出一段连续的物理内存和虚拟内存地址进行映射的方法,叫分段(Segmentation)。段就是指系统分配出来的那个连续的内存空间。

有了分段,程序本省不用关心具体的物理内存地址的问题。但分段也有一个不足——内存碎片(Memory Fragmentation)。说白了,就是内存中连续的、足够大的空间少,都是一个隔一个的空间。

可以通过内存交换(Memory Swapping)来解决。A程序需要一个很大内存空间,此时B程序在运行,B的物理内存空间大小 + 与B相邻的大的空闲内存正好能满足A。于是我们就将B的内存写到硬盘上,然后再另寻一块满足B的内存空间,将从硬盘读到内存中的这块空间。于是A、B都能得到满足。

Linux操作系统就是通过 swap 硬盘分区来实现内存交换。

3. 内存分页

既然问题出在内存碎片和内存交换的空间太大上,那么解决问题的办法就是,少出现一些内存碎片。另外,当需要进行内存交换的时候,让需要交换写入或者从磁盘装载的数据更少一点,这样就可以解决这个问题。这个办法,在现在计算机的内存管理里面,就叫作内存分页(Paging)。

分页是把整个物理内存空间切成一段段固定尺寸的大小。对应的程序所需要占用的虚拟内存空间,也会同样切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,称为页(Page)。

从虚拟内存到物理内存的映射,不再是拿整段连续的内存的物理地址,而是按照一个一个页来的。页的尺寸一般远远小于整个程序的大小。在 Linux 下,通常只设置成 4KB。

由于内存空间都是预先划分好的,也就没有了不能使用的碎片,而只有被释放出来的很多 4KB 的页。即使内存空间不够,需要让现有的、正在运行的其他程序,通过内存交换释放出一些内存的页出来,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,让整个机器被内存交换的过程给卡住。

更进一步地,分页的方式使得我们在加载程序的时候,不再需要一次性都把程序加载到物理内存中。完全可以在进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存里,而是只在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存里面去。

当要读取特定的页,却发现数据并没有加载到物理内存里的时候,就会触发一个来自于 CPU 的缺页错误(Page Fault)。操作系统会捕捉到这个错误,然后将对应的页,从存放在硬盘上的虚拟内存里读取出来,加载到物理内存里。这种方式,使得可以运行那些远大于我们实际物理内存的程序。同时,这样一来,任何程序都不需要一次性加载完所有指令和数据,只需要加载当前需要用到就行了。这种方法也称为写时复制(Copy On Write)。

4. 总结

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

这些技术和方法,对于我们程序的编写、编译和链接过程都是透明的。任何一个程序,只需要把内存当成是一块完整且连续的空间来使用。

这也是在计算机的软硬件开发中常用的一种方法——加入一个间接层。

参考

极客时间《深入浅出计算机组成原理》:http://gk.link/a/11UMi

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前标题:《深入浅出计算机组成原理》学习笔记Day4-创新互联
文章路径:http://cqcxhl.com/article/ddecpd.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP