skynet是一个轻量级的游戏服务器框架;实现了actor的并发模型;可以基于skynet框架去实现业务。
多核并发编程
多线程
在一个进程中开启多线程,为了充分利用多核,一般设置工作线程的个数为 cpu 的核心数;
memcached 就是采用这种方式;
多线程在一个进程当中,所以数据共享来自进程当中的内存;这里会涉及到很多临界资源的访问,所以需要考虑加锁;
多进程
在一台机器当中,开启多个进程充分利用多核,一般设置工作进程的个数为 cpu 的核心数;
nginx 就是采用这种方式;
CSP
以 go 语言为代表,并发实体是协程(用户态线程、轻量级线程);内部也是采用多少个核心开启多少个内核线程来充分利用多核;
actor
erlang 从语言层面支持 actor 并发模型,并发实体是 actor(用户态进程);skynet采用 c + lua来实现 actor 并发模型, skynet中的actor也叫服务;底层也是通过采用多少个核心开启多少个内核线程来充分利用多核;
总结
不要通过共享内存来通信,而应该通过通信来共享内存。
actor定义
为什么要抽象进程?
每一个进程就是一个运行实体,这些运行实体提供了相互隔离的运行环境。
// 服务的定义,就是actor
struct skynet_context {
void * instance; // 隔离的运行环境,一块内存或者lua虚拟机
struct skynet_module * mod; // 服务的启动文件
void * cb_ud;
skynet_cb cb; // callback,通过调用cb来运行actor
struct message_queue *queue; // 消息队列,按照消息到达的先后顺序执行它
ATOM_POINTER logfile;
uint64_t cpu_cost; // in microsec
uint64_t cpu_start; // in microsec
char result[32];