阻塞io
只要核心沒有將資料準備好,系統的呼叫就會一直等待,所有的套接字,都是阻塞方式。
非阻塞式io
如果核心還未將資料準備好, 系統調⽤用仍然會直接返回, 並且返回ewouldblock錯誤碼.
非阻塞io往往需要程式設計師迴圈的方式反覆嘗試讀寫⽂檔案描述符, 這個過程稱為輪詢. 這對cpu來說是較⼤大的浪
費, ⼀一般只有特定場景下才使⽤用.
訊號驅動io
利用sigio訊號通知程式進行io操作,系統呼叫sigactio,若是核心沒有準備好,則直接返回繼續等待,直至核心
遞交sigio訊號準備就緒,系統開始讀取。
io多路轉接
利用select控制多個檔案描述符,讀取核心資訊。
非同步io
由核心在資料拷⻉貝完成時, 通知應⽤用程式(⽽而訊號驅動是告訴應⽤戶序何時可以開始拷⻉貝資料).
任何io過程中, 都包含兩個步驟. 第一是等待, 第二是拷貝. 而且在實際的應用場景中, 等待消耗的時間往往都遠遠高於拷貝的時間. 讓io更高效, 最核心的辦法就是讓等待的時間盡量少.
fcntl
int fcntl(int fd, int cmd, … /* arg */ );
重定向dup、dup2
int
dup(
int oldfd)
;int
dup2
(int oldfd,
int newfd)
;
兩個均為複製乙個現存的檔案的描述
兩個函式的返回:若成功為新的檔案描述,若出錯為-1;
由dup返回的新檔案描述符一定是當前可用檔案描述中的最小數值。用dup2則可以用fd2引數指定新的描述符數值。如果fd2已經開啟,則先關閉。若fd1=fd2,則dup2返回fd2,而不關閉它。通常使用這兩個系統呼叫來重定向乙個開啟的檔案描述符。
利⽤用了dup分配⽂檔案描述符是從最⼩小的開始分配這樣的機制, 來完成這個重定向. 相
⽐比之下, 是⽤用dup2更加優雅⼀一些.(通常用dup2)
int
select
(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout)
;
用途
引數關於fd_set描述
fd_set這個結構就是⼀乙個整數陣列, 更嚴格的說, 是⼀乙個 「位圖」. 使⽤用位圖中對應的位來表⽰示要監視的⽂檔案描述符。
void
fd_clr
(int fd, fd_set *set)
;// ⽤用來清除描述片語set中相關fd 的位
intfd_isset
(int fd, fd_set *set)
;// ⽤用來測試描述片語set中相關fd 的位是否為真
void
fd_set
(int fd, fd_set *set)
;// ⽤用來設定描述片語set中相關fd的位
void
fd_zero
(fd_set *set)
;// ⽤用來清除描述片語set的全部位
函式返回值
socket就緒條件
讀就緒socket上收到帶外資料. 關於帶外資料, 和tcp緊急模式相關(回憶tcp協議頭中, 有⼀乙個緊急指標的字段),
select特點
select 缺點是為處理⼤大批量控制代碼⽽而作了改進的poll,它⼏幾乎具備了之前所說的⼀一切優點,被公認為linux2.6下效能最好的多路i/o就緒通知⽅方法。
epoll的使⽤用過程就是三部曲
調⽤用epoll_create建立⼀乙個epoll控制代碼;
調⽤用epoll_ctl, 將要監控的⽂檔案描述符進⾏行註冊;
調⽤用epoll_wait, 等待⽂檔案描述符就緒;
epoll的優點
select ,poll ,epoll區別
驚群問題
網路通訊 RPC框架在網路通訊上的網路IO模型
首先,應用程序發起 io 系統呼叫後,應用程序被阻塞,轉到核心空間處理。之後,核心開始等待資料,等待到資料之後,再將核心中的資料拷貝到使用者記憶體中,整個 io 處理完畢後返回程序。最後應用的程序解除阻塞狀態,執行業務邏輯。系統核心處理 io 操作分為兩個階段 等待資料和拷貝資料。而在這兩個階段中,...
C 網路通訊
c 網路通訊 一 伺服器端程式 10.17 1.建立伺服器端socket 1 使用socket類 建立伺服器socket物件 socket objs new socket 引數 使用ipendpoint類設定伺服器ip位址和埠號 或使用dns類 ipaddress serip ipaddress.p...
Winsock網路通訊
winsock網路通訊 這裡我希望和大家 一下winsock網上通訊的程式,由於網際網路的普及,越來越多的程式具有了在網上與其他程式通訊的功能.其實所有這些功能都建立在winsock介面之上,應用程式執行大多數網路通訊的基本物件稱為套介面或軟插口 socket 使用mfc winsocket類新增網...