進程調度是Linux 系統中重要的核心功能,它可以在多個進程之間分配CPU 的使用權,使得每個進程都能得到合理的運行時間,從而提高系統的並發性和響應性。進程調度的效果直接影響系統的效能和使用者體驗,因此,了解 Linux 系統中的進程調度是非常必要的。但是,你真的了解 Linux 系統中的進程調度嗎?你知道它的概念、原理和方法嗎?你知道如何在 Linux 下使用和配置進程調度嗎?本文將為你詳細介紹 Linux 系統中的進程調度的相關知識,讓你在 Linux 下更好地使用和理解這個強大的核心功能。
#在Linux核心中,completion是一種簡單的同步機制,標誌」things may proceed」。
要使用completion,必須在檔案中包含
這個變數可以靜態地宣告和初始化:
DECLARE_COMPLETION(my_comp);
或動態初始化:
1. **struct** completion my_comp; 2. init_completion(&my_comp);
如果驅動程式要在執行後面操作之前等待某個程序的完成,它可以呼叫wait_for_completion ,以要完成的事件為參數:
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中文網其他相關文章!