【高併發】一、高併發 之 IO 讀寫的基礎原理

一、基礎知識

1、用戶程序進行IO的讀寫,依賴於底層的IO讀寫,基本上會用到底層的read&write兩大系統調用。

2、在不同的操作系統中,IO讀寫的系統調用的名稱可能不完全一樣,但是基本功能是一樣的。

3、read系統調用,並不是直接從物理設備把數據讀取到內存中;write系統調用,也不是直接把數據寫入到物理設備。

上層應用無論是調用操作系統的read,還是調用操作系統的write,都會涉及緩衝區。

4、調用操作系統的read,是把數據從內核緩衝區複製到進程緩衝區;而write系統調用,是把數據從進程緩衝區複製到內核緩衝區。

5、上層程序的IO操作,實際上不是物理設備級別的讀寫,而是緩存的複製。

6、read&write兩大系統調用,都不負責數據在內核緩衝區和物理設備(如磁盤)之間的交換,這項底層的讀寫交換,是由操作系統內核(Kernel)來完成的。

無論是Socket的IO、還是文件IO操作,都屬於上層應用的開發,它們的輸入(Input)和輸出(Output)的處理,在編程的流程上,都是一致的。

二、內核緩存區與進程緩衝區

1、爲什麼設置那麼多的緩衝區,爲什麼要那麼麻煩呢?

  1. 外部設備的直接讀寫,涉及操作系統的中斷。發生系統中斷時,需要保存之前的進程數據和狀態等信息,而結束中斷之後,還需要恢復之前的進程數據和狀態等信息。
  1. 爲了減少這種底層系統的時間損耗(頻繁地與設備之間的物理交換)、性能損耗,於是出現了內存緩衝區。

2、上層應用使用read系統調用時,僅僅把數據從內核緩衝區複製到上層應用的緩衝區(進程緩衝區);上層應用使用write系統調用時,僅僅把數據從進程緩衝區複製到內核緩衝區中。底層操作會對內核緩衝區進行監控,等待緩衝區達到一定數量的時候,再進行IO設備的中斷處理,集中執行物理設備的實際IO操作,這種機制提升了系統的性能。

3、什麼時候中斷(讀中斷、寫中斷),由操作系統的內核來決定,用戶程序則不需要關心。

4、在Linux系統中,操作系統內核只有一個內核緩衝區。而每個用戶程序(進程),有自己獨立的緩衝區,叫作進程緩衝區。用戶程序的IO讀寫程序,在大多數情況下,並沒有進行實際的IO操作,而是在進程緩衝區和內核緩衝區之間直接進行數據的交換。

三、瞭解一下系統調用流程

1、用戶程序所使用的系統調用read&write。

  1. read把數據從內核緩衝區複製到進程緩衝區
  1. write把數據從進程緩衝區複製到內核緩衝區

2、Read 流程兩階段

  1. 等待數據準備好
  1. 從內核向進程複製數據
數據準備好 read
內核緩衝區
進程緩衝區

3、read一個socket(套接字),具體處理流程:

  1. 等待數據從網絡中到達網卡。當所等待的分組到達時,被複制到內核中的某個緩衝區。這個工作由操作系統自動完成,用戶程序無感知。
  1. 把數據從內核緩衝區複製到應用進程緩衝區。

4、Java服務器端,完成一次socket請求和響應

  1. 客戶端請求:Linux通過網卡讀取客戶端的請求數據,將數據讀取到內核緩衝區。
  1. 獲取請求數據:Java服務器通過read系統調用,從Linux內核緩衝區讀取數據,再送入Java進程緩衝區。
  1. 服務器端業務處理:Java服務器在自己的用戶空間中處理客戶端的請求。
  1. 服務器端返回數據:Java服務器完成處理後,構建好的響應數據,將這些數據從用戶緩衝區寫入內核緩衝區。這裏用到的是write系統調用。
  1. 發送給客戶端:Linux內核通過網絡IO,將內核緩衝區中的數據寫入網卡,網卡通過底層的通信協議,會將數據發送給目標客戶端。
網卡read/write
read/write
服務端空間處理數據
write
java Client
java 進程緩衝區
Linux 內核緩衝區
Java 服務器端
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章