1、先說一下為什么出現進程,線程
進程:在計算機發明之初就發現,在輸入數據時(I/O速度慢),CPU是空閑的,這樣就浪費了CPU資源,為了充分利用CPU資源,發明了進程,在輸入程序A的數據時,程序B在占用CPU資源進行計算。
線程:為了減少進程的上下文切換的損耗,滿足人機交互的實時性,同時保留進程充分利用CPU資源的優點,出現了線程。
2,redis為什么不用多線程(不划算唄)
(1)純內存操作;
(2)多線程仍然會有上下文切換的損耗,雖然比進程切換損耗小;
(3)采用了非阻塞I/O多路復用機制
題外話:我們現在要仔細的說一說I/O多路復用機制,因為這個說法實在是太通俗了,通俗到一般人都不懂是什么意思。博主打一個比方:小曲在S城開了一家快遞店,負責同城快送服務。小曲因為資金限制,雇佣了一批快遞員,然后小曲發現資金不夠了,只夠買一輛車送快遞。
經營方式一
客戶每送來一份快遞,小曲就讓一個快遞員盯着,然后快遞員開車去送快遞。慢慢的小曲就發現了這種經營方式存在下述問題
- 幾十個快遞員基本上時間都花在了搶車上了,大部分快遞員都處在閑置狀態,誰搶到了車,誰就能去送快遞
- 隨着快遞的增多,快遞員也越來越多,小曲發現快遞店里越來越擠,沒辦法雇佣新的快遞員了
- 快遞員之間的協調很花時間
綜合上述缺點,小曲痛定思痛,提出了下面的經營方式
經營方式二
小曲只雇佣一個快遞員。然后呢,客戶送來的快遞,小曲按送達地點標注好,然后依次放在一個地方。最后,那個快遞員依次的去取快遞,一次拿一個,然后開着車去送快遞,送好了就回來拿下一個快遞。
對比
上述兩種經營方式對比,是不是明顯覺得第二種,效率更高,更好呢。在上述比喻中:
- 每個快遞員------------------>每個線程
- 每個快遞-------------------->每個socket(I/O流)
- 快遞的送達地點-------------->socket的不同狀態
- 客戶送快遞請求-------------->來自客戶端的請求
- 小曲的經營方式-------------->服務端運行的代碼
- 一輛車---------------------->CPU的核數
於是我們有如下結論
1、經營方式一就是傳統的並發模型,每個I/O流(快遞)都有一個新的線程(快遞員)管理。
2、經營方式二就是I/O多路復用。只有單個線程(一個快遞員),通過跟蹤每個I/O流的狀態(每個快遞的送達地點),來管理多個I/O流。
下面類比到真實的redis線程模型,如圖所示
參照上圖,簡單來說,就是。我們的redis-client在操作的時候,會產生具有不同事件類型的socket。在服務端,有一段I/0多路復用程序,將其置入隊列之中。然后,文件事件分派器,依次去隊列中取,轉發到不同的事件處理器中。
需要說明的是,這個I/O多路復用機制,redis還提供了select、epoll、evport、kqueue等多路復用函數庫,大家可以自行去了解。
這通俗易懂的例子來自:https://www.cnblogs.com/rjzheng/p/9096228.html
推薦相關閱讀:http://www.cnblogs.com/huxiao-tee/p/4657851.html