[電源を入れる] Linuxの仮想メモリ

https://www.cnblogs.com/dyllove98/archive/2013/06/12/3132940.html

理解第一層

1.各プロセスは、独自の別個の4Gのメモリ空間を有し、各プロセスのメモリ空間は、同様の構造を有しています

2.新しいプロセスが作成されると、それは独自のメモリ空間を確立する、などのデータ、コード、このプロセスは独自のプロセス空間にディスクからコピーされ、どのようなデータ場合は、テーブル内のプロセス制御task_structレコードによって、task_struct書き込むことができる読み出したデータをアドレスメモリ空間の割り当て、アドレスデータなしに記録リストに記録し、このリストを記録することができます

3.各プロセスが割り当てられたメモリ空間は、対応するディスク空間にマッピングされています


 

問題:

もちろんそんなにいないコンピュータメモリ(n個のプロセスが4Gを必要とし、N *なる場合)メモリ

この場合にはプログラムに対応する複数のプロセスのためのメモリに対応した処理をするために、ディスク上のプログラムファイルをコピーするプロセスを確立し、メモリが無駄になります!

理解第二層

プロセスの仮想メモリ空​​間ごとに1 4Gのメモリ空間だけで、毎回アドレス・アクセス・メモリ空間は、我々は対処する必要があり、実際の物理メモリアドレスに変換されます

2.すべてのプロセスは、各プロセスが唯一の物理メモリにマップされ、保存されている自分の仮想メモリ空​​間を提示する必要があり、同じ物理メモリを共有しています。

3.プロセスが物理メモリ内のデータのメモリアドレスを知っている、物理メモリ内に他にどこ、されていない、ページテーブルは、記録する必要があります

二つの部分4ページテーブルの各テーブルエントリは、このページの最初の部分が物理メモリに記録され、記録ページの第二の部分の物理メモリアドレス(もしあれば)

5.プロセスが仮想アドレスにアクセスし、対応するデータが物理メモリに見つからない場合は落丁異常、ページテーブルを参照してください

6.データページフォルト例外処理プロセスは、プロセスがメモリがいっぱいになっている場合は、ページがカバーされていた場合は、その後、もちろん、表紙を見つけ、空の場所が存在しない、物理メモリにディスクからのコピーを要求することです変更され、このページをディスクに書き戻す必要

 

要約:

利点:

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

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

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

 

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

 

补充理解:

虚拟存储器涉及三个概念: 虚拟存储空间,磁盘空间,内存空间


可以认为虚拟空间都被映射到了磁盘空间中,(事实上也是按需要映射到磁盘空间上,通过mmap),并且由页表记录映射位置,当访问到某个地址的时候,通过页表中的有效位,可以得知此数据是否在内存中,如果不是,则通过缺页异常,将磁盘对应的数据拷贝到内存中,如果没有空闲内存,则选择牺牲页面,替换其他页面。

 

mmap是用来建立从虚拟空间到磁盘空间的映射的,可以将一个虚拟空间地址映射到一个磁盘文件上,当不设置这个地址时,则由系统自动设置,函数返回对应的内存地址(虚拟地址),当访问这个地址的时候,就需要把磁盘上的内容拷贝到内存了,然后就可以读或者写,最后通过manmap可以将内存上的数据换回到磁盘,也就是解除虚拟空间和内存空间的映射,这也是一种读写磁盘文件的方法,也是一种进程共享数据的方法 共享内存

おすすめ

転載: www.cnblogs.com/qxxnxxFight/p/11127740.html