chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探索虛擬線程:原理與實現(xiàn)

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-06-24 11:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

虛擬線程的引入與優(yōu)勢

在Loom項目之前,Java虛擬機(JVM)中的線程是通過java.lang.Thread類型來實現(xiàn)的,這些線程被稱為平臺線程。

然而,平臺線程的創(chuàng)建和維護在資源使用上存在顯著的開銷。首先,創(chuàng)建成本不菲,因為每當(dāng)操作系統(tǒng)需要創(chuàng)建一個新的平臺線程時,它必須分配大量的內(nèi)存(通常以兆字節(jié)計)來存儲線程的上下文信息、本機棧和Java調(diào)用棧。這一過程受到固定大小堆棧的限制,導(dǎo)致創(chuàng)建和調(diào)度平臺線程時的開銷在空間和時間上都相當(dāng)巨大。此外,當(dāng)調(diào)度器需要從當(dāng)前執(zhí)行的線程中搶占時,必須處理大量內(nèi)存的移動,這進一步增加了操作的復(fù)雜性和成本。這種開銷不僅限制了可以同時創(chuàng)建的線程數(shù)量,而且也容易導(dǎo)致內(nèi)存資源的耗盡。以下是一個示例,展示了在Java中如何通過不斷實例化新的平臺線程,迅速達到內(nèi)存耗盡的情況:

private static void stackOverflowErrorDemo() {
    try {
        int threadCount = 0;
        // 嘗試創(chuàng)建高達百萬級的線程數(shù)量
        while (threadCount++ < 100000000) {
            // 創(chuàng)建并啟動一個新線程
            Thread thread = new Thread(() -?> {
                try {
                    // 線程休眠1秒,模擬長時間運行的任務(wù)
                    Thread.sleep(Duration.ofSeconds(1));
                } catch (InterruptedException e) {
                    // 如果線程被中斷,將其轉(zhuǎn)換為運行時異常
                    throw new RuntimeException(e);
                }
            });
            // 啟動線程
            thread.start();
        }
    } catch (RuntimeException e) {
        // 捕獲并處理由線程啟動過程中可能拋出的運行時異常
        e.printStackTrace();
    }
}

在實際操作中,達到OutOfMemoryError的時間會根據(jù)操作系統(tǒng)和硬件的不同而有所差異。然而,通常情況下,這個過程可以在極短的時間內(nèi)完成。

為了解決這些問題,虛擬線程應(yīng)運而生。

虛擬線程的優(yōu)勢

資源效率:虛擬線程在內(nèi)存使用上更為高效,初始內(nèi)存占用通常只有幾百字節(jié),遠小于平臺線程所需的幾兆字節(jié)。

簡化線程管理:虛擬線程的創(chuàng)建和管理過程更為簡便,通過工廠方法可以輕松創(chuàng)建,無需手動管理線程資源。

避免線程爆炸:由于資源消耗低,虛擬線程可以處理大量并發(fā)任務(wù),而不必?fù)?dān)心資源耗盡。

協(xié)作調(diào)度:虛擬線程采用協(xié)作調(diào)度模型,減少了鎖競爭和上下文切換的開銷,提升了多線程程序的性能。

避免阻塞:虛擬線程在遇到阻塞操作時可以釋放執(zhí)行權(quán),允許其他線程執(zhí)行,提高了程序的響應(yīng)性。

虛擬線程如何創(chuàng)建

創(chuàng)建虛擬線程是Java中的一項新特性,它旨在解決傳統(tǒng)平臺線程所面臨的資源限制問題。虛擬線程作為java.lang.Thread的一個替代實現(xiàn),其獨特之處在于將線程的調(diào)用堆棧存儲在Java堆內(nèi)存中,而不是傳統(tǒng)的本地線程堆棧中。這種方式顯著減少了每個線程所需的初始內(nèi)存占用,通常僅為幾百字節(jié),而不是幾兆字節(jié)。更進一步,虛擬線程的堆棧大小是動態(tài)可變的,這使得我們無需為各種用例預(yù)分配大量內(nèi)存。以下是創(chuàng)建虛擬線程的兩種方法:

使用工廠方法創(chuàng)建虛擬線程

通過java.lang.Thread的ofVirtual靜態(tài)工廠方法,我們可以輕松創(chuàng)建虛擬線程。首先,定義一個輔助函數(shù)來創(chuàng)建并啟動一個帶有指定名稱的虛擬線程:

private static Thread createVirtualThread(String name, Runnable runnable) {
    return Thread.ofVirtual()
            .name(name)
            .start(runnable);
}

