0. 基本概念
窗口/組件
事件
消息(隊列)
事件響應(服務處理程序)
調度算法
進程/線程
非阻塞I/O
程序的執(zhí)行可以看成對CPU,內存,IO資源一次占用
現代操作系統支持多任務,可以分時復用上述資源.
1. 為什么采用事件驅動模型?
事件驅動模型也就是我們常說的觀察者闷盔,或者發(fā)布-訂閱模型;理解它的幾個關鍵點:
- 首先是一種對象間的一對多的關系驾凶;最簡單的如交通信號燈,信號燈是目標(一方)立美,行人注視著信號燈(多方)盾似;
- 當目標發(fā)送改變(發(fā)布)氓涣,觀察者(訂閱者)就可以接收到改變汪拥;
- 觀察者如何處理(如行人如何走达传,是快走/慢走/不走,目標不會管的)喷楣,目標無需干涉趟大;所以就松散耦合了它們之間的關系鹤树。
2. 代碼執(zhí)行流程
在傳統的或“過程化”的應用程序中铣焊,應用程序自身控制了執(zhí)行哪一部分代碼和按何種順序執(zhí)行代碼。從第一行代碼執(zhí)行程序并按應用程序中預定的路徑執(zhí)行罕伯,必要時調用過程曲伊。
在事件驅動的應用程序中,代碼不是按照預定的路徑執(zhí)行-而是在響應不同的事件時執(zhí)行不同的代碼片段追他。事件可以由用戶操作觸發(fā)坟募、也可以由來自操作系統或其它應用程序調度算法的消息觸發(fā)、甚至由應用程序本身的消息觸發(fā)邑狸。這些事件的順序決定了代碼執(zhí)行的順序懈糯,因此應用程序每次運行時所經過的代碼的路徑都是不同的。
3. 事件驅動模型
在UI編程中单雾,常常要對鼠標點擊進行相應赚哗,首先如何獲得鼠標點擊呢?
方式一:創(chuàng)建一個線程硅堆,該線程一直循環(huán)檢測是否有鼠標點擊屿储,那么這個方式有以下幾個缺點:
- CPU資源浪費,可能鼠標點擊的頻率非常小渐逃,但是掃描線程還是會一直循環(huán)檢測够掠,這會造成很多的CPU資源浪費;如果掃描鼠標點擊的接口是阻塞的呢茄菊?
- 如果是堵塞的疯潭,又會出現下面這樣的問題,如果我們不但要掃描鼠標點擊面殖,還要掃描鍵盤是否按下袁勺,由于掃描鼠標時被堵塞了,那么可能永遠不會去掃描鍵盤畜普;
- 如果一個循環(huán)需要掃描的設備非常多期丰,這又會引來響應時間的問題;所以,該方式是非常不好的钝荡。
方式二:就是事件驅動模型目前大部分的UI編程都是事件驅動模型街立,如很多UI平臺都會提供onClick()事件,這個事件就代表鼠標按下事件埠通。事件驅動模型大體思路如下:
- 有一個事件(消息)隊列赎离;
- 鼠標按下時,往這個隊列中增加一個點擊事件(消息)端辱;
- 有個循環(huán)梁剔,不斷從隊列取出事件,根據不同的事件舞蔽,調用不同的函數荣病,如onClick()、onKeyDown()等渗柿;
- 事件(消息)一般都各自保存各自的處理函數指針个盆,這樣,每個消息都有獨立的處理函數朵栖;如圖:
Paste_Image.png
4. 事件驅動處理庫
- select
- poll
- epoll
- libev
參考資源
1. 事件驅動的機制是什么?
2. 經典軟件設計模型 - 事件驅動模型
3. 詳解Spring事件驅動模型
4. 百度知道:為什么事件驅動服務器這么火
5. IBM:分布式應用中基于事件驅動的應用開發(fā)模型