우리는 컴퓨터에서 워드로 문서 작업을 하면서 동시에 음악을 재생해서 들을 수 있습니다. 그러면서도 PC용 메신저로 친구와 채팅을 할 수도 있고, 브라우저에서 게임 설치 파일을 다운로드할 수도 있죠. 이를 통해 우리는 컴퓨터가 여러 가지 일을 동시에 수행하고 있음을 알 수 있습니다. 사실 우리 눈에 보이지 않는 곳에서 동시에 진행되는 여러 작업을 모두 포함하면 수백 개가 훌쩍 넘어가기도 합니다.
컴퓨터는 어떻게 CPU 코어 수보다 많은 작업을 멀티태스킹 하는 걸까요? 이를 알기 위해서는 먼저 프로세스와 스레드의 개념을 알아야 합니다.
🚴♀️프로그램이 실행 중인 상태, 프로세스
프로그램이란 ‘어떤 일을 수행하기 위해 만들어진 명령 모음’이라고 생각하면 되는데요, 프로그램을 다른 관점에서 이야기하면 명령의 모음이 파일로 빌드되어 보조 기억 장치(여러 가지 음식 재료가 냉장고 안)에 저장되어 있는 정적인 상태라고 할 수 있습니다. 우리가 프로그램 실행 명령을 내리면 CPU는 보조 기억 장치에서 꺼내 메인 메모리에 올려놓고 코드를 해석하며 작업을 시작합니다. 이처럼 프로그램이 메인 메모리로 올라와 실행되고 있는 상태를 프로세스라고 합니다.
2코어, 즉 두 대의 로봇이 일하는 푸드 트럭에 햄버거와 치킨버거, 새우버거, 그리고 치즈버거 주문이 한꺼번에 들어왔습니다. 각각의 버거가 하나의 프로세스라고 가정해 보겠습니다. 고객에게 한 번에 제공하기 위해서는 버거 네 개를 동시에 요리해야 합니다. 로봇들은 이를 어떻게 해결해야 할까요? 여러 프로세스를 함께 처리하는 방법은 크게 두 가지입니다.
첫째, 병렬 처리 방법입니다.
병렬 처리는 여러 작업을 동시에 실행하는 방법입니다. 2개 이상의 코어가 각기 다른 프로세스의 명령을 실행해서 각 프로세스가 같은 순간에 실행되도록 하는 방법이죠.
예를 들어 푸드 트럭에 네 대의 로봇이 있다면 각각의 로봇이 한 종류의 버거를 맡아서 요리한다고 생각하면 됩니다. 멀티 코어 환경에 맞게 프로그래밍만 잘 되어 있다면 코어의 개수만큼 빠른 일 처리가 가능합니다. 하지만 지금 푸드 트럭에는 로봇이 두 대뿐입니다. 1번 로봇이 햄버거를 만들고 2번 로봇이 치킨버거를 만들면 나머지 두 개의 버거는 대기해야 합니다.
둘째, 병행 처리 방법입니다.
병행 처리는 하나의 코어가 여러 프로세스를 돌아가면서 조금씩 처리하는 것을 말합니다.
네 개의 버거를 동시에 만들기 위해 두 대의 로봇이 식탁 좌우를 빠르게 왔다 갔다 합니다. 한 로봇이 빵 네 개를 깔 때, 다른 한 로봇은 야채를 썰어 올리고, 빵을 깔던 로봇이 버거에 맞는 패티를 올리면, 야채를 썰던 로봇이 다시 빵 네 개를 덮어서 네 개의 버거가 마치 동시에 조리된 것처럼 보이게 하는 방법이죠. 병행 처리란 작업을 조금씩 나누어 실행하면서 컴퓨터가 마치 여러 작업을 동시에 실행하는 것처럼 보이게 하는 처리 방법입니다.
햄버거를 만들 때 치킨버거, 새우버거, 치즈버거로 진행 순서를 바꾸는 것을 컨텍스트 스위칭이라고 합니다. 컴퓨터에서는 컨텍스트 스위칭이 매우 빠르게 일어나기 때문에 사람의 눈에는 마치 여러 프로그램이 동시에 돌아가는 것처럼 느껴집니다.
프로그램이 효율적으로 설계되었다면 두 코어가 프로세스를 두 개씩 ‘병렬’로 분담해서 각자가 맡은 버거를 ‘병행’해서 요리하기도 합니다. 이처럼 여러 개의 프로세스를 함께 진행하는 것을 멀티 프로세싱이라고 부릅니다.
프로세스를 또 나눈 단위, 스레드
한 프로세스 안에 여러 작업이 동시에 진행되기도 합니다. 예를 들어 채팅 앱은 사용자가 메시지를 입력하는 도중에도 상대방이 새로운 메시지를 보냈는지 계속해서 확인합니다. 만약 상대방이 이전 메시지로 보낸 동영상에 ‘받기’를 누른 상태라면 채팅을 하는 동시에 동영상 다운로드까지 함께 진행되는 중이죠. 이처럼 한 프로세스 안에 하나 이상 진행될 수 있는 일의 단위를 스레드라고 합니다.
한 개의 버거를 요리하는 작업이 하나의 프로세스라면 빵을 데우는 작업과 패티를 굽는 작업, 야채를 써는 작업은 스레드로 구분할 수 있습니다. 스레드 역시 프로세스와 같이 컨텍스트 스위칭을 통해 여러 개의 작업이 병행 처리됩니다. 빵을 오븐에 넣고, 패티를 팬에 올리고, 토마토를 썰고, 오븐에서 빵을 꺼내고, 패티를 뒤집고, 양상추를 썰고 하는 식으로 진행되는 것이죠. 이처럼 여러 스레드가 함께 실행되는 것을 멀티 스레딩이라고 합니다.
프로세스와 스레드의 차이
프로세스와 스레드에는 중요한 차이점이 있습니다. 바로 ‘메인 메모리를 어떻게 함께 사용하는가’입니다.
멀티 프로세싱에서 각각의 프로세스는 요리 탁자에 선을 긋듯 자기 영역을 명시해 둡니다. 햄버거를 만들 공간, 치킨버거를 만들 공간이 분리되어 있다는 뜻이죠. 새우버거의 재료를 치킨버거나 치즈버거 자리에 둘 수 없다는 뜻도 됩니다. 그렇기 때문에 동시에 진행되는 프로세스가 많아지면 메인 메모리는 그 배수만큼 필요합니다.
반면 스레드는 서로의 공간을 구분하지 않습니다. 치즈버거 프로세스에 할당된 요리 탁자 공간은 해당 프로세스에 속한 모든 스레드가 공유합니다. 예를 들어 빵을 놓는 공간과 야채를 다듬을 공간을 따로 구분할 필요가 없는 것이죠. 그렇기 때문에 아무리 스레드가 많아져도 메모리를 추가로 차지하지 않습니다. 그리고 프로세스와는 달리 자리를 옮겨 다닐 필요가 없기 때문에 컨텍스트 스위칭에 드는 부담도 덜합니다.
이처럼 성능상 스레드가 유리하지만, 주의할 점이 있습니다. 같은 메모리 공간을 여러 스레드가 사용하기 때문에 그 과정에서 발생할 수 있는 오류에 대비해서 프로그래밍해야 한다는 것이죠. 예를 들어 벽에 못질하는 프로세스 안에서는 여러 개의 스레드가 못 박을 위치를 공유하는데, 못의 위치를 잡는 스레드와 망치질을 하는 스레드의 타이밍이 엇갈린다면 손을 크게 다칠 수 있습니다. 이와 같은 일이 벌어지지 않도록 스레드를 다루는 프로그램은 시간적 요소까지 고려해서 신중하게 설계해야 합니다.
코딩 유튜버 얄코의 동영상 강의로 프로세스와 스레드에 대해 더욱 쉽게 알아보세요!
아는 단어가 적으면 외국에서 말을 꺼내기 힘든 것처럼, 업계에서 자주 사용하는 IT 용어가 낯설면 회의나 업무에서 난감할 때가 많죠. 이 책은 그 난감함을 해소하고, 개발자와 원활히 소통할 수 있는 기본적인 IT 지식을 제공합니다.
⠀
프로그래밍을 전문적으로 배우지 않아도, 개발자와 원활히 소통할 수 있는 정도의 IT 지식을 갖춘다면 큰 차이를 만들어낼 수 있습니다. 유튜버 ‘얄팍한 코딩 사전’과 함께 나에게 필요한 부분만 쏙쏙, 부담없이 시작해보세요. (•̀ᴗ•́)و ̑̑
👀 도서 자세히 보기
✍️ 유튜브 강의 바로가기
Leave A Comment