1、進程&&線程前端
1.進程模型nginx
(1) 單進程模型:一個進程響應多個請求web
容易形成請求的阻塞算法
(2) 多線程模型:每一個進程響應一個請求apache
進程量大,進切換次數過多編程
每一個進程地址空間獨立,不少空間是重複的數據,因此內存使用率低服務器
2.線程模型(thread)網絡
LWP:light Weight Process多線程
在Linux上稱爲輕量級進程;是進程內部的自運行單位,在Linux上表現形式和進程同樣,佔用一個端口,但管理方式不一樣併發
多核CPU使用下,線程的優點才能發揮,並行執行線程,更好的分配系統資源,減小切換次數,但須要多線程編程
線程切換過快會形成線程抖動
(1) 單進程多線程模型
每一個線程響應一個請求,線程間依然切換,可是切換輕量級
同一進程管理下的線程能夠共享進程的諸多資源,例如多個用戶對同一文件的訪問
對內存的需求較之進程模型下降
(2) 多進程多線程模型
多個進程,分批管理線程;例如每一個進程管理1000個線程,這樣在每一個進程內部的線程資源爭用不會太嚴重
多核心CPU的狀況下,能夠作CPU親和性綁定(進程綁定),每一個進程內線程切換
(3) 多線程
N個請求,一個線程響應多個請求
2、I/O模型
1.IO動做執行
進程沒法直接操做IO設備,必須經過系統調用請求內核來協助,內核會爲你每一個IO設備維護提供有一個buffer
對於輸入而言其等待時間:wait + copy
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 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進程數飆升,從而拒絕服務的現象。