skynet源码分析(12)--skynet中的启动过程

作者:[email protected],转载请注明作者

这一篇是核心底层代码分析的最后一篇,前面11篇已经基本把底层代码分析完了。剩下的内容是多线程,锁,内存分配等系统相关的内容,也没什么可分析的。因为这些都很直观,很简明。基本上都是系统调用封装了一下。

本篇要分析的是skynet整个启动过程,包括配置读取,各个线程的创建,服务初始化,服务的启动,服务注册,服务的名字,消息队列,消息处理回调注册。算是一个总结性的分析,所以不会贴大量代码。主要是以流程的方式来讲解整个启动过程做了什么。

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源码分析(12)--skynet中的启动过程)