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