一、环境安装
centos:yum install -y git gcc readline-devel autoconf
二、获取代码以及编译
git clone https://github.com/cloudwu/skynet.git
cd skynet
centos&&ubuntu: make linux
三、回顾多核开发
并发模型 :CSP 模型 与 actor 模型
结论:多进程并发实体是进程,多线程并发实体是线程,go 并发实体是 goroutine(协程),actor 并发实体是actor(语言层面抽象出来的“进程”)。它们都是在隔离性(运行环境)与统一性(数据统一)之间作取舍平衡,而 actor模型在语言层面做运行环境的隔离,数据同步依然需要通过消息来同步。actor 模型是加强版的多进程解决方案,进程间通信由socket 转为指针的传递,从而通信变得更加可靠,同时多进程解决方案中,公共开源组件(消息队列,rpc,zookeeper)解决的问题,在 actor 模型中处理起来更方便。
四、回顾多核开发与 actor 模型
actor 定义:
a) 用于并行计算
b) actor 是最基本的计算单元
c) 基于消息计算
d) actor 之间通过消息沟通并且相互隔离
五、skynet 中的 actor模型
1. 结构组成
a) 隔离的环境(内存块或 lua 虚拟机)
b) 消息队列
c) 回调函数
2. 实现
a) logger 服务 service-src/service_logger.c
b) lua 服务启动器 service-src/service_snlua.c
六、actor 运行以及消息调度
1. 消息队列
a) 全局消息队列
b) actor 消息队列
2. skynet 中锁的使用
a) 互斥锁
b) 自旋锁
i. worker 轮询消息队列
c) 读写锁
i. handle_storage
d) 条件变量
3. skynet 中线程
a) timer
b) socket
c) worker
i. “权重”来定制消费消息的数量(-1 消费一个,0 全部消费,1 消费一半)
ii. 休眠(条件变量)与唤醒(timer 和 socket)
d) monitor
i. 检查服务消息过载
七、skynet 网络 IO
1. 阻塞 io 和非阻塞 io
a) 阻塞在网络线程
b) io 操作(read/write)在没有数据到达时是否立刻返回
c) fd 决定了是否阻塞
2. 多路复用以及 epoll
3. epoll_event 与 actor 模型关联
4. 单线程读与多线程写