😎 서론
이전 포스팅에서 동시성과 병렬성 차이에 대해서 아래처럼 간략하게 서술했었다.
- 동시성: 하나의 코어에서 여러 스레드가 번갈아가며 실행
- 병렬성: 멀티 코어에서 여러 스레드를 동시에 실행
책의 내용을 단어만 좀 바꿔서 인용해온 것이기도 하고 어떤 상황인지 상상이 갔기 때문에 납득하고 넘어갔었다. 근데 트위터에서 디클님이 아래와 같은 내용을 알려주셨다.
내가 서술한 내용이 틀린 것은 아니지만 그 외의 상황에서 더 자주 발생한다고 설명해주셨고 그 상황들에 대해서 궁금해졌다. 그래서 동시성과 병렬성에 대해서 좀 더 구체적으로 공부해보려 한다.
✨ 동시성; Concurrency
동시성은 여러 작업이 겹치는 기간에 실행될 수 있음을 의미한다. 동시에 실행하는 것이 아니라 CPU가 작업마다 시간을 분할해 적절하게 context switching을 해서 동시에 실행되는 것처럼 보이게 한다. 이렇기 때문에 동시성은 구현하는 것도 디버그하는 것도 어렵다.
동시성의 핵심 목표는 유휴 시간을 최소화하는 것이다. 유휴 시간은 컴퓨터가 작동 가능한데도 작업을 하지 않는 시간으로 아무것도 안하고 놀고 있는 시간이라고 생각하면 된다. 현재 프로세스 또는 스레드가 I/O 작업, DB 트랜잭션 등등 외부 프로그램 실행을 기다리는 동안에 다른 프로세스 또는 스레드가 CPU 할당을 받는다. 그림으로 표현하면 아래와 같다.
이 여러개의 task들은 하나 이상의 코어에서 실행된다. 같은 시간에 같은 자원에 접근하는 상황이 생길 수 있는데 해당 자원에 write 권한으로 접근하는 경우 '데이터의 무결성 유지!'를 꼭 염두해둬야 한다.
✨ 병렬성; Parallelism
병렬성은 동일한 시간에 독립적인 작업을 실행할 수 있음을 의미한다. 동시성과는 달리 여러 작업을 다른 코어, 다른 프로세스, 별도의 컴퓨터 등에서 동시에 실행할 수 있다. 그래서 병렬 처리가 성능 향상에 필수적이라고도 한다.
한가지 예로 분산 컴퓨팅 시스템이 있다. 분산 컴퓨팅 시스템은 단일 시스템으로 실행하는 여러 컴퓨터 시스템들로 구성되어 있다. 각 컴퓨터에 존재하는 시스템들은 네트워크로 연결될 수 있다. (그림 참고) 해당 예제 외로도 하나의 컴퓨터에서 여러 코어를 사용하여 병렬 처리를 활용할 수도 있다.
💥 Concurrency vs Parallelism
연로그는 새로운 프로그래밍 강의를 들으려고 한다. 실습을 따라하며 진행해야 하는데 인강 속도를 따라잡을 수 없었다. 어쩔 수 없이 영상을 멈추고 코딩하고 다시 영상을 실행하는 행위를 반복했다. 이건 동시성이라고 부른다. 연로그는 여유롭게 음악을 들으면서 코딩을 한다. 이런 경우에는 병행성이라고 한다.
본격적으로 동시성과 병행성을 비교해보겠다. 아래 그림을 보자. 2개의 코어가 있다고 가정해보았다. 동시성의 경우에는 Core1에서만 Task를 실행하고 있다. 시간의 흐름에 따라 Task 1과 2를 번갈아가면서 실행한다. 병렬성의 경우에는 Task 1과 2를 번갈아가며 실행할 필요 없이 각 코어에서 Task를 독립적으로 실행한다.
동시성은 여러 task를 계속 번갈아가면서 실행한다. task 1이 사용하던 자원이 있다고 가정해보자. task1이 미처 끝나기 전에 task 2가 같은 자원을 접근한다면? 자원의 값이 변경되며 서로의 실행 결과에 미칠 수 있다. 또 task를 어떤 기준으로 선택하고 교환할 것인지도 고려해야 한다. 따라서 Race Condition, Deadlock, Starvation 등의 문제가 생길 수 있다.
🔻 Race Condition, Deadlock, Starvation
- Race Condition: 여러 프로세스가 하나의 자원에 접근해 서로의 실행 결과에 영향을 주는 현상
- Deadlock: 여러 프로세스가 서로 상대방의 작업이 끝나기를 무한히 기다리는 현상
- Starvation: 특정 프로세스가 우선순위가 낮아 원하는 자원을 계속 할당 받지 못하는 현상
병렬성은 여러 task가 어떤 자원을 공유하고 있는지 고려해야 하기 때문에 메모리 손상, 누수 등의 문제가 발생할 수 있다.
피드백 주신 디클님 감사합니다!
참고
'Develop > CS' 카테고리의 다른 글
OpenSSL 취약점 발견되다? (10) | 2022.10.30 |
---|---|
무중단 배포 (feat: Jenkins & Shell) (0) | 2022.10.19 |
ssh 명령어 편하게 쓰기 (3) | 2022.08.17 |
[nginx/Let's Encrypt] 도메인 연동부터 SSL 적용까지 (0) | 2022.07.31 |
[DB] group function 에러 (0) | 2022.07.03 |