You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
内核的核心位置,kernel/exit.c 中,她完成了这么一件事情,把一个普通的进程转换成为了精灵进程,不过<br />
此<br />
处咱们可以不去深究精灵进程的原理,甚至咱们可以认为这句话没有做任何事情,只是从此之后咱们ps命令<br />
一看能够看到有一个叫做usb-storage 的进程.比如下面所看到的:<br />
localhost:~ # ps -el<br />
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD<br />
4 S 0 1 0 0 76 0 - 195 - ? 00:00:02 init<br />
1 S 0 2 1 0 -40 - - 0 migrat ? 00:00:00 migration/0<br />
1 S 0 3 1 0 94 19 - 0 ks<strong>of</strong>ti ? 00:00:00 ks<strong>of</strong>tirqd/0<br />
1 S 0 18 1 0 70 -5 - 0 worker ? 00:00:00 events/0<br />
1 S 0 26 1 0 71 -5 - 0 worker ? 00:00:00 khelper<br />
113<br />
1 S 0 27 1 0 70 -5 - 0 worker ? 00:00:00 kthread<br />
1 S 0 45 27 0 72 -5 - 0 worker ? 00:00:00 kacpid<br />
1 S 0 229 27 0 80 0 - 0 pdflus ? 00:00:00 pdflush<br />
1 S 0 230 27 0 75 0 - 0 pdflus ? 00:00:00 pdflush<br />
1 S 0 231 1 0 76 0 - 0 kswapd ? 00:00:00 kswapd0<br />
1 S 0 961 27 0 70 -5 - 0 scsi_e ? 00:00:00 scsi_eh_0<br />
1 S 0 1033 27 0 70 -5 - 0 scsi_e ? 00:00:00 scsi_eh_1<br />
1 S 0 1045 27 0 71 -5 - 0 scsi_e ? 00:00:00 scsi_eh_2<br />
1 S 0 1047 27 0 70 -5 - 0 worker ? 00:00:00 scsi_wq_2<br />
5 S 0 1262 1 0 72 -4 - 1774 - ? 00:00:02 udevd<br />
1 S 0 1939 27 0 70 -5 - 0 hub_th ? 00:00:00 khubd<br />
1 S 0 7804 27 0 70 -5 - 0 scsi_e ? 00:00:00 scsi_eh_3<br />
1 S 0 7805 27 0 70 -5 - 0 - ? 00:00:00 usb-storage<br />
4 S 0 13905 13902 0 75 0 - 2430 wait pts/1 00:00:00 bash<br />
0 R 0 19098 13905 0 77 0 - 821 - pts/1 00:00:00 ps<br />
显然,您在终端按ctrl-c 是不可能中止这个usb-storage 进程的.这是精灵进程诸多特性中的一个,她运<br />
行于后台.试一下kill -9 加进程号,看你能杀死她不?(系统崩溃了我可不负责哦...)<br />
294行,这里为目前的进程设置一个flag,PF_NOFREEZE,在整个内核代码中,这个flag 也只出现过几次.<br />
这个flag 是与电源管理相关的,2.6 的内核为了实现与Windows 相似的一个功能,Hibernate,也就是"冬<br />
眠",(别说您不知道,Windows 关机选项里面有"关机","重启","注销","Stand by",以及"Hibernate").在<br />
内核编译菜单里面,Power managerment options 中,有一个选项S<strong>of</strong>tware Suspend,也就是内核编译<br />
选项中的CONFIG_SOFTWARE_SUSPEND,选择了她使得机器可以被suspended.显然咱们不用care<br />
她. 但是这里之所以要设置这个flag,是因为suspend 要求把内存里的冬冬写到磁盘上,而一个进程设置了<br />
这个flag 就表明它在suspend 的时候不会被冻住,用行话来讲就是,they’re not refrigerated during a<br />
suspend.freeze 就是冷冻,冻住的意思,过去分词frozen 是形容词,冻结的,冰冻的,其实就是让进程睡眠.<br />
所以总的来说,这里的做法就是说,即使系统suspend 了,这个进程,或者准确地说,这个内核线程,也不应该<br />
进入睡眠.<br />
要执行这两个操作需要执行lock_kernel()/unlock_kernel()这一对函数.然后299 行,执行complete<br />
唤醒前面那节的父进程.而子进程并不退出,她继续行走,她无怨无悔的行走,只不过余秋雨先生是为追寻人<br />
类文明足迹而进行的域外旅程,而此处子进程(执)行的她对内核的守护.她像天使一般,守护着心爱的人.<br />
于是咱们也继续跟着她行走,299 行, complete(&(us->notify)),这正是和刚才在父进程里看到的那句<br />
使进程进入睡眠的wait_for_completion(&(us->notify))相对应,这里自然是唤醒父进程,我们先继续看