目錄i/o執行緒模型
總結參考文件
當我們在讀取socket資料時,雖然我們在**僅僅是呼叫了乙個read
操作,但是實際作業系統層面做了許多事情。首先作業系統需要從使用者模式轉換為核心模式,處理器會通過網絡卡驅動對網絡卡控制器進行操作,網絡卡控制器則控制網絡卡。
處理器不會直接操控硬體。為了提高cpu利用率,i/o訪問方式也發生了很大變化。
早期的cpu直接控制外圍裝置,後來增加了控制器或i/o模組。處理器開始將i/o操作從外部裝置介面分離出來。處理器通過向i/o模組傳送命令執行i/o指令。然而當i/o操作完成時並不會通知處理器i/o,因此處理器需要定時檢查i/o模組的狀態,它會進行忙等待,因此效率並不高。
後來cpu支援了中斷方式,處理器無需等待執行i/o操作,通過中斷控制器產生中斷訊號通知i/o操作完成,大大的提高了處理器利用效率。這時的i/o操作使用特定的in/out(i/o埠)指令或直接讀寫記憶體的方式(記憶體對映i/o)。但是這些方式都需要處理器使用i/o暫存器逐個記憶體單元進行訪問,效率並不高,在i/o操作時需要消耗的cpu時鐘週期。
為了提高效率,後來增加了dma控制器,它可以模擬處理起獲得記憶體匯流排控制權,進行i/o的讀寫。當處理器將控制權交給dma控制器之後,dma處理器會先讓i/o硬體裝置將資料放到i/o硬體的緩衝區中,然後dma控制器就可以開始傳輸資料了。在此過程中處理器無需消耗時鐘週期。當dma操作完成時,會通過中斷操作通知處理器。
i/o訪問的發展趨勢是盡可能減少處理器干涉i/o操作,讓cpu從i/o任務中解脫出來,讓處理器可以去做其他事情,從而提高效能。
前面提到,在最原始的i/o模型中,對檔案裝置資料的讀寫需要同步等待作業系統核心,即使檔案裝置並沒有資料可讀,執行緒也會被阻塞住,雖然阻塞時不占用cpu始終週期,但是若需要支援併發連線,則必須啟用大量的執行緒,即每個連線乙個執行緒。這樣必不可少的會造成執行緒大量的上下文切換,隨著併發量的增高,效能越來越差。
為了解決同步阻塞帶來執行緒過多導致的效能問題,同步非阻塞方案產生。通過乙個執行緒不斷的判斷檔案控制代碼陣列是否有準備就緒的檔案裝置,這樣就不需要每個執行緒同步等待,減少了大量執行緒,降低了執行緒上下文切換帶來的效能損失,提高了執行緒利用率。這種方式也稱為i/o多路復用技術。但是由於陣列是有陣列長度上限的(linux預設是1024),而且select模型需要對陣列進行遍歷,因此時間複雜度是\(o_\)因此當高併發量的時候,select模型效能會越來越差。
poll模型和select模型類似,但是它使用鍊錶儲存而非陣列儲存,解決了併發上限的限制,但是並沒有解決select模型的高併發效能底下的根本問題。
在linux2.6支援了epoll模型,epoll模型解決了select模型的效能瓶頸問題。它通過註冊**事件的方式,當資料可讀寫時,將其加入到通過**方式,將其加入到乙個可讀寫事件的佇列中。這樣每次使用者獲取時不需要遍歷所有控制代碼,時間複雜度降低為\(o_\)。因此epoll不會隨著併發量的增加而效能降低。隨著epoll模型的出現c10k的問題已經完美解決。
前面講的幾種模型都是同步i/o模型,非同步i/o模型指的是發生資料讀寫時完全不同步阻塞等待,換句話來說就是資料從網絡卡傳輸到使用者空間的過程時完全非同步的,不用阻塞cpu。為了更詳細的說明同步i/o與非同步i/o的區別,接下來舉乙個實際例子。
當應用程式需要從網絡卡讀取資料時,首先需要分配乙個使用者記憶體空間用來儲存需要讀取的資料。作業系統核心會呼叫網絡卡緩衝區讀取資料到核心空間的緩衝區,然後再複製到使用者空間。在這個過程中,同步阻塞i/o在資料讀取到使用者空間之前都會被阻塞,同步非阻塞i/o只知道資料已就緒,但是從核心空間緩衝區拷貝到使用者空間時,執行緒依然會被阻塞。而非同步i/o模型在接收到i/o完成通知時,資料已經傳輸到使用者空間。因此整個i/o操作都是完全非同步的,因此非同步i/o模型的效能是最佳的。
在我的另一篇文章《windows核心原理-同步io與非同步io》對windows作業系統i/o原理做了簡要的敘述,感興趣的同學可以看下。從執行緒模型上常見的執行緒模型有reactor模型和proactor模型,無論是哪種執行緒模型都使用i/o多路復用技術,使用乙個執行緒將i/o讀寫操作轉變為讀寫事件,我們將這個執行緒稱之為多路分離器。
對應上i/o模型,reacor模型屬於同步i/o模型,proactor模型屬於非同步i/o模型。
在reactor中,需要先註冊事件就緒事件,網絡卡接收到資料時,dma將資料從網絡卡緩衝區傳輸到核心緩衝區時,就會通知多路分離器讀事件就緒,此時我們需要從核心空間讀取到使用者空間。
同步i/o採用緩衝i/o的方式,首先核心會從申請乙個記憶體空間用於存放輸入或輸出緩衝區,資料都會先快取在該緩衝區。proactor模型,需要先註冊i/o完成事件,同時申請一片使用者空間用於儲存待接收的資料。呼叫讀操作,當網絡卡接收到資料時,dma將資料從網絡卡緩衝區直接傳輸到使用者緩衝區,然後產生完成通知,讀操作即完成。
非同步i/o採用直接輸入i/o或直接輸出i/o,使用者快取位址會傳遞給裝置驅動程式,資料會直接從使用者緩衝區讀取或直接寫入使用者緩衝區,相比緩衝i/o減少記憶體複製。本文通過i/o訪問方式,i/o模型,執行緒模型三個方面解釋了作業系統為實現高效能i/o做了哪些事情,通過提高cpu使用效率,減少記憶體複製是提高效能的關鍵點。
新手入門:目前為止最透徹的的netty高效能原理和框架架構解析
高效能網路程式設計(二):上乙個10年,著名的c10k併發連線問題
nio的epoll空輪詢bug
兩種高效的伺服器設計模型:reactor和proactor模型
tcp的傳送緩衝區和接收緩衝區
ide(電子整合驅動器)
《作業系統精髓與設計原理(第5版)》
《windows核心原理與實現》
高效能網路通訊模組(Linux平台)
產品介紹 該產品是一款採用模組化設計,基於 32位平台的高效能網路通訊模組,可用於網路遊戲伺服器,通訊伺服器,web服務和 伺服器 即時通訊等網路通訊領域 產品特性 1 採用tcp ip 通訊協議,能保證海量資料報收發的穩定性 2 採用epoll 多執行緒 執行緒池 記憶體池 訊息佇列等技術 3 可...
網路通訊原理
1.網際網路的本質就是一系列的網路協議。2.網際網路協議按照功能不同分為osi七層 應,表,會,傳,網,數,物。五層 應,傳,網,數,物。層的作用 1.物理層 基於電器特性傳送高低電壓,高壓對應數字1,低壓對應數字0.2.資料鏈路層 乙太網協議 網絡卡 3.網路層 乙個ip位址通常寫成四段十進位制數...
網路通訊原理
一台硬設有了作業系統,然後裝上軟體你就可以正常使用了,然而你也只能自己使用 像這樣,每個人都擁有一台自己的機器,然而彼此孤立 如何能大家一起玩耍 然而internet為何物?其實兩台計算機之間通訊與兩個人打 之間通訊的原理是一樣的 中國有很多地區,不同的地區有不同的方言,為了全中國人都可以聽懂,大家...