内存是计算机里面一个非常重要的部分,RAM的大小对于一个机器来说就像血管对于人类的作用。光有一个强健的CPU(心脏),而没有畅通的内存(血管)一样会出现各种问题。
从我认识内存这个东西的作用开始,都停留在非常肤浅的层次,比如说内存越大速度越快等等。直到了解它叫RAM,知道了它属于随机存储器断电就会丢数据。最近在看c++的效率的书,发现了这个,了解一些windows的内存机制,特此笔记
1、win32虚拟内存管理器为每一个win32进程提供进程私有的且基于页的4GB(32位)大小的线性虚拟地址空间(其实就是一个地址)
其中”进程私有”指的是每个进程只能访问属于自己的地址空间,而无法访问其他进程的地址空间;”基于页”指的是虚拟地址空间被划分为多个成为页的单元,每一个页的大小由底层的处理器决定,页是数据流的最小单位;”4GB”意味着进程中的地址的取值范围可以从0×00000000到0xFFFFFFFF,低区2GB给进程使用,其他的给系统使用。
2、访问不在内存中的东西(主要指代码或者数据)会出现”缺页”错误,不过一般写程序不用考虑这个错误,因为系统会自动处理这个错误(比如说从硬盘IO加载要访问的代码和数据)
3、分配内存时有两个步骤”预留”和”提交”。而地址空间有三种状态”free”"reserved”"committed”:第一个表示地址没有被使用,第二个表示空间已经被预留,但是没有分配物理内存,不能访问;第三个表示从调页文件中开辟磁盘空间,直到有访问才会开辟物理内存。
4、win32中通过一个两层表结构实现地址的映射:第一层”页目录”(PDE)有4KB大小,第二层”页表”(PTE),页表中每一项都指向物理内存中的一个页帧。
4GB的地址空间,每一个虚拟地址都是一个32位的整数,在使用时前10位左移两位用于定位PDE中的项,中间10位左移两位在PDE定位页表中定位某一项,最后12位直接定位物理页面中的特定字节位置。
5、win32系统为每个进程定义一个最大和一个最小的工作空间,超过这个空间,系统会自动利用算法将一些内存页置换到虚拟内存里
如何提高程序在内存上的效率呢?简单说就是写紧凑的代码,紧凑的数据!按我自己的理解,紧凑的代码有利于同一内存页里面有尽可能多的代码,而紧凑的数据也是这个道理。
(未完待续= =||貌似没人看)
评论