目前分類:kernel (2)

瀏覽方式: 標題列表 簡短摘要

udelay & mdelay

driver常常會需要很短且精準的delay(n microsecond/millisecond),以完成sync。此時用jiffies就不恰當,第一單位不夠小,如果timer是100Hz,表示一個tick是10 millisecond。第二不夠準,因為透過scheduler。在kernel裡有兩個function來完成很小的delay,不使用jiffies:

在<linux/delay.h>

void udelay(unsigned long usecs)
void mdelay(unsigned long msecs)

兩個都是busy waiting。udelay的實作要先談BogoMIPS,這個值是指在特定時間內CPU可執行多少個busy loop operation。也就是說,這個CPU不做任何事可以多快 (how fast a processor can do nothing)。這個值在kernel裡是一個叫做loops_per_jiffy的變數,在userspace則可在/proc/cpuinfo裡找到。而kernel是在init/main.c裡透過calibrate_delay()這個function來計算。值得一提的是這個值是跟performance沒太大關係的。

kezeodsnx 發表在 痞客邦 留言(0) 人氣()

原文: Sleeping in the Kernel

在多處理器(SMP)和hyperthreading的時代,sleep_on()這個function已經無法保證其可靠性了。以下為讓一個process安全以及跨平台的sleep方式。

Linux kernel有好些時候一個process會需要wait,直到某些事情發生,或是process需要醒來做一些事情。

使用schedule()

ready-to-run的process是放在run queue裡,其state是TASK_RUNNING。當一個process的timeslice結束,scheduler就從這個queue裡挑另一個process,並把CPU allocate給他。這是用完CPU的case。

kezeodsnx 發表在 痞客邦 留言(1) 人氣()