现在有一个问题,应用程序最大内存空间是 2G,有 n个内存池子大小 4k,每个池子有 m个块,每个块可能被使用,也可能没有被使用。找到一种方法,通过任意给定地址可以知道该地址是否在内存池中,并且属于那个块,同时知道该块是否被使用。
解决方案:
1,将 2G内存空间分三段。分别命名为高位,中位,低位。高位 10bit, 中位 10bit,低位 12bits。
2,将 n个池子的地址也划分成三段。高位相同的聚集到一起,然后在高位相同的集合里,中位相同的再聚集到一起。
3,将 2,按段页是管理建立数据结构:建立 height-bit-table 和 middle-bit-table; height-bit-table是有 1k个入口点的 array,每个入口点是指向一个 middle-bit-table的起始地址。每个 middle-bit-table是有 1k个入口点的 array,每个入口点是指向块位图起始地址的指针。
4,块位图中的每一位 1,表示被使用块; 0表示是自由的块。
5,任意给定地址,通过高位找到 middle-bit-table的起始地址,然后用其实地址加上中位的量,得到块位图的起始地址。用地址的后 12位计算得到块的序号,通过块序号可以得到在指定的块位图中得到块的状态。
由于段页式的查找使用的数组和数组下标操作,因此时间复杂度是 O(1).
空间利用率,由于可以通过三级表,去掉部分的数据冗余。并且前提是 2G的地址空间因此所耗费空间可以接受。