동시성과 병렬성

프로그램을 개발하다보면 성능 개선을 하고 싶은 경우가 발생한다. 물론 알고리즘적으로 코드를 수정하여 시간복잡도를 낮출 수 있다. 하지만 그런 관점이 아닌 동시에 일을 처리하므로써 성능을 향상시킬 수 있다. 이 때 동시성과 병렬성 개념이 필요하다.

동시성은 멀티태스킹이다. 우리가 평소 멀티태스킹을 한다고 하면, 여러가지 일을 동시에 하는 것으로 이미 알고 있다. 예를 들면 책을 읽으면서 동시에 밥을 먹는 것 또는 카톡을 하면서 TV를 보는 것이다. 그런데 요점은 이 모습이 동시에 하는 것처럼 보여도 사실은 여러가지 일을 빠르게 바꿔가면서 한번에 하나씩하는 것이다. 프로그램을 예로 보면, 파이썬 멀티쓰레드에서 쓰레드가 동시에 실행되는 것처럼 보여도 결국엔 한번에 한 쓰레드가 실행되고 조금 뒤 다른 쓰레드가 실행된다. (이렇게 동작하는 이유는 파이썬 GIL 때문)

병렬성은 진짜 물리적으로 두 가지 일을 동시에 하는 것을 말한다. 예를 들면 동시성은 책을 읽으면서 밥을 먹는 것은 빠르게 전환하면서 하는 것이면, 병렬성은 머리가 2개 있어서 한쪽 머리는 책을 읽고 한쪽 머리는 밥을 먹는 것이다.

그렇다면, 프로그램을 짜는데 있어서 실질적으로 동시에 일을 하는 병렬성이 무조건 성능 향상에 도움이 되는 듯하다. 하지만 그것도 해야하는 작업의 종류에 따라 달라지니 조심하자. 예를 들면 I/O 위주 작업은 동시성이 유리하다. I/O 작업 자체는 CPU가 거의 일을 하지 않는 작업이다. 네트워크 통신 또는 파일 저장 및 로드를 하는 작업은 CPU가 시스템에 요청 후 응답이 올 때까지 논다. 이 때 CPU가 다른 작업을 작업을 처리하도록 하여 한 CPU 에서 여러 I/O 작업을 할 수 있도록 만들 수 있다. 물론 병렬성으로 여러 CPU에서 물리적으로 동시에 여러 I/O 작업을 할 수 있으나 CPU 개수가 많아봤자 64비트에서 최대 256개이기 때문에 이보단 동시성으로 접근하는 편이 유리하다.