Mengapa suatu sistem menjadi tidak responsif?

12

Saya baru saja mengeksekusi dot(sebuah program untuk menggambar grafik berarah) dengan file input yang sangat besar sehingga tidak dapat dirender dalam jumlah waktu yang wajar.

Seluruh sistem saya membeku. Saya hampir tidak bisa membuatnya ke konsol teks dengan Ctrl+ Alt+ F1untuk membunuh dot, tetapi butuh beberapa menit.

Mengapa sistem mengizinkan sesuatu seperti ini? Mengapa ia memberikan program yang tidak kritis seperti dot99% dari sistem dan menggunakan 1% sisanya untuk tetap responsif?

Christoph Wurm
sumber

Jawaban:

15

Itulah cara kerja GNU / Linux dan sistem multitasking lainnya, mereka berbagi prosesor di antara proses yang sedang berjalan, dottidak akan memiliki 99%, tetapi 100% selama 99% dari waktu. Setiap proses mendominasi prosesor untuk periode waktu tertentu.

Ini ditangani oleh penjadwal (linux memiliki beberapa penjadwal, beberapa hanya menggunakan strategi biasa, beberapa mencoba memberikan lebih banyak waktu untuk antarmuka pengguna, dan sebagainya).

Sekarang, dalam kasus Anda, masalahnya adalah - mungkin - yang dottidak memakan banyak waktu prosesor, tetapi banyak memori. Dan ketika sebuah program menggunakan terlalu banyak memori, ada meronta - ronta , yang merupakan proses yang membuat sistem membeku, bukan karena dotmelakukan banyak hal, tetapi karena kernel harus memindahkan halaman memori bolak-balik antara disk (partisi swap) dan memori sistem.

Bahkan jika dothanya mengambil 99% dari waktu CPU, kemungkinan bahwa mengubah ke terminal teks akan segera, apa yang terjadi adalah bahwa kernel harus memindahkan dotbarang dari memori sehingga dapat dimasukkan Xkembali ke memori sehingga Xdapat melihat kunci Anda cukup menekan dan pindah ke terminal teks, maka kernel harus Xkeluar dari memori dotyang masih berjalan, dan kemudian juga pindah dotuntuk memindahkan proses terminal teks (mungkin saja login?) kembali ke memori. (Jika ini terlihat berantakan, itu bukan hanya karena contohnya berantakan - kenyataannya adalah berantakan ini .)

Contohnya adalah jika Anda login di terminal teks, Anda mungkin dapat menekan saja tombol, tekan backspace, dan itu akan terjadi secara real-time, tetapi jika Anda melakukan sesuatu yang sederhana seperti menjalankan alat kecil seperti ps, itu akan "membeku "untuk sementara waktu karena harus membebaskan memori untuk memuat ps(dan juga harus menunggu di antrian disk I / O, yang sedang banyak digunakan untuk memindahkan data ke dan dari memori, hingga ia dapat meminta psdari sistem file) .

njsg
sumber
Hm, jadi cara untuk mendapatkan pengalaman pengguna yang lebih baik adalah dengan menetapkan program tertentu sebagai " sticky " dan dengan demikian mencegah program tersebut diganti.
Christoph Wurm
Stickiness tidak berfungsi seperti itu sejak 70-an dan semantik asli dari bit 'lengket'. Namun, Anda dapat mengunci (sebagian) program ke dalam memori sehingga tidak dapat ditukar. Memori utama adalah kemewahan yang mahal, jadi ini tidak bisa dilakukan untuk semuanya.
Alexios
@ njsg, terima kasih atas penjelasannya. Sebuah pertanyaan lanjutan: Apakah tidak ada cara untuk mencegah labrakan? Saya mengerti bahwa bertukar membuat penggunaan memori lebih efektif secara keseluruhan, tetapi harus ada batasan. IMHO proses yang sama pentingnya dengan X tidak boleh dipindahkan dari memori. Apakah ada cara untuk mengkonfigurasi sistem seperti unix sehingga proses-proses penting terlindungi dari pemindahan? Di server ini adalah hal yang berbeda, tetapi pada desktop saya lebih suka proses kehabisan memori untuk crash daripada desktop saya berhenti berbicara kepada saya.
A. Donda