ホームページ >運用・保守 >Linuxの運用と保守 >Linux プロセスがスリープ モードに入る理由を分析する

Linux プロセスがスリープ モードに入る理由を分析する

WBOY
WBOYオリジナル
2024-03-21 11:06:031334ブラウズ

Linux プロセスがスリープ モードに入る理由を分析する

Linux プロセスがスリープ モードに入る理由を分析するには、特定のコード例が必要です。

Linux システムでは、プロセスはスリープ モードに移行します。色々な理由があるモデルです。スリープ モードには、リソースの待機、信号の待機、およびイベントの待機が含まれます。この記事では、Linux プロセスがスリープ モードに入る理由をこれらの側面から詳細に分析し、具体的なコード例を通じて説明します。

リソースを待機しています

実行中、プロセスはファイル、ネットワーク接続、メモリなどの共有リソースにアクセスする必要がある場合があります。リソースが別のプロセスによって占有されているかロックされている場合、現在のプロセスはスリープ モードに入り、リソースが解放されるかロックが解除されるまで待機します。

次は、ロック リソースの取得を待機しているスレッドを示すサンプル コードです。

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

pthread_mutex_t ミューテックス = PTHREAD_MUTEX_INITIALIZER;
int 共有リソース = 0;

void* thread_function(void* arg) {
    pthread_mutex_lock(&mutex);
    共有リソース;
    pthread_mutex_unlock(&mutex);
    NULL を返します。
}

int main() {
    pthread_t スレッド;
    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(スレッド、NULL);
    
    0を返します。
}

上記のコードでは、メインスレッドはサブスレッドがロック リソースを取得するのを待ってから実行を続行し、サブスレッドがロック リソースを取得すると、メインスレッドはスリープ状態を終了します。

シグナルの待機

プロセスは、シグナルを通じてカーネルお​​よび他のプロセスと通信できます。プロセスがシグナルの到着を待つと、スリープ状態に入ります。信号は、sigwait() または信号処理関数を通じて処理できます。

次は、sigwait() 関数を使用してシグナルを待機するサンプル コードです。 #include int main() { sigset_t セット; int sig_no; sigemptyset(&set); sigaddset(&set, SIGUSR1); sigprocmask(SIG_BLOCK, &set, NULL); sigwait(&set, &sig_no); printf("シグナルSIGUSR1を受信しました "); 0を返します。 }

上記のコードでは、プロセスは SIGUSR1 シグナルをブロックし、シグナルを受信すると、スリープ状態を終了し、対応する操作を実行します。 

イベントの待機

プロセスは、タイマー タイムアウトや IO イベントの準備状況など、特定のイベントが発生するまで待機する必要がある場合があります。プロセスは、イベントが発生してプロセスをウェイクアップするまで、イベントを待機しながらスリープ状態になります。

以下は、IO 多重化を使用してイベントを待機するサンプル コードです:

#<stdio.h> を含める
#include <sys/select.h>

int main() {
    fd_set rfds;
    構造体 timeval テレビ;
    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) {
        pererror("select()");
    else if (retval) {
        printf("データは現在利用可能です。
");
    } それ以外 {
        printf("5 秒以内にデータがありません。
");
    }

    0を返します。
}

上記のコードでは、プロセスは select() 関数を使用して、標準入力からデータが読み取られるのを待機します。データが読み取り可能になるか、待機がタイムアウトになると、プロセスが目覚めます。

要約すると、Linux プロセスは、リソースの待機、シグナルの待機、およびイベントの待機によりスリープ モードに入ります。プロセスのスリープ動作は、具体的なコード例を通じてよりよく理解できます。

以上がLinux プロセスがスリープ モードに入る理由を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。