-
上下文切換
鎖定
上下文切換相關信息
上下文切換 (context switch) , 其實際含義是任務切換, 或者CPU寄存器切換。當多任務內核決定運行另外的任務時, 它保存正在運行任務的當前狀態, 也就是CPU寄存器中的全部內容。這些內容被保存在任務自己的堆棧中, 入棧工作完成後就把下一個將要運行的任務的當前狀況從該任務的棧中重新裝入CPU寄存器, 並開始下一個任務的運行, 這一過程就是context switch。
[2]
上下文切換基本原理
上下文切換的基本原理就是當發生任務切換時, 保存當前任務的寄存器到內存中, 將下一個即將要切換過來的任務的寄存器狀態恢復到當前CPU寄存器中, 使其繼續執行, 同一時刻只允許一個任務獨享寄存器。在任務切換的過程中是涉及任務上下文的保存和恢復操作, 而任務上下文切換操作的性能是衡量操作系統性能的一個重要指標。任務上下文切換指標可以反映出操作系統在多任務環境下的處理能力。
[3]
上下文切換切換流程
上下文切換引起線程上下文切換的原因
(1)當前正在執行的任務完成,系統的CPU正常調度下一個任務。
(2)當前正在執行的任務遇到I/O等阻塞操作,調度器掛起此任務,繼續調度下一個任務。
(3)多個任務併發搶佔鎖資源,當前任務沒有搶到鎖資源,被調度器掛起,繼續調度下一個任務。
(4)用户的代碼掛起當前任務,比如線程執行yield()方法,讓出CPU。
上下文切換上下文切換開銷
上下文切換是操作系統內核優化的一個關鍵參數指標。在任務間發生切換需要花費大量的時間用於處理諸如:保存和恢復寄存器和內存頁表、更新內核相關數據結構等操作。上下文切換通常是計算密集型的。也就是説, 它需要相當可觀的處理器時間, 在每秒幾十上百次的切換中, 每次切換都需要納秒量級的時間。所以, 上下文切換對系統來説意味着消耗大量的CPU時間。
[4]
從Linux內核內部實現來看, 如圖3所示, 上下文切換所花費的延遲時間是從調度器選好要調度的任務 (任務1) 後到把任務上下文切換到另一個任務 (任務2) 所花費的時間。即context_switch () 函數的開銷。
[4]
上下文切換性能影響
上下文切換會對性能造成負面影響。一些上下文切換相對其他切換而言更加昂貴;其中一個更昂貴的上下文切換是跨核上下文切換(Cross-Core Context Switch)。一個線程可以運行在一個專用處理器上,也可以跨處理器。由單個處理器服務的線程都有處理器關聯(Processor Affinity),這樣會更加有效。在另一個處理器內核搶佔和調度線程會引起緩存丟失,作為緩存丟失和過度上下文切換的結果要訪問本地內存。總之,這稱為“跨核上下文切換”。
[5]
- 參考資料
-
- 1. 王磊.Offer來了:Java面試核心知識點精講(原理篇):電子工業出版社,2019-11
- 2. 孫利鋒.嵌入式操作系統任務切換方法對比分析[J].單片機與嵌入式系統應用 .中國知網.2011-07-01[引用日期2020-04-15]
- 3. 張東,梅濤.一種高效的浮點上下文切換算法[J].科技風 .中國知網.2017-01-30[引用日期2020-04-15]
- 4. 孫菲豔,李彥峯,王娜,汪辰.Linux上下文切換性能測試的一種新方法[J].電腦知識與技術 .中國知網.2018-05-25[引用日期2020-04-15]
- 5. Donis Marshall(美).Visual Studio 2010並行編程從入門到精通.北京清華大學學研大廈A座:清華大學出版社,2013年1月第一版:P4