很抱歉,我已经问过这个问题了,但我无法从他们那里弄清楚。因此,我提出以下相关问题,以了解系统调用(模式切换)和上下文切换之间的区别。
to the wikipedia:http://en.wikipedia.org/wiki/Context_switch“。
系统调用不需要上下文切换,但它取决于操作系统,在系统调用期间可能会发生上下文切换。我想知道当上下文切换发生在系统调用时会发生什么情况。有什么例子吗?
发布于 2012-02-11 08:37:25
您需要理解的是,线程/进程上下文有多个部分,一个与执行直接相关,并保存在CPU和CPU使用的某些系统表中(例如页表),另一个部分保存在操作系统所需的簿记中(想想各种in、句柄、特定于操作系统的权限、网络连接等等)。
一个完整的上下文切换将涉及交换这两种情况,旧的当前线程/进程会消失一段时间,而新的当前线程/进程会出现一段时间。这是线程/进程调度的本质。
现在,系统调用与w.r.t非常不同。彼此。
考虑一些简单的东西,例如,系统调用请求当前日期和时间。CPU从用户切换到内核模式,保留用户模式寄存器值,执行一些内核代码以获取必要的数据,将其存储在内存或调用者可以访问的寄存器中,恢复用户模式寄存器值并返回。这里没有太多的上下文切换,只有在模式、用户和内核之间进行转换所需的内容。
现在考虑一个涉及阻塞调用方的系统调用,直到某个事件或数据可用为止。操作互斥和读取文件就是这种系统调用的例子。在这种情况下,内核被迫保存调用方的完整上下文,将其标记为阻塞,以便调度程序在该事件或数据到达之前无法运行它,并加载另一个就绪线程/进程的上下文,以便它能够运行。
这就是系统调用是如何与上下文切换相关的。
在用户或进程上下文中执行的内核意味着,每当内核代表某个进程或用户工作时,它必须考虑到该用户/进程的上下文,例如当前进程/线程/用户ID、当前目录、区域设置、对各种资源的访问权限(例如文件),所有这些内容在不同进程/线程/用户之间可能有所不同。
如果进程有单独的地址空间,则地址空间也是进程上下文的一部分。因此,当内核需要访问进程的内存(读取/写入文件数据或网络数据包)时,它必须访问进程的地址空间IOW,它必须位于其上下文中(但是,这并不意味着内核必须加载完整的上下文才能访问特定地址空间中的内存)。
这有用吗?
发布于 2017-09-01 07:33:03
当用户只想访问只适用于内核模式的东西时,就会发生模式切换。
https://stackoverflow.com/questions/9238326
复制相似问题