🍎 iOS/GCD

[iOS/GCD] 1. 코어/스레드/프로세스, 직렬/병렬/동시, 동기/비동기

dev_zoe 2023. 3. 10. 17:34
반응형

코어와 스레드, 프로세스 용어 정리

코어 : CPU의 핵심으로 CPU에서 실제로 일을 처리하는 본체

 

- 코어가 많다 = 작업을 처리해줄 친구가 많다. (알바생이 많다)

- 코어는 한 번에 한 가지 일만 처리할 수 있음. 그러나 실제로는 싱글 코어를 가진 컴퓨터라도 음악을 들으며 문서를 작성하는 등 여러 작업을 동시에 처리할 수 있다.

- 햄버거집에 알바생이 1명 있다고 가정해보면 (싱글코어), 치킨 햄버거, 불고기 햄버거, 치즈 햄버거를 동시에 만들고 있음을 볼 수 있다.

하지만 이것은 한 번에 만드는 것처럼 보이는 것이지, 사실은 일을 짧은 단위로 나누어서 하나씩 번갈아가면서 요리를 하는 것임 (이걸 운영체제 용어로 시분할! 이라고 함)

- 각 햄버거의 빵을 올리고, 불고기를 굽고, 치즈를 올리고 ... 등 실제로 알바생이 하고 있는 일은 한가지이지만, 빠르게 번갈아가면서 하는 것이기 때문에 동시에 모든 햄버거를 다 만드는 것처럼 보임

- 이처럼, 동시에 여러 일을 처리하는 것처럼 보이지만 사실은 한가지 일을 매우 빠르게 번갈아가면서 하며 처리하여 동시에 하는것처럼 보이는 프로그래밍을 '동시성 프로그래밍' 이라고 한다.

 

스레드 : 한 프로세스 내에서 실행되는 하나의 작업단위

- 위 햄버거 가게 예시를 보면 빵 올리고, 불고기 굽고, 치즈 올리고 ... 하는 과정 하나하나를 스레드 라고 볼 수 있음

프로세스 : 프로그램이 CPU에 의해 메모리에 올라갈 때 이를 프로세스라고 한다.

- 위 햄버거 가게 예시에서 알바생이 햄버거를 만드는 프로그램 하나하나를 프로세스라고 할 수 있음

- 하나의 프로세스는 반드시 1개 이상의 스레드(메인 스레드)를 가지고 있음

 

 

* 스레드와 프로세스의 차이점

- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받고, 스레드는 Stack만 할당받고 나머지는 공유한다.

(스레드가 생성될수록 스택이 하나 더 생김)

- 스레드는 프로세스의 자원을 공유받고 접근 가능하지만, 프로세스 단위는 다른 프로세스의 자료에 접근할 수 없다.

 

직렬/병렬 프로그래밍, 동시성 프로그래밍

직렬 프로그래밍 (Serial Programming) :

 하나의 CPU(코어)가 작업들을 메인 스레드 외의 다른 스레드 1개로 보내 해당 스레드가 차례대로 모든 작업을 진행하는 것

- 보통 순서가 중요한 작업을 처리할 때 사용

 

병렬 프로그래밍 (Parallel Programming) : 여러 개의 CPU(코어)가 작업(Task)을 분담해서 동시에 처리하는 것

- 실제로 많은 연산이 필요한 그래픽 처리나 머신 러닝에서는 이 병렬 프로그래밍이 주로 사용됨

- 햄버거 가게에서 3명의 알바(3개의 코어)가 있을 때, 햄버거 세트 주문이 들어오면 (1개의 Task) 1명은 빵을 굽고, 1명은 고기를 굽고, 1명은 감자튀김을 튀기는 과정을 동시에 수행하는 것으로 예시를 들 수 있다.

- 여기서 Task는 '햄버거 세트 만들기' 이고, CPU(코어)는 각각의 알바생이라고 할 수 있다.

- 병렬 프로그래밍은 반드시 여러 개의 CPU가 있어야만 가능하므로, 싱글 코어에서는 불가능한 프로그래밍이다.

 

