哪个需要更长的时间?在用户和用户之间切换内核模式还是在两个进程之间切换?

时间:2013-01-07 22:10:21

标签: process kernel

需要更长的时间?

在用户和用户之间切换内核模式(或)在两个进程之间切换?

请解释原因。

编辑:我知道每当有上下文切换时,调度员需要一些时间将前一个进程的状态保存在其PCB中,然后从其重新加载下一个进程相应的PCB。为了在用户和内核模式之间切换,我知道必须更改模式位。不是全部,还是还有更多呢?

1 个答案:

答案 0 :(得分:6)

按照我神的命令切换进程(假设您实际切换,而不是并行运行)。

从用户空间到内核空间的捕获过去曾经过处理器中断。大约在2005年(不记得内核版本),在对邮件列表进行讨论后,有人发现高端至强处理器上的陷阱(绝对措施!)而不是早期的奔腾II或III(再次,我的记忆),他们使用新的cpu指令sysenter实现它(我认为自Pentium Pro以来它实际存在)。这是在每个进程的虚拟动态共享对象(vdso)页面中完成的(cat / proc / pid / maps查找它)IIRC。

所以,现在,内核陷阱基本上只是几个cpu指令,因此相比十分之几或几十万次使用中断(在现代CPU上真的很慢)。

进程之间的上下文切换很重。这意味着将所有处理器状态(寄存器等)存储到RAM中(实际上在用户进程空间中的魔术存储位置,猜测在哪里!),实际上弄脏了cpu中的所有缓存内存,并回读新的进程状态处理。从上次运行开始,它(可能)在cpu缓存中仍然没有任何内容,因此每次读取内存都将是缓存未命中,需要从RAM中读取。这很慢。当我在大学时,我“发明了”(好吧,我确实提出了这个想法,知道CPU中有足够的染料,但如果它不断供电则不够酷)一个无限大小的缓存虽然没有动力当在CPU中使用时(仅用于上下文切换),并在Simics中实现。实现了对这个神奇缓存的支持我在Linux中称为CARD(Context-switch Active,Run-time Drowsy),并且进行了相当大的基准测试。我发现它可以加速Linux机器,其中许多繁重的进程共享相同的核心,大约5%。但这是在相对较短(低延迟)的处理时间片上。

反正。上下文切换仍然非常繁重,而内核陷阱基本上是免费的。

回答每个进程在用户空间中的内存位置:

  

地址为零。是的,空指针!你无法从用户空间读取整个页面:)这是在2005年,但现在可能是相同的,除非CPU状态信息增长大于页面大小,在这种情况下,他们可能已经改变了实现