使用ThreadPerTaskExecutor創(chuàng)建虛擬線程

另一種方法是使用專為虛擬線程設(shè)計的java.util.concurrent.ExecutorService實現(xiàn),即ThreadPerTaskExecutor。這個執(zhí)行器為提交的每個任務(wù)創(chuàng)建一個新的虛擬線程:

@SneakyThrows
static void createVirtualThreadUsingExecutorsWithName() {
  final ThreadFactory factory = Thread.ofVirtual().name("worker-", 0).factory();
  try (var executor = Executors.newThreadPerTaskExecutor(factory)) {
    var cleanTime =
      executor.submit(
        () -> {
          log.info("我要打掃衛(wèi)生");
          sleep(Duration.ofMillis(500L));
          log.info("衛(wèi)生打掃完了");
         });
    var boilingWater =
      executor.submit(
        () -> {
          log.info("我要去燒一些水");
          sleep(Duration.ofSeconds(1L));
          log.info("水燒好了");
        });
    cleanTime.get();
    boilingWater.get();
  }
}

在這個示例中,我們使用了submit方法來啟動虛擬線程,它需要一個Runnable或Callable任務(wù)。submit方法返回一個Future對象,該對象可以用來跟蹤和控制虛擬線程的執(zhí)行。

虛擬線程的啟動和同步

與平臺線程相比,虛擬線程的啟動和同步方式略有不同,因為它們是通過ExecutorService來管理的。每個submit調(diào)用都返回一個Future對象,這允許我們跟蹤任務(wù)的狀態(tài),甚至在必要時阻塞當(dāng)前線程直到虛擬線程完成其任務(wù)。

虛擬線程的原理

wKgaomZ46XiAVMJUAAM2pHHfAVk296.png

??

如上圖所示展示虛擬線程與平臺線程之間的關(guān)系:

JVM維護了一個由專用ForkJoinPool創(chuàng)建和維護的平臺線程池。最初,平臺線程的數(shù)量等于CPU核心的數(shù)量,最多不能超過256個。

對于每個創(chuàng)建的虛擬線程,JVM都會將其執(zhí)行調(diào)度到一個平臺線程上,臨時將虛擬線程的堆棧塊從堆復(fù)制到平臺線程的堆棧中。我們說平臺線程變成了虛擬線程的載體線程。

我們可以通過運行使用ThreadPerTaskExecutor創(chuàng)建虛擬線程的用例,觀察其中的一條日志來說明執(zhí)行過程:

