Skynet源码解析:启动流程与核心组件
作者:海底来的沙3 | 来源:互联网 | 2024-11-25 16:23
本文详细解析Skynet的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如timer、socket、monitor和worker线程),以及消息队列的实现机制。
### Skynet 启动流程
Skynet 是一个轻量级的游戏服务器框架,其启动过程主要涉及以下几个步骤:
1. **读取配置文件**:Skynet 只有一个 `skynet-src` 目录,通过 `./skynet ./example/config` 命令启动。`skynet_main.c` 文件负责读取配置文件,并设置环境变量。
2. **初始化环境**:读取配置文件后,`skynet_start.c` 中的 `skynet_start` 函数会被调用,用于初始化基础服务,包括 timer、socket、module 和 mq 等数据结构。
3. **启动线程**:`skynet_start` 函数会调用 `_start` 函数,启动 timer 线程、socket 线程、monitor 线程以及多个 worker 线程。worker 线程的数量可以在配置文件中指定,默认为 8 个。
### Skynet 运行机制
Skynet 的核心在于其消息队列机制。每个服务都需要设置一个 callback 函数,用于处理接收到的消息。消息会被压入该服务的消息队列中,由 worker 线程从全局队列中取出并处理。
#### Socket 服务
游戏服务器通常会启动一个 socket 服务,交给 `gate.so` 管理。socket 服务可以接收外部消息并传递给内部服务进行处理。
### Monitor 机制
Skynet 的监控机制相对简单,主要通过 `skynet_monitor.c` 和 `skynet_monitor.h` 实现。当服务可能陷入死循环时,会记录一条日志。每次消息派发时,会调用 `skynet_monitor_trigger` 函数两次,分别在消息派发前和派发后。
### Timer 机制
Skynet 的定时器功能在游戏开发中非常常用。其核心实现在 `skynet-timer.c` 和 `skynet-timer.h` 中。定时器分为两个部分存储:一部分在 `near` 数组中,另一部分在二维数组中,分为四个级别。每 2.5 毫秒,timer 线程会更新一次时间,并触发相应的定时器事件。
### 主要函数解析
1. **main 函数**:作为 Skynet 进程的入口点,`main` 函数需要一个配置文件路径作为参数。它先进行内存分配,加载配置文件内容,设置环境变量,然后调用 `skynet_start` 函数。
2. **skynet_start 函数**:根据配置确定服务是否以后台方式启动,初始化 timer、socket、module 和 mq 数据结构,创建和注册日志 logger 服务,最后调用 `start` 函数。
3. **start 函数**:启动 timer、socket、monitor 和 worker 线程。所有线程启动完成后,进入 `pthread_join` 等待线程终止。
### 消息队列实现
消息队列是 Skynet 的核心功能之一,其实现细节如下:
```cpp
#define SKYNET_MESSAGE_QUEUE_H
#include
#include
// 消息结构体
struct skynet_message {
uint32_t source; // 消息来源
int session; // 会话标识
void *data; // 消息体
size_t sz; // 消息长度
};
// 全局消息队列
struct global_queue {
struct message_queue *head; // 链表头
struct message_queue *tail; // 链表尾
struct spinlock lock; // 自旋锁
};
// 创建消息队列
struct message_queue *skynet_mq_create(uint32_t handle);
// 消息入队
void skynet_mq_push(struct message_queue *q, struct skynet_message *message);
// 消息出队
int skynet_mq_pop(struct message_queue *q, struct skynet_message *message);
// 获取队列长度
int skynet_mq_length(struct message_queue *q);
// 扩展队列
static void expand_queue(struct message_queue *q);
// 初始化全局队列
void skynet_mq_init();
```
### 总结
通过上述分析,可以看出 Skynet 的消息队列机制非常高效且灵活。全局消息队列采用链表实现,而服务消息队列则使用循环数组,支持动态扩展。这种设计使得 Skynet 能够高效地处理大量并发请求。
### 推荐资源
如果你对 Skynet 项目感兴趣,推荐参加一个实战训练营,内容涵盖多核并发编程、消息队列、线程池、actor 消息调度、网络模块实现、时间轮定时器、Lua/C 接口编程等。更多资料可加入 QQ 群:832218493 免费领取。
推荐阅读
-
本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ...
[详细]
蜡笔小新 2024-12-27 16:07:12
-
本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ...
[详细]
蜡笔小新 2024-12-27 11:26:39
-
-
实体映射最强工具类:MapStruct真香 ...
[详细]
蜡笔小新 2024-12-25 16:22:17
-
中间件是插入到应用程序请求处理管道中的组件,用于处理传入的HTTP请求和响应。它在ASP.NET Core中扮演着至关重要的角色,能够灵活地扩展和自定义应用程序的行为。 ...
[详细]
蜡笔小新 2024-12-22 19:29:43
-
本文详细介绍了Spring Security的核心机制,包括其作为一系列过滤器的工作原理,如何实现用户认证与授权,以及常见的配置方法和高级特性如CSRF防护。 ...
[详细]
蜡笔小新 2024-12-17 02:05:32
-
本文详细介绍了如何通过修改Lua源码或使用动态链接库(DLL)的方式实现Lua与C++之间的高级交互,包括如何编译Lua源码、添加自定义API以及在C++中加载和调用Lua脚本。 ...
[详细]
蜡笔小新 2024-12-11 20:42:15
-
OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ...
[详细]
蜡笔小新 2024-12-03 12:06:08
-
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
-
本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ...
[详细]
蜡笔小新 2024-12-27 18:51:49
-
本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ...
[详细]
蜡笔小新 2024-12-27 15:06:12
-
本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ...
[详细]
蜡笔小新 2024-12-26 17:34:42
-
本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ...
[详细]
蜡笔小新 2024-12-25 11:31:48
-
网络拓扑如下:组网情况:企业用户主要有技术部(VLAN10)和行政部(VLAN20),通过汇聚交换机连接到USG。企业分别通过两个不同运营商(ISP1和ISP2)连接到 ...
[详细]
蜡笔小新 2024-12-24 14:57:16
-
本文详细探讨了在微服务架构中,使用Feign进行远程调用时出现的请求头丢失问题,并提供了具体的解决方案。重点讨论了单线程和异步调用两种场景下的处理方法。 ...
[详细]
蜡笔小新 2024-12-19 10:17:16
-
介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ...
[详细]
蜡笔小新 2024-12-16 21:02:15
-