rtos:zephyr線程的調度接口

線程的創建,掛起和恢復等操作。

原文地址鏈接:

http://docs.zephyrproject.org/kernel/threads/lifecycle.html#thread-termination

zephyr線程操作的接口:

K_THREAD_DEFINE
k_thread_create();
k_thread_abort();
k_thread_suspend();
k_thread_resume();
K_THREAD_STACK_DEFINE
K_THREAD_STACK_ARRAY_DEFINE
K_THREAD_STACK_MEMBER
K_THREAD_STACK_SIZEOF
K_THREAD_STACK_BUFFER

線程的調度接口:

http://docs.zephyrproject.org/kernel/threads/scheduling.html

  1. 線程的優先級。

線程的優先級是一個整數,可以爲正,可以是負。數值低的優先級爲高,調度器基於線程的優先級區分兩類線程(優先級爲正的(preemptible thread)和優先級爲負的(cooperative thread))。

Cooperative thread:優先級爲負,一旦成爲當前執行的線程,就會一直運行,直到執行了是它未就緒的操作。

Preemptible thread:優先級爲正,成爲當前可執行的線程時,在運行中隨時可能被其他線程(優先級高的或者優先級相同的,亦或優先級爲負的cooperative thread)強佔。

 

線程運行後,他的初始優先級也可以更改。因此,cooperative thread和preemptiable thread可以相互更改。

 

CONFIG_NUM_COOP_PRIORITIES CONFIG_NUM_PREEMPT_PRIORITIES可以分別設置這兩類線程的數目。

  1. 調度算法

內核調度器在就緒隊列中選擇優先級最高的線程成爲當前執行的線程,如果有多個優先級形同的線程,就選擇等待時間最長的線程。

  1. 調度器上鎖

一個正在執行關鍵任務的搶佔式線程在執行時,不希望線程被強佔,可以通過調度k_sched_lock()接口使調度器將這個線程作爲cooperative線程,這樣就可以保護當前正在執行的關鍵操作。一旦關鍵部分執行完成,就可以調用k_sched_unlock()接口,是線程恢復正常的強佔式線程。

抑制preemptible thread被其他的preemptiblethread,使用強佔鎖定調度器的方法比將線程的優先級改爲負值的方法更加高效。

  1. 線程的睡眠

k_sleep()。

一個線程可以通過調用k-sleep()接口使當前線程延遲執行,在延遲的這段時間中CPU可以從就緒的線程中選擇一個線程執行。一旦延時完成,就可以處於就緒狀態,從新被調度。

一個處於睡眠的線程可以被其他線程調用k_wakeup()接口喚醒。此操作可以用來,一個線程想另一個線程發送信號,而不需要通過信號量的方法。喚醒一個沒有休眠的線程時可以的,但是沒有效果。

  1. 忙等待

k_busy_wait()

一個線程可以調用k_busy_wait ()接口用以延遲一些操作在一些特定的時間週期內,而不是讓CPU去執行另外一個就緒的線程。

當線程需要執行一個很短時間的休眠時候,如果時間太短以至於不能等到調度器從其他線程切回到當前線程時,可以使用這個方法。

  1. cooperative time slicing

當cooperative thread成爲當前執行的線程時,會一直執行直到執行到使這個線程處於未就緒狀態時,纔會釋放CPU,如果在這類線程中要執行很長的指令,就很容易造成其他的高優先級或者是同等優先級的線程無法接受的等待時間。

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