天天看点

平台开发——skynet——①学习资料、安装、配置、简介、基础知识

云风的skynet官方github(有skynet介绍):https://github.com/cloudwu/skynet/wiki

CSDN的介绍skynet一个专栏(带例子):https://blog.csdn.net/qq769651718/category_7480207.html

skynet源码剖析:https://manistein.github.io/blog/post/server/skynet/skynet源码赏析/

安装skynet

https://www.jianshu.com/p/e103a7927349

配置文件config,启动相关

https://www.jianshu.com/p/cc26c8bf6551

目录

平台开发——skynet——①学习资料、安装、配置、简介、基础知识

预备知识

线程,进程,协程详细解释

对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。 无论进程还是线程,都是由操作系统所管理的。

协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)

进程

是为实现并发而出现的。 是资源统一分配的基本单位。 一个程序可以拥有多个进程,进程间相互独立存在。进程拥有独立的内存空间,进程间的进行信息交换需要依赖进程间通信(IPC)。 创建 / 销毁时需要开辟 / 释放内存空间 上下文切换开销较大。

线程

是为了减少进程并发执行时的时空开销而出现的。 是资源独立调度的基本单位,本身并不拥有资源。

线程依附于进程而存在,独立性较低,一个进程可以拥有多个线程。 线程共享他所在的进程的资源,所以通信与同步的时空开销较小。 创建 /销毁时无需对内存空间进行操作。 上下文切换开销较小。 对进程所施加的所有状态也会对属于它的线程生效(挂起、激活等)。

进程、线程、协程:https://blog.csdn.net/ai2000ai/article/details/104125442

多线程:https://www.jianshu.com/p/abb4eb7f44a8

操作系统(Operating System,简称OS)

Actor模型:https://www.jianshu.com/p/d803e2a7de8e

skynet简介

简单说,可以把 skynet 理解为一个简单的操作系统,它可以用来调度数千个lua 虚拟机,让它们并行工作。每个 lua虚拟机都可以接收处理其它虚拟机发送过来的消息,以及对其它虚拟机发送消息。每个 lua 虚拟机,可以看成 skynet这个操作系统下的独立进程,你可以在 skynet 工作时启动新的进程、销毁不再使用的进程、还可以通过调试控制台监管它们。skynet 同时掌控了外部的网络数据输入,和定时器的管理;它会把这些转换为一致的(类似进程间的消息)消息输入给这些进程。

做为核心功能,Skynet 仅解决一个问题:

把一个符合规范的 C 模块,从动态库(so 文件)中启动起来,绑定一个永不重复(即使模块退出)的数字id做为其 handle。模块被称为服务(Service),服务间可以自由发送消息。每个模块可以向 Skynet 框架注册一个 callback函数,用来接收发给它的消息。每个服务都是被一个个消息包驱动,当没有包到来的时候,它们就会处于挂起状态,对 CPU 资源零消耗。如果需要自主逻辑,则可以利用 Skynet 系统提供的 timeout 消息,定期触发。 Skynet提供了名字服务,还可以给特定的服务起一个易读的名字,而不是用 id 来指代它。id 和运行时态相关,无法保证每次启动服务,都有一致的 id,但名字可以。
简单说,Skynet 只负责把一个数据包从一个服务内发送出去,让同一进程内的另一个服务收到,调用对应的 callback函数处理。它保证,模块的初始化过程,每个独立的 callback调用,都是相互线程安全的。编写服务的人不需要特别的为多线程环境考虑任何问题。专心处理发送给它的一个个数据包。 它仅仅是把数据包的指针,以及你声称的数据包长度(并不一定是真实长度)传递出去。由于服务都是在同一个进程内,接收方取得这个指针后,就可以直接处理其引用的数据了。每个服务发送出去的包都是复制到用 malloc 分配出来的连续内存。接收方在处理完这个数据块(在处理的 callback函数调用完毕)后,会默认调用 free 函数释放掉所占的内存。即,发送方申请内存,接收方释放。

继续阅读