zoukankan      html  css  js  c++  java
  • 四个名词(很常见):虚拟内存,虚拟内存地址(线性地址),物理内存,物理内存地址,逻辑地址

    为什么会有虚拟内存和物理内存的区别?

         正在运行的一个程序,它所需的内存是有可能大于内存条容量之和的,比如你的内存条是1G,但是你的程序需要2G的数据区,那么不是所有数据都能一起加载到内存(物理内存)中,势必有一部分数据要放到其他介质中(比如硬盘),待进程需要访问那部分数据时,再通过调度进入物理内存,所以虚拟内存是进程运行时所有内存空间的总和,他是远大于物理内存的一个虚拟存储空间,是将外存的一部分作为内存的扩展来使用,并且很多时候有一部分不在物理内存中,而物理内存就是我们平时所了解的内存条,有的地方也叫虚拟内存为内存交换区。

    那么什么是虚拟内存地址和物理内存地址?

         假设你的计算机是32位,他的地址总线是32位的,也就是他可以寻址0-0xFFFFFFFF(4G)的地址空间,但是如果你的计算机只有256M的物理内存0-0x0FFFFFFF(256M),同时你的进程产生了一个不在这256M地址空间中的地址,那么计算机该怎么处理呢?先说说计算机的内存分页机制?

    计算机会对虚拟内存地址空间(32位为4G)分页产生页(page),对物理内存地址空间分页会产生页帧,这个页和页帧的大小是一样的,所以呢,这里虚拟内存页的个数势必要大于物理内存页帧的个数,在计算机上有一个页表,就是映射虚拟内存页到物理内存页的,更确切地说是页号到页帧号的映射,而且是一对一的映射,但是问题来了,虚拟内存页的个数>物理内存页帧的个数,岂不是有些虚拟内存页的地址永远也没有对应的物理内存地址空间,不是的,操作系统是这样处理的,操作系统有个页面失效功能,操作系统找到一个最少使用的页帧,让它失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了,这就是处理虚拟内存地址到物理内存的步骤

    现在来回答什么是虚拟内存地址和物理内存地址?

         虚拟内存地址由页号和偏移量组成,(页号对应一个页帧),偏移量就是页的大小,即这个页到底能存多少数据。

    例如:有一个虚拟地址,它的页号是4,偏移量是20,那么它的寻址过程是这样的,首先到页表中找到页号4对应的页帧号(假设是8),如果页不在内存中,则用失效机制调入页,否则把页帧号和偏移量传给MMU(CPU的内存管理单元)组成一个物理上真正存在的地址,接着就是访问物理内存中的数据了,总结起来:虚拟内存地址大小是与地址总线位数有关,物理内存地址的大小跟物理内存条的容量有关

    补充一点:线性地址就是虚拟内存地址,表示的是页式内存管理转换前的地址

    逻辑内存:就是段式内存管理转换前的地址

  • 相关阅读:
    EntityFramework 启用迁移 EnableMigrations 报异常 "No context type was found in the assembly"
    JAVA 访问FTP服务器示例(2)
    NuGet Package Manager 更新错误解决办法
    JAVA 访问FTP服务器示例(1)
    RemoteAttribute 的使用问题
    诡异的 javascript 变量
    javascript apply用法
    Babun 中文乱码
    GSM呼叫过程
    转站博客园
  • 原文地址:https://www.cnblogs.com/jijiji/p/4857356.html
Copyright © 2011-2022 走看看