AMPS:非阻塞模塊和I/O代理

  AMPS中模塊分爲非阻塞、阻塞和I/O 代理兩種類型。

  •   無阻塞模塊:如發送和接收網絡消息,或者讀寫文件。
  •   阻塞模塊和I/O代理:
               有些場景下阻塞可能無法實現,例如DNS查詢或者數據庫交互。這種場景下,AMPS要求開發者以I/O代理的形式創建模塊,I/O代理準備I/O請求,並花大量時間等待操作完成,它由一個事件調度器和一個線程池組成。池中的每個線程關聯一個事件隊列,在空閒狀態下線程在事件隊列中保持阻塞,調度器被主事件管理器作爲事件句柄註冊。它從池中選擇一個線程,並且分發一個接收事件到與線程關聯的隊列。這樣設計的優點是當有大量的I/O請求時,可以將其一併保存在隊列中。每個線程執行同樣的代碼,一旦由於隊列中的新事件線程喚醒後,它調用事件句柄進行處理,而句柄可能在I/O操作期間阻塞,此時這個線程爲阻塞事件提供服務,而程序繼續處理未被分發的事件。



  在上圖中,當模塊1請求一個由模塊2提供的服務時,(模塊2爲一個I/O代理,由一個線程池和一個分發函數組成,分發函數以回調函數的形式註冊給事件管理器,線程池包括4個線程),由模型1產生的請求R1通過事件調試程序路由給模塊2,並且它的分發函數被調用,分發函數在線程池中選擇一個線程(如線程2),並將請求傳給此線程,線程開始處理這個請求,當I/O操作完成後,它產生一個響應事件RES1並路由回給模塊1(模塊1註冊了此事件類型)。

發佈了205 篇原創文章 · 獲贊 30 · 訪問量 143萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章