Rumah > Artikel > Tutorial sistem > Tiada lagi ketakutan proses buntu - penyelesaian kepada pembekuan proses Linux
Apabila menggunakan sistem Linux untuk pembangunan atau operasi dan penyelenggaraan, kami sering menghadapi masalah kebuntuan proses. Apabila proses menemui jalan buntu, kelajuan tindak balas keseluruhan sistem akan dikurangkan dengan ketara, atau malah menyebabkan sistem ranap. Walau bagaimanapun, sebagai peminat Linux, kita tidak lagi perlu takut proses buntu. Kerana sistem Linux menyediakan pembekuan proses alat yang berkuasa, yang boleh menyelesaikan masalah kebuntuan proses dengan berkesan. Artikel ini akan memperkenalkan secara terperinci prinsip dan kaedah aplikasi pembekuan proses Linux.
1 Apakah proses pembekuan
Teknologi pembekuan proses (pembekuan tugas) merujuk kepada meletakkan proses pengguna dan beberapa utas kernel dalam keadaan jeda "boleh dikawal" apabila sistem hibernasi atau digantung.
2 Mengapa Teknologi Pembekuan Diperlukan
Dengan mengandaikan tiada teknologi pembekuan, proses boleh digantung pada mana-mana titik yang dijadualkan, dan tidak akan digantung dan dipindahkan sehingga cpu_down. Ini boleh menyebabkan banyak masalah kepada sistem:
(1) Adalah mungkin untuk merosakkan sistem fail. Antara apabila sistem mencipta imej hibernate dan apabila CPU turun, jika terdapat proses yang masih mengubah suai kandungan sistem fail, ini akan mengakibatkan sistem fail tidak dapat dipulihkan sepenuhnya selepas sistem dipulihkan
(2) Ia boleh menyebabkan penciptaan imej hibernasi gagal. Mencipta imej hibernasi memerlukan ruang memori yang mencukupi, tetapi jika masih terdapat proses memohon ingatan dalam tempoh ini, penciptaan mungkin gagal
(3) Ia mungkin mengganggu penggantungan dan menyambung semula peranti. Sebelum CPU down, semasa peranti digantung, jika proses masih mengakses peranti, terutamanya mengakses sumber bersaing, ia mungkin menyebabkan pengecualian penggantungan peranti
(4) Ia boleh menyebabkan proses merasakan tidur sistem. Keadaan hibernasi sistem yang ideal ialah semua tugas tidak mengetahui proses hibernasi dan menyambung semula kerja secara automatik selepas bangun tidur Namun, beberapa proses, seperti proses tertentu, memerlukan semua CPU berada dalam talian untuk berfungsi seperti biasa membeku, ia akan Berfungsi secara tidak normal.
3 Rangka Kerja Pelaksanaan Kod
Objek beku ialah entiti dalam kernel yang boleh dijadualkan untuk pelaksanaan, termasuk proses pengguna, benang kernel dan work_queue. Proses pengguna boleh dibekukan secara lalai, yang dilaksanakan dengan meminjam mekanisme pemprosesan isyarat dan work_queue tidak boleh dibekukan secara lalai. Beberapa utas kernel dan work_queue menentukan bendera boleh beku apabila ia dibuat status Apabila sistem Apabila memasuki pembekuan, operasi digantung secara automatik.
Jalur kernel boleh menentukan status pembekuan dengan memanggil kthread_freezable_should_stop, dan secara aktif memanggil __peti sejuk untuk memasuki pembekuan_kerja menentukan atribut max_active=0, kerja baharu tidak boleh beratur, dan semua kerja ditangguhkan.
Terdapat tiga pembolehubah global penting yang menandakan status pembekuan sistem: pm_freezing, system_freezing_cnt dan pm_nosig_freezing Jika semuanya adalah 0, ia bermakna sistem belum memasuki pembekuan_cnt》0 bermakna sistem telah memasuki pembekuan, pm_freezing=true bermaksud. membekukan proses pengguna, pm_nosig_freezing=true bermaksud Membekukan benang kernel dan baris gilir kerja. Ia akan ditetapkan dalam beku_proses dan beku_benang_kernel, dan dikosongkan dalam proses_cair dan benang_kernel.
Fungsi fake_signal_wake_up bijak menggunakan mekanisme pemprosesan isyarat Ia hanya menetapkan bit TIF_SIGPENDING tugas, tetapi tidak menghantar sebarang isyarat, dan kemudian membangkitkan tugas dengan cara ini, tugas itu akan memasuki proses pemprosesan isyarat apabila kembali ke mod pengguna, semak status pembekuan sistem, dan buat perubahan yang sepadan.
Kod untuk tugasan untuk memanggil try_to_freeze secara aktif adalah seperti berikut:
static inline bool try_to_freeze_unsafe(void) { if (likely(!freezing(current))) //检查系统是否处于freezing状态 return false; return __refrigerator(false); //主动进入冻结 } static inline bool freezing(struct task_struct *p) { if (likely(!atomic_read(&system_freezing_cnt))) //系统总体进入freezing return false; return freezing_slow_path(p); } bool freezing_slow_path(struct task_struct *p) { if (p-》flags & PF_NOFREEZE) //当前进程是否允许冻结 return false; if (pm_nosig_freezing || cgroup_freezing(p)) //系统冻结kernel threads return true; if (pm_freezing && !(p-》flags & PF_KTHREAD)) //系统冻结用户进程 return true; return false; } 进入冻结状态直到恢复的主要函数:bool __refrigerator(bool check_kthr_stop) { 。.. for (;;) { set_current_state(TASK_UNINTERRUPTIBLE); //设置进程为UNINTERRUPTIBLE状态 spin_lock_irq(&freezer_lock); current-》flags |= PF_FROZEN; //设置已冻结状态 if (!freezing(current) || (check_kthr_stop && kthread_should_stop())) //判断系统是否还处于冻结 current-》flags &= ~PF_FROZEN; //如果系统已解冻,则取消冻结状态 spin_unlock_irq(&freezer_lock); if (!(current-》flags & PF_FROZEN)) //如果已取消冻结,跳出循环,恢复执行 break; was_frozen = true; schedule(); } 。..。.. }
Melalui pengenalan artikel ini kepada alat pembekuan proses Linux, kami mempelajari prinsip dan penggunaannya, serta menguasai cara menyelesaikan masalah kebuntuan proses dengan berkesan. Alat pembekuan proses menyelesaikan masalah sistem pengendalian biasa untuk kami dan memberikan kami persekitaran kerja yang lebih cekap dan stabil. Apabila kita menghadapi kebuntuan proses, tidak perlu panik Kita boleh menyelesaikan masalah dengan mudah melalui alat pembekuan proses.
Atas ialah kandungan terperinci Tiada lagi ketakutan proses buntu - penyelesaian kepada pembekuan proses Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!