色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

一文讀懂定時(shí)器實(shí)現(xiàn)技術(shù)

jf_78858299 ? 來源:架構(gòu)之美 ? 作者: 孫玄 架構(gòu)之美 ? 2023-04-21 14:36 ? 次閱讀

1. 定時(shí)器介紹

程序里的定時(shí)器主要實(shí)現(xiàn)的功能是在未來的某個(gè)時(shí)間點(diǎn)執(zhí)行相應(yīng)的邏輯。在定時(shí)器模型中,一般有如下幾個(gè)定義。

interval:間隔時(shí)間,即定時(shí)器需要在interval時(shí)間后執(zhí)行

StartTimer:添加一個(gè)定時(shí)器任務(wù)

StopTimer:結(jié)束一個(gè)定時(shí)器任務(wù)

PerTickBookkeeping: 檢查定時(shí)器系統(tǒng)中,是否有定時(shí)器實(shí)例已經(jīng)到期,相當(dāng)于定義了最小時(shí)間粒度。

常見的實(shí)現(xiàn)方法有如下幾種:

鏈表

排序鏈表

最小堆

時(shí)間輪

接下來我們一起看下這些方法的具體實(shí)現(xiàn)原理。

2. 定時(shí)器實(shí)現(xiàn)方法

2.1 鏈表實(shí)現(xiàn)

鏈表的實(shí)現(xiàn)方法比較粗糙。鏈表用于存儲所有的定時(shí)器,每個(gè)定時(shí)器都含有interval 和 elapse 兩個(gè)時(shí)間參數(shù),elapse表示當(dāng)前被tickTimer了多少次。當(dāng)elapse 和interval相等時(shí),表示定時(shí)器到期。

在此方案中,添加定時(shí)器就是在鏈表的末尾新增一個(gè)節(jié)點(diǎn),時(shí)間復(fù)雜度是 O(1)。

如果想要刪除一個(gè)定時(shí)器的話,我們需要遍歷鏈表找到對應(yīng)的定時(shí)器,時(shí)間復(fù)雜度是O(n)。

此方案下,每隔elapse時(shí)間,系統(tǒng)調(diào)用信號進(jìn)行超時(shí)檢查,即PerTickBookkeeping。每次PerTickBookkeeping需要對鏈表所有定時(shí)器進(jìn)行 elapse++,因此可以看出PerTickBookkeeping的時(shí)間復(fù)雜度是O(N)。

可以看出此方案過于粗暴,所以使用場景極少。

2.2 排序雙向鏈表實(shí)現(xiàn)

排序雙向鏈表是在鏈表實(shí)現(xiàn)上的優(yōu)化。優(yōu)化思路是降低時(shí)間復(fù)雜度。

首先,每次PerTickBookkeeping需要自增所有定時(shí)器的elapse變量,如果我們將interval變?yōu)榻^對時(shí)間,那么我們只需要比較當(dāng)前時(shí)間和interval時(shí)間是否相等,減少了對每個(gè)定時(shí)器的操作。

如果不需要對每個(gè)定時(shí)器進(jìn)行操作,我們將定時(shí)器進(jìn)行排序,那么每次PerTickBookkeeping都只需要判斷第一個(gè)定時(shí)器,時(shí)間復(fù)雜度為O(1)。

相應(yīng)的,為了維持鏈表順序,每次新增定時(shí)器需要進(jìn)行鏈表排序時(shí)間復(fù)雜度為 O(N)。

每次刪除定時(shí)器時(shí),由于會持有自己節(jié)點(diǎn)的引用,所以不需要查找其在鏈表中所在的位置,所以時(shí)間復(fù)雜度為O(1),雙向鏈表的好處。

圖片

圖1 雙向鏈表實(shí)現(xiàn)示意圖

2.3 時(shí)間輪實(shí)現(xiàn)

時(shí)間輪的數(shù)據(jù)結(jié)構(gòu)是數(shù)組 + 鏈表。

他的時(shí)間輪為數(shù)組,新增和刪除一個(gè)任務(wù),時(shí)間復(fù)雜度都是O(1)。

