小王住在某城市, 生活並長大. 最近, 小城引進了乙個企業, 郵局. 這個郵局可了不得, 只要你花上幾角錢, 就可以將一封信送到千里之外的朋友手中. 小王也趁機體驗了一把, 得勁.
這天, 小王躺在床上想, 既然這個郵局這麼好, 咱何不從中分一杯羹呢? 但是現在人家郵局基本都可以說是壟斷了, 咱這剛剛起步又能如何呢? 哎, 有了, 既然他把信都收集起來, 那總歸是要送出去的吧, 我就把送信的給包下來. 想到就做到, 第二天, 小王就去郵局談這個事情, 經過一番協商, 將送往京津冀的信件包了下來.
包下來之後, 簡單註冊了一下, 小公司正式成立了. 先招個人來, 畢竟咱也是老闆了. 招聘資訊發出後, 第二天新員工小張就到了. 正式開工了.
王總: 小張, 去郵局把北京的信件拿回來
小張: 好嘞
沒多大一會, 小張回來了, 還帶回來了一堆信件
王總: 嗯, 不錯. 再去把天津的信件拿回來吧.
這次, 一直等到第五天, 小張回來了, 同時也把信件帶回來了.
王總: 小張, 怎麼這麼慢啊? 獎金還想不想要了?
小張: 沒辦法啊, 王總. 郵局那邊的人說了, 沒有信件, 就不讓我回來.
王總: 但是已經有使用者投訴了, 送往河北的信已經發出好幾天了, 還沒送到, 咱們想個解決辦法吧.
小張: 王總, 既然這樣, 那就只能在招人了, 乙個人負責取乙個地方的信件, 這樣才能保證信件到了之後可以立馬拿回來啊.
王總: 行吧, 這也是沒有辦法的辦法了.
於是, 又招來了兩個員工, 每個員工負責乙個地區的信件, 不停的去郵局取信.
這就是最古老的版本了, 多執行緒阻塞式讀取. 很顯然, 耗費大量人力.
就這樣過了兩個月, 小王的業務是越做越大, 在原來京津冀的基礎上, 又承包了內蒙地區. 所以, 需要為內蒙地區再招乙個人進來. 王總是越想越不對勁, 那豈不是以後再擴充套件業務, 都要頻繁的招人嘛? 不行, 我得找郵局聊聊. 於是, 王總找到了郵局局長.
王總: 局長, 聽說我的人去郵局拿信, 沒有信就不讓人走? 這是什麼道理?
局長: 什麼? 還有這種事情, 王總莫急, 我回去問問.
王總: 那真是辛苦局長了.
這局長辦事, 效率就是不一樣, 第二天訊息回來了. 以後郵局不許把收信的人扣下. 小王心中的小算盤得逞了. 你想啊, 原本需要4個人幹的活, 現在乙個人就幹了. 只要不停的去郵局取信就行了. 小張跟自己的時間最長, 王總考慮之後, 還是決定把小張留下.
王總: 小張啊, 看你最近表現不錯, 我決定工資給你翻一倍.
小張: 謝謝王總. 聽說最近郵局出了新政策, 我每次取信的時候, 貌似都沒有人留我了.
王總: 嗯, 沒錯. 經過我與郵局領導討論, 決定廢除之前留人的規定. 所以我決定公司取信的員工只留你乙個人.
這下可把小張坑慘了, 他需要不停的取郵局取信, 不管有沒有, 都要回來匯報一下, 然後繼續去取下乙個地方的信件.
但是公司現在只需要乙個人就可以了, 嗯, 省錢.
這就是在之前基礎上, 稍加改進之後的: 非阻塞式輪訓讀取.
最然公司現在只需要乙個人了, 但是小張這每天跑來跑去的給累夠嗆. 現在是4個地方的信件, 全部拿回來, 小張就需要往郵局跑4趟, 本來一趟就能拿回來, 這不多此一舉麼? 費時費力的. 想到這, 小張發現了這個規則需要改進的地方, 但是他又不知道如何跟郵局高層反應, 只好告訴王總. 王總一聽, 嗯, 有道理. 如果可以這樣的話, 那拿信件的速度不就更快了麼, 使用者體驗上更上一層樓啊, 得趕快落實下來.
王總: 局長啊, 我覺得現在的規定有些可以改進的地方.
局長: 嗯? 我覺得挺好啊, 有什麼問題你說說看.
王總: 現在我們的人去取信, 每次只能取乙個地方的信, 但是我承包了4個城市, 能不能取信的時候可以一次性把4個城市的信件都給我啊.
局長: 嗯, 你的建議很好, 不過我還要開會討論一下.
王總悄悄的留下乙個紅包, 走了.
沒過幾天, 郵局傳來訊息, 王總之前提的已經下發了最新命令. 允許取信人批量獲取.
從此, 從郵局取信更快捷了.
這就是select版本. 可以一次性批量向系統提出查詢, 然後批量返回.
就這樣又安穩的過了五個月, 隨著業務的不斷長大, 王總已經接下了全國40多個地區的信件. 但是隨著地區的增加, 小張去取信的速度也變慢了, 王總心裡不得勁了, 這個小張變的懶惰了, 回頭要好好說說他.
王總: 小張啊, 公司慢慢壯大了, 怎麼你取信的速度變得慢了不少, 倒也沒見你信件多拿回來啊.
小張: 王總, 你是不知道. 每次我去取信, 都要郵局的人乙個城市乙個城市的找, 之前只有4個城市, 找的自然快. 現在幾十個城市, 自然就變慢了.
王總: 嗯, 這倒是個問題, 那有沒有什麼好的想法呢?
小張: 王總, 其實我已經想過了. 現在我去拿信, 不光他們找的慢, 還可能找到最後一封信件都沒有. 之前我一天可能要往郵局跑幾百趟, 很多其實都沒有拿到信件.
當時我就想, 如果每次等有信件了, 我再去拿, 那我就可以少跑幾次了. 所以, 如果郵局那邊有新的信件, 打**告訴我一下, 然後我去拿回來就完美了.
王總: 嗯, 也好, 之前總讓你跑, 確實不是個辦法.
經過與郵局的一番協商, 這個新的方案再度落實了. 這次小張倒落得清閒, 有信件的時候就去拿, 沒有的時候喝喝茶等著就是了.
從此, 王總的公司日漸壯大, 小張也平步青雲.
這就是epoll版本, 將需要的資料繫結, 交由系統管理, 新訊息是由系統通知.
以上是將一篇歷史文章簡單故事化, 檢視歷史文章: redis的多路復用是什麼鬼
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
i o多路復用
最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...
I O多路復用
我們都知道unix like 世界裡,一切皆檔案,而檔案是什麼呢?檔案就是一串二進位製流而已,不管socket,還是fifo 管道 終端,對我們來說,一切都是檔案,一切都是流。在資訊 交換的過程中,我們都是對這些流進行資料的收發操作,簡稱為i o操作 input and output 往流中讀出資料...