随笔分类 -  lua

摘要:首先,我们需要考虑下函数调用前,我们需要做些哪些准备工作。调用时,如何切换到它对应的函数环境中,调用完后,又如何切换回来。 函数调用前准备 我们之前有介绍过函数闭包,lua 函数能像其他值(数值、字符串)一样,可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值。(在lu 阅读全文
posted @ 2024-06-27 08:34 墨色山水 阅读(130) 评论(0) 推荐(0) 编辑
摘要:在做一个通用的 lua 性能监控工具,不嵌入代码,目前了解到的,比较好的方式是使用 ebpf 。 chatgpt 对 ebpf 介绍: eBPF是一种允许用户在 Linux 内核中注入自定义代码的技术,eBPF全称为 extended Berkeley Packet Filter,它提供了一种轻量级 阅读全文
posted @ 2024-06-16 11:43 墨色山水 阅读(103) 评论(0) 推荐(0) 编辑
摘要:介绍 复习下进程,线程,协程的概念。 进程:是操作系统分配资源的基本单位,代表了程序正在运行时的实例。操作系统为其分配独立的内存空间,包括堆栈,代码,数据等信息,进程之间相互独立,一般通过信号、共享内存、管道,网络等方式通讯,由操作系统负责调度执行。 线程:是进程内的执行单元。一个进程里可以有多个线 阅读全文
posted @ 2024-05-14 09:02 墨色山水 阅读(77) 评论(0) 推荐(0) 编辑
摘要:平时用 for 循环的地方挺多的,所以有空就想着看看它内部实现原理。 根据 lua 语法规定,for 循环分为两类: 数值for循环 泛型for循环 数值for循环 格式: for var=exp1,exp2,exp3 do <执行体> end 解析阶段分析: static void forstat 阅读全文
posted @ 2024-05-08 21:22 墨色山水 阅读(142) 评论(0) 推荐(0) 编辑
摘要:注册表 注册表( registry)是张只能被代码访问的全局表,这个注册表实际上就是一个普通的Lua表。它主要的作用, 可以存放 lua 的全局变量 存储 c 编写的扩充函数 注册表预先定义了一些key/value。 LUA_RIDX_MAINTHREAD:指向 主线程 LUA_RIDX_GLOBA 阅读全文
posted @ 2024-05-04 17:14 墨色山水 阅读(154) 评论(0) 推荐(0) 编辑
摘要:上值 在介绍闭包前,先要介绍下什么是上值,上值就是外部函数的局部变量。注意,是针对局部变量而已的。 local function f1() local x = 1 local function f2() print(x) end f2() end f1() 比如上面的代码,在 f1 中定义了一个局部 阅读全文
posted @ 2024-04-27 23:01 墨色山水 阅读(118) 评论(0) 推荐(0) 编辑
摘要:函数原型 我们平时在定义一个 lua 函数时,它内部实现对应的 c 实现是怎么样的,需要用到多少字段来记录一个函数的基本信息呢,接下来,我们看看 lua 函数原型的结构定义: typedef struct Proto { CommonHeader; // 固定参数的数量 lu_byte numpar 阅读全文
posted @ 2024-04-24 20:43 墨色山水 阅读(119) 评论(0) 推荐(0) 编辑
摘要:lua 与c进行交互,或者lua函数执行,都需要用到栈,接下来就先了解下 lua 栈的内部实现。 了解栈的实现,可以从2个方面出发,栈结构在哪定义,栈存储的元素是什么。 lua 栈主要放在 lua_State 结构上,摘要 lua_State 一些和栈相关的字段: /* ** 'per thread 阅读全文
posted @ 2024-04-19 15:55 墨色山水 阅读(88) 评论(0) 推荐(0) 编辑
摘要:这里搜到一篇比较好的介绍和 table dead key 相关的文章,我就做个记录把 https://luyuhuang.tech/2020/10/23/lua-next.html 这篇文章提到的例子: local k = 'a'..'b' local t = { a = 1, [k] = 2, } 阅读全文
posted @ 2023-08-11 19:02 墨色山水 阅读(6) 评论(0) 推荐(0) 编辑
摘要:清除阶段主要是针对 g->allgc,g->finobj,g->tobefnz 这三个链表上的对象。g->allgc 链表是会存在死亡对象(没有再被引用着的对象),而 g->finobj,g->tobefnz 这两个链表,主要是存储带 __gc 元方法的对象,根据上一篇的介绍,我们知道 g->fin 阅读全文
posted @ 2023-08-08 22:02 墨色山水 阅读(12) 评论(0) 推荐(0) 编辑
摘要:定义 如果我们给一个普通表 t,设置元表时,上带 __gc 的元方法,就会让这个表 t 在被回收时,触发 __gc 方法。例如下面的例子: local mt = {__gc = function () print("call __gc ...") end} local t1 = setmetatab 阅读全文
posted @ 2023-08-07 22:22 墨色山水 阅读(119) 评论(0) 推荐(0) 编辑
摘要:lua5.3的上值标记,涉及的内容有点多,就单独拿出来分析下,做下笔记。 我们知道,上值的引用者是闭包,其中包括了lua闭包,和c闭包,被引用者往往是栈上的对象。 c闭包上值 mark 先从简单的c闭包开始看起。 static lu_mem traverseCclosure (global_Stat 阅读全文
posted @ 2023-08-03 21:55 墨色山水 阅读(28) 评论(0) 推荐(0) 编辑
摘要:在 GC 的扫描过程中,由于分步执行,会出现一些已经被扫描过了,被标记为 黑色 black 的对象,再引用到其他新的对象。比如,表 table 就是最容易出现这种情况的。那这种 black 对象再引用其他白色对象,lua是怎么处理的呢? lua gc 使用两种方式解决,一种是 barrier bac 阅读全文
posted @ 2023-08-01 11:11 墨色山水 阅读(20) 评论(0) 推荐(0) 编辑
摘要:前言 虽然平时用到弱表的地方不是很多,但去了解下它的设计实现也是好的。 我们是在标记阶段,才会去触发 propagatemark(),将一个灰色对象标记为黑色,然后再去遍历其引用到的其他对象,将其他对象都 mark gray,并加入灰色链表,如此反复,直到 灰色链表为空,才进入到原子阶段。 /* * 阅读全文
posted @ 2023-07-29 22:42 墨色山水 阅读(34) 评论(0) 推荐(0) 编辑
摘要:对象创建 对于可回收的对象(TString,Table,Udata,Closure,Proto,lua_State),它们的创建流程基本相同,都是调用 luaC_newobj 接口的。举例,我们可以通过观察代码 table 的创建流程,可以得出,每个可回收的对象,都是由一个 GCObject 结构体 阅读全文
posted @ 2023-07-21 17:19 墨色山水 阅读(38) 评论(0) 推荐(0) 编辑
摘要:lua可回收对象 lua从堆中申请内存以及释放,都是通过gc垃圾回收器来管理的。 lua可回收的内存对象有:TString(字符串),Table(表),Udata(用户数据),Closure(分为lua闭包和c闭包),Proto(函数原型),lua_State(线程) /* ** 在 lstate. 阅读全文
posted @ 2023-07-12 16:51 墨色山水 阅读(55) 评论(0) 推荐(1) 编辑
摘要:数据结构 lua 中的 table 存储分为数组部分和哈希表部分。 数组部分就是一块连续的内存,每个元素类型都是 TValue,而哈希表部分,也是采用一块连续的内存块来存储每个节点Node,节点Node包含了key和value,如图: // hash 表中 node 的键数据结构 typedef u 阅读全文
posted @ 2023-06-04 18:13 墨色山水 阅读(37) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示