PerTickBookkeeping每次轉(zhuǎn)動一格,時(shí)間復(fù)雜度也是O(1)。

2.4 最小堆實(shí)現(xiàn)

最小堆是堆的一種, (堆是一種二叉樹), 指的是堆中任何一個(gè)父節(jié)點(diǎn)都小于子節(jié)點(diǎn), 子節(jié)點(diǎn)順序不作要求。

二叉排序樹(BST)指的是: 左子樹節(jié)點(diǎn)小于父節(jié)點(diǎn), 右子樹節(jié)點(diǎn)大于父節(jié)點(diǎn), 對所有節(jié)點(diǎn)適用

圖片

圖3 最小堆

樹的基本操作是插入節(jié)點(diǎn)和刪除節(jié)點(diǎn)。對最小堆而言,為了將一個(gè)元素X插入最小堆,我們可以在樹的下一個(gè)空閑位置創(chuàng)建一個(gè)空穴。如果X可以放在空穴中而不被破壞堆的序,則插入完成。否則就執(zhí)行上濾操作,即交換空穴和它的父節(jié)點(diǎn)上的元素。不斷執(zhí)行上述過程,直到X可以被放入空穴,則插入操作完成。

因此我們可以知道最小堆的插入時(shí)間復(fù)雜度是O(lgN)。

最小堆的刪除和插入邏輯基本類似,如果不做優(yōu)化,時(shí)間復(fù)雜度也是O(lgN),但是實(shí)際實(shí)現(xiàn)方案上,做了延遲刪除操作,時(shí)間復(fù)雜度為O(1)。

延遲刪除即設(shè)置定時(shí)器的執(zhí)行回調(diào)函數(shù)為空,每次最小堆超時(shí),將觸發(fā)pop_heap,pop會重新調(diào)整最小堆,最終刪除的定時(shí)器將調(diào)整到堆頂,但是回調(diào)函數(shù)不處理。

可以看到PerTickBookkeeping只處理堆頂定時(shí)器,時(shí)間復(fù)雜度O(1)。

最小堆可以使用數(shù)組來進(jìn)行表示,數(shù)組中,當(dāng)前下標(biāo)n的左子節(jié)點(diǎn)為2N + 1,當(dāng)前下標(biāo)n的右子節(jié)點(diǎn)小標(biāo)為2N + 2。

圖片

圖4 最小堆的數(shù)組表示

3. 定時(shí)器不同實(shí)現(xiàn)對比

3.1 時(shí)間復(fù)雜度對比

圖片

圖5 不同實(shí)現(xiàn)時(shí)間復(fù)雜度

從上面的介紹來看,時(shí)間輪的時(shí)間復(fù)雜度最小、性能最好。

3.2 使用場景來看

在任務(wù)量小的場景下:最小堆實(shí)現(xiàn),可以根據(jù)堆頂設(shè)置超時(shí)時(shí)間,數(shù)組存儲結(jié)構(gòu),節(jié)省內(nèi)存消耗,使用最小堆可以得到比較好的效果。而時(shí)間輪定時(shí)器,由于需要維護(hù)一個(gè)線程用來撥動指針,且需要開辟一個(gè)bucket數(shù)組,消耗內(nèi)存大,使用時(shí)間輪會較為浪費(fèi)資源。

在任務(wù)量大的場景下:最小堆的插入復(fù)雜度是O(lgN), 相比時(shí)間輪O(1) 會造成性能下降。更適合使用時(shí)間輪實(shí)現(xiàn)。

在業(yè)界,服務(wù)治理的心跳檢測等功能需要維護(hù)大量的鏈接心跳,因此時(shí)間輪是首選。

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

    關(guān)注

    23

    文章

    3255

    瀏覽量

    115177
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3795

    瀏覽量

    81296
