Maison > Article > Tutoriel système > Plus de crainte de blocage des processus - solution au gel des processus Linux
Lorsque nous utilisons des systèmes Linux pour le développement ou l'exploitation et la maintenance, nous rencontrons souvent des problèmes de blocage des processus. Lorsqu'un processus se bloque, la vitesse de réponse de l'ensemble du système sera considérablement réduite, voire provoquera un crash du système. Cependant, en tant que passionné de Linux, nous n'avons plus à craindre l'impasse des processus. Parce que le système Linux fournit un outil puissant - le gel des processus, qui peut résoudre efficacement le problème de blocage des processus. Cet article présentera en détail le principe et la méthode d'application du gel des processus Linux.
1 Qu'est-ce que le processus de congélation
La technologie de gel des processus (gel des tâches) consiste à placer les processus utilisateur et certains threads du noyau dans un état de pause « contrôlable » lorsque le système hiberne ou se suspend.
2 Pourquoi la technologie de congélation est nécessaire
En supposant qu'il n'y ait pas de technologie de gel, le processus peut être suspendu à tout moment planifiable et ne sera pas suspendu ni migré avant cpu_down. Cela peut causer beaucoup de problèmes au système :
(1) Il est possible de corrompre le système de fichiers. Entre le système créant l'image de mise en veille prolongée et le processeur en panne, s'il y a des processus qui modifient encore le contenu du système de fichiers, cela empêchera le système de fichiers d'être complètement restauré une fois le système restauré ;
(2) Cela peut entraîner l'échec de la création de l'image d'hibernation. La création d'une image d'hibernation nécessite suffisamment d'espace mémoire, mais s'il y a encore des processus demandant de la mémoire pendant cette période, la création peut échouer ;(3) Cela peut interférer avec la suspension et la reprise de l'appareil. Avant la panne du processeur, pendant la suspension de l'appareil, si le processus accède toujours à l'appareil, en particulier aux ressources concurrentes, cela peut provoquer une exception de suspension de l'appareil ;
(4) Cela peut amener le processus à détecter la veille du système. L'état idéal de l'hibernation du système est que toutes les tâches ignorent le processus d'hibernation et reprennent automatiquement leur travail après le réveil. Cependant, certains processus, comme un certain processus, nécessitent que tous les processeurs soient en ligne pour fonctionner correctement. geler, cela fonctionnera anormalement.
3 Cadre de mise en œuvre du code
Les objets gelés sont des entités du noyau dont l'exécution peut être planifiée, notamment les processus utilisateur, les threads du noyau et work_queue. Les processus utilisateur peuvent être gelés par défaut, ce qui est implémenté en empruntant le mécanisme de traitement du signal ; les threads du noyau et work_queue ne peuvent pas être gelés par défaut. Quelques threads du noyau et work_queue spécifient l'indicateur freezeable lors de leur création. Lorsque le système entre en gel, l'opération est automatiquement suspendue.
Les threads du noyau peuvent déterminer l'état de gel en appelant kthread_freezable_should_stop et appeler activement __refrigerator pour entrer dans le gel ; work_queue détermine l'attribut max_active = 0, le nouveau travail ne peut pas être mis en file d'attente et tout le travail est retardé.Il existe trois variables globales importantes qui marquent l'état de gel du système : pm_freezing, system_freezing_cnt et pm_nosig_freezing. Si toutes sont 0, cela signifie que le système n'est pas entré en gel ; system_freezing_cnt》0 signifie que le système est en gel, pm_freezing=true signifie. gelant les processus utilisateur, pm_nosig_freezing=true signifie geler les threads et les files d'attente du noyau. Ils seront définis dans freeze_processes et freeze_kernel_threads, et effacés dans thaw_processes et thaw_kernel_threads.
La fonction fake_signal_wake_up utilise intelligemment le mécanisme de traitement du signal. Elle définit uniquement le bit TIF_SIGPENDING de la tâche, mais ne transmet aucun signal, puis réveille la tâche de cette manière, la tâche entrera dans le processus de traitement du signal lors de son retour ; mode utilisateur, vérifiez l’état de gel du système et apportez les modifications correspondantes.
Le code de la tâche pour appeler activement try_to_freeze est le suivant :
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(); } 。..。.. }Grâce à l'introduction de cet article à l'outil de gel des processus Linux, nous avons appris ses principes et son utilisation, et maîtrisé comment résoudre efficacement le problème de blocage des processus. L'outil de gel des processus résout pour nous les problèmes courants du système d'exploitation et nous offre un environnement de travail plus efficace et plus stable. Lorsque nous rencontrons une impasse dans un processus, il n'y a pas lieu de paniquer. Nous pouvons facilement résoudre le problème grâce aux outils de gel des processus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!