Mengapa menggerakkan kursor mouse menyebabkan Windows 95 berjalan lebih cepat?

Aku sedang bermain Hypnospace Penjahat, sebuah game bertema retro OS. OS ini memiliki perilaku aneh bahwa ketika loading sebuah halaman web, menggeliat kursor mouse akan memuat halaman lebih cepat.

Itu mengingatkan saya tentang sesuatu. Ketika saya masih muda, jika saya ingat dengan benar, Windows 95(jika tidak 98) memiliki perilaku aneh bahwa ketika menginstal program, menggeliat kursor mouse membuat kemajuan lebih cepat. Apa yang menyebabkan ini? Aku googled untuk itu, saya tidak't menemukan apa-apa terkait.

Maaf untuk yang samar-samar penjelasan.

Mengomentari pertanyaan (6)

Hal ini karena cacat dalam cara Windows 95 menghasilkan peristiwa, dan fakta bahwa banyak aplikasi yang bersifat event driven.

Windows 95 aplikasi sering menggunakan asynchronous I/O, yaitu mereka meminta beberapa operasi file seperti copy yang akan dilakukan dan kemudian memberitahu OS yang mereka dapat ditidurkan sampai operasi selesai. Dengan tidur mereka memungkinkan aplikasi lain untuk menjalankan, daripada membuang-buang waktu CPU tanpa henti bertanya jika file operasi telah selesai belum.

Untuk alasan yang tidak sepenuhnya jelas, tapi mungkin karena masalah kinerja pada akhir rendah mesin, Windows 95 cenderung untuk bundel pesan-pesan tentang I/O selesai dan doesn't segera bangun aplikasi untuk layanan mereka. Namun, itu tidak membangunkan aplikasi untuk input pengguna, mungkin untuk menjaga perasaan responsif, dan ketika aplikasi terjaga itu akan menangani I/O tertunda pesan juga.

Dengan demikian menggeliat mouse menyebabkan aplikasi untuk proses I/O pesan lebih cepat, dan menginstal lebih cepat. Efeknya cukup jelas; besar aplikasi yang dapat mengambil jam untuk menginstal bisa berkurang sampai 15 menit sesuai dengan masukan mouse.

Komentar (16)

Ya, itu's efek yang nyata sehingga menyebabkan kecepatan terukur dan dapat direproduksi di akan:

Coba buka file besar dengan Notepad pada kontemporer mesin. Jendela tidak harus menjadi layar penuh. Ketika dimuat, menandai seluruh teks menggunakan mouse (keyboard bekerja dengan baik, itu hanya membutuhkan lebih banyak keterampilan manual). Sambil tetap menahan tombol ke bawah (dan menandai) gerakkan mouse ke bawah, sehingga teks akan ditandai dan menggulir. Sekarang bandingkan kecepatan gulir sambil memegang mouse masih versus menggeliat itu. Tergantung pada mesin anda, kecepatan sampai bisa beberapa kali lebih cepat.

Menakjubkan, isn't itu?

Hal ini dapat dilihat dalam banyak program lain juga, Notepad adalah aplikasi yang mudah untuk mereproduksi contoh. It's yang terkait dengan cara multitasking bekerja dalam versi awal dari Windows. Di sini semuanya berputar di sekitar antrian pesan. Menggeliat mouse mengakibatkan banjir mouse-memindahkan pesan, yang pada gilirannya membuat program bangun lebih sering dan (tergantung pada struktur mereka) memperbarui negara-negara mereka masing-masing waktu, pergi ke pesan loop lagi, memberikan waktu untuk update layar, yang mengakibatkan lebih dari semua reaksi yang lebih cepat. Hal itu menunjukkan sekilas dari cara-MS digunakan untuk membuat Windows lebih responsif meskipun koperasi ulir alam.

Komentar (18)

Itu't hanya Windows 95, Windows 3.x juga, meskipun mereka bekerja sangat berbeda.

Jawaban yang lain berbicara tentang pre-emptive multitasking, jadi let's pertama memperjelas hal ini:

Jendela 3.x menggunakan cooperative multitasking di mana masing-masing aplikasi akan melepaskan cpu untuk aplikasi lain untuk menggunakannya. Windows 95 menggunakan pre-emptive multitasking di mana masing-masing aplikasi dialokasikan waktu slice.

Jawabannya adalah terkait dengan bagaimana antarmuka grafis karya: di windows aplikasi grafis, ada lingkaran yang disebut 'pesan pompa':

Setiap acara (mouse pindah, jendela punya ukurannya, dll) didorong ke dalam antrian. Aplikasi ini bertanggung jawab untuk memeriksa apakah ia memiliki pesan yang menunggu dan, jika ya, menarik mereka dan proses mereka.

Ini adalah saat ini bahwa Windows 3.x adalah beralih ke aplikasi lain karena ada satu titik di mana semua aplikasi di mana akan, tapi ini doesn't berlaku untuk windows 95.

Apa yang benar-benar terjadi adalah bahwa, pada kedua OS, anda perlu untuk memproses pesan loop, tetapi jika anda ingin update sesuatu di latar belakang, seperti sebuah tugas, sebuah update display, dll, anda'd mengatur timer dan timer akan menempatkan pesan dalam antrian pada interval reguler.

