동시성과 병렬성은 한정적인 컴퓨터 자원으로 최대한의 성능을 끌어내기 위해 아주 중요한 요소입니다. 멀티 코어 CPU의 등장과 경제적 이득으로 인하여 멀티 코어 CPU의 관심도가 높아졌고, 작업들을 병렬화하고 코어들에게 효율적인 작업을 분배하는 병렬화는 중요 과제가 되었습니다.
동시성과 병렬성을 알아보기 전에 작업의 특징에 따른 분류를 알아야합니다.
병렬성은 동시에 여러가지 작업을 수행하는 것을 의미합니다. CPU의 코어에서 명령어들을 실행하며 작업들을 수행합니다. 따라서 동시에 여러 작업들을 수행하기 위해서는 코어가 여러개인 멀티 코어 CPU가 필수적입니다. 각각의 코어들을 할당받은 작업들을 동시에 수행하여 하나의 CPU에서 여러개의 작업들을 수행할 수 있게 됩니다.
병렬적으로 처리할 수 있는 객체는 작업으로 제한되지 않습니다. 병렬화하되는 객체가 작업이면 작업 병렬성, 데이터를 병렬화하는 것을 데이터 병렬성이라고 합니다.
작업 병렬성은 각각의 코어에서 서로 다른 작업 A,B가 각각의 데이터를 처리합니다. 반면 데이터 병렬성은 같은 작업 A가 서로 다른 코어에서 실행되며 데이터들을 병렬적으로 처리합니다. 이처럼 무엇을 병렬화할지에 따라 작업의 실행 순서나 소요 시간도 달라지게 됩니다.
동시성은 서로 독립적인 작업을 작은 단위로 나누어 번갈아가며 수행하는 것을 말합니다. 앞에서 말했듯이 하나의 코어는 하나의 연산밖에 수행하지 못합니다. 따라서 커다란 작업을 순차적으로 수행하게 되면 뒤의 모든 작업들이 대기하는 문제가 발생하게 됩니다. 따라서 모든 작업들을 작은 단위로 나누어 번갈아가며 수행하며 하나의 작업이 끝나지 않아도 다른 작업들이 수행될 수 있도록 한 것입니다.
여러개의 코어가 필요한 병렬성과는 달리 동시성은 하나의 코어에서 여러 작업을 번갈아가며 수행하기 때문에 싱글 코어 CPU에서도 사용이 가능합니다.
병렬성의 경우 작업을 동시에 수행하는 것이고 동시성은 여러 작업을 번갈아가며 수행하는 것입니다. 병럴성의 경우 독립적으로 작업을 수행할 수 있는 CPU 코어에 의존하기 때문에 하드웨어적인 의존도가 높습니다. 반면 동시성은 하나의 코어에서도 구현할 수 있기 때문에 소프트웨어적으로 작업을 어떻게 나누고 어떻게 분배해야할지에 대한 고민이 필요합니다.
파이썬답게 코딩하기(프로그래밍 언어의 개념과 흐름에 대한 고촬) - 심경섭 (비제이 퍼블릭)