Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 是否安排了系统调用?_Windows_System Calls - Fatal编程技术网

Windows 是否安排了系统调用?

Windows 是否安排了系统调用?,windows,system-calls,Windows,System Calls,当用户进程调用“系统调用”并且CPU切换到监控模式时,哪个系统进程负责执行系统调用 系统调用是否由线程调度程序调度(CPU是否可以在收到中断后切换到执行另一个系统调用)?哪个系统进程负责执行系统调用? 系统调用包装器(您为执行系统调用而调用的函数,是的,它只是一个包装器,而不是实际的系统调用)将获取参数,将它们传递到相应的寄存器(或在堆栈上,取决于实现),然后它将把您请求的系统调用号放入eax(假设为x86)最后将调用INT 0x80汇编指令,它基本上是告诉操作系统它收到了一个中断,这个中断是一

当用户进程调用“系统调用”并且CPU切换到监控模式时,哪个系统进程负责执行系统调用


系统调用是否由线程调度程序调度(CPU是否可以在收到中断后切换到执行另一个系统调用)?

哪个系统进程负责执行系统调用?
系统调用包装器(您为执行系统调用而调用的函数,是的,它只是一个包装器,而不是实际的系统调用)将获取参数,将它们传递到相应的寄存器(或在堆栈上,取决于实现),然后它将把您请求的系统调用号放入
eax
(假设为x86)最后将调用
INT 0x80
汇编指令,它基本上是告诉操作系统它收到了一个中断,这个中断是一个需要服务的系统调用,要服务的系统调用在
eax
中可用,参数在寄存器中

(现代实现停止使用
INT
,因为它在性能上很昂贵,现在使用
SYSENTER
SYSEXIT
;但上述情况仍然几乎相同)

从调度器的角度来看,执行系统调用与否没有区别;问题是,一旦您向操作系统请求服务(通过x86指令
INT
SYSENTER
SYSEXIT
),CPU模式标志将更改为特权集,那么内核将代表您的进程执行您请求的任务,一旦完成,它设置回标志并将执行返回到下一条指令。

因此,从调度程序的角度来看,当您执行系统调用或其他任何操作时,操作系统将看不到任何差异

注意事项:
-我上面提到的只是一个一般性的描述,我不确定Windows是否应用了这个功能,但如果它不应用,它应该会做类似的事情。
-许多系统调用执行阻塞任务(如I/O处理);如果进程请求阻塞系统调用,为了提高CPU利用率,调度程序将让进程在等待队列中等待,直到它请求的内容就绪,同时其他进程在CPU上运行,但不要将其与任何内容混淆,操作系统没有“调度系统调用”

调度器的任务是组织任务,从它的角度来看,系统调用只是进程正在执行的一个例程


最后要注意的是,一些系统调用是原子的,这意味着它们应该在不中断执行的情况下执行,这些系统调用如果被中断,将在中断原因结束后被要求重新启动执行;不过,这与日程安排的概念相去甚远。

第一个问题:视情况而定。一些系统调用转到已经作为进程运行的服务(例如网络调用)。一些系统调用会导致创建一个新进程,然后安排执行

最后一个问题:是的,windows是一个多处理系统。进程调度器处理线程何时运行、运行多长时间,以及硬件中断最终可能导致正在运行的进程释放CPU或空闲进程(硬件现在已准备好获取CPU)


在windows中(至少>Win 7,但我认为在过去也是如此),许多系统服务都运行在名为svchost的进程中。从sys内部查看正在运行的是processexplorer,这是一个很好的应用程序。它就像类固醇上的任务管理器,将向您显示给定进程拥有的所有线程。对于更细粒度的“我调用了这个dos命令发生了什么”详细信息,您可能希望使用一个调试工具,以便逐步完成调用。一般来说,尽管您不必关心这些事情,但您进行了一次系统调用,系统知道您不准备继续处理,直到处理该请求的任何进程返回为止。您的请求可能会在您的进程释放CPU后立即获得CPU,它可能会在2天后获得CPU,但就操作系统而言(或您的程序而言),这并不重要,除非您正在运行多线程,否则执行会停止并等待结果,然后会变得非常复杂。

“一些系统调用转到已经在运行的服务…”但这是由IPC在系统调用例程中完成的,该例程在启动系统调用的同一进程上运行,但在内核模式下,是吗?