【问题标题】:Which takes longer time? Switching between the user & kernel modes or switching between two processes?哪个需要更长的时间?在用户模式和内核模式之间切换或在两个进程之间切换?
【发布时间】:2013-01-07 22:10:20
【问题描述】:

哪个需要更长的时间?

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

请解释原因。

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

【问题讨论】:

  • 这对我来说听起来像是一个家庭作业问题......
  • 不是真的......我正在为我的硕士入学考试学习:)
  • 较新的处理器优化了sysenter/exit 指令,以实现更快的用户/内核切换。进程之间的上下文切换也意味着切换页表和刷新缓存和 TLB。
  • 好吧,我认为,由于内核有助于从一个进程切换到下一个进程,因此答案可能相当明显。毕竟,您需要从用户空间切换到内核模式,以便调度程序(它是内核的一部分)进行控制,然后,在它做出决定之后,您可以在新进程中从内核切换到用户空间。 .. 因此,从进程切换到进程的时间可能至少是用户到内核的两倍,至少在一般情况下是这样……
  • 嗯,看起来是错误的假设。这不像用户代码启动从进程到进程的切换。然后开关本身可能是系统调用中阻塞的进程,即已经在内核模式下运行。

标签: process kernel


【解决方案1】:

在进程之间切换(假设您实际切换,而不是并行运行它们)按天啊。

从用户空间到内核空间的捕获过去常常通过处理器中断来完成。大约在 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 状态信息已经增长到大于页面大小,在这种情况下,他们可能已经更改了实现.

【讨论】:

  • 好吧,如果你想在内核中完成任何事情,你仍然需要保存用户进程的状态。不过,IIRC 通常会设置虚拟内存,以便可以从每个进程的页表访问内核页表,这样在从进程到内核然后再返回同一个进程时,不会使 TLB 无效。由于使 TLB 失效几乎会破坏缓存中任何虚拟标记的条目,我认为这就是为什么在进程之间切换比切换到内核并再次切换回来要昂贵得多的真正原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
相关资源
最近更新 更多