내 프로그램이 파일을 기다리며 멈춰 있는 동안, CPU도 같이 노는 걸까요? 직원이 한 명뿐인 사무실을 떠올려 보세요 — 한 손님이 서류를 가지러 간 사이에도 직원은 다음 손님을 부릅니다.
본론에 들어가기 전에 큰 그림부터 그립니다. 컴퓨터가 프로그램을 돌린다는 것은 정확히 무슨 일이 벌어지는 것인지, 부품들이 각각 무슨 역할을 하는지를 먼저 알아야 뒤의 이야기가 전부 이어집니다. 특히 이 단원에서 꼭 가져가야 할 문장이 하나 있습니다 — CPU는 언제나 누군가의 코드를 실행하고 있습니다. 아래 다이어그램을 한 단계씩 넘겨보세요.
CPU는 계산과 명령 실행을 담당합니다. 메모리(RAM)는 지금 돌아가는 프로그램의 코드와 데이터를 담아둡니다. 디스크·네트워크·키보드 같은 것들은 장치라고 부릅니다. 중요한 건 CPU가 혼자서는 아무것도 모른다는 점입니다. 무엇을 할지는 메모리에 적힌 명령을 하나씩 읽어 와야 압니다.
디스크에 저장된 프로그램 파일은 그냥 죽어 있는 데이터입니다. 실행하면 운영체제가 그 내용을 메모리로 옮기고, 이 프로그램이 쓸 메모리 공간을 마련하고, CPU에게 "여기서부터 시작하라"고 알려줍니다. 그 순간부터 CPU는 그 프로그램의 명령을 한 줄씩 실행합니다.
프로그램이 디스크를 직접 조작하거나 다른 프로그램의 메모리를 읽을 수 있다면 컴퓨터는 순식간에 엉망이 됩니다. 그래서 그런 위험한 일은 운영체제만 할 수 있게 막아두고, 프로그램은 운영체제에게 부탁합니다. 또 운영체제는 CPU를 누구에게 얼마나 줄지도 정합니다. 즉 운영체제는 자원의 심판이자 중개인입니다.
"내 프로그램이 디스크를 기다리며 멈췄다"와 "CPU가 논다"는 완전히 다른 말입니다. 내 프로그램이 멈춘 순간, 운영체제는 곧바로 다른 프로그램을 CPU에 올립니다. CPU 입장에서는 쉴 틈이 없습니다. 실제로 CPU가 쉬는 것은 실행할 수 있는 프로그램이 하나도 없을 때뿐입니다. 앞으로 나올 모든 이야기가 이 구분 위에 서 있습니다.
아래 그림에서 CPU 상자 안의 라벨을 계속 보세요. 프로그램 A를 실행하다가, 시스템 콜이 일어나면 운영체제로 바뀌고, A가 기다리는 동안에는 프로그램 B로 바뀝니다. 장치가 일을 마치면 인터럽트로 CPU를 부르고, 아무도 실행할 게 없을 때만 idle이 됩니다. 이 라벨이 비어 있는 순간은 없습니다.
컴퓨터의 부품은 크게 셋입니다. 계산을 하는 CPU, 프로그램들이 올라와 있는 메모리, 그리고 디스크 같은 장치입니다. 메모리 안을 보세요 — 프로그램이 여러 개 동시에 올라와 있습니다. 하지만 CPU는 하나뿐이라, 지금 이 순간 실행되는 것은 그중 하나입니다.
시뮬레이터에서 해보기
이 단원의 용어
CPU는 언제나 누군가의 코드를 실행 중이다 — 내 프로그램이 멈춘 것과 CPU가 노는 것은 다르다.
남은 문제
그럼 CPU는 코드 한 줄을 정확히 어떻게 실행할까요? 다음 단원에서 명령 하나 수준까지 내려가 봅니다 →