计算机系统(八)虚拟存储器(虚拟内存地址空间)


虚拟存储器:是一个抽象概念,抽象内存地址。它为每个process提供了一个假象,即每个process都在独占的使用主存。 每个process 看到的是一致的存储器,称为虚拟地址空间。 linux/unix process的虚拟地址空间;

地址空间的最上面的区域是位OS的内核代码和数据保留的,这对所有的process都是一样的。
底部区域存放 用户process定义的代码和数据。  在linux/unix中地址空间的增长是向上的。

     每个process看到的虚拟地址空间 由大量准确定义的区构成。每个区都有专门的功能。
      A: 程序代码和数据: 对于所有的进程来说,代码是从同一固定地址开始,紧挨着的是和C全局变量 相对应的数据位置。 代码和数据区 是直接按照可执行文件的内容初始化的,就是hello(链接 + 加载)
     B: 堆:代码和数据区后紧随着的是运行时堆。代码和数据区是process一开始运行时就被规定了大小, 由此不同,当调用如malloc 和 free这样的C 标准库函数时,堆可以在运行时动态地扩展和收缩。
    C: 共享库/动态库 :大约在地址空间的中间部分是一块用来存放 像C标准库和数学库 这样共享库的代码和数据的 区域。 共享库概念非常强大,相当难懂

   D:栈(用户栈)位于用户虚拟地址空间顶部,这块区域是提供给 编译器用来实现函数调用。和堆一样,用户栈在程序执行期间可以动态的扩展和收缩,特别是每次我们调用一个函数时,栈就会增长;从一个函数返回时,栈就会收缩。


 E:内核虚拟存储器: 内核总是驻留在内存中的,是OS的一部分。 地址空间顶部的区域是为内核保留的,不允许应用程序读、写这个区域的内容或者直接调用哪个内核代码定义的函数。

总结:虚拟存储器的运作需要hardware和OS之间精密复杂的交互,包括处理器生成的每个地址的硬件翻译。

基本思想:把一个process 虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存


计算机系统(八)虚拟存储器(虚拟内存地址空间)_第1张图片

你可能感兴趣的:(计算机系统(八)虚拟存储器(虚拟内存地址空间))