在Linux中,對檔案的讀寫其實就是IO。
與IO有關的名詞:同步,非同步,阻塞,非阻塞,甚至是同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞。別急,下面有舉例
IO分為兩大種,同步和非同步
同步IO:
阻塞IO
非阻塞IO
IO多路複用(包括select,poll,epoll三種)
訊號驅動IO
非同步IO
那麼如何理解區別這幾個概念呢?尤其是同步和阻塞,非同步和非阻塞,看起來就是一樣的.
舉個例子結合自己的理解來說明一下:
- ①:你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,你自己看著點兒!".於是你就站在旁邊只等饅頭.此時的你,是阻塞的,是同步的.阻塞表現在你除了等饅頭,別的什麼都不做了.同步表現在等饅頭的過程中,阿梅不提供通知服務,你不得不自己要等到"饅頭出爐"的訊息.
- ②:你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,你自己看著點兒!".於是你就站在旁邊發微信,然後問一句:"好了沒?",然後發QQ,然後再問一句:"好了沒?".此時的你,是非阻塞的,是同步的.非阻塞表現在你除了等饅頭,自己還乾乾別的時不時會主動問問饅頭好沒好.同步表現在等饅頭的過程中,阿梅不提供通知服務,你不得不自己要等到"饅頭出爐"的訊息.
- ③:你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,蒸好了我打電話告訴你!".但你依然站在旁邊只等饅頭,此時的你,是阻塞的,是非同步的.阻塞表現在你除了等饅頭,別的什麼都不做了.非同步表現在等饅頭的過程中,阿梅提供電話通知"饅頭出爐"的訊息,你只需要等阿梅的電話.
- ④:你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,蒸好了我打電話告訴你!".於是你就走了,去買了雙新球鞋,看了看武館,總之,從此不再過問饅頭的事情,一心只等阿梅電話.此時的你,是非阻塞的,是非同步的.非阻塞表現在你除了等饅頭,自己還乾乾別的時不時會主動問問饅頭好沒好.非同步表現在等饅頭的過程中,阿梅提供電話通知"饅頭出爐"的訊息,你只需要等阿梅的電話
如果你仔細品過上面案例中的每一個字,你就能慢慢體會到之所以非同步和非阻塞,同步和阻塞容易混淆,僅僅是因為二者的表現形式稍微有點兒相似而已.
阻塞和非阻塞關注的是:在等饅頭的過程中,你在幹啥.
同步和非同步關注的是:等饅頭這件事,你是一直等到"饅頭出爐"的結果,還是立即跑路等阿梅告訴你的"饅頭出爐".重點的是你是如何得知"饅頭出爐"的.
所以現實世界中,最傻的人才會採用非同步阻塞的IO方式去寫程式.其餘三種方式,更多的人都會選擇同步阻塞或者非同步非阻塞.同步非阻塞最大的問題在於,你需要不斷在各個任務中忙碌著,導致你的大腦混亂,非常累.
原文地址:https://blog.ti-node.com/blog/6389362802519179264