git clone git@github.com:tmate-io/tmate-ssh-server.git cd tmate-ssh-server ./create_keys.sh
会在当前目录生成 keys 目录,并且会得到如下的输出,这些可以先记录下来,后续会用到。
1 2 3 4
set -g tmate-server-host localhost set -g tmate-server-port 22 set -g tmate-server-rsa-fingerprint SHA256:JOhvYoiBO0kVltwqKHTgKVCfvyajWV/cGwNXSyTNRcE set -g tmate-server-ed25519-fingerprint SHA256:+N/UZ8BNfTVNoOQjH4yEe0GoTFpapu/I0G4c6RI7HWo
配置 .tmate.conf 把客户端部署第一步的输出,写入到本机的 ~/.tmate.conf 文件。注意其中的 host 和 port 需要改成自助部署的,比如我这里是这样的:
1 2 3 4
set -g tmate-server-host tmate.uncledou.site set -g tmate-server-port 8022 set -g tmate-server-rsa-fingerprint SHA256:JOhvYoiBO0kVltwqKHTgKVCfvyajWV/cGwNXSyTNRcE set -g tmate-server-ed25519-fingerprint SHA256:+N/UZ8BNfTVNoOQjH4yEe0GoTFpapu/I0G4c6RI7HWo
开始飞吧
至此 tmate 客户端就安装配置好了,执行 tmate 命令就可以得到类似的输出:
1 2 3 4 5 6 7 8
Tip: if you wish to use tmate only for remote access, run: tmate -F [0/0] To see the following messages again, run in a tmate session: tmate show-messages Press <q> or <ctrl-c> to continue --------------------------------------------------------------------- Connecting to tmate.uncledou.site... Note: clear your terminal before sharing readonly access ssh session read only: ssh -p8022 ro-RyrBkE6v5rAhpqP6FN6mCWgm2@tmate.uncledou.site ssh session: ssh -p8022 XtydPFjTpbaz8eXxB77RGZeNZ@tmate.uncledou.site
Lua 虚拟机的实现中,有这样一个 for (;;) 无限循环(在 luaV_execute 函数中)。 其核心工作跟物理 CPU 类似,读取 pc 地址的字节码(同时 pc 地址 +1),解析操作指令,然后根据操作指令,以及对应的操作数,执行字节码。 例如上面我们解释过的 MOVE 字节码指令,也就是在这个循环中执行的。其他的字节码指令,也是类似的套路来完成执行的。
pc 指针也只是一个 Lua 虚拟机位置的内存地址,并不是物理 CPU 中的 pc 寄存器。
函数
几个基本点:
Lua 函数,可以简单的理解为一堆字节码的集合。
Lua 虚拟机里,也有栈帧的,每个栈帧实际就是一个 C struct 描述的内存结构体。
执行一个 Lua 函数,也就是执行其对应的字节码。
总结
Lua 这种带虚拟机的语言,逻辑上跟物理 CPU 是很类似的。生成字节码,然后由虚拟机来具体执行字节码。
只是多了一层抽象虚拟,字节码解释执行的效率,是比不过机器指令的。
物理内存的读写速度,比物理寄存器要慢几倍甚至几百倍(取决于是否命中 CPU cache)。 所以 Lua 的虚拟寄存器读写,也是比真实寄存器读写要慢很多的。
首先对于 CPU 而言,肯定是多了一个内存读取的操作。但是多了这么一个操作,应该不至于产生数量级的性能差异的。 LuaJIT 是单线程的,读写内存应该是在操作 “独享” 的 CPU cache,这个还是很快的。 而且原来也是有一个写内存操作的,如果是提升了一倍,还是可以理解的,有这么大的差距应该还是另有原因。