使用多個進程/線程,而後在每個進程/線程中使用阻塞 IO 讀取,其中每個進程/線程的執行序列如:異步
while(read(fd,buf,buf_len)>0){/* 阻塞 IO */ /* 處理讀取獲得的內容 */ }
在一個進程/線程中使用非阻塞 IO,此時會形成大量的系統調用.async
while(true){/* fd1,fd2 均設置了 O_NONBLOCK 標誌 */ if(read(fd1,buf,buf_len)>0){ /* 處理從 fd1 中讀取的數據 */ } if(read(fd2,buf,buf_len)>0){ /* 處理從 fd2 中讀取的數據 */ } }
異步 IO.函數
基本思想:進程告訴內核,當一個描述符已準備好能夠進行 IO 時,用一個信號通知它.spa
侷限,通常狀況下,內核只提供了一個異步 IO 信號,因此當進程收到一個異步 IO 信號時,只是知道了一個文件描述符能夠進行 IO,但不知道具體是那個文件描述符.如:線程
void async_io_sigcatch(int,siginfo_t *siginfo,void *){/* 異步 IO 信號處理程序 */ /* 仍須要以非阻塞模式讀取,判斷是那個文件描述符能夠 IO */ if(read(fd1,buf,buf_len)>0){ /* 處理從 fd1 中讀取的數據 */ } if(read(fd2,buf,buf_len)>0){ /* 處理從 fd2 中讀取的數據 */ } }
IO 多路轉接code
IO 多路轉接函數: 首先在一個文件描述符上指定感興趣的 IO 事件,而後調用 IO 多路轉接函數,則 IO 多路轉接函數會阻塞當前進程/線程直至文件描述符上感興趣的 IO 事件之一發生.接口
Linux,能夠執行 IO 多路轉接的函數有 select(),poll(),epoll_wait()..
進程
Linux 中,能夠用做異步 IO 的信號有 SIGURG,SIGIO(Linux 下,SIGPOLL==SIGIO).事件
使用 SIGURG,內存
調用 fcntl(fd,F_SETOWN,進程 ID/進程組 ID),設置文件描述符的所屬進程/所屬進程組.
此後,當 fd 上帶外數據到達時,內核就會將 SIGURG 信號發送給指定的進程/進程組.
使用 SIGIO/SIGPOLL 信號:
調用 fcntl(fd,F_SETOWN,進程 ID/進程組 ID),設置文件描述符的所屬進程/所屬進程組.
調用 fcntl(fd,F_SETFL,O_ASYNC|...),即調用 F_SETFL 設置 O_ASYNC 標誌.
此後當 fd 能夠進行 IO 時,內核就會將 SIGIO/SIGPOLL 信號發送給指定的進程/進程組.
存儲映射 IO 使一個磁盤文件與進程地址空間上一段緩衝區相映射,因而當從內存區域中讀取數據,就至關於讀文件中的相應字節,將數據存入緩衝區,則相應字節就自動地寫入文件中.
頁,是一個具備固定長度的內存塊,長度能夠經過 getpagesize()/sysconf(_SC_PAGESIZE) 獲取.
/** * mmap [--len=LEN | -l LEN] * [--off=OFF | -o OFF] * [--read --write -r -w ] * [ --private --shared -p -s] * [--close|-c] * [--verbose] * filename. * mmap() 系統調用的接口,mmap() 的函數原型: void *mmap(void *addr,size_t length,int prot,int flags,int fd,off_t offset). * --len|-l 指定了參數 length 的取值爲 LEN,默認爲文件的長度. * --off|-o 指定了參數 offset 的取值爲 OFF,默認爲 0. * --read|-r,--write|-w,指定了參數 prot 的取值爲 PROT,默認爲 PROT_READ|PROT_WRITE. * --shared|-s,--private|-p 指定了參數 flags 的取值爲 FLAGS,默認爲 MAP_SHARED. * --close | -c 指定了在調用 mmap() 以後關閉文件 fd,默認不關閉文件. * --verbose | -v 顯示詳細輸出 * 在程序運行中,能夠輸入: * show [--len=LEN|-l LEN] [--off=OFF|-o OFF] * 顯示映射 [off,off+len) 範圍內的內容. * --off | -o 指定了待顯示範圍的起始偏移,默認爲 0. * --len | -l 指定了待顯示範圍的長度,默認爲: length-OFF,length 爲 mmap() 的第 2 個參數. * * modify [--off=OFF | -o OFF] STRING * 修改映射區的內容. * --off | -o 指定了被修改範圍的起始偏移,默認爲 0. * STRING 指定了修改內容,不包含了 '\0' . * * unmap [--off=OFF | -o OFF] [--len=LEN | -l LEN] * 解除映射 * -o|--off 指定了被解除映射區域至關於 mmap_ret 的偏移,必須是 pagesize 的整數倍. * -l|--len 指定了被解除映射區的長度. * * protect [--off=OFF | -o OFF] [--len=LEN | -l LEN] [--read|-r][--write|-w] * 對指定的內存區域 [off,off+len) 設置保護. * --off|-o 默認值爲 0. * --len|-l 默認值爲 4096 * --read|-r,--write|-w 指定了 prot,默認爲 PROT_READ|PROT_WRITE. */