簡體   English   中英

JVM線程管理與OS調度

[英]JVM thread management v.s. OS scheduling

據我所知,最常見的JVM並發API之一:期貨-至少在scala中實現-依靠用戶代碼在線程可能等待空閑時放棄線程。 在Scala中,通常將其稱為“避免阻塞”,開發人員必須在有意義的任何地方實施它。 不太有效。

JVM是否具有完全內在的功能,可以防止JVM將線程的上下文切換到新任務(當線程空閑時)(由操作系統進程調度程序實現)?

JVM是否具有完全內在的功能,可以防止JVM將線程的上下文切換到新任務(當線程空閑時)(由操作系統進程調度程序實現)?

大多數情況下,這種切換必須合作完成。 每個單一的阻塞方法都必須以某種方式包裝或重新實現,以使該任務一旦完成就可以恢復。畢竟,不再有本機線程等待阻塞操作的完成。

盡管原則上可以針對JVM內部阻止方法完成此操作,但考慮通過JNI執行的任意本機代碼,JVM不會知道如何對這些本機線程進行堆棧切換,但是它們畢竟卡在了本機代碼中。

您可能想看一下類星體 ,據我了解, 類星體為某些JDK內部方法實現了此類包裝程序或等效類,例如sleeppark / unpark ,基於channel的IO以及一堆其他允許它們使用光纖的方法(因此在這些光纖上運行的期貨)可以在等待完成時准確執行這種用戶模式上下文切換。

編輯:僅JNI便已足以將用戶模式任務切換限制為機會優化,當本機代碼阻塞線程時,可能必須回落到旋轉其他本機線程。

但這不是唯一的問題,例如在linux上,真正的異步文件IO操作需要文件系統和內核支持(請參閱AIO上的SO問題 ),但並非所有人都提供。 如果沒有提供,則必須使用其他阻塞的IO線程進行仿真,從而重新引入了我們首先要避免的所有開銷。 最好只是阻塞線程池本身並增加其他線程,至少我們將避免這種方式的線程間通信。

內存映射文件還可能阻塞線程,並由於頁面錯誤而迫使OS調度程序掛起線程,我不知道與虛擬內存系統合作避免這種情況的方法。

更不用說VM上的所有阻塞調用都必須使用OS提供的異步等效項來重新實現。 甚至錯過一個,您的線程就會被阻塞。 如果線程被阻塞,則線程池將需要自動增長功能,我們將回到正題。

最后但並非最不重要的一點是,在某些情況下可能需要阻塞每個文件描述符一個線程IO。 確保用戶模式切換所需的普遍更改可能會破壞這些更改。

因此總而言之, 有時可以進行用戶模式切換。 但是JVM不能對此做出硬性保證,因此無論如何它都必須實現所有本機線程處理,並且程序員將在考慮到線程池執行這些未來的假設的前提下至少在某種程度上具有協作性。 有些情況可以消除,但並非全部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM