I/O事件处理模型之Reactor和Proactor 【转】
http://blog.ddup.us/?p=280
這篇博客說的很清楚,贊一個:
在編寫服務端軟件的時候,如何處理各種I/O事件是其中很重要的一部分。在Unix Network Programming中介紹了5種Unix/Linux下可用的I/O編程模型:1)阻塞式I/O; 2)非阻塞式I/O; 3)I/O復用; 4)信號驅動式I/O; 5)異步I/O。這幾種都是基本的I/O編程模型,可以單獨使用其中一種,也可以組合使用。為了應對高并發量的情形,在C10K Problem中另外總結了5種高性能的I/O編程模型:1) 單線程非阻塞式水平觸發I/O(Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification); 2) 單線程非阻塞式邊沿觸發I/O(Serve many clients with each thread, and use nonblocking I/O and readiness change notification); 3) 多線程異步I/O模型(Serve many clients with each server thread, and use asynchronous I/O); 4) 單個服務線程對應單個客戶(Serve one client with each server thread); 5) 將服務線程放到內核(Build the server code into the kernel)。本文介紹的兩種模型都是基于I/O多路復用的單線程處理模型。
Reactor模型
Reactor模式是處理并發I/O比較常見的一種模式,中心思想就是,將所有要處理的I/O事件注冊到一個中心I/O多路復用器上,同時主線程阻塞在多路復用器上;一旦有I/O事件到來或是準備就緒(區別在于多路復用器是邊沿觸發還是水平觸發),多路復用器返回并將相應I/O事件分發到對應的處理器中。
這里有三個重要的組件:
- 多路復用器:由操作系統提供,在linux上一般是select, poll, epoll等系統調用。
- 事件分發器:將多路復用器中返回的就緒事件分到對應的處理函數中。
- 事件處理器:負責處理特定事件的處理函數。
因為這種模型經常使用,所有不少人對簡單的系統調用做了一層封裝,形成跨平臺的事件處理庫,比較典型的有:libevent,libev,boost asio等。
Proactor模型
與Reactor模型相對應,Proactor最大的特點是使用異步I/O。所有的I/O操作都交由系統提供的異步I/O接口去執行。Proactor多路復用器等待異步I/O完成,并調用相應的用戶處理函數。為了對比Reactor模型,以一個read操作為例:
在Reactor中:
- 將要讀的文件描述符注冊到多路復用器中。
- 多路復用器等待上述描述符的可讀事件以及其它所有已經注冊過的事件。
- 描述符變成可讀之后,多路復用器返回,并調用用戶提供的處理函數,開始讀文件操作。
在Proactor中:
- 用戶函數啟動一個異步讀文件的操作。同時將這個操作注冊到多路復用器上。多路復用器并不關心文件是否可讀而是關心這個異步讀操作是否完成。
- 異步讀文件是操作系統完成,用戶程序不需要關心。多路復用器等待直到有完成通知到來。
- 當操作系統完成了讀文件操作——將讀到的數據復制到了用戶先前提供的緩沖區之后,通知多路復用器讀操作已完成。
- 多路復用器再調用相應的處理程序,處理數據。
總結
以上是生活随笔為你收集整理的I/O事件处理模型之Reactor和Proactor 【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uva 10453 - Make Pal
- 下一篇: 解决Virtualbox无法安装Wind