網絡IO的本質是socket的讀取,socket在linux系統被抽象為流,IO可以理解為對流的操作。剛才說了,對于一次IO訪問(以read舉例),數據會先被拷貝到操作系統內核的緩沖區中,然后才會從操作系統內核的緩沖區拷貝到應用程序的地址空間。
所以說,當一個read操作發生時,它會經歷兩個階段:
階段:等待數據準備 (Waiting for the data to be ready)。 第二階段:將數據從內核拷貝到進程中 (Copying the data from the kernel to the process)。
對于socket流而言,
步:通常涉及等待網絡上的數據分組到達,然后被復制到內核的某個緩沖區。第二步:把數據從內核緩沖區復制到應用進程緩沖區。
網絡應用需要處理的無非就是兩大類問題,網絡IO,數據計算。相對于后者,網絡IO的延遲,給應用帶來的性能瓶頸大于后者。
網絡IO的模型大致有如下幾種:
同步阻塞IO(bloking IO) 同步非阻塞IO(non-blocking IO) 多路復用IO(multiplexing IO) 信號驅動式IO(signal-driven IO) 異步IO(asynchronous IO)
PS: 這塊略復雜,在后面的提供了問答,所以用了最簡單的舉例結合Linux IO圖例幫你快速理解。