線程和IO複用模型簡述

一、進程&&線程

  1.進程模型

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

容易造成請求的阻塞

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

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

每個進程地址空間獨立,很多空間是重複的數據,所以內存使用率低

  2.線程模型(thread)

        LWPlight Weight Process

       Linux上稱爲輕量級進程;是進程內部的自運行單位,在Linux上表現形式和進程一樣,佔用一個端口,但管理方式不同

       多核CPU使用下,線程的優勢才能發揮,並行執行線程,更好的分配系統資源,減少切換次數,但需要多線程編程

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

    (1) 單進程多線程模型

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

同一進程管理下的線程可以共享進程的諸多資源,例如多個用戶對同一文件的訪問

對內存的需求較之進程模型降低

    (2) 多進程多線程模型

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

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

    (3) 多線程

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

 

 

 

二、I/O模型

  1.IO動作執行

      進程無法直接操作IO設備,必須通過系統調用請求內核來協助,內核會爲你每個IO設備維護提供有一個buffer

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

wKioL1ctf3WS2Q7qAAAiyIVwL6o983.png

  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 httpdNginx對比

  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進程數飆升,從而拒絕服務的現象。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章