# Timers and Time Management
# Timer Implementation
kernel 用 Bottom half-- softirq的方法實作timer
* timer interrupt戳進來後,timer interrupt handler runs update_process_times(), which calls run_local_timers():




local_softirq_pending()會跟 1UL |後根據傳下來的softirq enum值看要往左shift多少來判斷是哪種softirq

多CPU環境下需要取得目前是在哪顆CPU上

最好把softirq拉成pending等待處理
# Delaying Execution
Often, kernel code (especially drivers) needs a way to delay execution for some time without using **timers** or a **bottom-half** mechanism.This is usually to enable hardware time to complete a given task
**Busy Looping**
爛方法,不要用

**等待時schedule給其他人**

jiffies 不能保證在迴圈裡他的值一直保持不變,因為這個值is incremented elsewhere, 系統需要保證每次存取他都是正確的值,所以要使用volatile.
volatile
The volatile keyword instructs the compiler to reload the variable on each access from main memory and never alias the variable’s value in a register, guaranteeing that the previous loop completes as expected.
# Small Delays
Sometimes, kernel code (again, usually drivers) requires short (smaller than a clock tick) and rather precise delays.This is often to synchronize with hardware, which again usually lists some minimum time for an activity to complete—often less than a millisecond.
* 用jiffies-based delays會太不準
* timer interrupt
* 100Hz, clock tick rate = 10 millisecond
* 1000Hz = 1 millisecond
* Kernel 提供3種更精確的delay,不用jiffies的
* void udelay(unsigned long usecs)
* void ndelay(unsigned long nsecs)
* void mdelay(unsigned long msecs)

