最近几天又看了下skynet,C核心部分的实现代码变化很小,主要是还没有完全理解lua部分。其实看skynet不必太纠结与C部分,看lua部分就可以了,理解skynet所做的事情,好好阅读wiki。
skynet-src
malloc_hook.c .h skynet C部分使用malloc free realloc calloc 内存分配的hook,默认使用jemalloc内存池,方便做内存分配统计等。
rwlock.h 使用原子操作封装的读写锁
skynet.h skynet核心api以及内部的消息类型
skynet_daemon.c .h skynet作为守护进程运行,pid会写入到文件中并且不会重复启动skynet进程同台机器。
skynet_env.c .h skynet和lua的交互设置lua_newstate 保存了skynet配置等都保存在lua_State中,skynet_env数据结构就是一个lua_State。
skynet_error.c skynet_error()函数,用于skynet错误日志的记录。
skynet_handle.c .c skynet服务的管理,服务器的name和handle_id构成一个handle,存储handle与skynet_context的对应关系,是一个哈希表每个服务skynet_context都对应一个不重复的handle通过handle便可获取skynet_context保存了 handle 和 skynet_context的对应代码注释
skynet_harbor.c/.h harbor 用来与远程主机通信 master 统一来管理skynet的设计综述讲述了 session和 type的作用主要用于skynet集群 harbor已服务器的形式加载,符合skynet服务的接口。
skynet_imp.h skynet的配置数据结构
skynet_log.c/.h skynet日志的输出函数
skynet_main.c skynet main()函数 启动部分,涉及了配置文件的加载和与lua栈交互的代码等。配置文件的wiki。
skynet_malloc.h skynet内部使用的内存分配函数
skynet_module.c/.h *.so模块既服务的加载
skynet_monitor.c/.h skynet内部的驱动模块,比如有消息了唤醒线程来处理。
skynet_mq.c/.h skynet的二级消息队列
skynet_server.c/.h skynet 主要功能 加载服务和通知服务一个模块(.so)加载到skynet框架中,创建出来的一个实例就是一个服务,为每个服务分配一个skynet_context结构 每一个服务对应的 skynet_ctx 结构各个服务间消息分发的核心实现
skynet_socket.c/.h 网络部分处理网络消息
skynet_start.c skynet启动部分的初始化,包括创建线程等。创建了logger服务以及bootstrap服务(boostrap服务用于后面加载lua的服务)。
skynet_timer.c/.h skynet定时器的实现,linux内核分级链表的实现。
socket_epoll.h socket_kqueue.h socket_poll.h socket_server.h/.c 网络部分的实现 不支持windows
service-src
databuffer.h 数据缓存池数据结构
hashid.h hashid池
service_gate.c gate负责skynet和客户端的连接,维护连接池等。
service_harbor.c harbor负责skynet节点间的通信。
service_logger.c logger服务写日志到文件或者stdout。
service_snlua.c lua服务的加载
lualib-src(lua库的C实现,既C语言实现的lua库。建议先阅读lua的C交互接口就可以理解这部分代码了。)
sproto/ sproto通信协议相关的代码,暂且不看。看上去挺简单的后面可以再看看。
lsha1.c sha1加密算法的实现
lua-bson.c lua bson协议的算法实现
lua-clientsocket.c lua 客户端socket的实现
lua-cluster.c (require "cluster_core") 集群打包解包的实现 格式如下:
1
2
3
4
5
6
7
8
|
uint32_t/string addr
uint32_t/session session
lightuserdata msg
uint32_t sz
return
string request
uint32_t next_session
|
lua-crypt.c hmac sha1 base64等加密算法的实现。
lua-memory.c skynet内存的使用情况,C实现供lua调用。
lua-mongo.c mongodb的lua驱动
lua-multicast.c multicast的实现
lua-netpack.c 网络打包部分的实现,这里有一个消息的发送队列和未完成消息的队列。
lua-profile.c 没看懂这个
lua-seri.c/.h lua打包 解包函数的封装里面包含了读写缓冲区。
lua-sharedata.c 用于skynet同一进程内共享数据。wiki
lua-skynet.c skynet.core lib的实现。
lua-socket.c lua socket接口的封装
lua-stm.c stm模块用于同一进程内不同服务间的数据共享。
lua-mysqlaux.c mysql驱动的辅助
Makefile
service-src和lualib-src目录下面的文件会编译成对应的.so文件,作为skynet解析C服务和lua调用C实现的lib。
lualib(这个文件夹下主要是skynet lua层的实现, 调用了C层实现的lib(*.so))。
http/ http协议的实现模块
sharedata/ 共享数据模块的实现
skynet/
snax/ 用于加载lua服务 wiki
service/ (lua服务没怎么看懂改天接着看。再看看skynet wiki和forthxu写的talkbox案列基本就懂了。。)