티스토리 뷰

컴퓨터에서 워드로 문서작업을 하면서 동시에 유튜브로 음악을 재생해서 들을 수도 있다. 그러면서 동시에 카카오톡으로 채팅을 할 수도 있는데 우리는 이를 통해 컴퓨터가 여러 일을 동시에 수행하고 있음을 알 수 있다.

 

어떻게 CPU 코어 수보다 많은 작업을 멀티태스킹 하는 걸까?

 

프로세스와 스레드의 개념을 알아야 이 질문에 답할 수 있다.

 

 

프로세스


먼저 프로그램이란 어떤 일을 수행하기 위해 만들어진 명령 모음이다. 다른 관점에서 보면 명령 모음이 파일로 빌드되어 보조 기억 장치에 저장되어 있는 정적인 상태라고 할 수 있다.

 

우리가 프로그램 실행 명령을 내리면 CPU는 보조 기억 장치에서 꺼내 메인 메모리에 올려놓고 코드를 해석하며 작업을 시작한다. 이처럼 프로그램이 메인 메모리로 올라와 실행되고 있는 상태를 프로세스라고 한다.

 

2코어, 즉 두 대의 로봇이 일하는 푸드 트럭에 햄버거와 치킨버거, 새우버거, 그리고 치즈버거 주문이 한꺼번에 들어왔다.

 

각각의 버거가 하나의 프로세스라고 가정하면 고객에게 한 번에 제공하기 위해서는 버거 네 개를 동시에 요리해야 한다. 로봇들은 이를 어떻게 해결해야 할까? 프로세스 처리 방법은 크게 두 가지가 있다.

 

1. 병렬 처리 방법

병렬 처리 여러 작업을 동시에 실행하는 방법이다.

 

2개 이상의 코어가 각기 다른 프로세스의 명령을 실행해서 각 프로세스가 같은 순간에 실행되도록하는 방법이다.

 

네 대의 로봇이 푸드트럭에 있는 경우 각각의 로봇이 한 종류의 버거를 맡아서 요리한다고 보면 된다.

그러나 지금은 로봇이 두 대 뿐이다. 1번 로봇이 햄버거를 만들고 2번 로봇이 치킨버거를 만들면 나머지 두 개의 버거는 대기해야 한다.

 

 

 

 

 

 

2. 병행 처리 방법

병행 처리 하나의 코어가 여러 프로세스를 돌아가면서 조금씩 처리하는 것을 말한다.

 

네 개의 버거를 동시에 만들기 위해 두 대의 로봇이 식탁 좌우를 빠르게 왔다 갔다 한다. 한 로봇이 빵 네 개를 깔 때 다른 한 로봇은 야채를 썰어 올리고 빵을 깔던 로봇이 버거에 맞는 패티를 올리면 야채를 썰던 로봇이 다시 빵 네 개를 덮어서 네 개의 버거가 마치 동시에 조리된 것처럼 보이게 하는 방법이다.

 

따라서 병행 처리작업을 조금씩 나누어 실행하면서 컴퓨터가 마치 여러 작업을 동시에 실행하는 것처럼 보이게 하는 처리 방법이다.

 

 

 

 

햄버거를 만들 때 치킨버거, 새우버거, 치즈버거로 진행 순서를 바꾸는 것을 컨텍스트 스위칭이라고 한다.

 

컴퓨터에서는 컨텍스트 스위칭이 매우 빠르게 일어나기 때문에 사람의 눈에는 마치 여러 프로그램이 동시에 돌아가는 것처럼 느껴진다.

 

프로그램이 효율적으로 설계되었다면 두 코어가 프로세스를 두 개씩 ‘병렬’로 분담해서 각자가 맡은 버거를 ‘병행’해서 요리하기도 하는데 이처럼 여러 개의 프로세스를 함께 진행하는 것을 멀티 프로세싱이라고 부른다.

 

 

 

프로세스를 또 나눈 단위, 스레드


한 프로세스 안에 여러 작업이 동시에 진행되기도 한다.

 

예를 들어 채팅 앱은 사용자가 메시지를 입력하는 도중에도 상대방이 새로운 메시지를 보냈는지 계속해서 확인한다. 만약 상대방이 이전 메시지로 보낸 동영상에 ‘받기’를 누른 상태라면 채팅을 하는 동시에 동영상 다운로드까지 함께 진행되는 중이다.

 

이처럼 한 프로세스 안에 하나 이상 진행될 수 있는 일의 단위를 스레드라고 한다.

 

한 개의 버거를 요리하는 작업이 하나의 프로세스라면 빵을 데우는 작업과 패티를 굽는 작업, 야채를 써는 작업은 스레드로 구분할 수 있다. 스레드 역시 프로세스와 같이 컨텍스트 스위칭을 통해 여러 개의 작업이 병행 처리된다. 빵을 오븐에 넣고, 패티를 팬에 올리고, 토마토를 썰고, 오븐에서 빵을 꺼내고, 패티를 뒤집고, 양상추를 썰고 하는 식으로 진행되는 것이다.

 

이처럼 여러 스레드가 함께 실행되는 것을 멀티 스레딩이라고 한다.

 

 

 

프로세스와 스레드의 차이


바로 메인 메모리를 어떻게 함께 사용하는가 이다.

 

멀티 프로세싱에서 각각의 프로세스는 요리 탁자에 선을 긋듯 자기 영역을 명시해 둔다. 햄버거를 만들 공간, 치킨버거를 만들 공간이 분리되어 있다는 뜻이다. 새우버거의 재료를 치킨버거나 치즈버거 자리에 둘 수 없다는 뜻도 된다. 그렇기 때문에 동시에 진행되는 프로세스가 많아지면 메인 메모리는 그 배수만큼 필요하다.

 

반면 스레드는 서로의 공간을 분리하지 않는다.

 

치즈버거 프로세스에 할당된 요리 탁자 공간은 해당 프로세스에 속한 모든 스레드가 공유한다.

 

예를 들어 빵을 놓는 공간과 야채를 다듬을 공간을 따로 구분할 필요가 없는 것이다. 그렇기 때문에 아무리 스레드가 많아져도 메모리를 추가로 차지하지 않는다. 그리고 프로세스와는 달리 자리를 옮겨 다닐 필요가 없기 때문에 컨텍스트 스위칭에 드는 부담도 덜하다.

 

겉보기에는 성능상 스레드가 유리하지만 주의할 점이 있다.

 

같은 메모리 공간을 여러 스레드가 사용하기 때문에 그 과정에서 발생할 수 있는 오류에 대비해서 프로그래밍해야 한다는 것이다.  

 

예를 들어 벽에 못질하는 프로세스 안에서는 여러 개의 스레드가 못 박을 위치를 공유하는데, 못의 위치를 잡는 스레드와 망치질을 하는 스레드의 타이밍이 엇갈린다면 손을 크게 다칠 수 있다. 

 

와 같은 일이 벌어지지 않도록 스레드를 다루는 프로그램은 시간적 요소까지 고려해서 신중하게 설계해야 한다. 

 

 

+) 이해가 너무 잘된다.. 조만간 이 책으로 스터디 해야겠다..!

 

추가로 읽어볼 것: https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4

 

 

참고

https://hongong.hanbit.co.kr/cpu%ea%b0%80-%eb%a9%80%ed%8b%b0%ed%83%9c%ec%8a%a4%ed%82%b9%ec%9d%84-%ed%95%98%eb%8a%94-%eb%b0%a9%eb%b2%95-%ed%94%84%eb%a1%9c%ec%84%b8%ec%8a%a4-vs-%ec%8a%a4%eb%a0%88%eb%93%9c/

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함