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