精华内容
下载资源
问答
  • 本文将从单个进程能申请到的最大虚拟内存空间开始深入探讨Linux操作系统虚拟内存和物理内存的关系。 环境: 虚拟机:VMware12、2G 内存、2G 交换区。 操作系统:LinuxUbuntu16 x64 编译器:gcc CPU:Intel core...

    原文链接:深入探讨操作系统的内存管理——虚拟内存与物理内存

     原文博客:TOMORROW星辰

     

    本文将从单个进程能申请到的最大虚拟内存空间开始深入探讨Linux操作系统虚拟内存和物理内存的关系。

    环境:

    虚拟机:VMware12、2G 内存、2G 交换区。

    操作系统Linux Ubuntu16 x64 

    编译器:gcc 

    CPU:Intel core i5 x64

     

    为了高效、准确测试出该系统下,单个进程能够申请到的最大虚存空间,所以编写了一个Linux的测试程序。因为 64 位真的是个很可怕的数字,所以程序在申请内存空间时,先申请较大的内存块(100G),直到没有这么大的内存块,然后申请上次能申请到的内存块的一半。重复以上步骤,直到内存块变得足够小(小于 100Byte)。然后结束申请内存。代码如下:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include<malloc.h>
    #define SZ_100G (50*2147483648)  //100GB的字节数
     
    int main()
    {
        int *p[1000000];//存放申请内存块的指针以备释放
        int *ptem;
        long long int block_sz,total_sz=0;
        int i,j;
        char c='c';
     
        printf("pid=%d\n",getpid());
        getchar();
     
        block_sz=SZ_100G;
        for(i=0;;i++)
        {
            printf("i=%d\n",i);
            p[i]=(int *)malloc(block_sz*sizeof(char));
            if(NULL==p[i])//当所申请的内存块不成功时,把内存块大小减半重新申请
            {
                block_sz=block_sz/2;
                p[i]=(int *)malloc(block_sz*sizeof(char));
            }
            total_sz=total_sz+block_sz;//累加所申请到的内存块
     
            if(block_sz<100)//当内存块小于100个字节时结束内存申请
                break;
        }
        getchar();
     
        ptem=p[0];
        for(j=0;;j++)
        {
            if(0==j%1000)
                c=getchar();
            if('e'==c)
                break;
     
            *(ptem+=(2*1024*1024))=c;
        }
     
        for(;i>=0;i--)//释放所有内存块
            free(p[i]);
     
        printf("total_sz=%ldByte\n",total_sz);
         
     
        return 0;
    }

    在终端1编译运行上面代码。
    运行后,先在另一个终端(终端2)执行:

    1
    cat /proc/6674/status

    查看该进程的status文件如下图图一所示:

       终端1         终端2    /wp-content/uploads/image/20170607/1496843263477473.png

    图一

    对于status文件,本文只会关注以下几个参数:

    VmPeak(进程所占用的虚存空间最大值)

    VmRSS(进程正在占用物理内存大小)

    VmSwap(进程占用交换区大小)

     

    然后回车开始申请内存,当终端停止输出数字时,再次在终端2执行:

    1
    cat /proc/6674/status

    得到下图图二输出:

       终端1         终端2    /wp-content/uploads/image/20170607/1496844165633879.png

    图二

    对比图一和图二中的VmPeak:

    137438953320K – 12044K = 140737475866624 Byte 

    = 111 1111 1111 1111 1111 1111 0100 0001 0111 0000 0000 0000(B) Byte

    是的,如果你没有眼花,你数到上面得到的是一个47位!!!!二进制数。

    47位什么概念?大概是128TB = 128*1024GB  !!! (试问现在谁的个人电脑有这么大的硬盘??更不要说内存)

    一个进程能够申请到这么恐怖的内存空间?这不但超过了物理内存、超过了物理内存+交换区、还超过了硬盘大小啊。这不科学啊。

    但是从status读出来的数据错不了的。

     

    首先,虚拟内存,顾名思义,虚拟的、并不是事实上存在,在一个进程的虚存空间里,只存在进程自己和系统内核,而不存在其他进程。这是为了方便编程和提高物理内存利用率而创造出来的一种机制(在过去内存是很贵的)。虚拟内存中对应着的是逻辑地址,逻辑地址通过操作系统和硬件的配合映射到物理内存上。(这里就不在多说虚拟内存的定义。如果把段页式内存管理机制理解后,虚拟内存也就理解了。关于段页式内存管理介绍可参考本博客稍后发的文章。)

     

    其二,交换区,实际上就是物理内存不够用时,虚存空间的数据就必须映射到交换区上。

    那么单个进程所能申请的最大虚存空间理应不会超过物理内存和交换区的和。然而实际却是超过那么多。

    然后,网上查阅相关资料,msdn上看到了相关解释。

    传送门:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/virtual-address-spaces

    该文章介绍到,Windows 32系统下,虚拟内存中,用户空间占用了低地址2G的空间,系统内核占用了高地址2G空间。总共虚存空间就是2^32Byte。

    /wp-content/uploads/image/20170607/1496846482794723.png

    图三

     

    那么64位系统中,就系统而言,总共的虚存空间应当是2^64Byte?

    在该文章下面还有Windows 64位系统的虚存空间介绍,如下图图四所示。从图中看到用户虚存空间8TB+系统空间248TB=256TB=2^48 Byte ,这个数字似乎和上面所测得的单个进程能够申请到的最大虚存空间的数字有点接近了。

    /wp-content/uploads/image/20170607/1496846835143459.png

    图四

    注意看图四,还可以发现64位系统中还有很大很大的虚存空间保留没有被使用的。从这个出发继续查阅资料,然后找到了关于目前64位CPU的相关说明。由于目前还远远用不到64位那么大的空间,所以AMD 64位CPU目前只用了48位的寻址。而Intel的64位CPU是和AMD交叉授权,所以Intel 64CPU也同样只采用48位寻址。所以图三的保留空间就得到了解释。

     

    再回到原先的问题,现在知道了就64位系统而言,虚拟内存空间是可以达到2^48Byte那么大的,参考Windows 64位系统虚存空间结构,可以猜测Linux 64位系统下,用户虚存空间和系统内核虚存空间分布和Windows是相似的,只是两者大小比例有所差别。(因为找了很久,没有找到Linux的官方文档说明,只找到很旧的、32位。所以不能提供准确的参考,如果有读者找到,希望可以告诉作者一下补上)。

     

    不过,到现在,还有问题没有解决,为什么所申请的虚存空间会比物理内存与交换区的和大?

    现在回到一开始没有运行完的程序,在终端1回车继续运行程序,程序接着会对所申请到的第一个100G内存块每隔2M空间进行写操作,每回车一次,会写1000次。回车几次后,在终端2再执行:

    1
    cat /proc/6674/status

    得到下图图五:/wp-content/uploads/image/20170607/1496848683863713.png

    图五

    由图五可以看到正在使用的物理内存VmRSS变小了,正在使用的交换区空间VmSwap迅速增大。但是两者之和是在一直增加的,这就说明,申请到的虚拟内存在未被使用之前,它只是一个数字,并没有实际的物理内存和交换区与之相对应。当对虚存进行写操作时,系统就会逐步分配物理内存,而物理内存的数据又会可能被系统调到交换区。现在问题逐渐明了了。

    如果我不停地对虚存空间进行写操作会怎样,为了解决疑惑,在终端1不停回车,偶尔在终端2中查看status文件中的状态,写到一定程度后,终端1出现了

    1
    [1]    7893 killed     ./a.out

    如图六所示:

    /wp-content/uploads/image/20170607/1496849593717247.png

    图六

    在进程结束之前查看到的status文件显示VmRSS+VmSwap约等1.8G,加上系统占用和其他进程占用,那么说此时物理内存和交换区已经接近极限了。再继续运行写的时候,操作系统为了系统的正常运行选择把这个进程杀死了。那么所有的疑问也解决了。

    系统所允许的申请的虚存空间是可以超过物理内存与交换区的和的。但是当进程所占用的物理内存加上交换区影响到了系统的正常运行就会被系统杀死。

     

    最后,希望这篇文章能够帮到一些正在学习操作系统或者内存管理相关知识的朋友。

    如果有错误,还望不吝指正。

     

    原文链接:深入探讨操作系统的内存管理——虚拟内存与物理内存

     原文博客:TOMORROW星辰

     

    转载于:https://www.cnblogs.com/second-tomorrow/p/8025773.html

    展开全文
  • 虚拟内存和物理内存的区别和联系 在计算机的远古时代其实还没有虚存机制,程序指令所访问的内存地址就是物理内存地址. 也就是不得不把程序的全部装进内存当中,然后运行 . . 首先我们知道的物理内存其实...

    虚拟内存和物理内存的区别和联系





    在计算机的远古时代其实还没有虚存机制,程序指令所访问的内存地址就是物理内存地址. 也就是不得不把程序的全部装进内存当中,

    然后运行. 首先我们知道的物理内存其实就是插在计算机主板内存槽上的实际物理内存,CPU可以直接进行寻址. 物理内存的容量是固

    定的,但是寻址空间却取cpu地址线条数,如32位机,则寻址空间为2^32 = 4G.所以最大支持4G的寻址空间.即使我们插入了16G的

    内存条,我们也只是拥有4G内存.我们其实发现无论好多事物只要是一个一成不变的就会慢慢的出现各种问题,然后就得找到它的解决

    方法.这不物理内存也出现问题了.现在假设没有虚存机制,我们要运行一个程序,就不得不把程序的全部装入内存当中,然后运行.

    这个时候就会出现问题.

    1.现在有多个程序需要运行,但是内存空间不足了,就需要将其他程序暂时拷贝到硬盘当中,然后将新的程序装入

    内存运行.由于大量的数据装入装出,内存的使用效率会十分Low.微笑

    2.由于程序都是直接访问物理内存的,所以一个进程可以修改其他进程的内存数据,甚至修改内核地址空间中的数据微笑

    3.因为内存地址是随机分配的,所以程序运行的地址也是不正确的.微笑

    我们可以看出来,"微笑三连"的无奈了吧. 这就是早期没有虚存机制的无奈.但是我们怎么会被困难打倒所以前辈们经过不懈努力找到

    了虚拟内存这骚操作了.那么何为虚拟内存呢? ??


    进程创建加载的时候,自身感知获得了一个连续的内存地址空间,而实际上内核只是分配了一个逻辑上的虚拟内存空间,并且对虚拟

    内存和磁盘通过mmap做映射关系,对虚拟内存和物理内存的映射关系; 等到程序真正运行的时候,需要某些数据,并且不在虚拟内

    存中,才会触发缺页异常,进行数据拷贝.说白了虚拟内存就是磁盘上面的一片空间. 上面的解释比较官方,我再说的接地气一点, 

    内核会将暂时不用的内存块信息写到磁盘当中,这样一来,物理内存得到了释放,这块内存可以用于其他目的,当需要用到原始内容

    的时候,这些信息会被重新从磁盘当中读取到物理内存当中.

    对于32位系统,寻址指针为4字节,对应的虚拟地址空间为0 ~ 2^32,既0-4G

    对于64位系统,寻址指针为8字节,对应的虚拟地址空间为0 ~ 2^64,既0-16G


    Linux下虚拟内存的结构图:





    以32位机为例,我们上图看到的进程虚拟存储器占用3G虚拟内存空间,内核虚拟存储器占用1G的虚拟内存空间. 在缓存原理当中,换入

    /换出是以块为最小单位.在内存管理时,页是地址空间的最小单位. 虚拟地址空间划分为多个固定大小的虚拟页(vp),物理地址空间

    (DRAM)内存划分为多个固定大小的物理页(pp).虚拟页和物理页的大小是一样的,通常为4KB. 那么接下啦重点来啦!! 虚拟内存的运行

    原理是什么????? 我借用一下我以前写共享

    内存当中博客上面的图,当中你还顺便可以看看进程间通信方式中共享内存的样子.



    我们看到我们所拿到的虚拟内存,通过页表让虚拟地址映射到物理地址上面,那么这个页表到底是一个何方神圣呢???


    页表的基本概念




    页表是一种数组结构,存放着各个虚拟页的状态,是否映射,是否缓存. 进程要知道那些内存地址上的数据在物理内存上,那些不在

    ,还有物理内存上的哪里需要用页表来记录. 页表的每一个表项分为两部分,第一部分记录此页是否在物理内存上,第二部分记录物

    理内存页的地址(如果在的话)当进程访问某个虚拟地址,去查看页表的时候如果发现对应的数据不在物理内存中,则发生缺页异常.

    但是我们马上就要使用这个数据啊.所以我们需要尽快解决掉缺页异常. 

    缺页异常的处理过程:就是把进程需要的数据从磁盘上面拷贝到物理内存中,如果物理内存已经满了,没有空地方了,那就找一个页覆

    盖,当然如果被覆盖的页曾经被修改过,需先将此页写回磁盘.

    页表的状态>>

    如果页表的有效位置为1,那么说明虚拟地址存储的内容存储在物理页当中.

    如果页表的有效位置为0,那么说明虚拟存储的内容没有存储在物理页中, 发生了缺页异常,需要调用处理掉缺页异常.


    虚拟地址的工作原理




    首先我们来看看页表的工作原理,如果我们懂了页表的工作原理那么整个映射过程也就明白了.




    好,那我们开始分析它的过程:

    1)我们的cpu想访问虚拟地址所在的虚拟页(VP3),根据页表,找出页表中第三条的值.判断有效位. 如果有效位为1,DRMA缓存命中

    ,根据物理页号,到物理页当中的内容,返回.

    2)若有效位为0,参数缺页异常,调用内核缺页异常处理程序.内核会选择一个物理页作为牺牲页,将该页的内容刷新到磁盘空

    间当中.然后把VP3映的磁盘文件缓存到该物理页上面.然后页表中第三条,有效位变成1,第二部分存储上了可以对应物理内

    存页的地址的内容.

    3)缺页异常处理完毕后,返回中断前的指令,重新执行,此时缓存命中,执行1.

    4)将找到的内容映射到告诉缓存当中,CPU从告诉缓存中获取该值.结束.


    Linxu中虚拟内存的机制




    Linux把虚拟内存划分成区域area的集合,一个area包括连续的多个页.

    area的数据结构如下所示:

    1)内核为每个进程维护了一个单独的任务结果 task_struct.

    2)task_struct当中的 struct mm_struct *mm指针,指向了mm_strcut.该结构描述虚拟内存的运行状态.

    3)mm_strcut的pgd指针指向进程的一级页面的基地址. mmap指针,指向vm_area_struct链表.

    4)vm_area_struct描述area的结构,vm_start表示area的开始位置,vm_end表示area的结束位置. vm_port表示area内的读写

    权限,vm_flags表示area内的页面是进程私有还是共享的,vm_next指向的是下一个area节点.




    总结




    1.既然每一个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最

    终实际的内存地址,这里有独立内存空间的好处.

    2.当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同进程只需要把自己的虚拟

    内存映射过去就可以了,节省内存.

    3.在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用内

    存碎片.

    4.使用页面调度算法,不会造成大量的数据装进装出,提高了内存的效率.


    事实上在每个进程创建加载时,内核只是为进程"创建"了虚拟内存的布局,具体就是初始化进程控制表中相关的链表,实际上并不是

    立即就把虚拟内存对应位置的程序数据和代码拷贝给物理内存,只是建立好虚拟内存和磁盘空间之间的映射就好(存储器映射),等到

    运行到对应的程序时,才会通过缺页异常来拷贝数据.还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存

    ,既为这块虚拟内存对应的页表项做相应的设置,当进程真正访问到此数据的时候,才会发生缺页异常.
    展开全文
  • 物理内存的容量是固定的,但是寻址空间却取决于cpu地址线条数,如32位机,则寻址空间为2^32 = 4G.所以最大支持4G的寻址空间.即使我们插入了16G的内存条,我们也只是拥有4G内存.我们其实发现无论好多事物只要是...

    1. 虚拟内存的发展由来

            在计算机的远古时代其实还没有虚拟内存机制,程序指令所访问的内存地址就是物理内存地址. 也就是不得不把程序的全部装进内存当中,然后运行 。

            首先我们知道的物理内存其实就是插在计算机主板内存槽上的实际物理内存,CPU可以直接进行寻址. 物理内存的容量是固定的,但是寻址空间却取决于cpu地址线条数,如32位机,则寻址空间为2^32 = 4G.所以最大支持4G的寻址空间.即使我们插入了16G的内存条,我们也只是拥有4G内存.我们其实发现无论好多事物只要是一个一成不变的就会慢慢的出现各种问题,然后就得找到它的解决方法.这不物理内存也出现问题了.现在假设没有虚存机制,我们要运行一个程序,就不得不把程序的全部装入内存当中,然后运行.这个时候就会出现以下问题:

    • 现在有多个程序需要运行,但是内存空间不足了,就需要将其他程序暂时拷贝到硬盘当中,然后将新的程序装入内存运行.由于大量的数据装入装出,内存的使用效率会十分Low.
    • 由于程序都是直接访问物理内存的,所以一个进程可以修改其他进程的内存数据,甚至修改内核地址空间中的数据
    • 因为内存地址是随机分配的,所以程序运行的地址也是不正确的.

            我们可以看出来,这就是早期没有虚存机制的无奈.所以前辈们经过不懈努力找到了虚拟内存机制。

    • 进程创建加载的时候,自身感知获得了一个连续的内存地址空间,而实际上内核只是分配了一个逻辑上的虚拟内存空间,并且对虚拟内存和磁盘通过mmap做映射关系,对虚拟内存和物理内存的映射关系; 等到程序真正运行的时候,需要某些数据,并且不在虚拟内存中,才会触发缺页异常,进行数据拷贝.说白了虚拟内存就是磁盘上面的一片空间. 上面的解释比较官方,我再说的接地气一点, 内核会将暂时不用的内存块信息写到磁盘当中,这样一来,物理内存得到了释放,这块内存可以用于其他目的,当需要用到原始内容的时候,这些信息会被重新从磁盘当中读取到物理内存当中.
    • 对于32位系统,寻址指针为4字节,对应的虚拟地址空间为0 ~ 2^32,即0-4G。对于64位系统,寻址指针为8字节,对应的虚拟地址空间为0 ~ 2^64。

    2. 虚拟内存

            Linux下虚拟内存的结构图:

            以32位机为例,我们上图看到的进程虚拟存储器占用3G虚拟内存空间,内核虚拟存储器占用1G的虚拟内存空间. 在缓存原理当中,换入/换出是以块为最小单位.在内存管理时,页是地址空间的最小单位. 虚拟地址空间划分为多个固定大小的虚拟页(vp),物理地址空间(DRAM)内存划分为多个固定大小的物理页(pp).虚拟页和物理页的大小是一样的,通常为4KB. 虚拟内存的运行原理是什么? 如下图:

            用户所拿到的虚拟内存,通过页表让虚拟地址映射到物理地址上面,那么这个页表到底是什么?

    • 页表的基本概念

            页表是一种数组结构,存放着各个虚拟页的状态,是否映射,是否缓存. 进程要知道哪些内存地址上的数据在物理内存上,哪些不在,还有在物理内存上的哪里需要用页表来记录. 页表的每一个表项分为两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址(如果在的话)

            当进程访问某个虚拟地址,去查看页表的时候如果发现对应的数据不在物理内存中,则发生缺页异常.但是我们马上就要使用这个数据啊.所以我们需要尽快解决掉缺页异常. 

    缺页异常的处理过程:就是把进程需要的数据从磁盘上面拷贝到物理内存中,如果物理内存已经满了,没有空地方了,那就找一个页覆盖,当然如果被覆盖的页曾经被修改过,需先将此页写回磁盘.

    • 页表的状态

    如果页表的有效位置为1,那么说明虚拟地址存储的内容存储在物理页当中.

    如果页表的有效位置为0,那么说明虚拟存储的内容没有存储在物理页中, 发生了缺页异常,需要调用处理掉缺页异常.

    3. 虚拟地址的工作原理

    3.1 页表的工作原理

    • 我们的cpu想访问虚拟地址所在的虚拟页(VP3),根据页表,找出页表中第三条的值.判断有效位. 如果有效位为1,DRMA缓存命中,根据物理页号,找到物理页当中的内容,返回.
    • 若有效位为0,参数缺页异常,调用内核缺页异常处理程序.内核会选择一个物理页作为牺牲页,将该页的内容刷新到磁盘空间当中.然后把VP3映射的磁盘文件缓存到该物理页上面.然后页表中第三条,有效位变成1,第二部分存储上可以对应物理内存页的地址的内容.
    •  缺页异常处理完毕后,返回中断前的指令,重新执行,此时缓存命中,执行1.
    • 将找到的内容映射到高速缓存当中,CPU从高速缓存中获取该值.结束.

     

    3.2 linux虚拟内存的机制

            Linux把虚拟内存划分成区域area的集合,一个area包括连续的多个页. area的数据结构如上图所示:

    •  内核为每个进程维护了一个单独的任务结果 task_struct.
    • task_struct当中的 struct mm_struct *mm指针,指向了mm_strcut.该结构描述虚拟内存的运行状态.
    • mm_strcut结构体中的pgd指针指向进程的一级页面的基地址. mmap指针,指向vm_area_struct链表.
    • vm_area_struct描述area的结构,vm_start表示area的开始位置,vm_end表示area的结束位置. vm_port表示area内的读写权限,vm_flags表示area内的页面是进程私有还是共享的,vm_next指向的是下一个area节点.

     

    4. 总结

    • 既然每一个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处.
    • 当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同进程只需要把自己的虚拟内存映射过去就可以了,节省内存.
    • 在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用内存碎片.
    • 使用页面调度算法,不会造成大量的数据装进装出,提高了内存的效率.

            事实上在每个进程创建加载时,内核只是为进程"创建"了虚拟内存的布局,具体就是初始化进程控制表中相关的链表,实际上并不是立即就把虚拟内存对应位置的程序数据和代码拷贝给物理内存,只是建立好虚拟内存和磁盘空间之间的映射(存储器映射),等到运行到对应的程序时,才会通过缺页异常来拷贝数据.还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,既为这块虚拟内存对应的页表项做相应的设置,当进程真正访问到此数据的时候,才会发生缺页异常.

    展开全文
  • 概念: 物理内存:真实内存条,CPU...Linux会在物理内存不足时,使用虚拟内存,内核会把暂时不用内存块信息写到虚拟内存,这样物理内存就得到了释放,这块儿内存就可以用于其他目的,而需要用到这些内容时候...

    概念:

    物理内存:真实的内存条,CPU可以直接寻址的内存空间。

    虚拟内存:利用磁盘空间虚拟出一块逻辑内存。

    区别:

    Linux会在物理内存不足时,使用虚拟内存,内核会把暂时不用的内存块信息写到虚拟内存,这样物理内存就得到了释放,这块儿内存就可以用于其他目的,而需要用到这些内容的时候,这些信息就会被重新从虚拟内存读入物理内存。

    内存分页机制:

    计算机对虚拟内存地址空间(32位为4G)进行分页----产生页(page),对物理内存地址空间(假设2G)进行分页----产生页帧(page frame),页和页帧的大小相同,所以,虚拟内存页的个数势必要大于物理内存页帧的个数。

    在计算机上有一个页表(page table),就是映射虚拟内存页到物理内存页的,更确切的说是页号到页帧号的映射,而且是一对一的映射。

    但是虚拟内存页的个数 > 物理内存页帧的个数,岂不是有些虚拟内存页的地址永远没有对应的物理内存地址空间?不是的,操作系统是这样处理的。操作系统有个页面失效(page fault)功能。操作系统找到一个最少使用的页帧,让他失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了。

    虚拟内存地址和物理内存地址:

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

    转载于:https://my.oschina.net/wuminghai/blog/803224

    展开全文
  • windows任务管理器中“性能”栏下各名词含义的简要说明任务管理器中“性能”各图表主要反映的是系统CPU和内存的使用,通过这些参数对有助于了解系统运行状况,并有可能进一步改善系统性能。因为各名词比较专业,如果...
  • 虚拟内存和物理内存区别

    千次阅读 2016-10-12 23:28:51
    物理内存就是实际的内存,在CPU中指的是寻址空间的大小,比如8086只有20根地址线,那么它的寻址空间就是1MB,我们就说8086能支持1MB的物理内存,及时我们...为什么会有虚拟内存和物理内存区别呢? 因为物理内存的
  • 操作系统有虚拟内存物理内存的概念。在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且...
  • 物理内存1、应用中概念物理内存,在应用中,自然是顾名思义,物理上,真实插在板子上内存是多大就是多大了。看机器配置时候,看就是这个物理内存。2、CPU中概念物理内存,CPU地址线可以直接进行寻址...
  • 先说说为什么会有虚拟内存和物理内存的区别。正在运行的一个进程,他所需的内存是有可能大于内存条容量之和的,比如你的内存条是256M,你的程序却要创建一个2G的数据区,那么不是所有数据都能一起加载到内存(物理...
  • 操作系统中有虚拟内存物理内存的概念。 首先理解一下什么叫物理内存?什么叫虚拟内存? 物理内存是指由于安装内存条而获得的临时储存空间。主要作用是在计算机运行时为操作系统各种程序提供临时储存。常见的...
  • 内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件...
  • 先说说为什么会有虚拟内存和物理内存的区别。正在运行的一个进程,他所需的内存是有可能大于内存条容量之和的,比如你的内存条是256M,你的程序却要创建一个2G的数据区,那么不是所有数据都能一起加载到内存(物理...
  • 虚拟内存(硬盘):虚拟的不是物理内存,而是代替物理内存行使存储的功能,物理内存的运行程序的功能是无法用虚拟内存来完成 物理内存与虚拟内存的关系:当运行程序过多,物理内存不够用时,系统会将一部分硬盘空间...
  • 虚拟内存和物理内存的联系和区别 对于32位的机器,每个进程都认为自己有4G的内存空间,但是实际上虚拟内存对于的物理内存可能只有一点。 进程得到的4G的虚拟内存是连续的地址空间,但是实际上,它是被分割成多个物理...
  • 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES...
  • 物理内存和虚拟内存

    2014-10-30 10:47:54
    物理内存和虚拟内存区别: 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存...
  • 在Win32中看 堆,虚拟内存,内存映射文件,执行文件,页文件 物理内存 的区别 物理地址 物理内存(RAM)中的地址是物理地址,物理内存容量也就相当于内存条的容量。 线性地址 线性地址也就是虚拟地址。 由于...
  • 【Why】物理内存虚拟内存区别与联系 2016年08月18日 16:20:51 jobbible 阅读数:4858 版权声明:公众号:程序员面试经验分享 https://blog.csdn.net/moshenglv/article/details/52242153 前一段时间在面试...
  • 为什么会有虚拟内存和物理内存的区别? 正在运行的一个程序,它所需的内存是有可能大于内存条容量之和的,比如你的内存条是1G,但是你的程序需要2G的数据区,那么不是所有数据都能一起加载到内存(物理内存)中,...
  • 为什么会有虚拟内存和物理内存的区别?  正在运行的一个程序,它所需的内存是有可能大于内存条容量之和的,比如你的内存条是1G,但是你的程序需要2G的数据区,那么不是所有数据都能一起加载到内存(物理内存)中,...
  • 前一段时间在面试总监时候,总监问了我这样一个问题:你个我说说物理内存和虚拟内存到底是怎么一回事?其实之前我看过这个问题,据我理解,当时是这么回答“进程在运行时候,操作系统都为其分配一个4GB...
  • 一、前言 最近做数据库插入性能测试,对于top命令监控有一些疑问,查了资料后记录一下。... 首先需要强调虚拟内存不同于物理内存,虽然两者都包含内存字眼但是它们属于两个不同层面概念。进程占用虚...
  • 虚拟地址和虚拟内存区别

    千次阅读 2014-06-20 20:48:37
     ...通过虚拟地址访问内存的形式称为保护模式,因为它不允许直接访问内核空间,而对应的直接访问物理内存的方式称为实模式,现在已经很少使用。  比如 mov eax,004227b8h ,这是把地址00422

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 694
精华内容 277
关键字:

虚拟内存和物理内存的区别