opnet核心函數-事件類

事件類核心函數

在仿真過程中,事件類核心函數爲進程模型提供有關事件的信息。這些事件由仿真核心管理,按照執行時間的順序被存儲在一個事件列表中。事件列表的隊首事件爲當前要執行的事件,而事件類核心函數使用事件句柄(Evhandle)來對事件進行操作。

OPNET 提供三個函數訪問事件列表中的事件。

1op_ev_current()返回當前事件的句柄。

2)以一個有效事件爲參考點,進程可以通過調用op_ev_next()在事件列表中獲得該事件的下一個事件。

3op_ev_seek_time()可以獲得與輸入的仿真時間最接近的那個事件的句柄。當一個進程接收某個事件,也就是說,該事件作用於本地進程模塊自身,則該事件被看作時本地事件。因此op_ev_current()返回的肯定是本地事件,因爲是這個事件喚醒本地進程的。而op_ev_next_local()返回下一個本地事件。事件類核心函數還支持管理並查找將來的事件。如果進程要遍歷全部的事件,可以分爲兩步進行操作:

1)調用op_ev_count()得到事件的個數,當然也可以採用op_ev_count_local()得到本地事件的個數。

2)事件個數爲循環語句的上限,對每個事件進行操作。

有時當事件到達時,進程模塊卻認爲該事件已經過期無效,例如進程發送包是爲了確保它將來沒有成功發送時重新再發,於是進程調度一個將來分鐘以後再次發送包的事件,但是分鐘過後,收到一個確認表明剛纔的包發送成功了,於是這個“將來分鐘以後再次發送包的事件”就變得無效,這時可以調用op_ev_cancel()在收到“分鐘過後的確認”後將這個無效的將來事件刪除。而op_ev_pending()判斷一個事件是否還在事件列表中等待調度。如果op_ev_cancel()試圖刪除一個在事件列表中不存在的事件,則會出錯,因此一般op_ev_pending()配合op_ev_cancel()使用,確保能夠正確刪除事件。事件的兩個常用屬性分別是事件類型和調度時間。op_ev_type()可返回一個事件的類型,中斷的類型在編程中用得較多,每種類型其實對應的是(1,2,3...)的整數索引號,OPNET常用的事件(也可稱爲中斷,中斷是事件起作用的結果)類型如如下表所示。

OPNET中斷類型常數

描述

OPC_INTRPT_FAIL

節點或鏈路失效中斷

OPC_INTRPT_RECOVER

節點或鏈路恢復中斷

OPC_INTRPT_PROCEDURE

程序調用中斷

OPC_INTRPT_SELF

自中斷

OPC_INTRPT_STRM

流中斷

OPC_INTRPT_STAT

狀態中斷

OPC_INTRPT_REMOTE

來自外地進程的遙遠中斷

OPC_INTRPT_BEGSIM

仿真開始中斷

OPC_INTRPT_ENDSIM

仿真結束中斷

OPC_INTRPT_ACCESS

進程模塊用來獲取包流隊列中封包的中斷

OPC_INTRPT_MCAST

多播中斷

OPC_INTRPT_PROCESS

 進程調用中斷

自中斷、遙遠中斷或多播中斷有着它們各自的用途。自中斷最常用,模擬進程的各種延時(將來某個時刻)的處理。由於進程可以調度多個同種類型的事件,因此光用事件類型來區分是不夠的,OPNET 爲每個事件分配一個事件號(不是自動分配的,是用戶調度事件時手動分配的),op_ev_code()可以得到這些事件號。流中斷是由於包到達輸入流端口時觸發的,op_ev_strm()決定包到達的流索引號。狀態中斷由於特定模塊參數改變而觸發的。op_ev_stat()決定事件作用的狀態線索引號,注意它只返回輸入狀態線索引號,而得不到狀態線觸發條件等信息。op_ev_time()可以返回事件調用的仿真時間。

大多數事件源於某個模塊,例如流中斷源於發送包的模塊,自中斷、遙遠中斷和多播中斷源於調度它們的進程模塊。調用op_ev_src_id()獲取產生這些事件的源模塊ID號。但是有三種事件是沒有源模塊的,因爲它們是仿真核心自動生成的,它們是:仿真開始事件bigsim,仿真結束事件endsim regular 事件。與op_ev_src_id()對應,事件的目的模塊ID號可以通過op_ev_dst_id()獲得。op_ev_equal()提供比較兩個事件句柄的支持。如果是事件句柄相同,則認爲它們是同一個事件,這在進程等待一個特定事件時很有用,具體來說,首先進程得到該特定事件的句柄,然後每接收一個事件將當前事件的句柄和這個特定事件句柄相比較,一直等到特定事件的到達,op_ev_count()得到事件的個數,op_ev_count_local()得到本地事件的個數。

事件可以調度(scheduled),也可以強制(forced)執行。如果事件按照事件列表中按照正常順序執行,則稱爲調度。而強制執行的事件不用在事件列表中按照先進先出順序排隊,直接“插隊”而立即執行。

事件生成的同時也可以要求綁定一些相關信息,以便給接收該事件的目的模塊以相關信息的提示。OPNET 提供兩種方法:

1)採用op_ici_install()將界面控制信息(ICI)句柄與事件綁定,而op_ev_ici()獲得該界面控制信息的句柄。

2)使用狀態信息(State information),它是比ICI 機制更快速的傳遞信息的方式。op_ev_state_install()將用戶自定義的數據結構與事件相綁定,然後通過op_ev_state()返回該信息。另外有時可以通過op_ev_valid()來判斷事件是否有效。它一般用在對一個事件的有效性感到懷疑的場合,如我們想知道一個事件是否仍然存在事件列表中,就可以調用op_ev_valid()先做判斷再進行其他的事件操作。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章