CS

[CS] Concurrent Programming

gangmin 2023. 10. 11. 13:56

안녕하세요. 미니입니다. 오늘은 개발자들을 괴롭히는 주범 중 하나인 동시성 프로그래밍에 대해서 작성해보려고 합니다. 해당 내용은 예전에 학습했던 내용을 토대로 다시 편집하여 작성한 글입니다.

(직접 학습한 내용 중 틀린부분이 있다면, 댓글 남겨주시면 더욱 발전하겠습니다.)

저희가 일반적으로 사용하는 컴퓨터는 실제로 많은 작업을 수행하며, 여러가지의 일을 동시에 수행하게 됩니다. 가령, 예를 들어서 노래를 들으면서 코딩을 하는 상황에서 노래도 불러야하고, 코딩을 위한 IDE 프로그램을 실행해야하고, 코딩에 빠질 수 없는 구글 검색도 수행해야 하죠. 이것이 가능한 비밀(?)은 CPU에 있습니다. CPU를 볼때, 코어와 스레드에 대해서 막연하게 생각했던 부분을 잡고 넘어가는 것이 명확할 것 같아서 조금 설명을 첨가해보려고 합니다.

 

코어

CPU 내에서 실질적인 일을 처리하는 친구입니다. 코어는 한번에 한가지 일만을 처리할 수 있습니다. 하지만, 한개의 코어만을 가진 CPU가 여러가지의 일을 수행하지 못하는 것은 아닙니다. 동시에 처리하는 것처럼 아주 빠르게 움직이면 되죠! 빠르게 움직이는 것이 동시에 처리하는 것랑은 좀 다른 거 아니야? 라고 생각할 수 있지만, 컴퓨터는 사람이 아니기 때문에 빠르게 움직이는 시간의 단위는 상상할 수 없을 정도로 짧기 때문에 사람이 동시에 하는 것이랑 동일할 수 있습니다.
그렇다면, 저희는 코어가 많은 경우에 무조건적으로 빠를까요? 아닙니다. 코어가 여러개일 경우에 일을 분배하는 과정이 필요할 텐데 이런 딜레이가 발생하게 되면, 싱글 코어보다 속도가 느려질 수도 있습니다. 또한, 싱글 코어에만 최적화된 소프트웨어일 수도 있습니다.

 

스레드

스레드는 어떤 프로그램 내에서 실행되는 작업의 단위입니다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램의 환경에 따라 여러개의 스레드를 동시에 실행할 수 있습니다. 이를 멀티 스레드라고 부릅니다. 이런 스레드는 하드웨어적 스레드와 소프트웨어적 스레드가 구분됩니다. 소프트웨어에서 스레드는 프로세스 내에서의 작업 단위가 되는 가상의 스레드를 말하게 됩니다.

이렇게 잠깐 코어와 스레드를 알아보았습니다. 이 개념을 통해서 동시성 프로그래밍과 병렬 프로그래밍이 어떻게 이루어지는 지 이해하는데 용이할 것입니다.

 

병렬 프로그래밍

병렬 프로그래밍은 일을 병렬적으로 처리한다는 의미를 추측할 수 있습니다. 여러개의 코어가 하나의 작업을 분담하여 처리하는 것입니다. (뭔말인지 하나도 이해가 안됩니다 ㅋㅋㅋ) 쉬운 이해를 위해서 예를 들어봅시다.

 

 

카페에서 커피를 시키는 장면을 생각해봅시다. 저희는 A 직원에게 어떤 음료를 마시고 싶은지 주문을 하게 될 것이고, B 직원은 주문 들어온 음료를 제작하고, C 직원은 만들어진 음료를 손님이 가지고 갈 수 있도록 서빙하게 됩니다.
여기서 직원들은 각각의 코어이고, 작업은 커피를 판매하는 일이 될 것입니다. 각각의 직원들은 작업에 대해서 작은 일들을 나누어서 수행하게 되는 것이 병렬 프로그래밍입니다.
즉, 하나의 작업 내에 필요한 작은 일들을 분담하여서 수행하는 것을 의미하게 됩니다.

 

동시성 프로그래밍

동시성 프로그래밍은 하나의 코어가 여러가지의 작업을 수행하는 것을 의미하게 됩니다. 하나의 작업만 처리하는 환경에서 여러가지의 일을 동시에 처리하는 것입니다. (역시, 이해가 안되는군요...!) 다시 예를 들어보죠!

 

 

위의 카페에서 10년 정도 일해서 개인 카페를 저희가 차렸다고 생각해봅시다. 저희는 커피를 판매하는 작업에 대해서 모두 혼자서 수행하여야겠죠? 손님이 오게 되면, 주문을 받게 될 것이고, 음료를 만드는 일도 수행하게 될 것입니다. 이때, 주문을 받고, 음료를 만들고 있는 상황에서 새로운 손님이 방문하여서 주문을 받는 일을 당장 수행하여야 합니다. 그렇다면, 저희는 음료를 만드는 일을 종료한 후, 주문을 받을 것입니다. 주문을 받은 후에는 1번 음료를 손님에게 서빙하게 될 것입니다.

이처럼 여러가지의 작업을 번갈아가면서 작업하게 되는 것입니다. 위에서 컴퓨터는 인간과 다르게 상상할 수 없는 정도의 속도로 작업을 수행하게 됩니다. 이는 사람의 눈으로 보게 된다면, 동시에 일어나는 것 처럼 보이기 때문에 동시성 프로그래밍이라고 부르게 됩니다.

저희가 여기서 많이 혼동할 수 있는 개념들이 있어서 조금 더 작성해봅니다.

동시성 프로그래밍과 병렬 프로그래밍은 반대되는 개념이 아닙니다. 병렬 프로그래밍은 다중 코어를 활용하는 패러다임이며, 동시성 프로그래밍은 다중 스레드를 활용하는 패러다임입니다. 이 둘은 동시에 일어날 수도 있습니다.

여러가지의 작업을 여러개의 코어에서 담당하는 것은 병렬프로그래밍이 아닙니다. 시스템에서 어떻게 일을 처리하게 하는지 정확하게 알 수 없기 때문에 병렬로 단정할 수 없습니다. 예를 들어서 4가지의 일을 4개의 코어가 하나씩 담당하게 된다면, 이는 병렬 프로그래밍이 아니게 됩니다.

 

동기 및 비동기

동시성 프로그래밍이 무엇인지 알았으니, 친구인 동기 비동기에 대한 개념에 대해서 설명하려고 합니다. 이들을 구분하는 개념을 개인적으로 한 줄로 설명할 수 있다고 생각합니다. 종료를 기다리냐? 라고 설명합니다.

동기는 작업이 끝나기를 기다렸다가 다음을 수행하는 것을 의미합니다. 즉, 하나의 작업이 끝나야지 다음 작업을 수행할 수 있다는 것입니다. 다시 한번 예를 들어봅시다.

 

 

카페에서 새로운 손님이 들어왔을 때, 음료를 만드는 중에는 주문을 받을 수 없다는 규칙을 정하고 안내문구를 작성해뒀다면, 손님 입장에서는 음료가 만들어져야지만 주문을 받을 수 있다고 인지할 것입니다. 이처럼 동기는 하나의 작업이 수행 완료되면 다음 작업을 수행하는 (순차적으로) 것을 의미하게 됩니다.

 

 

비동기는 이와 반대로 작업이 종료되는 것을 기다리지 않습니다. 즉, 작업이 종료되는 것과는 상관 없이 다음 작업을 시작하게 됩니다. 또 예시를 들어봅시다.

카페에서 일을 하면서 고정적인 수입이 발생하여서 카운터 직원을 고용하였습니다. 직원에게 주문 받는 일만 하라고 이야기 했습니다. 그렇다면, 직원 이전에 주문한 음료가 완성되는 것은 관심사가 아니게 됩니다. 주문을 받는 일을 지속적으로 수행하게 됩니다. 손님이 들어올 때마다 음료가 만들어지는데 어느정도 걸리는지는 중요하지 않으며, 주문을 계속 받게 됩니다.

'CS' 카테고리의 다른 글

[CS] Linux 고급 - 파일  (0) 2024.05.01
[CS] Linux란?  (0) 2024.04.22
[CS] HTTP는 어떻게 동작할까?  (0) 2023.10.26