為什麼移動滑鼠會讓作業系統跑得更快?

2021-09-27 13:30:39 字數 2426 閱讀 7582

有人在 stack overflow 上問了乙個問題

在玩 hypnospace outlaw(催眠帝國的法外狂徒)這款遊戲時,我發現移動滑鼠會讓網頁載入得更快。

這讓我想起了年輕時候用過的 windows 95,在安裝程式時通過移動滑鼠可以加快安裝速度。這是為什麼?我在谷歌上搜尋,但找不到相關的資訊。

以下是使用者的回答

回答一

這跟 windows 95 生成事件的方式有關。很多應用程式是基於事件驅動的。

windows 95 應用程式通常會使用非同步 io,比如在請求檔案操作(例如拷貝檔案)時,它會告訴作業系統,然後進入 sleep 狀態,直到檔案操作結束。乙個程式在進入 sleep 狀態後,作業系統就把 cpu 讓給其他應用程式,而不是一直空等浪費 cpu 時間。

具體原因也不是百分百清楚,但可能是因為 windows 95 為了解決低配電腦的效能問題對 io 事件進行」囤積「,即**一系列事件,而不是有事件了就立即喚醒相應的程式。不過,可能是出於響應速度方面的考慮,作業系統一定會喚醒與使用者輸入有關的程式。

所以,移動滑鼠會導致應用程式更快地處理 io 事件,從而加快了安裝速度。這種效果是很明顯的,安裝乙個大型的應用程式可能需要乙個小時,但如果在安裝過程中不斷移動滑鼠,可以把安裝時間降到 15 分鐘。

回答二

移動滑鼠確實可以達到加快速度的效果,而且可以隨意重現。

使用 notepad 開啟乙個大型檔案,但不要全屏。在載入檔案時,使用滑鼠標記文字。在保持按住滑鼠左鍵的同時下移滑鼠,這樣就可以標記更多的文字,而且滾動條會隨著滑鼠滾動。比較滑鼠靜止和移動滑鼠時的速度,你會發現移動滑鼠時速度會更快,具體取決於你的電腦。

很神奇,對吧?

其他應用程式也能重現這樣的效果,只是 notepad 更容易重現。這與早期版本 windows 多工處理機制有關。作業系統把事件訊息放在佇列裡,不斷移動滑鼠會生成很多事件訊息,這樣就可以頻繁喚醒應用程式進行狀態更新,重新進入事件迴圈,從而有更多時間用於螢幕重新整理,讓整體的反應速度變快。

回答三不僅僅是 windows 95, windows 3.x 也會這樣,雖然原理不太一樣。

有人提到了預分配多工機制,所以這裡先澄清一點:

windows 3.x 使用的是協作多工機制,每個應用程式都會釋放 cpu 給其他應用程式。windows 95 使用的是預分配多工機制,即每個應用程式預先分配了 cpu 時間。

這個與圖形介面有關:windows 圖形介面應用程式有乙個事件迴圈,叫作」訊息幫浦「:

每個事件(滑鼠移動、縮放視窗,等等)都被推送到乙個訊息佇列中。應用程式負責檢查佇列中是否有等待的訊息,如果有,就把它們拉出來處理掉。

而 windows 3.x 在這個時候會切換到其他應用程式,因為所有的應用程式都想進入這個點,但在 windows 95 上不是這樣的。

這兩個作業系統都需要處理訊息迴圈,如果你想要在後台更新一些東西,比如乙個任務或重新整理螢幕,需要設定乙個定時器,定時器會定時往訊息佇列中推送訊息。

windows 95 的處理機制會更好一些,但從 windows 3.x 過渡到 windows 95 需要時間,所以很多應用程式仍然使用了相同的結構。

因為主要的處理機制仍然依賴於訊息迴圈,而且後台操作也是通過定時器訊息來完成的,隨意不斷移動滑鼠會觸發更多的事件訊息,把應用程式的優先順序提高了,在喚醒應用程式後就可以讓它處理後台的任務訊息。如果滑鼠不動,讀取定時器訊息的間隔會很長。

在這方面最具代表性的是 windows 磁碟碎片整理程式,磁碟整理操作會等待更新影象介面的訊息被處理掉,所以不斷移動滑鼠會加快碎片整理速度。

回答四

主要是因為 wm_timer 預設被限制在了 15.6 毫秒。即使你在呼叫 settimer() 時傳給它的是 1 毫秒,它仍然會使用 15.6 毫秒。

在 windows 95 上移動滑鼠會更頻繁地觸發 wm_timer 事件,所以應用程式執行得更快。

設定 15.6 毫秒這個限制是有原因的:這樣不會阻塞事件佇列,可以頻繁進行 wm_paint,更重要的是可以節能。有很多文章提到了這個,比如這篇:

回答五

可以說,這個問題在早期基於事件迴圈的軟體系統上是很常見的,並不是 window 的 bug。如果事件迴圈每次只處理乙個事件,當同時生成兩個事件時,只有乙個事件會被處理,另乙個會被阻塞。不斷移動滑鼠會生成更多的事件,這樣就可以重新進入迴圈。滑鼠移動事件通常是由專門的 gui 庫負責處理的,這些事件被用來重啟迴圈,然後丟掉。

在進行手動測試時很容易就把這個 bug 忽略掉了,因為測試本身會生成足夠多的事件,無法發現這個 bug。

回答六

簡單地說就是:你通過移動滑鼠告訴作業系統當前的應用程式事件是最重要的。如果滑鼠停止移動,作業系統就會把優先順序分配給其他事件。所以,即使是在安裝程式,作業系統也有可能把優先順序分配給不重要的事件。不過,這個 bug 在後續的 windows 版本中已經不存在了。

為什麼需要作業系統

對於乙個程式而言,它為了保障自己的程式執行流暢,勢必就會要求自己分配到的資源越多越好,但是計算機的資源總是有限的,大家都自顧自搶資源的話,要麼就是大家一起跑不動,要麼就是某幾個程式把別的程式的資源都擠占掉。更麻煩的是,由於程式設計者不可能 到自己的程式會和什麼樣的別的程式同時在乙個電腦中執行,所以很...

從ucOS談,為什麼需要作業系統?

1.作業系統可以顯著降低開發難度。作業系統幫我們協調多個程式之間的耦合關係,比如我們需要將串列埠的接收到的資料顯示在一塊lcd上。傳統做法是如圖1所示 圖1.無作業系統流程 該流程中當串列埠接收到資料再呼叫lcd顯示程式將資料顯示出來,而圖2展示了一種基於作業系統的方法。在該方法中串列埠接收資料和l...

中國為什麼沒有自己的作業系統

中國為什麼沒有自己的作業系統 從市場份額的角度分析 作業系統是管理和控制計算機硬體與軟體資源的電腦程式,是直接執行在 裸機 上的最基本的系統軟體,任何其他軟體都必須在作業系統的支援下才能執行。作為使用者和計算機的介面,同時也作為計算機硬體和其他軟體的介面。作業系統讓計算機系統所有資源最大限度地發揮作...