skynet是单进程多线程的Actor模型,memcache 是多线程的非阻塞 的IO复用技术,redis是基于单线程的非阻塞IO多路复用技术
Actor执行模型是单线程,并且异步,并不是一种基于共享内存的单线程模型,共享内存更适合单机多核的并发编程,我们之前用的都是单线程的基于共享内存的线程模型,这样就得在对共享内存访问加锁,同时带来了编程的复杂。
skynet的目录结构:
自上而下封装调用,但是不能自下而上的去调用
service:lua层服务,依附于snlua这个c服务 lualib:提供给应用层的lua服务接口
lualib-src:luac媒介 service-src:依附于skynet核心模块的c服务
skynet-src:整个synet框架最核心机制模块存放处,比如日志模块,scoket模块、定时器模块、skynet消息队列、内存管理模块以及逻辑入口与加载c代码的skynet_moudle模块,
3rd:第三方支持,包括加密技术、lua支持、内存管理
https://zhuanlan.zhihu.com/p/668064682
https://blog.csdn.net/a1491758730/article/details/145310577
Skynet主要流程:
skynet_moudle结构的作用,就是通过c库函数提供的dlopen和dlclose dlsym函数对so动态库进行动态链接加载进skynet_moudel列表中。c库函数应该命名为logger_create,logger_init,logger_signal,logger_release
反推一个消息是如何被驱动的,首先我们在luaservice层去调用一个logger打印函数,然后就会调用到lualib-src中的luac交互媒介函数,通过访问lua函数栈去获取这样一个打印的c函数提供给lua调用的方法,logger类实例有可能是单例模式实现的,通过这样一个实例对象去指向那块logger实例对象内存,这样一块内存是在skynet服务启动时候,底层的c main函数中去通过加载所谓的静态库,动态库,然后初始化socket类,log类、timer类。然后调用一个循环,循环里面去调用lua的主函数
status behavior mailbox(次级消息队列消费全局消息队列任务,采用自旋锁去访问每一个单独的虚拟栈,自旋锁对于短临界区的访问比线程锁更优!)

浙公网安备 33010602011771号