线程的切入和切出(切入: 一个线程被系统选中占用处理器开始或继续运行)
生活随笔
收集整理的這篇文章主要介紹了
线程的切入和切出(切入: 一个线程被系统选中占用处理器开始或继续运行)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/dh554112075/article/details/90696768
什么是上下文切換?
CPU通過分配時間片來執行任務,當一個任務的時間片用完,就會切換到另一個任務。在切換之前會保存上一個任務的狀態,當下次再切換到該任務,就會加載這個狀態。
——任務從保存到再加載的過程就是一次上下文切換。
切出: 一個線程被剝奪處理器的使用權而被暫停運行
切入: 一個線程被系統選中占用處理器開始或繼續運行
——上圖的進度信息就是上下文,一般包括通用寄存器和程序計數器的內容。在切出時,操作系統會將線程的進度信息保存到內存。在切入時,操作系統需要從內存中加載線程的上下文。
什么時候會發生上下文切換?
按導致上下文切換的因素劃分,可將上下文切換分為兩點:
- 自發性上下文切換
- 非自發性上下文切換
自發性上下文切換指線程由于自身因素導致的切出。
通過調用下列方法會導致自發性上下文切換:
- Thread.sleep()
- Object.wait()
- Thread.yeild()
- Thread.join()
- LockSupport.park()
非自發性上下文切換指線程由于線程調度器的原因被迫切出。
發生下列情況可能導致非自發性上下文切換:
- 切出線程的時間片用完
- 有一個比切出線程優先級更高的線程需要被運行
- 虛擬機的垃圾回收動作
上下文切換的開銷
上下文切換的開銷包括直接開銷和間接開銷。
直接開銷有如下幾點:
- 操作系統保存恢復上下文所需的開銷
- 線程調度器調度線程的開銷
間接開銷有如下幾點:
- 處理器高速緩存重新加載的開銷
- 上下文切換可能導致整個一級高速緩存中的內容被沖刷,即被寫入到下一級高速緩存或主存
以上內容是對Java多線程編程實戰指南的總結
</div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e9f16cbbc2.css" rel="stylesheet"></div>總結
以上是生活随笔為你收集整理的线程的切入和切出(切入: 一个线程被系统选中占用处理器开始或继续运行)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenGL中的reshape函数(整理
- 下一篇: 线程的状态:分离(detached)和j