I/O模型淺析總結
阿新 • • 發佈:2019-03-15
.net poll 邊緣 加載 gin rdquo 磁盤 之前 weight 參考:
http://www.cnblogs.com/fanzhidongyzby/p/4098546.html
http://blog.csdn.net/zhoudaxia/article/details/8974779
一般而言,一次I/O分為兩個階段:
一是,“等待數據”,內核等待數據從磁盤加載到內核內存;
二是,“等待復制完成”,數據從內核內存復制到進程內存;
阻塞:進程發起I/O調用,未完成之前,當前進程會被掛起。
非阻塞:進程發起I/O調用,被調用函數完成之前不會阻塞當前進程而是立即返回。
註意:以上是針對於調用者如何被處理的角度。
同步:進程發起一個過程調用(功能、函數)後,在沒得到結果之前,該調用將不會返回。
異步:進程發起一個過程調用,即便調用者不能立即得到結果,但調用卻會返回,返回一個未完成狀態,當調用完成後,內核會自行通知調用者已經OK。
註意:以上是針對於被調用者如何響應請求者的調用。
內存映射:mmap(解決I/O第二階段的內核內存數據復制到進程內存的等待過程)
I/O模型:
同步
同步阻塞:I/O兩個階段均阻塞
同步非阻塞:I/O一階段非阻塞(盲等待),二階段阻塞
I/O復用 select()、poll():I/O兩階段均阻塞,但是該模型能同時響應多個I/O請求
異步
事件驅動 epoll() 、wqueue():I/O一階段非阻塞,二階段阻塞
邊緣觸發(一次通知)
水平觸發(多次通知)
AIO(異步非阻塞):I/O兩階段均非阻塞
SystemV:poll()、epoll()
BSD:select()、wqueue()
Nginx支持事件驅動epoll、邊緣觸發以及mmap機制。
I/O模型淺析總結