哪个需要更长的时间?
在用户和内核模式之间切换(或)在两个进程之间切换?
也请说明原因。
编辑:我知道每当有上下文切换时,调度程序需要一些时间来保存其 PCB 中前一个进程的状态,然后从其相应的 PCB 重新加载下一个进程。对于用户模式和内核模式之间的切换,我知道必须更改模式位。这不是全部,还是还有更多?
按 oh-my-god 的顺序在进程之间切换(假设您实际切换,而不是并行运行它们)。
从用户空间到内核空间的捕获过去常常通过处理器中断来完成。大约在 2005 年(不记得内核版本),在邮件列表上进行讨论后,有人发现高端至强处理器上的捕获速度比早期的 Pentium II 或 III 上的捕获速度更慢(绝对衡量!)(再次,我的记忆),他们用一个新的 cpu 指令实现了它sysenter
(我认为它实际上是从 Pentium Pro 开始存在的)。这是在每个进程的虚拟动态共享对象 (vdso) 页面中完成的(通过 cat /proc/pid/maps 找到它)IIRC。
因此,如今,内核陷阱基本上只是几个 cpu 指令,因此与使用中断时的几十万或几十万相比(这在现代 CPU 上真的很慢),周期相当少。
进程之间的上下文切换很繁重。这意味着将所有处理器状态(寄存器等)存储到 RAM 中(实际上是在用户进程空间中的一个神奇内存位置,猜猜在哪里!),实际上会弄脏 cpu 中的所有缓存内存,并读回新的进程状态过程。与上次运行时相比,它(很可能)在 cpu 缓存中仍然没有任何内容,因此每次内存读取都将是缓存未命中,需要从 RAM 中读取。这个比较慢。当我在大学的时候,我“发明”了(好吧,我确实想出了这个主意,因为我知道 CPU 中有很多染料,但如果它不断供电就不够酷)一个无限大小的缓存,尽管没有供电在 CPU 中未使用(仅用于上下文切换,即)时,并在 Simics 中实现。实现了对我在 Linux 中称为 CARD(上下文切换活动,运行时昏昏欲睡)的魔法缓存的支持,并进行了相当多的基准测试。我发现它可以加速一台有许多繁重进程的 Linux 机器,它们共享同一个内核,大约 5%。不过,这是在相对较短(低延迟)的处理时间片上。
反正。上下文切换仍然很繁重,而内核陷阱基本上是免费的。
对于每个进程,回答用户空间中的哪个内存位置:
在地址零。是的,空指针!无论如何,您都无法从用户空间读取整个页面 :) 这可以追溯到 2005 年,但现在可能是一样的,除非 CPU 状态信息已经增长到大于页面大小,在这种情况下,他们可能已经更改了实现.