收藏 人收藏

    評論

    相關(guān)推薦

    555定時(shí)器

    555定時(shí)器555定時(shí)器555定時(shí)器555定時(shí)器555定時(shí)器555定時(shí)器555
    發(fā)表于 11-10 17:25 ?52次下載

    基于STM32定時(shí)器實(shí)現(xiàn)毫秒延時(shí)函數(shù)

    STM32定時(shí)器包含基本定時(shí)器、通用定時(shí)器和高級定時(shí)器,其中TIM6和TIM7是STM32當(dāng)中的基本定時(shí)器,作為初學(xué)者,先從最基本的學(xué)起最容
    發(fā)表于 10-12 15:54 ?2.5w次閱讀
    基于STM32<b class='flag-5'>定時(shí)器</b><b class='flag-5'>實(shí)現(xiàn)</b>毫秒延時(shí)函數(shù)

    定時(shí)器原理以及定時(shí)器實(shí)現(xiàn)的方式

    定時(shí)器原理定時(shí)器實(shí)現(xiàn)的方式有以下幾種: 基于排序鏈表方式: 通過排序鏈表來保存定時(shí)器,由于鏈表是排序好的,所以獲取最小(最早到期)的
    的頭像 發(fā)表于 08-14 11:15 ?6856次閱讀

    STM32基于cubeMX實(shí)現(xiàn)定時(shí)器點(diǎn)燈

    概述STM32的常見的定時(shí)器資源: 系統(tǒng)嘀嗒定時(shí)器SysTick、看門狗定時(shí)器WatchDog、實(shí)時(shí)時(shí)鐘RTC、基本定時(shí)器、通用定時(shí)器、高級
    發(fā)表于 11-23 18:21 ?19次下載
    STM32基于cubeMX<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>定時(shí)器</b>點(diǎn)燈

    STM32定時(shí)器-基本定時(shí)器

    ,分為基本定時(shí)器,通用定時(shí)器和高級定時(shí)器?;?b class='flag-5'>定時(shí)器 TIM6 和 TIM7 是個(gè) 16 位的只能向上計(jì)數(shù)的
    發(fā)表于 11-23 18:21 ?31次下載
    STM32<b class='flag-5'>定時(shí)器</b>-基本<b class='flag-5'>定時(shí)器</b>

    STM32——高級定時(shí)器、通用定時(shí)器、基本定時(shí)器的區(qū)別

    STM32——高級定時(shí)器、通用定時(shí)器、基本定時(shí)器的區(qū)別
    發(fā)表于 11-26 15:21 ?110次下載
    STM32——高級<b class='flag-5'>定時(shí)器</b>、通用<b class='flag-5'>定時(shí)器</b>、基本<b class='flag-5'>定時(shí)器</b>的區(qū)別

    SysTick 定時(shí)器

    11.1關(guān)于 SysTick 定時(shí)器SysTick定時(shí)器(又名系統(tǒng)滴答定時(shí)器)是存在于Cortex-M3的個(gè)定時(shí)器,只要是ARM Cote
    發(fā)表于 12-05 14:51 ?9次下載
    SysTick <b class='flag-5'>定時(shí)器</b>

    labview定時(shí)器實(shí)現(xiàn)實(shí)例分享

    labview定時(shí)器實(shí)現(xiàn)實(shí)例分享
    發(fā)表于 01-11 09:35 ?26次下載

    使用555定時(shí)器實(shí)現(xiàn)延時(shí)關(guān)燈

    使用555定時(shí)器實(shí)現(xiàn)延時(shí)關(guān)燈
    發(fā)表于 11-21 14:54 ?11次下載

    定時(shí)器作用及實(shí)現(xiàn)定時(shí)器數(shù)據(jù)結(jié)構(gòu)選取介紹1

    定時(shí)器在各種場景都需要用到,比如游戲的Buff實(shí)現(xiàn),Redis中的過期任務(wù),Linux中的定時(shí)任務(wù)等等。顧名思義,定時(shí)器的主要用途是執(zhí)行定時(shí)
    的頭像 發(fā)表于 04-21 15:20 ?1246次閱讀
    <b class='flag-5'>定時(shí)器</b>作用及<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>定時(shí)器</b>數(shù)據(jù)結(jié)構(gòu)選取介紹1

    定時(shí)器作用及實(shí)現(xiàn)定時(shí)器數(shù)據(jù)結(jié)構(gòu)選取介紹2

    定時(shí)器在各種場景都需要用到,比如游戲的Buff實(shí)現(xiàn),Redis中的過期任務(wù),Linux中的定時(shí)任務(wù)等等。顧名思義,定時(shí)器的主要用途是執(zhí)行定時(shí)
    的頭像 發(fā)表于 04-21 15:20 ?1227次閱讀
    <b class='flag-5'>定時(shí)器</b>作用及<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>定時(shí)器</b>數(shù)據(jù)結(jié)構(gòu)選取介紹2

    什么是軟件定時(shí)器?軟件定時(shí)器實(shí)現(xiàn)原理

    軟件定時(shí)器是用程序模擬出來的定時(shí)器,可以由個(gè)硬件定時(shí)器模擬出成千上萬個(gè)軟件定時(shí)器,這樣程序在需要使用較多
    的頭像 發(fā)表于 05-23 17:05 ?2892次閱讀

    STM32如何使用定時(shí)器實(shí)現(xiàn)微秒(us)級延時(shí)?

    如何使用定時(shí)器實(shí)現(xiàn)微秒級延時(shí)的步驟: 步驟 1:配置定時(shí)器 首先,需要選擇個(gè)適合的定時(shí)器。大多數(shù)STM32微控制
    的頭像 發(fā)表于 11-06 11:05 ?6549次閱讀

    定時(shí)器設(shè)計(jì)實(shí)現(xiàn)

    返回ITimer類型的共享指針。其中ITimer類中定義了start和stop方法,用于啟動或停止當(dāng)前定時(shí)器。 TimerManager還有個(gè)內(nèi)部類TimerMessageQueue用于實(shí)現(xiàn)
    的頭像 發(fā)表于 11-08 16:50 ?647次閱讀

    如何實(shí)現(xiàn)個(gè)軟件定時(shí)器?

    在Linux,uC/OS,F(xiàn)reeRTOS等操作系統(tǒng)中,都帶有軟件定時(shí)器,原理大同小異。典型的實(shí)現(xiàn)方法是:通過個(gè)硬件定時(shí)器產(chǎn)生固定的時(shí)鐘節(jié)拍,每次硬件
    的頭像 發(fā)表于 04-29 11:00 ?727次閱讀
    主站蜘蛛池模板: 国产精品AV色欲蜜臀在线 | 欧美精品亚洲精品日韩专区一 | 强奷乱码中文字幕熟女免费 | 精品国产品国语在线不卡丶 | 亚洲三级在线中文字幕 | 亚洲卫视论坛 | 亚洲国产欧美国产综合在线 | 亚洲精品AV一二三区无码 | 久久伊人免费 | 久久99国产亚洲高清观着 | 日本xxxxx按摩19| 驯服有夫之妇HD中字日本 | 国产精品高潮呻吟AV久久96 | 亚洲视频在线观看视频 | 国产高清超清在线播放 | 免费看a毛片 | 99热这里只有的精品 | 黄色三级网站在线观看 | 2019久久视频这里有精品15 | 荡公乱妇HD中文字幕 | 亚洲免费国产 | 艳鉧动漫片1~6全集在线 | 三级网站视频在线观看 | 亚洲 日韩 在线 国产 视频 | 野花社区视频WWW高清 | 久久中文字幕综合不卡一二区 | 99久久精品国产高清一区二区 | 国产人妻XXXX精品HD电影 | 精精国产www视频在线观看免费 | 99精品影视 | 台湾果冻传媒在线观看 | 在线 | 果冻国产传媒61国产免费 | 短篇合集纯肉高H深陷骚 | 国产成人精品视频频 | 无码一区国产欧美在线资源 | 国内精品久久人妻无码HD浪潮 | 国产精品久久久久久人妻精品蜜桃 | 最近的2019中文字幕国语版 | 欧美成人无码A区在线观看免费 | 国内精品九九视频 | 久久伊人男人的天堂网站 |