同步 IO 和异步 IO
在 linux 中對 io 操作就是把內核態(tài)準備就緒的數據拷貝到用戶態(tài)。
啥是內核態(tài)呢,內核態(tài)就是 linux 內核,用戶態(tài)則是用戶進程中的某個線程,即 io 操作其實就是內核態(tài)和用戶態(tài)的切換。
io 操作大致分為兩種:
io 操作分為兩步
同步 io 和異步 io 最大的區(qū)別就是同步 io 的發(fā)起方(用戶線程)會阻塞或輪詢等待 io 完成,而異步則是在發(fā)起 io 請求后立即返回繼續(xù)執(zhí)行后面的代碼。同步 io 的特點
1、同步 io 是用戶線程發(fā)起 io 請求并以阻塞或輪詢的方式來等待 io 的完成 2、同步 io 是 io 的發(fā)起方,同時也是處理方 3、同步 io 是需要將內核態(tài)準備就緒的數據拷貝到用戶態(tài),所以需要阻塞用戶態(tài)程序并等待 io 完成異步 io 的特點
1、異步 io 在用戶線程發(fā)起 io 請求后會立即返回繼續(xù)執(zhí)行后續(xù)的邏輯流 2、異步 io 是 io 的發(fā)起方,但內核態(tài)才是處理方 3、異步 io 的處理方是內核態(tài),所以不需要阻塞阻塞 io:
用戶線程發(fā)起 io 請求并阻塞用戶線程釋放 CPU 執(zhí)行權,等待內核態(tài)的 io 處理完成。
非阻塞 io:
用戶線程發(fā)起 io 請求會立即返回處理后面的代碼,但是會有線程以輪詢的方式查詢內核態(tài)的 io 是否處理完成,如果 io 完成則立即拷貝到用戶進程,這種方式對 CPU 資源消耗較高。
io 多路復用:
Java nio 就是多路復用的 io 模型,多路復用模型是由一個線程監(jiān)聽多個 socket,這種方案比較適用于 io 比較多的情況,io 多路復用的性能是比非阻塞 io 要高的,因為多路復用模型的輪詢是在內核態(tài),而非阻塞 io 的輪詢是在用戶態(tài),但是在任務數量比較多或比較大的情況下 io 多路復用需要逐一去處理已完成的 io,會導致后續(xù)的 io 得不到處理或者等待過長時間才能得到處理。
信號驅動 io:
用戶線程發(fā)起 io 請求,然后給負責 io 的 socket 注冊一個函數用于完成后的回調,當內核態(tài)數據準備完成后會發(fā)出一個信號,用戶線程接收后會調用之前注冊的函數來讀寫 io
異步 io:
用戶線程發(fā)起 io 請求后會立即返回,并當內核態(tài)的 io 完畢后會將數據拷貝到用戶態(tài),然后再發(fā)送信號通知用戶線程已就緒,整個過程用戶線程是不會阻塞也不需要其它額外操作的,除了發(fā)起 io 請求,處理 io 和拷貝數據均由內核態(tài)完成。
總結以上幾種 io 模型,除了最后一個是異步 io 模型,其它的 io 模型都是同步。
總結
以上是生活随笔為你收集整理的同步 IO 和异步 IO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬件:笔记本常见故障处理技巧与思路,值得
- 下一篇: Save as PDF/X-3/4/5