1. 코어
코어는 CPU(프로세서)의 실행 단위이다. 하나의 CPU에는 하나 이상의 코어가 포함된다.
각 코어는 독릭접으로 작업을 수행할 수 있는 '작은 프로세서'라고 이해하면된다. 다른 말로하면
멀티코어 프로세서는 여러개의 코어가 하나의 CPU안에 있다는 뜻이다.
멀티코어 프로세서는 병렬성을 활용하여 여러 작업을 동시에 처리하는데, 싱글코어와 비교했을 때 성능적 이점이 크다.
2. 프로세스
프로그램이 실행될 때 운영체제에 의해 메모리에 로드되고 실행되는 상태
하나의 프로그램에는 하나의 프로세스가 할당된다.
3. 스레드
하나의 프로그램에서 여러개의 작업을 수행하기 위한 더 작은 실행 단위
하나의 프로세스에는 여러 개의 스레드가 할당된다.
스레드끼리는 스택을 제외한 메모리를 공유하기하기 때문에 통신이 더 빠르고 효율적이다.
프로세스 환경에서 둘 이상의 스레드를 동시에 실행하는 방식을 멀티스레딩이라고 한다.
4. 동기와 비동기
작업을 보내는 스레드에 관련된 개념으로 , 작업을 보내는 또는 요청한 스레드가 보낸 작업이
끝나기를 기다리는 지 여부로 구분한다.
동기
- 프로그램흐름과 이벤트의 발생 및 처리를 종속적으로 수행하는 방법
- 요청과 결과가 동시에 일어남
- 먼저 요청한 일이 먼저 끝남
- 다른 쓰레드로 보낸 작업이 끝날 때까지 기다린다, 다른 작업을 처리할 수 없다
비동기
- 프로그램의 흐름과 이벤트의 발생을 독릭적으로 수행하는 방법
- 요청과 결과가 동시에 일어나지 않는다.
- 작업이 빠른 순으로 끝나므로 나중에 요청한 작업이 먼저 끝날 수 있음
- 작업을 다른 쓰레드에서 시키고, 끝날 때까지 기다리지 않는다, 즉 현재 쓰레드에서 다른 작업을 시작할 수 있다
동기 | 비동기 | |
싱글 스레드 | 하나의 공간에서 순서대로 처리 | 하나의 공간에서 순서에 관계없이 처리 |
멀티 스레드 | 여러 개의 공간에서 순서대로 처리 | 여러개의 공간에서 순서에 관계 없이 처리 |
5. 직렬성 vs 동시성
작업을 받는 스레드에 관련된 개념, 작업을 받는 스레드가 한 개인지 아닌지로 구분한다.
직렬성
- Serail
- 단 하나의 스레드로만 작업을 보냄
- 순차적으로 진행됨
- 작업 시작과 종료의 순서가 예측됨
- 순서가 중요할 때 사용
동시성
- Concurrency
- 작업을 여러개의 스레드에 보냄
- 순서를 예측할 수 없음
- 속도가 중요할 때 사용
동시성 vs 병렬성
동시성
- Concurrency
- 여러 작업을 번갈아가며 실행하며 동시에 실행하는 것 처럼 보이는 방식
- 싱글 코어에서 멀티 스레드를 동작시키는 방식 / 하나의 코어가 번갈아가면서 작업을 수행
병렬성
- Parallel
- 물리적으로 동시에 정확히 실행되는 것
- 멀티 코어에서 멀티 스레드를 동작 시기큰 방식 / 여러 개의 코어가 여러 스레드의 작업을 동시에 수행
- 데이터 병렬성: 전체 데이터를 나누어 서브데이터로 만들어 서브데이터를 병렬로 처리해서 작업을 빠르게 수행하는 방식
- 작업 병렬성: 서로 다른 작업을 병렬 처리하는 방법, 각 작업은 독립적이기 때문에 각 작업을 빠르게 처리한다.
왜 MainThread에서 동기로 오래걸리는 코드를 실행시키면 안될까?
iOS 앱을 개발할 때 가장많이 들어보고 중요한 스레드가 메인스레드이다.
그렇다면 왜 메인스레드가 가장 중요할까??
바로 메인스레드는 유저의 UI를 담당하는 스레드이기 때문이다.
만약 기기 주사율이 60HZ라면 1초에 화면을 60번 그린다는 뜻, 즉 (1/60초) 마다 화면을 다시 그리는 것을 의미한다.
아래 그림을 보자. 빨간 막대가 화면을 다시 그리는 지점이라고 지칭해보자.
이렇게 무거운 작업이 화면을 다시그리는 지점을 침범하면 우리는 어떤 현상을 겪게 될까 ??
바로 UI 반응이 느려지고 버벅거리는 느낌을 받게 된다.
그러면 우리는 이 문제를 어떻게 해결할 수 있을까 ??
바로 이와 같이 UI와 관련 없는 별도의 스레드에 작업을 할당하면된다. 즉 동시성 프로그래밍이 필요하다는 뜻
참고