在Linux中導(dǎo)致線程切換的操作是什么
發(fā)布時(shí)間:2020-06-16 點(diǎn)擊數(shù):1634
在Linux中導(dǎo)致線程切換的操作是什么?針對(duì)此問(wèn)題,本文提供了相應(yīng)的分析和答案,希望可以幫助更多希望解決此問(wèn)題的朋友找到一種更簡(jiǎn)單的方法。
Linux使用一對(duì)一線程模型,用戶線程切換和內(nèi)核線程切換之間的差異很小。同時(shí),如果您忽略了放棄用戶線程執(zhí)行權(quán)的用戶成本(收益),則只需考慮內(nèi)核線程切換的成本。
注意,這只是為了簡(jiǎn)化理解。實(shí)際上,用戶線程庫(kù)在用戶線程的調(diào)度和同步中做了很多工作,這部分開(kāi)銷不可忽略。
如JVM在Thread#yield()上所解釋的:如果底層OS不支持yield的語(yǔ)義,則JVM允許用戶線程旋轉(zhuǎn)到時(shí)間片的末尾,并且該線程被動(dòng)切換以實(shí)現(xiàn)類似的效果。
是什么導(dǎo)致線程切換
時(shí)間片旋轉(zhuǎn)
線程阻塞
線程主動(dòng)放棄時(shí)間片
直接開(kāi)銷
直接開(kāi)銷是由線程切換本身引起的,這是不可避免的,并且不可避免地會(huì)發(fā)生。
在用戶模式和內(nèi)核模式之間切換
線程切換只能在內(nèi)核狀態(tài)下進(jìn)行。如果當(dāng)前用戶處于用戶狀態(tài),將不可避免地導(dǎo)致用戶狀態(tài)和內(nèi)核狀態(tài)之間的切換。 (<font color =“ red”>“在用戶模式和內(nèi)核模式之間切換”的費(fèi)用是多少?</ font>)
上下文切換
如前所述,線程(或進(jìn)程是任意的)信息需要使用task_struct保存。切換線程時(shí),必須從內(nèi)核中切出舊線程的task_struct,并切入新線程以進(jìn)行上下文切換。另外,您還需要切換寄存器,程序計(jì)數(shù)器,線程堆棧(包括操作堆棧,數(shù)據(jù)堆棧)等。
線程調(diào)度算法
線程調(diào)度算法需要管理線程的狀態(tài),等待條件等。如果調(diào)度基于優(yōu)先級(jí),則還需要維護(hù)優(yōu)先級(jí)隊(duì)列。如果線程頻繁切換,則不應(yīng)低估成本。
高架
間接開(kāi)銷是直接開(kāi)銷的副作用,并且取決于系統(tǒng)實(shí)現(xiàn)和用戶代碼實(shí)現(xiàn)。
快取未命中
要切換進(jìn)程,需要執(zhí)行新的邏輯。如果兩者訪問(wèn)的地址空間不相似,將導(dǎo)致高速緩存未命中,具體影響取決于系統(tǒng)實(shí)現(xiàn)和用戶代碼實(shí)現(xiàn)。如果系統(tǒng)高速緩存很大,則可以減少高速緩存未命中的影響;如果用于用戶線程訪問(wèn)數(shù)據(jù)的地址空間較小,則高速緩存未命中率本身相對(duì)較低。
在此共享了導(dǎo)致Linux中線程切換的操作,希望全網(wǎng)數(shù)據(jù)小編的分享能幫助到你,全網(wǎng)數(shù)據(jù)為廣大用戶提供專業(yè)化深圳服務(wù)器托管,深圳服務(wù)器租用,深圳主機(jī)托管,云服務(wù)器租用等服務(wù)器資源,詳情歡迎咨詢客服了解。