Skynet对象关系
一个集群,可以有多个节点
一个节点,对应一个进程,有IP和Port
一个节点,可以有多个服务,一个服务就是一个lua虚拟机
一个节点启动时,会初始化多个调度线程,用于调度多个服务的消息
一个服务接受到一个消息时,会创建一个协程来处理这个消息(co_create)
Skynet消息调度
每个在线客户的客户端,在skynet server上都对应有一个socket与其连接。
一个socket在skynet内部对应一个lua虚拟机和一个客户特定消息队列(per client mq)。当客户特定消息队列中有消息时,该队列就会挂载到全局队列(global message queue)上,供工作线程(worker threads)进行调度处理。
lua虚拟机本身没有多线程支持的,为了实现cpu的摊分,skynet实现上在一个线程运行多个lua虚拟机实例。而同一时间下,调度线程只运行一个服务实例。
Skynet消息处理
每个OS线程上创建一个lua虚拟机(lua_State),虚拟机上可以创建海量的coroutine。由coroutine对信息进行处理。
Lua虚拟机状态是全局的,可被多个协程共享
当调用lua_newstate时,实际上分为两步:
1.创建并初始化一个Lua虚拟机
2.创建一个主线程运行于虚拟机中
当调用lua_newthread时
将在已有Lua虚拟机上,创建另一个协程执行环境
该协程与已有协程共享虚拟机状态