動手寫linux驅動(4)--Apple的學習筆記 一,前言 二,遇到的問題 三,測試效果

一,前言

動手寫linux驅動(3)--Apple的學習筆記已經寫了一個阻塞,現在做一個非阻塞驅動,添加poll。

工程6是用select和poll,多路複用文件數量大,IO頻繁的話用epoll,epoll最大的好處是不會隨着fd數量增多而降低效率。只要epoll爲什麼好那麼多我之前介紹過,網上有很多資料,原因比如用邊沿觸發,只通知一次,IO內存copy方式爲mmap映射等。

工程6源碼上傳在gitee上https://gitee.com/applecai/linux-driver-study

二,遇到的問題

  1. 剛剛寫完select監控讀和寫的app後,top查看性能期望爲0,結果爲100%,查了下原因,因爲我driver在無數據可讀時會阻塞,也支持內容非滿則阻塞。我用select同時監控讀和寫,由於先ioctl清空數據,所以一直可以寫,導致一直在while中運行,沒有機會sleep,纔會看到性能100%。是個bug,對於我的fifo設計的driver,select只能監控同時監控一個,APP代碼改成僅監控讀即可。
  2. timeout.tv_sec需要放在while循環中,FD_ZERO和FD_SET最好也放while中。否則只有第一次timeout設置有效,之後就不設置延遲監控了。

三,測試效果

select的timeout爲5s,在5s內沒有io寫入動作,則休眠,作用top查看性能基本爲0.

# ./applepaper6 /dev/applepaper6
[  519.383704] applepaper is set to zero
start
timeout
start
timeout
start
^C
# ./applepaper6 /dev/applepaper6 &
# [  533.386380] applepaper is set to zero
start
top
Mem: 20684K used, 482772K free, 44K shrd, 0K buff, 1964K cached
CPU:   0% usr   0% sys   0% nic 100% idle   0% io   0% irq   0% sirq
Load average: 0.00 0.00 0.00 1/51 128
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
  128   109 root     R     1500   0%   0% top
  109     1 root     S     1536   0%   0% -sh
    1     0 root     S     1500   0%   0% init
   80     1 root     S     1492   0%   0% /sbin/syslogd -n
   84     1 root     S     1488   0%   0% /sbin/klogd -n
  127   109 root     S      688   0%   0% ./applepaper6 /dev/applepaper6
   49     2 root     IW       0   0%   0% [kworker/0:3-pm]
   60     2 root     IW<      0   0%   0% [kworker/u3:2-xp]
   48     2 root     IW       0   0%   0% [kworker/0:2-eve]
  120     2 root     IW<      0   0%   0% [kworker/u3:3-xp]
   64     2 root     IW       0   0%   0% [kworker/u2:5-rp]
    9     2 root     SW       0   0%   0% [ksoftirqd/0]
   10     2 root     IW       0   0%   0% [rcu_sched]
   61     2 root     IW       0   0%   0% [kworker/u2:2-rp]
    7     2 root     IW       0   0%   0% [kworker/u2:0-rp]
   59     2 root     IW<      0   0%   0% [kworker/u3:1-xp]
   45     2 root     IW       0   0%   0% [kworker/u2:1-rp]
   63     2 root     IW       0   0%   0% [kworker/u2:4-rp]
  119     2 root     IW<      0   0%   0% [kworker/u3:0-xp]
