Pernahkah anda menghadapi pelbagai masalah apabila sistem anda sedang tidur? Contohnya, sistem fail rosak, penciptaan imej hibernasi gagal, penggantungan peranti tidak normal, dsb. Masalah ini boleh diselesaikan melalui teknologi pembekuan proses Linux.
Terdapat tiga pembolehubah global penting yang menandakan status pembekuan sistem: pm_freezing, system_freezing_cnt dan pm_nosig_freezing Jika semuanya 0, ia bermakna sistem belum memasuki pembekuan; =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 membangunkan tugas dengan cara ini, tugas akan memasuki proses pemprosesan isyarat apabila kembali ke mod pengguna, semak status pembekuan sistem, dan kendalikannya dengan sewajarnya.
Kod untuk tugas memanggil try_to_freeze secara aktif adalah seperti berikut:
``` ``` 1. static inline bool try_to_freeze_unsafe(void) 2. { 3. if (likely(!freezing(current))) //检查系统是否处于freezing状态 4. return false; 5. return __refrigerator(false); //主动进入冻结 6. } 7. 8. static inline bool freezing(struct task_struct *p) 9. { 10. if (likely(!atomic_read(&system_freezing_cnt))) //系统总体进入freezing 11. return false; 12. return freezing_slow_path(p); 13. } 14. 15. bool freezing_slow_path(struct task_struct *p) 16. { 17. if (p->flags & PF_NOFREEZE) //当前进程是否允许冻结 18. return false; 19. 20. if (pm_nosig_freezing || cgroup_freezing(p)) //系统冻结kernel threads 21. return true; 22. 23. if (pm_freezing && !(p->flags & PF_KTHREAD)) //系统冻结用户进程 24. return true; 25. 26. return false; 27. }
Fungsi utama untuk memasuki keadaan beku sehingga pemulihan: bool __peti sejuk(bool check_kthr_stop)
1. { 2. ... 3. for (;;) { 4. set_current_state(TASK_UNINTERRUPTIBLE); //设置进程为UNINTERRUPTIBLE状态 5. 6. spin_lock_irq(&freezer_lock); 7. current->flags |= PF_FROZEN; //设置已冻结状态 8. if (!freezing(current) || 9. (check_kthr_stop && kthread_should_stop())) //判断系统是否还处于冻结 10. current->flags &= ~PF_FROZEN; //如果系统已解冻,则取消冻结状态 11. spin_unlock_irq(&freezer_lock); 12. 13. if (!(current->flags & PF_FROZEN)) //如果已取消冻结,跳出循环,恢复执行 14. break; 15. was_frozen = true; 16. schedule(); 17. } 18. ...... 19. }
Ringkasnya, teknologi pembekuan proses Linux ialah teknologi yang sangat berguna yang boleh membantu anda mengelakkan beberapa masalah yang berpotensi dan menjadikan sistem anda lebih stabil. Jika anda ingin mengetahui lebih lanjut tentang teknologi ini, lihat sumber yang disediakan dalam artikel ini.
Atas ialah kandungan terperinci : Teknologi pembekuan proses Linux: Jadikan sistem anda lebih stabil. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!