Nginx 原理

Web服務器處理并發連接請求的工作模型有以下幾種方式:

1、單線程web服務器(Single-threaded web servers)
此種架構方式中,web服務器一次處理一個請求,結束后讀取并處理下一個請求。在某請求處理過程中,其它所有的請求將被忽略,因此,在并發請求較多的場景中將會出現嚴重的性能問題。(即一次只能處理一個請求)
 
2、多進程/多線程web服務器
此種架構方式中,web服務器生成多個進程或線程并行處理多個用戶請求,進程或線程可以按需或事先生成。有的web服務器應用程序為每個用戶請求生成一個單獨的進程或線程來進行響應,不過,一旦并發請求數量達到成千上萬時,多個同時運行的進程或線程將會消耗大量的系統資源。(即每個進程只能響應一個請求,并且一個進程對應一個線程)
 
3、I/O多路復用web服務器
為了能夠支持更多的并發用戶請求,越來越多的web服務器正在采用多種復用的架構———即同步監控所有的連接請求的活動狀態,當一個連接的狀態發生改變時(如數據準備完畢或發生某錯誤),將為其執行一系列特定操作;在操作完成后,此連接將重新變回暫時的穩定態并返回至打開的連接列表中,直到下一次的狀態改變。由于其多路復用的特性,進程或線程不會被空閑的連接所占用,因而可以提供高效的工作模式。(這種架構可以理解為一個進程可以生成多個線程,每個請求交給一個線程進行處理)
 
4、多路復用多線程web服務器
將多進程和多路復用的功能結合起來形成的web服務器架構,其避免了讓一個進程服務于過多的用戶請求,并能充分利用多CPU主機所提供的計算能力。(這種架構可以理解為有多個進程,并且一個進程又生成多個線程,每個線程處理一個請求)
 
linux下常用的I/O模型(這里借用下在網上查閱的資料,感覺還好理解):
先引入select和epoll概念:
select和epoll是兩個處理I/O模型的機制,可以加速請求處理,2者處理方式不同:通俗的講,select機制是對沒有處理好的I/O請求在一段時間內進行檢測,并將其狀態通知給用戶,即有沒有完成都會通知。而epool機制則是在該I/O請求完成后才通知給用戶。
 
在Unix/Linux下共有五種I/O模型,分別是:
1)阻塞I/O
2)非阻塞I/O
3)I/O復用(select和poll)
4)信號驅動I/O(SIGIO)
5)異步I/O(Posix.1的aio_系列函數)
 
對以上模型的比較:
阻塞I/O:
應用程序調用一個IO函數,導致應用程序阻塞,等待數據準備好。 如果數據沒有準備好,一直等待….數據準備好了,從內核拷貝到用戶空間,IO函數返回成功指示
 
非阻塞I/O:
我們把一個套接口設置為非阻塞就是告訴內核,當所請求的I/O操作無法完成時,不要將進程睡眠,而是返回一個錯誤。這樣我們的I/O操作函數將不斷的測試數據是否已經準備好,如果沒有準備好,繼續測試,直到數據準備好為止。在這個不斷測試的過程中,會大量的占用CPU的時間。
 
I/O復用(select和poll):
I/O復用模型會用到select或者poll函數,這兩個函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。
 
信號驅動I/O(SIGIO):
首先我們允許套接口進行信號驅動I/O,并安裝一個信號處理函數,進程繼續運行并不阻塞。當數據準備好時,進程會收到一個SIGIO信號,可以在信號處理函數中調用I/O操作函數處理數據。
 
異步I/O(Posix.1的aio_系列函數):
當一個異步過程調用發出后,調用者不能立刻得到結果。實際處理這個調用的部件在完成后,通過狀態、通知和回調來通知調用者的輸入輸出操作
 
apache的工作模塊:
prefork:多進程,每個請求用一個進程響應,這個過程會用到select機制來通知。
worker:多進程,一個進程可以生成多個線程,每個線程響應一個請求。
event:一個進程,每個進程響應多個用戶請求,它是基于事件實現的。
 
基于事件機制的特性:
一個進程響應多個用戶請求,利用run-loop機制,讓套接字復用,請求過來后進程并不處理請求,而是直接交由其他機制來處理,通過select或epoll機制來通知請求是否完成;在這個過程中,進程本身一直處于空閑狀態,可以一直接收用戶請求。
 
 
對于高并發請求的實現:
1、基于線程:即一個進程生成多個線程,每個線程響應用戶的每個請求。如worker模型
2、基于事件的模型,一個進程處理多個請求,并且通過epoll機制來通知用戶請求完成。如event模型
 
web服務器工作流程:
我們知道web服務器是工作在用戶空間的,用戶空間通過系統調用來與內核打交道。
用戶請求–>送達用戶空間–>系統調用–>內核空間–>內核到磁盤上讀取網頁資源(在此過程中就牽涉到了以上幾種模型的運用)

原創文章,作者:SDS,如若轉載,請注明出處:http://www.www58058.com/74977

(1)
SDSSDS
上一篇 2017-05-07
下一篇 2017-05-07

相關推薦

  • 私有IP網子網掩碼劃分原則及計算方法

    私有IP網子網掩碼劃分原則及計算方法 最好記下的二進制轉換十進制 00000000 0 00000001 1 00000010 2 00000100 4 00001000 8 00010000 16 00100000 32 01000000 64 10000000 128 11000000 192 11100000 224 11110000 240 1111…

    Linux干貨 2017-05-02
  • 自定義命令提示符

     命令提示符的格式放在變量PS1中         命令提示符特殊字符定義             \u  當前用戶      &…

    Linux干貨 2017-05-02
  • yum更多用法及源碼編譯安裝apache和當天作業

    一、yum的更多用法 上篇文章介紹了yum的基礎用法及yum源的基本配置,除此之外yum還有更多的用法,以下將繼續介紹yum的使用方法。 1、yum-config-manager工具,該工具可以自動生成yum的repo文件,而不需要手動創建編寫,使用方法如下: 用法:yum-config-manager [options] [section] -add-re…

    Linux干貨 2016-08-24
  • linux文件系統上的權限

    文件系統上的權限是指文件系統上的文件和目錄的權限,主要針對三類對象進行的(訪問者)進行的定義: 針對文件來說 r 使用工具cat nano去看文件里面內容的權限 w 可以修改文件的內容 x 二進制程序以及腳本需要發起系統調用,去啟動為一個進程 針對目錄來說 r 是否可以查看目錄里面的內容 有r權限的話 可以使用ls -l w 對目錄里面是否可以創建文件或者目…

    Linux干貨 2017-04-01
  • 馬哥教育網絡班20期+第二周課程練習

    linux 中一切皆文件,我們所做的一切都是和文件打交道。   文件分為兩部分:元數據和數據           元數據: 即真實數據的屬性??捎?stat  命令查看       &nbs…

    Linux干貨 2016-06-23
  • bash腳本編程實例

    bash腳本編程實例 1.寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄的shell(即用戶的shell不是/sbin/nologin),分別統計這兩類用戶的個數(通過字符串比較來實現) #!/bin/bash cat /etc/passwd|awk -F: ‘BEGIN{nologin=0;login=0}{if($NF==”/sbin/nol…

    Linux干貨 2017-08-28
欧美性久久久久