我很抱歉在已经问过这个问题时问这个问题,但我无法从他们那里得到澄清。所以我问以下相关问题来了解系统调用(模式切换)和上下文切换之间的区别
为什么说系统调用不需要上下文切换,而调用过程的上下文必须保存然后重新加载。是不是因为根据上下文切换的定义,必须切换到另一个进程。
当进行系统调用时,内核在“用户上下文”中执行是什么意思。
系统调用不需要上下文切换,但它取决于操作系统,并且在系统调用期间可能会发生上下文切换。我想知道在系统调用时发生上下文切换的情况下会发生什么。有什么例子吗?
我很抱歉在已经问过这个问题时问这个问题,但我无法从他们那里得到澄清。所以我问以下相关问题来了解系统调用(模式切换)和上下文切换之间的区别
为什么说系统调用不需要上下文切换,而调用过程的上下文必须保存然后重新加载。是不是因为根据上下文切换的定义,必须切换到另一个进程。
当进行系统调用时,内核在“用户上下文”中执行是什么意思。
系统调用不需要上下文切换,但它取决于操作系统,并且在系统调用期间可能会发生上下文切换。我想知道在系统调用时发生上下文切换的情况下会发生什么。有什么例子吗?
您需要了解线程/进程上下文有多个部分,一个与执行直接相关并保存在 CPU 和 CPU 使用的内存中的某些系统表(例如页表)中,另一个是用于操作系统,用于记账(考虑各种 ID、句柄、特定于操作系统的特殊权限、网络连接等)。
完整的上下文切换将涉及交换这两者,旧的当前线程/进程会消失一段时间,而新的当前线程/进程会进入一段时间。这就是线程/进程调度的本质。
现在,系统调用彼此非常不同。
考虑一些简单的事情,例如,请求当前日期和时间的系统调用。CPU 从用户模式切换到内核模式,保留用户模式寄存器的值,执行一些内核代码以获取必要的数据,将其存储在内存或调用者可以访问的寄存器中,恢复用户模式寄存器的值和返回。这里没有太多的上下文切换,只有模式、用户和内核之间转换所需的内容。
现在考虑一个系统调用,它涉及阻塞调用者直到某些事件或数据可用。操作互斥锁和读取文件就是此类系统调用的示例。在这种情况下,内核被迫保存调用者的完整上下文,将其标记为阻塞,以便调度程序在该事件或数据到达之前无法运行它,并加载另一个就绪线程/进程的上下文,以便它可以运行.
这就是系统调用与上下文切换的关系。
内核在用户或进程的上下文中执行意味着每当内核代表某个进程或用户工作时,它必须考虑用户/进程的上下文,例如当前进程/线程/用户 ID,当前目录,语言环境,各种资源(例如文件)的访问权限,所有这些东西,在不同的进程/线程/用户之间可能是不同的。
如果进程有单独的地址空间,地址空间也是进程上下文的一部分。因此,当内核需要访问一个进程的内存(读/写文件数据或网络数据包)时,它必须有权访问进程的地址空间,IOW,它必须在它的上下文中(它没有然而,这意味着内核必须加载完整的上下文才能访问特定地址空间中的内存)。
这有帮助吗?
mode switch occurs when a user only wants to access things which are only suitable to a kernel mode