由于 Windows 是多任务操作系统,它必须以某种方式在进程之间切换。但是它是如何做到的呢?Windows 是否在正在运行的程序中包含某种断点,这些断点应该切换到其他进程?因为当程序执行时,它会控制 CPU。因此,要启用多任务操作系统必须在程序中包含一些中断指令。我说得对吗?
答案1
不,程序不会完全控制 CPU。如果是这样,那么其他东西也会停止工作,比如键盘、鼠标、硬盘等。
有中断线连接到 CPU,当有信息从设备传入时,它会通知 CPU。例如,按键会引发中断信号,从而停止当前执行并启动中断处理程序。
还有一个作为设备连接的内部计时器,因此操作系统可以设置计时器以特定速率产生中断信号。这样,操作系统就可以始终以特定的间隔从正在运行的进程中收回控制权。
处理中断的通常过程是,中断处理程序完成后,控制权返回到正在运行的程序,但进程调度程序可以保存一个进程的状态,恢复不同的进程,并让中断处理程序返回到该进程。
调度程序还有其他机会在进程之间切换。例如,当程序进行系统调用以执行磁盘 I/O 时,调度程序会让 I/O 请求传递到硬件,并将进程保存在等待状态。当磁盘准备好返回数据时,它会发送中断,因此调度程序可以切换回等待数据的进程。
(我曾经编写过一个程序,它实际上完全控制了计算机并禁用了所有中断。我必须自己编写键盘和鼠标输入处理程序,并且在这种状态下磁盘 I/O 根本不起作用。)
答案2
不是。操作系统(以及一般的线程)由调度程序根据需要将 CPU 时间分配给各个线程(和进程);调度程序可以根据需要将 CPU 从进程中抽离出来。
答案3
不,它是通过使用硬件功能在计时器或其他事件上将控制权交还给内核来实现的。
您描述的是“协作式多任务处理”,即编写应用程序以定期将控制权交还给操作系统。虽然应用程序在等待用户输入、网络或磁盘操作完成时会遇到这种情况,但像 Windows 这样的操作系统也可以同时运行两个不等待任何操作的应用程序。
硬件有中断,可将控制权交给在启动期间设置的内核中的特定代码位。然后内核决定下一步将控制权交给什么;这是调度程序的工作。