一个过程可以要求 x 时间量,但取而代之的是 y 时间量吗?

Can a process ask for x amount of time but take y amount instead?

如果我是运行一组进程,它们都需要这些突发时间:分别为 3、5、2,总的预期执行时间为 10 个时间单位。

其中一个进程是否可能占用比他们要求的更多的资源?例如,尽管它要求输入 3,但它却输入了 11,因为它正在等待用户输入一些内容。所以总的执行时间是18.

这一切都是在非抢占式 cpu 调度程序中完成的。

现实情况是,软件不知道任何事情需要多长时间 - 我的 CPU 运行 与你的 CPU 的 "nominal speed" 不同,我们的 CPUs 出于电源管理的原因不断改变它们的速度,我们的 CPUs 执行的软件速度受到其他 CPUs 正在做的事情的影响(特别是 SMT/hyper-threading) 以及其他设备当时正在做什么(它们对缓存的影响、共享 RAM 带宽等);并且软件无法预测未来(例如,猜测 IRQ 何时会发生并花费一些时间并打乱缓存内容,猜测从内存读取的时间将花费 10 倍的时间,因为 ECC 需要更正单个位错误,猜测 CPU 什么时候会变热并降低速度以避免熔化等)。可以记录 "start time, burst time and end time" 之类的事情(以生成可以分析的过去的历史数据),但通常这些事情只能在与现实无关的虚构学术练习中看到。

注意:我并不是说编造的学术练习不好——它是一个有用的工具,可以帮助您在学习更高级(和更现实的)理论之前学习基础理论。

相反;对于非抢占式调度程序,任务不会尝试告诉调度程序他们认为他们可能需要多少时间 - 任务无法知道此信息并且调度程序无法对该信息执行任何操作(例如,非抢占式当任务花费的时间比它猜测的可能花费的时间长时,调度程序无法抢占该任务)。对于非抢占式调度程序;一个任务简单地 运行s 直到它调用一个等待某些东西的内核函数(例如 read() 等待来自磁盘或网络的数据, sleep() 等待时间过去,等等)和当发生这种情况时,被调用的内核函数最终会告诉调度程序该任务正在等待并且不需要 CPU,并且调度程序会找到与 运行 不同的任务,该任务可以使用 CPU;如果任务从不调用等待某事的内核函数,那么任务 运行s "forever".

当然 "the task runs forever" 可能很糟糕(不仅对于故意占用所有 CPU 时间作为拒绝服务攻击的恶意代码,而且对于有错误的正常任务也是如此),这是为什么(几乎?)没有人使用非抢占式调度程序。例如;如果一个(优先级较低的)任务正在进行大量繁重的处理(例如,花费数小时使用光线追踪技术生成照片般逼真的图片)而另一个(优先级较高的)任务停止等待(例如,因为它正在等待用户按下键并且用户确实按下了一个键)然后你希望更高优先级的任务抢占较低优先级的任务"immediately"(例如,因为大多数用户不喜欢软件需要数小时才能响应他们的操作)。