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 22:49
下一篇 2017-05-07 23:16

相關推薦

  • MySQL復制: Galera

    MySQL復制: Galera mysql 主從復制 前言 Galera Replication簡介 MariaDB-Galera-Server 環境部署 配置步驟 總結 前言 之前介紹了MySQL復制的各種解決方案, 但是我個人還是感覺Galera最好用也最實用, 什么是Galera, 它強大在哪里, 這篇文章就帶你認識這個強大的工具 Galer…

    Linux干貨 2016-04-28
  • 虛擬化介紹、以及kvm

    什么是虛擬化? 在計算機領域中虛擬化,和我們平時說的虛擬化并沒有什么兩樣,說白了就是一個虛擬出來的東西罷了,并不是真實存在的。 虛擬化的歷史 虛擬化早在20實際60年代末,由IBM開發被命名為vmm(Virtual Machine Monitor)虛擬機監視器的軟件,我們知道那時候工藝技術并不發達,電腦也不像現在這樣屬于每家每戶的標配,IBM為了解決電腦使用…

    2017-03-08
  • 登錄后經常出現You have new mail in /var/spool/mail/root的提示

    安裝完LINUX后經常使用終端遠程登錄,登錄后經常出現You have new mail in /var/spool/mail/root的提示,很是煩人。 這東西到底是做什么用的呢?經過查詢才知道這是LINUX的郵年提示功能。LINUX會定時查看LINUX各種狀態做匯總,每經過一段時間會把匯總的信息發送的root的郵箱里,以供有需之時查看。 那要怎么去掉這麻…

    系統運維 2017-08-05
  • Linux 啟動流程

    Linux啟動流程 POST–>Boot Sequence–>MBR–>Grub–>Kernel(initramfs)–>rootfs–chroot(根切換)–>/sbin/init–>RunLevel–&gt…

    Linux干貨 2016-06-09
  • N21沉舟15周作業

    1、總結sed和awk的詳細用法; 2、刪除/boot/grub/grub.conf文件中所有行的行首的空白字符; #  sed 's@^[[:space:]]@@' /boot/grub/grub.conf 3、刪除/etc/fstab文件中所有以#開頭,后跟至少一個空白字符的行的行首的#和空白字…

    Linux干貨 2016-11-14
  • shell腳本編程之函數

      在編寫腳本時經常會遇到某個任務需要重復使用的問題,需每次都要輸入同樣的代碼是件挺煩人的事情,還好可以通過編寫函數還簡化這項工作。   函數其實就是給一段代碼起個名字,在每次使用這段代碼的時候可以直接使用函數名來調用就可以了。 一、創建函數   創建函數的格式有兩種:   格式1:function 函數名{ &nbs…

    Linux干貨 2016-01-05
欧美性久久久久