高併發 IO 的底層原理

思考:

作爲程序員的我們,在編寫軟件進行文件讀取,網絡收發數據時,是不關心其具體的內部數據傳輸的。只關心把數據傳輸到緩衝區或及時從緩衝區讀取數據。那麼內部究竟是如何實現的呢,今天這篇文章就和大家一起學習瞭解下,希望對大家有幫助。

IO 讀寫的基礎

用戶程序進行 IO 讀寫,依賴於底層的 IO 讀寫,都會調用底層的 read/write 兩個系統調用。不同的操作系統其系統調用的名稱不同。但是基本功能都是一樣的。

首先在操作系統層面是有非常多的緩衝區的,比如進程緩衝區和內核緩衝區。

Read 系統調用並不是直接從物理設備 (硬盤) 把數據讀取到內存中的。Write 系統調用也不是直接把內存中的數據寫進物理設備。這兩個調用方式都不直接和物理設備進行數據的傳輸。它們都在和內核緩衝區打交道。當進行 Read 系統調用時數據是從內核緩衝區被複制到線程緩衝區的,而當 Write 系統調用時,數據是從線程緩衝區被複制到內核緩衝區的。

那麼朋友們讀到這裏是不是就有疑問,那麼數據在內核緩衝區是如何實現數據的讀寫到物理設備上呢?這塊就不是我們程序員朋友所關心的問題了,它是由操作系統內核來完成的。

可以這麼理解:上層程序的 IO 操作,實際上不是物理設備級別的讀寫,而是緩存的複製。在我們平時的用戶程序中,無論是 Socket 的 IO、還是文件 IO 操作,都屬於上層應用,它們的輸入輸出的處理,在編程流程上都是一致的。

內核緩衝區和進程緩衝區

緩衝區的目的:爲了減少頻繁地與設備之間的物理交換。

我們知道外部設備的讀寫在操作系統層面是需要不停的產生中斷來實現的,而發生中斷過程中,對於操作系統來說開銷太大了。中斷前,操作系統需要保存之前進程的數據和狀態等信息,結束中斷後,繼而需要恢復之前的進程數據和狀態等信息。之所以有了內核緩衝區就是爲了減少這種底層系統的時間損耗,性能損耗。

操作系統內核對於內核緩衝區的使用是有一定的規則的。在操作系統層面,底層操作會對內核緩衝區進行監控,等待緩衝區到達一定數量的時候,在進行 IO 設備的中斷處理,集中執行物理設備的實際 IO 操作。(這種機制在一定程度上提升了系統的性能)。

至於什麼時候讀寫中斷,是由操作系統內核決定的,用戶程序不需要關心。

上層應用使用 Read 系統調用時,僅僅是把數據從內核緩衝區複製到上層應用的緩衝區 (進程緩衝區),而當使用 Write 系統調用時,是把數據從進程緩衝區複製到內核緩衝區中。

寄語

這些基礎知識很重要,最近阿輝在學習穩固這方面的知識點,如果大家覺得文章有幫助,希望可以給個關注,我們一起加油。也可加我微信,拉你進技術交流羣 (分享編程資料、解決技術疑問)。

人生短暫,我不想去追求自己看不見的,我只想抓住我能看得見的。

我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發  謝謝。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/CTf1MVtt3hsoLPSCpLvOYg