2.6之前不支持內核搶占,支持用戶搶占。用戶態搶占必須等內核代碼運行完畢,返回用戶態前夕。內核搶占是在內核代碼運行期間,內核態里其他代碼間互相搶占。
內核態搶占發生時機:1.中斷調用返回,need_resched == 1,2.內核從不可搶占變為可搶占PReempt_count(這個是持有鎖個數) ==0,也是隱式調用schedule()3.內核任務顯示調用schedule,主動放棄cpu4.內核任務被阻塞,顯示調用schedule
判斷是否可以搶占:1.當前任務不持有鎖。也就是thread_info結構體中的preempt_count==0
內核搶占,在很多地方還是為了保護臨界區資源而需要臨時性的禁用內核搶占不可搶占情況很多,先說幾個內核不可以搶占情況:1.中斷2.當期進程持有鎖3.內核正在調用schedule函數4.內核正在處理每cpu私有數據
任務調度時機:1.當前進程變為非可執行2.搶占:當前任務時間片用完 or 高優先級任務就緒
linux 將所有的線程都當作進程來實現。在linux2.6之前,內核并不支持線程的概念,僅通過輕量級進程(lightweight process)模擬線程在linux2.6之后,為了完全兼容posix標準,引入了線程組的概念(仍然用輕量級進程表示線程),有了這個概念就可以將一組線程組織稱為一個進程,如此通過這個改變,linux內核正式支持多線程特性。
系統調用clone創建子進程時, 可以有選擇性地讓子進程共享父進程所引用的資源. 這樣的子進程通常稱為輕量級進程,又叫內核線程。
linux2.6前,用輕量級進程模擬線程,只實現了posix線程5點要求的1點;linux2.6,引入了線程組的概念,真正實現了posix線程所有的5點要求;但還是用輕量級進程模擬線程。
新聞熱點
疑難解答