skynet笔记——skynet模型介绍,在ubuntu上搭建skynet(一)

简介

这个系统是单进程多线程模型。

每个服务都是严格的被动的消息驱动的,以一个统一的 callback 函数的形式交给框架。框架从消息队列里调度出接收的服务模块,找到 callback 函数入口,调用它。服务本身在没有被调度时,是不占用任何 CPU 的。

skynet虽然支持集群,但是作者云风主张能用一个节点完成尽量用一个节点,因为多节点通信方面的开销太大,如果一共有 100 个 skynet 节点,在它们启动完毕后,会建立起 9900条通讯通道。


特点

Skynet框架做两个必要的保证:

一、一个服务的 callback 函数永远不会被并发。

二、一个服务向另一个服务发送的消息的次序是严格保证的。

用多线程模型来实现它。底层有一个线程消息队列,消息由三部分构成:源地址、目的地址、以及数据块。框架启动固定的多条线程,每条工作线程不断从消息队列取到消息,调用服务的 callback 函数。

线程数应该略大于系统的 CPU 核数,以防止系统饥饿。(只要服务不直接给自己不断发新的消息,就不会有服务被饿死)

对于目前的点对点消息,要求发送者调用 malloc 分配出消息携带数据用到的内存;由接受方处理完后调用 free 清理(由框架来做)。这样数据传递就不需要有额外的拷贝了。

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

把一个符合规范的 C 模块,从动态库(so 文件)中启动起来,绑定一个永不重复(即使模块退出)的数字 id 做为其 handle 。模块被称为服务(Service),服务间可以自由发送消息。每个模块可以向 Skynet 框架注册一个callback 函数,用来接收发给它的消息。每个服务都是被一个个消息包驱动,当没有包到来的时候,它们就会处于挂起状态,对 CPU 资源零消耗。如果需要自主逻辑,则可以利用 Skynet 系统提供的 timeout 消息,定期触发。


Actor模型

Actor模型介绍

Actor模型内部的状态由它自己维护,即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题,Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成

  1. 状态(state):Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题
  2. 行为(Behavior):行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态
  3. 邮箱(mailBox):邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息Actor的基础就是消息传递。

skynet中每个服务就是一个LUA虚拟机,就是一个Actor。

Actor模型好处

  1. 事件模型驱动: Actor之间的通信是异步的,即使Actor在发送消息后也无需阻塞或者等待就能够处理其他事情。
  2. 强隔离性: Actor中的方法不能由外部直接调用,所有的一切都通过消息传递进行的,从而避免了Actor之间的数据共享,想要观察到另一个Actor的状态变化只能通过消息传递进行询问。
  3. 位置透明: 无论Actor地址是在本地还是在远程机上对于代码来说都是一样的。
  4. 轻量性:Actor是非常轻量的计算单机,只需少量内存就能达到高并发。

在ubuntu上搭建skynet

获取skynet源代码

  1. 安装git代码管理工具
    在这里插入图片描述
    注意:如果安装失败,请先安装一下只支持库
    在这里插入图片描述
  2. 到github上面下载skynet的源代码。 skynet的代码保存在github上面,大家可以去上面查看,现在我们用git把代码拷贝一份下来:
    在这里插入图片描述

skynet代码目录结构

skynet_root_dir
在这里插入图片描述

编译与运行skynet服务器

  1. 编译skynet
    在这里插入图片描述
  2. 运行第一个skynet节点
    在这里插入图片描述

运行客户端

我们要运行的的客户端是example/client.lua 这个lua脚本文件,那么首先你要有一个lua虚拟机程序。

  1. 编译lua虚拟机
    在这里插入图片描述
  2. 运行客户端
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Gsunshine24/article/details/89281740