假設有一行程式
....
r = read('檔案') // 這行會去叫kernel ,然後 kernel 會去找IO device(可能是光碟機)之類的讀檔案
....
- 同步(Synchronous):Proccess跑到read()就停下來,直到kernel給個回應,因此Application 的 Proccess 會跟 kernel 程式同步(Synchronous)。
- 非同步(Asynchronous):Proccess跑到read()後不會停下來,直到kernel給個回應再說,因此Application 的 Proccess 會跟 kernel 程式不同步(Asynchronous )。
- 阻塞(Blocking):當 kernel 去找 IO 做事時,它就一直等,直到 IO 給予回應。因為kernel此時不能做其他事情,所以就是 Blocking的狀況。
- 非阻塞(Non-blocking):當 kernel 去找 IO 做事時,它不會等而是去做別的事情,直到 IO 給予回應,他在把結果傳回Application。因為kernel此時還是可以做事,,所以它就是N on-blocking 的狀況。
-
Synchronous Blocking I/O: 進行 I/O 的指令後,Process 不能先往下做別的事,指令也要等 I/O 設備都完成,才可以繼續往下執行。 read/write 就是在做這件事事。
-
Asynchronous Blocking I/O: 進行 I/O 的指令後,Process 可以先往下去處理別的事(找找看有沒有其他 I/O 的要求完成,如果有的話,就執行該 I/O 要求後接下來的資料處理) ,但該指令後 kernel 要等到所有 I/O 的內容都到齊才卸下責任。因此,我們說這次作業用的 select()屬於這類。
-
Synchronous Non-blocking I/O: 進行 I/O 的指令後,Process 不能往下先做別的事,但 Kernel不用等到 I/O 完成就可以結束責任。因此,該指令得馬上回傳目前有的東西(一般來說,沒完成會回傳 EAGAIN 之類的,表示 I/O 還沒完成,有的話就回傳讀到的結果)。在這樣的情況下,CPU 得一直重新要求,直到 I/O 備齊資料而回傳。這種做法,通常稱為「Polling」。恐龍書會告訴你,Polling 非常浪費時間,通常會使用 multithreading,以另一個 thread 來執行詢問的行為。
-
Asynchronous Non-blocking I/O: 進行 I/O 的指令後,CPU 可以往下處理別的事,而且 kernel也會直接卸下責任。這種模式下,通常會是 I/O 完成後,由 I/O 端跟 kernel 要求插斷,才進行處理。除了 AIO,最常見的用途就是 GUI 的 listener。一旦 listener 執行後,後端程式會繼續往
(以上為計算機網路課程助教提供的內容)