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

Process 哪个需要更长的时间?在用户和;内核模式还是在两个进程之间切换?,process,kernel,Process,Kernel,哪一个需要更长的时间? 在用户和内核模式之间切换(或)在两个进程之间切换 请解释一下原因 编辑:我知道,每当有上下文切换时,调度程序都需要一些时间将上一个进程的状态保存在其PCB中,然后从相应的PCB重新加载下一个进程。为了在用户模式和内核模式之间切换,我知道模式位必须改变。这不是全部,还是更多 在进程之间切换(假设您实际切换,而不是并行运行它们),这是上帝的命令 以前,从用户空间到内核空间的捕获通常是通过处理器中断完成的。大约在2005年(不记得内核版本),在邮件列表上讨论过有人发现高端xeo

哪一个需要更长的时间?

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

请解释一下原因


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

在进程之间切换(假设您实际切换,而不是并行运行它们),这是上帝的命令

以前,从用户空间到内核空间的捕获通常是通过处理器中断完成的。大约在2005年(不记得内核版本),在邮件列表上讨论过有人发现高端xeon处理器的捕获速度比早期的奔腾II或III(同样是我的内存)要慢(绝对测量!),之后,他们用新的cpu指令
syscenter
(我认为这实际上是从奔腾Pro开始就存在的)。这是在每个进程(cat/proc/pid/maps)IIRC的虚拟动态共享对象(vdso)页面中完成的

因此,如今,内核陷阱基本上只是几个cpu指令,因此与使用中断时的十分之一或几十万个周期(在现代cpu上非常慢)相比,周期很少

进程之间的上下文切换非常繁重。这意味着将所有处理器状态(寄存器等)存储到RAM中(实际上在用户进程空间中的一个神奇内存位置,猜猜在哪里!),实际上会弄脏cpu中的所有缓存内存,并为新进程读回进程状态。这(可能)上一次运行时,cpu缓存中没有任何内容,因此每次读取的内存都会丢失缓存,需要从RAM中读取。这相当慢。我在大学时,就“发明了”(我确实想出了这个主意,知道cpu中有大量染料,但如果持续通电,就不够酷)一种在CPU中未使用时(仅用于上下文开关,即)无电源但大小无限的缓存,并在Simics中实现。实现了对这种神奇缓存的支持,我称之为CARD(上下文开关处于活动状态,运行时昏昏欲睡)在Linux中,我发现它可以加速一台Linux机器,因为它有很多重进程共享同一个内核,大约5%。不过,这是在相对较短(低延迟)的进程时间片上实现的

无论如何,上下文切换仍然很重,而内核陷阱基本上是免费的

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

在地址0处。是的,空指针!无论如何,您无法从用户空间读取整个页面:)这是2005年的事,但现在可能是一样的,除非CPU状态信息增长超过页面大小,在这种情况下,他们可能更改了实现


对我来说,这听起来像是一个家庭作业问题…不是真的。。我正在为我的硕士入学考试学习:)较新的处理器优化了
sysenter/exit
指令,以实现更快的用户/内核切换。进程之间的上下文切换还意味着切换页表、刷新缓存和TLB。好吧,我认为,因为内核是促进从一个进程切换到下一个进程的工具,所以答案可能相当明显。毕竟,您需要从用户区切换到内核模式,调度器(内核的一部分)才能控制,然后,在它做出决定后,您就可以在新的进程中从内核切换到用户区。。。所以将进程切换到进程可能需要至少两倍于用户到内核的时间,至少在一般情况下……嗯,看起来是错误的假设。这不像是用户代码启动从一个进程到另一个进程的切换。然后,开关本身可能会被系统调用中阻塞的进程阻塞,即已经在内核模式下运行。好吧,如果您想在内核中完成任何事情,您仍然需要保存用户进程的状态。不过IIRC通常会设置虚拟内存,以便可以从每个进程的页表访问内核页表,这样在从一个进程到另一个内核再返回到同一个进程时不会使TLB无效。由于使TLB无效几乎会破坏缓存中任何虚拟标记的条目,我想这就是为什么在进程之间切换比切换到内核再切换回来要昂贵得多的真正原因。