당신은 컴퓨터에서 사용하는 CPU에 대해 알고있는가?
오늘은 CPU를 중심으로, 실제 운영체제 안에서 어떤 일이 벌어지는지를 이야기해보겠다.
CPU는 '기계어의 명령어를 하나씩 순서대로 처리하는 연산 장치'이다.
우리가 계산기에서 1+1을 입력하고 실행하면 2라는 결과가 나오는 것처럼 프로그램을 실행하게 한다.
위 문장을 통해서 우리는 프로그램이란 "기계어의 명령어로 이루어져있거나 기계어의 명령어 그 자체이겠구나" 라는 사실을 유추할 수 있다.
여기서 우리는 궁금증이 들 수 있다.
계산기는 1+1 또는 2x2+3 정도로 한 번에 하나의 실행을 가진다. 그러나 컴퓨터는 동시에 여러 개의 프로그램을 돌려도 사용이 가능한 것처럼 보인다.

사실 컴퓨터에 있는 CPU는 하나의 작업만 처리할 수 있다. 그러나 운영체제는 CPU를 "너 잠깐 썼다가 쟤 줘."라고 하며 아주 빠르게 여러 프로그램에게 번갈아가면서 나눠준다.
그래서 우리는 마치 여러 프로그램이 동시에 실행되는 것처럼 느낄 수 있는 것이다.
그렇다면 운영체제. 즉, OS는 "어떻게 CPU에게 프로그램을 나눠줄까?"
OS는 실행 중인 프로그램 하나하나를 프로세스(Process)라는 단위로 관리한다.
프로세스는 단순히 하나의 프로그램이 아니라, 실행을 위해 운영체제가 할당한 자원을 포함한 각각 독립된 실행 환경이다.
예를 들자면, 프로그램은 요리책. 프로세스는 재료 손질, 재료 볶기 등의 요리책을 보고 실행하는 것이라고 보면 된다.

가상 메모리 관점에서의 프로세스는 위와 같이 코드 / 데이터 / 힙 / 스택으로 나뉜다.
코드: 프로그램의 명령어
데이터: 정적 변수
힙: 동적 변수
스택: 함수 호출 스택
만약 바깥에 있는 함수의 답을 내려고 하는데 안에 있는 함수가 답이 안나와있으면 어떻게할까?
바깥에 있는 함수도 답이 당연히 나오지 않을 것이다.
그래서 나중에 들어간 게 먼저 끝나는 LIFO(Last In First Out)구조를 가진 스택을 사용하게 된다.
스택에 대해선 추후 알고리즘 시간에 자세히 다뤄보도록 하겠다.하지만 CPU는 계속 다른 프로세스를 ADHD마냥 왔다갔다 거리기 때문에, "내가 아까 어디까지 했더라...?"를 기억하고 있어야한다.
그래서 OS는 각 프로세스마다 하나의 메모장을 만들어둔다.
우리는 그걸 PCB(Process Control Block)이라고 부른다.

PCB에는 CPU의 레지스터 상태, 프로세스 상태, 메모리 정보, 파일이나 입출력 정보, 현재 실행 위치같이 '내가 어디서 무슨 일을 어떻게 이어나가야하는지' 에 대한 정보가 정리되어있다.
그덕분에 프로세스를 기억하고 CPU는 왔다갔다 거리면서 멀티태스킹을 조질 수 있는거다.
CPU가 프로세스 A을 실행하다가 B로 넘어가는 순간에 OS는

1. A의 현재 상태를 PCB에 저장하고
2. B의 PCB를 꺼내서 확인하고
3. B의 상태를 CPU에 복원하고
4. B를 실행한다.
우리는 이 과정을 Context Switching(문맥교환) 이라고 한다.
여기서 문제가 생긴다.
운영체제에 있는 프로세스는 하나만 존재하지 않고 동시에 여러 개로 존재한다. 이를 멀티 프로세스라고 이야기한다.
이러한 멀티 프로세스 구조는 마치 각자 독립된 방을 쓰는 것과 같아서, 방 자체가 많아질수록 공간을 많이 차지하고, 방을 옮길 때마다 짐을 싸고 새 방으로 이동하는 시간이 필요하다는 단점을 가진다.
그래서 사람들은 스레드라는 개념을 창안해냈다.
스레드는 'CPU가 실제로 실행하는 최소 단위'이다.

스레드는 프로세스 내부에서 힙과 코드, 데이터를 공유하며 각자의 스택을 가진다. 즉 각자 어디서 일하고 있었는지를 나눠 가진다는 것이다.

이를 통해 힙과 코드를 공유하는 스레드는 바로바로 필요한 자원에 접근이 가능해졌고, 공간을 변경할 필요 없이 스택만 변경하면 되게 되었다. 또한 다른 스레드에서 새로운 힙, 코드, 데이터를 생성하지 않아도 되기에 저장 공간역시 확보가 되었다.
앞서 언급되었던 멀티 프로세스와 동일하게 멀티스레드라는 개념이 확립이 되었따.
오늘은 이렇게 CPU부터 스레드까지에 대한 개념을 가볍게 알아보았다. 다음에는 여러 프로세스와 스레드가 CPU에게 어떻게 선택되는지에 대해 알아보는 시간을 가질 것이다.
가기 전에 개인적으로 생각해보면 좋을 간단한 질문을 던져보겠다.
그럼 오늘은 여기까지.