Stavo giocando a Hypnospace Outlaw, un gioco su un sistema operativo a tema retrò. Questo sistema operativo ha un comportamento peculiare che quando si carica una pagina web, muovendo il cursore del mouse si carica la pagina più velocemente.
Questo mi ha ricordato qualcosa. Quando ero giovane, se ricordo bene, Windows 95 (se non 98) aveva questo strano comportamento che quando si installavano programmi, muovendo il cursore del mouse si velocizzava il caricamento. Cosa lo causava? Ho cercato su Google, ma non ho trovato nulla di relativo.
Scusate per la vaga spiegazione.
Questo è dovuto a un difetto nel modo in cui Windows 95 genera gli eventi, e al fatto che molte applicazioni sono guidate da eventi.
Le applicazioni di Windows 95 spesso usano l'I/O asincrono, cioè chiedono l'esecuzione di qualche operazione di file, come una copia, e poi dicono al sistema operativo che possono essere messe a dormire fino a quando l'operazione non finisce. Dormendo permettono ad altre applicazioni di essere eseguite, piuttosto che sprecare il tempo della CPU chiedendo all'infinito se l'operazione del file è già stata completata.
Per ragioni che non sono del tutto chiare, ma probabilmente dovute a problemi di prestazioni su macchine di fascia bassa, Windows 95 tende a raggruppare i messaggi sul completamento dell'I/O e non sveglia immediatamente l'applicazione per servirsene. Tuttavia, sveglia l'applicazione per l'input dell'utente, presumibilmente per farla sentire reattiva, e quando l'applicazione è sveglia gestirà anche qualsiasi messaggio di I/O in sospeso.
Quindi muovere il mouse fa sì che l'applicazione elabori i messaggi di I/O più velocemente, e li installi più velocemente. L'effetto è stato abbastanza pronunciato; grandi applicazioni che potrebbero richiedere un'ora per l'installazione potrebbero essere ridotte a 15 minuti con un adeguato input del mouse.
Sì, è un effetto reale che provoca un'accelerazione misurabile e può essere riprodotto a volontà:
Provate ad aprire un file di grandi dimensioni con Notepad su una macchina contemporanea. La finestra non deve essere a schermo intero. Una volta caricato, segnate tutto il testo usando il mouse (la tastiera funziona altrettanto bene, richiede solo più abilità manuale). Tenendo ancora premuto il pulsante (e marcando) muovete il mouse verso il basso, in modo che il testo venga marcato e fatto scorrere. Ora confrontate la velocità di scorrimento tenendo fermo il mouse rispetto a quella di muoverlo. A seconda della vostra macchina la velocità può essere diverse volte più veloce.
Incredibile, vero?
Può essere visto anche in molti altri programmi, Notepad è solo un esempio facile da riprodurre. È legato al modo in cui il multitasking funzionava nelle prime versioni di Windows. Qui tutto ruotava intorno alla coda dei messaggi. Muovendo il mouse si otteneva una marea di messaggi di movimento del mouse, che a sua volta faceva sì che i programmi si svegliassero più spesso e (a seconda della loro struttura) aggiornassero i loro stati ogni volta, entrando di nuovo nel ciclo dei messaggi, dando tempo agli aggiornamenti dello schermo, con il risultato di una reazione complessivamente più veloce. Mostra un assaggio dei modi usati da MS per rendere Windows piuttosto reattivo nonostante la sua natura di thread cooperativo.
Windows pre-NT (Windows 1,2,3,3.11,95,98) era multitasking cooperativo contro NT (2000, XP, Vista, 7 & 10) multitasking preventivo.
Nel multitasking cooperativo, l'applicazione in primo piano deve cedere il controllo agli altri compiti. Quindi se l'applicazione in primo piano si blocca, l'intera macchina si blocca.
Nel multitasking preemptive, il sistema di solito aveva un interrupt hardware, di solito un timer, per forzare una resa.
Su Windows 95, la tastiera e il mouse generavano degli interrupt, muovendo il mouse si innescava l'interrupt e il sistema operativo serviva la sua coda di eventi. Una forma di multitasking preemptive, invece di un interrupt con timer fisso, lo facevi tu.
Il sistema operativo aggiornava lo stato sullo schermo all'interrupt e poi andava a servire gli altri compiti. L'aggiornamento dello schermo avrebbe fatto sembrare che il sistema operativo stesse elaborando più velocemente.
EDIT - 1/2 giusto ... Non può eseguire preventivamente applicazioni Win16 in multitasking perché utilizza lo stesso modello di macchina virtuale di sistema (VM) di Windows 3.1 per eseguire applicazioni Win16. Così, Windows 95 tornerà ad un ambiente multitasking cooperativo quando si eseguono applicazioni Win16 e darà loro il controllo esclusivo della CPU per tutto il tempo in cui le applicazioni sono in esecuzione. Come risultato, un vero funzionamento pre-emptive è impossibile quando si esegue in multitasking un misto di applicazioni Win16 e Win32.