雲風 Skynet 閱讀筆記

一、主程序大致流程

1、入口文件爲 skynet_main.c

2、初始化節點的全局信息,用線程存儲的方式。(每個線程可以在其中存儲自己的信息)

3、初始化 全局環境表,此表主要用來存儲一些全局的配製信息

4、設置 忽略SIGPIPE信號,原因見:

http://www.cnblogs.com/caosiyang/archive/2012/07/19/2599071.html

5、讀lua配置表初始化全局配置表

6、初始化節點信息

7、初始化全局消息隊列

8、初始化模塊

9、初始化定時器

10、初始化 socket 模塊

11、開啓第一個服務(引導入口的服務,比如exampel中的main.lua)

12、分配 3 + 配置線程數的 線程(監視器線程+定時器線程+socket服務線程+工作線程)

13、等待所有線程結束

14、清理監視器

16、清理socket

 

二、監視器線程工作

1、在啓動線程服務的時候給每個線程創建了一個監視器

2、然後每當工作線程分發任務給服務的回調函數錢,設置監視器

3、如果出現服務死循環,那麼就會被監視器檢測到,並會將服務會強制結束這個死循環(目前還沒明白這個原理)

 

三、定時器線程工作

1、以 0.025 秒爲間隔,更新一次時間

更新時間的方式爲,用當前的時間減去上次記錄的時間,然後發送相差的時間間隔數目的定時器事件出去。

(具體怎麼做還有待深究)

2、喚醒睡眠的工作線程去查看是否有事件可處理,如果工作線程發現沒事幹,還是會繼續睡眠

 

四、Socket服務線程工作

1、不斷從epoll 消息隊列中拿出時間,讓後分發給出去。

2、如果發現當前所有工作線程睡眠就會喚醒一個線程開始工作。

 

五、工作線程工作

1、從全局消息隊列中取出一個消息消息隊列,獲得消息的目的服務標識

2、用工作隊列的對應監視器設置當前監視狀態(爲了防止服務死循環)

3、拿出目的服務的環境句柄,然後從消息隊列中取出一條消息調用服務的回調函數並將消息傳遞給它。

4、清空監視器的狀態。

 

六、消息隊列工作方式:

1、每個服務都有自己的消息隊列,當有服務有消息到來的時候,先將消息壓入服務自己的消息隊列中。

2、把壓入新消息的消息服務消息隊列壓入,全局的消息隊列的隊列中。

3、工作線程會不斷的從全局消息隊列中彈出 各個服務壓入的各自的消息隊列。

4、然後工作線程用彈出的服務消息隊列,彈出一個消息,並用服務的回調函數處理消息

 

待續。。。。。。。

 

發佈了36 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章