Lua数据结构 — lua_State(六)-阿里云开发者社区

开发者社区> 阿里云柳璃> 正文

Lua数据结构 — lua_State(六)

简介:
+关注继续查看

作者:罗日健

前面各种Lua的数据类型基本都说得差不多了,剩下最后一个数据类型:lua_State,我们可以认为是”脚本上下文”,主要是包括当前脚本环境的运行状态信息,还会有gc相关的信息。

Lua这门语言考虑了多线程的情况,在脚本空间中能够开多个线程相关脚本上下文,而大家会共用一个全局脚本状态数据,如下:

{07047585-760C-4695-95BA-841AC89FDCDA}

全局数据global_state的数据结构如下:

lua-state-structure-2

global_state主要是用于GC的数据链表,下面简要说明几个:

  1. stringtable strt:这个是在TString那章说到的全局字符串哈希表
  2. TValue lregistry:对应LUAREGISTRYINDEX的全局table.
  3. TString *tmname[TM_N]:元方法的名称字符串。
  4. Table *mt[NUM_TAGS]:基本类型的元表,这是Lua5.0的特性。

mt成员在作者介绍文章中说到:

{108CD7B8-529D-442B-AA89-1F11DF5F7F5C}

在上面代码中,我们看到a支持一个tostring的方法,a是数值类型,我们可以为数值类型添加任意的方法。Lua文章中说到一个用途,就是对于unicode和gbk的字符串的len方法能自己实现。

其它成员就不一一介绍了,下面来介绍与线程相关的脚本上下文lua_State:

lua-state-structure-3

我们看到,luaState也带有CommonHeader头,在第一章中也提到了GCObject中有luaState th这个成员,由此可见lua_State也会是被回收的对象之一。

考虑回一个线程中的脚本上下文,我们再来逐个分析每个成员:

  • lu_byte status:线程脚本的状态,线程可选状态如下:

{353A4576-9BEB-481A-AC2F-113C6C521AF5}

  • StkId top:指向当前线程栈的栈顶指针,typedef TValue *StkId
  • StkId base:指向当前函数运行的相对基位置,具体可参考第四章的闭包
  • globalState *lG:指向全局状态的指针
  • CallInfo *ci:当前线程运行的函数调用信息
  • const Instruction *savedpc:函数调用前,记录上一个函数的pc位置
  • StkId stack_last:栈的实际最后一个位置(栈的长度是动态增长的)
  • StkId stack:栈底
  • CallInfo *end_ci:指向函数调用栈的栈顶
  • CallInfo *base_ci:指向函数调用栈的栈底
  • int stacksize:栈的大小
  • int size_ci:函数调用栈的大小
  • unsigned short nCcalls:当前C函数的调用的深度
  • unsigned short baseCcalls:用于记录每个线程状态的C函数调用深度的辅助成员
  • lu_byte hookmask:支持哪些hook能力,有下列可选的

{6F74D90F-5EA3-48C7-BD44-D49B0877347E}

  • lu_byte allowhook:是否允许hook
  • int basehookcount:用户设置的执行指令数(LUA_MASKCOUNT下有效)
  • int hookcount:运行时,跑了多少条指令(LUA_MASKCOUNT下有效)
  • lua_Hook:用户注册的hook回调函数
  • TValue l_gt:当前线程的全局的环境表
  • TValue env:当前运行的环境表
  • GCObject *openupval、gclist:用于gc,详细将会在GC一章细说
  • struct lua_longjmp *errorJmp:发生错误的长跳转位置,用于记录当函数发生错误时跳转出去的位置。

{7F9C25D3-C648-4F78-9B5D-CBA7169B9F79}

 

本系列总结:

整个系列文章回答了我们对Lua中最基本的一个问题:“一个Lua变量究竟是什么?”。由此我们深入并引申出各种知识,在脚本中我们觉得弱类型变量用起来很痛快,而其实它的内部实现其实是如此的复杂。

对于实现一门脚本语言,必须实现的是解释器、虚拟机、上下文数据3大部分:

{2CC92087-0020-40B4-9403-7DB0D5F97BCC}

上下文数据这一层是脚本最基础,最底层的东西,它决定了这门脚本究竟能做什么。抛开解释器和虚拟机,我们依然可以单纯地通过C接口,在C++这一层就能操作脚本的上下文数据。

有空再研究一下Lua的GC,解释器等等。

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《社会调查数据管理——基于Stata 14管理CGSS数据》一导读
社会调查数据管理——基于Stata 14管理CGSS数据 这是一本关于社会调查数据管理的实务操作手册,以国内第一个、综合性、长期性的调查数据——中国综合社会调查(CGSS)数据的管理为例,基于最新版的Stata 14软件,全面讲解了一个社会调查数据管理的完整周期,重点演示了社会调查数据管理工作中的重点和难点。
1797 0
软考之路--数据结构之线性表
        数据就是数值,也就是我们通过观察、实验或计算得出的结果。数据有很多种,最简单的就是数字。数据也可以是文字、图像、声音等。数据可以用于科学研究、设计、查证等。
894 0
redis数据结构、持久化、缓存淘汰策略
redis数据结构、持久化、缓存淘汰策略Redis 单线程高性能,它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题。redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。
904 0
八,ESP8266 文件保存数据(基于Lua脚本语言)
应该是LUA介绍8266的最后一篇,,,,,,下回是直接用SDK,,然后再列个12345.......不过要等一两个星期,先忙完朋友的事情 前面几篇 用AT指令版本的 一,  http://www.cnblogs.
1275 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7787 0
图的单源最短路径,Floyd算法(数据结构c++)
这个算法结构很是简单,但是理解还是有一定的困难,一开始做的时候想不明白,跟着算法自己动手画画就知道这个算法具体是怎么回事了。 时间复杂度是O(N*3) 算法有点动态规划的意思,有两个数组,一个(dis[])是记录俩顶点之间的最短路径的长度的,一个[path]数组是记录俩结点的中间结点的。
729 0
"数据结构翻转课堂"答疑实录——链表
【说明】 本文是《数据结构》翻转课堂在线答疑的实录,由云班课的“答疑/讨论”功能中导出数据整理而成。
1034 0
【流数据与大屏DataV】如何使用DTS,Datahub,StreamCompute,RDS及DataV搭建流数据大屏
本文主要从数字化大屏的价值及实现两方面阐述了数字化大屏的制作过程。
3200 0
282
文章
25
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载