Bagaimana Windows tahu jika suatu program tidak merespons? Apakah itu terus-menerus menjaga polling semua aplikasi yang berjalan?
Bagaimana Windows tahu jika suatu program tidak merespons? Apakah itu terus-menerus menjaga polling semua aplikasi yang berjalan?
Jawaban:
Aplikasi mendapat peristiwa dari antrian yang disediakan oleh Windows.
Jika aplikasi tidak polling acara untuk sementara waktu (5 detik), misalnya ketika melakukan perhitungan panjang, maka Windows mengasumsikan bahwa aplikasi digantung dan memperingatkan pengguna.
Untuk menghindari hal itu, aplikasi harus mendorong perhitungan mahal ke utas pekerja atau memproses pemisahan dan memastikan antriannya disurvei secara teratur.
GetMessage
(atau sejenisnya) dan DispatchMessage
.
IsHungAppWindow
catatan yang benar bahwa suatu program dalam fase startup tidak perlu menelepon GetMessage
.
GetMessage
? Fitur itu memungkinkan aplikasi baris perintah sederhana untuk bekerja tanpa dianggap macet karena tidak perlu melakukan polling antrian.
Tanpa kode sumber ke Windows kami tidak dapat memastikan apa yang dilakukannya secara internal.
Ada fungsi SDK Windows IsHungAppWindow
yang dapat digunakan.
Aplikasi dianggap tidak merespons jika tidak menunggu input, tidak sedang dalam proses startup, dan belum memanggil PeekMessage dalam periode waktu habis internal 5 detik.
Sumber fungsi IsHungAppWindow
Jika jendela tingkat atas berhenti merespons pesan selama lebih dari beberapa detik, sistem menganggap jendela tidak merespons. Dalam kasus ini, sistem menyembunyikan jendela dan menggantinya dengan jendela hantu yang memiliki urutan Z, lokasi, ukuran, dan atribut visual yang sama. Ini memungkinkan pengguna untuk memindahkannya, mengubah ukurannya, atau bahkan menutup aplikasi. Namun, ini adalah satu-satunya tindakan yang tersedia karena aplikasi tersebut sebenarnya tidak merespons.
Sumber Tentang Pesan dan Antrian Pesan
Tidak. Aplikasi tidak disurvei tetapi diberikan waktu prosesor.
Windows memiliki sistem penjadwalan yang memberikan waktu prosesor untuk utas aplikasi.
Algoritma penjadwalan ini rumit, dan sepenuhnya dijelaskan dalam Windows Internal, Bagian 1 (Edisi ke-6) (Referensi Pengembang) .
PeekMessage
. Jadi ketika Windows mengirim pesan ke aplikasi, dan tidak mendapat sinyal dalam waktu lima detik, itu menandai aplikasi sebagai tidak merespons. Dan pada kenyataannya, pada Windows yang lebih baru, jendela hanya ditandai "tidak merespons" jika gagal menanggapi input pengguna dalam waktu - sampai saya mencoba mengklik atau menekan tombol atau sesuatu, aplikasi dapat dengan mudah tetap "digantung" untuk menit tanpa "muncul" tidak responsif.
Sebenarnya, Windows tidak selalu tahu bahwa suatu aplikasi tidak merespons. Aplikasi harus merupakan aplikasi interaktif dengan jendela, dan jendela tersebut harus menerima pesan yang gagal diproses oleh aplikasi, sebelum Windows menyimpulkan bahwa aplikasi tersebut tidak merespons.
Sebagai contoh, Windows tidak memiliki cara untuk mengetahui apakah aplikasi angka-angka tanpa antarmuka pengguna yang dijalankan dari baris perintah melakukan hal tersebut, atau mungkin terjebak dalam loop tak terbatas.
Aplikasi grafis interaktif di Windows menerima acara dengan terus-menerus polling antrian pesan. Windows mengisi antrian pesan ini dengan kejadian keyboard, mouse, timer, dll. Jika suatu aplikasi gagal untuk polling antrian pesan untuk beberapa waktu (5 detik adalah batas waktu yang disebutkan dalam dokumentasi fungsi IsHungAppWindow ()), Windows menganggap aplikasi "digantung", yang dapat diindikasikan dengan mengubah judul jendela (menambahkan teks " (Tidak Menanggapi) "atau teks yang setara dalam versi yang dilokalkan) dan memutihkan isi jendela jika pengguna mencoba berinteraksi dengan jendela.
Aplikasi dapat menggantung dengan cara yang tidak dikenali Windows. Misalnya, suatu aplikasi dapat melanjutkan pemungutan suara untuk pesan-pesan dalam antrian pesannya tanpa bertindak dengan benar pada mereka, jadi untuk semua maksud dan tujuan praktis itu akan tampak "hang" tanpa Windows mengakui bahwa itu tidak responsif.
Windows adalah sistem operasi, yang mengawasi semua program yang sedang berjalan.
Windows berkomunikasi dengan aplikasi berbasis jendela menggunakan peristiwa. Setiap program memiliki utas yang terus-menerus mendengarkan acara yang masuk dan memprosesnya. Misalnya ketika Anda mengklik tombol atau ikon area notifikasi, Windows menghasilkan suatu peristiwa dan memasukkannya ke dalam proses yang sesuai. Proses kemudian dapat memutuskan bagaimana menanganinya.
Semua interaksi dengan program berbasis acara di Windows, jadi ketika program tidak memproses acara yang masuk terlalu lama, itu berarti tidak merespons. Karena @DavidPostill telah menemukan dan mencatat dalam jawabannya , batas waktu adalah 5 detik. PeekMessage
adalah fungsi yang mendapat acara dari antrian acara.
Jawaban untuk pertanyaan Anda adalah ya / TIDAK.
Sementara OS Windows dapat dan melakukan polling aplikasi dengan acara di Antrian Perpesanan Windows, program sama sekali tidak memiliki kewajiban untuk menautkan ke WinAPI atau menangani / menjawab Antrian Windows. Bahkan menjawab pesan dalam Antrian tidak memberi tahu Windows apakah program telah "terkunci" atau tidak. Ini adalah indikator, tetapi hanya itu. Jawaban sebenarnya sedikit lebih rumit.
Jawaban yang sebenarnya
Orang-orang melakukan lindung nilai di sekitar jawaban aktual di sini. Menentukan apakah suatu program "tidak merespons" adalah varian dari " masalah terputus-putus ", yang secara formal tidak dapat diputuskan dalam ilmu komputer. Penjelasan singkatnya adalah bahwa prosesor tidak dapat bertindak sebagai pihak ketiga yang mengamati dirinya sendiri untuk menentukan apakah suatu subrutin terjebak dalam loop tak terbatas, tidak melakukan apa-apa vs menambah penghitung yang akan berakhir pada bilangan tetap dan normal. Kedua hal ini dapat dianggap sebagai loop tertutup rapat. Satu berhenti, yang lain tidak akan pernah berakhir. Bahkan Anda, sebagai pribadi, tidak tahu apakah suatu program benar-benar merespons atau tidak, terutama jika program itu berada dalam lingkaran yang tertutup rapat - Anda hanya tahu apakah berpikir itu harus (merespons).
Dari perspektif Windows, kedua loop ini "tidak merespons" . Itu sebabnya windows memberi Anda pilihan untuk menunggu atau mengakhiri, karena ia tidak bisa mengatakannya.
Jadi wajar adalah "mengapa jendela tahu bahwa proses yang menanggapi?" Jawabannya agak pintar. Ketika suatu proses dikompilasi dalam OS multi-threaded & multi-proses, kadang-kadang bahkan dalam loop tertutup rapat, kompiler dapat menambahkan perintah yield () , yang memberikan notifikasi yang nyaman kepada prosesor bahwa ia dapat beralih ke proses yang berjalan lainnya . Itu "menyerah" prosesor dan "konteks switch" (seperti yang disebut) terjadi yang memungkinkan OS (termasuk Windows) untuk menjawab peristiwa lain dalam tumpukan, beberapa di antaranya termasuk pelacakan bahwa proses telah merespons.
** Ini tidak berarti bahwa proses merespons akan berakhir . ** Sebuah proses di dalam infinite loop dapat menghasilkan prosesor, memungkinkan Windows untuk memproses acara lainnya.
Dalam beberapa program windows, program ini akan menangani sinyal OS Windows, yang dapat memberitahu OS bahwa ia "merespons", tetapi tidak ada program yang berkewajiban untuk melakukannya. Anda dapat menulis hogging CPU yang cukup sederhana, program non-terminasi bahkan dalam bahasa tingkat tinggi di Windows seperti perl, php, python, dan Windows mungkin tidak mendeteksi bahwa itu tidak berakhir dan tidak merespons. Pada titik itu, Windows bergantung pada heuristik - beban CPU, memori, berapa banyak interupsi yang ditangani prosesor saat program berjalan untuk "menebak". Sekali lagi, pada saat itu, Windows harus meminta Anda untuk menghentikan, karena itu benar-benar tidak tahu apakah harus.
Lihat juga jawaban Viktor (benar). Abaikan komentar tentang apakah "tidak merespons" tidak sama dengan loop tak terbatas. Ada semua jenis pesan, interupsi, loop bahwa aplikasi mungkin atau mungkin tidak menangani tanpa menginformasikan antrian pesan Windows. Menangani antrian pesan hanyalah salah satu dari banyak jenis peristiwa yang OS terus hitung untuk mencoba menebak apakah suatu proses terhenti.