这一章节的memory management内容覆盖从bare-machine approach到paging和segmentation;
9.1 background
我们在编程时候所操作的地址--logical address和实际机器中的地址--physical address不是一样的;他们之间的mapping是通过Memory Management Unit来进行转换,通常是通过[relocation,offset]这样的典型组合来完成;而且他们之间的binding,也有几种情况:1,compile time:在程序编译的时候就bind,那么这个地址肯定是绝对地址;2,load/execution time:load/execute程序的时候bind,这种情况普遍有个模式:Relocable Addr+offset的模式,程序操作offset,然后由系统来确认Relocable addr的值,在不同情况改变relocable addr那么程序就被在memory中移来移去;定义:
logical address:由cpu产生的addressphysical address:memory unit所见的addressdynamic loading:一个模块知道被使用的时候才会被load
dynamic linking:推迟link,但是需要os的支持,因为link会需要考虑process的protection,9.2 swapping
swapping:针对process而言,执行的时候swap进内存,不执行的时候swap出去;一些基于优先级的算法来支持swapping9.3 continuous memory allocation
就是给定一块内存,比如256M,来支持alloc/free;《the art of computer programming》给出著名的heap算法1,把内存用链表串起--开始的时候就一个节点,随着分配和释放,连续内存被打散,形成链表;2,另外用hash表来索引节点,[key,value]--[内存块大小,内存块的地址],hash表有多个,以size大小分类--1k-2k的一类,2k-4k的一类,4k-8k的一类...我们需要alloc内存出来时迅速定位到hash表,然后选择best fit的模块进行分类;分配时如果已有内存块大于所需,就裂开,free时,如果归还内存前后有free的内存,就merge最大问题是:external fragmentation,可能剩余10M内存,但是都是零碎的小块,无法alloc出一个1m的空间;
由于游戏开发中,内存有一定的规律,比如在ps3中管理显存,就可以根据游戏需要,特殊处理render target,resolve buffer这类问题,
利用游戏的特性来进行优化,而不是单纯的去做支持general的工作;会很大程度上降低这个工作;9.4 paging
paging--允许process的logical address是连续的,但是physical address是不连续的;非常牛逼的做法;基本概念physical memory被分成大小一样的一块块,called framelogical memory分成大小一样的一块块,叫pagepage灵活的map到frame中,逻辑地址中连续的page,在physical memory中就是可以分散的分配的;requirements
需要page table,frame table而且在真正访问内存的时候,需要做逻辑地址向物理地址的转换,这会大大降低速度,硬件的支持不可避免;TLB作为page table的cache出现,加快逻辑物理转换速度;more:
可以有多级page table,shared page table。。。9.5 segmentation
segmentation:支持用户角度对内存的划分;比如我们coding时候常说的:stack,heap,全局区等等;以segmentation table做管理,以[base,offset]对来索引,可以区域保护和共享,享受external fragmentation;9.6 segmentation with paging
把segmentation架在paging上,通过segmentation的[base,offset]地址访问到page的[page_number,offset]再到physical memory;很灵活很牛逼,有硬件支持也很快,intel 80386这么干的; 原文链接: