为什么移动鼠标光标会使Windows 95运行得更快?

我在玩Hypnospace Outlaw,一个关于复古主题的操作系统的游戏。这个操作系统有一个奇特的行为,即在加载网页时,晃动鼠标光标会更快地加载网页。

这让我想起了一件事。在我年轻的时候,如果我没有记错的话,Windows 95(如果不是98)有这样一个奇怪的行为,在安装程序时,摆动鼠标光标会使进度加快。这是什么原因造成的?我在谷歌上搜索了一下,没有找到相关的东西。

对不起,我的解释很含糊。

对该问题的评论 (6)

这是因为Windows 95生成事件的方式存在缺陷,而且许多应用程序是事件驱动的。

Windows 95应用程序经常使用异步I/O,也就是说,它们要求执行一些文件操作,如复制,然后告诉操作系统,它们可以进入睡眠状态,直到该操作完成。通过休眠,它们允许其他应用程序运行,而不是无休止地询问文件操作是否已经完成而浪费CPU时间。

由于不完全清楚的原因,但可能是由于低端机器的性能问题,Windows 95倾向于将有关I/O完成的消息捆绑起来,并不立即唤醒应用程序来服务它们。然而,它确实会唤醒用户输入的应用程序,大概是为了保持它的反应速度,当应用程序被唤醒时,它也会处理任何待定的I/O消息。

因此,摇动鼠标会使应用程序更快地处理I/O信息,并更快地安装。这种效果相当明显;如果有合适的鼠标输入,可能需要一个小时才能安装的大型应用程序可以减少到15分钟。

评论(16)

是的,这是一个真实的效果,导致造成一个可衡量的速度,并且可以随意复制。

试着在一台现代机器上用记事本打开一个大文件。该窗口不能是全屏的。当加载时,用鼠标标记所有文本(键盘也可以,只是需要更多的手动技巧)。当仍然按住按钮(并做标记)时,将鼠标向下移动,这样文本就被标记和滚动了。现在比较一下按住鼠标不动和摆动鼠标时的滚动速度。根据你的机器,速度可能会快几倍。

很神奇,不是吗?

它也可以在许多其他程序中查看,记事本只是一个容易复制的例子。这与早期版本的Windows中的多任务工作方式有关。在这里,一切都围绕着消息队列进行。摇动鼠标会导致大量的鼠标移动信息,这反过来又使程序更频繁地被唤醒,并且(取决于它们的结构)每次都会更新它们的状态,再次进入信息循环,给屏幕更新提供时间,从而导致总体上的更快反应。它显示了MS用来使Windows相当灵敏的方法的一瞥,尽管它具有合作线程的性质。

评论(18)

不仅仅是Windows 95,Windows 3.x也是如此,尽管它们的工作方式非常不同。

其他答案谈到了先发制人的多任务处理,所以让'先澄清一下。

Window 3.x使用的是合作式多任务处理,每个应用程序都会释放cpu供其他应用程序使用。 Windows 95使用的是先发制人的多任务处理,每个应用程序都会分配一个时间片。

答案与图形界面的工作方式有关。 在一个windows图形应用程序中,有一个叫做'消息泵&39;的循环。

每一个事件(鼠标移动,窗口被调整大小等)都会被推送到一个队列中。 应用程序负责检查是否有消息在等待,如果有,就把它们拉出来处理。

这时,Windows 3.x是切换到其他应用程序,因为有一个单点,所有的应用程序在哪里去,但这并不适用于windows 95。

真正的情况是,在这两个操作系统上,你需要处理消息循环,但如果你想在后台更新一些东西,比如一个任务、一个显示更新等,你'会设置一个定时器,定时器会以固定的时间间隔在队列中放一条消息。

这些在Windows 95上是比较好的方法,但开发者从Windows 3.x过渡到Windows 3.x需要时间,很多应用程序的结构都是一样的。

由于主要机制是只依靠消息循环,而后台操作是通过定时器消息来完成的,所以移动鼠标会触发很多消息,将应用的优先级提高,唤醒应用,让应用处理后台任务消息。 如果不移动鼠标,定时器消息只能以相当慢的时间间隔读取起来。

最著名的应用是磁盘碎片整理器,操作会等待消息更新图形界面! 所以摇动鼠标会加快碎片整理的速度。

评论(3)

原因是WM_TIMER默认限制为15.6ms的间隔。 如果你用1ms的间隔调用SetTimer(),它仍然会以15.6ms的间隔被调用。 WM_TIMER在Win32应用程序中驱动了很多东西,比如网络数据包处理等。

在Win95上,移动鼠标会导致WM_TIMER事件更频繁地发生。 所以一些应用程序看起来会运行得更快。

15.6ms的值是出于各种原因设置的。 不堵塞事件队列,所以像 "WM_PAINT "这样的东西仍然会经常派发,更重要的是节省电力。 有大量的文章在讨论这个问题。

https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/

评论(1)

微软的Raymond Chen有一个很好的答案在他的博客上

MsgWaitForMultipleObjects功能的一个危险性 在已经有消息等待的情况下调用它 要处理,因为MsgWaitForMultipleObjects。 只有当队列中有新事件时才返回。

他的博客是一个很好的读物

评论(2)

可以说,这是早期基于事件处理循环的软件的一个常见bug,而不是Windows的bug。 如果循环的某些DD-path只处理一个事件,那么每次当两个事件同时产生时,只有一个被处理,另一个被卡住。 移动鼠标会产生更多的传入事件,并重新启动循环。 "鼠标移动&quot。 事件通常是由GUI库处理的,GUI库会正确处理这些事件(即处理队列中的所有此类事件),因此这些事件有助于让循环进行,然后无害地消失。

在手工测试时,这样的bug很容易被忽略,因为测试行为本身就会产生足够的输入事件,从而使bug隐藏起来。

评论(1)

快速回答,通过移动光标,你是在告诉windows你是正在运行的最重要的事件。 当你停止交互时,windows会优先处理其他事件。 因此,即使在前台安装程序,也会优先考虑不太重要的事件。 这个错误在当前的Windows版本中已经不存在了。

评论(0)

Windows pre-NT(Windows 1,2,3,3.11,95,98)是合作式多任务处理与NT'(2000, XP, Vista, 7 & 10)的抢先式多任务处理。

在合作式多任务处理中,前台应用程序必须将控制权让给其他任务。 因此,如果前台应用程序被卡住,整个机器就会冻结。

在抢占式多任务系统中,系统通常有一个硬件中断,通常是一个定时器,以强制让步。

在Windows 95中,键盘和鼠标会产生中断,移动鼠标会导致中断发生,操作系统会对其事件队列进行服务。 这是一种先发制人的多任务处理方式,而不是固定的定时器中断,是你自己在做。

操作系统会在中断时更新屏幕上的状态,然后去服务其他任务。屏幕的更新会让人觉得操作系统的处理速度更快。

编辑 - 1/2 对... 不能预先对Win16应用程序进行多任务处理,因为它使用与Windows 3.1中相同的系统虚拟机(VM)模型来运行Win16应用程序。因此,在运行Win16应用程序时,Windows 95将恢复到一个合作的多任务环境,只要应用程序在执行,就会给它们CPU的独家控制。因此,在混合运行Win16和Win32应用程序的多任务时,真正的抢占式操作是不可能的。

评论(5)