1. 程式人生 > >gem5中event queue執行原理機制具體分析

gem5中event queue執行原理機制具體分析

執行 proc post tis pan roc view 函數實現 obj

搞清楚這個花了兩天時間,下面內容為簡略版。為了給自己賺點下載用的積分。如須要具體版本號。請點擊下載點擊打開鏈接



技術分享圖片

圖1 與Event相關的類




以上是在gem5中,event相關的類繼承圖,SimObject、EventBase是Event的基礎類。GlobalEvent繼承於Event類。

(1)Event:gem5中全部和時序相關的操作都是由event來驅動的,比方tick、trap、writeback等等。

Event是event queue中的node。不論什麽須要使用Event作為基類的子類須要重構虛函數Event中的process()以實現對應的event功能。

技術分享圖片

?

1.1 Eventqueue

一系列的event依照時間先後順序組合成一個eventqueue。

Event的調度使用schedule()函數實現。主要功能就是把event插入對應的eventqueue,event分為兩類:同步(synchronous)、異步(asynchronous)event:

同步event:當schedule()函數調度同步event時,event中的global參數會被設置為false,這樣的情況僅僅同意在thread持有對應event queue的鎖(EventQueue::service_mutex)的情況下。

在調用event處理函數process()時,這個鎖一直由當前event queue持有,其自己能夠insert event到自己的event queue中,稱其這樣的插入到當前event queue的event為同步event。

異步event:event能夠event queue之間來回調度,僅僅要持有目標event queue的鎖。就能夠向目標event queue插入event。可是為了防止死鎖,假設eventqueue A中的某個event處理過程中須要向B插入event。A必須主動釋放其自己的鎖,而且申請B的鎖後才幹插入event,否則easy引起死鎖。就算這樣,在event queue中遷移的動作的結果是不確定的,這樣的情況僅僅能在處理異步IO或者KVM中fast-forwarding情況下同意。

普通的異步event的調度時global參數會被設置為true。跟前面的遷移策略不同的時。這樣的行為是確定性的。

當插入異步event時。會先將event插入一個單獨的async_queue,當每個simulation quantum結束時,由函數handleAsyncInsertions把async_queue和目標event queue合並起來。

須要註意的是,這樣的插入操作的目標event queue須要跟當前event queue的時間差超過一個quantum,否則會easy導致插入的event無法被目標event queue處理函數所處理,即時間上已經past了。



技術分享圖片




gem5中event queue執行原理機制具體分析