timeout   2 root     IW       0   0%   0% [kworker/u2:6-rp]
start
Mem: 20668K used, 482788K free, 44K shrd, 0K buff, 1964K cached
CPU:   0% usr   0% sys   0% nic  99% idle   0% io   0% irq   0% sirq
Load average: 0.00 0.00 0.00 1/51 128
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
  109     1 root     S     1536   0%   0% -sh
    1     0 root     S     1500   0%   0% init
  128   109 root     R     1500   0%   0% top
   80     1 root     S     1492   0%   0% /sbin/syslogd -n
   84     1 root     S     1488   0%   0% /sbin/klogd -n
  127   109 root     S      688   0%   0% ./applepaper6 /dev/applepaper6
   49     2 root     IW       0   0%   0% [kworker/0:3-eve]
   60     2 root     IW<      0   0%   0% [kworker/u3:2-xp]
   48     2 root     IW       0   0%   0% [kworker/0:2-eve]
  120     2 root     IW<      0   0%   0% [kworker/u3:3-xp]
   64     2 root     IW       0   0%   0% [kworker/u2:5-rp]
    9     2 root     SW       0   0%   0% [ksoftirqd/0]
   10     2 root     IW       0   0%   0% [rcu_sched]
   61     2 root     IW       0   0%   0% [kworker/u2:2-rp]
    7     2 root     IW       0   0%   0% [kworker/u2:0-rp]
   59     2 root     IW<      0   0%   0% [kworker/u3:1-xp]
   45     2 root     IW       0   0%   0% [kworker/u2:1-rp]
   63     2 root     IW       0   0%   0% [kworker/u2:4-fl]
  119     2 root     IW<      0   0%   0% [kworker/u3:0-xp]
timeout   2 root     IW       0   0%   0% [kworker/u2:6-rp]
start

檢查read效果,APP在後臺運行,echo輸入good job後可以通過select識別到並且打印出來。

# ./applepaper6 /dev/applepaper7 &
# [   74.832696] applepaper is set to zero

# echo "timeout
good job!"timeout
# echo "good job!" >/dev/applepaper7timeout

[   89.955800] written 10 bytes,current_len:10
[   89.960137] read 1 bytes,current_len:9
# [   89.966461] read 1 bytes,current_len:8
[   89.970293] read 1 bytes,current_len:7
[   89.974786] read 1 bytes,current_len:6
[   89.978589] read 1 bytes,current_len:5
[   89.982377] read 1 bytes,current_len:4
[   89.986819] read 1 bytes,current_len:3
[   89.990620] read 1 bytes,current_len:2
[   89.995005] read 1 bytes,current_len:1
[   89.998802] read 1 bytes,current_len:0
good job!

# timeout
top
Mem: 20800K used, 482656K free, 44K shrd, 0K buff, 1956K cached
CPU:   9% usr   0% sys   0% nic  90% idle   0% io   0% irq   0% sirq
Load average: 0.03 0.02 0.00 1/52 113
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
  113   109 root     R     1500   0%   9% top
  109     1 root     S     1536   0%   0% -sh
    1     0 root     S     1500   0%   0% init
   80     1 root     S     1492   0%   0% /sbin/syslogd -n
   84     1 root     S     1488   0%   0% /sbin/klogd -n
  112   109 root     S      688   0%   0% ./applepaper6 /dev/applepaper7
   60     2 root     IW<      0   0%   0% [kworker/u3:2-xp]
   49     2 root     IW       0   0%   0% [kworker/0:3-nfs]
   48     2 root     IW       0   0%   0% [kworker/0:2-eve]
   15     2 root     IW       0   0%   0% [kworker/0:1-rcu]
   41     2 root     IW<      0   0%   0% [kworker/u3:0-xp]
   65     2 root     IW       0   0%   0% [kworker/u2:6-rp]
   10     2 root     IW       0   0%   0% [rcu_sched]
   64     2 root     IW       0   0%   0% [kworker/u2:5-rp]
    9     2 root     SW       0   0%   0% [ksoftirqd/0]
   13     2 root     SW       0   0%   0% [kdevtmpfs]
   45     2 root     IW       0   0%   0% [kworker/u2:1-rp]
    7     2 root     IW       0   0%   0% [kworker/u2:0-rp]
   59     2 root     IW<      0   0%   0% [kworker/u3:1-xp]
timeout   2 root     IW<      0   0%   0% [netns]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章