热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Skynet源码解析:启动流程与核心组件

本文详细解析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 免费领取。
推荐阅读
  • 本文详细介绍了如何通过修改Lua源码或使用动态链接库(DLL)的方式实现Lua与C++之间的高级交互,包括如何编译Lua源码、添加自定义API以及在C++中加载和调用Lua脚本。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • 导读上一篇讲了zsh的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。包括转义字符、引号、print、printf的使用等等。其中很多内容没有必要记忆,作为手册参 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
author-avatar
海底来的沙3
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有