天天看點

線程和IO複用模型簡述

一、程序&&線程

  1.程序模型

(1) 單程序模型:一個程序響應多個請求

容易造成請求的阻塞

(2) 多線程模型:每個程序響應一個請求

程序量大,進切換次數過多

每個程序位址空間獨立,很多空間是重複的資料,是以記憶體使用率低

  2.線程模型(thread)

        LWP:light Weight Process

       在Linux上稱為輕量級程序;是程序内部的自運作機關,在Linux上表現形式和程序一樣,占用一個端口,但管理方式不同

       多核CPU使用下,線程的優勢才能發揮,并行執行線程,更好的配置設定系統資源,減少切換次數,但需要多線程程式設計

       線程切換過快會造成線程抖動

(1) 單程序多線程模型

每個線程響應一個請求,線程間依然切換,但是切換輕量級

同一程序管理下的線程可以共享程序的諸多資源,例如多個使用者對同一檔案的通路

對記憶體的需求較之程序模型降低

(2) 多程序多線程模型

多個程序,分批管理線程;例如每個程序管理1000個線程,這樣在每個程序内部的線程資源争用不會太嚴重

多核心CPU的情況下,可以做CPU親和性綁定(程序綁定),每個程序内線程切換

(3) 多線程

N個請求,一個線程響應多個請求

二、I/O模型

1.IO動作執行

      程序無法直接操作IO裝置,必須通過系統調用請求核心來協助,核心會為你每個IO裝置維護提供有一個buffer

對于輸入而言其等待時間:wait + copy

線程和IO複用模型簡述

  2.I/O類型

(1)同步和異步:synchronous,

asyncrhonous

           關注的是消息通知機制

        1)同步:調用發出不會立即傳回,但一旦傳回就可以傳回最終結果;

        2)異步:調用發出之後,被調用方立即傳回消息,但傳回的非最終結果;被調用者通過狀态、通知機制來通知調者,或通過回調函數來處理結果;

(2)阻塞和非阻塞:block,

nonblock

            關注的是調用者等待被調用者傳回調用結果時的狀态

        1)阻塞:調用結果傳回之前,調用者(調用線程)會被挂起;調用者隻有在得到結果之後才會傳回;

        2)非阻塞:調用結果傳回之前,調用不會阻塞目前線程;

  3.I/O模型

       blocking IO:阻塞式IO

       nonblocking IO:非阻塞式IO

       IO multiplexing:複用型IO

       signal driven IO:事件驅動型IO

       asyncrhonous IO:異步IO(不導緻程序阻塞)

三、Apache httpd多路子產品

    httpd是一個重量級别web伺服器,支援的功能子產品多

  1.prefork:多程序模型

一個程序響應一個請求;核心select()調用算法最多并行處理1024個請求

主程序,生成多個子程序,每個子程序處理一個請求

  2.worker:多程序多線程模型

一個線程響應一個請求;核心調用select()模型

主程序,生成多個子程序,每個子程序生成多個線程,每個線程響應一個請求

           隻能看到主要程序和對應程序,每個程序速歐開啟的線程是基于線程庫研發,每個線程響應一個使用者請求,線程無法用ps顯示,生成子程序處理,并發響應能力差,但是很穩定,程序間的影響小

  3.event:事件驅動模型

狀态轉換通知,一個程序響應n個請求;核心調用epoll()

主程序,生成多個子程序,每個子程序響應多個請求

單程序多請求,并發響應強,占用資源少

    觸發機制:水準觸發(多次通知)、邊緣觸發(僅一次通知機制)

四、Apache httpd和Nginx對比

  1.Nginx

輕量級web伺服器,其相對于apache占用更少的記憶體及資源

nginx

處理請求是異步非阻塞的,而,在高并發下nginx 能保持低資源低消耗高性能

高度靜态子產品化的設計,在1.9版本之前不能夠動态加載子產品

epoll

and kqueue 作為開發模型

支援熱部署,平滑更新

  2.Apache httpd

重量級web伺服器,支援衆多子產品

httpd處理請求是阻塞型

bug相對于nginx少,穩定輕強

  注意:

    1) epoll(freebsd是kqueue)網絡IO模型是nginx處理大量靜态服務時才能提供高web性能

         nginx使用資源少,支援并發連接配接數量衆多。能夠支援高達

50,000 個并發連接配接數的響應

    2) apache是同步多程序模型,一個連接配接對應一個程序;nginx是異步的,多個連接配接(萬級别)可以對應一個程序

    3) nginx的負載能力比apache高很多

    4) nginx處理靜态檔案好,耗費記憶體少,但是處理動态請求不行,一般動态請求要apache去做,nginx隻适合靜态和反向

    5) 在靜态檔案處理、PHP-CGI的支援、反向代理功能、前端Cache、維持連接配接等方面nginx優于apcche

httpd,但是在Apache+PHP(prefork)模式下,如果PHP處理慢或者前端壓力很大的情況下,很容易出現Apache程序數飙升,進而拒絕服務的現象。 

繼續閱讀