Sind Sie schon einmal auf verschiedene Probleme gestoßen, wenn Ihr System im Ruhezustand war? Beispielsweise ist das Dateisystem beschädigt, die Erstellung des Ruhezustands-Images schlägt fehl, die Geräteunterbrechung ist abnormal usw. Diese Probleme können durch die Linux-Technologie zum Einfrieren von Prozessen gelöst werden.
-
Die Technologie zum Einfrieren von Prozessen (Einfrieren von Aufgaben) bezieht sich darauf, Benutzerprozesse und einige Kernel-Threads in einen „kontrollierbaren“ Pausenzustand zu versetzen, wenn das System in den Ruhezustand wechselt oder anhält.
-
Ohne Einfriertechnologie kann der Prozess zu jedem planbaren Zeitpunkt angehalten werden und wird erst bei cpu_down angehalten und migriert. Dies kann viele Probleme für das System verursachen:
-
Es ist möglich, dass das Dateisystem beschädigt wird. Wenn es zwischen dem System, das das Ruhezustands-Image erstellt, und dem CPU-Ausfall gibt, führt dies dazu, dass das Dateisystem nach der Wiederherstellung nicht vollständig wiederhergestellt werden kann
-
Dies kann dazu führen, dass die Erstellung des Ruhezustands-Images fehlschlägt. Das Erstellen eines Ruhezustands-Images erfordert ausreichend Speicherplatz. Wenn in diesem Zeitraum jedoch noch Prozesse Speicher beanspruchen, schlägt die Erstellung möglicherweise fehl
-
Es ist möglich, dass der Suspend- und Resume-Modus des Geräts beeinträchtigt wird. Wenn der Prozess während des Geräte-Suspendierens noch auf das Gerät zugreift, insbesondere auf konkurrierende Ressourcen, kann es zu einer Geräte-Suspendierungsausnahme kommen, bevor die CPU ausfällt
Dies kann dazu führen, dass der Prozess den Ruhezustand des Systems erkennt. Der ideale Zustand des Systemruhezustands besteht darin, dass alle Aufgaben den Ruhezustandsprozess nicht bemerken und nach dem Aufwachen automatisch ihre Arbeit fortsetzen. Allerdings erfordern einige Prozesse, wie z. B. ein bestimmter Prozess, dass alle CPUs online sind, um normal zu funktionieren einfriert, funktioniert es nicht normal.
-
Eingefrorene Objekte sind Entitäten im Kernel, deren Ausführung geplant werden kann, einschließlich Benutzerprozessen, Kernel-Threads und Work_Queue. Benutzerprozesse können standardmäßig eingefroren werden, was durch Ausleihen des Signalverarbeitungsmechanismus erreicht wird. Einige Kernel-Threads und work_queue können beim Erstellen nicht eingefroren werden Wenn das System in den Gefrierzustand eintritt, wird der Vorgang automatisch unterbrochen. Kernel-Threads können den Einfrierstatus ermitteln, indem sie kthread_freezable_should_stop aufrufen und __refrigerator aktiv aufrufen, um in das Einfrieren zu gelangen. Wenn max_active=0, kann keine neue Arbeit in die Warteschlange gestellt werden und alle Arbeiten werden verzögert.
-
Es gibt drei wichtige globale Variablen, die den System-Freezing-Status markieren: pm_freezing, system_freezing_cnt und pm_nosig_freezing. Wenn sie alle 0 sind, bedeutet dies, dass das System nicht in den Freezing-Status versetzt wurde =true bedeutet das Einfrieren von Benutzerprozessen, pm_nosig_freezing= true bedeutet das Einfrieren von Kernel-Threads und Arbeitswarteschlange. Sie werden in freeze_processes und freeze_kernel_threads festgelegt und in thaw_processes und thaw_kernel_threads gelöscht.
Die Funktion fake_signal_wake_up nutzt geschickt den Signalverarbeitungsmechanismus. Sie setzt nur das TIF_SIGPENDING-Bit der Aufgabe, leitet jedoch kein Signal weiter und weckt die Aufgabe dann bei der Rückkehr in den Signalverarbeitungsprozess Wechseln Sie in den Benutzermodus, überprüfen Sie den Einfrierstatus des Systems und behandeln Sie ihn entsprechend.
Der Code für die Aufgabe zum aktiven Aufrufen von try_to_freeze lautet wie folgt:
```
```
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. }
Nach dem Login kopieren
Die Hauptfunktion zum Wechseln in den eingefrorenen Zustand bis zur Wiederherstellung: bool __refrigerator(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. }
Nach dem Login kopieren
Kurz gesagt ist die Linux-Technologie zum Einfrieren von Prozessen eine sehr nützliche Technologie, die Ihnen helfen kann, einige potenzielle Probleme zu vermeiden und Ihr System stabiler zu machen. Wenn Sie mehr über diese Technologie erfahren möchten, sehen Sie sich die in diesem Artikel bereitgestellten Ressourcen an.
Das obige ist der detaillierte Inhalt von:Linux Process Freezing-Technologie: Machen Sie Ihr System stabiler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!