Linux定時器和時間管理源碼相關總結

基礎可參考:

Linux內核定時器相關內容總結-CSDN博客

定時器來源

定時器也是來源于芯片的硬件定時器,屬于內部外設,有些可能也會用外部定時器,不管咋樣,都屬于芯片外設,既然是外設,那么我們也要編寫對應的定時器驅動,不過一般常用的芯片比如ARM,都已經有了現成的定時器驅動,所以我們常常關注不到這塊。

在 ARM 架構的 Linux 內核中,硬件定時器的來源(即選擇哪個硬件定時器作為系統時鐘源)是通過設備樹(Device Tree)配置內核編譯選項共同決定的,核心是指定一個硬件定時器作為系統的 “時鐘事件設備”(clock event device)和 “時鐘源設備”(clock source device)。

一、硬件定時器的硬件基礎

ARM 架構的處理器或 SOC 通常集成多種硬件定時器,常見的包括:

  • ARM 通用定時器(ARM Generic Timer)
    • 集成在 ARMv7-A/R、ARMv8-A 等架構中,是推薦的系統定時器,支持物理計數(CNTPCT)和虛擬計數(CNTVCT),精度高(通常為 64 位)。
  • 全局定時器(Global Timer)
    • 部分多核 ARM 處理器(如 Cortex-A9)集成,可用于多核系統的全局時間同步。
  • 本地定時器(Local Timer)
    • 每個 CPU 核心獨立的定時器,如 ARM11 的本地定時器,用于核內私有定時任務。
  • SOC 廠商自定義定時器
    • 如 TI 的 OMAP 定時器、三星的 S3C 定時器等,由芯片廠商在 ARM 架構基礎上額外設計。

二、硬件定時器的配置與初始化流程

1. 設備樹(Device Tree)配置:指定可用定時器

設備樹(.dts?或?.dtsi?文件)是 ARM 架構中描述硬件的核心,需在其中聲明系統中存在的硬件定時器,例如:

// 以ARM Generic Timer為例
timer {compatible = "arm,armv7-timer";  // 兼容屬性,匹配內核驅動interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,<GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,<GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,<GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;// 其他屬性(如時鐘頻率等)
};// 以廠商自定義定時器為例(如三星S3C2410)
timer@10000000 {compatible = "samsung,s3c2410-timer";reg = <0x10000000 0x10>;  // 寄存器地址和大小interrupts = <10>;        // 中斷號clocks = <&pclk>;         // 時鐘源
};
  • compatible?屬性是關鍵,內核通過該屬性匹配對應的定時器驅動(如?drivers/clocksource/arm_generic_timer.c)。
  • 不同定時器的設備樹節點格式由其驅動定義,需參考芯片手冊和內核文檔。

2. 內核驅動:注冊定時器設備

內核通過時鐘源框架(clocksource framework)管理硬件定時器,驅動需將硬件定時器注冊為兩種角色:

  • 時鐘源設備(clocksource):提供高精度時間計數(如用于日歷時間更新、高精度延時以及高精度定時器等等),通過?clocksource_register()?注冊。
  • 時鐘事件設備(clockevent):支持定時中斷(如用于jiffies?更新、調度器節拍、ms級別定時器觸發等等),通過?clockevents_register_device()?注冊。

以 ARM Generic Timer 為例,其驅動(drivers/clocksource/arm_generic_timer.c)的核心邏輯:

// 注冊時鐘源
static struct clocksource arm_gt_clocksource = {.name           = "arm_global_timer",.rating         = 400,  // 評級(越高越優先被選中).read           = gt_clocksource_read,  // 讀取當前計數的函數.mask           = CLOCKSOURCE_MASK(64), // 64位計數器.flags          = CLOCK_SOURCE_IS_CONTINUOUS,
};// 注冊時鐘事件設備
static struct clock_event_device arm_gt_clockevent = {.name           = "arm_global_timer",.features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,.set_mode       = gt_clockevent_set_mode,  // 設置模式(周期/單次).set_next_event = gt_clockevent_set_next,  // 設置下一次中斷時間.rating         = 400,
};// 驅動初始化時注冊
static int __init arm_generic_timer_init(void) {clocksource_register(&arm_gt_clocksource);clockevents_register_device(&arm_gt_clockevent);return 0;
}

3. 內核選擇:確定系統默認定時器

內核啟動時,會根據以下規則選擇最終使用的定時器:

  1. 評級(rating):每個時鐘源 / 事件設備有一個評級(如 100~500),內核優先選擇評級最高的設備(精度和可靠性更好)。
  2. 兼容性:通過設備樹的?compatible?屬性匹配驅動后,驅動會自動注冊設備并參與評級競爭。
  3. 編譯選項:部分架構可通過?CONFIG_*?選項強制啟用 / 禁用特定定時器(如?CONFIG_ARM_GENERIC_TIMER?控制是否支持 ARM 通用定時器)。

最終被選中的時鐘源設備則作為系統的時間基準(用于獲取高精度時間),時鐘事件設備會作為系統的周期性中斷源(用于更新?jiffies、調度器節拍等)。

4. 核心配置文件與目錄

  • 設備樹文件arch/arm/boot/dts/(不同 SOC 的設備樹,如?vexpress-v2p-ca9.dts)。
  • 定時器驅動drivers/clocksource/(如?arm_generic_timer.cs3c2410_timer.c)。
  • 時鐘框架核心kernel/time/clocksource.c(時鐘源管理)、kernel/time/clockevents.c(時鐘事件管理)。
  • 編譯選項arch/arm/Kconfig(與 ARM 定時器相關的配置,如?CONFIG_ARM_ARCH_TIMER)。

總結

在 ARM 架構的 Linux 內核中,硬件定時器的來源通過設備樹聲明硬件信息,由對應驅動注冊為時鐘源 / 事件設備,最終內核根據評級和兼容性自動選擇最優定時器作為系統時鐘。核心配置點是設備樹的定時器節點和內核對定時器驅動的編譯啟用,兩者共同決定了系統使用哪個硬件定時器。

“時鐘源”(clock event device)和 “時鐘事件設備”(clock source device)不是同一個東西嗎,有啥區別

“時鐘源”(clocksource device)和 “時鐘事件設備”(clock event device)不是同一個東西,它們在 Linux 內核中有著不同的功能和作用,具體區別如下:

功能用途

  • 時鐘源設備:主要用于為系統提供一個精確的時間基準,它是一個單調遞增的計數器,通常是一個硬件計數器,會不斷地計數,內核通過讀取該計數器的值來獲取當前的時間信息,用于更新維護系統時間等服務,比如執行date命令獲取時間時,最終會讀取時鐘源來確定具體時間。
  • 時鐘事件設備:主要用于產生時鐘事件,例如周期性中斷或單次中斷。它可以被編程設置在未來某個指定的時間點觸發事件,主要用于實現普通定時器和高精度定時器,也用于產生 tick 事件,為進程調度子系統提供時鐘滴答,以驅動進程調度、更新jiffies等操作。

