동시성이란
동시성이란?
동시성이란 여러 작업을 동시에 수행하는 것을 말한다.
만약 동시성 개념이 갑자기 없어졌다고 가정해보자. 그러면 우리가 인터넷 브라우저에서 무엇인가를 다운 받거나 검색할 때 그 작업이 끝날 때까지 다른 어떠한 작업도 할 수 없다. 동시에 다른 작업을 할 수 없기 때문에 한 스레드가 작업을 수행하는 동안 다른 스레드는 대기해야하기 때문이다.
이렇게 여러 작업을 동시에 수행해 성능과 생산성을 높일 수 있는 개념을 동시성이라고 한다.
다만 실제로 여러 작업을 동시에 수행하는 것은 아니고 여러 작업을 빠르게 번갈아(컨텍스트 스위칭) 수행한다.
이와 달리 멀티코어를 이용해 실제로 여러 작업을 동시에 수행되는 것을 병렬성이라고 한다.
동시성을 가능하게 하는 방법
멀티 쓰레드
단일 프로세스 내에서 여러 스레드를 실행하는 것을 말한다.
각각의 스레드는 프로세스의 메모리를 공유해 접근 가능하지만 별도의 실행 흐름을 나타내므로 동일한 프로세스 주소 공간 내에서 여러 작업을 동시에 실행할 수 있습니다.
같은 메모리 공간이기 때문에 스레드 간의 데이터 공유가 쉽고, 컨텍스트 스위칭 비용이 낮아 빠르게 작업을 전환할 수 있지만, 같은 메모리 공간의 데이터를 접근할 수 있다 보니 경쟁 조건이 발생할 수 있다.
멀티 프로세스
실제로 독립적인 여러 프로세스를 동시에 수행하는 것으로, 병렬성이라 할 수 있다.
진정한 동시성으로 수행되기 때문에 계산집약적인 작업을 더 빠르게 수행할 수 있다.
독립된 프로세스다 보니 한 프로세스 오류가 다른 프로세스에 영향을 미치지 않지만, 프로세스 간의 통신이 어렵고, 프로세스 간의 데이터 공유가 어렵다.
비동기 프로그래밍
비동기 프로그래밍도 동시성을 가능하게 하는 방법 중 하나이다.
비동기 프로그래밍은 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속헤서 수행하는 것을 말한다.
예를들어 Node.js에서 이벤트 루프는 비동기 작업은 OS에 위임해 백그라운드로 작업을 수행하기 때문에 싱글 스레드임에도 불구하고 다른 작업을 수행할 수 있다.
비동기 프로그래밍은 일반적으로 싱글 스레드이기 때문에 당연히 멀티 쓰레드보다 메모리를 적게 사용하고 컨텍스트 전환 비용이 적다.
따라서 비동기 프로그래밍은 적은 리소스로도 많은 작업을 수행할 수 있기 때문에 IO 집약적인 작업에 적합하다.
하지만 CPU 집약적인 무거운 작업에는 적합하지 않는데, 싱글 스레드이기 때문에 무거운 작업은 다른 작업 수행을 막을 수 있다.
마치며
동시성은 여러 작업을 동시에 수행하는 것을 말한다. 이를 가능하게 하는 방법으로 멀티 쓰레드, 멀티 프로세스, 비동기 프로그래밍이 있다.
다음 글은 동시성 구현 중 발생할 수 있는 문제에 대해 알아본다.