lua中的另一个高级功能是coroutine(协程),协同式多线程的意思,不同于线程和进程,协程仅在显示的调用一个让出(yield)函数时才会挂起当前的执行,同一时间内只有一个协程正在运行,非抢占式的。
lua学习之元表和元方法
学习lua也有大概一年了,对lua的一些基本的语法很熟练了,也做了一些简单的业务,但是对于lua的高级特性还是不是很熟,最近有时间得以系统的学习学习。本文主要讲述的是lua高级特性之一的元表和元方法。
文字简述
metatable(元表) 本质上来讲元表也是一个表,不过这个表是用来定义对lua的值进行自定义运算行为的地方。
metamethod(元方法) 本质上来讲就是一个lua函数,不过这个函数是用来绑定lua中特定的值,这些特定的值可以称为事件。这个函数我们可以进行我们一些自定义的操作。
元表之中的事件其实是一些定义的值,这些值后面会讲到;
实际上我们只能对lua中table类型的值进行修改元表和元方法的操作,其它的一些例如number, string等都已经有自己内置的元表和元方法,且不可改变。通过元表和元方法,我们可以实现lua的面向对象编程。
tcp建立连接为什么需要三次握手
前言
- 众所周知tcp传输层协议在建立连接的时候需要三次才能建立起一个真正的可靠连接,可是为什么是三次呢,不可以是两次,四次等等呢,可以自己思考一番,带着疑问可以看下文。
三次握手
- 在《计算机网络》一书中其中有提到,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是:一端(client)A发出去的第一个连接请求报文并没有丢失,而是因为某些未知的原因在某个网络节点上发生滞留,导致延迟到连接释放以后的某个时间才到达另一端(server)B。本来这是一个早已失效的报文段,但是B收到此失效的报文之后,会误认为是A再次发出的一个新的连接请求,于是B端就向A又发出确认报文,表示同意建立连接。如果不采用“三次握手”,那么只要B端发出确认报文就会认为新的连接已经建立了,但是A端并没有发出建立连接的请求,因此不会去向B端发送数据,B端没有收到数据就会一直等待,这样B端就会白白浪费掉很多资源。如果采用“三次握手”的话就不会出现这种情况,B端收到一个过时失效的报文段之后,向A端发出确认,此时A并没有要求建立连接,所以就不会向B端发送确认,这个时候B端也能够知道连接没有建立。
安装systemmap生成openresty的火焰图
SystemTap
简单介绍
- systemtap是一个诊断linux系统性能和功能问题的开源软件,并且允许开发人员编写和重用简单的脚本深入探查linux系统的活动,可以快速安全的提取过滤总结数据,以便能够诊断复杂的性能或功能问题。
- 基本思想是name events(命名事件),并给它们处理程序。每当事件发生的时候,linux内核运行处理程序,就像一个子程序一样,之后恢复。处理程序是一系列的脚本语言,用于指定事件完成时要完成的工作,这种工作通常包括是提取数据,打印结果等。
- systemtap通过将脚本装换成C,运行系统的时候创建一个内核模块,当模块加在的时候,它通过挂载到内核的钩子来激活所有的探测事件。最后,这次事件结束的时候,挂载的钩子断开连接,移除模块。
关于nginx缓存配置指令用法详解
nginx简介
众所周知nginx近些年在服务器领域占据着很重要的作用,目前我主要接触的关于nginx是作为代理服务器来用的,至于再详细的,有兴趣的可以查阅相关文档nginx,就不在这里赘述。本文主要讲述的是把nginx配置成一个缓存服务器组件来用,尽可能详细的把nginx关于缓存的指令解释清楚。