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