天天看點

阻塞與非阻塞IO

阻塞操作是指在執行裝置操作時,若不能獲得資源,則挂起程序直到滿足操作的條件後再進行操作,被挂起的程序進入睡眠狀态,被從排程器的運作隊列移走,直到等待的條件被滿足,而非阻塞操作的程序在不能進行裝置操作時,并不挂起,它要麼放棄,要麼不停的查詢,直到可以進行操作為止。

簡單的來說就是:阻塞調用會一直等待(睡眠等待),直到獲得資源後,才會傳回。而非阻塞操作則會立馬傳回,并不斷查詢。

在阻塞通路時,不能擷取資源的程序将進入休眠,它将CPU資源禮讓給他其他程序,因為阻塞的程序會進入休眠狀态,是以必須確定有一個地方能夠,喚醒休眠程序,喚醒程序的地方最大的可能發生在中斷裡面,因為在硬體資源獲得的同時往往伴随着一個中斷,而非阻塞程序則不斷嘗試,知道可以進行IO。

char buf;

fd = open("/dev/ttyS1", O_RDWR);
...
res = read(fd, &buf, 1);
if(res == 1)
    printf("%c\n ", buf);
           

上面的程式阻塞的打開并讀取序列槽一個字元的代碼。

下面是非阻塞的代開序列槽讀一個字元

char buf;

fd = open("/dev/ttyS1", O_RDWR| O_NONBLOCK);
...
while(read(fd, &buf, 1)!=1) /*序列槽上無輸入的也傳回,是以要循環嘗試讀取*/
    continue;
printf("%c\n", buf);
           

繼續閱讀