今天在“top”發現一個events/0行程CPU資源佔很高
如下所示

top - 14:31:02 up 14 min,  3 users,  load average: 1.61, 0.78, 0.42
Tasks: 167 total,   1 running, 166 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.6%us, 26.1%sy,  0.0%ni, 61.6%id,  0.0%wa,  7.8%hi,  2.0%si,  0.0%st
Mem:   1799980k total,   599020k used,  1200960k free,    62808k buffers
Swap:   860152k total,        0k used,   860152k free,   312400k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    9 root      20   0     0    0    0 S   44  0.0   0:04.01 events/0
  723 syslog    20   0 35560 1896 1040 S   20  0.1   0:10.70 rsyslogd
 1103 root      20   0 45328  16m 8516 S   15  0.9   0:24.77 Xorg
 3071 kenneth   20   0 91996  46m  29m S   11  2.6   0:02.43 vlc
 1254 kenneth   20   0 40796  14m  10m S    5  0.8   0:01.04 gnome-panel
 1387 kenneth   20   0 49620  13m  10m S    5  0.8   0:00.26 clock-applet
 1477 root      20   0  8664 1688 1140 S    3  0.1   0:00.40 nmbd
 3069 root      20   0  2548 1212  904 R    1  0.1   0:00.26 top
 1255 kenneth   20   0 53464  23m 7768 S    0  1.3   0:03.79 compiz
    1 root      20   0  2812 1644 1192 S    0  0.1   0:00.43 init
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd

 

網上貌似很少對它的描述,總結一下《Linux內核設計與實現》中的內容(page87)。

 

我們都知道中斷的底半部機制有三種:軟中斷、tasklet和工作隊列。其中軟中斷很少使用,內核中只有網路在使用,它的延時是最小的。

tasklet是軟中斷的一個應用,所有執行緒註冊的tasklet都會順序被執行。因此tasklet的執行環境是軟中斷上下文,所以不能阻塞或者睡眠。一般情況下,tasklet的延遲也很小,可以滿足大部分需求。

要是底半部中可能睡眠,那麼只好使用工作隊列了。工作隊列其實是把要做的底半部的函數交給內核的專門執行緒去調用。這樣工作隊列就運行於執行緒環境了, 不怕睡眠。當然,睡眠會影響註冊到同一執行緒的其它底半部的執行,但不會引起大的問題。每個CPU都有一個執行緒(events/n,n是編號)負責執行工作 佇列,第一個CPU的執行緒是events/0,如果是雙核的,還會有一個events/1執行緒。

 

我的程式使用了工作隊列,所以每次執行都會多出一個events/0(第一個CPU上工作執行緒)

而我在 工作隊列 呼叫的函示裡面有udelay() 去等待硬體執行完成..

在Linux Driver開發中,經常要用到延遲函數:msleep,mdelay/udelay.

雖然msleep和mdelay都有延遲的作用,但他們是有區別的.

mdeday還忙等待函數,在延遲過程中無法運行其他任務.這個延遲的時間是準確的.是需要等待多少時間就會真正等待多少時間.而msleep是休 眠函數,它不涉及忙等待.你如果是msleep(10),那實際上延遲的時間,大部分時候是要多於10ms的,是個不定的時間值.

所以應該改用 msleep ... 或用信號量 去等硬體做完

 

 

 

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()