同步阻塞
recvfrom屬于系統(tǒng)調(diào)用撞叨,應用程序調(diào)用 recvfrom厕九,將內(nèi)核中的數(shù)據(jù)包復制到用戶空間的緩沖區(qū)中革屠。
- 等待數(shù)據(jù)到來的過程镊讼,內(nèi)核收到數(shù)據(jù) block
- 從內(nèi)核緩沖區(qū)復制到用戶空間應用程序的緩沖區(qū) block
同步非阻塞
設置為 non-blocking的話题翻,如果內(nèi)核沒有數(shù)據(jù)揩徊,recvfrom會返回一個EWOULDBLOCK錯誤腰鬼,告訴用戶,數(shù)據(jù)還未準備好塑荒,此時并未阻塞熄赡。通過輪詢來檢查內(nèi)核是否有數(shù)據(jù)。
在網(wǎng)絡IO時候齿税,非阻塞IO也會進行recvform系統(tǒng)調(diào)用彼硫,檢查數(shù)據(jù)是否準備好,與阻塞IO不一樣凌箕,"非阻塞將大的整片時間的阻塞分成N多的小的阻塞, 所以進程不斷地有機會 '被' CPU光顧"拧篮。
I/O復用模型
用戶程序老是占用大量cpu來進行輪詢的工作,如果將阻塞等待數(shù)據(jù)的到來交給select這樣的管家來執(zhí)行牵舱,select屬于內(nèi)核級別的串绩,讓一個管家?guī)臀覀冚喸兪欠裼袛?shù)據(jù)的到來,可以節(jié)省大量cpu的開箱芜壁,而且相對同步非阻塞礁凡,可以管理多個fd的情況,一旦有可讀的fd慧妄,就告知用戶可以調(diào)用recvfrom顷牌,進行內(nèi)核到用戶進程地址空間的copy。
信號驅(qū)動模型
安裝SIGIO信號處理函數(shù)腰涧,程序繼續(xù)往下執(zhí)行,當數(shù)據(jù)準備好紊浩,內(nèi)核向用戶程序發(fā)送一個SIGIO信號窖铡,應用程序收到后,執(zhí)行這個信號相對應的回調(diào)函數(shù)坊谁。
以上四種都為同步模型
異步I/O
使用信號驅(qū)動I/O時费彼,當網(wǎng)絡套接字可讀后,內(nèi)核通過發(fā)送SIGIO信號通知應用進程口芍,于是應用可以開始讀取數(shù)據(jù)箍铲。有時也稱此方式為異步I/O。但是嚴格講鬓椭,該方式并不能算真正的異步I/O颠猴,因為實際讀取數(shù)據(jù)到應用進程緩存的工作仍然是由應用自己負責的。
而異步I/O模型是當數(shù)據(jù)從內(nèi)核復制到用戶程序的緩沖區(qū)中小染,才遞交信號翘瓮,相比信號驅(qū)動I/O,I/O的兩個階段都是非阻塞