io-同步 异步 阻塞 非阻塞
同步io是你的線程自己去向內核查詢所要的數據是否可用。在查詢的時候,數據不可用的話:
如果內核將這個線程塞進等待隊列,直到數據可用時,內核將線程加進可運行隊列,并將可用數據給它,則是阻塞型io;
如果內核不將其塞進等待隊列,而是直接給他一個error代碼表示數據不可用,則是非阻塞io。執行非阻塞型io的線程需要一遍一遍的去詢問內核數據是否可用,否則它可能讀不到可用的數據。
可見-同步 異步 阻塞 非阻塞的關系。
①異步同步是指線程對數據獲取的方式而言的,
異步:內核主動通知線程,
同步:線程主動詢問內核。
②而阻塞非阻塞是在線程主動詢問內核時,內核對線程的不同處理方式。所以阻塞非阻塞都是在同步的情況下發生的。
即
|----異步
|----同步|-----阻塞
???????????? |-----非阻塞
執行同步io時,就是直接向內核索取數據,非阻塞io(r如read函數)會立即返回,阻塞io(如read函數)則在數據可用時返回。線程中需要對返回值檢查,返回值一般是數據不可用時的錯誤代碼或可用數據。
執行異步io時,就像向內核提交一個"申請當數據可用時的事件通知"的服務(所以可以立即返回),所以需要向內核提交一個事件參數,當數據可用時,內核自動觸發該事件。
當然執行異步io的談不上阻塞非阻塞,因為他在執行異步io(比如read)時內核沒機會沒理由將它阻塞。
轉載于:https://www.cnblogs.com/-song/archive/2011/10/28/3331938.html
總結
以上是生活随笔為你收集整理的io-同步 异步 阻塞 非阻塞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery 输入框 在光标位置插入内容
- 下一篇: usb4-配置usb触摸屏