2

如果我们在就绪队列中有三个进程 P1、P2、P3。假设时间片是 4 秒,P1 有 2 秒的 CPU 突发,然后它有 5 秒的 I/O 突发。现在 CPU 将执行 P1 2 秒,这里有两种情况

  1. CPU 会给 P1 2 秒,因为时间片是 4 秒,所以 CPU 会记住 P1 已经消耗了 2 秒,并且当它从 I/O 返回下一次 CPU 突发时,将给 P1 2 秒而不是 4 秒时间片?(如果下一个 CPU 爆发时间大于 2 秒)

  2. CPU会给P1 2秒,因为它的CPU突发已经结束并且它已经自愿离开CPU并且已经进行了I/O突发,所以CPU不必记住任何东西,当它从I/O返回时它会给定 4 秒的时间片,但这里有一个问题....假设 P1 有 5 秒的 CPU 突发。CPU 给 P1 4 秒并将其移动到队列的尾部,当它的 P1 再次轮到它时,它给它 1 秒,因为它还有 1 秒的 CPU 突发,它会去 I/O,现在 CPU 会记住它已经消耗了 1 秒的时间片,每当它从 I/O 返回时,都会给它 3 秒,但这不是相同的场景吗?P1 有 4 秒的时间片,它消耗 1 并且 CPU 突发结束,它自愿离开 CPU 与上述情况相同并进行 I/O,CPU 不应该记住它' 从 I/O 返回后只给出 3 秒?在这种情况下,CPU 在任何情况下都不必记住任何内容,并且当每个进程从 I/O 返回时会给它 4 秒的时间。

哪个场景是正确的?你可以解释吗 ?

4

1 回答 1

2

简短的回答: 当 P1 返回时给它 4 秒是有道理的,但这取决于操作系统的设计。可以给它 17 秒,但这与循环赛无关。

长答案: 让我们从最基本的场景开始:没有 I/O。每个进程有 4 秒的时间跳舞,直到轮到下一个进程。这是直到一个人完成跳舞,所以只有其余的过程被轮流进行。

现在,向它添加 I/O,但假设 I/O 永远不会忙并且总是即时的。从 I/O 读取使用 CPU 时间。所以进程 1 开始跳舞 2 秒,然后使用 I/O 2 秒。然后 CPU 说 FREEZE!进程 2 开始跳舞。在下一个 P1 回合,它会读取 I/O 4 秒,而在最后一回合它只会消耗 1 秒,然后说 I'M DONE!所以它会退出舞厅。

现在让我们看一下 I/O 可能很忙的场景。进程 1 开始跳舞两秒钟,然后想从 I/O 读取,但它很忙!所以它交叉双臂,等待他剩下的两秒钟什么都不做。然后 CPU 在进程 2 上工作,然后在进程 3 上工作,然后返回到 1。I/O 还没有准备好再过 1 秒,所以进程 1 仍然等待那一秒,然后开始使用它 3 秒。等等。

现在这种“等待 3 秒”很糟糕,因为这意味着 CPU 在处理其余进程时没有做任何事情。为了避免这种情况,事情有点不同:进程 1 开始跳舞两秒钟,然后说“我什么都做不了,只能等到 I/O 准备好”。所以 CPU 说“没有问题,我告诉你它什么时候准备好”,然后进入下一个进程,让 P1 只跳了 2 秒。并在 2 和 3 上工作,直到它被 I/O 中断:“READY BOSS”。此时它将控制权交给 P1,它使用 I/O 4 秒,然后算法一如既往地继续。

现在这是我能想到的最简单的实现。你能写下 P1 因为等待而没有使用的时间,然后在它可以运行时给它更多时间来补偿它吗?嗯,是的,你可以。循环赛与它并没有太大关系。更多的是关于你决定如何处理你的干扰。

如果两个进程需要 I/O 会发生什么?好吧,那么他们都可以被搁置。

于 2013-12-31T18:55:15.297 回答