동시성 프로그래밍 (Concurrency Programming) : 하나의 CPU(코어)가 작업들을 다수의 스레드에 분산하여를 동시에 처리하는 프로그래밍

- 그러나 여기서 중요한 부분은 실제로 동시에 처리하는 게 아니라 '속도가 매우 빨라서 동시에 작업을 처리하는 것처럼 보이는' 프로그래밍임

- 동시성 프로그래밍은 1명의 알바생이 동시에 빵 굽고, 고기 굽고, 감자튀김을 튀기는 것을 예로 들 수 있는데, 동시에 여러 작업을 하는것처럼 보이지만 1명이 동시에 여러개를 할 수 없으므로 실제로는 하나씩, 그리고 조금씩 번갈아가면서 작업을 처리하는 것임

- 즉 동시성 프로그래밍은 1개의 CPU가 여러 스레드를 활용하여 작업을 처리하는 것을 의미함

- 여기서 '번갈아 가면서 처리한다'를 Context Switching(문맥 교환)이라고 부름!

동기(Sync) / 비동기(Async)

동기 프로그래밍 : 동기 프로그래밍은, 다른 스레드가 처리하고 있는 작업이 끝날 때까지 기다려야하는 프로그래밍이다.

- 예를 들어, 화장실 칸이 1개만 있고 칸에는 1명만 들어갈 수 있으므로, 앞사람이 볼일을 다 볼때까지 기다리는 예시를 들 수 있다.

 

비동기 프로그래밍 : 반면 비동기 프로그래밍은, 다른 스레드가 처리하고 있는 작업이 끝날 때까지 기다려도 되지 않은 프로그래밍이다. 즉, 앞선 작업이 끝나는 것과 무관하게 내 할일을 하는 프로그래밍

- 보통 네트워킹과 자주 결합하여 쓰이는데, 네트워크 통신 상태에따라서 작업이 오래걸릴 수도 있기 때문에 네트워크 통신이 끝날 때까지 기다리는 것은 매우 비효율적일 것이다.

 

*비동기 != 동시성 프로그래밍

둘은 아얘 다른 개념이다. 

동시성 프로그래밍이냐 아니냐는 하나의 스레드이냐 여러 스레드냐에 따라 달라지고, 비동기 프로그래밍은 앞 작업이 끝나냐 안끝나냐에 따라 달라지므로 별개의 개념이다.

 

동시성 프로그래밍의 중요성? 동시성 프로그래밍을 왜하는걸까?

iOS 동시성 프로그래밍에 대한 강의를 듣다가 동시성 프로그래밍을 왜 해야하는걸까요? 언제 쓰나요? 라는 질문에 강사님이 '그냥 숨쉬듯 해야한다' 라고 말씀하셨다.. 😅 그만큼 너무 중요한 프로그래밍인데, 그럼 구체적으로 왜 중요하고 왜 쓰는걸까?

 

1️⃣ 효율적인 프로그래밍을 위해

동시성 프로그래밍은 여러개의 스레드로 작업을 처리하므로, 효율적으로 동작한다.

 

2️⃣ 사용성, 반응성, 최적화가 잘된 좋은 앱을 위해

예를들어 하나의 스레드만 있는 프로그램이라면, 앱에서 네트워크로부터 이미지를 다운받는 동안 앱을 사용하지 못하게 되었을 때 너무 불편해질것이다.

반면에, 여러 스레드로 인해서 작업을 동시에 처리할 수 있어서 앱에서 서버를 다운받는 동안에도 앱을 사용할 수 있다면 더욱 편리해지는건 당연할 것이다.

 

비동기 / 동시성 프로그래밍은 언제 하면 좋은가?

주로 네트워크, 이미지 다운로드 등과 같은 다른 작업들에 비해 오래걸리는 작업들을 할 때 생활화하면 좋다.

 

reference

야곰닷넷 'iOS 동시성 프로그래밍'

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

반효경 교수님 kocw 운영체제 강의

앨런 Swift 문법 마스터스쿨

https://www.youtube.com/watch?v=zRJOte7TaPw&t=970s 

 

반응형