2012-01-28 62 views
4

考虑进程keventd。它花费在内核模式下的所有生命周期。 现在,据我所知,当进程从内核模式切换到用户模式时,Linux会检查上下文切换是否到期,并且据我所知,keventd不会从内核模式切换到用户模式,所以, Linux内核将如何知道何时关闭它?Linux中的上下文切换内核进程

回答

4

如果内核分别做像你说的,只有检查的过程是否是由于上一个明确的用户到内核模式过渡到切换出来,那么下面的循环会锁定您的计算机的核心:

while (1); 

显然,这在正常的桌面操作系统上不会发生。原因是抢占,其中一个进程运行了其时间片后,内核会收到警报,进入并强制切换上下文(如有必要)。

抢占可能在内核进程原理工作过。但是,我不知道那是什么keventd做 - 这更可能是其主动放弃定期的时间片(见sched_yield,一个用户空间的呼吁效果相同),特别是因为内核可以被配置为不抢占。这是一个核心进程的特权。

+0

而(1)将切换到内核模式的每scheduler_tick(),所以内核就会发现,这一进程的时间片已经结束,而它在内核模式,并会尽P-> need_resched = 1,并同时努力切换到用户模式,它会调用schedule().. – Shmoopy 2012-01-28 17:00:26

+0

@Shmoopy正确!我没有从你原来的帖子中得到,你明白当程序没有进行系统调用时会发生隐式的内核模式转换,所以我澄清了。我会在我的答案中加上“显式”一词。当然,即使你在内核空间时,'scheduler_tick'仍然会触发,并且你可以有没有tick的内核...... – Borealid 2012-01-28 17:02:07

+0

对于keventd(或者任何内核进程)仍然会有调用scheduler_tick(),但是什么scheduler_tick确实(除其他外)是:if(! - p-> time_slice){p-> need_recsched = 1},所以我的问题是,如果没有kernel-to-内核进程的用户转换(在我们的例子中是keventd)。 – Shmoopy 2012-01-28 17:07:34