unix linux下主要的I O模型

2021-06-17 23:30:11 字數 1822 閱讀 6067

unix/linux下主要的4種i/o模型:

1,阻塞i/o:

最常用,最簡單,效率最低

2,非阻塞i/o:

可防止程序阻塞在i/o操作上,需要輪詢。

3,i/o多路復用:

允許同時對多個i/o進行控制

4,訊號驅動i/o:

一種非同步通訊模型。

阻塞i/o模式:

阻塞i/o是最普遍使用的i/o模式,大部分的程式使用的都是阻塞i/o。

預設的情況下,套按字建立以後所處於的模式就是阻塞i/o模式。

例如:讀操作read,recv,recvfrom

寫操作:write,send

其他操作:accept,connect

讀阻塞:程序呼叫read函式從套接字中讀取資料,當套接字中緩衝區中沒有要讀的資料,函式會阻塞。

它會一直阻塞下去,等待套接字的接收緩衝區中有資料可讀

經過一段的時間後,緩衝區中接收到資料,於是核心便去喚醒該程序,通過read訪問這些資料。

如果在程序阻塞過程中,對方發生故障,那這個程序將永遠阻塞下去。

寫阻塞:在寫操作上發生阻塞的情況比較少,主要發生在要寫入的緩衝區的大小小於要寫入的的資料量的情況下。

這時,寫操作不進行任何的拷貝工作,將發生阻塞,一旦緩衝區有足夠的空間,核心將喚醒程序,將資料從使用者緩衝    拷

貝到相應的傳送緩衝區中

特例:udpi不用等待使用者的確認,沒有實際的傳送緩衝區,所以udp協議中不存在傳送緩衝區滿的情況,在udp套接字上 執 行的寫操作將永遠不會阻塞。

非阻塞i/o:

於阻塞i/o相反,程序不會睡眠,立即返回乙個錯誤的資訊,這樣需要不停的查詢(polling),浪費cpu的資源操作。

多路復用i/o:

先構造一張有關的描述符表,然後呼叫乙個函式。當這些檔案描述符表中的乙個或多個已準備好進行i/o時函式才返回。 函式返回時告訴程序那個描述符準備就緒了,可以進行i/o操作了。

訊號驅動i/o:是一種非同步通訊模式,相當於中斷。

多路復用i/o來實現併發伺服器:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define  n  64

typedef struct sockaddr  sa;

int main(int argc,  char *argv)

bzero(&myaddr, sizeof(myaddr));

myaddr.sin_family = pf_inet;

myaddr.sin_port = htons(8001);

myaddr.sin_addr.s_addr = inet_addr("192.168.1.15");

if (bind(listenfd, (sa *)&myaddr, sizeof(myaddr)) < 0)

listen(listenfd, 5);

maxfd = listenfd;

fd_zero(&rdfs);

fd_set(listenfd, &rdfs);

//select的第乙個引數為最大檔案描述符加1,

while ( 1 )

for(i=0; i<=maxfd; i++)

else

else}}

}  //  end for

} // end while

return 0;

}  

UNIX LINUX下 M 的問題

unix和windows間的文字檔案轉換 在用電報通訊的年代,人們發明了一種用7bits把常用的英文和標點編碼的方法 這就是至今還在計算機世界應用的ascii。電報機每當列印到一行結尾時便需要 跳進下一行 並 回到第一格 因此ascii有lf line feed,0 0a 和cr carriage ...

設定 Unix,Linux環境下的NLS LANG

設定 nls lang 變數 1 正確配置 lc all 引數 2 配置 telnet ssh securecrt 客戶端的字符集 linux中可以用locale命令來檢視 nls lang設定,如下例所示 root hxzg locale lang en us.utf 8 lc ctype en ...

Unix Linux下的Shell命令解釋程式

unix的shell是作為作業系統的最外層,也稱外殼。它有以下幾種身份 作為命令語言 為使用者提供使用作業系統的介面,使用者利用該介面與機器互動 作為程式語言 使用者可以利用多條shell命令構成乙個檔案,稱為shell檔案或shell過程 作為shell命令解釋程式 用於對從標準輸入或檔案中讀入的...