首頁  >  文章  >  系統教程  >  Linux 系統中的流程排程:概念、原理與方法

Linux 系統中的流程排程:概念、原理與方法

WBOY
WBOY轉載
2024-02-09 16:33:23730瀏覽

進程調度是Linux 系統中重要的核心功能,它可以在多個進程之間分配CPU 的使用權,使得每個進程都能得到合理的運行時間,從而提高系統的並發性和響應性。進程調度的效果直接影響系統的效能和使用者體驗,因此,了解 Linux 系統中的進程調度是非常必要的。但是,你真的了解 Linux 系統中的進程調度嗎?你知道它的概念、原理和方法嗎?你知道如何在 Linux 下使用和配置進程調度嗎?本文將為你詳細介紹 Linux 系統中的進程調度的相關知識,讓你在 Linux 下更好地使用和理解這個強大的核心功能。

Linux 系统中的进程调度:概念、原理和方法

#在Linux核心中,completion是一種簡單的同步機制,標誌」things may proceed」。

要使用completion,必須在檔案中包含,同時建立一個類型為struct completion的變數。

  1. 這個變數可以靜態地宣告和初始化:

  2. DECLARE_COMPLETION(my_comp);

  3. 或動態初始化:

    1. **struct** completion my_comp; 
    2. init_completion(&my_comp); 
    

如果驅動程式要在執行後面操作之前等待某個程序的完成,它可以呼叫wait_for_completion ,以要完成的事件為參數:

  1. void wait_for_completion(struct completion *comp);

wait_for_completion等待在completion。如果加了interruptible,就表示線程等待可被外部發來的信號打斷;如果加了killable,就表示線程只可被kill信號打斷;如果加了timeout,表示等待超出一定時間會自動結束等待, timeout的單位是系統所花費的時間片jiffies(多為1ms)。

如果其它部分程式碼可以確定事件已經完成,可以呼叫下面兩個函數之一來喚醒等待該事件的進程:

1. **void** complete(**struct** completion *comp); 
2. **void** complete_all(**struct** completion *comp); /* Linux 2.5.x以上版本 */ 

前一個函數將只喚醒一個等待進程,而後一個函數喚醒等待該事件的所以進程。由於completion的實作方式,即使complete在wait_for_competion之前調用,也可以正常工作。
例如,在MD裝置驅動程式實作中,有一個復原執行緒md_recovery_thread。驅動程式透過md_register_thread和md_unregister_thread來註冊和登出恢復執行緒。恢復執行緒的執行邏輯在md_thread函數中,大致如下:

1. **int** md_thread(**void** * arg) 
2. { 
3.   线程初始化; 
4.   **while** (运行) { 
5. ​    处理逻辑; 
6. ​    接收信号; 
7.   } 
8.   **return** 0; 
9. } 

md_register_thread將建立一個復原線程,它必須在線程真正初始化結束之後才能傳回該線程的指標。因此,其邏輯為:

1. mdk_thread_t *md_register_thread(**void** (*run) (**void** *), **void** *data, **const** **char** *name) 
2. { 
3.   mdk_thread_t ***thread**; 
4.   …… 
5.   **struct** completion event; 
6.   /* 为线程分配空间 */ 
7.   **thread** = (mdk_thread_t *) kmalloc (**sizeof**(mdk_thread_t), GFP_KERNEL); 
8.   …… 
9.   init_completion(&event); 
10.   …… 
11.   **thread**->event = &event; 
12.   /* 创建内核线程 */ 
13.   ret = kernel_thread(md_thread, **thread**, 0); 
14.   /* 等待线程初始化结束 */ 
15.   …… 
16.   wait_for_completion(&event); 
17.   /* 返回线程指针 */ 
18.   **return** **thread**; 
19. } 

而md_unregister_thread透過向線程發送SIGKILL訊號註銷恢復線程,它也需要在線程真正退出後才能釋放線程所佔用的記憶體。因此,其邏輯為:

1. **void** md_unregister_thread(mdk_thread_t ***thread**) 
2. { 
3.   **struct** completion event; 
4.   init_completion(&event); 
5.   **thread**->event = &event; 
6.   …… 
7.   /* 向线程发送SIGKILL信号终止其运行 */ 
8.   md_interrupt_thread(**thread**); 
9.   /* 等待线程退出 */ 
10.   wait_for_completion(&event); 
11.   /* 释放线程所占用的内存 */ 
12.   kfree(**thread**); 
13. } 

如果考慮completion,md_thread的邏輯是:


1. **int** md_thread(**void** * arg) 
2. { 
3.   线程初始化; 
4.   complete(**thread**->event);  
5.   **while** (运行) { 
6. ​    处理逻辑; 
7. ​    接收信号; 
8.   } 
9.   complete(**thread**->event);  
10.   **return** 0; 
11. } 

需要說明的是,由於等待事件是在驅動程式和復原執行緒中的一個共享資源,它必須是一個全域變量,或者如實現程式碼中,定義為一個局部變量,而將其指標放在恢復線程結構中。

typedef struct mdk_thread_s {
  ……
  struct completion *event;
  ……
} mdk_thread_t;

透過本文,你應該對 Linux 系統中的進程調度有了一個深入的了解,知道了它的概念、原理和方法。你也應該明白了進程調度的作用和影響,以及如何在 Linux 下正確地使用和配置進程調度。我們建議你在使用 Linux 系統時,使用進程調度來提高系統的並發性和回應性。同時,我們也提醒你在使用進程調度時要注意一些潛在的問題和挑戰,如進程優先權、負載平衡、即時性等。希望這篇文章能幫助你更好地使用 Linux 系統,讓你在 Linux 下享受進程調度的優勢和便利性。

以上是Linux 系統中的流程排程:概念、原理與方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:lxlinux.net。如有侵權,請聯絡admin@php.cn刪除