程序:在計算機發明之初就發現,在輸入資料時(i/o速度慢),cpu是空閒的,這樣就浪費了cpu資源,為了充分利用cpu資源,發明了程序,在輸入程式a的資料時,程式b在占用cpu資源進行計算。
執行緒:為了減少程序的上下文切換的損耗,滿足人機互動的實時性,同時保留程序充分利用cpu資源的優點,出現了執行緒。
(1)純記憶體操作;
(2)多執行緒仍然會有上下文切換的損耗,雖然比程序切換損耗小;
(3)採用了非阻塞i/o多路復用機制
題外話:我們現在要仔細的說一說i/o多路復用機制,因為這個說法實在是太通俗了,通俗到一般人都不懂是什麼意思。博主打乙個比方:小曲在s城開了一家快遞店,負責同城快送服務。小曲因為資金限制,僱傭了一批快遞員,然後小曲發現資金不夠了,只夠買一輛車送快遞。
經營方式一
客戶每送來乙份快遞,小曲就讓乙個快遞員盯著,然後快遞員開車去送快遞。慢慢的小曲就發現了這種經營方式存在下述問題
綜合上述缺點,小曲痛定思痛,提出了下面的經營方式
經營方式二
小曲只僱傭乙個快遞員。然後呢,客戶送來的快遞,小曲按送達地點標註好,然後依次放在乙個地方。最後,那個快遞員依次的去取快遞,一次拿乙個,然後開著車去送快遞,送好了就回來拿下乙個快遞。
對比
上述兩種經營方式對比,是不是明顯覺得第二種,效率更高,更好呢。在上述比喻中:
於是我們有如下結論
1、經營方式一就是傳統的併發模型,每個i/o流(快遞)都有乙個新的執行緒(快遞員)管理。
2、經營方式二就是i/o多路復用。只有單個執行緒(乙個快遞員),通過跟蹤每個i/o流的狀態(每個快遞的送達地點),來管理多個i/o流。
下面模擬到真實的redis執行緒模型,如圖所示
參照上圖,簡單來說,就是。我們的redis-client在操作的時候,會產生具有不同事件型別的socket。在服務端,有一段i/0多路復用程式,將其置入佇列之中。然後,檔案事件分派器,依次去佇列中取,**到不同的事件處理器中。
需要說明的是,這個i/o多路復用機制,redis還提供了select、epoll、evport、kqueue等多路復用函式庫,大家可以自行去了解。
這通俗易懂的例子來自:
為什麼Redis選擇單執行緒模型?
redis從一開始就使用單執行緒模型處理來自客戶端的絕大多數的網路請求,即redis可以支援io多路復用。除此之外還有其他原因 1 使用單執行緒模型能帶來更好的維護性,方便開發和除錯。2 使用單執行緒模型也能併發的處理客戶端的請求。3 redis服務中執行的絕大多數操作的效能瓶頸都不是cpu。雖然多...
Redis為什麼是單執行緒
經過多方資料收集 總結 思考,結論如下 準確地來說,該問題是 為什麼redis採用單程序單執行緒模型 我們從兩個層次去理解 第乙個層次 我們多執行緒的使用情景是io密集型,目的是為了充分利用cpu資源。也就是說當乙個執行緒io等待的時候,另乙個執行緒可以進行執行,達到充分利用cpu資源的效果,不要讓...
面試 為什麼Redis是單執行緒
先給下官網回答 分析 多執行緒使用場景 a充分利用多核cpu b 檔案或者網路io密集型 任務排程 1 redis在linux上 使用管道每秒可以處理百萬請求 如果都是時間複雜度o n 或o log n 命令 單核足以支撐 所以a不滿足 2 redis是針對記憶體操作 所以檔案io不滿足 redis...