我明白新的linux內核允許內核空間線程被搶佔。 有人可以簡要解釋在內核模式下如何執行pre-empting工作嗎? 因此,當進行系統調用時,軟件中斷將把線程切換到內核模式,並且它將運行必要的操作。 現在,讓我們說它的時間片已經到了 - 另一個用戶線程運行,它也想在內核空間中執行。 (或者它可能是一個h/w中斷)。 當內核被中斷時,內核如何維護它正在修改的任何結構的完整性?內核模式搶佔
Q
內核模式搶佔
3
A
回答
5
Linux內核以與在多線程環境中運行的任何內容相同的方式保護其數據結構。
它可能會使用一些sort of lock來保護必須以原子方式訪問的數據結構。通常,這些包括自旋鎖,互斥和信號量。
還有一些函數disable preemption,但通常不會顯式使用,因爲鎖定代碼將隱式地處理這個問題。
3
有人可以簡要解釋如何在內核模式下執行pre-empting工作嗎?
它的工作原理與其他任何上下文切換一樣。當在可搶佔代碼中發生中斷時,CPU跳轉到相應的中斷處理程序,並在堆棧上留下一些信息(通常是中斷任務的RIP/CS/EFLAGS/RSP/SS寄存器),以便能夠返回到pre - 稍後調高任務。
因此,當進行系統調用時,軟件中斷會將線程切換到內核模式,並且它將運行必要的操作。現在,讓我們說它的時間片已經到了 - 另一個用戶線程運行,它也想在內核空間中執行。 (或者它可能是一個h/w中斷)。當內核被中斷時,內核如何維護它正在修改的任何結構的完整性?
我們調用第一個(被搶佔的)任務T1和新的任務T2。如果T1正在訪問某些數據結構,那麼T1必須先獲取鎖。所有可能被多個線程併發訪問的內核數據結構都被鎖(幾乎)保護。如果T2試圖訪問相同的數據結構,那麼它將無法獲得該鎖,因爲T1仍然存在,結果T2將阻塞,並使CPU返回到另一個任務。過了一段時間T1將再次開始執行,釋放鎖,睡眠再次切換回T2,T2獲取鎖,就執行,釋放鎖等
如果多個線程試圖訪問同一數據保護同時,只有第一個線程通常會獲得訪問權限,所有其他線程將不得不等待。
相關問題
- 1. linux - 內核線程搶佔
- 2. 在Linux內核中搶佔
- 3. Linux內核搶佔級別
- 4. 內核佔先搶佔自旋鎖
- 5. Linux內核搶佔用spin_lock和的mutex_lock
- 6. MySQL/Python搶佔式緩存
- 7. 內核:執行do_fork()時可以搶佔嗎?
- 8. GKE搶佔池
- 9. 記錄搶佔
- 10. 搶佔,pthread_spin_lock和原子內置
- 11. 搶佔getBBox計算
- 12. spin_lock期間搶佔
- 13. 如何避免在用戶模式下搶佔我的線程
- 14. 如何從另一個進程/內核線程中搶佔一個進程?
- 15. 線程可以在系統調用內核的時候被搶佔嗎?
- 16. 優先搶佔調度
- 17. 鎖定持有者搶佔
- 18. 的Linux底半搶佔
- 19. SDT內核模式掛鉤
- 20. Emacs WinDbg內核模式
- 21. 內核模式轉換
- 22. 內核模式和內存保護
- 23. 用戶模式和內核模式之間的共享內存
- 24. 搶佔了所有使用數組
- 25. Linux如何同步搶佔計數
- 26. contiki調度程序是否搶佔?
- 27. 進程間預定義的搶佔點
- 28. C代碼 - 存儲器訪問/搶佔
- 29. bad_alloc在VS 2010/2013中搶佔C++
- 30. 兩個SWT表戰鬥搶佔空間
@shekhar Thats dosent真的回答我的問題。我不是在談論進程狀態 - 我談論的是在內核模式下被搶佔 - 可以說你正在更新內核中的一些數據結構 – excalibur
是什麼讓你「_understand new linux kernel allow kernel space threads pre -empted_「?你能否提供這個假設的來源? https://github.com/torvalds/linux/commits/master提交了哪個提交? – xmojmr
@xmojmr - 「new」可能並不合適,但無論如何,這裏有一篇文章描述2.6中的新特性。「http://www.linuxjournal.com/article/7477」從內核2.6開始,內核就是可搶佔的。可以被搶佔,這樣一些重要的用戶應用程序可以繼續運行...因此,在Linux下2。6,內核現在可以中斷任務,所以其他應用程序可以繼續運行「 – excalibur