컴퓨터의 CPU 사용률은 얼마인가?
대부분의 CPU 사용률은 7~8% 정도로 매우 낮음.
- 물론 게임, 영상 편집, 이미지 처리 같은 상황은 다르게 판단해야 함.
- 이러한 상황이 아님에도 사용률이 항상 높다면 소프트웨어 버그이거나, 바이러스 감염 가능성을 고려해야 함.
- 물론 게임, 영상 편집, 이미지 처리 같은 상황은 다르게 판단해야 함.
ex) 프로세스가 약 300개가 열려있는데, 이렇게 많은 프로세스는 기본적으로 아무 작업도 하지 않고 있음.
- 특정 이벤트가 발생하여 자신을 깨우기를 기다리고 있음.
- 즉, 그전 까지는 계속 대기 상태에 머무르게 됨.
프로세스 관리와 스케줄링
프로그램이 메모리에서 실행되면 프로세스 형태로 존재함.
- 프로세스가 생성되면 운영 체제가 관리하고 스케줄링 함.
- 프로세스에 우선순위를 할당하고, 우선순위에 따라 스케줄러(scheduler)가 스케줄링할 수 있도록 대기열을 통해 프로세스를 관리함.
- 프로세스가 생성되면 운영 체제가 관리하고 스케줄링 함.
대기열 상태 확인: 더 나은 설계
준비 완료 대기열이 비어 있다면 현재 운영 체제가 스케줄링해야 하는 프로세스가 없고, CPU가 유휴 상태에 있다는 것을 의미함.
CPU가 유휴 상태일 때 무엇인가를 해야 함.
- 대기열이 비어있을 때, 무엇인가를 하는 코드를 추가하면 조건문이 계속 들어가므로 코드가 번잡해짐.
- 단순히, 대기열을 가득 채워 스케줄러가 대기열에서 항상 실행할 수 있는 프로세스를 찾을 수 있도록 하면 됨.
- 연결 리스트에서 감시자(sentinel) 노드를 사용하는 이유도 바로 이 이유임.
- 커널 설계자는 유휴 작업이라는 프로세스를 만듦.
- 시스템에 스케줄링 가능한 프로세스가 없으면 스케줄러는 이 유휴 프로세스를 꺼내서 실행함.
- 유휴 프로세스는 항상 준비 완료 상태이며, 우선순위는 가장 낮음.
모든 것은 CPU로 돌아온다.
CPU 설계자는 일찍이 시스템에 유휴 상태가 존재할 가능성을 고려했음.
- 정지를 의미하는 halt 명령어를 설계함.
- CPU 내부의 일부 모듈을 절전 상태로 전환하여 전력 소비를 크게 줄여줌.
- 이 명령어는 특권 명령어라 커널 상태에서 CPU로만 실행될 수 있음.
- 프로그래머가 이 명령어에 대한 실행 권한이 없음.
- 프로세스 일시 중지(suspend)와 halt 명령어를 혼동하지 않도록 유의해야 함.
- sleep 함수를 호출하면 해당 함수를 호출한 프로세스만 일시 중지 됨.
- CPU halt를 실행한다는 것은 시스템 내 더 이상 실행할 준비가 완료된 프로세스가 없다는 것임.
- 정지를 의미하는 halt 명령어를 설계함.
유휴 프로세스와 CPU의 저전력 상태
본질적으로 halt 명령어를 계속 실행하는 순환임.
while(1)
{
while(!need_resched())
{
cpuidle_idel_call();
}
}
실제로 리눅스 커널에서는 cpuidle_idle_call() 함수를 호출하여 최종적으로 halt 명령어를 실행하게 함.
- 실제로 리눅스 커널은 유휴 프로세스를 구현할 때 더 많은 것을 고려함.
- 깊은 수면 상태 (C3), 더 깊은 수면 상태 (C4) 상태를 가질 수 있는데, 커널은 시스템 유휴 시간을 예측하여 어떤 수면 상태로 진입할지 결정해야 함.
- 실제로 리눅스 커널은 유휴 프로세스를 구현할 때 더 많은 것을 고려함.
무한 순환 탈출: 인터럽트
위에서 순환적으로 halt 명령어를 무한루프를 돌며 콜해줬었음.
- 그런데 무한 루프에 break, return 이 없음.
- 운영 체제는 이 순환을 어떻게 빠져나올 것인가?
컴퓨터 운영 체제는 일정 시간마다 타이머 인터럽트를 생성함.
- CPU는 인터럽트 신호를 감지하고, 운영 체제 내부의 인터럽트 처리 프로그램을 실행함.
- 상응하는 인터럽트 처리 함수에서는 프로세스가 실행될 준비가 되었는지 판단하고, 준비 되었다면 중단되었던 프로세스를 계속 실행함.
- 준비되지 않았다면 프로세스를 일시 중지시키고, 스케줄러는 준비 완료 상태인 다른 프로세스를 스케줄링 함.
- CPU는 인터럽트 신호를 감지하고, 운영 체제 내부의 인터럽트 처리 프로그램을 실행함.
ex) 유휴 프로세스가 타이머 인터럽트로 일시 중지되면, 인터럽트 처리 함수 시스템에 준비 완료된 프로세스가 있는지 확인하고, 없다면 유휴 프로세스를 계속 실행함.
'Book > 컴퓨터 밑바닥의 비밀' 카테고리의 다른 글
책너두 (컴퓨터 밑바닥의 비밀) 24일차 CPU가 if 문을 만났을 때 (0) | 2024.05.14 |
---|---|
책너두 (컴퓨터 밑바닥의 비밀) 23일차 CPU는 숫자를 어떻게 인식할까? (1) | 2024.05.13 |
책너두 (컴퓨터 밑바닥의 비밀) 21일차 이 작은 장난감을 CPU라고 부른다. (0) | 2024.05.09 |
책너두 (컴퓨터 밑바닥의 비밀) 20일차 왜 SSD는 메모리로 사용할 수 없을 까? (0) | 2024.05.08 |
책너두 (컴퓨터 밑바닥의 비밀) 19일차 대표적인 메모리 관련 버그 (0) | 2024.05.07 |