節(jié)選自:Linux高性能服務(wù)器編程
?????? Reactor模式要求主線程(I/O處理單元)只負(fù)責(zé)監(jiān)聽文件描述上是否有事件發(fā)生管嬉,有的話就立即將該時(shí)間通知工作線程(邏輯單元),除此之外,主線程不做任何其他實(shí)質(zhì)性的工作。讀寫數(shù)據(jù),接受新的連接,以及處理客戶請(qǐng)求均在工作線程中完成礁遣。
使用同步I/O模型(以epoll_wait為例)實(shí)現(xiàn)的Reactor模式的工作流程是:
1)主線程往epoll內(nèi)核事件表中注冊(cè)socket上的讀就緒事件。
2)主線程調(diào)用epoll_wait等待socket上有數(shù)據(jù)可讀肩刃。
3)當(dāng)socket上有數(shù)據(jù)可讀時(shí)祟霍,epoll_wait通知主線程。主線程則將socket可讀事件放入請(qǐng)求隊(duì)列盈包。
4)睡眠在請(qǐng)求隊(duì)列上的某個(gè)工作線程被喚醒沸呐,它從socket讀取數(shù)據(jù),并處理客戶請(qǐng)求呢燥,然后往epoll內(nèi)核事件表中注冊(cè)該socket上的寫就緒事件崭添。
5)主線程調(diào)用epoll_wait等待socket可寫。
6)當(dāng)socket可寫時(shí)叛氨,epoll_wait通知主線程呼渣。主線程將socket可寫事件放入請(qǐng)求隊(duì)列。
7)睡眠在請(qǐng)求隊(duì)列上的某個(gè)工作線程被喚醒力试,它往socket上寫入服務(wù)器處理客戶請(qǐng)求的結(jié)果徙邻。
?圖8-5中,工作線程從請(qǐng)求隊(duì)列中取出事件后畸裳,將根據(jù)事件類型決定如何處理它缰犁,對(duì)于可讀事件,執(zhí)行讀數(shù)據(jù)和處理請(qǐng)求的操作怖糊;對(duì)于可寫事件帅容,執(zhí)行寫數(shù)據(jù)的操作。因此伍伤,對(duì)于圖8-5所示 Reactor模式中并徘,沒有必要區(qū)分所謂的讀工作線程和寫工作線程。