Reactor模型是非阻塞的同步IO模型。在主線程中也就是IO處理單元中,只負責監聽文件描述符上是否有事件發生,有的話就立即將事件通知工作線程,將socket可讀可寫事件放入請求隊列,交給工作線程處理。
總而言之就是主線程監聽有事件發生后,就需要在應用程序中主動調用read方法來完成數據的數去,也就是要應用程序主動將socket接收緩存中的數據讀取到應用進程內存中,在這個過程是同步的,讀取完數據后應用進程才能處理數據。
同步的意思就是應用程序去操作系統讀取數據,異步是操作系統直接將數據寫到我們提供的buf中然后通知應用進程。
在Reactor模式中還細分了幾個模式:單Reactor單線程,單Reactor多線程以及主從Reactor模式。
1. 單reactor單線程模型就是使? I/O 多路復?技術,當其獲取到活動的事件列表時,就在reactor中進?讀取請 求、業務處理、返回響應,這樣的好處是整個模型都使??個線程,不存在資源的爭奪問題。但是如果?個事 件的業務處理太過耗時,會導致后續所有的事件都得不到處理。
2. 單reactor多線程就是?于解決這個問題,這個模型中reactor中只負責數據的接收和發送reactor將業務處 理分給線程池中的線程進?處理,完成后將數據返回給reactor進?發送,避免了在reactor進?業務處理,但 是 IO 操作都在reactor中進?,容易存在性能問題。?且因為是多線程,線程池中每個線程完成業務后都需要 將結果傳遞給reactor進?發送,還會涉及到共享數據的互斥和保護機制。
3. 主從reactor就是將reactor分為主reactor和從reactor,主reactor中只負責連接的建?和分配,讀取請求、 業務處理、返回響應等耗時的操作均在從reactor中處理,能夠有效地應對?并發的場合。
proactor模式
將所有的IO操作都交給主線程和內核來處理,工作線程僅僅負責業務邏輯。主線程調用異步IO的API向內核注冊socket上的讀寫事件,并告訴內核用戶讀緩存區的位置,以及讀操作完成時應該如何通知應用進程。然后主線程繼續其他邏輯。當socket有數據被讀入用戶緩存區的時候,內核向應用程序發送一個信號,然后執行業務邏輯。
簡單的說就是發起異步讀寫請求時,需要傳入數據緩存區的地址和通知信號,這樣系統內核才可以自動幫我們把數據的讀寫工作完成,這里的讀寫工作都是由操作系統來做的,不需要像Reactor那樣需要應用進程主動發起read/write來讀寫數據。
那么為什么不用proactor模型呢?
在linux下異步IO是不完善的,不是真正的操作系統級別支持的,而是在用戶空間模擬出來的異步。僅僅支持基于本地文件的aio異步操作,網絡編程中的socket是不支持的。