(1)有三种要领:虚拟内存,内存映射文件,内存仓库。
虚拟内存是将页文件加载到内存,适用于对照大的东西或布局;
内存映射文件是将磁盘上文件加载到内存,适用于大文件和单机的进程间内存共享;
仓库就是动态的分配内存,适用于小东西的创建。
这些在windows核心编程中都描述得很详细的。
(2)当进程要读本身的虚拟地点空间中的数据时:
if(数据在物理内存中)
{
虚拟地点转换成物理地点
读数据
}
else
{
if(数据在磁盘中)
{
if(物理内存还有空闲)
{
把数据从磁盘中读到物理内存
虚拟地点转换成物理地点
读数据
}
else
{
把物理内存中某页的数据存入磁盘
把要读的数据从磁盘读到该页的物理内存中
虚拟地点转换成物理地点
读数据
}
}
else
{
报错
}
}
(3)当措施运行时需要从内存中读出这段措施的代码。
代码的位置必需在物理内存中才华被运行,由于此刻的操纵系统中有非常多的措施运行着,内存中不能够完全放下,所以引出了虚拟内存的观点。把哪些不常用的措施片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存打点所要做的事。内存打点还有此外一件事需要做:计算措施片段在主存中的物理位置,以便CPU调理。
内存打点有块式打点,页式打点,锻式和锻页式打点。此刻常用事锻页式打点 块式打点:把主存分为一大块、一大块的,当所需的措施片断不在主存时就分配一块主存空间,,把程 序片断load入主存,就算所需的措施片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于打点。
页式打点:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种要领的空间操作率要比块式打点高很多。
段式打点:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种要领在空间操作率上又比页式打点高很多,但是也有此外一个错误谬误。一个措施片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地点上(计算机最耗时间的大家都知道是I/O吧)。
锻页式打点:结合了段式打点和页式打点的长处。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。
各类内存打点都有它本身的要领来计算出措施片断在主存中的物理地点,其实都很相似。
虚拟内存:1)对计算机而言,物理内存的巨细即主板上插着的内存条的巨细;对CPU而言,的物理内存的巨细即CPU上地点线可寻址的巨细。
2)虚拟内存即某个措施运行时所创建的数据区,它的巨细可能大于物理内存,它是一种内存打点上的抽象。
3)由于虚拟内存很可能大于物理内存,所以操纵系统使用一种内存分页机制,将虚拟内存分成多个页(page),将物理内存分成多个页帧(page frame),页和页帧的巨细不异。现使用的虚拟内存页将会通过页表(page table)映射到物理内存页帧上,显然实时映射的范畴最大只能是物理内存的巨细范畴。如果现需使用的某个虚拟内存页没有处于这个映射傍边,则操纵系统使某个使用较少的页帧掉效,并将该页帧的内容存入其他媒介傍边(好比磁盘),然后在该页帧的物理内存和需要空间的虚拟内存页映射起来。
4)虚拟内存地点由页号(与页表中的页号关联)和偏移量构成。
转发: windows如何打点内存