1. 程式人生 > >IO多路複用小故事

IO多路複用小故事

背景故事

小王住在某城市, 生活並長大. 最近, 小城引進了一個企業, 郵局. 這個郵局可了不得, 只要你花上幾角錢, 就可以將一封信送到千里之外的朋友手中. 小王也趁機體驗了一把, 得勁.

這天, 小王躺在床上想, 既然這個郵局這麼好, 咱何不從中分一杯羹呢? 但是現在人家郵局基本都可以說是壟斷了, 咱這剛剛起步又能如何呢? 哎, 有了, 既然他把信都收集起來, 那總歸是要送出去的吧, 我就把送信的給包下來. 想到就做到, 第二天, 小王就去郵局談這個事情, 經過一番協商, 將送往京津冀的信件包了下來.

遠古版本

包下來之後, 簡單註冊了一下, 小公司正式成立了. 先招個人來, 畢竟咱也是老闆了. 招聘資訊發出後, 第二天新員工小張就到了. 正式開工了.

王總: 小張, 去郵局把北京的信件拿回來
小張: 好嘞
沒多大一會, 小張回來了, 還帶回來了一堆信件
王總: 嗯, 不錯. 再去把天津的信件拿回來吧. 
這次, 一直等到第五天, 小張回來了, 同時也把信件帶回來了. 
王總: 小張, 怎麼這麼慢啊? 獎金還想不想要了? 
小張: 沒辦法啊, 王總. 郵局那邊的人說了, 沒有信件, 就不讓我回來. 
王總: 但是已經有使用者投訴了, 送往河北的信已經發出好幾天了, 還沒送到, 咱們想個解決辦法吧. 
小張: 王總, 既然這樣, 那就只能在招人了, 一個人負責取一個地方的信件, 這樣才能保證信件到了之後可以立馬拿回來啊. 
王總: 行吧, 這也是沒有辦法的辦法了. 
於是, 又招來了兩個員工, 每個員工負責一個地區的信件, 不停的去郵局取信. 

這就是最古老的版本了, 多執行緒阻塞式讀取. 很顯然, 耗費大量人力.

初次升級

就這樣過了兩個月, 小王的業務是越做越大, 在原來京津冀的基礎上, 又承包了內蒙地區. 所以, 需要為內蒙地區再招一個人進來. 王總是越想越不對勁, 那豈不是以後再擴充套件業務, 都要頻繁的招人嘛? 不行, 我得找郵局聊聊. 於是, 王總找到了郵局局長.

王總: 局長, 聽說我的人去郵局拿信, 沒有信就不讓人走? 這是什麼道理? 
局長: 什麼? 還有這種事情, 王總莫急, 我回去問問. 
王總: 那真是辛苦局長了. 

這局長辦事, 效率就是不一樣, 第二天訊息回來了. 以後郵局不許把收信的人扣下. 小王心中的小算盤得逞了. 你想啊, 原本需要4個人乾的活, 現在一個人就幹了. 只要不停的去郵局取信就行了. 小張跟自己的時間最長, 王總考慮之後, 還是決定把小張留下.

王總: 小張啊, 看你最近表現不錯, 我決定工資給你翻一倍. 
小張: 謝謝王總. 聽說最近郵局出了新政策, 我每次取信的時候, 貌似都沒有人留我了. 
王總: 嗯, 沒錯. 經過我與郵局領導討論, 決定廢除之前留人的規定. 所以我決定公司取信的員工只留你一個人. 
這下可把小張坑慘了, 他需要不停的取郵局取信, 不管有沒有, 都要回來彙報一下, 然後繼續去取下一個地方的信件. 
但是公司現在只需要一個人就可以了, 嗯, 省錢. 

這就是在之前基礎上, 稍加改進之後的: 非阻塞式輪訓讀取.

再次升級

最然公司現在只需要一個人了, 但是小張這每天跑來跑去的給累夠嗆. 現在是4個地方的信件, 全部拿回來, 小張就需要往郵局跑4趟, 本來一趟就能拿回來, 這不多此一舉麼? 費時費力的. 想到這, 小張發現了這個規則需要改進的地方, 但是他又不知道如何跟郵局高層反應, 只好告訴王總. 王總一聽, 嗯, 有道理. 如果可以這樣的話, 那拿信件的速度不就更快了麼, 使用者體驗上更上一層樓啊, 得趕快落實下來.

王總: 局長啊, 我覺得現在的規定有些可以改進的地方. 
局長: 嗯? 我覺得挺好啊, 有什麼問題你說說看. 
王總: 現在我們的人去取信, 每次只能取一個地方的信, 但是我承包了4個城市, 能不能取信的時候可以一次性把4個城市的信件都給我啊. 
局長: 嗯, 你的建議很好, 不過我還要開會討論一下. 
王總悄悄的留下一個紅包, 走了. 
沒過幾天, 郵局傳來訊息, 王總之前提的已經下發了最新命令. 允許取信人批量獲取. 

從此, 從郵局取信更快捷了.

這就是select版本. 可以一次性批量向系統提出查詢, 然後批量返回.

又升級

就這樣又安穩的過了五個月, 隨著業務的不斷長大, 王總已經接下了全國40多個地區的信件. 但是隨著地區的增加, 小張去取信的速度也變慢了, 王總心裡不得勁了, 這個小張變的懶惰了, 回頭要好好說說他.

王總: 小張啊, 公司慢慢壯大了, 怎麼你取信的速度變得慢了不少, 倒也沒見你信件多拿回來啊. 
小張: 王總, 你是不知道. 每次我去取信, 都要郵局的人一個城市一個城市的找, 之前只有4個城市, 找的自然快. 現在幾十個城市, 自然就變慢了. 
王總: 嗯, 這倒是個問題, 那有沒有什麼好的想法呢? 
小張: 王總, 其實我已經想過了. 現在我去拿信, 不光他們找的慢, 還可能找到最後一封信件都沒有. 之前我一天可能要往郵局跑幾百趟, 很多其實都沒有拿到信件.
    當時我就想, 如果每次等有信件了, 我再去拿, 那我就可以少跑幾次了. 所以, 如果郵局那邊有新的信件, 打電話告訴我一下, 然後我去拿回來就完美了. 
王總: 嗯, 也好, 之前總讓你跑, 確實不是個辦法. 
經過與郵局的一番協商, 這個新的方案再度落實了. 這次小張倒落得清閒, 有信件的時候就去拿, 沒有的時候喝喝茶等著就是了. 

從此, 王總的公司日漸壯大, 小張也平步青雲.

這就是epoll版本, 將需要的資料繫結, 交由系統管理, 新訊息是由系統通知.


以上是將一篇歷史文章簡單故事化, 檢視歷史文章: redis的多路複用是什麼