首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统调用和上下文切换

系统调用和上下文切换
EN

Stack Overflow用户
提问于 2012-02-11 06:27:15
回答 2查看 30.3K关注 0票数 56

很抱歉,我已经问过这个问题了,但我无法从他们那里弄清楚。因此,我提出以下相关问题,以了解系统调用(模式切换)和上下文切换之间的区别。

  • 为什么说,当进行调用的进程的上下文必须保存并重新加载时,系统调用不需要上下文切换。这仅仅是因为根据上下文切换的定义,必须切换到另一个进程。context".
  • According
  • ,这意味着当进行系统调用时,内核执行的是"user

to the wikipedia:http://en.wikipedia.org/wiki/Context_switch“。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-11 08:37:25

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

一个完整的上下文切换将涉及交换这两种情况,旧的当前线程/进程会消失一段时间,而新的当前线程/进程会出现一段时间。这是线程/进程调度的本质。

现在,系统调用与w.r.t非常不同。彼此。

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

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

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

在用户或进程上下文中执行的内核意味着,每当内核代表某个进程或用户工作时,它必须考虑到该用户/进程的上下文,例如当前进程/线程/用户ID、当前目录、区域设置、对各种资源的访问权限(例如文件),所有这些内容在不同进程/线程/用户之间可能有所不同。

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

这有用吗?

票数 99
EN

Stack Overflow用户

发布于 2017-09-01 07:33:03

当用户只想访问只适用于内核模式的东西时,就会发生模式切换。

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9238326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档