淺談計算機系統——系統模式優化(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:同非阻塞I/O模式,但是不用程序輪詢,而是事件驅動,在核心資料準備好之後,向程序通知,epoll演算法支援。
非同步I/O:兩個過程都不阻塞,告知核心需要取的資料之後,核心負責準備資料,並拷貝到使用者空間,再通知程序。而不是非阻塞裡面的,程序來詢問核心。
備註:
a.apahce除了prefork、worker模式,還有就是event模式。event模式,即訊號驅動I/O模式。另外還優化了長連線。
基於長連線,長期keep-alive線上,浪費執行緒,因此專門設定一個管理程序來管理這些長連線,在特定條件下,可以回收執行緒資源,而不會出現空閒執行緒。
b.nginx採用了非同步I/O模式,有效解決了C10K問題。將系統性能提升了三倍以上。
另外nginx還使用了虛擬記憶體的機制,呼叫了mmap函式,即做了記憶體對映。並不將磁碟的檔案複製到記憶體中,而是直接對映到記憶體中。只需要一次複製突出,而不需要兩次。
&n