《Lua程序设计》-- 学习11

反射(Re fl ection)

反射是程序用来检查和修改其自身某些部分的能力

调试库由两类函数组成:自省函数(introspective function)钩子(hook)。自省函数允许我们检查一个正在运行中的程序的几个方面,例如活动函数的栈、当前正在执行的代码行、局部变量的名称和值。钩子则允许我们跟踪一个程序的执行。

虽然名字里带有“调试”的字眼,但调试库提供的并不是Lua语言的调试器(debugger)。不过,调试库提供了编写我们自己的调试器所需要的不同层次的所有底层机制。

自省机制(Introspective Facility)

调试库中主要的自省函数是getinfo,该函数的第一个参数可以是一个函数或一个栈层次。当为某个函数foo调用debug.getinfo(foo)时,该函数会返回一个包含与该函数有关的一些数据的表。这个表可能具有以下字段。

钩子(Hook)

调试库中的钩子机制允许用户注册一个钩子函数,这个钩子函数会在程序运行中某个特定事件发生时被调用。

有四种事件能够触发一个钩子:

•每当调用一个函数时产生的call事件;

•每当函数返回时产生的return事件;

•每当开始执行一行新代码时产生的line事件;

•执行完指定数量的指令后产生的count事件。(这里的指令指的是内部操作码,在16.2节中对其有简单的描述。)

调优(Profile)

除了调试,反射的另外一个常见用法是用于调优,即程序使用资源的行为分析

沙盒(Sandbox)

利用函数load在受限的环境中运行Lua代码是非常简单的。由于Lua语言通过库函数完成所有与外部世界的通信,因此一旦移除了这些函数也就排除了一个脚本能够影响外部环境的可能。不过尽管如此,我们仍然可能会被消耗大量CPU时间或内存的脚本进行拒绝服务(DoS)攻击。反射,以调试钩子的形式,提供了一种避免这种攻击的有趣方式。

首先,我们使用count事件钩子来限制一段代码能够执行的指令数。示例展示了一个在沙盒中运行指定文件的程序。

这个程序加载了指定的文件,设置了钩子,然后运行文件。该程序把钩子设置为监听count事件,使得Lua语言每执行100条指令就调用一次钩子函数。钩子(函数step)只是递增一个计数器,然后检查其是否超过了某个固定的限制

我们还必须限制所加载的代码段的大小:一段很长的代码只要被加载就可能耗尽内存

使用协程实现多线程

协程能够实现一种协作式多线程(collaborative multithreading)。每个协程都等价于一个线程。一对yield–resume可以将执行权在不同线程之间切换。不过,与普通的多线程的不同,协程是非抢占的。当一个协程正在运行时,是无法从外部停止它的。只有当协程显式地要求时(通过调用函数yield)它才会挂起执行。对于有些应用而言,这并没有问题,而对于另外一些应用则不行。当不存在抢占时,编程简单得多。由于在程序中所有的线程间同步都是显式的,所以我们无须为线程同步问题抓狂,只需要确保一个协程只在它的临界区(critical region)之外调用yield即可。

不过,对于非抢占式多线程来说,只要有一个线程调用了阻塞操作,整个程序在该操作完成前都会阻塞。对于很多应用程序来说,这种行为是无法接受的,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/371913.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【实训】网络系统集成课程实训(vlan、vrrp、nat)

目录 一 实训概述 1.1 实训目的 1.2 实训内容 二 实训原理 2.1 VLAN间划分及VLAN间通信 2.2 BGP,边界网关协议 BGP是运行于 TCP 上的一种自治系统的路由协议,用于在AS之间实现路由信息的交互。 2.2.1 VRRP原理 2.2.2 OSPF配置 三.实训…

docker重建镜像

DockerFile如下: FROM k8s-registry.qhtx.local/base/centos7-jdk8-haitong0704RUN yum -y update && yum install -y python3-devel && yum install -y python36 RUN mv /usr/bin/python /usr/bin/python_old RUN ln -s /usr/bin/python3 /usr/bi…

我用JVS低代码平台,搭建了一套固定资产管理系统

随着企业规模的不断扩大和业务的快速发展,资产管理成为了企业运营中的重要环节。然而,传统的手工管理模式已经无法满足现代企业的需求,管理效率低下、信息不准确、流程不规范等问题逐渐凸显。为了解决这些问题,越来越多的企业开始…

将xyz格式的GRACE数据转成geotiff格式

我们需要将xyz格式的文件转成geotiff便于成图,或者geotiff转成xyz用于数据运算,下面介绍如何实现这一操作,采用GMT和matlab两种方法。 1.GMT转换 我们先准备一个xyz文件,这里是一个降水文件。在gmt中采用以下的语句实现xyz转grd…

Java栈和队列

🐵本文章将对栈相关知识进行讲解 一、什么是栈 栈是一种特殊的线性表,向栈中放入元素的次序是由栈底到栈顶依次放入,被称为入栈或压栈,从栈中出元素时只能从栈顶出,被称为出栈。即栈要求元素“先进后出” 下面给一道经…

Vivado-IP核

Vivado-IP核 主程序 timescale 1ns / 1ps ////module ip_clk_wiz(input sys_clk,input sys_rst_n,output clk_out1,output clk_out2,output clk_out3,output clk_out4,output locked);clk_wiz_0 instance_name(// Clock out ports.clk_out1(clk_out1), // output clk_out…

