skynet源码阅读<6>--线程调度】的更多相关文章

相比于上节我们提到的协程调度,skynet的线程调度从逻辑流程上来看要简单很多.下面我们就来具体做一分析.首先自然是以skynet_start.c为入口: static void start(int thread) { pthread_t pid[thread+]; struct monitor *m = skynet_malloc(sizeof(*m)); memset(m, , sizeof(*m)); m->count = thread; m->sleep = ; m->m = s…
阅读skynet的lua-c交互部分代码时,可以看到如下处理: struct skynet_context * context = lua_touserdata(L, lua_upvalueindex(1)); 那么,问题来了:skynet_context是如何作为upvalue与C函数绑定在一起的呢?这里以luaopen_skynet_core(lua_State *L)为例: int luaopen_skynet_core(lua_State *L) { luaL_checkversion(…
继上一篇介绍了skynet的网络部分之后,这一篇以网关gate.lua为例,简单分析下其串接和处理流程. 在官方给出的范例中,是以examples/main.lua作为启动脚本的,在此过程中会创建watchdog服务: local watchdog = skynet.newservice("watchdog") skynet.call(watchdog, "lua", "start", { port = , maxclient = max_cli…
注:为方便理解,本文贴出的代码部分经过了缩减或展开,与实际skynet代码可能会有所出入.    作为一个skynet actor,在启动脚本被加载的过程中,总是要调用skynet.start和skynet.dispatch的,前者在skynet-os中做一些初始化工作,设置消息的Lua回调,后者则注册针对某协议的解析回调.举个例子: local skynet = require "skynet" local function hello() skynet.ret(skynet.pac…
最近几周粗略看了 skynet 代码的 C 部分.遇到很多知识点以前只是知道,但并不十分了解,所以这是一个学习的过程. 从 main 函数开始,闷头一阵看下来,着实蛋疼. 当看了 skynet_mq.c 和 skynet_module.c 之后才终于有了头绪. C 代码通篇下来并没有什么特别的难点.看 Lua 代码的时候,我的头开始大了,我了个擦擦擦,神乎其技啊. 一开始读 Lua 代码时,C 层的东西我也才刚读完,还没有消化好,所以读起来很吃力. 于是,停下来不再继续看代码,而是去云风的博客上…
在使用skynet开发时,你也许会碰到类似这样的警告:A message from [ :0100000f ] to [ :0100000a ] maybe in an endless loop (version = 137)    它表示你的代码在某处陷入了死循环.但是如何找到死循环的点呢?可以这样做:    1)本机登陆skynet控制台:nc 127.0.0.1 8000 ==> telnet登录skynet    2)输入命令:signal addr 0                …
昨天和三石公聊天,他提到timer的实现原理,我当时迟疑了一下,心想timer不是系统底层时钟中断驱动上层进程/线程,累积计时实现的么?他简述了timer的实现,什么堆排序,优先级队列等,与我想象的不同.正好这两天在作skynet笔记,以前也没有留意过skynet的timer,这次干脆就看看它是怎么实现的.看了之后我明白了,我与三石公所设想的不是同一个问题.他所关心的问题其实是:框架被注册多个定时回调,如何管理并尽可能高效地触发这些回调.这里我们假设框架将定时消息抽象为timer_node,框架…
先来看下socket_server的数据结构,这里简称为ss: struct socket_server { int recvctrl_fd; int sendctrl_fd; int checkctrl; poll_fd event_fd; int alloc_id; int event_n; int event_index; struct socket_object_interface soi; struct event ev[MAX_EVENT]; struct socket slot[M…
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而FMDB最新的版本中主要是通过使用FMDatabaseQueue这个类来进行多线程处理的. 2. FMDatabaseQueue使用举例 // 创建,最好放在一个单例的类中 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath…
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比如FMDB的executeUpdate:系列方法.数据库的加解密等等.这次写的就是对FMDatabase和FMResultSet这两个文件的补全内容.每次写这种补全的内容最头疼,内容会很分散,感觉没啥条理. 2. executeUpdate:系列函数 注意除了"SELECT"语句外,其他的…