基本内存管理
内存管理的环境
程序要运行,必须先加载到内存,内存管理负责对内存架构进行管理,使用户无需担心自己的程序是在缓存,主存,还是磁盘上,实现的手段就是靠虚拟内存,虚拟内存就是一个幻像,给用户提供一个比物理主存大许多的地址空间
内存管理的目标
- 一个进程不能随便访问另一个进程的地址空间
- 程序指令里面的地址是虚拟空间的虚拟地址,而不是实际物理地址
虚拟内存的概念
一个程序向要运行,需要加载到物理内存中,但是物理内存又非常有限,使用虚拟内存可以在不增加成本的情况下扩大内存容量
虚拟内存的核心是把物理主存扩大到磁盘上,把磁盘空间看做主存空间的一部分,在程序执行时,程序发出的地址到底是在主存还是磁盘完全由操作系统内存管理模块负责判断
操作系统在内存中的位置
操作系统就是管理计算机的程序,本身也需要使用资源,其中一个就是内存空间,多数现代操作系统ROM里面包括操作系统一部分和IO,RAM包括操作系统其它部分
单道程序的内存管理
在单道程序的环境下,内存里只有一个用户程序和一个操作系统,操作系统所占用的内存空间是恒定的,因而可以将用户程序总是加载到同一个内存地址上,即用户程序永远从同一个地方开始执行,这种模式下,用户程序地址都可以事先算出,即程序运行前就计算出所有的物理地址(编写程序时并不需要知道,而是由编译器等来做静态翻译),这种方式叫做静态地址翻译
当然,这种情况是不现实的
多道程序的内存管理
在多道程序的情况下,无法将程序总是加载到固定的内存地址上,无法使用静态地址翻译,我们就必须在程序运行时来进行地址翻译,叫做动态地址翻译
⑴固定分区的多道程序内存管理
将内存分成固定的几个区域,每个区域大小是固定不变的,当新程序来了,就排队的等待,直到加载到固定分区
⑵地址翻译的方法
物理内存地址 = 虚拟地址 + 程序所在区域的起始地址
程序的大小叫做极限,程序发出的虚拟地址大于极限,就把进程kill了
⑶动态地址翻译的优点
使用动态地址翻译最重要的好处是使虚拟内存的概念得以实现,一个程序发出的访问地址有可能在内存,也有可能在磁盘
⑷非固定分区的内存管理
固定分区大小不是很灵活,如果一个程序比分区大咋办,下面来介绍下非固定分区,非固定分区除了划给操作系统一部分,剩下的进程A来了,给进程A一块,B来了,给进程B一块