論事件驅動與異步IO
阿新 • • 發佈:2017-12-06
網絡服務 pan 切換 ccf 服務器模型 實現 安全 創建 普通
通常我們寫服務器模型,有以下幾種模型:
- 每收到一個請求,創建一個新的進程,來處理該請求
- 每收到一個請求,創建一個新的線程,來處理該請求
- 每收到一個請求,放入到一個事件中,讓主程序通過非阻塞I/0方式來處理請求
以上幾種方式,各有千秋:
第1種方式,由於創建新的進程開銷比較大,所以會導致服務器性能比較低,但實現比較簡單
第2種方式,由於要涉及到線程的同步,有可能會面臨死鎖等問題
第3種方式,在寫應用程序代碼時,邏輯比前面兩種都復雜。
綜合考慮因素,一般普遍認為第三種是大多數網絡服務器采用的方式。
一、概念問題
- 用戶空間和內核空間
- 進程切換
- 進程的阻塞
- 文件描述符
- 緩存 I/O
1.1 用戶空間和內核空間
現在操作系統都是采用虛擬存儲器,那麽對32位操作系統而言,它的尋址空間(虛擬存儲空間)為4G(2的32次方)。操作系統的核心是內核,獨立於普通的應用程序,可以訪問受保護的內存空間,也有訪問底層硬件設備的所有權限。為了保證用戶進程不能直接操作內核(kernel),保證內核的安全,操心系統將虛擬空間劃分為兩部分,一部分為內核空間,一部分為用戶空間。針對linux操作系統而言,將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為內核空間,而將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用,稱為用戶空間。
1.2
論事件驅動與異步IO