《Linux內核設計與分析》第四章讀書筆記

《內核設計與實現》第四章讀書筆記


第四章:進程調度

  1. 進程(操做系統)程序的運行態表現形式。
  2. 進程調度程序,它是確保進程能有效工做的一個內核子系統。 調度程序負責決定將哪一個進程投入運行,什麼時候運行以及運行多長時間

進程調度程序可看作在可運行態進程之間分配有限的處理器時間資源的內核子系統.算法

最大限度地利用處理器時間的原則是,併發

只要有能夠執行的進程,那麼就總會有進程正在執行。

可是隻要系統中可運行的進程的數目比處理器的個數多,就註定某一給定時刻會有一些進程不能執行。這些進程在等待運行。在一組處於可運行狀態的進程中選擇一個來執行,是調度程序所需完成的基本工做。函數

1、多任務

多任務操做系統:同時併發地交互執行多個進程的操做系統。操作系統

2、Linux進程調度

O(1)調度程序的新調度程序。
缺點:交互程序
RSDL--CFS公平調度的概念。

3、策略

4、Linux調度算法

5、進程調度入口

進程調度的主要入口點是schedule(),它定義在文件kernel/sched.c中。設計

6、用戶搶佔 

用戶搶佔在如下狀況時產生:
  • 從系統調返回用戶空間時。
  • 從中斷處理程序返回用戶空間時。 

7、內核搶佔

Linux完整地支持內核搶佔,
在不支持內核搶佔的內核中,內核代碼能夠一直執行
 
軟實時的含義是,內核調度進程,盡力使進程在它的限定時間到來前運行,但內核不保證總能知足這些進程的要求。
相反,硬實時系統保證在必定條件下,能夠知足任何調度的要求。
Linux對於實時任務的調度不作任何保證。
 

8、與調度策略和優先級相關的系統調用

  • sched_setscheduler()和 sched_getscheduler()分別用於設置和獲取進程的調度策略和實時優先級。與其餘的系統調用類似,它們的實現也是由許多參數檢查、初始化和清理構成的。其實最重要的工做在於讀取或改寫進程task_struct的policy和rt_priority的值。
  • sched_setscheduler()和 sched_getscheduler()分別用於設置和獲取進程的實時優先級。這兩個系統調用獲取封裝在sched_param特殊結構體的rt_priority中。實時調度策略的的最大優先級:是MAX_ USERRT_PRIO減1。最小優先級等於1。
  • 對於―個普通的進程,nice函數能夠將給定進程的靜態優先級增長一個給定的量。只有超級用戶才能在調用它時使用負值,從而提升進程的優先級。nice函數會調用內核的set_user_nice函數,這個函數會設置進程的的task_struct的static_prio值。

9、與處理器綁定有關的系統調用

Linux調度程序提供強制的處理器綁定機制。
這種強制的親和性保存在進程的一個位掩碼標誌中。該掩碼標誌的每一位對應一個系統可用的處理器,
默認狀況下,全部的位都被設置。 

10、放棄處理器時間

1.Linux經過sched_yield()系統調用,提供了一種讓進程顯式地將處理器時間讓給其餘等待執行進程的機制
2.是經過將進程從活動隊列中移到過時隊列中實現的
3.如今,應用程序甚至內核代碼在調用sched_yield()前,應該仔細考慮是否真的但願放棄處理器時間。
4.能夠直接調用sched_yield(),先要肯定給定進程確實處於可執行狀態,而後再調用sched_yield(),用戶空間的應用程序直接使用sched_yield()系統調用就能夠 。
相關文章
相關標籤/搜索