定時器 tick 時間輪定時器學習筆記

2021-10-14 19:42:10 字數 2007 閱讀 5749

參考自時間輪的原理和手錶的指標計時類似,將任務結束的時間加入對應最高端的時間輪轉盤中。例如任務結束時間為4:30:20,時間輪盤有三個,分別對應,小時,分鐘和秒。開始時將任務加入4小時所在的時間輪中。四小時過去後,任務的剩餘時間時間為0:30:20就將任務加入30分所在的時間輪中。30分鐘過去後,將任務降入存入20秒對應的輪盤中,直到到達第乙個輪盤中到時刪除任務。

樣例使用了五個輪盤,第乙個輪盤有2^8(256)個槽位,後面4個分別有2^6(64)個槽位。

// 第1個輪佔的位數

#define tvr_bits 8

// 第1個輪的長度

#define tvr_size (1 << tvr_bits)

// 第n個輪佔的位數

#define tvn_bits 6

// 第n個輪的長度

#define tvn_size (1 << tvn_bits)

// 掩碼:取模或整除用

#define tvr_mask (tvr_size - 1)

#define tvn_mask (tvn_size - 1)

取某乙個圈的當前指標位置是:

// 第1個圈的當前指標位置

#define first_index(v) ((v) & tvr_mask) //= v & 0...011111111

// 後面第n個圈的當前指標位置

#define nth_index(v, n) (((v) >> (tvr_bits + (n) * tvn_bits)) & tvn_mask) //=先將v右移

//(tvr_bits + (n) * tvn_bits)再&tvn_bits

定時器節點(使用雙向鍊錶)

typedef struct timernode  timernode_t;
時間輪定時器

typedef struct timerwheel  timerwheel_t;
將定時器節點加入時間輪中

static void _timerwheel_add(timerwheel_t *tw, timernode_t *node)  else }}

clinklist_add_back(head, (clinknode_t*)node);

}

將定時器節點加入時間輪中

void timerwheel_add(timerwheel_t *tw, timernode_t *node, uint32_t ticks)
時間輪轉動乙個tick

void _timerwheel_tick(timerwheel_t *tw)  while (idx == 0 && ++i < 4);

}clinknode_t head;

clinklist_init(&head);

clinklist_splice(tw->tvroot.vec + index, &head);

while (!clinklist_is_empty(&head)) }}

時間輪使用現在的時間轉動

void timerwheel_update(timerwheel_t *tw, uint64_t currtime) 

tw->remainder = diff; //轉完多少個tick後剩下的時間毫秒}}

另外:刪除時間輪任務(雙向鍊錶刪除具有優勢很方便,直接改變前後指標指向,**記憶體即可)

int timerwheel_del(timerwheel_t*tw,timernode_t*node)

return0;

}

基於時間輪的定時器

目錄 是乙個單層時間輪,當指標走到某一格上,就獲取那一格上掛的任務將其執行。當時如果時間跨度大的時候,格仔數明顯不夠,那麼就可以做成多級時間輪。其實就是當低層的時間輪走了一圈,將它高一層的時間輪走一格,並且將掛在高層時間輪上的任務分配下來。檔案 include timewheel.h include...

Linux的動態定時器 時間輪

定時器 有時也稱為動態定時器或核心定時器 是管理核心時間的基礎。定時器是一種軟體功能,即允許在將來的某個時刻,函式在給定的時間間隔用完時被呼叫。注意的是定時器並不會週期執行,它在超時後就自行銷毀,這也是定時器被稱為動態定時器的乙個原因。動態定時器不斷地建立和銷毀,而且它的執行次數也不受限制。定時器在...

linux定時器時間輪演算法詳解

linux高併發程式設計 紅黑樹實現定時器 時間輪實現定時器 linux多執行緒環境下海量定時任務的定時器設計 linux定時器分為低精度定時器和高精度定時器兩種型別,核心對其均有實現。本文討論的是我們在應用程式開發中比較常見的低精度定時器。作為常用的基礎元件,定時器常用的幾種實現方法包括 基於排序...