AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

面試官:說說延遲任務(wù)的時間輪調(diào)度算法?

來源: 責(zé)編: 時間:2024-06-05 17:42:22 164觀看
導(dǎo)讀本文繼續(xù)討論 Netty 相關(guān)的面試題,今天咱們來看一道 Netty 中的高頻面試題:說說 Netty 延遲任務(wù)的時間輪調(diào)度算法?Netty 框架是以性能著稱的框架,因此在它的框架中使用了大量提升性能的機制,例如 Netty 用于實現(xiàn)延遲隊列的

o5S28資訊網(wǎng)——每日最新資訊28at.com

本文繼續(xù)討論 Netty 相關(guān)的面試題,今天咱們來看一道 Netty 中的高頻面試題:說說 Netty 延遲任務(wù)的時間輪調(diào)度算法?o5S28資訊網(wǎng)——每日最新資訊28at.com

Netty 框架是以性能著稱的框架,因此在它的框架中使用了大量提升性能的機制,例如 Netty 用于實現(xiàn)延遲隊列的時間輪調(diào)度算法就是一個典型的例子。使用時間輪算法可以實現(xiàn)海量任務(wù)新增和取消任務(wù)的時間度為 O(1),那么什么是時間輪調(diào)度算法呢?接下來我們一起來看。o5S28資訊網(wǎng)——每日最新資訊28at.com

1.延遲任務(wù)實現(xiàn)

在 Netty 中,我們需要使用 HashedWheelTimer 類來實現(xiàn)延遲任務(wù),例如以下代碼:o5S28資訊網(wǎng)——每日最新資訊28at.com

