阻塞IO與非阻塞IO

2021-08-20 04:34:08 字數 3385 閱讀 2183

阻塞io,

當前程序因不滿足一些條件,而被掛起,即阻塞,cpu改去服務其它程序,

read乙個普通檔案,就馬上執行,read乙個滑鼠,可是滑鼠沒有動,於是就阻塞了,

阻塞的好處,

利於os效能的發揮,cpu發揮高,雖然個體的費了點時間,但是總的效率得到了提高,

阻塞在多路io的時候,缺陷就出來了,比如2路io分別要讀鍵盤和滑鼠,阻塞在滑鼠,可是滑鼠沒動,然後鍵盤輸入也沒用,

非阻塞io,如果涉及多路io,最好就不要用阻塞io,

預設都是阻塞方式,

實現非阻塞,

1,開啟檔案o_nonblock,

2,fcntl函式,

讀取鍵盤,標準輸入,stdin,0,預設就是開啟的,

read( 0, buf, 2 );

讀取滑鼠,

int fd = -1;

fd = open( 「/dev/input/mouse1」, o_rdonly );

read( fd, buf, 5 );

同時讀取鍵盤和滑鼠,

由於讀取2者,都是阻塞方式的,

而且程式中有固有的先後順序,我們需要配合,比如先動滑鼠,然後動鍵盤,

阻塞有它的好處,也有它的不便之處,

#include 

#include

#include

#include

#include

#include

int main(void)

memset(buf, 0, sizeof(buf));

printf("before 滑鼠 read.\n");

read(fd, buf, 50);

printf("滑鼠讀出的內容是:[%s].\n", buf);

// 讀鍵盤

memset(buf, 0, sizeof(buf));

printf("before 鍵盤 read.\n");

read(0, buf, 5);

printf("鍵盤讀出的內容是:[%s].\n", buf);

return

0;

}

非阻塞io,如果沒有讀到東西,就立即返回,

改變標準輸入為非阻塞式的,

flag = fcntl( 0, f_getfl );

flag |= o_nonblock;

fcntl( 0, f_setfl, flag );

非阻塞開啟滑鼠,

fd = open( 「/dev/input/mouse1」, o_rdonly | o_nonblock );

然後出現了一種結果,

從滑鼠和鍵盤所讀出的內容都是空的,因為來不及輸入,

接著,做了一種改變,

把讀滑鼠和鍵盤放到乙個while(1)中,

經過這次修改,結果看起來舒服多了

#include 

#include

#include

#include

#include

#include

int main(void)

// 把0號檔案描述符(stdin)變成非阻塞式的

flag = fcntl(0, f_getfl); // 先獲取原來的flag

flag |= o_nonblock; // 新增非阻塞屬性

fcntl(0, f_setfl, flag); // 更新flag

// 這3步之後,0就變成了非阻塞式的了

while (1)

// 讀鍵盤

memset(buf, 0, sizeof(buf));

//printf("before 鍵盤 read.\n");

ret = read(0, buf, 5);

if (ret > 0)

} return

0;

}

常見的阻塞:wait、pause、sleep等函式;read或write某些檔案時常見的阻塞:wait、pause、sleep等函式,它們本身就是阻塞的,

read或write阻塞與否,看你操作的物件是誰,

#include 

#include

#include

#include

#include

#include

#include

#include

int main(void)

// 當前有2個fd,一共是fd乙個是0

// 處理myset

fd_zero(&myset);

fd_set(fd, &myset);

fd_set(0, &myset);

tm.tv_sec = 10;

tm.tv_usec = 0;

ret = select(fd+1, &myset, null, null, &tm);

if (ret < 0)

else

if (ret == 0)

else

if (fd_isset(fd, &myset))

} return

0;

}

這個是poll的示例**

#include 

#include

#include

#include

#include

#include

#include

int main(void)

; fd = open("/dev/input/mouse1", o_rdonly);

if (fd < 0)

// 初始化我們的pollfd

myfds[0].fd = 0; // 鍵盤

myfds[0].events = pollin; // 等待讀操作

myfds[1].fd = fd; // 滑鼠

myfds[1].events = pollin; // 等待讀操作

ret = poll(myfds, fd+1, 10000);

if (ret < 0)

else

if (ret == 0)

else

if (myfds[1].events == myfds[1].revents)

} return

0;

}

非阻塞IO與阻塞IO

非阻塞式呼叫的問題 kibuv提供了乙個執行緒池 阻塞於非阻塞對於被呼叫者,即系統層面,系統為程式提供了阻塞呼叫和非阻塞呼叫,同步和非同步是對於呼叫者,就是自己的程式,發七呼叫,沒有其他操作,只是等待結果這個過程就是同步,發起呼叫後會等待結果,繼續完成其他的工作,等有回掉再執行,這個過程就是非同步的...

阻塞I O,非阻塞I O

拿 socket舉例。當read資料時,如果這時沒有資料可讀,阻塞i o會一直等待有資料讀,資料從kernel copy 到socket的buffer後返回 非阻塞i o會立即返回,但如果有資料可讀,非阻塞i o也是等資料從kernel copy 到socket的buffer後返回。以上是阻塞與非阻...

阻塞與非阻塞I O

還記得上篇 我們講到的是linux中併發控制訪問的手段有哪些?原子 訊號量 自旋鎖 互斥體。這是為了保護臨界區的資源,是多個程序對共享資源的併發訪問的一種處理手段。但是,在驅動程式中,我們常常為了支援使用者空間對裝置的靈活訪問,引入了阻塞與非阻塞i o兩種不同模式。阻塞操作是指在執行裝置操作時若不能...