如果我正在运行一组进程,并且它们都想要这些突发时间:分别为3、5、2,那么预期的总执行时间为10个时间单位。
其中一个流程是否有可能占用比他们要求的更多的资源?例如,即使它要求输入3,也要花11个,因为它正在等待用户输入一些输入。因此,总执行时间为18。
所有操作都是在非抢占式CPU调度程序中完成的。
答案 0 :(得分:0)
现实是软件不知道任何事情需要花费多长时间-我的CPU以与您的CPU不同的“标称速度”运行,由于电源管理的原因,我们的两个CPU都在不断改变其速度,而由CPU执行的软件的速度我们的CPU都受其他CPU正在执行的操作(尤其是SMT /超线程)和当时其他设备正在执行的操作(它们对缓存,共享RAM带宽的影响等)的影响;并且软件无法预测未来(例如,猜测何时会出现IRQ并花一些时间破坏缓存内容,猜测何时从内存中读取会花费10倍的时间,因为需要纠正ECC的原因只有一个位错误,猜测CPU何时变热并降低其速度以避免熔化等)。可以记录诸如“开始时间,爆发时间和结束时间”之类的事情(以生成可以分析的过去的历史数据),但是通常这些事情只能在与之无关的虚假学术练习中看到现实。
注意:我并不是说虚假的学术练习是不好的-这是在学习更高级(更现实)的理论之前帮助学习基础理论的有用工具。
相反;对于非抢占式调度程序,任务不要试图告诉调度器他们认为可能花费多少时间-任务无法知道此信息,并且调度器无法对该信息做任何事情(例如,非抢占式调度程序)计划程序无法花费比预期更长的时间就无法抢占该任务)。对于非抢占式调度程序;一个任务一直运行直到它调用等待某事的内核函数(例如,read()
等待磁盘或网络中的数据,sleep()
等待时间过去,等等),以及何时发生内核被调用的函数最终告诉调度程序该任务正在等待并且不需要CPU,并且调度程序会找到另一个可以使用CPU的任务来运行。如果任务从不调用等待功能的内核函数,则该任务将“永远”运行。
当然,“任务永远运行”可能是不好的(不仅对于故意将所有CPU时间浪费为拒绝服务攻击的恶意代码,而且对于具有错误的正常任务也是如此),这就是为什么(几乎?)没有人使用非抢占式调度程序。例如;如果一项(较低优先级)任务正在进行大量的处理(例如,花费大量时间使用光线跟踪技术生成逼真的图片),而另一项(较高优先级)任务停止等待(例如,因为它正在等待用户按键,而用户确实按下了一个键),那么您希望优先级较高的任务“立即”抢占优先级较低的任务(例如,因为大多数用户不喜欢软件花费数小时来响应其操作)。>