天天看點

平台開發——skynet——①學習資料、安裝、配置、簡介、基礎知識

雲風的skynet官方github(有skynet介紹):https://github.com/cloudwu/skynet/wiki

CSDN的介紹skynet一個專欄(帶例子):https://blog.csdn.net/qq769651718/category_7480207.html

skynet源碼剖析:https://manistein.github.io/blog/post/server/skynet/skynet源碼賞析/

安裝skynet

https://www.jianshu.com/p/e103a7927349

配置檔案config,啟動相關

https://www.jianshu.com/p/cc26c8bf6551

目錄

平台開發——skynet——①學習資料、安裝、配置、簡介、基礎知識

預備知識

線程,程序,協程詳細解釋

對作業系統來說,線程是最小的執行單元,程序是最小的資源管理單元。 無論程序還是線程,都是由作業系統所管理的。

協程不是被作業系統核心所管理,而完全是由程式所控制(也就是在使用者态執行)

程序

是為實作并發而出現的。 是資源統一配置設定的基本機關。 一個程式可以擁有多個程序,程序間互相獨立存在。程序擁有獨立的記憶體空間,程序間的進行資訊交換需要依賴程序間通信(IPC)。 建立 / 銷毀時需要開辟 / 釋放記憶體空間 上下文切換開銷較大。

線程

是為了減少程序并發執行時的時空開銷而出現的。 是資源獨立排程的基本機關,本身并不擁有資源。

線程依附于程序而存在,獨立性較低,一個程序可以擁有多個線程。 線程共享他所在的程序的資源,是以通信與同步的時空開銷較小。 建立 /銷毀時無需對記憶體空間進行操作。 上下文切換開銷較小。 對程序所施加的所有狀态也會對屬于它的線程生效(挂起、激活等)。

程序、線程、協程:https://blog.csdn.net/ai2000ai/article/details/104125442

多線程:https://www.jianshu.com/p/abb4eb7f44a8

作業系統(Operating System,簡稱OS)

Actor模型:https://www.jianshu.com/p/d803e2a7de8e

skynet簡介

簡單說,可以把 skynet 了解為一個簡單的作業系統,它可以用來排程數千個lua 虛拟機,讓它們并行工作。每個 lua虛拟機都可以接收處理其它虛拟機發送過來的消息,以及對其它虛拟機發送消息。每個 lua 虛拟機,可以看成 skynet這個作業系統下的獨立程序,你可以在 skynet 工作時啟動新的程序、銷毀不再使用的程序、還可以通過調試控制台監管它們。skynet 同時掌控了外部的網絡資料輸入,和定時器的管理;它會把這些轉換為一緻的(類似程序間的消息)消息輸入給這些程序。

做為核心功能,Skynet 僅解決一個問題:

把一個符合規範的 C 子產品,從動态庫(so 檔案)中啟動起來,綁定一個永不重複(即使子產品退出)的數字id做為其 handle。子產品被稱為服務(Service),服務間可以自由發送消息。每個子產品可以向 Skynet 架構注冊一個 callback函數,用來接收發給它的消息。每個服務都是被一個個消息包驅動,當沒有包到來的時候,它們就會處于挂起狀态,對 CPU 資源零消耗。如果需要自主邏輯,則可以利用 Skynet 系統提供的 timeout 消息,定期觸發。 Skynet提供了名字服務,還可以給特定的服務起一個易讀的名字,而不是用 id 來指代它。id 和運作時态相關,無法保證每次啟動服務,都有一緻的 id,但名字可以。
簡單說,Skynet 隻負責把一個資料包從一個服務内發送出去,讓同一程序内的另一個服務收到,調用對應的 callback函數處理。它保證,子產品的初始化過程,每個獨立的 callback調用,都是互相線程安全的。編寫服務的人不需要特别的為多線程環境考慮任何問題。專心處理發送給它的一個個資料包。 它僅僅是把資料包的指針,以及你聲稱的資料包長度(并不一定是真實長度)傳遞出去。由于服務都是在同一個程序内,接收方取得這個指針後,就可以直接處理其引用的資料了。每個服務發送出去的包都是複制到用 malloc 配置設定出來的連續記憶體。接收方在處理完這個資料塊(在處理的 callback函數調用完畢)後,會預設調用 free 函數釋放掉所占的記憶體。即,發送方申請記憶體,接收方釋放。

繼續閱讀