線程和IO複用模型簡述

1、進程&&線程前端

  1.進程模型nginx

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

容易形成請求的阻塞算法

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

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

每一個進程地址空間獨立,不少空間是重複的數據,因此內存使用率低服務器

  2.線程模型(thread)網絡

        LWPlight Weight Process多線程

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

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

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

    (1) 單進程多線程模型

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

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

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

    (2) 多進程多線程模型

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

多核心CPU的狀況下,能夠作CPU親和性綁定(進程綁定),每一個進程內線程切換

    (3) 多線程

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

 

 

 

2、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(不致使進程阻塞)

 

 

 

3、Apache httpd多路模塊

    httpd是一個重量級別web服務器,支持的功能模塊多

  1.prefork多進程模型

一個進程響應一個請求;內核select()調用算法最多並行處理1024個請求

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

  2.worker多進程多線程模型

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

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

           只能看到主控進程和對應進程,每一個進程速歐開啓的線程是基於線程庫研發,每一個線程響應一個用戶請求,線程沒法用ps顯示,生成子進程處理,併發響應能力差,可是很穩定,進程間的影響小

  3.event事件驅動模型

狀態轉換通知,一個進程響應n個請求;內核調用epoll()

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

單進程多請求,併發響應強,佔用資源少

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

 

 

 

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

相關文章
相關標籤/搜索