數據結構與關鍵屬性

  • 時鐘源設備:在內核中用struct clocksource表示,包含一個表示該時鐘源質量的rating域,值越大質量越好,系統會從所有的時鐘源中選擇一個質量最好的作為當前時鐘源。還包含read函數指針用于讀取時鐘值,以及multshift等用于在時鐘周期和納秒之間進行轉換的成員。
  • 時鐘事件設備:由struct clock_event_device表示,其關鍵在于能注冊未來指定時間點發生的事件,提供了設置時鐘事件模式(周期或單次)的函數指針,如set_mode,還有用于設置下一次事件觸發時間的set_next_event函數指針等。

硬件相關性

  • 時鐘源設備:通常是一些精度較高、穩定性好的硬件,如實時時鐘(RTC)、時間戳計數器(TSC)、高精度事件定時器(HPET)等,這些硬件為系統提供一個穩定的計時基礎,其計數通常不會被輕易修改,以保證時間的準確性和單調性。
  • 時鐘事件設備:雖然有些時鐘事件設備可能基于與時鐘源相同的硬件,但它更側重于利用硬件的中斷功能,在 SMP(對稱多處理)系統中,通常每個 CPU 核心會有一個獨立的時鐘事件設備,以便每個核心能獨立觸發事件,而無需依賴其他核心,減少處理器間的通信開銷。

內核中的管理方式

  • 時鐘源設備:系統中所有的時鐘源都會被存放于一個全局的鏈表clocksource_list中,系統啟動期間會從所有時鐘源中選取一個最好的,curr_clocksource用于保存當前系統使用的時鐘源,可通過/sys/devices/system/clocksource/clocksource0/current_clocksource來指定優先選擇的時鐘源,通過clocksource_register函數向系統中添加時鐘源。
  • 時鐘事件設備:內核提供了一套框架來管理時鐘事件設備,通過clockevents_register_device函數向系統添加一個時鐘事件設備。在動態時鐘模式下,會涉及到時鐘事件設備的模式切換以及廣播時鐘設備等相關概念,例如tick_broadcast_device用于保存當前使用的廣播時鐘設備,以在必要時為其他 CPU 提供時鐘事件服務。

時鐘源設備為內核提供一個時間基線,通常實現為一個由固定時鐘頻率驅動的計數器,其值單調增加。當使用 date 命令獲取當前時間時,內核會讀取當前的時鐘源,將其計數值轉換為合適的時間單位后返回給用戶空間。

系統啟動時,內核會先從實時時鐘(RTC)讀取時間來初始化系統時間。RTC 是一種特殊的時鐘源設備,即使系統斷電也能靠電池維持計時。之后,系統主要通過選定的時鐘源設備(如時間戳計數器 TSC 等)來更新實時時間信息,不再頻繁讀取 RTC。而時鐘事件設備主要用于產生時鐘事件,如周期性中斷或單次中斷,以驅動進程調度、更新 jiffies 等,并不直接提供日期時間信息。

RTC通常不會作為時鐘源

RTC是時鐘源的一種,主要是為了維持系統斷電后時間能繼續往下走,但是通常不會被優先選中作為Linux系統時間的時鐘源,因為RTC 雖然可以作為時鐘源設備,但它存在一些局限性,如讀取成本較高,與基于 CPU 頻率的時鐘源相比分辨率通常更低。Linux 內核首選的時鐘源是時間戳計數器(TSC),在系統啟動進程時,通常會依賴它。在無癢系統上,TSC 可能不穩定,此時內核會切換到高精度事件定時器(HPET),它是僅次于 TSC 的首選時鐘源。不過,在某些特定情況下,如系統中其他高精度時鐘源不可用,或對時間精度要求不高且更看重斷電保持時間功能時,也可以將 RTC 作為時鐘源設備。

二者常常配合工作

RTC(實時時鐘)與時鐘源設備是相互關聯的,并非完全獨立。RTC 為時鐘源設備提供初始時間基準,時鐘源設備則在系統運行過程中負責更新系統時間,二者共同為 Linux 內核提供準確的時間信息。具體關系如下:

  • RTC 為時鐘源設備提供初始時間:RTC 通常由電池供電,可在系統斷電時持續計時,能記錄當前的日期和時間,一般是記錄自 1970 年 1 月 1 日起經歷的秒數。Linux 系統啟動時,內核會讀取 RTC 中的時間來初始化系統時間,該時間會用于設置時鐘源設備相關的時間變量,如xtime。此時,時鐘源設備基于 RTC 提供的初始時間開始計時。

  • 時鐘源設備更新系統時間:時鐘源設備抽象了能夠提供計時功能的系統硬件,如 RTC、時間戳計數器(TSC)、高精度事件定時器(HPET)等,其通常實現為一個由固定時鐘頻率驅動的計數器,計數器只能單調地增加,直到溢出為止。系統啟動后,在大多數情況下,內核會通過選定的時鐘源來更新實時時間信息(墻上時間),而不再頻繁讀取 RTC 的時間。例如,若選定的時鐘源是基于定時器中斷的,那么會通過定時器中斷處理程序來不斷更新系統時間,使得系統時間能夠隨著時間推移而準確變化。

  • 二者共同維持系統時間:RTC 是系統時間的基礎時間基準,而時鐘源設備則基于此基準,在系統運行過程中通過不斷計數和更新,為內核提供準確的當前時間信息。當系統時間因用戶調整等操作發生變化時,內核可能會將更新后的時間寫回 RTC,以保持 RTC 與系統時間的同步,確保下次系統啟動時仍能獲取到準確的初始時間,二者相互配合維持系統時間的準確性和連續性。

核心流程

核心流程:從啟動到運行

1. 啟動階段:初始化時間硬件

  • 步驟 1:讀取 RTC 時間
    內核啟動早期(start_kernel()?→?time_init()),通過 RTC 驅動(如drivers/rtc/rtc-ds1307.c)讀取硬件時鐘,初始化系統時間(xtime變量)。

  • 步驟 2:注冊時鐘源和時鐘事件設備

    • 通用定時器驅動探測到硬件后,注冊clocksourceclock_event_device
    • 內核通過clocksource_select()選定最佳時鐘源,通過clockevents_config_and_register()激活時鐘事件設備。
  • 步驟 3:初始化滴答(tick)機制

    • 啟動tick_init(),為每個 CPU 綁定時鐘事件設備,默認工作在周期性模式CLOCK_EVT_MODE_PERIODIC),每1/HZ秒產生一次中斷(tick)。
    • 中斷處理函數(如tick_handle_periodic())更新jiffies,觸發定時器軟中斷(TIMER_SOFTIRQ),驅動進程調度(更新進程時間片)。

