Golang使用一種稱為搶占式調度(Preemptive Scheduling)的調度策略。搶占式調度是指調度程序可以在一個任務執行期間中斷并切換到另一個任務。
Golang的搶占式調度的原理如下:
Golang的調度器維護一個全局的運行隊列(run queue),其中包含所有可運行的goroutine(即任務)。調度器會根據一定的策略從運行隊列中選擇一個goroutine來執行。
當一個goroutine開始執行時,調度器會將其分配給一個線程(稱為M,或machine),并且將該線程標記為忙碌狀態。
當一個goroutine執行時間超過一定閾值(稱為時間片,或time slice)時,調度器會在該goroutine暫停執行時,將其重新放回運行隊列,并選擇另一個可運行的goroutine執行。
切換線程時,調度器會在空閑線程池中選擇一個空閑的線程,將它標記為忙碌狀態,并將該線程分配給即將執行的goroutine。
調度器還會根據一定的策略(如搶占點)在特定情況下中斷正在執行的goroutine,并將其切換到其他goroutine。這樣可以避免某個goroutine長時間占用線程,導致其他goroutine無法得到執行的情況。
總之,Golang的搶占式調度通過在goroutine執行期間進行切換,以實現高效地利用CPU資源和保證并發執行的需求。調度器負責在合適的時機中斷正在執行的goroutine,并在運行隊列中選擇下一個可運行的goroutine來執行。這種調度策略可以提高程序的并發性和響應性。