- 论坛徽章:
- 0
|
原帖由 Alligator27 于 2006-3-30 22:08 发表
1 如果把page directory看成一个array, 它的index是page number, 它的element是该page的管理信息(meta data). 如果用户程序的内存申请size远大于pagesize, 象LZ的测试程序是1MB的内存块, 那么page directory是sparse array. 所以我说有点浪费.
1、page目录中的条目和malloc管理的page之间有一一对应的关系,这和用户申请内存的大小是无关的。每个页面都要在这儿登个记,因此应该没有“稀疏”的问题。你的意思是不是说如果用户申请的内存是1M,相当于256个page,于是就需要256个page目录条目,而你认为其实只要找一个地方记录就可以了?我觉得这里还是要明确一下page目录的作用,它并不是用来记录所有分配给用户的内存的头指针的,它仅仅是用来记录malloc自身管理的每一个page的。你这次虽然是把256个页面作为一个整体交给了用户,但在用户将其释放之后,它们仍然处于malloc的管理之下,身份就变成了256个独立的空闲page。malloc就可以用它们来满足用户未来的各种分配需求,而且只要它们能满足,malloc就没有必要再去调用brk向系统要内存。基于上述意义,每一个page目录的条目都是“有用的”,因此不会有“稀疏”的问题。
原帖由 Alligator27 于 2006-3-30 22:08 发表
2 malloc不考虑mmap是不行的. 特别象FreeBSD, default heap的顶被mmap area固定了. 当brk到这个顶的时候, 用户不能再得到内存, 但mmap area还有很多空间. 这不是米饭/馒头的选择, 会饿死的. 换句话说, 不管kernel把mmap起始地址放哪儿, malloc都应当分配出~3GB给用户程序.
2、我觉得米饭馒头的比喻能够很好的说明这个问题。有的系统只管让顾客闭着眼睛吃饱,至于给你吃的是什么你别管。而有的系统则希望让顾客自己来选择,如果把米饭吃完了还没吃饱的话,要么你就把米饭多做一点,要么你就再吃两个馒头。回到内存话题,有的系统认为用户想要的就是内存,而对这块内存是从哪儿来的并不关心,于是在有些情况下就会用mmap来冒充malloc。而有的系统则认为用户有权自己去安排自己的地址空间,他有权决定自己申请的内存是来自heap的还是来自mmap的。如果heap的空间不够,你可以调整heap的大小,你也可以安排你的程序使用mmap。有时候,只管吩咐、什么事都让别人做了确实很方便,但DIY的感觉也确实不错啊!
原帖由 Alligator27 于 2006-3-30 22:08 发表
3 page-directory一次性分配只需要3MB (32bit), 而且只是virtual address. 完全值得. 第一, 只有一个sysem call. 第二, 不会有将来分配不到的可能. 第三, 因为不搬家,实际占用空间可能少一些.
3、这一点确实值得考虑和尝试。page目录现在的空间浪费确实就是因为搬家引起的,否则我也没必要去推算mmap空间的1M会影响heap上的多少M了。我唯一的担心就是,库函数“兴不兴”这样抢地盘? |
|