運行階段:時間維護與定時服務

  • 系統時間更新

    • 周期性tick中斷中,內核通過update_wall_time()更新xtime(基于時鐘源的計數差值),最終反映為date命令看到的系統時間。
    • 高精度模式(CONFIG_HIGH_RES_TIMERS啟用)下,tick會動態調整為單次觸發模式,減少不必要的中斷。
  • 定時器服務

    • 普通定時器(timer_list:基于jiffies,通過紅黑樹管理,在TIMER_SOFTIRQ中處理超時回調。
    • 高精度定時器(hrtimer:基于ktime_t,通過獨立紅黑樹管理,依賴時鐘事件設備的單次中斷,在HRTIMER_SOFTIRQ中處理(精度達納秒級)。
  • 時間同步

    • 通過 NTP(Network Time Protocol)服務調整xtime,內核提供do_settimeofday64()系統調用接口。
    • 對于虛擬化場景(如 KVM),ARM 通用定時器支持虛擬計數(CNTVCT),由 Hypervisor 維護,確保客戶機時間與主機同步。

關鍵配置與調試

  • 編譯選項

    • CONFIG_HIGH_RES_TIMERS:啟用高精度定時器。
    • CONFIG_ARM_ARCH_TIMER:啟用 ARM 通用定時器支持。
    • HZ:定義在include/asm-generic/param.h,默認值由架構決定(如 ARM 通常為 1000)。
  • 調試接口

    • /proc/timer_list:查看所有定時器狀態。
    • /sys/devices/system/clocksource/clocksource0/available_clocksource:列出可用時鐘源。
    • dmesg | grep -i timer:查看定時器初始化日志。

總結

ARM 架構 Linux 的時間管理機制是硬件定時器內核框架的深度結合:

  1. 以 ARM 通用定時器為核心硬件,提供高精度計數和中斷能力;
  2. 通過時鐘源 / 時鐘事件框架抽象硬件,統一時間管理接口;
  3. 維護jiffiesktime_t兩套時間體系,分別服務于普通和高精度場景;
  4. 依賴周期性 / 單次中斷驅動時間更新和定時器觸發,支撐進程調度、系統時間等核心功能。

這種設計既利用了 ARM 硬件的高效特性,又通過內核抽象保證了跨平臺兼容性和可擴展性。

常規定時器的實現機制

Linux 內核定時器(timer_list)的實現機制基于系統時鐘中斷紅黑樹(rbtree)?數據結構,核心是高效管理大量定時任務并在超時時刻觸發回調函數。以下是其底層實現的關鍵機制:

一、核心數據結構

定時器結構體?timer_list
每個定時器都由該結構體描述,定義在?include/linux/timer.h?中:

struct timer_list {struct hlist_node entry;       // 哈希表節點(用于臨時存儲)unsigned long expires;         // 超時時間(以jiffies為單位)void (*function)(struct timer_list *);  // 超時回調函數u32 flags;                     // 標志(如TIMER_IRQSAFE)// 其他輔助字段(如base、slack等)
};
  • expires:存儲超時時刻的?jiffies?值(系統啟動后的時鐘節拍數)。
  • function:超時后執行的回調函數(用戶自定義邏輯)。

定時器管理核心:timer_base
內核為每個 CPU 維護一個?timer_base?結構體(避免多核競爭),定義在?kernel/time/timer.c?中,核心字段包括:

struct timer_base {struct rb_root_cached active;  // 紅黑樹:存儲待觸發的定時器unsigned long clk;             // 當前CPU的時鐘節拍(jiffies)// 其他同步字段(如鎖、軟中斷等)
};

active:紅黑樹的根節點,所有未超時的定時器按?expires?從小到大排序,確保快速查找最早到期的定時器。

二、核心工作流程

1. 定時器的注冊與添加(timer_setup?+?add_timer

  • 初始化:通過?timer_setup(timer, func, flags)?初始化定時器,綁定回調函數和標志。
  • 設置超時時間:手動賦值?timer->expires = jiffies + delaydelay?為延時的節拍數)。
  • 添加到紅黑樹:調用?add_timer(timer)?時,內核會:
    • 對當前 CPU 的?timer_base?加鎖(避免并發修改)。
    • 將定時器插入紅黑樹(按?expires?排序,保證有序性)。
    • 若插入的定時器是最早到期的,更新系統時鐘中斷的下一次觸發時間(確保及時處理)。

2. 時鐘中斷:觸發定時器檢查

系統時鐘以固定頻率(HZ,如 1000Hz)產生中斷,中斷處理函數(timer_interrupt)會觸發定時器檢查:

  • 內核先更新全局?jiffies(每次中斷 + 1)。
  • 調用?run_local_timers(),觸發定時器軟中斷(TIMER_SOFTIRQ

3. 軟中斷處理:執行超時定時器(run_timer_softirq

軟中斷上下文(優先級低于硬件中斷,高于進程)中,run_timer_softirq?函數批量處理超時定時器:

  • 遍歷當前 CPU?timer_base?的紅黑樹,提取所有?expires <= 當前jiffies?的定時器。
  • 將這些定時器從紅黑樹移除,放入臨時哈希表(避免處理時紅黑樹結構變化)。
  • 解鎖后,依次調用每個定時器的?function?回調函數(執行用戶邏輯)。
  • 若定時器是周期性的(需手動在回調中重新設置?expires?并調用?mod_timer),會被重新加入紅黑樹。

4. 定時器的修改與刪除(mod_timer?/?del_timer

  • 修改超時時間mod_timer(timer, new_expires)?會先刪除舊定時器,再按新?expires?重新插入紅黑樹。
  • 刪除定時器del_timer(timer)?將定時器從紅黑樹中移除,確保不會被觸發(返回是否已超時)。

三、關鍵機制與優化

  1. 紅黑樹的作用
    紅黑樹是平衡二叉搜索樹,支持?O(log n)?時間復雜度的插入、刪除和查找操作。內核通過紅黑樹快速定位最早到期的定時器,避免遍歷所有定時器,大幅提升效率。

  2. CPU 本地定時器
    每個 CPU 管理自己的?timer_base?和紅黑樹,減少多核間的鎖競爭(僅在跨 CPU 操作時需要全局同步)。

  3. 軟中斷延遲處理
    定時器回調函數在軟中斷中執行,而非硬件中斷上下文,避免了中斷處理時間過長影響系統響應(硬件中斷需快速完成)。

  4. jiffies?與超時精度
    定時器的最小精度是?1/HZ?秒(如 HZ=1000 時為 1ms),若需更高精度(如微秒級),需使用?高精度定時器(hrtimer)

四、局限性

  • 精度有限:依賴?jiffies?和?HZ,無法滿足微秒級定時需求(需?hrtimer?補充)。
  • 回調函數限制:回調函數運行在軟中斷上下文,不能睡眠(不可調用?schedule()、獲取互斥鎖等)。
  • 超時可能延遲:若系統負載過高,軟中斷處理被推遲,定時器實際觸發時間可能晚于?expires

總結

Linux 內核定時器通過紅黑樹管理定時任務,結合時鐘中斷觸發檢查軟中斷執行回調,實現了高效的低精度定時功能。其設計兼顧了性能(紅黑樹 + CPU 本地管理)和可靠性(鎖機制 + 軟中斷延遲),是內核中處理延時任務的基礎組件。

高精度定時器的實現機制

Linux 中的高精度定時器(hrtimer,High-Resolution Timer)是為滿足微秒(μs)甚至納秒(ns)級精度的定時需求而設計的,其實現機制與普通內核定時器(基于jiffies)有顯著差異,核心依賴硬件提供的高精度時鐘源和高效的時間管理框架。以下是其實現機制的關鍵細節:

一、核心設計目標

高精度定時器解決普通定時器(timer_list)的精度限制(最低精度為1/HZ秒,如HZ=1000時為 1ms),主要用于:

  • 需微秒級定時的場景(如音頻處理、實時控制)。
  • 替代udelay()等忙等待延時函數,提高 CPU 利用率。

二、核心數據結構

高精度定時器結構體?struct hrtimer
定義在?include/linux/hrtimer.h?中,核心字段:

struct hrtimer {struct rb_node          node;       // 紅黑樹節點(按到期時間排序)ktime_t                 expires;    // 到期時間(ktime_t類型,納秒級)enum hrtimer_mode       mode;       // 模式(相對時間/絕對時間)enum hrtimer_restart    (*function)(struct hrtimer *);  // 回調函數struct hrtimer_clock_base *base;    // 關聯的時鐘基準// 其他輔助字段(如狀態標志、優先級等)
};
  • ktime_t:內核中表示時間的數據類型,以納秒為單位(64 位,支持大范圍時間)。
  • mode:區分定時模式(HRTIMER_MODE_REL?相對時間,HRTIMER_MODE_ABS?絕對時間)。

時鐘基準?struct hrtimer_clock_base
內核為不同時間域(如實時時間、單調時間)維護獨立的時鐘基準,每個基準包含:

struct hrtimer_clock_base {struct rb_root_cached   active;     // 紅黑樹:存儲未到期的hrtimerktime_t                 resolution; // 時鐘精度(如1ns、10ns)struct hrtimer          *next_timer; // 下一個即將到期的定時器// 與硬件時鐘源的綁定信息
};
  • 常見時間域:CLOCK_REALTIME(系統實時時間,可被修改)、CLOCK_MONOTONIC(單調遞增時間,不受系統時間調整影響)。

三、核心實現機制

1. 依賴的硬件基礎

高精度定時器依賴支持納秒級計數的硬件時鐘源,如:

  • ARM Generic Timer:64 位計數器,支持納秒級精度(通過CNTPCT寄存器計數)。
  • x86 TSC(Time Stamp Counter):處理器內置計數器,頻率與 CPU 相關,可達到納秒級。
  • HPET(High Precision Event Timer):外部硬件定時器,提供穩定的納秒級定時。

這些時鐘源需被注冊為內核的clocksource,且rating評級較高(通常≥1000)。

2. 定時器的注冊與調度

  • 初始化與啟動
    通過?hrtimer_init()?初始化定時器(指定時間域和模式),再通過?hrtimer_start()?設置到期時間并加入紅黑樹:

    struct hrtimer my_timer;
    ktime_t delay = ktime_set(0, 500000); // 500μs(0秒+500,000納秒)hrtimer_init(&my_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
    my_timer.function = my_callback; // 設置回調函數
    hrtimer_start(&my_timer, delay, HRTIMER_MODE_REL);
    
  • 紅黑樹管理
    所有未到期的hrtimerexpires(納秒級)在紅黑樹中排序,確保內核能快速定位下一個即將到期的定時器next_timer)。

3. 觸發與回調執行

高精度定時器的觸發依賴時鐘事件設備clockevent device)的單次中斷能力:

  • 設置硬件中斷

    當添加或修改hrtimer時,內核計算最近到期時間(next_timer->expires),并通過時鐘事件設備的?set_next_event()?函數,編程硬件在該時間點產生單次中斷(而非周期性中斷)。

  • 中斷處理

    硬件中斷觸發后,內核進入中斷處理函數,執行以下操作:

    • 讀取當前高精度時間(通過clocksource)。
    • 遍歷紅黑樹,將所有expires <= 當前時間的定時器從樹中移除。
    • 對每個到期定時器,調用其function回調函數(在軟中斷上下文執行)。
    • 若回調函數返回HRTIMER_RESTART(需重啟),則重新計算expires并將其插回紅黑樹。
    • 重新計算下一個到期時間,設置硬件觸發下一次中斷。

4. 精度保證機制

  • 避免周期性中斷誤差
    普通定時器依賴固定頻率的jiffies中斷,累積誤差較大;而 hrtimer 通過動態設置單次中斷,每次根據實際時間調整下一次觸發點,消除累積誤差。

  • 時間轉換與校準
    內核通過clocksource提供的multshift參數,將硬件計數器的原始值(如時鐘周期)精確轉換為納秒,確保時間計算的準確性。

  • 優先級機制
    高精度定時器的軟中斷(HRTIMER_SOFTIRQ)優先級高于普通定時器軟中斷(TIMER_SOFTIRQ),減少回調執行的延遲。

四、與普通定時器的關鍵區別

特性普通定時器(timer_list高精度定時器(hrtimer
時間單位jiffies(毫秒級,依賴HZ納秒級(ktime_t
精度最低1/HZ秒(如 1ms)微秒 / 納秒級(取決于硬件)
硬件依賴普通時鐘事件設備(周期性中斷)高精度時鐘源 + 支持單次中斷的設備
數據結構紅黑樹(按jiffies排序)紅黑樹(按納秒時間排序)
觸發方式依賴jiffies中斷批量處理動態設置單次中斷,精準觸發
適用場景低精度需求(如秒級延時)高精度需求(如音頻、實時控制)

五、核心代碼與配置

  • 頭文件include/linux/hrtimer.h(數據結構和 API 定義)。
  • 實現代碼kernel/time/hrtimer.c(核心邏輯,如添加、觸發、回調管理)。
  • 編譯選項CONFIG_HIGH_RES_TIMERS(啟用高精度定時器支持,默認開啟)。
  • 用戶接口:通過timer_create()CLOCK_MONOTONIC等)在用戶態使用,內核態直接調用hrtimer_*系列函數。

總結

Linux 高精度定時器通過納秒級時間表示紅黑樹高效管理單次中斷精準觸發高精度硬件時鐘源,實現了微秒 / 納秒級的定時精度。其設計避開了普通定時器依賴jiffies的固有缺陷,為對時間敏感的應用提供了可靠支持,是實時系統和高性能應用的核心組件。

滴答tick機制

在 Linux 中,滴答(tick)機制是時間管理的重要組成部分,用于實現系統時間更新、進程調度、定時器管理等功能。以下是具體介紹:

  • 基本定義:Tick 是指時鐘中斷的時間間隔,其長度為1/HZ秒,HZ是系統定義的時鐘滴答頻率。不同平臺上HZ的值可能不同,例如在一些常見平臺上HZ為 1000,此時 1 個 tick 就是 1 毫秒。
  • 工作原理:Linux 系統中有一個時鐘振蕩器,通常由可編程的時鐘設備充當 clock event 設備。內核啟動時可設置其發出中斷的周期,時鐘振蕩器會周期性地發出中斷,每次中斷即為一個 tick。在單處理器系統中,每個 tick 只產生一次時鐘中斷,中斷處理程序會完成更新系統時間、統計、定時器等功能。在多處理器系統下,時鐘中斷分為全局時鐘中斷和本地時鐘中斷,每個 tick 每個 CPU 要處理一次本地時鐘中斷,其中一個 CPU 還要處理一次全局時鐘中斷。
  • 相關變量:內核通過全局變量jiffies(64 位系統中為jiffies_64)記錄系統啟動后經歷的 tick 總數。每發生一次 tick,對應的時鐘中斷處理程序會將jiffies_64加 1,通過該變量可計算時間間隔、實現相對定時等操作。
  • 主要作用:Tick 機制為 Linux 內核提供了基本的時間基準,是內核實現時間相關功能的基礎。它可觸發中斷處理程序,進而更新系統時間、檢查定時器是否到期、進行進程調度等。例如,時間片輪轉調度算法就是基于 tick 計數,來確定每個進程使用 CPU 的時間片長度;性能分析時,也可通過統計代碼段執行的 tick 數,來評估其執行時間。

時鐘中斷處理函數是 Linux 內核時間管理的核心,負責響應硬件定時器產生的中斷,驅動系統時間更新、進程調度、定時器觸發等關鍵功能。其實現與硬件架構相關,但核心邏輯具有通用性,以下是詳細解析:

一、時鐘中斷的來源

時鐘中斷由時鐘事件設備(clock event device)?產生,常見硬件包括:

  • ARM 架構的通用定時器(ARM Generic Timer)
  • x86 架構的 PIT(可編程間隔定時器)、HPET(高精度事件定時器)
  • 其他架構的專用定時器硬件

這些設備按固定頻率(HZ,如 1000Hz)產生周期性中斷,或按內核動態設置的時間產生單次中斷(高精度模式)。

二、中斷處理函數的執行流程

時鐘中斷處理函數分為硬件中斷處理軟中斷后續處理兩個階段,以 ARM 架構為例:

1. 硬件中斷處理(匯編入口)

  • 入口點:中斷向量表中的定時器中斷入口(如vector_irq),最終跳轉到handle_irq通用中斷處理函數。
  • 核心操作
    • 保存中斷現場(寄存器狀態)。
    • 調用對應時鐘事件設備的中斷處理函數(如arm_generic_timer_interrupt)。
    • 清除硬件中斷標志(避免重復觸發)。
    • 觸發軟中斷(TIMER_SOFTIRQHRTIMER_SOFTIRQ)。
    • 恢復中斷現場,返回被中斷的程序。

2. 核心處理函數(C 語言實現)

以周期性時鐘中斷為例,核心邏輯在tick_handle_periodic(定義于kernel/time/tick-common.c):

void tick_handle_periodic(struct clock_event_device *dev) {// 1. 更新jiffies(系統節拍計數)jiffies_64++;// 2. 處理全局tick(多CPU系統中,僅一個CPU執行)if (tick_do_timer_cpu == smp_processor_id()) {write_seqlock(&xtime_lock);// 更新系統時間(wall time)update_wall_time();write_sequnlock(&xtime_lock);}// 3. 觸發定時器軟中斷(處理到期的timer_list)raise_softirq(TIMER_SOFTIRQ);// 4. 通知調度器,可能需要進行進程切換scheduler_tick();// 5. 若支持周期性模式,重置硬件中斷(下一個tick)if (dev->features & CLOCK_EVT_FEAT_PERIODIC)dev->set_mode(CLOCK_EVT_MODE_PERIODIC, dev);
}

3. 軟中斷后續處理

硬件中斷處理完成后,內核在軟中斷上下文執行后續任務:

  • TIMER_SOFTIRQ:由run_timer_softirq處理,遍歷并執行所有到期的普通定時器(timer_list)回調函數。
  • HRTIMER_SOFTIRQ:由run_hrtimer_softirq處理,執行高精度定時器(hrtimer)的回調函數(高精度模式下啟用)。

三、關鍵功能與作用

  • 更新系統時間

    • 通過update_wall_time函數,根據時鐘源(clocksource)的計數差值更新系統實時時間(xtime)。
    • 同步jiffies與實際時間的對應關系。
  • 驅動進程調度

    • 調用scheduler_tick函數,更新當前進程的時間片計數。
    • 若進程時間片耗盡,設置調度標志(TIF_NEED_RESCHED),觸發進程切換。
  • 處理定時器

    • 觸發軟中斷,批量處理到期的定時器(普通定時器和高精度定時器)。
    • 對于周期性定時器,重新計算超時時間并添加到定時器隊列。
  • 維護統計信息

    • 更新 CPU 負載、進程運行時間等統計數據(如task_struct中的utimestime)。
    • 支持getrusage等系統調用獲取進程時間信息。

四、高精度模式與動態 tick

  • 高精度模式(CONFIG_HIGH_RES_TIMERS)
    時鐘事件設備工作在單次觸發模式CLOCK_EVT_MODE_ONESHOT),中斷處理函數會根據下一個到期定時器的時間動態設置下一次中斷,而非固定周期,從而實現納秒級精度。

  • 動態 tick(CONFIG_NO_HZ_FULL)
    對于空閑 CPU,暫停周期性 tick,僅在有定時器到期或進程喚醒時才產生中斷,減少不必要的中斷開銷,降低系統功耗。

五、核心代碼與配置

  • 硬件中斷入口

    • ARM 架構:arch/arm/kernel/irq.c(通用中斷處理)、drivers/clocksource/arm_generic_timer.c(定時器中斷處理)。
    • x86 架構:arch/x86/kernel/apic_timer.c(APIC 定時器中斷)。
  • 核心處理函數

    • kernel/time/tick-common.ctick_handle_periodic(周期性處理)、tick_handle_oneshot(單次觸發處理)。
    • kernel/time/timer.crun_timer_softirq(普通定時器處理)。
    • kernel/time/hrtimer.crun_hrtimer_softirq(高精度定時器處理)。
  • 配置選項

    • CONFIG_HZ:設置時鐘頻率(如 100、250、1000)。
    • CONFIG_HIGH_RES_TIMERS:啟用高精度定時器支持。
    • CONFIG_NO_HZ_FULL:啟用動態 tick 模式。

總結

時鐘中斷處理函數是 Linux 時間管理的 “心臟”,通過硬件中斷快速響應和軟中斷延遲處理的結合,既保證了時間敏感操作的及時性,又避免了中斷上下文過長影響系統響應。其核心功能包括更新系統時間、驅動進程調度、處理定時器和維護統計信息,同時支持高精度和動態 tick 等優化,平衡了精度、性能和功耗。

Linux 進程調度的時間片管理主要由tick 機制驅動。具體來說,進程時間片的消耗、更新和調度觸發,都依賴于時鐘中斷(tick)的周期性觸發,這是時間片輪轉調度(RR)和公平調度(CFS)的核心工作基礎。

具體機制:

時間片的消耗與更新
每個進程的時間片(或 CFS 中的虛擬運行時間)會在每次時鐘中斷(tick)時被更新:

  • 對于實時進程(RR 調度類):每次 tick 會減少其剩余時間片,當時間片耗盡時,進程會被放到就緒隊列末尾,等待下一次調度。
  • 對于普通進程(CFS 調度類):tick 會更新進程的虛擬運行時間(vruntime),當vruntime累積到超過調度實體的公平份額時,觸發調度器重新選擇下一個進程。

調度觸發的關鍵函數
時鐘中斷處理過程中,會調用scheduler_tick()函數(定義在kernel/sched/core.c),這是時間片驅動調度的核心:

void scheduler_tick(void) {struct rq *rq = this_rq();  // 獲取當前CPU的運行隊列struct task_struct *curr = rq->curr;  // 當前運行的進程// 更新當前進程的時間統計(如utime、stime)update_process_times(curr);// 調用對應調度類的tick處理函數(如CFS的task_tick_fair)curr->sched_class->task_tick(rq, curr, 0);// 檢查是否需要重新調度(如時間片耗盡)trigger_load_balance(rq);
}
  • task_tick_fair(CFS 調度類):更新進程的vruntime,并判斷是否需要設置重調度標志(TIF_NEED_RESCHED)。
  • task_tick_rt(實時調度類):減少時間片,若耗盡則觸發重新調度。

重調度的觸發
scheduler_tick()判斷當前進程時間片耗盡(或vruntime失衡)時,會設置TIF_NEED_RESCHED標志。當中斷返回用戶態或內核態調度點時,內核會檢查該標志,調用schedule()函數完成進程切換。

特殊情況:無 tick 模式(CONFIG_NO_HZ_FULL

在支持動態 tick(如NO_HZ_FULL)的系統中,空閑 CPU 會暫停周期性 tick,以減少中斷開銷。但此時:

  • 若 CPU 上有運行的進程,仍會通過高精度定時器(hrtimer)模擬 tick,確保時間片正常消耗。
  • 當進程主動睡眠或時間片耗盡時,仍會觸發調度,避免進程無限期占用 CPU。

總結

Linux 進程調度的時間片管理本質上依賴 tick 機制

  • 周期性 tick 是時間片消耗的 “計量器”,驅動進程運行時間的統計和更新。
  • scheduler_tick()函數是連接 tick 與調度器的核心,負責判斷是否需要觸發進程切換。
  • 即使在動態 tick 模式下,仍會通過其他機制(如 hrtimer)保證時間片驅動的調度邏輯正常工作。

因此,tick 是進程時間片管理和調度觸發的基礎動力來源。

墻上時間?

Linux 內核主要通過實時時鐘(RTC)和系統定時器相互配合的機制來提供日歷時間。具體如下:

  • 實時時鐘(RTC):RTC 是由紐扣電池供電的硬件時鐘,即使系統關機也能持續計時。內核在啟動時會讀取 RTC 中的時間來初始化系統的墻上時間(wall time),該時間存放在xtime變量中。此外,系統關機時,內核會將當前系統時間寫回 RTC,以保持兩者同步。
  • 系統定時器:系統定時器是內核時間機制的重要組成部分,它以HZ(時鐘節拍率)為頻率自行觸發時鐘中斷。當時鐘中斷發生時,內核會調用時鐘中斷處理程序timer_interrupt()。全局變量jiffies用于記錄自系統啟動以來產生的節拍總數,每發生一次時鐘中斷,jiffies的值就會加 。通過jiffiesHZ,可以計算出系統運行時間。同時,時鐘中斷處理程序還會根據jiffies的值來更新xtime,從而實現對日歷時間的持續維護。
  • 相關函數與接口:內核提供了do_gettimeofday()函數來讀取墻上時間,用戶空間程序可通過系統調用獲取當前的日歷時間。另外,timekeeper模塊建立在時鐘源管理模塊之上,負責維護 Linux 整個系統的時間,包括提供讀取系統時間接口ktime_get等供內核和系統調用使用。

與 Linux 內核日歷時間相關的目錄文件主要有以下這些:

  • /dev/rtc:這是 RTC 設備文件,用戶空間程序可以通過對該文件進行讀寫、ioctl 等操作來訪問 RTC 硬件,獲取或設置時間,以及使用 RTC 的定時器等功能。
  • /sys/class/rtc/:該目錄下包含了與 RTC 相關的屬性文件和子目錄,提供了一種以文件操作方式訪問 RTC 信息的接口。例如,通過讀取/sys/class/rtc/date文件,可以獲取當前的 RTC 時間;也可以向該文件寫入合適的時間格式來設置 RTC 時間。
  • linux/kernel/time/:這是 Linux 內核時間子系統的源文件目錄,包含了與時間管理相關的內核代碼,如時鐘源、時鐘事件、jiffies 相關處理等代碼文件,是內核實現時間管理機制的重要代碼所在位置。

主要對象和目錄文件總結

Linux 中定時器和時間管理機制涉及大量的數據結構、核心文件和關鍵函數,它們共同協作實現時間跟蹤、定時任務調度等功能。以下按類別整理主要內容:

一、核心數據結構

1. 定時器相關

  • struct timer_list(普通內核定時器)
    定義:include/linux/timer.h
    作用:描述一個基礎定時器,用于毫秒級精度的定時任務。
    核心字段:

    struct timer_list {struct hlist_node entry;       // 哈希表節點(臨時存儲)unsigned long expires;         // 超時時間(jiffies 單位)void (*function)(struct timer_list *);  // 超時回調函數u32 flags;                     // 標志(如 TIMER_IRQSAFE)
    };
    
  • struct hrtimer(高精度定時器)
    定義:include/linux/hrtimer.h
    作用:支持納秒級精度的定時器,用于高精度場景(如音頻處理)。
    核心字段:

    struct hrtimer {struct rb_node node;           // 紅黑樹節點(按到期時間排序)ktime_t expires;               // 超時時間(納秒級,ktime_t 類型)enum hrtimer_mode mode;        // 模式(相對時間/絕對時間)enum hrtimer_restart (*function)(struct hrtimer *);  // 回調函數struct hrtimer_clock_base *base;  // 關聯的時鐘基準
    };
    
  • struct hrtimer_clock_base(高精度定時器時鐘基準)
    定義:include/linux/hrtimer.h
    作用:管理同一時間域(如?CLOCK_MONOTONIC)的所有高精度定時器。
    核心字段:

    struct hrtimer_clock_base {struct rb_root_cached active;  // 紅黑樹(存儲未到期的 hrtimer)ktime_t resolution;            // 時鐘精度(如 1ns)struct hrtimer *next_timer;    // 下一個即將到期的定時器
    };
    

2. 時間源與時鐘事件相關

  • struct clocksource(時鐘源)
    定義:include/linux/clocksource.h
    作用:提供高精度時間計數(如硬件計數器),作為系統時間的基準。
    核心字段:

    struct clocksource {const char *name;        // 時鐘源名稱(如 "arm,armv7-timer")unsigned int rating;     // 評級(越高越優先,最高 500)cycle_t (*read)(struct clocksource *cs);  // 讀取當前計數值u64 mask;                // 計數器位寬掩碼(如 64 位為 0xffffffffffffffff)u32 mult, shift;         // 時間轉換參數(cycle → 納秒)
    };
    
  • struct clock_event_device(時鐘事件設備)
    定義:include/linux/clockchips.h
    作用:提供定時中斷能力(周期性或單次),驅動定時器和調度器。
    核心字段:

    struct clock_event_device {const char *name;        // 設備名稱unsigned int rating;     // 評級int (*set_next_event)(unsigned long evt, struct clock_event_device *ce);  // 設置下一次中斷void (*set_mode)(enum clock_event_mode mode, struct clock_event_device *ce);  // 設置模式(周期/單次)enum clock_event_features features;  // 支持的特性(如周期性觸發)
    };
    

3. 系統時間管理相關

  • struct timekeeper(時間 keeper)
    定義:kernel/time/timekeeping.c(內部結構)
    作用:維護系統時間的核心結構,協調時鐘源與系統時間的同步。
    核心字段:

    struct timekeeper {struct clocksource *clock;  // 當前選中的時鐘源u64 xtime_sec;              // 秒級系統時間(自 epoch 起)u64 nsec;                   // 納秒偏移(0 ~ 1e9-1)ktime_t wall_to_monotonic;  // 實時時間到單調時間的偏移
    };
    
  • jiffies?與?jiffies_64
    定義:include/linux/jiffies.h
    作用:記錄系統啟動后的時鐘節拍數(jiffies?為 32 位,jiffies_64?為 64 位擴展),是普通定時器的時間基準。

二、主要目錄與文件

1. 核心實現目錄

  • kernel/time/:時間管理和定時器的核心實現

    • timer.c:普通定時器(timer_list)的注冊、觸發邏輯。
    • hrtimer.c:高精度定時器(hrtimer)的管理。
    • timekeeping.c:系統時間(xtime)的維護和更新。
    • clocksource.c:時鐘源框架的實現(注冊、選擇等)。
    • clockevents.c:時鐘事件設備的管理(模式設置、中斷觸發等)。
    • tick-common.c:系統滴答(tick)機制的通用邏輯(如周期性中斷處理)。
  • drivers/clocksource/:時鐘源硬件驅動

    • 如?arm_generic_timer.c(ARM 通用定時器驅動)、x86_tsc.c(x86 TSC 定時器驅動)。
  • drivers/rtc/:實時時鐘(RTC)驅動

    • 如?rtc-ds1307.c(常見 RTC 芯片驅動),負責系統斷電后時間的保存。

2. 頭文件目錄

  • include/linux/
    • timer.htimer_list?結構體及普通定時器 API(timer_setup()add_timer()?等)。
    • hrtimer.hhrtimer?結構體及高精度定時器 API(hrtimer_init()hrtimer_start()?等)。
    • clocksource.hclocksource?結構體及時鐘源 API。
    • clockchips.hclock_event_device?結構體及時鐘事件 API。
    • jiffies.hjiffies?相關定義和轉換函數(如?jiffies_to_msecs())。
    • ktime.hktime_t?類型(納秒級時間)及操作函數(如?ktime_set()ktime_get())。

3. 架構相關文件

  • arch/arm/kernel/time.c:ARM 架構的時間初始化(如時鐘源注冊、中斷綁定)。
  • arch/x86/kernel/tsc.c:x86 架構 TSC 時鐘源的實現。

三、關鍵函數

1. 定時器操作函數

  • 普通定時器

    • timer_setup(struct timer_list *timer, void (*func)(struct timer_list *), unsigned int flags):初始化定時器,綁定回調函數。
    • add_timer(struct timer_list *timer):將定時器添加到系統,開始計時。
    • mod_timer(struct timer_list *timer, unsigned long expires):修改定時器的超時時間。
    • del_timer(struct timer_list *timer):刪除定時器,阻止其觸發。
  • 高精度定時器

    • hrtimer_init(struct hrtimer *timer, clockid_t clock_id, enum hrtimer_mode mode):初始化高精度定時器,指定時間域(如?CLOCK_MONOTONIC)和模式。
    • hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode):啟動高精度定時器,設置超時時間(納秒級)。
    • hrtimer_cancel(struct hrtimer *timer):取消高精度定時器。

2. 時鐘源與時鐘事件函數

  • 時鐘源管理

    • clocksource_register(struct clocksource *cs):注冊時鐘源到系統。
    • clocksource_select(void):從已注冊的時鐘源中選擇評級最高的作為當前時鐘源。
    • clocksource_read_time(struct clocksource *cs):讀取時鐘源的當前時間(轉換為納秒)。
  • 時鐘事件設備管理

    • clockevents_register_device(struct clock_event_device *ced):注冊時鐘事件設備。
    • clockevents_config(struct clock_event_device *dev, u32 freq):配置時鐘事件設備的頻率。
    • clockevents_set_mode(struct clock_event_device *dev, enum clock_event_mode mode):設置時鐘事件設備的模式(周期性 / 單次)。

3. 系統時間管理函數

  • ktime_get(void):獲取當前時間(ktime_t?類型,納秒級,基于單調時鐘)。
  • get_jiffies_64(void):安全獲取 64 位?jiffies_64?值。
  • do_gettimeofday(struct timeval *tv):獲取當前系統時間(秒 + 微秒)。
  • update_wall_time(void):在時鐘中斷中更新系統時間(xtime),由時間 keeper 驅動。

4. 中斷與滴答函數

  • tick_init(void):初始化系統滴答(tick)機制,綁定時鐘事件設備到 CPU。
  • tick_handle_periodic(struct clock_event_device *dev):處理周期性滴答中斷,更新?jiffies?并觸發定時器軟中斷。
  • run_timer_softirq(struct softirq_action *h):定時器軟中斷處理函數,執行到期的普通定時器回調。
  • run_hrtimer_softirq(struct softirq_action *h):高精度定時器軟中斷處理函數,執行到期的?hrtimer?回調。

總結

Linux 時間管理機制通過分層設計(硬件驅動 → 框架抽象 → 應用接口)實現了高效的時間跟蹤和定時服務:

  • 數據結構(如?timer_listclocksource)描述了定時器和時間源的屬性;
  • 核心文件(如?kernel/time/timer.cdrivers/clocksource/)實現了底層邏輯;
  • 關鍵函數(如?add_timer()clocksource_register())提供了操作接口。

這些組件共同支撐了從毫秒級到納秒級的定時需求,是內核進程調度、網絡協議、設備驅動等功能的時間基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91158.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91158.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91158.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JDK17 新特性跟學梳理

JDK17 新特性跟學梳理JDK17 背景介紹一、JDK 17對Switch語句的增強二、字符串拼接三、強制轉換四、密封類Sealed Classes五、Record類六、優化空指針異常信息七、ZGC垃圾收集器八、JVM常量API九、重寫Socket底層API十、JDK飛行記錄事件流十一、EdDSA簽名算法十二、隱藏類十三、…

ESP8266 AT 固件

ESP-12E 是一種常見的 ESP8266 模塊&#xff0c;通常帶有 4MB&#xff08;32Mbit&#xff09;閃存&#xff0c;非常適合刷寫 最新版 AT 固件。 ? 適用于 ESP?12E 的 AT 固件推薦 固件來源固件版本特點Espressif 官方v2.2.1.0 (ESP8266 IDF AT)官方最新版&#xff0c;基于 RT…

Node.js(三)之Express

Express 目錄 Express 九、初識Express 9.1 Express簡介 1. 什么是 Express 2. 進一步理解Express 3. Express能做什么 9.2 Express的基本使用 1. 安裝 2. 創建基本的Web服務器 3. 監聽GET請求 4. 監聽POST請求 5. 把內容響應給客戶端 6. 獲取URL中攜帶的查詢參數…

IKAnalyzer分詞插件使用方法

前言 隨著越來越多的大數據網站崛起&#xff0c;特別是一些私人網站都提供了站內搜索&#xff0c;有些人會用elastsearch來實現站內搜索的目的&#xff0c;但是一些小站并沒有那么大的數據提供搜索&#xff0c;在安裝一個 elastsearch 服務未免有點浪費&#xff1f; 因此&#…

ESB 在零售,物流,制造,保險,醫療行業的應用方式

企業服務總線&#xff08;Enterprise Service Bus, ESB&#xff09;是一種基于中間件的集成模式&#xff0c;用于實現不同系統之間的集成與通信。ESB通過標準化接口、消息路由、協議轉換和數據轉換等功能&#xff0c;幫助企業實現系統間的無縫對接&#xff0c;提高業務敏捷性。…

vcsa6.7-重置root密碼

客戶反饋vc無法登錄了&#xff0c;登錄環境一看&#xff0c;報錯如下首先想到是證書到期了&#xff0c;瀏覽器確認&#xff0c;確實是證書到期了準備ssh登錄才發現root密碼忘記了&#xff0c;那就先重置root密碼&#xff0c;1、登錄esxi主機找到vcsa6.7機器關機做快照2、開機到…

C++ 賦值與交換法則

在C中&#xff0c;賦值與交換法則&#xff08;Assignment and Swap Idiom&#xff09;通常指的是在實現類的賦值操作符&#xff08;operator&#xff09;時&#xff0c;結合拷貝構造和交換操作來確保強異常安全保證&#xff08;Strong Exception Safety Guarantee&#xff09;的…

Ambari中文漢化

Ambari-ZH 當前Ambari的漢化版本為2.7.4,漢化采用對該版本的ambari源碼直接修改的方式進行,如有翻譯不當之處,請批評指正 一、使用方法如下&#xff1a; 方式一&#xff1a;直接下載 下載地址&#xff1a;https://github.com/ukayunnuo/Ambari-2.7.x-zh/releases/download/…

表格之固定列和表頭

說明 利用粘性定位實現 列固定 td.fixed {position: sticky;left: 0;z-index: 5;/* 最好指定背景&#xff0c;否則滑動時會顯示下面的列 */background-color: #f8f9fa; }表頭固定 <head><style>.table-container {position: relative;display: flex;overflow: hidd…

React 圖標庫發布到 npm 倉庫

將搭建的 React 圖標庫發布到 npm 倉庫需要經過一系列步驟&#xff0c;包括配置 package.json、構建代碼、注冊 npm 賬號、測試和發布。以下是詳細流程&#xff1a; 1. 準備工作 (1) 確保項目結構完整 圖標庫的典型結構&#xff08;以 Rollup 構建為例&#xff09;&#xff1…

Java學習第八十四部分——HttpClient

目錄 一、前言介紹 二、主要特點 三、功能用法 四、應用場景 五、最佳實踐 六、總結歸納 一、前言介紹 HttpClient 是一個用于發送 HTTP 請求和接收 HTTP 響應的客戶端庫&#xff0c;廣泛應用于 Web 開發、API 調用、微服務通信等場景。 二、主要特點 支持多種HTTP方…

學習筆記-中華心法問答系統的性能提升

1.簡介本周主要任務是自行查找文獻&#xff0c;針對源代碼進行性能提升&#xff0c;主要包括三個方面&#xff1a;預處理&#xff1a;分詞、關鍵詞提取、詞向量生成&#xff1b;文本分析&#xff1a;從多個關鍵詞的詞向量&#xff0c;如何到一句話的語義理解&#xff1b;問題分…

Python爬蟲03_Requests破解百度翻譯

爬取百度翻譯頁面信息 以POST方法發送JSON數據&#xff0c;爬取響應信息&#xff0c;并且需要對響應信息對象類型進行區分。 import requests import json#1.指定url post_url https://fanyi.baidu.com/sug#2.進行UA封裝 headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; …

【C++進階】第8課—紅黑樹封裝map和set

文章目錄1. map和set的源碼及框架分析2. 模擬實現map和set2.1 實現可以復用紅黑樹的框架&#xff0c;支持insert操作2.2 實現迭代器iterator2.2.1 實現迭代器2.2.2 實現迭代器 - -2.2.3 解決key不能修改的問題2.2.4 重載operator[ ]3. 完整代碼3.1 紅黑樹頭文件RBTree.h3.2 mym…

【機器學習深度學習】DeepSpeed框架:高效分布式訓練的開源利器

目錄 前言 一、DeepSpeed 簡介 1.1 定位與目標 1.2 集成生態 二、核心技術解析 2.1 ZeRO&#xff08;Zero Redundancy Optimizer&#xff09; 2.2 顯存優化技術 2.3 推理優化與通信機制 三、DeepSpeed 的優勢與特性總結 四、 典型應用場景 &#x1f9e0; 大模型訓練…

從視覺到現實:掌握計算機視覺技術學習路線的十大步驟

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;【14后&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】今日分享關于計算機視覺技術學習路線方面的相關內容…

DeepSeek MoE 技術解析:模型架構、通信優化與負載均衡

1. MoE 簡介 MoE&#xff08;Mixed Expert Models&#xff09;&#xff0c;混合專家模型。在 Transformer 的 FFN 中&#xff0c;有一個重要的觀察是&#xff0c;其計算過程中的神經元激活是非常稀疏的&#xff0c;在一次計算中只有 90%的輸入激活不到 5%的神經元&#xff0c;…

【Linux】pthread學習筆記

1. 線程基礎(1) 線程創建與終止#include <pthread.h> // 創建線程 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg); // 終止當前線程 void pthread_exit(void *retval); // 等待線程結束 int pthread_joi…

p5.js 從零開始創建 3D 模型,createModel入門指南

點贊 關注 收藏 學會了 如果你已經開始探索 p5.js 的 3D 世界&#xff0c;那么createModel()這個 API 絕對是你需要掌握的強大工具。它允許你創建自定義的 3D 幾何模型&#xff0c;為你的創意提供無限可能。 什么是 createModel ()&#xff1f; createModel() 用于從一個…

react 的 useTransition 、useDeferredValue

useTransition 用于 管理狀態更新的過渡&#xff08;pending&#xff09;狀態&#xff0c;避免因高優先級任務&#xff08;如用戶輸入&#xff09;被低優先級任務&#xff08;如數據獲取或復雜計算&#xff09;阻塞而導致的界面卡頓。 它特別適用于&#xff0c;需要 區分緊急更…