Ini adalah cara yang lebih baik untuk melakukan hal-hal pada Windows 95, tapi pengembang mengambil waktu untuk transisi dari Windows 3.x dan banyak aplikasi yang terstruktur yang sama.

Karena mekanisme utama adalah untuk hanya bergantung pada pesan loop dan latar belakang operasi dilakukan melalui timer pesan, memindahkan mouse akan memicu banyak pesan, memindahkan aplikasi di prioritas, bangun aplikasi, dan mendapatkan aplikasi untuk memproses tugas-tugas latar belakang pesan. Tanpa menggerakkan mouse, timer pesan akan membaca hanya pada agak lambat interval.

Aplikasi yang paling terkenal untuk ini adalah disk defragmenter di mana operasi akan menunggu pesan untuk memperbarui antarmuka grafis! jadi gemetar mouse akan mempercepat defrag.

Komentar (3)

Alasannya adalah karena cara WM_TIMER terbatas untuk 15.6 ms interval secara default. Jika anda menelepon SetTimer() dengan 1ms interval itu masih akan disebut di 15.6 ms interval. WM_TIMER drive banyak hal dalam aplikasi Win32 seperti jaringan paket pengolahan dan semacamnya.

Menggerakkan mouse penyebab WM_TIMER peristiwa kebakaran lebih sering pada Win95. Jadi beberapa aplikasi akan tampak berjalan lebih cepat.

Yang 15.6 ms nilai yang ditetapkan untuk berbagai alasan: Tidak menyumbat acara antrian sehingga hal-hal seperti WM_PAINT masih akan pengiriman yang cukup sering dan lebih baru-baru ini dan penting untuk menghemat daya. Ada banyak artikel yang berbicara tentang hal ini:

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

Komentar (1)

Raymond Chen dari Microsoft memiliki jawaban yang bagus di blog-nya:

salah Satu bahaya dari MsgWaitForMultipleObjects fungsi yang menelepon itu saat ini sudah ada yang pesan yang menunggu untuk diproses, karena MsgWaitForMultipleObjects kembali hanya ketika ada acara baru di antrian.

Blog-nya adalah membaca besar!

Komentar (2)

Bisa dibilang, ini adalah bug umum di awal perangkat lunak yang didasarkan pada peristiwa-pengolahan loop daripada Windows bug: jika beberapa DD-jalan dari loop hanya proses sebuah peristiwa tunggal, maka setiap kali ketika dua peristiwa yang dihasilkan secara bersamaan, hanya satu yang diproses dan yang lainnya terjebak. Menggerakkan mouse menghasilkan lebih banyak peristiwa masuk dan restart loop. "memindahkan Mouse" peristiwa-peristiwa yang biasanya diproses oleh GUI library, yang menangani mereka dengan benar (yaitu, pengolahan semua peristiwa tersebut dalam antrian), sehingga peristiwa-peristiwa membantu mendapatkan loop pergi, dan kemudian menghilang tanpa bahaya.

Seperti bug yang mudah terjawab ketika pengujian dilakukan dengan tangan, karena tindakan dari pengujian itu sendiri menghasilkan cukup masukan kejadian untuk menjaga bug tersembunyi.

Komentar (1)

Jawaban cepat, dengan menggerakkan kursor anda mengatakan windows bahwa anda adalah yang paling penting acara berjalan. Ketika anda berhenti berinteraksi windows memberikan prioritas untuk acara-acara lainnya. Jadi menginstal program bahkan ketika di latar depan akan memberikan prioritas untuk kurang peristiwa-peristiwa penting. Bug ini tidak lagi hadir dalam versi Windows saat ini.

Komentar (0)

Windows pra-NT (Windows 1,2,3,3.11,95,98) adalah koperasi multitasking vs NT's (2000, XP, Vista, 7 & 10) preemptive multitasking.

Pada cooperative multitasking, aplikasi latar depan untuk menghasilkan kontrol untuk tugas-tugas lainnya. Dengan demikian jika aplikasi latar depan terjebak, seluruh mesin membeku.

Preemptive multitasking, sistem biasanya memiliki hardware mengganggu, biasanya timer, untuk memaksa hasil.

Pada Windows 95, keyboard dan mouse yang dihasilkan interupsi, menggerakkan mouse disebabkan mengganggu api dan OS untuk layanan it's acara antrian. Bentuk preemptive multitasking, bukannya tetap interupsi timer, anda melakukan hal itu.

OS akan memperbarui status pada layar di interupsi dan kemudian pergi melayani tugas-tugas lainnya. Layar update akan membuatnya tampak bahwa OS adalah pemrosesan lebih cepat.

EDIT - 1/2 tepat ... Tidak pre-emptive multitasking aplikasi Win16 karena menggunakan Sistem Mesin Virtual (VM) model seperti di Windows 3.1 untuk menjalankan aplikasi Win16. Dengan demikian, Windows 95 akan kembali ke koperasi di lingkungan multitasking saat menjalankan aplikasi Win16 dan memberikan mereka kontrol eksklusif dari CPU untuk aplikasi yang mengeksekusi. Akibatnya, benar pre-emptive operasi yang mustahil ketika multitasking campuran Win16 dan aplikasi Win32.

Komentar (5)