- 물리적 용어
- 실제로 작업이 동시에 처리되는 것
- 멀티 코어에서 멀티 스레드를 동작시키는 방식
- 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행되는 성질
- 병렬성은 데이터 병렬성(Data parallelism)과 작업 병렬성(Task parallelism)으로 구분
- 논리적인 용어
- 동시에 실행되는 것처럼 보임
- 싱글 코어에서 멀티 스레드를 동작시키기 위한 방식
- 멀티 코어에서도 동시성은 사용 가능
- 멀티 태스킹을 위해 여러 스레드가 번갈아가면서 실행되는 성질
- 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것
물리적인 코어를 논리적으로 쪼갠 논리적 코어
코어가 2개뿐이라 쓰레드를 2개만 병렬처리할수 있을거 같지만, cpu가 컴퓨터를 속여서 코어가 4개가 있는 것처럼 작업을 진행
예시를 통한 설명
레스토랑에서 점원이 손님에게 주문을 받으면 주문서를 작성해서 셰프에게 전달
주방에서 주문서를 받은 셰프는 주문서에 적힌 음식에 맞는 레시피로 바꿔서 일을 시작하게 됨.
여기서 레시피는 기계어로 번역된 프로그램, 레시피대로 일을 하는 셰프는 컴퓨터에서 코어
- 만약 컴퓨터에 1코어 2물리적 쓰레드가 있다면? 두 팔 달린 셰프 1명
- 2코어 2물리적쓰레드 : 두 팔달린 셰프 2명
- 2코어 4물리적쓰레드 : 네 팔달린 셰프 4명
→ 이게 바로하이퍼 쓰레딩
기술
- 코어가 2개지만 4개라고 속일 수 있는 기술
- 병렬처리도 4개까지 가능
- 셰프의 능력은 cpu의 능력이며, 셰프의 수를 정하는건 사장님의 마음 (이윤 vs 인건비)
- 이렇듯 코어의 수도 cpu 제조사의 마음임
소프트웨어 쓰레드들은 이렇게 각각 다른 하드웨어 스레드 내에서 돌아가서 병렬처리를 할수 있음
프로세스와 쓰레드는 일정량의 메모리를 점유하기 때문에 메모리가 허용하는 범위 내에서 생성 가능
하지만 병렬로 실행될수 있는 개수는 (코어 개수) × (물리적 쓰레드 개수)
- 나머지 쓰레드는 유휴상태로 남아있거나 셰프들이 빠르게 교차하면서 여러 요리들을 하는 것임
둘다 멀티태스킹 느낌이지만, 근본적으로 다른 개념이라 비교하기 어려움.
싱글스레드에서도 부담은 크지만 비동기로 동작할 수 있음.
Javascript와 연관이 있는 Framework인데, Browser에서만 돌 수 있던 Javascript라는 프로그래밍 언어를 Browser 밖으로 꺼내서 유저가 사용하게 해준 것임.
이로써 Javascript 언어로 Frontend뿐만 아니라 Backend도 개발할 수 있게 된 것임.
위에서 Web Framework들은 멀티 클라이언트 처리를 위해 다양한 방식을 채택하였다고 언급하였는데, Node.js는 싱글 쓰레드만으로도 비동기 처리를 가능하게 했음.
바로 ‘이벤트 루프’방식 덕분임.
- 클라이언트로부터 요청이 들어오면 이벤트 루프가 요청을 Event Queue에 넣음.
- 들어와 있는 요청들을 이벤트 루프가 순차적으로 Thread Pool에 있는 쓰레드들에게 작업을 할당해줌.
- 작업이 끝난 이벤트들을 감지하여 해당 콜백을 다시 Event Queue에 집어넣음.
- 계속 이렇게 이벤트 루프가 돌면서 비동기&병렬적으로 처리를 하는 것임
출처
병렬성과 동시성 때문에 계속 헷갈려서 방문하게 되었는데 "그림자 분신술" 단어 덕분에 한번에 이해하고 갑니다:)