‼️취준생이 작성한 글이므로 잘못된 정보가 있을 수 있습니다.
(편의상 반말을 사용하는 점 이해 바랍니다.)
Computer Science는 비단 비전공자뿐만 아니라 전공자들에게도 이해하지 않은 채 암기만 한다면 휘발성이 강한 지식이라 생각한다.
오늘은 그렇게 딥하진 않지만 프로세스/스레드의 시스템의 역사와 H/W의 발전을 조금 얘기해보고자 한다.
옛날옛적 프로세서는 단일 프로세스 시스템이었다.
CPU에서 한 번의 하나의 프로세스만 처리할 수 있는 시스템.
프로세스와 스레드가 생성되는 절차는 따로 포스팅을 할 예정이다.
짧게 말하자면...
운영체제 OS의 커널에 의해 실행된 프로그램은 OS로부터 가상 메모리를 할당받아 물리 메모리에 독립적으로 매핑되어 CPU에 올라온다. 이 때 프로그램은 실행중인 프로그램으로 '프로세스'라고 부른다.
그리고 이 프로세스는 각각의 명령어들과 데이터를 갖고 있다.
CPU(프로세서)는 프로세스가 갖고 있는 명령어를 처리하는 장치다.
단일 프로세스 시스템은 이렇게 메모리에 할당된 프로세스가 CPU상에 하나만 존재하고 처리하는 방식을 말한다.
무슨 말인지 글로는 읽히지만 이해되지 않는다.
예를 들어 보자.
샤워기(CPU)가 1대 뿐인 수질이 아주 좋은 목욕탕(컴퓨터)에 한 사람(프로세스)이 샤워를 하고 있다.
이 사람은 샤워기로 물을 틀어놓고 몸을 씻은 다음, 가져온 샤워용품을 고르고 있다.
여기서 한 사람이 샤워 용품을 고르게 된다면 샤워기는 사람을 씻기는 동작을 수행할 수 없고 물만 낭비하게 된다.
즉, 목욕탕(컴퓨터)에 한 사람(프로세스)이 샤워 용품을(Iuput/Output) 고르고 있다면, 샤워기(CPU)는 아무것도 못하고 물만 낭비하는 즉, 그냥 대기하게 된다.
여기서 Iuput/Output(I/O)는 프로세스가 컴퓨터 내부의 텍스트와 같은 파일을 읽고 쓰거나 네트워크로 데이터를 주고받는 행동과 같이 프로세스가 입출력 장치와 행동을 주고받는 것을 말한다.
프로세서는 입출력 장치에 접근할 수 없기 때문에, 입출력 연산장치인 I/O 컨트롤러가 입출력을 담당한다.
한 사람이(프로세스 P1) 하나의 샤워기만(CPU) 가지고 목욕탕에 들어가 샤워 용품 찾는 시간에, 밖에서 기다리고 있는 다른 사람(P2)은 목욕탕에 들어갈 수가 없다.
이게 초창기 단일 프로세스 시스템이다.
이렇게 되면 여러개의 프로세스라는 사람들은 샤워기(CPU)를 쓸 수 없다.
즉, 메모리에 여러 프로세스를 올려두고 사용할 수 없다.
단일 프로세스 시스템의 단점이다.
갑자기 목욕탕 사장님께서 목욕탕의 회전율을 높이기 위해, 한 샤워기를 다른 사람과 나눠서 쓴다면 할인해준다는 인스타 피드가 올라왔다.
부리나케 P1, P2라는 사람이 목욕탕으로 향하게 되는데..
그렇다면 목욕탕에 한 사람이 들어가서 샤워기를 차지하고, 샤워용품을 찾는 동안 다른 사람이 들어가서 샤워기(CPU)를 쓴다면 어떨까?
즉, 프로세스 P1이 I/O 작업을 하는 동안 P2가 들어와 CPU 작업을 하게 되면 샤워기(CPU)는 물을 낭비하지 않고 계속해서 쓸 수 있을 것이다.
이게 멀티 프로그래밍 등장 계기다.
단일 프로세스 시스템에서 프로세스가 I/O 작업을 하는 동안 CPU는 아무 연산도 처리하지 못하게 되어, 낭비되는 시간이 많았다.(다른 사람이 못들어온다.)
I/O 작업(샤워용품 찾기)을 하는 동안 민망하지만 다른사람이 같은 샤워기로 샤워를 하게 된다면 샤워기는 물낭비도 줄이고 목욕탕의 회전율을 높일 수 있게 된다.
하지만 여기서도 변수는 존재했다.
P1이라는 사람이 엄청 청결한 성격이라 샤워 용품을 찾기도 전에 (혹은 찾고 나서도) 샤워 시간이 엄청나게 길다는 것이다.
그래서 P2라는 사람이 샤워기를 쓰지도 못하고 옆에서 대기하고 있는 사태가 발생했다.
어.. 이러면.. 목욕탕 사장님 입장에선 이벤트하는 의미가 없는데..
그래서 등장한게 멀티 태스킹 방식이다.
목욕탕에선 이벤트에 조건을 달았다.
"샤워기 장시간 독점 금지"
사장님은 한 사람당 샤워기를 쓰는 시간을 엄청 적게 제한하여 다른 사람과 나눠 쓰게끔 했다.
마치 우리가 군대 훈련소에서 샤워를 할 때 조교님께서 1분대, 2분대 샤워 1분안에 조집니다 실시! 라고 말하는 것 처럼...
이를 CS에선 퀀텀시간(아주 짧은 시간)으로 쪼개어 CPU를 나눠쓴다라고 말하는 듯 하다.
이렇게 되면 P1과 P2라는 사람은 각자 옆에서 지켜보다가 짧은 시간동안 같은 샤워기를 나눠쓰게 된다.
즉, 프로세스들이 아주 짧은 시간동안 서로 번갈아가며 CPU에서 실행되게끔 말이다.
멀티태스킹의 목적은 프로세스의 응답시간(샤워시간)을 최소화 시키는 게 목적이다.
이로써 샤워기가 하나밖에 없는 목욕탕에서 동시에 2명의 사람이 씻고 있는 것처럼 보이게 된다.
근데 여기서도 또 변수가 발생했다.
P1, P2라는 사람이 각자 짧은 시간동안 샤워기를 나눠 쓰는데,
P1은 찬물샤워
P2는 뜨거운물로 샤워를 해야했다.
이는 샤워기 입장에서 보일러를 껐다 켰다 해야하는 번거로운 작업이기도 하며
목욕탕의 전력소모도 커지는.. 목욕탕 입장에선 부담스러운 작업이다.
이를 CS에선 컨텍스트 스위칭(Context Switching)이라 한다.
자세한건 나중에 따로 포스팅(MARK: TODO....) 하겠삼...
무튼, 이런 컨텍스트 스위칭은 CPU 입장에서 오버헤드가 많이 걸리는 부담스러운 작업이기에 기피하는 게 좋다.
멀티 태스킹 방식이 좋아 보이지만 아쉬움도 남는다.
당연히 사장님 입장에서는 돈을 더 투자하더라도 샤워기(CPU)를 추가하고 싶어한다. 하지만 여건이 안 된다.
사장님은 또 다시 이벤트에 조건을 추가했다.
"분신술 써서 샤워 빨리 끝내면 추가 할인"
스레드의 등장이다.
사실 한 사람을 프로세스를 예로 드는 건 정확하지 않다.
왜냐하면 스레드란, CPU에서 실행되는 단위로 각 프로세스 내부에는 스레드가 있다.
P1이라는 사람이 분신술을 써서 T1, T2가 되었다.
이는 프로세스 P1 그룹의 쓰레드들이다.
T1, T2 분신 복제 인간들은 둘 중 한명만 완벽하게 씻으면 된다.
즉 하나의 프로세스가 동시에 여러 작업을 수행할 수 있는데 초점을 맞춰보자.
T1, T2의 동일한 사람들은 샤워 습성도 같기 때문에 동일한 물온도에서 샤워할 수 있다.
이렇게 되면 샤워기 입장에선 물온도를 바꾸지 않아도 되며, 보일러 전력소모도 줄게되어 목욕탕 입장에선 이득이다.
즉, 스레드들간의 컨텍스트 스위칭 비용이 줄어든다.
P1이 T1, T2의 인간으로 나눠 그 중 한명만 샤워를 해결하면 비용적으로 이득이다.
이렇게 한 사람을 씻기는데 시간이 반으로 줄었음에도 불구하고
목욕탕 사장님은 돈욕심이 생긴다. 회전율을 더 높이고 싶어한다.
마침 샤워기 제조업체에서 샤워기를 1대 제공해준다고 한다.
이는 두 개 이상의 프로세서나 코어를 활용하는 시스템이다.
말이 어렵다.
................................................................
목욕탕이라는 컴퓨터에
샤워기라는 CPU(안의 코어)가 추가 됐다!
................................................................
사장님은 분신술을 쓴 사람은 샤워기를 두 대를 모두 써도 된다고 한다.
그래서 프로세스는 두 사람으로 나눠 샤워기를 각각 한대씩 사용하며
한 사람이 반반씩 샤워를 마친다면 샤워를 마친것으로 간주했다!
이게 멀티 스레딩 방식이다.
이제 멀티 프로세싱을 보자.
CPU 내에 두 개의 코어가 존재한다.
샤워기가 2대가 됐다.
P1, P2라는 사람이 각자 목욕탕에 들어가서 분신술을 쓴다.
P1(T1, T2), P2(T3,T4) 네 명의 사람들이
퀀텀 시간동안 샤워기(CPU, 코어)를 나누어 사용하며 목욕탕의 회전율을 엄청나게 높일 수 있게 되었다!