์ฑ์ ์ฑ๋ฅ / ๋ฐ์์ฑ / ์ต์ ํ๋ฅผ ์ํด ํ์ํ ๊ฐ๋
์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์ผ (๋คํธ์ํฌ ํต์ )์ ๋ถํ๊ฐ ๋ง์ด ๊ฑธ๋ฆฌ๋ ์ผ์ด๋ค.
๋ง์ฝ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด ํ๋ฉด์ด ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ ํ์์ด ๋ฐ์ํ ์ ์๋ค.
์์ดํฐ์ ํ๋ฉด์ฃผ์ฌ์จ์ 60Hz๋ก 1์ด์ 60๋ฒ ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฐ๋ค. (์ด๋ค ๋ฉ์ปค๋์ฆ์ ์ํด ๋์)
-> ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด ์ด๋ฐ ๋ฉ์ปค๋์ฆ์ด ์ ๋๋ก ๋์ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํ๋ฉด์ด ๋ฒ๋ฒ ๊ฑฐ๋ฆผ
CPU
์ฝ์ด (Core) ==
์ฐ๋ ๋ (thread) == ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ผ์ ์ฒ๋ฆฌํ๋ ์ฐ์ฐ์ฅ์น์ ๊ฐ์
ํด๋ญ (Clock) ==
๊ฐ๋ฐ์๊ฐ ๋ณ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก 1๋ฒ(๋ฉ์ธ)์ฐ๋ ๋์์๋ง ์ผ์ ํ๋ค.
1๋ฒ์ฐ๋ ๋๋ ํ๋ฉด์ ๋ค์ ๊ทธ๋ ค์ผํ๋ ์ญํ ๋ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. (์ง์ ๋๋ฆฌ๋๊ฑด ์๋์ง๋ง, ์ด๋ค ๋ฉ์ปค๋์ฆ์ ์ํด ํ์ํ๋ ์ญํ ์ ์ํ)
==> ์ญํ ์ด ๋ค์ํ๊ธฐ ๋๋ฌธ์ , ๋๋ฌด ์ค๋๊ฑธ๋ฆฌ๋ ์์ ์ ์ํค๋ฉด ์๋๋ค. (๋ฒ๋ฒ ๊ฑฐ๋ฆผ ๋ฐ์ ๊ฐ๋ฅ)
===> ๋ถ์ฐ์ฒ๋ฆฌ(๋น๋๊ธฐ ์ฒ๋ฆฌ / ๋์์ฑํ๋ก๊ทธ๋๋ฐ)๋ฅผ ์ด๋ป๊ฒ ํด์ผํ๋์ง ๊ฐ๋ฐ์๋ ๋ฐ๋์ ์์์ผ ํจ!!
Ios๋ ๊ฐ๋ฐ์๊ฐ ์์ (Task)๋ฅผ "๋๊ธฐํ๋ ฌ(queue)"์ ๋ณด๋ด๊ธฐ๋ง ํ๋ฉด, ์์์ ์ฌ๋ฌ์ฐ๋ ๋๋ก ๋๋ ์ ๋ถ์ฐ์ฒ๋ฆฌ(๋์์ ์ฒ๋ฆฌ)๋ฅผ ํ๋ค.
- iOS์์ ์์์ ์ฐ๋ ๋์ ์ซ์(๊ฐ์)๋ฅผ ๊ด๋ฆฌํ๋ค.
==> ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ ์์ ์ ํ๋ก ๋ณด๋ด๊ธฐ๋ง ํ๋ฉด ๋๋ค.
iOSํ๋ก๊ทธ๋๋ฐ์์์ ๋๊ธฐ์ด | |||
DispatchQueue โญ๏ธ (== GCD: Grand Central Dispatch Queue) |
OperationQueue |
GCD๋?
- ์ง์ ์ ์ผ๋ก ์ฐ๋ ๋๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋ ์ด ์๋, ํ์ ๊ฐ๋ ์ ์ด์ฉํ์ฌ, ์์ ์ ๋ถ์ฐ์ฒ๋ฆฌํ๊ณ , OS์์ ์์์ ์ฐ๋ ๋ ์ซ์(๊ฐ์)๋ฅผ ๊ด๋ฆฌ
- ๊ฐ๋ฐ์๊ฐ ์ฐ๋ ๋ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ํ์๊ฐ ์์ด ์ฐ๋ ๋๋ณด๋ค ๋์ ๋ ๋ฒจ/์ฐจ์์ธ OS์์ ์์ ์ ์ฒ๋ฆฌ
- ๋ฉ์ธ์ฐ๋ ๋๊ฐ ์๋ ๋ค๋ฅธ์ฐ๋ ๋์์ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ๋ค์ ๋์ฑ ์ฝ๊ฒ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๊ฒ ํจ
GCD ์ฌ์ฉ์ ์ฃผ์ํด์ผํ ์ฌํญ
- ๋ฐ๋์ ๋ฉ์ธ ํ์์ ์ฒ๋ฆฌํด์ผํ๋ ์์
- UI์ ๊ด๋ จ๋ ์์ ์ ๋ฉ์ธ์ฐ๋ ๋์์ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ (๋ฉ์ธ์ฐ๋ ๋๊ฐ ์๋ ์ฐ๋ ๋๋ ๊ทธ๋ฆผ์ ๋ค์ ๊ทธ๋ฆฌ์ง ๋ชปํจ)
- ๋น๋๊ธฐ ์ ์ธ ์์ ๋ค (ex. ๋คํธ์ํฌ ํต์ )๋ค์ ํ ๋๋ UI ๊ด๋ จ๋ ์์ ์ ๋ฐ๋์ ๋ฉ์ธ์ฐ๋ ๋์์ ์๋ํ๊ฒ ํด์ผํจ
- ์ปดํ๋ฆฌ์
ํธ๋ค๋ฌ์ ์กด์ฌ ์ด์ - ์ฌ๋ฐ๋ฅธ ๋น๋๊ธฐ ํจ์์ ์ค๊ณ (์ฝ๋ฐฑํจ์)
- ๋น๋๊ธฐ์ ์ธ ํจ์๋ฅผ ์ ์ธํ ๋๋ return์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉด ํญ์ nil๊ฐ ๋ฐ์ -> ํญ์ ํด๋ก์ ๋ฅผ ํธ์ถ ํ ์ ์๋๋ก ํจ์๋ฅผ ์ค๊ณํด์ผํจ
- ๋ฆฌํด๊ฐ์ ์ ๋ฌํ๊ธฐ ์ํด ์ปดํ๋ฆฌ์ ํธ๋ค๋ฌ(ํด๋ก์ )๋ฅผ ์ฌ์ฉํ๋ค. (๋ฆฌํดํ์ด ์์ผ๋ฉด ์ ์ธ ๋ถํ์)
- weak, strong ์บก์ณ์ ์ฃผ์
- ์บก์ณ๋ฆฌ์คํธ ์์์ weak self๋ก ์ ์ธํ์ง ์์ผ๋ฉด ๊ฐํ ์ฐธ์กฐ (strong)
- ์๋ก๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ๋ฅ
- ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ์ง ์๋๋ผ๋ ํด๋ก์ ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธธ์ด์ง๋ ํ์ ๋ฐ์ ๊ฐ๋ฅ
- ์บก์ณ๋ฆฌ์คํธ ์์์ weak self๋ก ์ ์ธํ์ง ์์ผ๋ฉด ๊ฐํ ์ฐธ์กฐ (strong)
๋๊ธฐ์ด(Queue)์ ์ข ๋ฅ
- ๋ฉ์ธํ : DIspatchQueue.main
- ๋ฉ์ธ์ฐ๋ ๋(1๋ฒ ์ฐ๋ ๋)๋ฅผ ์๋ฏธ
- ์ ์ผํจ
- serialํ
- ๊ธ๋ก๋ฒํ : DispatchQueue.global
- 6๊ฐ์ง์ ์๋น์ค ํ์ง(Qos)๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ธ๋ก๋ฒ(์ ์ญ) ๋๊ธฐ์ด
- iOS๊ฐ ์์์ ์ฐ์ ์ ์ผ๋ก ์ค์ํ ์ผ์์ ์ธ์งํ๊ณ ์ฐ๋ ๋์ ์ฐ์ ์์๋ฅผ ๋งค๊ฒจ ๋ ๋ง์ ์ฐ๋ ๋๋ฅผ ๋ฐฐ์นํ๊ณ CPU์ ๋ฐฐํฐ๋ฆฌ๋ฅผ ์ง์ค์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์ผ์ ๋นจ๋ฆฌ ๋๋ด๋๋ก ํ๋ ๊ฐ๋ \
- Concurrentํ
- DispatchQueue.global(qos: "...")
์๋น์คํ์ง ์์ค | ์ฌ์ฉ ์ํฉ | ์์์๊ฐ |
.userInteractive (๊ฐ์ฅ ๋์ ์์ค) | ์ ์ ์ ์ง์ ์ ์ธํฐ๋ ํฐ๋ธ : UI์ ๋ฐ์ดํธ ๊ด๋ จ(์ง์ x), ์ ๋๋ฉ์ด์ , UI๋ฐ์ ๊ด๋ จ ์์ | ๊ฑฐ์ ์ฆ์ |
.userInitiated | ์ ์ ๊ฐ ์ฆ์ ํ์ํ๊ธด ํ์ง๋ง, ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์์ | ๋ช ์ด |
.default (== DispatchQueue.global() ) | ์ผ๋ฐ์ ์์ | |
.utility | ๋ณดํต Progress Indicator์ ํจ๊ป ๊ธธ๊ฒ ์คํ๋๋ ์์ , ๊ณ์ฐ | ๋ช์ด ์ด์ |
.background | ์ ์ ๊ฐ ์ง์ ์ ์ผ๋ก ์ธ์งํ์ง ์๊ณ (์๊ฐ์ด ์ค์ํ์ง ์์)์์ | |
.unspecified (๊ฐ์ฅ ๋ฎ์ ์์ค) | legacy API ์ง์ (์ฐ๋ ๋๋ฅผ ์๋น์คํ์ง์์ ์ ์ธ ์ํด) |
- ํ๋ผ์ด๋นํ : DispatchQueue(label: "...")
- ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ serial (๋ค๋ง concurrent ์ค์ ๋ ๊ฐ๋ฅ - attributes๋ก ์ค์ )
- ์ผ๋ฐ์ ์ผ๋ก ์ง๋ ฌํ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉ
- Qos์ถ๋ก / ์ค์ ๊ฐ๋ฅ
๋น๋๊ธฐ(Async)๋?
- ์ผ์ ์์์ํค๊ณ , ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๋ ๊ฒ (์ฆ์ ๋ฆฌํด(non- blocking) : ๋ค๋ฅธ ์ผ์ฒ๋ฆฌ๋ฅผ ์์ํ ์ ์๋ค)
== ๋ค๋ฅธ ์ฐ๋ ๋์์ ์์ ์ ํ๋๋ก ์ํค๊ณ , ๊ทธ ์์ ์ด ๋๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์์ ์ ์คํ
๋๊ธฐ(sync)๋?
- ์ผ์ ์์์ํค๊ณ , ์์ ์ด ๋๋ ๋ ๊น์ง๊ธฐ๋ค๋ฆฌ๋ ๊ฒ (blocking์ด ์๊น : ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์ผ์ฒ๋ฆฌ ๋ถ๊ฐ)
== ๋ค๋ฅธ ์ฐ๋ ๋์์ ์์ ์ ํ๋๋ก ์ํค๊ณ , ๊ทธ ์์ ์ด ๋๋๋ ๊ฒ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์์ ์ ์คํ
DispatchQueue.global().async {
// ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ ์์ ์ ํด๋ก์ ์์ ์ง์ด ๋ฃ๋๋ค. ( ํด๋ก์ ํ๋๋ ์์ ํ๋์ ๋ฌถ์ : ํด๋ก์ ์์์๋ ์์๋๋ก ๋์ )
}
DispatchQueue.global().sync {
// ๋๊ธฐ์ ์ผ๋ก ์คํํ ์์ ์ ํด๋ก์ ์์ ์ง์ด ๋ฃ๋๋ค.
}
๋น๋๊ธฐ/๋๊ธฐ์ ์ธ ํจ์ ์ ์๋ ๊ฐ๋ฅ ( ํจ์ ์คํ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ /๊ธฐ๋ค๋ฆฌ๊ณ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋ค. )
func task4() {
DispatchQueue.global().async {
print("Task 4 ์์")
sleep(2)
print("Task 4 ์๋ฃโ ")
}
}
์ง๋ ฌ(Serial) ํ(์ฒ๋ฆฌ)๋?
- ๋ณดํต ๋ฉ์ธ์ฐ๋ ๋์์ ๋ถ์ฐ์ฒ๋ฆฌ ์ํจ ์์ ์ ๋ค๋ฅธ ํ๊ฐ์ ์ฐ๋ ๋์์ ์ฒ๋ฆฌ
- ์์๊ฐ ์ค์ํ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
- DispatchQueue(label: "serial")
- ๋น๋๊ธฐ์ ์ผ๋ก ๋ณด๋ด๋ (.async) ์์๋๋ก ์์ ํจ
๋์(Cocurrent) ํ(์ฒ๋ฆฌ)๋?
- ๋ณดํต ๋ฉ์ธ์ฐ๋ ๋์์ ๋ถ์ฐ์ฒ๋ฆฌ ์ํจ ์์ ์ ๋ค๋ฅธ ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋์์ ์ฒ๋ฆฌ
- ๊ฐ์ ๋ ๋ฆฝ์ ์ด์ง๋ง ์ค์๋๋ ์์ ์ ์ฑ๊ฒฉ์ด ์ ์ฌํ ์ฌ๋ฌ๊ฐ์ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
- DispatchQueue.global()์ ๋์ํ
- ๋๊ธฐ์ ์ผ๋ก ๋ณด๋ด๋ฉด (.sync) ์์๋๋ก ์์ ํจ
( swift 5.5 ์ดํ ) ๋น๋๊ธฐ ํจ์ ์ค๊ณ์ ๋จ์ ์ ๋ณด์ํ Async / await ํจํด์ ๋์
- ๋น๋๊ธฐ ํจ์๋ฅผ ์ค๊ณํ ๋ ๋ฆฌํดํ ๋์ ํด๋ก์ ๋ก ์ค๊ณํด์ผ ํจ : ์์ ์ค๋ช
ํจ
- ๋จ์ : task๊ฐ ์งํ๋๋ ๋ง์ง๋ง ์ฏค์ ํด๋ก์ ๊ฐ ์คํ๋๋ ๋ฐฉ์ (์ปดํ๋ฆฌ์ ๋ธ๋ญ) ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๋น๋๊ธฐ ํจ์๊ฐ ์ด์ด์ ธ ์์ ๋, ์ฝ๋ฐฑ ํจ์์ ์ฐ๊ฒฐ๊ณผ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ ํ ์ ์๋ค ( pyramid of doom : ์ฃฝ์์ ํผ๋ผ๋ฏธ๋ )
- async / await
- func ํจ์๋ช ( ํ๋ผ๋ฏธํฐ : ํ์ ) async throws -> ๋ฆฌํดํ์
- ํจ์์์ async( ๋น๋๊ธฐ ํจ์ )๋ก ์ ์, ๋ฆฌํด ๋ฐฉ์ ์ฌ์ฉ
- async๋ก ์ ์๋ ํจ์๋ awaitํค์๋๋ฅผ ํตํด ๋ฆฌํด์์ ์ ๊ธฐ๋ค๋ฆด ์ ์์ ( ์ฝ๋ ๊ฐ๊ฒฐํ ๊ฐ๋ฅ )
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ์
- ๊ฒฝ์ ์ํฉ / ๊ฒฝ์ ์กฐ๊ฑด (race condition) == ๋ฉ๋ชจ๋ฆฌ ๋์ ์ ๊ทผ ๋ฌธ์
- Thread-safeํ์ง ์์ - ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ , ๊ฐ์ ์์ ์ ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋์์ ํ๋์ ๋ฉ๋ชจ๋ฆฌ(๋ฐ์ดํฐ + ํ ์์ญ)์ ๋์์ ๊ทผ ํ๋ ๋ฌธ์
- ํด๊ฒฐ ๋ฐฉ๋ฒ : Thread- Safe ์ฒ๋ฆฌ - ๋ฉ๋ชจ๋ฆฌ์ ์ฐ๊ณ ์๋ ๋์์๋ ์ฌ๋ฌ์ฐ๋ ๋์์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ ๊ธ(Lock)
- ๊ต์ฐฉ ์ํ (DeadLock)
- 2๊ฐ ์ด์์ ์ฐ๋ ๋๊ฐ ์๋ก ๋ฒ ํ์ ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ์ผ๋ก ์ธํด (์๋ก Tread-safe์ฒ๋ฆฌ๋ฅผ ํ์ฌ ์ ์ ํ๋ ค๊ณ ํ๋ฉด์) ๋ฉ์๋์ ์์ ์ด ์ข ๋ฃํ์ง ๋ชปํ๊ณ ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ์ํ
- ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ ( Concurrency ํ๋ก๊ทธ๋๋ฐ )์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ์ ํด๊ฒฐ ( Thread-Safeํ์ง ์์ ๋, ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ )
- ๋์ํ ๋์ ์ง๋ ฌํ(Serial queue)๋ก ๋ณด๋ด๊ธฐ
- ํ๋ฒ์ ํ๋์ ์ฐ๋ ๋๋ง ์ฒ๋ฆฌ ํ ์ ์๊ฒ ๋จ (๋ฉ๋ชจ๋ฆฌ ๋์ ์ ๊ทผ ๋ฌธ์ ํด๊ฒฐ)
'swift ๋ฌธ๋ฒ๐ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SWIFT] ๋ฌธ์์ด ๋ณด๊ฐ๋ฒ(String Interpolation) (0) | 2023.06.07 |
---|---|
[SWIFT] Resultํ์ (0) | 2023.06.06 |
[SWIFT] Defer๋ฌธ (0) | 2023.05.12 |
[SWIFT] ์๋ฌ ์ฒ๋ฆฌ (Error Handling) (0) | 2023.05.12 |
[SWIFT] ๋์ ๋๋ฆฌ (Dictionary) (0) | 2023.05.12 |