深入理解ptmalloc的运作机制

1、前言

        一直对glibc的内存分配器的设计与实现感兴趣,之前一直没有下定决心以及抽出足够的时间进攻这个方向,最近抽出了几天对glibc的ptmalloc源码进行了梳理和研究,现在将研究成果梳理总结成文。
        为什么要写这篇文章?相信很多读者对系统是怎样管理内存感兴趣,通过深入研究ptmalloc,读者可以深刻了解到系统是怎样减少内存碎片,如何提升多线程环境下的内存分配和释放的性能,这对读者更好地进行系统编程有着直接或间接的帮助。本文立足于glibc 2.26的源码,为了方便读者理解和方便笔者书写,着重介绍概念和运作原理,不会贴大段的代码,各位看官大可放心食用。最有本人水平有限,如有书写不当的地方欢迎大家联系我修改,欢迎大家加入技术讨论群:QQ185017593。

[Read More]
C 

分代GC浅析

前言

        去年一年就出了一篇博客,整体上来说还是太忙了,又是赶项目又是忙出书的事情,趁着农历还没新年,忙里偷闲整一篇新的XD。本次想讨论的内容是分代GC(garbage collection,意为垃圾回收机制),关于GC相关的文章,之前在Lua解释器构建系列中已经出过一篇,不过那个是增进式GC(感兴趣的读者可以点击这个链接:构建Lua解释器Part2:Garbage Collection基础架构),本文想要讨论的则是分代GC。
        虽然本文写作的动机是在笔者阅读完Lua 5.4的GC源码之后,出于巩固知识的目的写的,但是笔者还是希望从更高的层次去讨论GC算法本身,因此会略去诸多Lua虚拟机相关的实现细节。本文将从GC的作用开始论述,介绍GC机制中常见的组成部件。首先通过简单的标记清除算法来引入GC的概念,然后逐步引入分步执行GC的概念和算法,最后以Lua 5.4所使用的分代GC算法为例,介绍工业级语言虚拟机是如何进行分代GC运作的。
        为了方便论述,本文不会完全遵循源码中的所有细节,旨在更好的解释分代GC这种机制,希望能让读者对分代GC有个比较深刻的理解,最后由于本人水平有限,如有不正确的地方,欢迎大家批评指正,笔者在此感激不尽。读者也可以加入笔者创建的Q群,QQ号为:185017593。

[Read More]

MongoDB初探

前言

        本篇内容是我阅读完MongoDB 4.2官方文档后的梳理总结,并且只是梳理。梳理的内容并不包含MongoDB官方文档的方方面面,更多的是与我们项目相关联的部分。本篇博客不是简单对官方文档的整理,其中包含了很多官方文档之外的资料,文章的脉络和结构,也是根据本人的理解进行组织。本文并不打算阐述太多MongoDB操作和部署相关的内容,更多的是梳理其内部的一些运作机制,如果想了解如何部署和使用MongoDB API,请查阅官网
        最后,由于本人水平有限,如有不当之处欢迎指出,同时也欢迎读者加入QQ:185017593群聊。

[Read More]

红黑树探索

前言

        在沉浸了一年多之后,我开始重新拾起了写博客的习惯。过去一年主要在忙我的书的事情,一本关于如何实现Lua解释器的书–《Lua解释器构建:从虚拟机到编译器》。这本书将由机械工业出版社出版,目前已经过了终审,处于校对环节,预计明年1月能够出样书,大概2月份能够上市。随书源码已经放到github上了,有兴趣的读者可以点击这里进行访问。由于我想写的内容已经在书中展现,因此原来的博客dummylua-tutorial系列不再更新。
        对书籍的预热结束,言归正传,本篇将深入探索红黑树。红黑树由于难于理解与实现,业内一直将“手撸红黑树”作为调侃的梗。本文将要探索的是红黑树的设计与实现,在开始写博客之前,我已经动手将红黑树实现了一遍,并且通过了预定的测试,确实是“手撸红黑树”了,XD。该项目我已经放到github上,读者可以通过这个链接red-black-tree进行下载。

[Read More]
C 

构建Lua解释器Part12:Weaktable

前言

        本章我开始论述lua的弱表(weaktable)机制,到目前为止,我已经完成了弱表的设计和实现了,读者可以在dummylua的对应章节目录,找到对应的代码工程。本章,我首先会介绍什么是弱表,它的用途,最后分别介绍弱键、弱值以及完全弱引用。

[Read More]

探索libevent

前言

        libevent是当前一个非常知名的跨平台网络库,学习并研究它,可以让我们理解一个优秀的网络库是如何设计的。为此,我近期花了几天时间,过了一遍libevent的基础数据结构和基本运行机制。虽然libevent库整体并不是很大,但是短短几天内要彻底掌握所有的细节,还是有相当的难度,因此这里,我只阐述libevent最核心的运作机制。本文研究的libevent的版本是libevent-2.1.12-stable。

[Read More]

构建Lua解释器Part11:Upvalue

前言

        本章,我将深入探讨lua的upvalue机制。在写这篇博客之前,我已经自己动手实现了这个机制,并且将其提交到了github仓库dummylua上了。为了专注于upvalue机制本身的讨论,本章不会展示大量的代码细节,尽量在抽象层面来论述。

[Read More]

构建Lua解释器Part10:userdata

前言

        本章节,我开始对dummylua的userdata的设计与实现,进行论述。它的大体设计与实现,仍然是仿照了lua5.3的标准,由于,所有的内容,都是我自己理解后,重新实现,因此在一些实现细节上略有不同,但是整体设计思路遵循了lua的设计思想。本章的篇幅不会很长,因为userdata这个部分并不是非常复杂,因此我这里也会速战速决,将userdata的一些核心思想论述清楚,就将本章完结。

[Read More]

构建Lua解释器Part9:metatable

前言

        本章,我们将进入到metatable的探索之中。由于这块本身比较简单,而且我也不打算罗列代码细节,因此本章的篇幅不会很大。只是对一些我认为比较关键的部分,进行说明。首先,本章的主要任务,首先是简要介绍metatable是做什么的,然后简要说明一下,它如何被设置,接着介绍metatable的访问域,双目运算操作域、单目运算操作域等。最后会告诉读者,本章的实现逻辑位于dummylua工程的哪些部位。

[Read More]

构建Lua解释器Part8:构建完整的语法分析器(下)

前言

        前面,我已经用3篇blog的巨大篇幅,详细论述了Lua编译模块的一些基本知识。其中,Part5通过一个简单的打印hello world的例子,论述了编译出来的虚拟机指令,如何存到Proto结构中,最后再通过虚拟机执行的流程。Part6详细论述了,词法分析器的设计与实现。而Part7则论述了,expression的编译流程。本章,将作为Lua内置编译器论述的最后一个部分。往后的部分,将不再涉及编译相关的内容。当然,经历这篇,相信读者能够完全理解Lua内置编译器的设计与实现,个人认为完整度还是比较高的。

[Read More]