- CPU의 핵심으로 CPU에서 실제로 일을 처리
- 코어는 한번에 한 가지 일만 처리할 수 있음
- 싱글 코어를 가진 컴퓨터라도 음악을 들으며 문서를 작성하는 등 여러 작업을 동시에 처리할 수 있는 이유는, 한 번에 처리하는 것처럼 보이는 것, 일을 짧은 단위로 나누어서 하나씩 번갈아가면서 하기 때문
- 코어 처리하고 있는 일은 결국 한 번에 한 가지
동시성 프로그래밍: 코어가 여러 가지 작업을 시분할로 나누어 번갈아 가며 처리하는 것스레드
하드웨어에서의 스레드
- 하이퍼스레딩 기술을 이용하여 하나의 코어로 2가지 작업을 동시에 수행할 수 있도록 하는 논리적인 '코어'
- 1코어 2스레드라면 실제로 코어는 1개이지만 코어가 2개인 것처럼 작업을 처리
소프트웨어에서의 스레드
- 동시성 프로그래밍이란 소프트웨어에서의 멀티 스레딩을 이용한 기술
- 소프트웨어에서의 스레드는 가상으로 만들어진 스레드이기 때문에 물리적인 스레드 갯수와는 상관없이 많은 스레드를 만들 수 있음
동시성 프로그래밍
- 하나의 CPU가 여러 작업을 동시에 처리하는 것
- 병렬 프로그래밍과 달리 싱글 코어에서도 가능한 논리적인 개념이지만, 물리적으로는 하나의 작업만 처리하는 환경
- 여러 개의 스레드를 이용하여 동시에 여러 작업을 처리
- 여러 가지 작업을 나열해두고 하나씩, 그리고 조금씩 번갈아가면서 작업을 처리하는 것
- 속도가 매우 빨라서 동시에 작업을 처리하는 것처럼 보여집니다. 아주 빠르게 Context Switching을 하고 있는 것
병렬 프로그래밍
- 여러 개의 CPU(코어)가 하나의 작업(Task)을 분담해서 처리하는 것
- 많은 연산이 필요한 그래픽 처리나 머신 러닝에서는 병렬 프로그래밍이 적극적으로 사용됨
- 물리적인 개념으로 CPU(코어)가 여러 개 있을 때에 가능
- 싱글 코어에서는 병렬 프로그래밍이 불가능, 실제로 동시에 작업을 처리하는 것이기 때문
동기 (Synchronous)
- 작업이 끝나기를 기다리는 것
- A라는 코드 블록을 동기로 처리했다면 A라는 코드의 실행이 완전히 끝이나야 다음 코드로 넘어가는 것
비동기 (Asynchronous)
- 작업이 끝나기를 기다리지 않고, 다음 코드 블록을 바로 실행시키는 코드
- A, B라는 작업이 나열되어 있고 A를 비동기 처리해주었을 때 A를 기다리지 않고 바로 B 작업을 시작
동시성, 동기/비동기
완전히 다른 의미
- 동시성 : Serial이냐, Concurrent인가는 스레드가 단일 스레드인가, 다중 스레드인가의 구분
- 동기/비동기 : 스레드의 수와는 무관하게 작업이 끝나기를 기다리냐, 기다리지 않느냐의 구분
동시성 프로그래밍이 필요한 이유
- 효율적인 동작
- 동시성 프로그래밍을 하지 않으면 모든 일을 하나의 스레드에서 담당
- 소프트웨어가 더 쾌적하고 효율적으로 동작
- 최적화
- 사용성, 반응성
- 사용자들에게 보다 나은 사용성을 제공
Swift와 동시성 프로그래밍
GCD(Grand Central Dispatch), Operation, async/await
GCD -> Operation -> async/await 순서로 개발