Bagaimana Windows tahu jika suatu program tidak merespons?


174

Bagaimana Windows tahu jika suatu program tidak merespons? Apakah itu terus-menerus menjaga polling semua aplikasi yang berjalan?



@ magicandre1981 Halaman itu mengusulkan satu cara untuk memeriksa apakah suatu program secara aktif melakukan sesuatu, tetapi itu bukan cara yang sebenarnya digunakan Windows.
Kevin Panko

Lihatlah antrian pesan Windows, kandidatnya adalah fungsi PeekMessage ()
Luciano

Jawaban:


150

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.


27
↑ Ini. Tidak ada hubungannya dengan penjadwalan atau seperti yang disarankan dalam jawaban yang diterima, hanya apakah Anda secara teratur menelepon GetMessage(atau sejenisnya) dan DispatchMessage.
Damon

1
Jawaban yang diterima, merujuk pada IsHungAppWindowcatatan yang benar bahwa suatu program dalam fase startup tidak perlu menelepon GetMessage.
MSalters

@MSalters Dengan startup didefinisikan sebagai waktu sebelum yang pertama GetMessage? Fitur itu memungkinkan aplikasi baris perintah sederhana untuk bekerja tanpa dianggap macet karena tidak perlu melakukan polling antrian.
ratchet freak

4
@ scratchetfreak: Mungkin sebelum panggilan CreateWindow pertama. Aplikasi baris perintah adalah binatang buas yang berbeda sama sekali; mereka berjalan di dalam ConHost.EXE dan berinteraksi dengan susbystem Windows GUI untuk mereka.
MSalters

1
juga, menurut saya bahwa di Windows 7 (dan mungkin sebelumnya) bahwa windows akan melihat ini lebih cepat jika Anda mencoba dan gagal memanipulasi jendela dengan cara tertentu. seperti jika suatu program tidak memproses maksimal atau memindahkan pesan, windows 7 akan melompat ke kanan untuk tidak merespons setelah sekitar 1 atau 2 detik ..
Dave Cousineau

78

Bagaimana Windows tahu jika suatu program tidak merespons?

Tanpa kode sumber ke Windows kami tidak dapat memastikan apa yang dilakukannya secara internal.

Ada fungsi SDK Windows IsHungAppWindowyang 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


Apakah itu terus-menerus menjaga polling semua aplikasi yang berjalan?

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) .


2
Status hang tidak didasarkan pada CPU. Sebagian besar program "digantung" dalam arti untuk 99,999% dari waktu dan tidak melakukan apa pun.
usr

2
@ usr Di mana saya mengatakan bahwa "tergantung" tergantung pada CPU?
DavidPostill

2
@ usr Bagian pertama dari jawaban adalah menjawab "Apakah ia terus-menerus mengumpulkan semua aplikasi yang berjalan?". Babak kedua adalah menjawab "Bagaimana cara kerja Windows tahu jika program tidak menanggapi ?. OP bertanya dua pertanyaan dalam satu;)
DavidPostill

9
Tapi ini bukan polling, kan? Saya berasumsi internal lebih seperti pegangan menunggu di jendela ditandai ketika Anda menelepon 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.
Luaan

2
Anda dapat menghapus semua yang di atas "Tentang Pesan dan Antrian Pesan" karena tidak membantu jawabannya. Windows tahu aplikasi telah berhenti merespons karena berhenti memompa pesan. Aplikasi ini bisa berjalan karena melakukan sesuatu yang intensif daripada memompa pesan (tapi itu program yang dirancang buruk).
Andy

32

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.


8
Tidak menanggapi, menurut definisi, berarti tidak memproses pesan jendela, jadi itu tidak berlaku untuk layanan atau aplikasi konsol, dan jadi saya akan mengatakan Windows selalu tahu jika suatu aplikasi tidak merespons. Anda membingungkan kunci mati dan tidak merespons.
Andy

Tentu saja bisa tahu jika suatu program tidak merespons. "Tidak menanggapi" tidak sama dengan "terjebak dalam satu lingkaran tanpa batas"
BlueRaja - Danny Pflughoeft

1
Sebenarnya, suatu aplikasi dapat mengambil pesan melalui GetMessage () dan gagal memprosesnya, dan itu tidak akan dikenali sebagai "tidak merespons" oleh Windows meskipun faktanya itu akan tampak tidak responsif terhadap penggunanya. Istilah "tidak merespons" juga sering digunakan untuk menggambarkan jaringan, layanan, baris perintah interaktif, dll. Aplikasi; AFAIK tidak ada definisi formal yang membatasi frasa untuk aplikasi berjendela. Baik deadlock atau infinite loop (atau kesalahan pemrograman lainnya) dapat menyebabkan aplikasi menjadi non-responsif, tetapi tidak, saya tidak mengacaukan sebab dan akibat.
Viktor Toth

10

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. PeekMessageadalah fungsi yang mendapat acara dari antrian acara.


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.