Workerman學習筆記(一)初步認識

事兒爸_董 發表於 2020-08-01

本文只是概念性的知識,內容比較零散,下篇文章再進行程式碼分析。

Workerman是什麼,他的優勢在哪?

 官方給的解釋是高效能socket框架,我的個人理解是實現多程式的通訊的服務框架。

 與傳統的PHP框架不同,並非注重功能的實現,而是專注於效能和通訊服務。

 優勢:

  1.與傳統的web服務不同,Workerman第一次執行就將環境變數、物件等資源常駐記憶體

  2.傳統的web基本只實現http協議,但Workerman可以實現多種應用層協議(比如http、websocket、text等)

 


 

socket:

 套接字,是網路中不同主機間雙向通訊的端點的抽象層,位於TCP/IP四層中傳輸層和應用層之間,是一種約定或方式的介面。


 

程式:

 程式:是系統資源呼叫的最小單元,程式和程式之間預設不共享資料和地址空間。想要實現程式間通訊可以用:佇列、管道、訊號量和共享記憶體、訊號等。

 孤兒程式:父程式fork出子程式後,父程式自己退出,則子程式為孤兒程式。

 殭屍程式:父程式在fork出子程式後,子程式在結束後,父程式並沒有呼叫wait或者waitpid等完成對其清理善後工作,導致改子程式程式ID、檔案描述符等依然保留在系統中,極大浪費了系統資源。叫做殭屍程式。

 守護程式:是執行在後臺的一種特殊程式。建立守護程式的過程:

      1.父程式建立子程式,父程式退出。

      2.子程式建立新會話

      3.禁止子程式重新開啟終端

      4.設定當前目錄為根目錄

      5.設定檔案許可權掩碼

      6.關閉檔案描述符

 執行緒:是cpu呼叫的最小單元,同一程式中的執行緒共享資料和地址空間。

 程式組:每一個程式都屬於一個程式組,程式組是一個或多個程式的集合,程式組中有一個程式組長。

 會話:是一個或多個程式組的集合,建立會話的程式是會話的首領程式,會話中每個程式組稱為一個作業。


 

libevent:

 libevent是用C語言編寫的、輕量級的開源高效能事件通知庫,主要有以下幾個亮點:事件驅動( event-driven),高效能;輕量級,專注於網路,不如 ACE 那麼臃腫龐大;原始碼相當精煉、易讀;跨平臺,支援 Windows、 Linux、 *BSD 和 Mac Os;支援多種 I/O 多路複用技術, epoll、 poll、 dev/poll、 select 和 kqueue 等;支援 I/O,定時器和訊號等事件;註冊事件優先順序。


 

epoll、poll、select:https://www.cnblogs.com/aspirant/p/9166944.html

 都是I/O多路複用模型的實現,對使用者請求進行回撥執行。

 select:當I/O事件發生時,會無差別輪詢所有socket完成排程,浪費cpu資源。且最大連線數受記憶體影響。參考:https://www.cnblogs.com/Anker/p/3258674.html

 poll:和select本質上沒有區別,但是沒有最大連線數限制。參考:https://www.cnblogs.com/Anker/p/3261006.html

 epoll:可以理解為event poll,當I/O事件發生時不會採用輪詢的方式,而是把哪個流發生了怎樣的I/O事件通知我們。參考:https://www.cnblogs.com/Anker/p/3263780.html

    epoll提供了三個函式:epoll_create(建立)、epoll_ctl(事件註冊)、epoll_wait(事件等待)

    epoll在事件註冊時已經將已經將fd複製到核心中並未每個fd指定了回撥函式


 

reuseport :

 開啟監聽埠複用後允許多個無親緣關係的程式監聽相同的埠,並且由系統核心做負載均衡,決定將socket連線交給哪個程式處理,避免了驚群效應,可以提升多程式短連線應用的效能。

 未開啟時:多個程式監聽一個socket,沒有請求時這些程式處於掛起狀態。當有請求時,核心會喚醒這些程式讓他們競爭去處理這個連線,這個過程耗費cpu資源,叫做驚群效應。

 開啟reuseport後:一個埠可以被多個socket同時監聽,核心可以做到將客戶端連線均勻地傳送到監聽統一埠的一群 Socket 上。當有客戶端連線到來時,核心轉發連線到一個 Socket 上,而這個 Socket 只會喚醒自己隸屬的那個 Worker,避免驚群效應。

 參考:https://www.jianshu.com/p/97cc8c52d47a