public class DelayTaskExample {    public static void main(String[] args) {        System.out.println("程序啟動時間:" + LocalDateTime.now());        NettyTask();    }    private static void NettyTask() {        // 創(chuàng)建延遲任務(wù)實例        HashedWheelTimer timer = new HashedWheelTimer(3, // 間隔時間                TimeUnit.SECONDS, // 間隔時間單位                100); // 時間輪中的槽數(shù)        // 創(chuàng)建任務(wù)        TimerTask task = new TimerTask() {            @Override            public void run(Timeout timeout) throws Exception {                System.out.println("執(zhí)行任務(wù)時間:" + LocalDateTime.now());            }        };        // 將任務(wù)添加到延遲隊列中        timer.newTimeout(task, 0, TimeUnit.SECONDS);    }}

以上程序的執(zhí)行結(jié)果如下:o5S28資訊網(wǎng)——每日最新資訊28at.com

程序啟動時間:2024-06-04T10:16:23.033o5S28資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行任務(wù)時間:2024-06-04T10:16:26.118o5S28資訊網(wǎng)——每日最新資訊28at.com

從上述執(zhí)行結(jié)果可以看出,我們使用 HashedWheelTimer 實現(xiàn)了延遲任務(wù)的執(zhí)行。o5S28資訊網(wǎng)——每日最新資訊28at.com

2.時間輪調(diào)度算法

那么問題來了,HashedWheelTimer 是如何實現(xiàn)延遲任務(wù)的?什么是時間輪調(diào)度算法?o5S28資訊網(wǎng)——每日最新資訊28at.com

查看 HashedWheelTimer 類的源碼會發(fā)現(xiàn),其實它是底層是通過時間輪調(diào)度算法來實現(xiàn)的,以下是 HashedWheelTimer 核心實現(xiàn)源碼(HashedWheelTimer 的創(chuàng)建源碼)如下:o5S28資訊網(wǎng)——每日最新資訊28at.com

private static HashedWheelBucket[] createWheel(int ticksPerWheel) {    // 省略其他代碼    ticksPerWheel = normalizeTicksPerWheel(ticksPerWheel);    HashedWheelBucket[] wheel = new HashedWheelBucket[ticksPerWheel];    for (int i = 0; i < wheel.length; i ++) {        wheel[i] = new HashedWheelBucket();    }    return wheel;}private static int normalizeTicksPerWheel(int ticksPerWheel) {    int normalizedTicksPerWheel = 1;    while (normalizedTicksPerWheel < ticksPerWheel) {        normalizedTicksPerWheel <<= 1;    }    return normalizedTicksPerWheel;}private static final class HashedWheelBucket {    private HashedWheelTimeout head;    private HashedWheelTimeout tail;    // 省略其他代碼}

在 HashedWheelTimer  中,使用了 HashedWheelBucket 數(shù)組實現(xiàn)時間輪的概念,每個 HashedWheelBucket 表示時間輪中一個 slot(時間槽),HashedWheelBucket 內(nèi)部是一個雙向鏈表結(jié)構(gòu),雙向鏈表的每個節(jié)點持有一個 HashedWheelTimeout 對象,HashedWheelTimeout 代表一個定時任務(wù),每個 HashedWheelBucket 都包含雙向鏈表 head 和 tail 兩個 HashedWheelTimeout 節(jié)點,這樣就可以實現(xiàn)不同方向進行鏈表遍歷,如下圖所示:o5S28資訊網(wǎng)——每日最新資訊28at.com

o5S28資訊網(wǎng)——每日最新資訊28at.com

時間輪算法的設(shè)計思想就來源于鐘表,如上圖所示,時間輪可以理解為一種環(huán)形結(jié)構(gòu),像鐘表一樣被分為多個 slot 槽位。每個 slot 代表一個時間段,每個 slot 中可以存放多個任務(wù),使用的是鏈表結(jié)構(gòu)保存該時間段到期的所有任務(wù)。時間輪通過一個時針隨著時間一個個 slot 轉(zhuǎn)動,并執(zhí)行 slot 中的所有到期任務(wù)。o5S28資訊網(wǎng)——每日最新資訊28at.com

任務(wù)的添加是根據(jù)任務(wù)的到期時間進行取模,然后將任務(wù)分布到不同的 slot 中。如上圖所示,時間輪被劃分為 8 個 slot,每個 slot 代表 1s,當(dāng)前時針指向 2 時,假如現(xiàn)在需要調(diào)度一個 3s 后執(zhí)行的任務(wù),應(yīng)該加入 2+3=5 的 slot 中;如果需要調(diào)度一個 12s 以后的任務(wù),需要等待時針完整走完一圈 round 零 4 個 slot,需要放入第 (2+12)%8=6 個 slot。o5S28資訊網(wǎng)——每日最新資訊28at.com

那么當(dāng)時針走到第 6 個 slot 時,怎么區(qū)分每個任務(wù)是否需要立即執(zhí)行,還是需要等待下一圈 round,甚至更久時間之后執(zhí)行呢?所以我們需要把 round 信息保存在任務(wù)中。例如圖中第 6 個 slot 的鏈表中包含 3 個任務(wù),第一個任務(wù) round=0,需要立即執(zhí)行;第二個任務(wù) round=1,需要等待 1*8=8s 后執(zhí)行;第三個任務(wù) round=2,需要等待 2×8=8s 后執(zhí)行。所以當(dāng)時針轉(zhuǎn)動到對應(yīng) slot 時,只執(zhí)行 round=0 的任務(wù),slot 中其余任務(wù)的 round 應(yīng)當(dāng)減 1,等待下一個 round 之后執(zhí)行。o5S28資訊網(wǎng)——每日最新資訊28at.com

可以看出時間輪有點類似 HashMap,如果多個任務(wù)如果對應(yīng)同一個 slot,處理沖突的方法采用的是拉鏈法。在任務(wù)數(shù)量比較多的場景下,適當(dāng)增加時間輪的 slot 數(shù)量,可以減少時針轉(zhuǎn)動時遍歷的任務(wù)個數(shù)。o5S28資訊網(wǎng)——每日最新資訊28at.com

時間輪定時器最大的優(yōu)勢就是,任務(wù)的新增和取消都是 O(1) 時間復(fù)雜度,而且只需要一個線程就可以驅(qū)動時間輪進行工作。o5S28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-92120-0.html面試官:說說延遲任務(wù)的時間輪調(diào)度算法?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 利用Spring Boot和Elasticsearch進行人臉數(shù)據(jù)的高效檢索

下一篇: 微服務(wù)下認(rèn)證授權(quán)框架的探討

標(biāo)簽:
  • 熱門焦點
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經(jīng)正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發(fā)布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領(lǐng)先
  • CSS單標(biāo)簽實現(xiàn)轉(zhuǎn)轉(zhuǎn)logo

    轉(zhuǎn)轉(zhuǎn)品牌升級后更新了全新的Logo,今天我們用純CSS來實現(xiàn)轉(zhuǎn)轉(zhuǎn)的新Logo,為了有一定的挑戰(zhàn)性,這里我們只使用一個標(biāo)簽實現(xiàn),將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • 一文看懂為蘋果Vision Pro開發(fā)應(yīng)用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現(xiàn)實(MR)頭戴設(shè)備。Vision Pro結(jié)合了虛擬現(xiàn)實(VR)和增強現(xiàn)實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • JavaScript學(xué)習(xí) -AES加密算法

    引言在當(dāng)今數(shù)字化時代,前端應(yīng)用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經(jīng)常在前端進行加密和解密操作。然而,這樣的操作在網(wǎng)絡(luò)傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 自律,給不了Keep自由!

    來源 | 互聯(lián)網(wǎng)品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 認(rèn)真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經(jīng)無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關(guān)心的&ldquo;網(wǎng)紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內(nèi)直播,
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關(guān)于華為新旗艦的爆料日漸密集。據(jù)此前多方爆料,今年華為將開始恢復(fù)一年雙旗艦戰(zhàn)略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 機構(gòu)稱Q2國內(nèi)智能手機銷量同比下滑4% vivo份額重回第1

    7月29日消息,根據(jù)市場調(diào)查機構(gòu)Counterpoint Research公布的最新報告,2023年第2季度中國智能手機銷量同比下降4%,創(chuàng)新自2014年以來第2季度銷量新低。報
  • 三翼鳥智能家居亮相電博會,讓用戶體驗更真實

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現(xiàn)場,成為了展會的一大看點。這也是三翼鳥繼9月9日發(fā)布了行業(yè)首個一站式定制智慧家平臺后的
Top