1. 程式人生 > >論事件驅動與異步IO

論事件驅動與異步IO

網絡服務 pan 切換 ccf 服務器模型 實現 安全 創建 普通

通常我們寫服務器模型,有以下幾種模型:

  1. 每收到一個請求,創建一個新的進程,來處理該請求
  2. 每收到一個請求,創建一個新的線程,來處理該請求
  3. 每收到一個請求,放入到一個事件中,讓主程序通過非阻塞I/0方式來處理請求

以上幾種方式,各有千秋:

  第1種方式,由於創建新的進程開銷比較大,所以會導致服務器性能比較低,但實現比較簡單

  第2種方式,由於要涉及到線程的同步,有可能會面臨死鎖等問題

  第3種方式,在寫應用程序代碼時,邏輯比前面兩種都復雜。

綜合考慮因素,一般普遍認為第三種是大多數網絡服務器采用的方式。

一、概念問題

  - 用戶空間和內核空間
  - 進程切換
  - 進程的阻塞
  - 文件描述符
  - 緩存 I/O

1.1 用戶空間和內核空間 

現在操作系統都是采用虛擬存儲器,那麽對32位操作系統而言,它的尋址空間(虛擬存儲空間)為4G(2的32次方)。操作系統的核心是內核,獨立於普通的應用程序,可以訪問受保護的內存空間,也有訪問底層硬件設備的所有權限。為了保證用戶進程不能直接操作內核(kernel),保證內核的安全,操心系統將虛擬空間劃分為兩部分,一部分為內核空間,一部分為用戶空間。針對linux操作系統而言,將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為內核空間,而將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用,稱為用戶空間。

1.2

  

論事件驅動與異步IO