今天上午看了《深入理解计算机系统》中关于虚拟存储器的章节,记录如下:
首先说为什么要有虚拟存储器
我个人觉得虚拟存储器的概念是和进程概念一起出现的。在计算机技术发展的早期,只有单道批处理系统,特点是一次只能运行一个进程,只有运行完毕后才能将下一个进程加载到内存里面,所以进程的数据都是直接放在物理内存上的。
到后来发展出了多道程序系统,它要求在计算机中存在着多个进程,处理器需要在多个进程间进行切换。这时候就出现问题了,链接器在链接一个可执行文件的时候,总是默认程序的起始地址为0x0,但物理内存上只有一个0x0的地址呀?也许你会说:”没关系,我们可以在程序装入内存的时候再次动态改变它的地址.”好吧我忍了。但如果我的物理内存大小只有1G,而现在某一个程序需要超过1G的空间怎么办呢?你还能用刚才那句话解释吗?
这时候虚拟存储器的作用就发挥出来了,我们为每一个进程分配一个0~232-1个字节(32为系统,下同)的虚拟地址空间,并将这些空间在逻辑上分为各个段,每个段的作用、位置和访问权限都不同,具体可见我的关于进程这篇文章。使用虚拟存储器有如下好处:
- 方便程序的链接和装入工作
- 装入内存后可极大的节省内存
- 方便操作系统对进程的管理
- 安全,一个进程无法访问其他进程的空间
- 可以保证每个进程可用空间为CPU的最大寻址空间
- 可以高效的在进程间共享数据,如共享内存
- 其他的想起来在补充哈,反正好处很多的。。。
虚拟存储器的工作原理
当操作系统将一个程序载入内存时,会为其创建一个PCB出来,PCB在Linux系统中就是一个task_struct的内核结构体,其中的元素包含或者指向内核运行该进程所需要的所有信息(例如:PID,指向用户栈的指针,可执行目标文件的名称以及程序计数器)。
task_stru