现代操作系统-内存管理
分层存储器体系:cache, ram,rom,硬盘等,越靠近CPU的价格越贵,但速度也越快。
操作系统中管理分层存储器体系的部分称为存储管理器,其任务是有效管理内存,记录哪些内存是正在使用的,哪些内存是空闲的。
无存储器抽象
最简单的存储器抽象就是根本没有抽象,每个程序直接访问物理内存,当一个程序执行如下指令:
MOV REGISTER1,1000
计算机会将位置为1000的内存的内容移动到REGISTER1,在这种情况下,想要在内存中同时运行两个程序是不可能的,若第一个程序在2000的位置写入一个新的值,将会擦掉第二个程序存放在该位置的内容。
而在没有存储器抽象的系统中实现并行的一种方法就是使用多线程编程,因为在引入线程时就假设一个进程中的所有线程对同一内存映像都可见,那么实现并行也就不是问题了。但实际上这种方法没有被广泛采用,因为人们通常希望在同一时间运行没有关联的程序,而这正是线程抽象所不能提供的。
但是即使没有存储器抽象,同时运行多个程序也是可能的,操作系统只需要把当前内存中的所有内容保存到磁盘文件中,然后把下一个程序读入到内存再运行即可。只要某个时间内存中只有一个程序,那么就不会冲突。
也就是说在特殊硬件的帮助下,即使没有交换功能,并发的运行多个程序也是可能的。IBM360早期模型是这样解决的:内存被划分为2KB的块,每个块被分配一个4位的保护键,保护键存储在CPU的特殊寄存器中,PSW(程序状态字)中存在一个4位码,一个运行中的进程如果访问保护见与其PSW码不同的内存,360的硬件会捕获到这一事件。
然而这种解决办法有一个重要缺陷,假设有两个程序,连续的装载进内存中,两个程序中都有跳转地址的操作,使用的地址都是绝对地址,但是如果在运行时,应该跳转的是相对地址,也就是该程序开始地址作为起始地址,否则会跳转到其他程序中。IBM的补救方案是在第二程序加载到内存时,使用静态重定位技术修改,当一个程序装载到16384地址时,常数16384会加到每个程序地址上。但这种方案不是一种通用的解决办法,同时会减慢装载速度。
一种存储器抽象:地址空间
总之,把物理地址暴露给进程会带来几个严重问题:第一,如果用户程序可以寻址内存的每个字节,可以很容易的破坏操作系统。第二,多个程序的运行很困难。
因此,一个更好的方法是创造一个新的存储器抽象:地址空间,为应用程序创造了一种抽象的内存。地址空间时一个进程可用于寻址内存的一套地址集合,每个进程都有自己的地址空间,且独立于其他进程的地址空间。
如何保证不同程序所对应的物理地址不同呢?
采用的是动态重定位,简单的把每个进程的地址空间映射到物理内存的不同部分,利用两个特殊硬件寄存器,基址寄存器和界限寄存器,程序的初始物理地址装载到基址寄存器,程序的长度装载到界限寄存器。每次进程需要访问内存,取一条指令,读写一个数据字时,CPU会自动把基址值加到进程发出的地址值上。
使用该方法的缺点在于,每次访问内存都需要进行加法和比较运算,时间较慢。
虚拟内存
尽管基址寄存器和界限寄存器可以用于创建地址空间的抽象,还有另一个问题需要解决:管理软件的膨胀,这一发展的结果就是需要运行的程序往往大到内存无法容纳,而且必然需要系统能够支持多个程序运行。
在最开始解决办法是:将程序分割成许多片段,称为覆盖,程序开始执行,将覆盖0装入并运行,完成后换入覆盖1装入运行。
方法的缺点是必须由程序员分割程序,比较耗时。
因此虚拟内存方法诞生,其基本思想是:每个程序拥有自己的地址空间,这个空间被分割为多块,每一块称为一页或者页面(page),每一页有连续的地址范围,这些页都会被映射到物理内存,但并不是所有页在内存中才能运行程序,当程序引用到一部分在物理内存中的地址空间时,由硬件执行必要的映射。
分页
程序引用了一组内存地址,当程序执行指令:
MOV REG,1000 将地址为1000的内存单元的内容复制到REG中
由程序产生的地址称为虚拟地址,它们构成了虚拟地址空间,在没有虚拟内存的计算机上,将虚拟地址直接送到内存总线,也就是直接读写物理内存,而在使用虚拟内存时,虚拟地址被送到内存管理单元(MMU),MMU将虚拟地址映射为物理内存地址。
虚拟地址空间按照固定大小划分为被称为page的若干单元。在物理内存中对应的单元称为页框,页面和页框的大小通常是一样的。然后当程序试图访问某个地址时,会将该虚拟地址送到MMU,mmu判断落在那个page上,然后根据映射结果,对应相应的页框,然后将地址变换即可。
通过恰当的设置MMU,可以把16个虚拟页面映射到8个页框中的任何一个,但这并没有解决虚拟地址空间比物理内存大的问题。
当程序访问一个未映射的页面,MMU会注意到该页面没有被映射,于是让CPU陷入到操作系统,这个陷阱称为缺页中断或缺页错误,操作系统会在物理内存上找到一个很少使用的页框,修改映射管理,然后重新启动引起陷阱的指令。
posted on 2018-04-09 22:44 sichenzhao 阅读(262) 评论(0) 编辑 收藏 举报