[TOC] 1. IO模型 Linux下可用的IO模型有5種,分別是: 阻塞式IO 非阻塞式IO IO復用 信號驅動式IO(SIGIO) 非同步IO(Posix的aio_系列函數) 其中,除了非同步IO,其餘都屬於同步IO模型。 在這5種模型中,我們目前只關註前3種,並且把IO復用放在網路編程專題中講, ...
目錄
1. IO模型
Linux下可用的IO模型有5種,分別是:
- 阻塞式IO
- 非阻塞式IO
- IO復用
- 信號驅動式IO(SIGIO)
- 非同步IO(Posix的aio_系列函數)
其中,除了非同步IO,其餘都屬於同步IO模型。
在這5種模型中,我們目前只關註前3種,並且把IO復用放在網路編程專題中講,本文只簡單介紹阻塞式IO和非阻塞式IO的概念與區別。
2. 阻塞式IO
阻塞式IO是Linux中最基本、最常用的IO模型,指的是可能會使進程永遠阻塞的函數,一般表現為:
- 進程或線程調用某個函數,該函數需要滿足特定條件才能向下執行
- 如果條件不滿足,則會使調用進程或線程阻塞,讓出CPU控制權,並一直持續到條件滿足為止
- 在Linux中,阻塞式IO一般作為預設屬性出現,如mq_receive、sem_wait、sem_post等
在預設情況下,所有的套接字都是阻塞的,我們以UDP套接字為例來展示阻塞式IO模型,如下圖所示。
進程調用recvfrom接收數據,但由於內核還未準備好,進程就會阻塞;直到內核准備好數據,recvfrom完成數據複製工作,進程才能解除阻塞狀態。
3. 非阻塞式IO
顧名思義,非阻塞式IO不會使調用進程或線程永遠阻塞,具體表現為:如果IO操作不能完成,則立即出錯返回,調用進程或線程繼續向下執行。
對於一個給定的描述符,有兩種將其指定為非阻塞式IO的方法:
- 調用open創建或打開文件時指定O_NONBLOCK標誌
- 對於一個已經打開的描述符,調用fcntl改變其屬性,為其設置O_NONBLOCK標誌
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* int arg */);
將cmd設為F_SETFL,arg設為O_NONBLOCK
,就可以為fd設置非阻塞標誌。