Windows下的内存是如何管理的?

来源:互联网 发布:php判断3个数字大小 编辑:程序博客网 时间:2024/04/26 06:13

参考资料:
http://blog.csdn.net/Jackyliujin/article/details/7592531
http://blog.chinaunix.net/uid-26983585-id-3364091.html

(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)虚拟内存地址由页号(与页表中的页号关联)和偏移量组成。

0 0
原创粉丝点击