
CPU와 운영 체제
CPU의 유휴 상태
대부분 컴퓨터의 CPU 사용률은 높지 않다. 아무 작업도 일어나지 않을 때, 컴퓨터는 무엇을 하고 있을까?
CPU 사용률을 확인해 보면, System Idle Process(유휴 프로세스)가 거의 모든 CPU 시간을 소모하고 있다.
이는 운영 체제의 프로세스 관리 체계에서 그 이유를 알 수 있다.
운영 체제는 프로세스에 우선순위를 할당하고, 우선순위에 따라 스케줄러가 스케줄링할 수 있도록 대기열에 프로세스를 넣는다.

운영 체제는 대기열을 가득 채워 스케줄러가 대기열에서 항상 실행할 수 있는 프로세스를 찾을 수 있도록 한다. (NULL 가능성 제거)
시스템에 스케줄링 가능한 프로세스가 없을 때 스케줄러는 유휴 프로세스를 꺼내서 실행하며, 시스템에 할 일이 남아 있지 않으면 유휴 프로세스가 실행된다.
운영 체제가 유휴 프로세스를 실행하는 방법
- 시스템에 유휴 상태가 존재하면 halt 기계 명령어로 CPU 내부의 일부 모듈을 절전 상태로 전환(순환)
- 일정 시간마다 타이머 인터럽트를 생성한다.
- CPU는 인터럽트 신호를 감지하고, 인터럽트 처리 프로그램을 실행
- 프로세스 실행, 일시 중지, 스케줄링
- 유휴 프로세스가 타이머 인터럽트로 일시 중지되면 인터럽트 처리 함수는 시스템에 준비된 프로세스 유무를 확인하고, 없다면 유휴 프로세스를 계속 실행한다.
CPU와 수치 체계
컴퓨터 시스템이 2진법인 이유는 컴퓨터의 저수준 계층, CPU가 스위치인 트랜지스터로 구성되어 있기 때문이다.
컴퓨터 시스템의 2진법은 아라비아 숫자 체계와 같이 위치 기수법을 사용하며, 따라서 비트 k개를 사용하면 정수 2^k개를 나타낼 수 있다.
2진법으로 부호를 포함하여 나타내려면 어떻게 해야 할까?
만약 4비트로 수를 표현한다고 가정하면 16개의 수를 표현할 수 있는데, 절반은 1 ~ 7, 나머지 절반은 -1 ~ -7에 나누어주어야 한다.
이를 부호와 함께 표현하는 세 가지 설계 방법이 있다.
1. 부호-크기 표현(sign-magnitude)
최상위 비트를 1로 바꾸기만 하여 대응하는 음수를 표현하는 것
단점: -0이라는 이상한 숫자가 나타남, 연산 결과 불일치

2. 1의 보수(one's complement)
부호-크기 표현을 반전시킨 방법으로, +2의 2진법 표기 숫자를 완전히 반전시킨 숫자를 -2로 표현하는 것
단점: -0 여전히 존재, 연산 결과 불일치

3. 2의 보수(two's complement)
자리 올림수를 무시하고 연산 수식을 올바르게 표현할 수 있는 방법

현대 컴퓨터는 2의 보수 표현 방식을 사용한다.
그 이유는 회로 설계를 단순화할 수 있기 때문이며, 가산기는 양수와 음수에 대해 신경쓰지 않고 두 비트의 논리 게이트 연산 결과만 신경쓰기 때문이다.
CPU와 프로그래밍 언어
하나의 기계 명령어를 처리하는 과정은
- 명령어 인출(instruction fetch)
- 명령어 해독(instruction decode)
- 실행(execute)
- 다시 쓰기(writeback)
의 네 단계로 구분할 수 있고, 각 단계는 파이프라인 방식으로 실행된다.

만약, if 문과 같은 조건 분기문을 만나면 어떻게 이미 파이프라인에 넣을 명령어를 알 수 있을까?
이 때 CPU는 미리 예측을 하게 된다. 추측이 맞았다면 파이프라인은 계속 앞으로 흘러가며, 추측이 틀렸다면 파이프라인에서 실행 중이던 잘못된 분기 명령어를 전부 무효화한다.
이렇게, CPU의 추측이 틀리게 된다면 성능 손실이 생기게 된다.
이 추측 과정을 분기 예측이라고 한다.
배열이 정렬되어 있을 때는 분기 예측 성공률이 매우 높지만, 배열이 정렬되어 있지 않다면 if 조건의 결과에는 규칙성이 없으므로 분기 예측 성공률이 매우 낮아진다.
결국, 높은 성능의 코드를 작성하려면, CPU가 높은 확률로 추측할 수 있는 코드를 작성해야 한다.
'CS > 밑바닥' 카테고리의 다른 글
| 캐시(Cache) (0) | 2024.07.30 |
|---|---|
| CPU(중앙 처리 장치, Central Processing Unit) (1) | 2024.07.16 |
| 동기와 비동기, 블로킹과 논블로킹 (0) | 2024.06.26 |
| 콜백 함수와 비동기 프로그래밍 (0) | 2024.06.26 |
| 코루틴(Coroutine) - 스레드보다 가벼운 멀티 태스킹 (0) | 2024.06.18 |