您好,登錄后才能下訂單哦!
這篇文章主要介紹了Linux中五種IO模型是什么,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
我們都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二進制流而已、不管socket、還是FIFO、管道、終端、對我們來說、一切都是文件、一切都是流、在信息交換的過程中、我們都是對這些流進行數據的收發操作、簡稱為I/O操作(input and output)、往流中讀出數據、系統調用read、寫入數據、系統調用write。
Linux下可用的IO模型有5種,分別是:
阻塞式IO
非阻塞式IO
IO復用
信號驅動式IO(SIGIO)
異步IO(Posix的aio_系列函數)
其中,除了異步IO,其余都屬于同步IO模型。 在這5種模型中,我們目前只關注前3種,并且把IO復用放在網絡編程專題中講,本文只簡單介紹阻塞式IO和非阻塞式IO的概念與區別。
阻塞式IO是Linux中最基本、最常用的IO模型,指的是可能會使進程永遠阻塞的函數,一般表現為:
進程或線程調用某個函數,該函數需要滿足特定條件才能向下執行 如果條件不滿足,則會使調用進程或線程阻塞,讓出CPU控制權,并一直持續到條件滿足為止 在Linux中,阻塞式IO一般作為默認屬性出現,如mq_receive、sem_wait、sem_post等 在默認情況下,所有的套接字都是阻塞的,我們以UDP套接字為例來展示阻塞式IO模型,如下圖所示。 進程調用recvfrom接收數據,但由于內核還未準備好,進程就會阻塞;直到內核準備好數據,recvfrom完成數據復制工作,進程才能解除阻塞狀態。
顧名思義,非阻塞式IO不會使調用進程或線程永遠阻塞,具體表現為:如果IO操作不能完成,則立即出錯返回,調用進程或線程繼續向下執行。 對于一個給定的描述符,有兩種將其指定為非阻塞式IO的方法: 調用open創建或打開文件時指定O_NONBLOCK標志 對于一個已經打開的描述符,調用fcntl改變其屬性,為其設置O_NONBLOCK標志
#includeint fcntl(int fd, int cmd, ... /* int arg */);
將cmd設為F_SETFL,arg設為O_NONBLOCK,就可以為fd設置非阻塞標志。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Linux中五種IO模型是什么”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。