非阻塞io
阻塞與非阻塞的區別
為什麼有阻塞式
常見的阻塞式:wait,pause,sleep等函式,read,write某些檔案
阻塞式的好處
1.有利於作業系統的效能發揮,你阻塞的時候不佔cpu
為什麼要實現非阻塞式
1.因為需要多路進行執行,比如處理鍵盤(阻塞)和滑鼠監聽(阻塞),就需要實現非阻塞
如何實現非阻塞io訪問:
1.在開啟檔案描述的符的時候新增上o_nonblock和fcntl
o_nonblock
開啟之前就知道需要非阻塞式,就以非阻塞式形式開啟
fcntl
開啟之前並不知道是否需要非阻塞式,如果後面想用非阻塞式,也可以
然後使用while(1)死迴圈,read fd=1,fd=0來實現只要鍵盤滑鼠有資料就輸出的功能,但這效能並不好
io多路復用(io multiplexing)
為了解決while(1)迴圈的效能問題,可以使用io多路復用(io multiplexing)
使用select,poll,這兩個函式幾乎一模一樣
實現的方式都是:
外部阻塞(select這個函式是阻塞的),內部非阻塞自動輪詢多路阻塞式io(select內部非阻塞自動輪詢鍵盤和滑鼠事件,而鍵盤和滑鼠事件是使用阻塞的方式)
select記憶體非阻塞式輪詢和while(1)不同,會讓出cpu,
select 需要驅動程式的支援,驅動程式實現fops內的poll 函式。 select 通過每個裝置檔案對應的 poll 函式提供的資訊判斷當前是否有資源可用 ( 如可讀或寫 ) ,
如果有的話則返回可用資源的檔案描述符個數,沒有的話則睡眠,等待有資源變為可用時再被喚醒繼續執行。
返回值就是註冊到select的io
然後實現多次select,可以使用while(1)死迴圈來包含select,這樣就不會一直占用cpu
其實也可以使用多執行緒而不用select,但使用多執行緒會比較浪費
非同步io
非同步io就是作業系統用軟體實現的一套中斷響應系統
非同步io的工作方法,我們當前程序註冊乙個非同步io事件(使用signal註冊乙個訊號sigio的處理函式),然後當前程序可以正常處理自己的事情,當
非同步事件發生後當前程序會收到乙個sigio訊號,從而執行繫結的處理函式去處理這個非同步事件,其實就是使用訊號來觸發。
非同步的實現是應用和驅動之間的關係
涉及的函式
fcntl(f_getfl,f_setfl,o_async,f_setown),使用f_getfl獲取當前io資訊,再屬性資訊中新增o_async,然後f_setfl回去就可以實現非同步了,非同步事件通知發給誰(程序id或者程序組id),就使用f_setown
儲存對映io mmap函式(記憶體對映,即兩塊記憶體其實是一塊記憶體)
mmap函式,把乙個檔案和記憶體對映對應起來,比如lcd顯示,把資料丟到視訊記憶體(屬於核心)就可以顯示在螢幕上了。那現在的問題是我們的資料內容在檔案中,這麼如何放到視訊記憶體
一般的思路:硬碟檔案->讀取資料到應用層記憶體->然後賦值到lcd核心視訊記憶體->lcd顯示,如果這樣實現,假設硬碟檔案很大,那麼就會出現速度過慢的情況,比如電影
使用mmap提高效率
mmap函式,記憶體對映,即兩塊記憶體其實是一塊記憶體,也就是說我只申請了一塊物理記憶體,然後核心層和應用層的虛擬位址都對映到這這塊物理記憶體。
儲存對映io的特點
1.記憶體共享而不是複製,減少記憶體操作
2.處理大檔案效率高,小檔案不划算
IO 同步,非同步,阻塞,非阻塞
參考文章 好文推薦 唉最近真是高產似母豬,剛進新公司工作量暫時不飽和,只能每天學學學學學學查漏補缺啦,學習使我快樂哈哈哈哈哈哈哈哈 標題裡的詞彙相信都經常看到,但是能說清楚的估計20個人裡面能有1個就不錯了,網上的資料也是五花八門,大部分描述差不多,很多時候估計作者本身也是似懂非懂,我也看了很多文章...
同步 非同步 阻塞 非阻塞 I O
一 同步 非同步 首先要是多個事物,只有乙個事物,是不存在同步或非同步的。同步 指協同步調。即,多個事物不能同時進行,必須乙個乙個的來,上乙個事物結束後,下乙個事物才開始。那當乙個事物正在進行時,其他事物在幹嘛呢?嚴格來講並沒有要求,但一般都處於 等待 狀態,因為後面事物的正常進行都需要依賴前面事物...
同步非同步IO,阻塞非阻塞
同步io操作 導致請求程序阻塞,知道io操作完成。非同步io操作 不導致程序阻塞。在處理 網路 io 的時候,阻塞和非阻塞都是同步io,阻塞,就是呼叫我 函式 我 函式 沒有接收完資料或者沒有得到結果之前,我不會返回。非阻塞,就是呼叫我 函式 我 函式 立即返回,通過select通知呼叫者 阻塞與非...