日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.6.1.非阻塞IO

發布時間:2023/11/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3.6.1.非阻塞IO 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節講解什么是非阻塞IO,如何將文件描述符修改為非阻塞式

3.6.1.1、阻塞與非阻塞

(1)阻塞是指函數調用會被阻塞。本質是當前進程調用了函數,進入內核里面去后,因為當前進程的執行條件不滿足,內核無法里面完成操作,就掛起這個進程,去執行其他進程。默認使用阻塞IO
(2)非阻塞IO當條件不滿足時直接停止當前操作,退出程序(?)。或者非阻塞IO條件不滿足時會一直占用CPU資源
(3)結合程序狀態轉換圖一起理解

3.6.1.2、為什么有阻塞式
(1)常見的阻塞:wait、pause、sleep等函數;read或write某些文件時
wait等待回收子進程:當子進程沒死,父進程就不能回收子進程,內核就阻塞住父進程,知道子進程死去稱為僵尸進程,這時內核就會發一個信號給父進程,父進程就會被喚醒,去回收子進程。

(2)阻塞式的好處
非常有利于OS的性能發揮。阻塞時不會占用CPU,CPU可以去執行其他。

3.6.1.3、非阻塞

(1)為什么要實現非阻塞
(2)如何實現非阻塞IO訪問:O_NONBLOCK和fcntl

a -- 阻塞
阻塞操作是指在執行設備操作時,若不能獲得資源,則掛起進程知道滿足可操作的條件后再進行操作;被掛起的進程進入休眠狀態(放棄CPU),被從調度器的運行隊列移走,直到等待的條件被滿足;
b -- 非阻塞
非阻塞的進程在不能進行設備操作時,并不掛起(繼續占用CPU),它或者放棄,或者不停地查詢,直到可以操作為止;
二者的區別可以看應用程序的調用是否立即返回!

驅動程序通常需要提供這樣的能力:當應用程序進行 read()、write() 等系統調用時,若設備的資源不能獲取,而用戶又希望以阻塞的方式訪問設備,驅動程序應在設備驅動的xxx_read()、xxx_write() 等操作中將進程阻塞直到資源可以獲取,此后,應用程序的 read()、write() 才返回,整個過程仍然進行了正確的設備 訪問,用戶并沒感知到;若用戶以非阻塞的方式訪問設備文件,則當設備資源不可獲取時,設備驅動的 xxx_read()、xxx_write() 等操作立刻返回, read()、write() 等系統調用也隨即被返回。因為阻塞的進程會進入休眠狀態,因此,必須確保有一個地方能夠喚醒休眠的進程,否則,進程就真的掛了。喚醒進程的地方最大可能發生在中斷里面,因為硬件資源獲得的同時往往伴隨著一個中斷。阻塞I/O通常由等待隊列來實現,而非阻塞I/O由輪詢來實現。

轉載于:https://www.cnblogs.com/Ocean-Star/p/9245364.html

總結

以上是生活随笔為你收集整理的3.6.1.非阻塞IO的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。