线程的切入和切出(切入: 一个线程被系统选中占用处理器开始或继续运行)
什么是上下文切換?
CPU通過(guò)分配時(shí)間片來(lái)執(zhí)行任務(wù),當(dāng)一個(gè)任務(wù)的時(shí)間片用完,就會(huì)切換到另一個(gè)任務(wù)。在切換之前會(huì)保存上一個(gè)任務(wù)的狀態(tài),當(dāng)下次再切換到該任務(wù),就會(huì)加載這個(gè)狀態(tài)。
——任務(wù)從保存到再加載的過(guò)程就是一次上下文切換。
切出: 一個(gè)線程被剝奪處理器的使用權(quán)而被暫停運(yùn)行
切入: 一個(gè)線程被系統(tǒng)選中占用處理器開(kāi)始或繼續(xù)運(yùn)行
——上圖的進(jìn)度信息就是上下文,一般包括通用寄存器和程序計(jì)數(shù)器的內(nèi)容。在切出時(shí),操作系統(tǒng)會(huì)將線程的進(jìn)度信息保存到內(nèi)存。在切入時(shí),操作系統(tǒng)需要從內(nèi)存中加載線程的上下文。
什么時(shí)候會(huì)發(fā)生上下文切換?
按導(dǎo)致上下文切換的因素劃分,可將上下文切換分為兩點(diǎn):
- 自發(fā)性上下文切換
- 非自發(fā)性上下文切換
自發(fā)性上下文切換指線程由于自身因素導(dǎo)致的切出。
通過(guò)調(diào)用下列方法會(huì)導(dǎo)致自發(fā)性上下文切換:
- Thread.sleep()
- Object.wait()
- Thread.yeild()
- Thread.join()
- LockSupport.park()
非自發(fā)性上下文切換指線程由于線程調(diào)度器的原因被迫切出。
發(fā)生下列情況可能導(dǎo)致非自發(fā)性上下文切換:
- 切出線程的時(shí)間片用完
- 有一個(gè)比切出線程優(yōu)先級(jí)更高的線程需要被運(yùn)行
- 虛擬機(jī)的垃圾回收動(dòng)作
上下文切換的開(kāi)銷
上下文切換的開(kāi)銷包括直接開(kāi)銷和間接開(kāi)銷。
直接開(kāi)銷有如下幾點(diǎn):
- 操作系統(tǒng)保存恢復(fù)上下文所需的開(kāi)銷
- 線程調(diào)度器調(diào)度線程的開(kāi)銷
間接開(kāi)銷有如下幾點(diǎn):
- 處理器高速緩存重新加載的開(kāi)銷
- 上下文切換可能導(dǎo)致整個(gè)一級(jí)高速緩存中的內(nèi)容被沖刷,即被寫入到下一級(jí)高速緩存或主存
以上內(nèi)容是對(duì)Java多線程編程實(shí)戰(zhàn)指南的總結(jié)
</div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e9f16cbbc2.css" rel="stylesheet"></div>總結(jié)
以上是生活随笔為你收集整理的线程的切入和切出(切入: 一个线程被系统选中占用处理器开始或继续运行)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: OpenGL中的reshape函数(整理
- 下一篇: 线程的状态:分离(detached)和j