本次实验是使用java程序模拟伙伴系统的内存分配策略。
其中默认内存大小为1024KB,1KB为一个页,最小的页分配大小为8KB
默认有20个进程不同时间到达,随机申请1~200个页大小的内存空间,占用时间为随机1~10S
使用java程序模拟伙伴系统的内存分配,并且显示出每次分配和释放内存后,内存的占用情况。
\
\
buddy system简介:
buddy system内存管理,努力让内存分配与相邻内存合并能快速进行(对于普通算法来讲,合并内存相当困难),它利用的是计算机擅长处理2的幂运算。
我们创建一系列空闲块列表,每一种都是2的倍数。
举个例子,如果最小分配单元是8字节,整个内存空间有1M。我们创建8字节内存块链表,16字节内存块链表,32字节内存块链表,64,128,256,512,1k,2K, 4K, 8K, 16K, 32K, 64K, 128K, 256K, 512K 和一个1M内存块链表。
除了1M内存块链表有一个可用单元,其余链表初始为空。所有的内存分配都会向上取整到2的倍数----70K会向上取整到128K,15K会向上取整到16K,等等。
什么是Buddy
buddy system允许一个被分配块单元平均拆分成两个大小是原来一半的块单元,这两个块单元互为伙伴。块B的伙伴必须满足大小跟块B一样大,并且内存地址相邻(才可以合并)。
另一个伙伴性质是所有块单元在内存中的地址必须能被它自己的大小整除。比如16字节的块的地址都是一些16的倍数,如64字节的块的地址都是一些64的倍数,等等。
不仅如此,低地址的“伙伴”必须在一个能它“父亲块大小”整除,简单的说,来自同一个大块的两个小块才是伙伴。
分配内存示例
我们想分配70K的块空间
1.70K向上取整到2的倍数:128K
2.查询有128K空闲块吗?
3.没有,分配256K块。
a.有256K的空闲块吗?
b.没有,分配512K的块。
i.有512K空闲块吗?
ii.没有,分配1M的空闲块
i.有1M的空闲块吗?
ii.有,从1M的那个空闲链表中摘下,分配出去
iii.拆开一半挂在512k空闲链表上
iv.返回另一半512K块
c.拆开一半挂在256k空闲链表上
d.返回另一半256k块
4.将获得的256K的块拆两半,一半挂在128K空闲链表中
5.另一半128K块返回用户。
内存回收示例
当回收一个内存块,我们把它挂到对应的空闲链表上,然后查询它的伙伴是不是也在这个空闲链表上,如果是则合并他们然后挂接在对应2倍大小块所对应的空闲链表。重复该逻辑。假设我们回收刚刚分配的128K块内存
1.这个128K的块的伙伴也在128K的空闲链表上吗?
2.是的,移除它的128K伙伴块。
3.合并成256K的内存块
a.这个256K的块的伙伴也在256K空闲链表上吗?
b.是的,移除该伙伴并合并成512K的块。
c.这个512K的块的伙伴也在512K空闲链表上吗?
d.是的,移除该伙伴并合并成1M的块。
e.这个1M的块的伙伴也在1M空闲链表上吗?
f.没有,添加这个1M的块在1M的空闲链表上。
算法的优劣势分析
buddy system能很快地分配和回收内存块,但有内碎片,因为它要向上取2的幂的块大小,有空间浪费,但这是所有内存分配算法都避免不了的。linux系统使用它来分配内存页,很可能是因为内存页的大小是2的次幂。
\
**
**
编程实现模拟内存分配:
\
Buddy.java 该类是实现Buddy system的类,同时Main函数里是进行测试的代码。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by 32706 on 2016/12/14.
*/
public class Buddy {
public static int nowtime = 0;
private static final int memsize = 1024;//内存的页数
private static Character[] Memory = new Character[memsize];//总的内存空间大小 一个int表示一个页的大小为1KB
public static List<Task> task_list = new ArrayList<>();
public static List<Task> running_list = new ArrayList<>();
/**
* 存储空闲的页表,每个list对应相应的大小的页表块
**/
private static List<int[]> size1024K = new ArrayList<>();
private static List<int[]> size512K = new ArrayList<>();
private static List<int[]> size256K = new ArrayList<>();
private static List<int[]> size128K = new ArrayList<>();
private static List<int[]> size64K = new ArrayList<>();
private static List<int[]> size32K = new ArrayList<>();
private static List<int[]> size16K = new ArrayList<>();
private static List<int[]> size8K = new ArrayList<>();
private static Map<Integer, List> Mem = new HashMap<>();//存储所有空闲页的列表
public static void init_mem() {
for (int i = 0; i < Memory.length; i++) {
Memory[i] = '_';
}
int[] t = {0, memsize - 1};
size1024K.add(t);
Mem.put(1024, size1024K);
Mem.put(512, size512K);
Mem.put(256, size256K);
Mem.put(128, size128K);
Mem.put(64, size64K);
Mem.put(32, size32K);
Mem.put(16, size16K);
Mem.put(8, size8K);
}
static void refresh_memory(int begin, int end, int op)//刷新内存
{
if (op == 1)
for (int i = begin; i <= end; i++) {
Memory[i] = '@';
}
if (op == 0) {
for (int i = begin; i <= end; i++) {
Memory[i] = '_';
}
}
}
static int[] get_from_List(int size)//从大小为size的空闲快列表中得到一个块
{
int[] rt = new int[2];
List<int[]> sizex = Mem.get(size);//取出size大小的空闲块队列
if (sizex.size() > 0) //如果不为空
{
rt = sizex.get(0); //取出一个块
sizex.remove(0); //从队列中删除这个块
Mem.put(size, sizex); //将队里放回mem中
}
return rt;
}
static boolean break_list(int size)//分割页面
{
if (size > 1024)//大于1024的页面不存在无法分割
return false;
List<int[]> sizex = Mem.get(size);//得到当前size大小的空页列表
boolean rt = true;
if (sizex.size() == 0)//如果列表为空
{
rt = false;
rt = break_list(size * 2);//将更大一级的页分解
}
if (rt) { //如果更大一级的页框分割成功,分割本页框,使其成为两个一样大的小页
sizex = Mem.get(size);
int[] t = sizex.get(0); //取出一个size大小的页
sizex.remove(0);//从当前列表中删除
Mem.put(size, sizex);//放回mem
int[] t1 = new int[2];
t1[0] = t[0];
t1[1] = t1[0] + ((size / 2) - 1);//分割成两个大小一样的小页
t[0] = t1[1] + 1;
List<int[]> tem = Mem.get(size / 2);//得到size/2大小的页的列表
tem.add(t);//将分割好的两个页插入进去
tem.add(t1);
Mem.put(size / 2, tem);//将新的列表放入所有的空闲内存中
return true;
} else { //如果更大的叶匡分割失败,表示没有更大的空闲页了,返回值为false
return false;
}
}
public static boolean request_mem(Task task)//请求调页
{
boolean rt;
int size = task.need_mem_size;
System.out.println("\n\n当前时间:" + nowtime + " 进程:" + task.task_ID + " 开始请求内存,所需内存大小==" + size + "KB");
if (size > 1024)//没有大于1024的页可以分配
return false;
int t = (int) Math.ceil(Math.log(size) / Math.log(2));// 计算t=log2(size)进一法 // 如果请求为size大小,则需要分配的页的大小为2^t
if (size <= 8) //最小页面为8KB 即t最小为3
t = 3;
List<int[]> tem = Mem.get((int) Math.pow(2, t));//取出当前2^t大小的空闲页面列表
if (tem.size() == 0) { //如果列表为空,需要进行页分割
rt = break_list((int) Math.pow(2, t) * 2); //分割得到2^t大小的页
if (!rt) //如果分割失败,返回false表示请求失败
return false;
}
int[] get = get_from_List((int) Math.pow(2, t));//取出一个页面
System.out.println("当前时间:" + nowtime + " 分配得到内存空间从" + get[0] + "==>" + get[1] + " 的 " + (get[1] - get[0] + 1) + "KB内存");
refresh_memory(get[0], get[1], 1);//刷新内存值 1表示占用
task.get_mem(get);
return true;
}
public static boolean release_mem(Task task)//释放内存 task是要释放自己占用内存的进程
{
int[] rlease_mem = task.release_mem();//将要释放的内存的地址
int begin = rlease_mem[0];//地址开始
int end = rlease_mem[1];//地址结束
int size = end - begin + 1;//该快页面的大小
System.out.println("\n\n\n当前时间:" + nowtime + " ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:" + task.task_ID + "释放地址" + rlease_mem[0] + "==>" + rlease_mem[1] + "的内存" + "大小为:" + size + "KB");
refresh_memory(rlease_mem[0], rlease_mem[1], 0);
int[] mem_after_combine = combine_mem(size, begin, end);
size = mem_after_combine[1] - mem_after_combine[0] + 1;
List<int[]> tem = Mem.get(size);
tem.add(mem_after_combine);
Mem.put(size, tem);
return true;
}
public static int[] combine_mem(int size, int begin, int end)//块合并
{
int[] rt = {begin, end};//返回合并后的块的起始地址和结束地址
while (true) {
int[] neighbor = get_neighbour(size, begin, end);//查找是否有大小相同的相邻的块
if (neighbor == null)//如果没有的话就直接返回rt
return rt;
else {
if (neighbor[0] > rt[1])//如果相邻的块在当前块的后面
rt[1] = neighbor[1];//修改合并后块的结束地址
else
rt[0] = neighbor[0];//如果相邻的块在前面,则修改合并后块的起始地址
begin = rt[0];//更新起始地址
end = rt[1];//更新结束地址
size = end - begin + 1;//更新当前块大小
}
}
}
public static int[] get_neighbour(int size, int begin, int end)//得到输入块的相邻块的地址
{
List<int[]> tem = Mem.get(size);//取出大小为size的空闲块 的列表
for (int i = 0; i < tem.size(); i++)//遍历所有size大小的空闲快
{
int[] t = tem.get(i);
if (t[0] == end + 1 || t[1] == begin - 1) { //如果有一个空闲快的起始地址是当前块的结束地址+1 或者 一个空闲快的结束地址是当前块的起始地址—1 说明这个两个块是相邻的
tem.remove(i); //从size大小的列表中删除该相邻块
Mem.put(size, tem);//放回内存
return t;//返回这个相邻的块
}
}
return null;//如果没有当前块的相邻块,返回空指针
}
static void init_task() {
for (int i = 0; i < 20; i++) {
// 进程号 需要的页面数 进程到达时间 进程预计执行时间
Task t = new Task(i, (int) (Math.random() * 400) % 200 + 1, i, (int) (Math.random() * 20) % 10 + 1);
task_list.add(t);
}
}
static void show_memory() {
for (int i = 0; i < Memory.length; i += 8) {
System.out.print(Memory[i]);
}
System.out.println("");
}
public static void main(String arg[]) {
System.out.println("默认内存大小为1024KB,最小的内存页面为8KB\n总共有20个进程不同时间到达,申请随机大小(1~200KB)的内存页面,随机占用1~10秒时间\n每次成功申请和释放内存后会打印内存的占用情况\n‘@’表示内存8KB内存被占用‘_’表示8KB内存空闲");
init_task();
init_mem();
while (true) {
for (int i = 0; i < task_list.size(); i++) {
Task tem = task_list.get(i);//进程队列里取出一个进程
if (request_mem(tem)) {
tem.arrive_time = nowtime; //纪录该进程开始得到内存的时间
task_list.remove(i); //成功获得内存的进程从等待队列中删除,加入到正在运行的队列中
running_list.add(tem);
System.out.println("当前时间:" + nowtime + " request memory success" + " 进程需要运行时间:" + tem.running_time);
show_memory();
break; //同一个时刻只能有一个进程获得内存,如果已经有一个进程成功分配内存,则终止循环
} else //如果请求内存失败,则从输出请求失败信息,并进入下一个循环,取出进程队列中的下个进程
System.out.println("当前时间:" + nowtime + " request memory failed");
}
for (int i = 0; i < running_list.size(); i++) { //扫描正在运行的进程列表
Task tem = running_list.get(i);
if (tem.running_time <= nowtime - tem.arrive_time) { //如果有一个进程所需的内存的时间结束
release_mem(tem); //释放内存
System.out.println("当前时间:" + nowtime + " release memory success");
show_memory(); //打印出当前的内存状况
running_list.remove(i); //从运行队列中删掉该进程
i = 0; //重新从队列头部扫描
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
nowtime++;
System.out.println("\n\n ~~~~~~~~~~~~~~~~~~~~~" + "当前时间:" + nowtime);
if (running_list.size() == 0 && task_list.size() == 0)
break;
}
}
}
\
\
\
\
\
Task.java 该类是模拟一个进程,存储进程的一些信息例如进程号、开始执行时间、需要的内存大小、需要执行时间等
/**
* Created by 32706 on 2016/12/15.
*/
public class Task {
public int [] using_mem={0,0};
public int need_mem_size=0;
public int task_ID=0;
public int arrive_time=0;
public int running_time=0;
public int[] release_mem()
{
int [] rt=this.using_mem;
this.using_mem=null;
return rt;
}
public void get_mem(int [] get)
{
this.using_mem=get;
}
public Task(int ID,int need,int arrive,int run)
{
this.task_ID=ID;
this.need_mem_size=need;
this.arrive_time=arrive;
this.running_time=run;
}
}
\
\
\
\
程序的运行结果如下:(由于每次生成的进程所需内存是随机的,所以程序每一次的运行结果可能都不相同)
"C:\Program Files\Java\jdk1.8.0_102\bin\java" -Didea.launcher.port=7533 "-Didea.launcher.bin.path=D:\软件\intellij idea\IntelliJ IDEA 2016.2.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_102\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar;C:\Users\32706\Desktop\新建文件夹\out\production\新建文件夹;D:\软件\intellij idea\IntelliJ IDEA 2016.2.2\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain Buddy
默认内存大小为1024KB,最小的内存页面为8KB
总共有20个进程不同时间到达,申请随机大小(1~200KB)的内存页面,随机占用1~10秒时间
每次成功申请和释放内存后会打印内存的占用情况
‘@’表示内存8KB内存被占用‘_’表示8KB内存空闲
当前时间:0 进程:0 开始请求内存,所需内存大小==151KB
当前时间:0 分配得到内存空间从768==>1023 的 256KB内存
当前时间:0 request memory success 进程需要运行时间:7
________________________________________________________________________________________________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:1
当前时间:1 进程:1 开始请求内存,所需内存大小==150KB
当前时间:1 分配得到内存空间从512==>767 的 256KB内存
当前时间:1 request memory success 进程需要运行时间:9
________________________________________________________________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:2
当前时间:2 进程:2 开始请求内存,所需内存大小==44KB
当前时间:2 分配得到内存空间从448==>511 的 64KB内存
当前时间:2 request memory success 进程需要运行时间:6
________________________________________________________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:3
当前时间:3 进程:3 开始请求内存,所需内存大小==199KB
当前时间:3 分配得到内存空间从0==>255 的 256KB内存
当前时间:3 request memory success 进程需要运行时间:2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:4
当前时间:4 进程:4 开始请求内存,所需内存大小==142KB
当前时间:4 request memory failed
当前时间:4 进程:5 开始请求内存,所需内存大小==22KB
当前时间:4 分配得到内存空间从416==>447 的 32KB内存
当前时间:4 request memory success 进程需要运行时间:9
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@____________________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:5
当前时间:5 进程:4 开始请求内存,所需内存大小==142KB
当前时间:5 request memory failed
当前时间:5 进程:6 开始请求内存,所需内存大小==48KB
当前时间:5 分配得到内存空间从320==>383 的 64KB内存
当前时间:5 request memory success 进程需要运行时间:8
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
当前时间:5 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:3释放地址0==>255的内存大小为:256KB
当前时间:5 release memory success
________________________________________@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:6
当前时间:6 进程:4 开始请求内存,所需内存大小==142KB
当前时间:6 分配得到内存空间从0==>255 的 256KB内存
当前时间:6 request memory success 进程需要运行时间:1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:7
当前时间:7 进程:7 开始请求内存,所需内存大小==56KB
当前时间:7 分配得到内存空间从256==>319 的 64KB内存
当前时间:7 request memory success 进程需要运行时间:8
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
当前时间:7 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:0释放地址768==>1023的内存大小为:256KB
当前时间:7 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________________________
当前时间:7 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:4释放地址0==>255的内存大小为:256KB
当前时间:7 release memory success
________________________________@@@@@@@@@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________________________
~~~~~~~~~~~~~~~~~~~~~当前时间:8
当前时间:8 进程:8 开始请求内存,所需内存大小==71KB
当前时间:8 分配得到内存空间从896==>1023 的 128KB内存
当前时间:8 request memory success 进程需要运行时间:9
________________________________@@@@@@@@@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@
当前时间:8 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:2释放地址448==>511的内存大小为:64KB
当前时间:8 release memory success
________________________________@@@@@@@@@@@@@@@@____@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:9
当前时间:9 进程:9 开始请求内存,所需内存大小==132KB
当前时间:9 分配得到内存空间从0==>255 的 256KB内存
当前时间:9 request memory success 进程需要运行时间:7
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@____@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:10
当前时间:10 进程:10 开始请求内存,所需内存大小==131KB
当前时间:10 request memory failed
当前时间:10 进程:11 开始请求内存,所需内存大小==149KB
当前时间:10 request memory failed
当前时间:10 进程:12 开始请求内存,所需内存大小==23KB
当前时间:10 分配得到内存空间从384==>415 的 32KB内存
当前时间:10 request memory success 进程需要运行时间:2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@
当前时间:10 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:1释放地址512==>767的内存大小为:256KB
当前时间:10 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________________________________________________@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:11
当前时间:11 进程:10 开始请求内存,所需内存大小==131KB
当前时间:11 分配得到内存空间从512==>767 的 256KB内存
当前时间:11 request memory success 进程需要运行时间:9
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:12
当前时间:12 进程:11 开始请求内存,所需内存大小==149KB
当前时间:12 request memory failed
当前时间:12 进程:13 开始请求内存,所需内存大小==25KB
当前时间:12 分配得到内存空间从480==>511 的 32KB内存
当前时间:12 request memory success 进程需要运行时间:8
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@
当前时间:12 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:12释放地址384==>415的内存大小为:32KB
当前时间:12 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@____@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:13
当前时间:13 进程:11 开始请求内存,所需内存大小==149KB
当前时间:13 request memory failed
当前时间:13 进程:14 开始请求内存,所需内存大小==18KB
当前时间:13 分配得到内存空间从448==>479 的 32KB内存
当前时间:13 request memory success 进程需要运行时间:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@
当前时间:13 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:5释放地址416==>447的内存大小为:32KB
当前时间:13 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:14
当前时间:14 进程:11 开始请求内存,所需内存大小==149KB
当前时间:14 request memory failed
当前时间:14 进程:15 开始请求内存,所需内存大小==104KB
当前时间:14 分配得到内存空间从768==>895 的 128KB内存
当前时间:14 request memory success 进程需要运行时间:10
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
当前时间:14 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:6释放地址320==>383的内存大小为:64KB
当前时间:14 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:15
当前时间:15 进程:11 开始请求内存,所需内存大小==149KB
当前时间:15 request memory failed
当前时间:15 进程:16 开始请求内存,所需内存大小==41KB
当前时间:15 分配得到内存空间从384==>447 的 64KB内存
当前时间:15 request memory success 进程需要运行时间:10
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
当前时间:15 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:7释放地址256==>319的内存大小为:64KB
当前时间:15 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:16
当前时间:16 进程:11 开始请求内存,所需内存大小==149KB
当前时间:16 request memory failed
当前时间:16 进程:17 开始请求内存,所需内存大小==196KB
当前时间:16 request memory failed
当前时间:16 进程:18 开始请求内存,所需内存大小==40KB
当前时间:16 分配得到内存空间从320==>383 的 64KB内存
当前时间:16 request memory success 进程需要运行时间:9
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
当前时间:16 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:9释放地址0==>255的内存大小为:256KB
当前时间:16 release memory success
________________________________________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:17
当前时间:17 进程:11 开始请求内存,所需内存大小==149KB
当前时间:17 分配得到内存空间从0==>255 的 256KB内存
当前时间:17 request memory success 进程需要运行时间:5
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
当前时间:17 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:8释放地址896==>1023的内存大小为:128KB
当前时间:17 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________
~~~~~~~~~~~~~~~~~~~~~当前时间:18
当前时间:18 进程:17 开始请求内存,所需内存大小==196KB
当前时间:18 request memory failed
当前时间:18 进程:19 开始请求内存,所需内存大小==87KB
当前时间:18 分配得到内存空间从896==>1023 的 128KB内存
当前时间:18 request memory success 进程需要运行时间:2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:19
当前时间:19 进程:17 开始请求内存,所需内存大小==196KB
当前时间:19 request memory failed
当前时间:19 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:14释放地址448==>479的内存大小为:32KB
当前时间:19 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
~~~~~~~~~~~~~~~~~~~~~当前时间:20
当前时间:20 进程:17 开始请求内存,所需内存大小==196KB
当前时间:20 request memory failed
当前时间:20 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:10释放地址512==>767的内存大小为:256KB
当前时间:20 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@____@@@@________________________________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
当前时间:20 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:19释放地址896==>1023的内存大小为:128KB
当前时间:20 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@____@@@@________________________________@@@@@@@@@@@@@@@@________________
~~~~~~~~~~~~~~~~~~~~~当前时间:21
当前时间:21 进程:17 开始请求内存,所需内存大小==196KB
当前时间:21 分配得到内存空间从512==>767 的 256KB内存
当前时间:21 request memory success 进程需要运行时间:3
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@____@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________
当前时间:21 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:13释放地址480==>511的内存大小为:32KB
当前时间:21 release memory success
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________
~~~~~~~~~~~~~~~~~~~~~当前时间:22
当前时间:22 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:11释放地址0==>255的内存大小为:256KB
当前时间:22 release memory success
________________________________________@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________
~~~~~~~~~~~~~~~~~~~~~当前时间:23
~~~~~~~~~~~~~~~~~~~~~当前时间:24
当前时间:24 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:15释放地址768==>895的内存大小为:128KB
当前时间:24 release memory success
________________________________________@@@@@@@@@@@@@@@@________@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@________________________________
当前时间:24 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:17释放地址512==>767的内存大小为:256KB
当前时间:24 release memory success
________________________________________@@@@@@@@@@@@@@@@________________________________________________________________________
~~~~~~~~~~~~~~~~~~~~~当前时间:25
当前时间:25 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:16释放地址384==>447的内存大小为:64KB
当前时间:25 release memory success
________________________________________@@@@@@@@________________________________________________________________________________
~~~~~~~~~~~~~~~~~~~~~当前时间:26
当前时间:26 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||进程:18释放地址320==>383的内存大小为:64KB
当前时间:26 release memory success
________________________________________________________________________________________________________________________________
~~~~~~~~~~~~~~~~~~~~~当前时间:27
Process finished with exit code 0
\