思路:
目录:
1、虚拟机对象
(1)执行状态机
(2)全局状态机
2、执行状态机的数据栈和调用栈
(1) 数据栈
(2)调用栈
本文内容:
1、lua_state线程对象
(1)lua_state的上下文数据
从 C 层面看待 lua ,lua 的虚拟机对象就是一个lua_state 。 但实际上,真正的 lua虚拟机对象被隐藏起来了。那就是 lstate.h 中定义的结构体 global_State。同一 lua 虚拟机中的所有执行线程,共享了一块全局数据 global_state 。
lua_state 是暴露给用户的数据类型,既表示一个 lua 程序的执行状态,也指代 lua 的一个线程(在官方文档中)。每个线程拥有独立的数据栈以及函数调用栈,还有独立的调试钩子和错误处理设置。所以我们不应当简单的把lua_state 看成一个静态的数据集,它是一个lua 线程的执行状态。所有的lua C API 都是围绕这个状态机:
或把数据压入堆栈,或取出,或执行栈顶的函数,或继续上次被中断的执行过程。
源代码lua5.14版 lstate.h(100行)
lua_State是围绕程序如何执行来设计的,数据栈和调用栈都在其中。
其中:
lua_State 中放的是 lua 虚拟机中的环境表、注册表、运行堆栈、虚拟机的上下文等数据。
从一个主线程(特指 lua 虚拟机中的线程,即 coroutine)中创建出来的新的 lua_State 会共享大部分数据,但会拥有一个独立的运行堆栈。所以一个线程对象拥有一个lua_State。
(ps:lua 的coroutine的使用参考: http://blog.youkuaiyun.com/wusheng520/article/details/7954666)
lua_State共享的数据部分是全局状态机(包含GC的数据).lua_State 的运行堆栈为调用栈,lua_State 的数据栈包含当前调用栈信息。
目录:
1、虚拟机对象
(1)执行状态机
(2)全局状态机
2、执行状态机的数据栈和调用栈
(1) 数据栈
(2)调用栈
本文内容:
1、lua_state线程对象
(1)lua_state的上下文数据
从 C 层面看待 lua ,lua 的虚拟机对象就是一个lua_state 。 但实际上,真正的 lua虚拟机对象被隐藏起来了。那就是 lstate.h 中定义的结构体 global_State。同一 lua 虚拟机中的所有执行线程,共享了一块全局数据 global_state 。
lua_state 是暴露给用户的数据类型,既表示一个 lua 程序的执行状态,也指代 lua 的一个线程(在官方文档中)。每个线程拥有独立的数据栈以及函数调用栈,还有独立的调试钩子和错误处理设置。所以我们不应当简单的把lua_state 看成一个静态的数据集,它是一个lua 线程的执行状态。所有的lua C API 都是围绕这个状态机:
或把数据压入堆栈,或取出,或执行栈顶的函数,或继续上次被中断的执行过程。
源代码lua5.14版 lstate.h(100行)
struct lua_State {
CommonHeader;
lu_byte status;
StkId top; /* first free slot in the stack */
StkId base; /* base of current function */
global_State *l_G;
CallInfo *ci; /* call info for current function */
const Instruction *savedpc; /* `savedpc' of current function */
StkId stack_last; /* last free slot in the stack */
StkId stack; /* stack base */
CallInfo *end_ci; /* points after end of ci array*/
CallInfo *base_ci; /* array of CallInfo's */
int stacksize;
int size_ci; /* size of array `base_ci' */
unsigned short nCcalls; /* number of nested C calls */
unsigned short baseCcalls; /* nested C calls when resuming coroutine */
lu_byte hookmask;
lu_byte allowhook;
int basehookcount;
int hookcount;
lua_Hook hook;
TValue l_gt; /* table of globals */
TValue env; /* temporary place for environments */
GCObject *openupval; /* list of open upvalues in this stack */
GCObject *gclist;
struct lua_longjmp *errorJmp; /* current error recover point */
ptrdiff_t errfunc; /* current error handling function (stack index) */
};
lua_State是围绕程序如何执行来设计的,数据栈和调用栈都在其中。
其中:
/*
** Common Header for all collectable objects (in macro form, to be
** included in other objects)
*/

本文探讨了Lua虚拟机的核心组件lua_State,重点在于线程对象及其结构。lua_State不仅包含了环境表、注册表和运行堆栈,还涉及到线程间的数据共享与独立性。创建新线程时,新lua_State会共享大部分数据,但拥有独立的运行堆栈。文章提到了数据栈扩展、upvalue和调用栈引用的修正,以及CallInfo结构在记录执行函数和处理不定参数中的作用。此外,func字段在调试嵌入式Lua代码时尤为关键,可区分C函数和Lua函数。在lua5.2之后,调用栈优化为双向链表,提高了效率。
最低0.47元/天 解锁文章
4071

被折叠的 条评论
为什么被折叠?



