1. 程式人生 > 其它 >Web伺服器開發

Web伺服器開發

典型的一次IO

伺服器程式設計基本框架

接收客戶端資料->解析->

I/O 處理單元是伺服器管理客戶連線的模組。它通常要完成以下工作:等待並接受新的客戶連線,接收客戶資料,將伺服器響應資料返回給客戶端。但是資料的收發不一定在 I/O 處理單元中執行,也可能在邏輯單元中執行,具體在何處執行取決於事件處理模式

一個邏輯單元通常是一個程序或執行緒。它分析並處理客戶資料,然後將結果傳遞給 I/O 處理單元或者直接傳送給客戶端(具體使用哪種方式取決於事件處理模式)。伺服器通常擁有多個邏輯單元,以實現對多個客戶任務的併發處理。

請求佇列是各單元之間的通訊方式的抽象。I/O 處理單元接收到客戶請求時,需要以某種方式通知一個邏輯單元來處理該請求。同樣,多個邏輯單元同時訪問一個儲存單元時,也需要採用某種機制來協調處理競態條件。請求佇列通常被實現為池的一部分。

兩種高效的事件處理模式

伺服器程式通常需要處理三類事件:I/O 事件、訊號及定時事件。有兩種高效的事件處理模式:Reactor 和 Proactor,同步 I/O 模型通常用於實現 Reactor 模式,非同步 I/O 模型通常用於實現 Proactor 模式。

Reactor模式
使用同步 I/O(以 epoll_wait 為例)實現的 Reactor 模式的工作流程是:
1. 主執行緒往 epoll 核心事件表中註冊 socket 上的讀就緒事件。
2. 主執行緒呼叫 epoll_wait 等待 socket 上有資料可讀。
3. 當 socket 上有資料可讀時, epoll_wait 通知主執行緒。主執行緒則將 socket 可讀事件放入請求佇列。
4. 睡眠在請求佇列上的某個工作執行緒被喚醒,它從 socket 讀取資料,並處理客戶請求,然後往 epoll
核心事件表中註冊該 socket 上的寫就緒事件。
5. 當主執行緒呼叫 epoll_wait 等待 socket 可寫。
6. 當 socket 可寫時,epoll_wait 通知主執行緒。主執行緒將 socket 可寫事件放入請求佇列。
7. 睡眠在請求佇列上的某個工作執行緒被喚醒,它往 socket 上寫入伺服器處理客戶請求的結果。