今天我的老板和我正在讨论我写的一些代码。我的代码从给定的HTTP / HTTPS链接下载3个文件。我有多线程下载,以便所有3个文件同时下载3个独立的线程。在这次讨论中,我的老板告诉我,代码将被发送给最有可能运行旧硬件和软件的人(我说的是Windows 2000)。
在此之前,我从未考虑过线程应用程序如何在旧硬件上扩展。我意识到,如果CPU只有1个内核,则线程无用,甚至可能会使性能恶化。我一直在想这个下载任务是否是I / O操作。这意味着,如果API被阻止等待来自HTTP / HTTPS服务器的信息,是否会同时安排另一个想要进行计算的线程?较旧的操作系统是否会进行此类调度?
他说的另一件事:由于代码将在旧机器上运行,我的应用程序不应该吃CPU。他说在CPU密集型任务之后使用Sleep()
调用来允许其他程序有一些喘息空间。现在我总是觉得在任何程序中使用Sleep()
都很糟糕。我错了吗?何时使用Sleep()
对齐?
感谢您的期待!
答案 0 :(得分:6)
我一直在想这个下载任务是否是I / O操作。 这意味着,如果API被阻止等待来自的信息 HTTP / HTTPS服务器,将是另一个想要做一些的线程 同时安排计算?较旧的操作系统是否会进行此类调度?
是的,他们这样做。这是阻止IO的笑话。线程被挂起并且其他计算(线程)发生,直到事件唤醒被阻塞的线程。这就是为什么将它分成线程甚至是单核心机器而不是在单个线程中自己在下载之间做一些穷人调度是完全合理的。
当然,您的下载会对带宽产生影响,因此线程无法加快下载速度: - )
他说的另一件事:因为代码将在旧版本上运行 机器,我的应用程序不应该吃CPU。他说用睡眠() 在CPU密集型任务之后调用以允许其他程序呼吸 空间。
实际上在完成任务后使用睡眠对这里没有帮助。在进行计算之前,经过一段时间的计算(做一些时间切片)后进行睡眠可能有所帮助。但这仅适用于协作系统(例如Windows 3.11)。这对于抢占式系统不起作用,其中调度程序使用时间分片来为线程分配计算时间。在这里考虑降低CPU密集型任务的优先级以便为其他任务提供优先权更为重要......
现在我总是觉得使用Sleep()很糟糕 在任何程序中。我错了吗?什么时候使用Sleep()对齐?
这实际上取决于你在做什么。如果你实现忙碌等待设置的某个标志,可能在几秒钟后设置,最好重新检查它是否在睡眠一段时间后设置为了放弃你的预定时间片而不是仅仅通过固定CPU功率检查标志永远不会被设置。
在现代系统中,在计算中引入Sleep是没有意义的,因为它只会减慢计算速度。
调度受操作系统调度程序的约束。他就是那个“大局观”的人。在我看来,“做得更好”的每一种方法只在特定应用程序的范围内有效,在这种应用程序中,您可以对调度程序不明显的某些关系进行概述。
附录: 我做了一些研究,发现Windows支持Windows 95的抢占式多任务处理。 Windows NT系列(Windows 2000所属)始终支持抢占式多任务处理。