skynet里面有哪些高效的设计?有哪些影响性能的地方?

  最近拜读了 Linux高性能编程 这本书,结合skynet的使用与理解,总结下skynet为何能成为流行框架。
  1 使用了IO多路复用
  2 在事件处理模型采用了EPOLL模拟的Proactor模式,即对于socket的处理以及数据的读写都是在socket线程完成的,worker线程只做逻辑处理。
  3 在并发模式中采用的是 半同步/半反应堆(是模拟的,因为对数据的处理还是在socket线程里处理,worker线程获取到的数据是一个具体的消息而不是fd) 的模式,即socket线程接受完数据处理成一个消息对象后,将该消息对象push进一个全局的消息队列中,各worker线程竞争获取对该消息队列的所有权(缺点:每次对消息队列操作,都需要进行锁操作,并且如果消息队列过长,那么在队列后面的操作可能会有延迟。)
  4 统一事件源,skynet对服务器要处理的三个事件源(网络消息,时间事件,系统信号)都会统一包装成一个消息对象,然后全部塞进消息队列中。
  5 时间事件采用了时间轮算法。
  6 逻辑处理采用 actor 模型,即有自己单独的运行环境(lvm),有自己的消息队列(二级消息队列),避免了不同对象对数据并发处理时的竞争问题。

  主要影响性能的地方是在worker线程去获取消息队列时需要用到锁操作,而且是比较频繁的,那么如何避免该问题?可以采用领导者/追随者的模式去从消息队列中获得消息,即启动多个worker线程,同时只有一个线程(领导者)在运行并监听socket,当有消息触发时,该领导者线程会挑选一个空闲的追随者线程变成领导者进行socket的处理,这样同时就只有一个线程在运行,就能够避免锁的操作。但是这个解决方案,因为中间少了消息队列,所以缺少了灵活性(需要在把消息传递给服务器前就要把消息统一包装成一个消息对象,以便使用统一事件源,变成了低内聚,高耦合了)。
  skynet使用的半同步/半反应堆的模式,相对于领导者/追随者模式的区别,主要就是消息队列带来的,半同步/半反应堆的优点是灵活性强,事件源不单一但是效率会比领导者/追随者低。

posted @   小乐虎  阅读(493)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
点击右上角即可分享
微信分享提示