高級 IO

從多個文件描述符中讀

  • 使用多個進程/線程,而後在每個進程/線程中使用阻塞 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()..
      進程

異步 IO

  • 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

  • 存儲映射 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.
 */
相關文章
相關標籤/搜索