当用户进程调用“系统调用”并且CPU切换到管理员模式时,哪个系统进程负责执行系统调用?
系统调用是否由线程调度程序调度(CPU可以在获得中断后切换到执行另一个系统调用)?
答案 0 :(得分:2)
哪个系统进程负责执行系统调用?
系统调用包装器(你调用它执行系统调用的函数,是的它只是一个包装器,而不是实际的系统调用)将获取参数,将它们传递给approperiate寄存器(或堆栈,取决于实现),接下来它将你要求的系统调用号放在eax
(假设为x86),最后将调用INT 0x80
汇编指令,这基本上告诉操作系统它收到了一个中断,这个中断是系统调用需要提供服务,eax
中可以使用哪个系统调用服务,参数位于寄存器中。
(现代实现已停止使用INT
,因为它的性能很高,现在使用SYSENTER
和SYSEXIT
;但上面的内容仍然几乎相同)
从调度程序的角度来看,如果你执行系统调用没有任何区别;问题是,一旦你向操作系统询问服务(通过x86指令INT
或SYSENTER
和SYSEXIT
),CPU模式标志将更改为特权集,那么内核将代表您的流程执行您要求的任务,一旦完成,它会将标志设置回来并将执行返回到下一条指令。
因此,从调度程序的角度来看,操作系统在执行系统调用或其他任何操作时都没有区别。
几句注意事项:
- 我上面提到的是一般性描述,我不确定Windows是否适用,但如果不适用,它应该采取类似的方式。
- 许多系统调用执行阻塞任务(如I / O处理);如果你的进程要求阻塞系统调用,为了提高CPU利用率,调度程序将让你的进程在等待队列中等待,直到它请求准备就绪,同时在CPU上运行其他进程但不要把它与任何东西混淆,操作系统没有“安排系统调用”。
调度程序的任务是组织任务,从它的角度来看,系统调用只是进程正在执行的例程。
最后一点,一些系统调用是原子的,这意味着它们应该在没有任何执行中断的情况下执行,如果中断,这些系统调用将被要求在中断原因结束后重新开始执行;这仍远不是调度概念。
答案 1 :(得分:0)
第一个问题:这取决于。某些系统调用将作为进程转到已经运行的服务(例如网络调用)。某些系统调用会导致创建新进程,然后安排执行。
最后一个问题:是的Windows是一个多处理系统。进程调度程序处理线程运行的时间,持续时间以及硬件中断最终导致正在运行的进程释放CPU或硬件现在已准备好进入CPU的空闲进程。
在windows中(至少> Win 7,但我认为过去也是如此)很多系统服务在名为svchost的进程中运行。查看正在运行的内容的一个很好的应用程序是来自sys内部的Process Explorer。它类似于类固醇的任务管理器,并将向您显示给定进程拥有的所有线程。对于更细粒度的"我称这个dos命令发生了什么"详细信息您可能想要使用调试工具来逐步调用您的电话。通常,虽然您不必关心这些事情,但您进行系统调用,系统知道您已准备好继续处理,直到处理该请求的任何进程返回为止。您的请求可能会在您的进程发布之后立即获得CPU,它可能会在2天后获得CPU但是就操作系统而言(或者您的程序应该关注)它并不重要,执行停止并等待除非你运行多线程,否则它会变得非常复杂。