排程器監視器

描述

描述複雜系統(如排程器)的監視器很容易變得龐大,以至於由於許多可能的狀態轉換而難以理解。通常可以將此類描述分解為更小的監視器,它們共享部分或所有事件。事實上,同時啟用這些更小的監視器,就如同我們有一個單一的、更大的監視器來測試系統。將模型拆分為多個規範不僅更容易理解,而且在出現錯誤時能提供更多線索。

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    -+

參考資料

[1] - https://bristot.me/linux-task-model