本模型中採用了多執行緒技術,主線程和子執行緒之間通過管道進行通訊。
伺服器有主線程和一組工作執行緒,其中主線程只負責監聽客戶端的鏈結請求,並將請求平均的分配給工作執行緒。
工作執行緒負責處理與客戶端的鏈結以及相關的業務。每個子執行緒維護乙個連線佇列,每乙個連線有乙個反饋的佇列。
工作執行緒在初始化的過程中會註冊管道的可讀事件,主線程只註冊對監聽套接字的可讀事件。
主線程和工作執行緒之間通過管道進行通訊,將通訊套接字資訊傳遞給工作執行緒。
工作執行緒由主線程進行建立,為主執行緒的子執行緒。
主線程只處理監聽套接字的可讀事件,當accept成功返回後,將建立的通訊套接字fd寫入管道。
工作執行緒的管道可讀事件被激發,監聽通訊套接字的可讀可寫事件。
主線程的業務邏輯極為簡單,不處理實際的業務邏輯**,增加了連線事件的響應速度。
這裡需要注意的是要平均的將通訊套接字分配給工作執行緒。
工作執行緒初始化完畢後只監聽管道的可讀事件。
當主線程將通訊fd寫入管道,工作執行緒從管道中將通訊fd取出並監聽其可讀事件。
事件進入迴圈,如果通訊fd上的可讀事件到來,那麼進入讀操作。
讀操作有可能失敗,這個時候要進行判斷客戶端是否已經退出鏈結。
如果是則需要對fd呼叫close進行清除,否則就退出處理。
如果讀操作成功,則進入組包、處理請求的過程,並將反饋結果寫入反饋佇列,同時寫入fd的可寫事件。
epoll的精髓就在於此,一定要寫入可寫事件。
可寫事件的處理相對較為簡單,從反饋佇列裡取出反饋結果呼叫write寫出。
當併發數很多時,每個子執行緒需要處理的fd依然會非常龐大。
這些fd的業務處理是在同乙個執行緒中處理的需要競爭資源。
而在多個工作執行緒之間其實並沒有乙個協調的過程,主要靠主線程的平均分配,這個地方有待改進。
go 基於HTTP協議的網路服務
代表著向網路傳送 http 請求,並從網路服務接收 http 響應的操作過程。最大空閒連線數 maxidleconns 10,訪問每個網路服務的最大空閒連線數 maxidleconnsperhost 2,空閒的連線在多久後應該被關閉 idleconntimeout 30 time.second,從客...
網路服務 NFS服務
1.概述 2.nfs和rpc的關係 3.nfs server和nfs client的通訊過程 1 首先伺服器端開啟rpc服務,並開啟111埠 2 啟動nfs服務,並向rpc服務進行埠的註冊 3 客戶端啟動rpc服務,向服務端的rpc服務請求伺服器的nfs埠 4 服務端的rpc服務反饋nfs服務的埠資...
linux網路服務
apache 涉及的軟體包 涉及的協議 埠 80 服務的工作路徑 配置檔案 listen 80 服務啟動之後監聽哪個埠 include conf.d conf 包含子配置檔案 user apache 服務執行的時候的程序身份 group apache 如果啟動httpd的時候報錯 停止 httpd ...