經過IO模型帶來的思考

IO模型

對於IO,咱們常常能夠聽到諸如同步阻塞IO,同步非阻塞IO,異步IO等等,那麼什麼是異步/同步,什麼是阻塞/非阻塞?首先一次IO在UNIX系統中分爲兩個步驟微信

1.發起IO請求:用戶線程向操做系統內核發起IO請求異步

2.執行IO操做:當內核準備好數據能夠提交給發起IO請求的線程函數

阻塞/非阻塞的區別:發起IO請求以後會一直等待直到獲取數據則是阻塞,不然是非阻塞操作系統

同步/異步的區別:獲取到的數據是本身主動拿到的則是同步,是被動拿到的則是異步線程

下面我用取快遞這個例子來介紹一下UNIX的五種IO模型回調函數

衆所周知吸管喝飲料分爲兩個步驟:1.打開快遞櫃(發起IO請求),2.取走快遞(執行IO操做)同步

同步&阻塞IO

打開快遞櫃(發起IO請求),若是快遞櫃裏沒有東西(內核沒有準備好數據),則一直等在快遞櫃旁等快遞來(阻塞直到內核準備好數據),快遞櫃有了快遞則取走(用戶線程讀取內核中的數據)。效率

整個流程除了拿快遞,等快遞不能作其餘事軟件

同步&非阻塞IO

打開快遞櫃(發起IO請求),若是快遞櫃裏沒有東西(內核沒有準備好數據),則立刻作其餘事情每隔一段時間就去快遞櫃裏打開看看是否有快遞(輪詢內核是否準備好數據),快遞櫃有了快遞則取走(用戶線程讀取內核中的數據)。互聯網

儘管這個模型相對同步阻塞IO效率有必定提高,可是大量的無用輪詢形成了CPU的空轉,不多使用這種IO模型

同步&多路複用IO

須要同時取N個快遞,派一我的幫你監視快遞櫃,告訴他你想要哪一個快遞好比告訴他我要天貓的快遞,而後這個監視者一直站在快遞櫃旁邊等待天貓快遞到來並簽收,咱們只須要向這個監視者拿快遞就好了。

這個模型中,監視者就是咱們Java NIO中的Selector,一個線程阻塞同時監管多個線程鏈接狀態,返回給調用者鏈接狀態知足所註冊的狀態條件鏈接線程。

同步&信號驅動IO

在快遞櫃上寫上本身的手機號(回調函數),當快遞送過來的時候直接給我打電話(執行回調函數),而後我去取快遞。

異步IO

假設收快遞的是一個國王,只須要叫一聲 我想要收到個人快遞,剩下的都不用國王本身操心了,會派人去快遞櫃門口等快遞,而後會有人幫忙把快遞送到手上(用戶線程)

思考

其實同步異步/阻塞非阻塞並不是只是在計算機的世界裏有,在互聯網時代,大部分的場景都在經歷IO模型之間的轉變

網購/外賣:就是一種異步IO,商品(數據)從賣家/餐廳(內核態)被送貨員送到家(線程態),傳統的從家裏到餐廳而後吃飯,吃了回家,就是一種典型的同步阻塞IO。

滴滴打車:是一種信號驅動IO,在滴滴上下單事後就只需等待滴滴軟件提示(回調函數)已經分配好司機而且正在來接你。傳統的方式則是本身要在路口等出租車/公交車,同步阻塞IO。

微信/短信:非阻塞同步IO,要通知其餘人直接把信息發出去就不用管了,一段時間去看看對方是否有回覆(輪詢)。而傳統的打電話則要確保對方接聽並將信息告知對方,同步阻塞IO。

種植業:多路複用IO,好比farmer天天去看果園哪些蘋果紅了(知足註冊的條件)就將紅蘋果收下來。若是種植業機械化程度夠高,則能夠變成異步IO的模式,種植,澆水,收割所有由機器完成。

等等

社會上全部可以提高效率的場景,基本能夠用IO模型去進行思考,演進過程也大體是從同步—》異步,阻塞—》非阻塞

相關文章
相關標籤/搜索