1. 程式人生 > 其它 >HarmonyOS基礎資料結構設計--事件驅動模型Reactor

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事件,並通過事件處理器處理具體的事件。