HarmonyOS基礎資料結構設計--事件驅動模型Reactor
引言
Reactor模式是處理併發I/O比較常見的一種模式,中心思想是將所有的事件(handler)的具體I/O事件註冊到一個多路複用器(epoll)上,同時我們的主執行緒都阻塞在多路複用器(epoll)上,同時我們的事件有I/O事件觸發(檔案描述符可讀、可寫、錯誤、關閉),多路複用器(epoll)上會返回並將事件註冊的相應I/O事件分發到關聯的處理器(event_handler)中。HarmonyOS針對Reactor模式的開發分成了4個模組,分別為多路複用器(event_demultiplexer),事件處理器(event_handler),排程器(event_reactor),計時器(timer_event_handler)。本文我們先來分析下多路複用器(event_demultiplexer)的設計與實現。
多路複用器
類名:event_demultiplexer
定義位置:OHOS名稱空間下的Utils子名稱空間
功能:阻塞等待被監聽的事件檔案描述符集合,採用epoll實現I/O複用,用來等待批量的fd。
工作流程圖:
要點
①多路複用器是採用epoll實現的多路複用
②epoll底層採用了紅黑樹,提高了增刪改查的效率
③採用epoll_create1(EPOLL_CLOEXEC)建立epoll,可以避免掉fork子程序時,開發者忘記關閉父程序開啟的fd的情況
常用API
①uint32_t StartUp(),啟動事件多路複用器(epoll)
//啟動事件多路分離器 uint32_t EventDemultiplexer::StartUp() { //判斷epoll是否建立成功 if (epollFd_ < 0) {//未建立成功則,重新建立 epollFd_ = epoll_create1(EPOLL_CLOEXEC); if (epollFd_ < 0) {//再次建立失敗則返回TIMER_ERR_BADF UTILS_LOGE("epoll_create1 failed.");//記錄失敗原因到日誌中 return TIMER_ERR_BADF; } }return TIMER_ERR_OK;//啟動成功,返回TIMER_ERR_OK }
②void CleanUp(),關閉事件多路複用器(epoll)
③void Polling(int timeout),監聽epoll,最多阻塞timeout時間,獲取到被觸發的events連結串列,並根據觸發的具體事件,通知對應的事件處理器去處理。
/* 函式功能:監聽epoll,最多阻塞timeout時間,獲取到被觸發的event連結串列,並根據觸發的具體事件,通知對應的EventHandler去處理。 函式引數:timeout,本函式陷入阻塞的最大時間 函式返回值:void */ void Polling(int timeout);
④uint32_t UpdateEventHandler(EventHandler* handler),更新多路複用器中存放的事件處理器
/* 函式功能:更新EventDemultiplexer事件多路分離器中存放的事件eventHandlers_的可操作事件處理器 函式引數:handler,事件處理器 函式返回值:uint32_t,返回操作結果的狀態碼 */ uint32_t UpdateEventHandler(EventHandler* handler);
⑤uint32_t RemoveEventHandler(EventHandler* handler),移除多路複用器中存放的事件處理器
/* 函式功能:移除傳入的事件控制代碼EventHandler事件處理器 函式引數:handler,事件處理器 函式返回值:uint32_t,返回操作結果的狀態碼 */ uint32_t RemoveEventHandler(EventHandler* handler);
總結
事件驅動模型Reactor模型的多路複用器子模組(event_demultiplexer),分析其底層的實現,儲存了具體事件的事件處理器,並通過epoll監聽具體的事件(handler)的觸發I/O事件,並通過事件處理器處理具體的事件。