1. 程式人生 > 其它 >20191302 第五章學習

20191302 第五章學習

第五章 定時器及時鐘服務

硬體定時器

  • 定時器是由時鐘源和可程式設計計數器組成的硬體裝置。
  • 時鐘源通常是一個晶體振盪器,會產生週期性電訊號,以精確的頻率驅動計數器。使用一個倒計時值對計數器進行程式設計,每個時鐘訊號減1。當計數減為0時,計數器向CPU生成一個定時器中斷,將計數值重新載入到計數器中,並重復倒計時。
  • 計數器週期稱為定時器刻度,是系統的基本計時單元。

個人計算機定時器

  • 實時時鐘(RTC)
    • RTC由一個小型備用電池供電。即使在個人計算機關機時,它也能連續執行。它用於實時提供時間和日期資訊。當Linux啟動時,它使用RTC更新系統時間變數,以與當前時間保持一致。在所有類Unix系統中,時間變數是一個長整數,包含 從1970年1月1日起經過的秒數。
  • 可程式設計間隔定時器(PIT)
    • PIT是與CPU分離的一個硬體定時器。可對它進行程式設計,以提供以毫秒為單位的定時器刻度。在所有I/O裝置中,PIT可以最高優先 級IRQ0中斷。PIT定時器中斷由Linux核心的定時器中斷處理程式來處理,為系統操作提 供基本的定時單元,例如程序排程、程序間隔定時器和其他許多定時事件。
  • 多核CPU中的本地定時器
    • 在多核CPU中,每個核都是一個獨立的處理器,它有自己的本地定時器,由CPU時鐘驅動。
  • 高解析度定時器
    • 大多數電腦都有一個時間戳定時器(TSC),由系統時鐘驅動。它的內容可通過64位TSC暫存器讀取。由於不同系統主機板的時鐘頻率可能不同,TSC不適合作為實時裝置,但它提供納秒級的定時器解析度。
    • 一些高階個人計算機可能還配備有專用高速定時器,以提供納秒級定時器解析度.

CPU操作

  • 每個CPU都有一個程式計數器(PC),也稱為指令指標(IP),以及一個標誌或狀態暫存器(SR)、一個堆疊指標(SP)和幾個通用暫存器,當PC指向記憶體中要執行的下一條指令時,SR包含CPU的當前狀態,如操作模式、中斷掩碼和條件碼,SP指向當前堆疊棧頂。
  • CPU操作可通過無限迴圈進行建模。

中斷處理

  • 在每條指令執行結束時,如果CPU未處於接受中斷的狀態,即在CPU的狀態暫存器中遮蔽了中斷。它將忽略中斷請求.使其處於掛起狀態,並繼續執行下一條指令。
  • 對於每個中斷,可以程式設計中斷控制器以生成一個唯一編號,叫作中斷向量,標識中斷源。

時鐘服務函式

  • time系統呼叫
    • clock_t times(struct tms *buf);可用於獲取某程序的具體執行時間。它將程序時間儲存在struct tms buf中:
struct tms{
    clock_t tms_utime;	// user mode time
    clock_t	tms_stime;	// system mode time
    clock_t	tms_cutime;	// user time of children
    clock_t	tms_cstime;	// system time of children
};
  • time和date命令
    • date:列印或設定系統日期和時間。
    • time:報告程序在使用者模式和系統模式下的執行時間和總時間。
    • hwclock:查詢並設定硬體時鐘(RTC),也可以通過BIOS來完成。

間隔定時器

  • 間隔定時器的值用以下結構體(在<sys/time.h>中)定義:
struct itimerval {
    struct timeval it_inteirval; 
    struct timeval it_value; 
};
struct timeval (
    time_t tv_sec;
    suseconds_t tv_usec;	
);

實踐

  • 程式碼
#include <stdio.h>
#include <time.h>

time_t start,end;

int main()
{
        int i;
        start = time(NULL);
        printf("start = %ld\n",start);
        for(i=0;i<123456;i++);
        end = time(NULL);
        printf("end =%ld time=%ld\n", end, end-start);
}
  • 輸出列印開始時間、結束時間以及從開始到結束的秒數。