Maison >Opération et maintenance >exploitation et maintenance Linux >Analysez pourquoi les processus Linux entrent en mode veille

Analysez pourquoi les processus Linux entrent en mode veille

WBOY
WBOYoriginal
2024-03-21 11:06:031334parcourir

Analysez pourquoi les processus Linux entrent en mode veille

Pour analyser pourquoi un processus Linux entre en mode veille, des exemples de code spécifiques sont nécessaires

Dans les systèmes Linux, les processus entreront en mode veille pour de nombreuses raisons. Le mode veille inclut l'attente des ressources, l'attente des signaux et l'attente des événements. Cet article analysera en détail pourquoi le processus Linux entre en mode veille sous ces aspects et l'expliquera à travers des exemples de code spécifiques.

En attente de ressources

Pendant l'exécution, le processus peut avoir besoin d'accéder à certaines ressources partagées, telles que des fichiers, des connexions réseau, de la mémoire, etc. Lorsqu'une ressource est occupée par un autre processus ou verrouillée, le processus en cours entrera en mode veille et attendra que la ressource soit libérée ou déverrouillée.

Ce qui suit est un exemple de code qui montre le processus d'un thread en attente d'acquérir une ressource de verrouillage :

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int shared_resource = 0;

void* thread_function(void* arg) {
    pthread_mutex_lock(&mutex);
    shared_resource++;
    pthread_mutex_unlock(&mutex);
    return NULL;
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, thread_function, NULL);
    
    pthread_mutex_lock(&mutex);
    while (shared_resource == 0) {
        pthread_mutex_unlock(&mutex);
        sched_yield(); // 主动让出CPU,避免忙等待
        pthread_mutex_lock(&mutex);
    }
    pthread_mutex_unlock(&mutex);

    pthread_join(thread, NULL);
    
    return 0;
}

Dans le code ci-dessus, le thread principal attend que le thread enfant acquière la ressource de verrouillage avant de pouvoir continuer l'exécution. le thread enfant acquiert la ressource de verrouillage, le thread principal quittera l'état de veille.

En attente de signaux

Les processus peuvent communiquer avec le noyau et d'autres processus via des signaux. Lorsque le processus attend l’arrivée du signal, il entre en état de veille. Les signaux peuvent être traités via sigwait() ou des fonctions de traitement du signal. sigwait()或者信号处理函数等方式来处理信号。

下面是一个使用sigwait()函数等待信号的示例代码:

#include <stdio.h>
#include <signal.h>

int main() {
    sigset_t set;
    int sig_no;
    sigemptyset(&set);
    sigaddset(&set, SIGUSR1);
    sigprocmask(SIG_BLOCK, &set, NULL);
    sigwait(&set, &sig_no);
    printf("Received signal SIGUSR1
");
    return 0;
}

在上面的代码中,进程阻塞SIGUSR1信号,当接收到该信号时,就会退出睡眠状态,并执行相应操作。

等待事件

进程有时候需要等待某些事件的发生,比如定时器超时、IO事件就绪等。进程会因为等待事件而进入睡眠状态,直到事件发生并且唤醒进程。

下面是一个使用IO多路复用等待事件的示例代码:

#include <stdio.h>
#include <sys/select.h>

int main() {
    fd_set rfds;
    struct timeval tv;
    int retval;

    FD_ZERO(&rfds);
    FD_SET(0, &rfds);

    tv.tv_sec = 5;
    tv.tv_usec = 0;

    retval = select(1, &rfds, NULL, NULL, &tv);
    if (retval == -1) {
        perror("select()");
    } else if (retval) {
        printf("Data is available now.
");
    } else {
        printf("No data within five seconds.
");
    }

    return 0;
}

在上面的代码中,进程使用select()

Ce qui suit est un exemple de code qui utilise la fonction sigwait() pour attendre un signal :

rrreee

Dans le code ci-dessus, le processus bloque le signal SIGUSR1 lorsque le signal est reçu. quittera l’état de veille et effectuera les actions appropriées. 🎜🎜🎜Attente d'événements🎜🎜🎜Le processus doit parfois attendre que certains événements se produisent, tels que le délai d'attente du minuteur, la préparation des événements IO, etc. Le processus se mettra en veille en attendant l'événement jusqu'à ce que l'événement se produise et réveille le processus. 🎜🎜Ce qui suit est un exemple de code utilisant le multiplexage IO pour attendre les événements : 🎜rrreee🎜Dans le code ci-dessus, le processus utilise la fonction select() pour attendre l'entrée standard afin de voir s'il y a des données à lire. Lorsque les données sont lisibles ou en attente d'un délai d'attente, le processus sera réveillé. 🎜🎜Pour résumer, les processus Linux entreront en mode veille en raison de l'attente de ressources, de l'attente de signaux et de l'attente d'événements. Le comportement de sommeil d'un processus peut être mieux compris grâce à des exemples de code concrets. 🎜

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn