skynet启动流程
skynet程序只有skynet-src目录,./skynet ./example/config启动
skynet_main.c读取配置文件,设置环境变量,调用skynet_start.c的skynet_start函数
skynet_start函数初始基础服务,调用_start函数启动_timer线程、socket线程、_monitor线程以及配置的多个_worker线程开始工作
skynet运行机制
游戏服务器一般会启动一个socket服务教给gate.so管理,socket服务可以接受外部msg传递到内部服务来处理。
monitor
每次消息派发,都会调用skynet_monitor_trigger,一共调两次,第一次参数source和destination是真实的值,也就是不为0。第二次调是在消息派发完成的时候,source和destination都赋0。
如果第一次trigger调用以后,消息派发迟迟不完成,monitor线程第一次检查,会将check_version的值赋为version。然后monitor线程第二次检查,这个时候version和check_version就会相等,而且这时候destination也不为0,就会进入释放目标服务和打印报警的流程。
timer
skynet中有一个timer线程,每2.5毫秒就更新一下timer中的时间。每次更新都会对一个叫time的计数器做加1操作,所以这个计数器其实可以当作时间来看待,然后对near数组中的定时器进行触发。
1.main函数
main函数是skynet进程的入口点,它需要一个配置文件的路径作为参数。main函数先做一些内存分配工作,然后加载配置文件里的内容。再把配置文件里的内容设置到lua环境变量_ENV。然后从_ENV里读取配置到c配置中。最后调用skynet_start。
2.skynet_start函数
skynet_start函数根据配置确定服务是不是以后台方式启动,然后初始化timer/socket/module/mq这些数据结构,给它们分配内存,填充一些必要的字段。下一步创建和注册日志logger服务,这个logger服务是C层实现的。然后创建注册snax服务,做bootstrap操作。最后调用start函数。
3.start函数
这个函数会启动timer/socket/monitor/worker线程,timer/socket/monitor线程都只有一个,唯独worker线程是多个,在配置文件中以thread=num来配置的。如果配置文件中没有配,就是8个。第个worker线程都有自己的权重值,权重值越大的,给单个服务的时间片越小。
线程都启动完以后,就进入pthread_join,等待线程的终止。所有线程终止以后,skynet就会退出。
参考:
《skynet_summary》
《Skynet框架之菜鸟手册》