内存的发展流程:
一.嵌入式实时操作系统
表现:在早期的单片机上,程序运行在物理内存中,也就是说,程序在运行时直接访问到物理地址,在程序运行开始,将全部程序加载到内存中,所有的数据地址和程序地址就此固定。
在运行多任务系统时,比较直接的办法也是直接为每个任务分配各自需要的内存空间,比如总内存为100M,task1需要40M,task2需要50M,task3需要20M,那么最简单的办法是给task1分配40M,给task2分配50M,而task3,不好意思,内存不够了,不允许运行
弊端:
- 地址空间不隔离
所有程序都可以直接访问物理内存,那么task1就可以直接访问task2的地址,这就给了一些恶意程序机会来进行一些非法操作,即使是非恶意但是有bug的程序,也可能会导致其他任务无法运行,这对于需要安全稳定的的计算机环境的用户是不能容忍的。 - 内存使用效率极低
由于没有有效的内存管理机制,通常在一个程序执行时,将整个程序装载进内存中运行,如果我们要运行task3,内存已经不够了,其实系统完全可以将暂时没有运行的task2先装入磁盘中,将task3装载到内存,当需要运行task2时,再将task2换回,虽然牺牲了一些执行效率,但总归是可以支持更多程序运行。 - 程序地址空间不确定
需要了解的是程序在编译阶段生成的可执行文件中符号地址是连续且确定的,即使实现了内存数据与磁盘的交换,将暂时不需要的任务放入磁盘而运行其他任务,程序每次装入内存时,都需要从内存中分配一段连续内存,这个空间是不确定的,但是在程序实现过程中,有些数据往往要求其地址空间是确定的,这就会给编写程序带来很大的麻烦。
二.虚拟内存机制的诞生
操作系统后来为内存添加了一层中间层,也就是虚拟内存机制,此时针对开发者来说操作的全部都是虚拟地址,这样,只要我们能妥善处理好虚拟地址到物理地址的映射过程,而这个映射过程被当作独立的一部分存在,就可以解决上述提到的三个问题:
1.对于地址隔离,因为程序员操作的是虚拟地址,虚拟地址在最后会转化为物理地址,可能程序A访问的0x8000,转换到物理地址是0x3000,而程序B同样访问0x8000,但是会被转换到物理地址0x4000,这样程序中并不知道自己操作的物理地址,也操作不到实际的物理地址,因为虚拟地址的转换总会将地址映射到不冲突的物理地址上,同时进行检测,也就无从影响到别的任务执行。
2.对于内存使用效率,建立完善的内存管理机制,可以更方便地进行内存与磁盘数据的交换,将空置的内存利用起来而不增加编程者的负担。
3.对于程序空间不确定 虚拟内存机制完美地解决了这个问题,在直接操作物理地址时,因为内存与磁盘的交换,可能导致函数或者变量地址的变化,原来程序中的数据必须进行更新。
而引入虚拟内存机制,程序员只操作虚拟地址,函数、变量虚拟地址不变,物理地址可能变化,但是程序员只需要关注虚拟地址就行了,虚拟地址到物理地址的转换就由内存管理部分负责。
既然增加了一个中间层,那么这个中间层最好是由独立的部分进行管理,实现这个功能的器件就是MMU,它接管了程序中虚拟地址和物理地址的转换,MMU一般直接集成在CPU中,不会以独立的器件存在。
三.内存分段分页机制
分段:
它把虚拟地址空间映射到了物理地址空间,并且你写的程序操作的是虚拟地址。假设,程序A的虚拟地址空间是0x00000100~0x00000200。此时,不仅需要一块连续的物理内存来存放程序A,还需要把程序A的虚拟地址空间映射到(转换为)物理地址空间。可能,程序A的虚拟地址空间从0x00000100~0x00000200映射到了物理地址空间0x00000000~0x00000100。
解决了问题1,3
分页:
分段映射的是一段连续的内存
分页这个技术仍然是一种虚拟地址空间到物理地址空间映射的机制。但是,粒度更加的小了。单位不是整个程序,而是某个“页”,一段虚拟地址空间组成的某一页映射到一段物理地址空间组成的某一页。
分页这个技术,它的虚拟地址空间仍然是连续的,但是,每一页映射后的物理地址就不一定是连续的了。正是因为有了分页的概念,程序的换入换出就可以以页为单位了。那么,为什么就可以只换出某一页呢?实际上,不是为什么可以换出某一页,而是可以换出CPU还用不到的那些程序代码、数据。但是,把这些都换出到磁盘,万一下次CPU就要使用这些代码和数据怎么办?又得把这些代码、数据装载进内存。性能有影响对吧。所以,我们把换入换出的单位变小,变成了“页”。(实际上,这利用了空间局部性)
分页和分段区别的主要核心在于粒度。
分段就是将一个程序分成代码段,数据段,堆栈段什么的
分页就是将这些段,例如代码段分成均匀的小块,然后这些给这些小块编号,然后就可以放到内存中去,由于编号了的,所以也不怕顺序乱
然后我们就能通过段号,页号,页内偏移找到程序的地址
参照:
https://www.cnblogs.com/downey-blog/p/10482472.html
https://www.zhihu.com/question/50796850
深入理解计算机操作系统
来源:CSDN
作者:hello_bravo_
链接:https://blog.csdn.net/hello_bravo_/article/details/104134455