狂风中文网

第20章 考验(第2页)

天才一秒记住【狂风中文网】地址:https://www.kfzw.net

忽然,面前的空间展开,化成一张巨大的、向四面八方无尽延伸的方格纸。

每一个小格子代表一个內存单元,被占用的、空閒的都一一陈列於此。

它们都在等待创造者的规划安排。

前提是你能在它们服从秩序之前,保证自己不被混乱击穿大脑。

“这就是你的画布,孩子。

b语言没能征服它,我们来试试。”

里奇的声音从身后的虚空中传来,李林定了定心神。

动手。

首先要解决“我是谁”

的问题。

每一个分配出去的內存块,它必须知道自己多大、属於谁、下一个是谁。

李林开始用struct定义內存块的头部信息,包括块的大小、是否空閒和炼表指针。

他在方格纸上画下第一道箭头,从一块內存的头部指向下一块,再指向下一块,把那些散落的格子串成一条链。

由此,他便实现了最基础的alloc和free。

遍歷炼表,找到第一块足够大的空閒块,分配出去,释放时標记为空閒,和相邻的空閒块合併。

方格纸上,逐渐开始有了秩序。

“太慢了。”

里奇的声音再次响起,这次带著毫不掩饰的失望,

“每次分配都要从头遍歷,这在系统內核里根本不能用。

你这个版本比那些老古董手写的汇编还要差。”

李林盯著方格纸上那条长长的炼表。

是啊,所以需要一些新东西了。

李林握了握拳头,闭上眼睛,回想起这些天来自己的所学所思。

首先,他想到的是自己在现代编程中见过的——

內存对齐技术。

对齐到2的冪次,用地址本身来编码信息。

再结合之前胡云程提过的“细胞”

,两个思路撞在一起,解法也就应运而生了。

伙伴算法。

將內存按2的冪次分割成块。

当请求来临,找到刚好大於等於请求大小的块。

如果块太大,就一分为二,“伙伴对伙伴”

,直到大小合適。

回收的时候,检查伙伴是否也空閒,如果是就合併回去。

最关键的是,计算伙伴地址不需要遍歷,不需要查表。

只需要一次位运算。

於是,李林在方格纸上重新画了一遍。

这次不再是长长的炼表,而是一棵二叉树。

每个节点都有它的伙伴,每个伙伴都在一个固定的位置上等它。

本章未完,请点击下一章继续阅读!若浏览器显示没有新章节了,请尝试点击右上角↗️或右下角↘️的菜单,退出阅读模式即可,谢谢!

如遇章节错误,请点击报错(无需登陆)

新书推荐

继承亿万家产后,渣总前夫哭着求复合仙厨她靠灵膳爆火了河神新娘冒牌御兽师小良药温柔沦陷领主之军团召唤娇宠控灵小王妃惊悚降临:这个大哥有亿点猛!华娱之天道酬勤从召唤恶魔开始无敌傲骨狂兵吞噬星空:图鉴我有一个万界交易群小仙女有个红包群团宠女鹅是偏执大佬的白月光快穿之团宠她又萌翻了美漫大魔王穿成雍正后我成了万人迷拉仇恨从斗罗开始我师父是个bug一宠成瘾:江少的33次告白诸天信条带着药王空间穿到七零年诸天大道宗