Linux 프로세스가 절전 모드로 전환되는 이유 분석

WBOY
풀어 주다: 2024-03-21 11:06:03
원래의
1307명이 탐색했습니다.

Linux 프로세스가 절전 모드로 전환되는 이유 분석

Linux 프로세스가 절전 모드로 전환되는 이유를 분석하려면 특정 코드 예제가 필요합니다.

Linux 시스템에서 프로세스는 여러 가지 이유로 절전 모드로 전환됩니다. 절전 모드에는 리소스 대기, 신호 대기, 이벤트 대기가 포함됩니다. 본 글에서는 이러한 측면에서 Linux 프로세스가 Sleep 모드로 진입하는 이유를 자세히 분석하고, 구체적인 코드 예시를 통해 설명하겠습니다.

리소스 대기 중

실행 중에 프로세스는 파일, 네트워크 연결, 메모리 등과 같은 일부 공유 리소스에 액세스해야 할 수 있습니다. 리소스가 다른 프로세스에 의해 점유되거나 잠기면 현재 프로세스는 절전 모드로 들어가 리소스가 해제되거나 잠금 해제될 때까지 기다립니다.

다음은 스레드가 잠금 리소스를 획득하기 위해 기다리는 프로세스를 보여주는 샘플 코드입니다.

#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;
}
로그인 후 복사

위 코드에서 메인 스레드는 실행을 계속하기 전에 하위 스레드가 잠금 리소스를 획득할 때까지 기다립니다. 자식 스레드는 잠금 리소스를 획득하고, 메인 스레드는 절전 상태를 종료합니다.

신호 대기 중

프로세스는 신호를 통해 커널 및 기타 프로세스와 통신할 수 있습니다. 프로세스가 신호가 도착할 때까지 기다리면 슬립 상태로 들어갑니다. 신호는 sigwait() 또는 신호 처리 함수를 통해 처리될 수 있습니다. 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()

다음은 sigwait() 함수를 사용하여 신호를 기다리는 샘플 코드입니다.

rrreee

위 코드에서 프로세스는 신호가 수신되면 SIGUSR1 신호를 차단합니다. 절전 상태를 종료하고 적절한 작업을 수행합니다. 🎜🎜🎜이벤트 대기🎜🎜🎜프로세스는 때때로 타이머 시간 초과, IO 이벤트 준비 등과 같은 특정 이벤트가 발생할 때까지 기다려야 합니다. 프로세스는 이벤트가 발생하여 프로세스를 깨울 때까지 이벤트를 기다리며 절전 모드로 전환됩니다. 🎜🎜다음은 IO 다중화를 사용하여 이벤트를 기다리는 샘플 코드입니다. 🎜rrreee🎜위 코드에서 프로세스는 select() 함수를 사용하여 데이터가 있는지 확인하기 위해 표준 입력을 기다립니다. 데이터를 읽을 때 또는 시간 초과를 기다리는 경우 프로세스가 활성화됩니다. 🎜🎜요약하자면 Linux 프로세스는 리소스 대기, 신호 대기 및 이벤트 대기로 인해 절전 모드로 전환됩니다. 프로세스의 절전 동작은 구체적인 코드 예제를 통해 더 잘 이해할 수 있습니다. 🎜

위 내용은 Linux 프로세스가 절전 모드로 전환되는 이유 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