IO多路復用小故事

2022-05-10 21:08:00 字數 2802 閱讀 9748

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

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

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

王總: 小張, 去郵局把北京的信件拿回來

小張: 好嘞

沒多大一會, 小張回來了, 還帶回來了一堆信件

王總: 嗯, 不錯. 再去把天津的信件拿回來吧.

這次, 一直等到第五天, 小張回來了, 同時也把信件帶回來了.

王總: 小張, 怎麼這麼慢啊? 獎金還想不想要了?

小張: 沒辦法啊, 王總. 郵局那邊的人說了, 沒有信件, 就不讓我回來.

王總: 但是已經有使用者投訴了, 送往河北的信已經發出好幾天了, 還沒送到, 咱們想個解決辦法吧.

小張: 王總, 既然這樣, 那就只能在招人了, 乙個人負責取乙個地方的信件, 這樣才能保證信件到了之後可以立馬拿回來啊.

王總: 行吧, 這也是沒有辦法的辦法了.

於是, 又招來了兩個員工, 每個員工負責乙個地區的信件, 不停的去郵局取信.

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

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

王總: 局長, 聽說我的人去郵局拿信, 沒有信就不讓人走? 這是什麼道理? 

局長: 什麼? 還有這種事情, 王總莫急, 我回去問問.

王總: 那真是辛苦局長了.

這局長辦事, 效率就是不一樣, 第二天訊息回來了. 以後郵局不許把收信的人扣下. 小王心中的小算盤得逞了. 你想啊, 原本需要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 往流中讀出資料...