File io 当然,调度程序不是';这不是有害的吗?Don';难道我们没有更好的API吗?

File io 当然,调度程序不是';这不是有害的吗?Don';难道我们没有更好的API吗?,file-io,io,operating-system,scheduling,File Io,Io,Operating System,Scheduling,我想知道有哪些API可以避免以下问题 回想我以前的CS课程中的操作系统课程,主题是多进程调度和并发I/O。以下是讲师给出的示例: 两个过程,X和Y有一些工作要做。有一个处理器/总线/任何东西,调度器在X和Y之间分配时间片,很自然,如下所示: X得到时间片1 Y获得时间片2 X得到时间片3 这被描述为“公平”,但在我看来,这是极不公平的。考虑这个方案下的两个案例 如果X和Y都需要10秒,那么现在都需要20秒 如果X需要10秒,Y需要100秒,那么X需要20秒,Y需要110秒 如果调度器只

我想知道有哪些API可以避免以下问题

回想我以前的CS课程中的操作系统课程,主题是多进程调度和并发I/O。以下是讲师给出的示例:

两个过程,X和Y有一些工作要做。有一个处理器/总线/任何东西,调度器在X和Y之间分配时间片,很自然,如下所示:

  • X得到时间片1
  • Y获得时间片2
  • X得到时间片3
这被描述为“公平”,但在我看来,这是极不公平的。考虑这个方案下的两个案例

  • 如果X和Y都需要10秒,那么现在都需要20秒

  • 如果X需要10秒,Y需要100秒,那么X需要20秒,Y需要110秒

如果调度器只是简单地“全部执行X,然后全部执行Y”,那么在第一种情况下,X将花费10秒,Y将花费20秒;在第二种情况下,X取10,y取110

一个不让任何人生活得更好,让任何人生活得更糟的制度怎么会是一个好主意?唯一有利于“公平”系统的论点是,如果我们在任何一个X之前完成了所有Y,那么一个小任务X将被一个大任务Y延迟,我们需要让这两个任务都“响应”

对于第二种情况,我认为自然的“最佳”方式是说“X比Y小10倍,因此如果没有任何明确的偏好,它应该得到Y的10倍的时间片”。(这有点像给行人让路给汽车,理由是行人对道路的压力较小,但我离题了。)在这个方案下,X在11秒内完成,Y在110秒内完成。现实世界的后果:我的mp3加载和播放没有明显的额外延迟,即使大量的文件拷贝发生在后台

显然,有一整套可用的策略,我不想争论任何一种策略的适用性,我的观点是:所有这些策略都需要了解工作的规模。

那么,是否有操作系统API(Linux,甚至Windows)允许用户指定操作所需工作量的提示

(注意,您可以声称磁盘I/O隐式地包含了这一点,但
而(not_done){read_chunk();}
会使它变得毫无意义——我所想到的那种API会在文件打开时指定兆字节,在线程创建时指定时钟周期,或者沿着这些行指定一些东西。)

唯一有利于“公平”系统的论点是,如果我们在任何一个X之前完成了所有Y,那么一个小任务X将被一个大任务Y延迟,我们需要让这两个任务都“响应”

这正是理由。公平调度是公平的,因为它倾向于在请求它的进程之间平均分配计算时间,因此延迟

那么,是否有操作系统API(Linux,甚至Windows)允许用户指定操作所需工作量的提示

批处理系统可以做到这一点,但正如您自己总结的那样,这需要了解手头的任务。Unix/Linux具有
nice
命令,该命令赋予进程较低的优先级;让多任务机器上的任何长时间运行、CPU受限的进程都是“好”的,这样就不会占用短时间和交互式任务<代码>ionice对IO优先级执行相同的操作


(此外,自20世纪70年代初以来,Unix调度器动态地提高了进程的优先级,这些进程不会“吃掉”它们的片,因此交互进程具有较高的CPU优先级,并保持响应速度,而CPU受限的进程不会阻碍一切。请参阅Thompson和Ritchie关于Unix的早期论文。)

在普通操作系统中,您通常不关心任务的延迟,但您会尝试最大化吞吐量-在110秒内X和Y都将完成,周期为。当然,有些进程可以是交互式的,因此操作系统需要额外的进程间上下文切换开销,以保持并行计算的假象

正如您所说,任何缩短任务完成时间的策略都需要知道需要多长时间。如果任务不仅仅是复制一个文件,这通常是一个问题——这就是为什么有时某些应用程序中的进度条会达到99%,并停留在那里一段时间,只做最后几件事

然而,在实时操作系统中,在任务必须完成之前,您通常必须知道任务的最坏情况执行时间或某个截止日期,然后您有义务提供此类“提示”。然后,调度器必须执行更智能的调度(此外,如果包含一些锁或依赖项),在多处理器上,该过程有时是NP完全的(然后调度器使用一些启发式)


我建议您阅读一些关于RTOS、最早截止日期优先调度和速率单调调度的内容。

如果所有任务都表示在运行到完成之前没有价值的工作,那么最好的方法是按一定顺序运行所有作业,以便将其他事情(或人员)的成本降至最低不得不等他们。在实践中,许多任务代表一系列操作,这些操作可能有一些单独的值,因此,如果两个任务每个都需要10秒,那么在10秒的时间内完成一半任务可能比完成一个任务而一个任务甚至没有启动要好。这一点尤其适用于正在生成由另一台机器执行的下游过程所需的数据的任务,并且当下游过程接收到的数据多于其处理的数据时,它将能够执行有用的工作。如果工作的一部分需要向一个人展示一些有用的事情正在实际发生,这在某种程度上也是正确的。观看公共关系的用户