10:30:35.390 [worker-1] INFO in.rcard.virtual.threads.App - VirtualThread[#23,worker-1]/runnable@ForkJoinPool-1-worker-2 | 我要去燒一些水

從日志中進行觀察

1. 線程標(biāo)識與命名:每個虛擬線程都有一個唯一的標(biāo)識符和名稱,例如 `VirtualThread[#23,worker-1]`。這里的 `#23` 表示線程的編號,而 `worker-1` 是線程的名稱,它們共同幫助開發(fā)者識別和調(diào)試線程。

2. 載體線程的分配:虛擬線程執(zhí)行時,會綁定到一個特定的載體線程(即平臺線程)。例如,`ForkJoinPool-1-worker-2` 表示該虛擬線程正在由默認(rèn)的ForkJoinPool中的第二個工作線程執(zhí)行。

3. 阻塞與釋放:當(dāng)虛擬線程遇到阻塞操作時,其載體線程會被釋放,以便能夠執(zhí)行其他就緒的虛擬線程。同時,虛擬線程的堆棧塊會從載體線程的堆棧復(fù)制回Java堆中,以等待阻塞操作的完成。

4. 再次調(diào)度:一旦虛擬線程完成其阻塞操作,調(diào)度器會將其重新排入執(zhí)行隊列。虛擬線程可能會繼續(xù)在先前的載體線程上執(zhí)行,或者根據(jù)調(diào)度器的決策,在不同的載體線程上繼續(xù)執(zhí)行。

剛才我們提到,默認(rèn)情況下,JVM會創(chuàng)建與cpu核心數(shù)量相等的載體線程(平臺線程),以確保每個物理核心都能被有效利用。那么假如計算機上配備了2個物理核心和通過超線程技術(shù)支持的4個邏輯核心,基于此硬件配置,我們可以設(shè)計一個程序,該程序旨在生成與邏輯核心數(shù)相匹配的虛擬線程數(shù)量,即4個虛擬線程。然而,為了探索線程調(diào)度的靈活性,我們可以增加一個額外的虛擬線程,使得總數(shù)達到5個,即期望5個虛擬線程在4個載體線程上執(zhí)行,那么至少會有一個載體線程會被重復(fù)使用。執(zhí)行以下程序

static void viewCarrierThreadPoolSize() {
  final ThreadFactory factory = Thread.ofVirtual().name("worker-", 0).factory();
  try (var executor = Executors.newThreadPerTaskExecutor(factory)) {
    IntStream.range(0, numberOfCores() + 1)
        .forEach(i -> executor.submit(() -> {
          log.info("virtual thread number " + i);
          sleep(Duration.ofSeconds(1L));
        }));
  }
}
[worker-0] INFO in.rcard.virtual.threads.App - VirtualThread[#21,worker-0]/runnable@ForkJoinPool-1-worker-1 | virtual thread number 0
[worker-1] INFO in.rcard.virtual.threads.App - VirtualThread[#23,worker-1]/runnable@ForkJoinPool-1-worker-2 | virtual thread number 1
[worker-2] INFO in.rcard.virtual.threads.App - VirtualThread[#24,worker-2]/runnable@ForkJoinPool-1-worker-3 | virtual thread number 2
[worker-4] INFO in.rcard.virtual.threads.App - VirtualThread[#26,worker-4]/runnable@ForkJoinPool-1-worker-4 | virtual thread number 4
[worker-3] INFO in.rcard.virtual.threads.App - VirtualThread[#25,worker-3]/runnable@ForkJoinPool-1-worker-4 | virtual thread number 3

觀察日志,有四個載體線程,分別是ForkJoinPool-1-worker-1、ForkJoinPool-1-worker-2、ForkJoinPool-1-worker-3和ForkJoinPool-1-worker-4,F(xiàn)orkJoinPool-1-worker-4被重復(fù)使用了兩次,以上假設(shè)正確。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲
    +關(guān)注

    關(guān)注

    13

    文章

    4791

    瀏覽量

    90066
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7402

    瀏覽量

    129323
  • 虛擬
    +關(guān)注

    關(guān)注

    0

    文章

    199

    瀏覽量

    24279
  • 虛擬機
    +關(guān)注

    關(guān)注

    1

    文章

    972

    瀏覽量

    30482
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    509

    瀏覽量

    20829
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    摩爾線程正式開源TileLang-MUSA項目

    近日,摩爾線程正式開源TileLang-MUSA項目,實現(xiàn)對TileLang編程語言的完整支持。該項目已成功在摩爾線程多代全功能GPU上完成功能驗證與特性開發(fā),旨在通過高層抽象與編譯器優(yōu)化,大幅降低開發(fā)門檻,為國產(chǎn)算力平臺提供更
    的頭像 發(fā)表于 02-11 16:57 ?1261次閱讀

    小馬智行與摩爾線程達成戰(zhàn)略合作

    2月6日,小馬智行與國產(chǎn)全功能GPU領(lǐng)軍企業(yè)摩爾線程正式宣布達成戰(zhàn)略合作。雙方將聚焦L4級自動駕駛技術(shù)落地與規(guī)?;瘧?yīng)用,圍繞小馬智行的技術(shù)核心——世界模型及虛擬司機系統(tǒng)的訓(xùn)練與優(yōu)化展開深度協(xié)同,以安全可靠的AI算力,賦能自動駕駛技術(shù)迭代和商業(yè)落地。
    的頭像 發(fā)表于 02-06 09:23 ?3620次閱讀

    【瑞薩FPB-RA6E2試用】【瑞薩FPB-RA6E2】RTOS(Real-Time Operating System,實時操作系統(tǒng))《線程》個人理解及項目實現(xiàn)

    【瑞薩FPB-RA6E2】RTOS(Real-Time Operating System,實時操作系統(tǒng))《線程》個人理解及項目實現(xiàn) 1. RTOS(Real-Time Operating
    發(fā)表于 01-14 11:50

    解析Linux的進程、線程和協(xié)程

    允許在單個線程內(nèi)實現(xiàn)多個協(xié)程的并發(fā)執(zhí)行。協(xié)程在執(zhí)行過程中可以主動掛起和恢復(fù),這使得編寫高效的異步代碼變得更加容易。協(xié)程通常用于處理I/O密集型任務(wù),能夠提高程序的響應(yīng)性能。 協(xié)程的特點包括: (1
    發(fā)表于 12-22 11:00

    線程的系統(tǒng)

    線程系統(tǒng)的事件響應(yīng)也是在中斷中完成的,但事件的處理是在線程中完成的。在多線程系統(tǒng)中,線程跟中斷一樣,也具有優(yōu)先級,優(yōu)先級高的線程會被優(yōu)先執(zhí)
    發(fā)表于 12-08 07:55

    Linux多線程對比單線程的優(yōu)勢

    ,而單線程則需要通過進程間通信來實現(xiàn)?!干舷挛那袚Q開銷小」:線程的上下文切換比進程小,因為它們共享相同的地址空間。「提高響應(yīng)性」:多線程可以使程序更加響應(yīng)用戶輸入或其他事件,避免阻塞。
    發(fā)表于 12-01 06:11

    摩爾線程新一代大語言模型對齊框架URPO入選AAAI 2026

    近日,摩爾線程在人工智能前沿領(lǐng)域取得重要突破,其提出的新一代大語言模型對齊框架——URPO統(tǒng)一獎勵與策略優(yōu)化,相關(guān)研究論文已被人工智能領(lǐng)域的國際頂級學(xué)術(shù)會議AAAI 2026收錄。這一成果標(biāo)志著摩爾線程在大模型基礎(chǔ)技術(shù)探索上邁出
    的頭像 發(fā)表于 11-17 16:03 ?498次閱讀
    摩爾<b class='flag-5'>線程</b>新一代大語言模型對齊框架URPO入選AAAI 2026

    車載軟件vECU虛擬化測試解決方案

    虛擬化測試:利用虛擬化技術(shù),實現(xiàn)將真實域控制器轉(zhuǎn)化為虛擬域控制器,運行在PC或服務(wù)器環(huán)境中運行,從而實現(xiàn)在不依賴真實硬件的情況下完成對應(yīng)測試
    的頭像 發(fā)表于 10-30 09:34 ?1700次閱讀
    車載軟件vECU<b class='flag-5'>虛擬</b>化測試解決方案

    UVC+MSC實現(xiàn)中MSC線程未運行的原因?

    我正在嘗試使用 EZUSB 運行 UVC + MSC。我有以下內(nèi)容。但看起來只有 UVC 線程在運行,而 MSC 沒有運行。fw 不響應(yīng) MSC 命令。我確保 LPM 已被禁用,只是為了檢查傳感器
    發(fā)表于 07-16 07:08

    線程的安全注意事項

    線程安全是指多個線程同時訪問或修改共享資源時,能夠保證程序的正確性和可靠性。 開發(fā)者選擇TaskPool或Worker進行多線程開發(fā)時,在TaskPool和Worker的工作線程中導(dǎo)
    發(fā)表于 06-20 07:49

    鴻蒙5開發(fā)寶藏案例分享---跨線程性能優(yōu)化指南

    , bookList); // 卡在主線程序列化! 改造后 (<8ms): // 關(guān)鍵:實現(xiàn)Sendable接口! class Book implements Sendable
    發(fā)表于 06-12 17:13

    摩爾線程GPU成功適配Deepseek-V3-0324大模型

    架構(gòu)和全功能GPU的強大技術(shù)實力,摩爾線程迅速響應(yīng)并完成了對DeepSeek-V3的無縫升級,實現(xiàn)了零報錯、零兼容性問題的光速部署,充分展現(xiàn)了摩爾線程在AI大模型領(lǐng)域的領(lǐng)先優(yōu)勢。
    的頭像 發(fā)表于 03-31 11:34 ?1282次閱讀
    摩爾<b class='flag-5'>線程</b>GPU成功適配Deepseek-V3-0324大模型

    進程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    /file0 線程1 下載開始 http://example.com/file1 ...(并行執(zhí)行) 所有下載完成! 第三章:協(xié)程——程序界的「時間管理大師」 定義:用戶態(tài)的「虛擬線程」,靠主動讓
    發(fā)表于 03-26 09:27

    摩爾線程發(fā)布云電腦驅(qū)動MT vGPU 2.7.0

    3月18日,摩爾線程正式發(fā)布云電腦驅(qū)動MT vGPU 2.7.0。新版本在國內(nèi)首次實現(xiàn)了國產(chǎn)GPU云電腦對DirectX 12的支持,同時顯著提升圖形渲染性能與兼容性。通過全功能GPU四大引擎的深度協(xié)同,摩爾線程為云電腦解決方案
    的頭像 發(fā)表于 03-19 15:56 ?1091次閱讀

    請問如何在Python中實現(xiàn)線程與多進程的協(xié)作?

    大家好!我最近在開發(fā)一個Python項目時,需要同時處理多個任務(wù),且每個任務(wù)需要不同的計算資源。我想通過多線程和多進程的組合來實現(xiàn)并發(fā),但遇到了一些問題。 具體來說,我有兩個任務(wù),一個是I/O密集型
    發(fā)表于 03-11 06:57