티스토리 뷰
안녕하세요. Diana입니다.
오늘은 개발에서 매우 중요한, Thread에 대해 다뤄보려고 합니다.
✅ Thread란?
Thread란 간단히 말해서 프로세스에서 잘게 나뉘어진 Task의 단위입니다.
프로세스는 메모리에 할당이 되면 각각의 Data, Code, Stack, Heap 영역을 제공받은 뒤 메모리 영역을 서로 공유하지 않고 독립적으로 작동합니다.
하지만 하나의 프로세스 내부에서 나뉘어진 Thread는 Data, Code, Stack, Heap의 영역 중 Stack 영역을 제외한 메모리 영역을 서로 공유합니다.
우리가 Swift에서 타입을 선택하는 기준도 이러한 Thread의 특징과 관련이 있습니다.
Swift에서 타입을 정의하기 위해서는 Class와 Struct 그리고 Enumeration 등의 방법이 존재합니다.
여기서 Class와 Struct에 대해 이야기 해보자면 Class 타입으로 정의된 코드는 Heap 영역에 할당되며 Struct 타입으로 정의된 코드는 Stack 영역에 할당됩니다.
따라서 Stack 영역을 제외한 메모리 영역을 공유하는 스레드 특성 상 Heap 영역에 할당되는 Class의 경우 동일한 Thread에 동시에 접근하면 RaceCondition 등의 오류를 일으킬 수 있습니다.
반대로 Stack 영역에 할당되는 Struct의 경우 Tread Safe 할 수 있죠.
이러한 이유들을 토대로 Swift에서는 Type 정의에 있어서는 Class 보다 Struct를 지향하고 있습니다.
✅ DispatchQueue
개발을 하다보면 어찌되엇든 수 많은 Thread가 생성되고 우리는 이를 관리할 필요가 있습니다.
Swift에서는 스레드를 어떻게 관리할까요?
다행히도 Swift는 굉장히 친절하게도 DispatchQueue 라는 기능을 지원하고 있습니다.
DispatchQueue는 우리가 어떠한 함수를 실행함으로써 발생한 Task를 각각의 Thread에 자동으로 배분해줍니다.
DispatchQueue는 FIFO 큐로 작동되며 DispatchQueue를 통해 스레드풀에 할당된 Task는 시스템에 의해 관리됩니다.
DispatchQueue에는 concurrent와 serial의 두 종류가 있습니다.
여기서 주의해야하는 점은 UI 처리를 위한 Main Thread는 serial 이기 때문에 sync 처리를 하면 안된다는 것입니다.
Main Thread를 Serial로 설정하는 경우 앱 실행에 있어 끊임없이 처리되고 있던 이벤트 처리가 대기상태로 멈추며 교착상태(Deadlock)이 발생하게 됩니다.
이렇게 열심히 Thread에 대해 알아보았는데 의문이 생기는 부분이 있습니다.
Thread는 Stack 영역을 제외한 메모리 영역을 공유하기 때문에 하나의 스레드에 문제가 생기는 경우 다른 스레드에도 문제가 발생할 수 있습니다.
따라서 우리는 위에서 알아본 DispatchQueue 등을 사용하여 Thread를 관리해주어야 하구요.
그럼 그냥 애초에 Thread를 사용하지 말고 독립적으로 작동하는 Process를 여러개 생성하여 작업하면 안되는걸까요?
✅ Thread을 이해해야 하는 이유
요즘 디바이스들은 멀티코어를 기본으로 하고 있습니다.
그리고 각각의 코어는 여러 프로세스를 동시에 실행시킬 수 있구요.
하지만 동기 비동기 개념을 공부할 때 자주 듣지만 여기서의 "동시"는 말그대로의 모두 한번에 가 아닌 지속적인 Context Switching이 반복되며 "동시인 것 처럼 보이는" 작업을 말합니다.
여기서 우리가 Thread 프로그래밍을 하는 이유가 담겨있습니다.
Context Switching에는 스레드 간의 전환 비용보다 더 큰 비용이 발생한다는 것입니다.
하지만 그렇다고 필요 이상으로 Thread가 잔뜩 만들어지는 경우도 있습니다.
Context Switching 비용을 줄이려고 Thread를 사용하는데 이놈의 Thread가 100개 이상으로 만들어지는 경우가 존재하죠.
이 문제를 Apple에서는 Thread explosion이라고 하는데 이 내용은 다음 글에서 다뤄보도록 하겠습니다.
'Swift' 카테고리의 다른 글
Swift - Opaque Type 이란? (1) | 2024.10.17 |
---|---|
Swift - private(set) 이란? (0) | 2024.09.19 |
Swift - CoreData란? (0) | 2024.07.12 |
- Total
- Today
- Yesterday
- 스위프트
- 빅세타표기법
- asymptoticnotation
- opaque
- swift
- capsulation
- 코어데이터
- boxedprotocoltype
- private(set)
- swiftcoredata
- Algorithm
- kakaomapssdk
- opaquetype
- 팁킷
- Tuist
- tipview
- coredata
- reusablelist
- BoxedType
- boxedprotocol
- threadprogramming
- tipkit
- ios
- 개발자코테
- ViewBuilder
- swiftpackage
- Concurrency
- SwiftUI
- 알고리즘
- tuist v4
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |