源码学习
文章平均质量分 72
游戏猫
多年游戏开发经验,在这里分享经验和心得
展开
-
lua5.1.3源码分析之GC
一、概述lua实现了对象间的引用管理,在对象不被其他对象应用时,自动释放对象的内存。二、lua对象类型和数据结构1、哪些类型需要GClua的基本类型包括nil、boolean、number、lightuserdata、string、table、function、userdata、thread九种数据类型,另外还有proto、upvalue两种内部类型。其中string、table、function、userdata、thread、proto、upvalue是引用类型,可以被其他多个对象同时引用,需原创 2022-02-28 02:17:06 · 617 阅读 · 0 评论 -
Lua5.1.5源码分析之table实现
一、概述table实现了一个hash表功能,能否方便按key-value来存储数据。lua的table表功能非常强大,key、value的类型可以是number、boolean、string、table、userdata等。二、实现数据结构table的数据结构主要包括一个哈希表和一个数组。具体的结构定义如下图:查询和插入流程查询和插入会判定key的类型,按不同的类型有不同的处理nil:返回nilint:值小于Table.array数组的长度,返回array里的值,否则当成dou原创 2022-02-17 04:00:57 · 1035 阅读 · 0 评论 -
Lua5.1.5源码分析之string实现
一、概述string是Lua的一种数据类型,它不同于普通的基本类型,为了节约内存,多个相同的字符串会共用一个,因而需要管理string的引用情况,从而实现在不被用时,能正确GC。二、实现细节1、string数据类型定义string在Lua运行时里的数据结构是TString。具体的定义如下。如上图,TString可以认为是一个GCObject的派生类(实际不是,只是有GCObject相同的数据成员)。主要记录了string的hash值,长度,字符串值等。3、字符串管理存储结构所有的短字符原创 2022-02-15 03:36:58 · 511 阅读 · 0 评论 -
Lua5.3.6源码分析之string实现
一、概述string是Lua的一种数据类型,它不同于普通的基本类型,为了节约内存,多个相同的短字符串会共用一个,因而需要管理string的引用情况,从而实现在不被用时,能正确GC。二、实现细节1、字符串分类Lua为了节省内存,Lua的字符串分为短字符串和长字符串。短字符串: 长度小于等于40为短字符串。相同字符的短字符串是共用同一个的。长字符串: 长度大于40为长字符串。相同的两个长字符串是两个独立的字符串。2、string数据类型定义string在Lua运行时里的数据结构是TString。原创 2022-02-13 02:46:43 · 991 阅读 · 0 评论 -
libevent源码分析之时间管理和定时器
一、概述libevent提供了高性能定时器的功能,方便执行延迟回调逻辑。二、基本实现原理在添加事件监听的时候,可以不指定fd和监听的事件,指定超时的时间,实现定时器功能。定时器的底层实现包含两个部分:最小堆:按事件的超时时间构造,超时时间最早的在堆顶。通用超时队列:这个可以个性化设置每个队列的超时时间,添加事件时时间相同的放到同一个队列里,在最小堆里只添加一个队列首部的事件到最小堆。能避免大量事件都放到最小堆,导致最小堆添加、删除时性能变差的问题。三、最小堆实现最小堆的实现采用了典型的数原创 2021-01-25 01:32:37 · 682 阅读 · 0 评论 -
libevent源码分析之IO多路复用
一、IO多路复用概念IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞,挂起线程,直到阻塞超时。二、libevent的IO多路复用应用libevent支持多种IO多路复用机制,保障了跨平台和性能。支持的IO多路复用包括:机制平台selectunix、linuxwin32selectwinpollunix、linuxepollunix、linuxkqu原创 2021-01-24 18:50:12 · 428 阅读 · 1 评论 -
libevent源码分析之Reactor模式
一、概述libevent使用了Reactor模式,实现了高效的事件驱动机制。二、Reactor定义1、Reactor是一种事件驱动机制。应用程序不是主动的调用某个系统API完成处理,Reactor逆置了事件处理流程,应用程序注册回调函数到Reactor上,如果相应的事件(比如读、写、错误)发生,Reactor将回调应用程序注册的接口。2、Reactor结构五个关键的参与者:描述符(handle):由操作系统提供,用来识别每一个事件,如socket描述符、文件描述符等。同步事件分离器(demul原创 2021-01-23 18:03:44 · 506 阅读 · 1 评论 -
libevent源码分析之目录结构说明
一、概述1、目录分类:头文件:分为提供给外部使用的头文件和内部使用的头文件。reactor框架:包括事件的定义、事件的监听和触发、定时器功能。io多路复用封装:包括select、poll、epoll、iocp、kqueue等。socket、收发缓冲区封装:网络缓冲区evbuffer实现,bufferevent管理了socket和网络缓冲区。基础数据结构:链表、最小堆、红黑树、哈希表等。dns、http库:基于libevent实现。其他:辅助功能函数、日志。2、具体文件说明1)原创 2021-01-17 07:47:20 · 260 阅读 · 0 评论 -
libevent源码分析之概述
一、libevent特性libevent是一个轻量级的开源高性能网络库,应用广泛。比如大家比较熟悉的memcached、chrome等。Libevent具有以下优点:事件驱动,高性能轻量级,专注于网络跨平台,在主流操作系统上都能运行。可扩展性,考虑各种使用的情景,提供良好的性能。方便可靠,只需要调用少量的libevent接口就能使用很好地使用libevent库。二、libevent主要功能libevent采用了Reactor反应堆模式。具备reactor模式响应快、编程简单、可扩展、原创 2021-01-11 03:09:49 · 435 阅读 · 0 评论