1. 四種理論的I/O模型
1) 調用者(服務進程):
阻塞: 進程發起I/O調用,如果調用為完成,進程被掛起休眠,不能再執行其他功能
非阻塞:進程發起I/O調用,被調用的函數完成之前,依然可以執行其他功能
2) 被調用函數或過程(系統調用I/O讀寫操作)
同步: 函數或功能被進程調用時,不立即返回值,直到此調用完成
異步: 函數或功能被進程調用時,不能立即完成則返回未完成狀態,完成后通知調用進程
3)四中理論模型
同步阻塞
同步非阻塞(幾乎沒人使用)
異步阻塞
異步非阻塞: 真正的異步I/O
2. 五種網絡服務中的I/O模型
1) 同步阻塞模型
工作進程調用I/O請求庫函數后,工作進程被阻塞等待I/O完成第一階段,數據從硬盤加載到內核空間,此時工作進程在庫函數返回數據之前繼續被阻塞參與完成第二階段數據從內核空間復制到用戶進程空間的過程,最后拿到數據。
2)I/O復用(同步阻塞模型):select(), poll()
工作進程調用一個管理I/O的特殊庫函數,此庫函數可以接受并管理多個I/O請求,工作進程則可以同時等待多個I/O請求,雖然是阻塞,但是阻塞在多個進程上,可以提高效率。第二階段依然需要工作進程參與庫函數把內核空間數據復制到用戶空間,第二階段依舊阻塞。
3) 同步非阻塞(盲等待模型)
工作進程調用I/O庫函數,工作進程不需要I/O完成依舊可以處理其他事物,但是需要反復查看I/O是否完成。第二階段依然需要工作進程參與庫函數把內核空間數據復制到用戶空間,第二階段依舊阻塞。
4) 事件觸發模型(同步非阻塞): epoll(), kqueue()
工作進程調用I/O庫函數,工作進程不需要等待I/O完成,內核空間I/O完成后會通過事件通知進程。第二階段依然需要工作進程參與庫函數把內核空間數據復制到用戶空間,第二階段依舊阻塞。
5) 全異步:AlO 調用
全異步1: 工作進程調用I/O庫函數,工作進程不需要等待I/O完成,內核空間I/O完成后會通過事件通知進程。第二階段不需要工作進程參與庫函數把內核空間數據復制到用戶空間,庫函數完成復制后自行返回數據給工作進程
全異步2: 工作進程調用I/O庫函數,工作進程不需要等待I/O完成,內核空間I/O完成后會通過事件通知進程。第二階段不需要庫函數從內核空間復制數據,而是通過內存映射來實現(mmap)。
實現以上功能,libevent 庫
原創文章,作者:以馬內利,如若轉載,請注明出處:http://www.www58058.com/4811
各位大神見諒,非專業出身,I/O 模型實在不知道怎么表現才真正準確,自己也很淺
已經很棒了