책너두 (컴퓨터 밑바닥의 비밀) 22일차 CPU는 유휴 상태일 때 무엇을 할까?

  • 컴퓨터의 CPU 사용률은 얼마인가?

  • 대부분의 CPU 사용률은 7~8% 정도로 매우 낮음.

    • 물론 게임, 영상 편집, 이미지 처리 같은 상황은 다르게 판단해야 함.
      • 이러한 상황이 아님에도 사용률이 항상 높다면 소프트웨어 버그이거나, 바이러스 감염 가능성을 고려해야 함.
  • ex) 프로세스가 약 300개가 열려있는데, 이렇게 많은 프로세스는 기본적으로 아무 작업도 하지 않고 있음.

    • 특정 이벤트가 발생하여 자신을 깨우기를 기다리고 있음.
    • 즉, 그전 까지는 계속 대기 상태에 머무르게 됨.
  • 프로세스 관리와 스케줄링

  • 프로그램이 메모리에서 실행되면 프로세스 형태로 존재함.

    • 프로세스가 생성되면 운영 체제가 관리하고 스케줄링 함.
      • 프로세스에 우선순위를 할당하고, 우선순위에 따라 스케줄러(scheduler)가 스케줄링할 수 있도록 대기열을 통해 프로세스를 관리함.
  • 대기열 상태 확인: 더 나은 설계

  • 준비 완료 대기열이 비어 있다면 현재 운영 체제가 스케줄링해야 하는 프로세스가 없고, CPU가 유휴 상태에 있다는 것을 의미함.

  • CPU가 유휴 상태일 때 무엇인가를 해야 함.

    • 대기열이 비어있을 때, 무엇인가를 하는 코드를 추가하면 조건문이 계속 들어가므로 코드가 번잡해짐.
    • 단순히, 대기열을 가득 채워 스케줄러가 대기열에서 항상 실행할 수 있는 프로세스를 찾을 수 있도록 하면 됨.
      • 연결 리스트에서 감시자(sentinel) 노드를 사용하는 이유도 바로 이 이유임.
      • 커널 설계자는 유휴 작업이라는 프로세스를 만듦.
      • 시스템에 스케줄링 가능한 프로세스가 없으면 스케줄러는 이 유휴 프로세스를 꺼내서 실행함.
      • 유휴 프로세스는 항상 준비 완료 상태이며, 우선순위는 가장 낮음.
  • 모든 것은 CPU로 돌아온다.

  • CPU 설계자는 일찍이 시스템에 유휴 상태가 존재할 가능성을 고려했음.

    • 정지를 의미하는 halt 명령어를 설계함.
      • CPU 내부의 일부 모듈을 절전 상태로 전환하여 전력 소비를 크게 줄여줌.
      • 이 명령어는 특권 명령어라 커널 상태에서 CPU로만 실행될 수 있음.
        • 프로그래머가 이 명령어에 대한 실행 권한이 없음.
    • 프로세스 일시 중지(suspend)와 halt 명령어를 혼동하지 않도록 유의해야 함.
      • sleep 함수를 호출하면 해당 함수를 호출한 프로세스만 일시 중지 됨.
      • CPU halt를 실행한다는 것은 시스템 내 더 이상 실행할 준비가 완료된 프로세스가 없다는 것임.
  • 유휴 프로세스와 CPU의 저전력 상태

  • 본질적으로 halt 명령어를 계속 실행하는 순환임.

while(1)
{
    while(!need_resched())
    {
        cpuidle_idel_call();
    }
}
  • 실제로 리눅스 커널에서는 cpuidle_idle_call() 함수를 호출하여 최종적으로 halt 명령어를 실행하게 함.

    • 실제로 리눅스 커널은 유휴 프로세스를 구현할 때 더 많은 것을 고려함.
      • 깊은 수면 상태 (C3), 더 깊은 수면 상태 (C4) 상태를 가질 수 있는데, 커널은 시스템 유휴 시간을 예측하여 어떤 수면 상태로 진입할지 결정해야 함.
  • 무한 순환 탈출: 인터럽트

  • 위에서 순환적으로 halt 명령어를 무한루프를 돌며 콜해줬었음.

    • 그런데 무한 루프에 break, return 이 없음.
    • 운영 체제는 이 순환을 어떻게 빠져나올 것인가?
  • 컴퓨터 운영 체제는 일정 시간마다 타이머 인터럽트를 생성함.

    • CPU는 인터럽트 신호를 감지하고, 운영 체제 내부의 인터럽트 처리 프로그램을 실행함.
      • 상응하는 인터럽트 처리 함수에서는 프로세스가 실행될 준비가 되었는지 판단하고, 준비 되었다면 중단되었던 프로세스를 계속 실행함.
      • 준비되지 않았다면 프로세스를 일시 중지시키고, 스케줄러는 준비 완료 상태인 다른 프로세스를 스케줄링 함.
  • ex) 유휴 프로세스가 타이머 인터럽트로 일시 중지되면, 인터럽트 처리 함수 시스템에 준비 완료된 프로세스가 있는지 확인하고, 없다면 유휴 프로세스를 계속 실행함.

댓글

Designed by JB FACTORY