您的位置:首页 > 其它

熬之滴水成石:最想深入了解的内容--windows内核机制(14)

2013-12-01 00:02 267 查看
65--内存管理(3)

在程序中去使用内存还记得吗?在C语言中用malloc和free来创建和释放,也可以用new和delete方法。在分配内存的机制中,都是使用堆这样的数据结构提供动态内存的分配能力,我们编写的应用程序都是在堆中获取到内存,内存管理尽管有多种方式,段式、页式、段页式几种,但算法其实主要就是两类。最为著名的就是用链表来描述的分配和空闲的内存块,在业界被称为空闲链表。进入到这个空闲链表的都是内存块,当接到一个请求,根据这个请求在这个链表中找到合适的,能够提供足够内存空闲块,并从空闲块中分离足够的内存,这些内存就会加入到已分配的内存链表中。当内存被释放掉时,则是把这个内存的大小移到空闲的链表中。所以在链表的处理中,有很多种方法,这些方法就是我们在操作系统课堂上或者在考试中遇到的几种方法:最先匹配法、最佳匹配法等。另一个就是位图标记算法了,其实就是根据要将要使用的内存做好一个标记,以表示它是否空闲。主要的方法就是根据请求所需的内存,确定需要多少单位的内存能够满足,然后在各个单元上找到空闲的单元,相当于扫描一下每个内存单元,当分配给用户时,则打上占用的标记。这个算法的不足之处,每次都需要对整个单元进行扫描,依次每个单元扫描,这种方式并不高效。在算法界,每个算法都会有自己的长处和短处,所以算法与算法的组合就能发挥取长补短的优势。内存的算法也有这种组合,这两个算法合在一起在业界称作slab算法。该种算法在windows系统中运用,但这种算法主要针对小内存,对于大内存时肯定存在空间浪费的地方。

在windows中采取的还是页式管理系统,所对应的地址空间都是线性地址空间。虚拟地址的分配和回收都按照严格的规定进行。所有的内存都是必须申请,操作系统的内部可以根据申请和释放来操作整个虚拟地址的内存分配情况,按需分配,只要当虚拟地址真正使用时才被分配到物理页和页表。虚拟地址是通过平衡二叉树迅速定位,这里面就有许多的替换算法。在windows中有一个页帧号数据库描述了物理内存各个页面的状态。该数据库实际上就是这个结构数组,每个页面对应有一个页帧项目,记录了该页面的使用情况,包括的状态。操作系统还维护了一个链表,分别将相同类型的页面链表连接起来。很多提算算法都是在这样的基础上实现的。windows的工作集管理器会有效的管理这些页面。windows实现全面的工作模型,包括控制进程的工作集,以及替换算法结合的管理方式。那么windows中还有哪些跟内存的管理器相关的,像堆管理器、页面错误异常处理器等。

(未完待续................)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: