Search
Duplicate

[Go] 동시성(Concurrency)

간단소개
Go의 강점 중 하나인 동시성에 대해 알아보자!
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Go
Scrap
태그
동시성
9 more properties
Go에 대한 장점을 설명할 때, Go는 동시성 작업에 강점을 보인다고 한다. 여기서 말하는 동시성이란 무엇일까?

동시성이란?

일반적으로 운영체제를 공부할 때 볼 수 있는 내용으로, 싱글 코어에서 멀티 스레드를 동작시키기 위한 방식으로 동시성을 제공한다고 한다.
하지만, Go 뿐 아닌 다른 프로그래밍 언어에서도 멀티 스레딩 작업이 가능하다.
우리가 알아볼 동시성은 멀티 스레딩이 아니기에, 아래 내용을 통해 Go에서 사용하는 동시성에 대해 알아보자.

멀티 스레딩이란?

CPU 한 개의 코어 내에 여러 개의 스레드를 가지고 있는데 한 개의 프로그램를 병렬으로 수행하기 위해 해당 프로그램의 작업을 여러 스레드에 나눠서 시키는 것이다.
예를 들어, 프로그램의 작업이 파트 1 / 파트 2로 나뉜다고 할 때, 파트 1 1번 스레드, 파트 22번 스레드에서 실행한다.

Go에서 동시성이란?

위에서 멀티 스레딩을 설명했는데, 사실 위와 같이 단순히 진행되지 않는다. 실질적으로 우리가 처리하는 작업의 수와 스레드의 수가 같지 않기 때문이다.
OS에서 8개의 스레드를 지원하는데, 우리의 프로그램은 수천 개의 작업을 동시에 실행할 수도 있다.
그래서 나온 기술로 프로그램의 전체적인 흐름을 유지하면서 각각의 작업을 빠르게 수행할 수 있는 것이 바로 동시성인 것이다.
Go는 내부 알고리즘을 통해, 프로그램을 여러 개의 독립된 작업으로 나누고 이를 사용 가능한 스레드를 활용하여 실행한다.(이를 다중화multiplexing이라 한다.)
예를 들어, 2개의 가용 스레드에서 10개의 작업을 실행한다고 하면 아래 사진과 같이 실행된다.
순서대로 진행되지 않는 이유는, 자체적인 스케쥴링 및 자원 관리를 통해 최적의 방식을 사용하기 때문이다.
10개 작업을 동시에 수행하는 것 처럼 보이지만, Go 언어는 내부 알고리즘을 통해 작업을 최대한 빠르게 끝낼 수 있도록 가용 자원을 효율적으로 분산시킨다.
따라서, 개발자는 자원 할당 등의 로우레벨 작업을 관리하지 않고도, Go에서 제공하는 API를 이용하여 높은 효율의 동시성 작업을 진행할 수 있다.
위와 같은 이유로 오래된 언어들과 달리 Go는 동시성 작업에 강점을 보인다고 한다. 그 외에 제공하는 여러가지 기능들이 있지만, 이는 후에 코드를 통해 포스팅할 예정이다!
그리고 멀티 스레딩, 멀티 프로세싱 등 CS 관련 지식도 추가로 필요할 것 같다.