排程器監視器¶
名稱: sched
型別: 多個監視器的容器
作者: Gabriele Monaco <gmonaco@redhat.com>, Daniel Bristot de Oliveira <bristot@kernel.org>
描述¶
描述複雜系統(如排程器)的監視器很容易變得龐大,以至於由於許多可能的狀態轉換而難以理解。通常可以將此類描述分解為更小的監視器,它們共享部分或所有事件。事實上,同時啟用這些更小的監視器,就如同我們有一個單一的、更大的監視器來測試系統。將模型拆分為多個規範不僅更容易理解,而且在出現錯誤時能提供更多線索。
sched 監視器是一組用於描述排程器行為的規範。它包含多個獨立的、按 CPU 和按任務的監視器,用於驗證排程器應遵循的不同規範。
為了使該系統儘可能簡單,sched 規範是 巢狀 監視器,而 sched 本身是一個 容器。從介面角度來看,sched 將其他監視器作為子目錄包含進來,對 sched 啟用/停用或設定反應器會將更改傳播到所有監視器,但單個監視器也可以獨立使用。
重要的是,未來的模組在其容器(本例中為 sched)之後構建,否則連結器將不尊重順序,並且巢狀將無法按預期工作。為此,只需將它們新增到 Makefile 中 sched 之後即可。
規範¶
sched 中包含的規範目前仍在進行中,它們改編自 Daniel Bristot 在 [1] 中定義的規範。
目前我們包含了以下內容:
監視器 tss¶
任務排程時切換 (tss) 監視器確保任務切換僅發生在排程上下文中,即在對 __schedule 的呼叫內部。
|
|
v
+-----------------+
| thread | <+
+-----------------+ |
| |
| schedule_entry | schedule_exit
v |
sched_switch |
+--------------- |
| sched |
+--------------> -+
監視器 sco¶
排程上下文操作 (sco) 監視器確保任務狀態的更改僅發生線上程上下文中。
|
|
v
sched_set_state +------------------+
+------------------ | |
| | thread_context |
+-----------------> | | <+
+------------------+ |
| |
| schedule_entry | schedule_exit
v |
|
scheduling_context -+
監視器 snroc¶
在其自身上下文中設定為不可執行 (snroc) 監視器確保任務狀態的更改僅發生在相應任務的上下文中。這是一個按任務的監視器。
|
|
v
+------------------+
| other_context | <+
+------------------+ |
| |
| sched_switch_in | sched_switch_out
v |
sched_set_state |
+------------------ |
| own_context |
+-----------------> -+
監視器 scpd¶
停用搶佔呼叫排程器 (scpd) 監視器確保在停用搶佔的情況下呼叫排程器。
|
|
v
+------------------+
| cant_sched | <+
+------------------+ |
| |
| preempt_disable | preempt_enable
v |
schedule_entry |
schedule_exit |
+----------------- can_sched |
| |
+----------------> -+
監視器 snep¶
排程器不啟用搶佔 (snep) 監視器確保排程器呼叫不會啟用搶佔。
|
|
v
preempt_disable +------------------------+
preempt_enable | |
+------------------ | non_scheduling_context |
| | |
+-----------------> | | <+
+------------------------+ |
| |
| schedule_entry | schedule_exit
v |
|
scheduling_contex -+
監視器 sncid¶
未停用中斷呼叫排程器 (sncid) 監視器確保排程器未在停用中斷的情況下被呼叫。
|
|
v
schedule_entry +--------------+
schedule_exit | |
+----------------- | can_sched |
| | |
+----------------> | | <+
+--------------+ |
| |
| irq_disable | irq_enable
v |
|
cant_sched -+