lcc之内存分配
现在感觉这本书有些地方没有说透,如果自己的理解能力与基础知识够强的话,理解起来还好,如果不行的话,某些地方理解起来会相当的头疼。
现在来说说内存管理。当初看这一章的时候很快就过去了,感觉很多地方很好理解,当看到后面看不下去时,从头再仔细看时,发现当时很多没有注意到的细节问题。
在该书中图2-1我一直觉得这个图画错了,最后发现是我想当然了,其实这个图很正确,只是我没有理解正确。
文中把内存分成了三个大块。
这first仅仅表示这三块的头,即开始的地方, static struct block first[] = { { NULL }, { NULL }, { NULL } }, 每一个大块有若干block连接起来
static struct block *arena[] = { &first[0], &first[1], &first[2] }; arena代表每个大块的尾部,从头到尾中间的任何一块即使有空闲空间也不使用,这些空间被浪费了。
在上面的初始化中arena指向first中的各个项。
具体情况详见图2-1,其中另外一点需要注意的是f每一大块的第一个block中的avail和limit都是NULL表示头指针。
下面解释下allocate()函数。
简要说下步骤,首先从freeblock中开始找,freeblock是共享的,三个大块都可以从中来获取可分配的block,如果在freeblock中没有找到足够大小的block,于是就分配一个新的block,如果找到了足够大的block,则用该block。
void *allocate(n, a) unsigned long n; unsigned a; {
struct block *ap;
assert(a < NELEMS(arena));
assert(n > 0);
ap = arena[a];//此时ap指向大块a中的最后一个block
n = roundup(n, sizeof (union align));
//下面这段循环好阴险,先从freeblock中找,找不到再分配,感觉写的不太好,如果把else移出来就好理解多了
while (n > ap->limit - ap->avail)
{
//这里的freeblock是共享的,三个大的块共写freeblock。
if ((ap->next = freeblocks) != NULL)
{
freeblocks = freeblocks->next;
ap = ap->next;//指向freeblock中的block
}
else
{
unsigned m = sizeof (union header) + n + 10*1024;
ap->next = malloc(m);//malloc return a address of the memory
ap = ap->next;
if (ap == NULL)
{
error("insufficient memory\n");
exit(1);
}
ap->limit = (char *)ap + m;
}
//经过上面的if和else已经得到了满足大小的内存block(不论是从freeblock中分配得到的还是新分配的)
ap->avail = (char *)((union header *)ap + 1);
ap->next = NULL;
arena[a] = ap;
}
ap->avail += n;
return ap->avail - n;
}
上面还有一个疑问,first代表头,arena代表尾,当分配一个block时,是怎么把若干block通过next联系起来的。
lcc之内存分配的更多相关文章
- java\c程序的内存分配
JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该 ...
- java程序的内存分配
java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的 ...
- java程序的内存分配(一)
首 页 阅览室 馆友 我的图书馆 帐号 java程序的内存分配(一) 收藏 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据J ...
- 《深入理解Java虚拟机》内存分配策略
上节学习回顾 1.判断对象存活算法:引用计数法和可行性分析算法 2.垃圾收集算法:标记-清除算法.复制算法.标记-整理算法 3.垃圾收集器: Serial:新生代收集器,采用复制算法,单线程. Par ...
- Java的内存分配
java内存分配 A:栈 存储局部变量 B:堆 存储所有new出来的 C:方法区(方法区的内存中) 类加载时 方法信息保存在一块称为方法区的内存中, 并不随你创建对象而随对象保存于堆中; D:本地方法 ...
- C语言内存分配方法。
当C程序运行在操作系统上时,操作系统会给每一个程序分配一定的栈空间. 堆为所有程序共有的,需要时需要申请访问. 一.栈 局部变量.函数一般在栈空间中. 运行时自动分配&自动回收:栈是自动管理的 ...
- JVM内存分配策略
在 JVM内存垃圾回收方法 中,我们已经详细讨论了内存回收,但是,我们程序中生成的对象是如何进行分配的呢?以下所述针对的是HotSpot虚拟机. 1.Java堆结构 以HotSpot为例,如下图: H ...
- Java的垃圾回收和内存分配策略
本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...
- Buddy内存分配算法
Buddy(伙伴的定义): 这里给出伙伴的概念,满足以下三个条件的称为伙伴:1)两个块大小相同:2)两个块地址连续:3)两个块必须是同一个大块中分离出来的: Buddy算法的优缺点: 1)尽管伙伴内存 ...
随机推荐
- Gray Code -- LeetCode
原标题链接: http://oj.leetcode.com/problems/gray-code/ 这道题要求求出n位的格雷码相应的二进制数,主要在于找到一种格雷码的递增方法(格雷码并非唯一的,能够 ...
- Reactive ExtensionsLINQ和Rx简单介绍
LINQ和Rx简单介绍 相信大家都用过Language Integrated Query (LINQ),他是一种强大的工具能够从集合中提取数据.Reactive Extensions(Rx)是对LIN ...
- 【原创】构建高性能ASP.NET站点之三 细节决定成败
原文:[原创]构建高性能ASP.NET站点之三 细节决定成败 构建高性能ASP.NET站点之三 细节决定成败 前言:曾经就因为一个小小的疏忽,从而导致了服务器崩溃了,后来才发现:原来就是因为一个循环而 ...
- 思维导图(自己整理,希望对大家有用):JavaScript函数+canvas绘图+Array数组
1.javascript函数: 2.Array数组: 3.canvas绘图:
- 淘宝API学习之道:淘宝API相关了解
淘宝API开发平台,经过两年多的升级一系列动作,提供的api接口日渐稳定.看到淘宝api开发的浏览量还是较大,但那会写的DEMO如今已不能执行,淘宝改了链接地址,改了加密算法,为了不让大家浪费时间,特 ...
- Android手机定位技术的发展
基于以下三种方式的移动位置:1. 网络位置 :2. 基站定位. 3. GPS定位 1 网络位置 前提是连接到网络:Wifi.3G.2G 到达IP址 比如:彩虹版QQ,珊瑚虫版QQ,就有一个功能显示对 ...
- fzu 2150 Fire Game 【身手BFS】
称号:fzupid=2150"> 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个 ...
- React-Native基础教程
React-Native牛刀小试仿京东砍啊砍砍到你手软 React-Native基础教程 *React-Native基础篇作者git *React-Native官方文档 *Demo 几个月前faceb ...
- 利用Ring Buffer在SQL Server 2008中进行连接故障排除
原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring ...
- 原生js实现 常见的jquery的功能
原生选择器 充分利用 bind(this)绑定 <div id="box"> <ul> <li >111 </li> <l ...