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