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