1. 程式人生 > >淺談計算機系統——系統模式優化(WEB)

淺談計算機系統——系統模式優化(WEB)

根據計算機系統的工作原理,我們知道了總體思路為:從CPU到記憶體,再到磁碟的過程。記憶體分為:核心空間和使用者空間。相應的CPU也分為核心模式和使用者模式。那一個使用者級的計算機應用,又如何的詳細工作過程呢?以下以WEB讀檔案為例:

Round1:

核心模式到使用者模式的轉換:

對於一次IO訪問(這回以read舉例),資料會先被拷貝到作業系統核心的緩衝區中,然後才會從作業系統核心的緩衝區拷貝到應用程式的緩衝區,最後交給程序。所以說,當一個read操作發生時,它會經歷兩個階段:
1. 等待資料準備 (Waiting for the data to be ready)
2. 將資料從核心拷貝到程序中 (Copying the data from the kernel to the process)。

問題:

以上兩個階段,使用者空間一直處理阻塞狀態,即等待完成。通過一個程序無法快速響應結束,再接受另一個WEB請求。

解決方案:

採用prefork模型(apache),即多程序模式。

1.控制權限的httpd程序,監聽80埠;
2.主程序(httpd)管理服務子程序的排程,派生和銷燬,響應使用者的請求。

Round2:

問題:

多程序運作,當程序過多的時候,程序間切換會越發頻繁。但程序間切換開銷又過大。

解決方案:

1.worker模式(apache),即多程序多執行緒模式。

優點:a.執行緒切換是輕量級的,執行緒間可以共享很多資源,比如記憶體;

           b.單執行緒崩潰,會造成父程序崩潰;執行緒過多,進行切換,會造成執行緒抖動。所以採用了多程序,而不是完全依賴多執行緒。

2.單程序繫結CPU解決,直接杜絕了程序切換。nginx支援。

 

Round3:

問題:由於兩次資料複製過程,程序都處於阻塞狀態,浪費了程序數和相關資源。

解決方案: IO優化。

linux系統產生了下面五種網路模式的方案:
-- 阻塞 I/O(blocking IO)
-- 非阻塞 I/O(nonblocking IO)
-- I/O 多路複用( IO multiplexing)
-- 訊號驅動 I/O( signal driven IO)
-- 非同步 I/O(asynchronous IO)
阻塞I/O模式:核心準備資料和資料從核心拷貝到程序記憶體地址,這兩個過程應用程序都是阻塞的;
非阻塞I/O模式:核心準備資料階段不阻塞,但是程序需要週期詢問核心資料是否準備好;然後再從核心拷貝到程序記憶體地址階段是阻塞的;

I/O多路複用:兩個過程都是阻塞的,但是使用了select演算法,一個程序或者執行緒可以同時處理多個I/O請求;poll演算法也支援。
訊號驅動I/O:同非阻塞I/O模式,但是不用程序輪詢,而是事件驅動,在核心資料準備好之後,向程序通知,epoll演算法支援。
非同步I/O:兩個過程都不阻塞,告知核心需要取的資料之後,核心負責準備資料,並拷貝到使用者空間,再通知程序。而不是非阻塞裡面的,程序來詢問核心。

備註:

a.apahce除了prefork、worker模式,還有就是event模式。event模式,即訊號驅動I/O模式。另外還優化了長連線。

基於長連線,長期keep-alive線上,浪費執行緒,因此專門設定一個管理程序來管理這些長連線,在特定條件下,可以回收執行緒資源,而不會出現空閒執行緒。

b.nginx採用了非同步I/O模式,有效解決了C10K問題。將系統性能提升了三倍以上。

   另外nginx還使用了虛擬記憶體的機制,呼叫了mmap函式,即做了記憶體對映。並不將磁碟的檔案複製到記憶體中,而是直接對映到記憶體中。只需要一次複製突出,而不需要兩次。

&n