ywtool login guard命令

一.登录防护功能介绍 登录防护功能主要检查系统日志/var/log/secure,查看系统有没有被暴力登录。登录防护默认是检测3分钟内登录系统失败15次(次数可修改)后,视其为有攻击性,拉黑此IP(centos7通过系统文件阻止IP,centos8/9通过防火墙阻止IP)。此脚本只针对SSH访问,…

layui

基于复杂结构的自定义模版相关介绍 我这里的接口给的格式数据 我这里搜索往返时候要显示成这样的 layui.use([table,form], function(){ var table layui.table; var form layui.form;// 渲染表格 table.render({ elem: #test-table-reload,toolbar: #toolbarDemo, …

【Python基础】seaborn 使用指南(超详细!)

文章目录 seaborn1 seaborn简介1.1 主要特征:1.2 seaborn主要内容 2 seaborn基本设置2.1 图表大小:context2.2 设置风格2.3 设置字体与支持中文2.4 设置临时风格2.5 设置调色板2.6 set方法 3 调色板3.1 分类色板(qualitative)3.2 …

3.0 Hadoop 概念

本章着重介绍 Hadoop 中的概念和组成部分,属于理论章节。如果你比较着急可以跳过。但作者不建议跳过,因为它与后面的章节息息相关。 Hadoop 整体设计 Hadoop 框架是用于计算机集群大数据处理的框架,所以它必须是一个可以部署在多台计算机上…

chisel RegInit/UInt/U

val reg RegInit(0.U(8.W)) //ok val reg RegInit(0.UInt(8.W)) //errU 使用在数字 . 后边50.U UInt 使用在IO(new Bundle val a Input(UInt(8.W)) 或者 def counter(max:UInt, a1:UInt) package emptyimport chisel3._ import chisel3.util._class MyCounter extends …

Java技术栈 —— Hive与HBase

Java技术栈 —— Hive与HBase 一、 什么是Hive与HBase二、如何使用Hive与HBase?2.1 Hive2.1.1 安装2.1.2 使用2.1.2.1 使用前准备2.1.2.2 开始使用hive 2.2 HBase2.2.1 安装2.2.2 使用 三、Apache基金会 一、 什么是Hive与HBase 见参考文章。 一、参考文章或视频链…

神经网络激活函数到底是什么?

激活函数 其实不是很难啦,归结一下就是大概这样几个分类,详情请参考【神经网络】大白话直观理解!_哔哩哔哩_bilibili神经网络就是干这个事的~ 如果队伍不长,一个ykxb就可以了,如果 如果 队伍太长 就加一个激活函数也…

C语言函数递归详解

递归是什么&#xff1f; 递归&#xff0c;顾名思义&#xff0c;就是递推和回归。 递归是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 #include <stdio.h> int main() {printf("hehe\n");main();//main函数中⼜调⽤了main…

C++ 调用lua 脚本

需求&#xff1a; 使用Qt/C 调用 lua 脚本 扩展原有功能。 步骤&#xff1a; 1&#xff0c;工程中引入 头文件&#xff0c;库文件。lua二进制下载地址&#xff08;Lua Binaries&#xff09; 2&#xff0c; 调用脚本内函数。 这里调用lua 脚本中的process函数&#xff0c;并…

FFMPEG推流到B站直播

0、参考 ffmpeg安装参考小弟另外的一个博客&#xff1a;FFmpeg和rtsp服务器搭建视频直播流服务-CSDN博客推流参考&#xff1a;用ffmpeg 做24小时推流直播_哔哩哔哩_bilibili 一、获取b站直播码 点击开始直播后&#xff0c;会出现以下的画面 二、ffmpeg进行直播推流 ffmpeg -r…

const

当我们在c语言中碰到这么一种情况&#xff1a;我们现在有一个变量&#xff0c; 这个变量呢&#xff0c;我们指向访问它&#xff0c; 但不会修改它。但是又担心在后续的代码中不小心将它修改&#xff0c; 这种情况该怎么做呢&#xff1f;这种情况下可以使用const. 被const修饰的…

全套电气自动化样例图纸分享,使用SuperWorks自动化版免费设计软件!

今天给大家分享一套完备的电气自动化样例图纸&#xff0c;结构准确、内容清晰&#xff0c;适合初学者入门操作练习。 整套图纸包含图纸目录、原理图、端子列表、连接列表、元件列表、接线图&#xff0c;具有较高的参考价值&#xff0c;请大家点击自行下载文件&#xff01; 1e8…

springcloud-gateway升级版本allowedOrigins要改allowedOriginPatterns

前言 报错: java.lang.IllegalArgumentException: When allowCredentials is true,allowedOrigins cannot contain the special value "*"since that cannot be set on the "Access-Control-Allow-Origin"response header. To allow credentials to a se…

如何让虚拟机拥有愉快网络环境,vmware,ubuntu,centos

博客原文 文章目录 前言拥有愉快网络环境步骤:测试网关连接 Ubuntu修改 http 与 sock 代理地址修改 /etc/resolv.conf配置 apt 使用代理测试连接 Centos设置代理地址修改 NetworkManager最后重启网卡&#xff1a;测试代理 前言 相信计算机专业的同学在学习 linux 时, 一定会被无…