系统调用和上下文切换

问题描述 投票:41回答:2

很抱歉在提出这个问题时提出了这个问题,但我无法从他们中弄清楚。所以我问以下相关问题,以获取系统调用(模式切换)和上下文切换之间的区别

  • 为什么说当系统调用上下文时,系统调用不需要上下文切换通话过程必须保存然后重新加载。仅仅是因为根据上下文切换的定义,必须切换到另一个进程。

  • 这是什么意思,当进行系统调用时,内核将在“用户上下文”中执行。

  • 根据Wikipedia文章:http://en.wikipedia.org/wiki/Context_switch

上下文切换对于系统调用不是必需的,但它取决于操作系统,并且在系统调用期间可能会发生上下文切换。我想知道在系统调用时发生上下文切换时会发生什么情况。有例子吗?

process operating-system system-calls context-switch
2个回答
74
投票

您需要了解,线程/进程上下文有多个部分,一个部分与执行直接相关,并保存在CPU和CPU使用的内存中的某些系统表(例如页表)中,另一部分是OS所需的,用于簿记的(考虑各种ID,句柄,特定于OS的特殊权限,网络连接等)。

一个完整的上下文切换将涉及到这两个交换,旧的当前线程/进程消失了一段时间,而新的当前线程/进程进入了一段时间。这就是线程/进程调度的本质。

现在,系统调用与现在完全不同彼此。

考虑一些简单的事情,例如,系统调用用于请求当前日期和时间。 CPU从用户模式切换到内核模式,保留用户模式寄存器的值,执行一些内核代码以获取必要的数据,将其存储在调用者可以访问的存储器或寄存器中,恢复用户模式寄存器的值,并返回。这里没有太多上下文切换,只需要模式,用户和内核之间的转换所需的内容。

现在考虑一个系统调用,该调用涉及阻塞呼叫者,直到发生某些事件或数据可用为止。操作互斥锁和读取文件将是此类系统调用的示例。在这种情况下,内核将被迫保存调用者的完整上下文,将其标记为已阻止,以便调度程序在该事件或数据到达之前无法运行它,并加载另一个就绪线程/进程的上下文,以便它可以运行。

这就是系统调用与上下文切换相关的方式。

在用户或进程的上下文中执行的内核意味着,每当内核确实代表某个进程或用户工作时,它都必须考虑该用户/进程的上下文,例如:当前进程/线程/用户ID,当前目录,语言环境,各种资源(例如文件)的访问权限以及所有这些内容,不同进程/线程/用户之间可能会有所不同。

如果进程具有单独的地址空间,则地址空间也是进程上下文的一部分。因此,当内核需要访问某个进程的内存(以读取/写入文件数据或网络数据包)时,它必须有权访问该进程的地址空间IOW,它必须位于其上下文中(而不是但是,这意味着内核必须加载整个上下文才能访问特定地址空间中的内存。]

有帮助吗?


-2
投票

当用户只想访问仅适用于内核模式的内容时发生模式切换

© www.soinside.com 2019 - 2024. All rights reserved.