Skip to content

Latest commit

ย 

History

History
198 lines (185 loc) ยท 13.3 KB

211216_sync,_async,_Parallel,_Concurrency,_GCD.md

File metadata and controls

198 lines (185 loc) ยท 13.3 KB

211216 sync, async, Parallel, Concurrency, GCD

TIL (Today I Learned)

12์›” 16์ผ (๋ชฉ)

ํ•™์Šต ๋‚ด์šฉ

  • ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™œ๋™ํ•™์Šต
  • GCD๋ž€? ย 

๊ณ ๋ฏผํ•œ ์  / ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

[๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™œ๋™ํ•™์Šต]

  • ๋™์‹œ์„ฑ(Concurrency) ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋ณ‘๋ ฌ(Parallelism) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ฉฐ, ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋กœ ์ ‘ํ•  iOS ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌด์—‡์„ ๋” ๊ณ ๋ คํ•ด๋ด์•ผ ํ• ๊นŒ?
    • ๋™์‹œ์„ฑ(Concurreny)
      • ๋…ผ๋ฆฌ์ ์ธ ์šฉ์–ด
      • ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž„
      • ์‹ฑ๊ธ€ ์ฝ”์–ด์—์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ฐฉ์‹
      • ๋ฉ€ํ‹ฐ ์ฝ”์–ด์—์„œ๋„ ๋™์‹œ์„ฑ์€ ์‚ฌ์šฉ๊ฐ€๋Šฅ
      • ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ์‹คํ–‰๋˜๋Š” ์„ฑ์งˆ
      • ๋™์‹œ์„ฑ์„ ์ด์šฉํ•œ ์‹ฑ๊ธ€ ์ฝ”์–ด์˜ ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น์€ ๊ฐ ์Šค๋ ˆ๋“œ๋“ค์ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‚ฌ์‹ค์€ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ์กฐ๊ธˆ์”ฉ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ
    • ๋ณ‘๋ ฌ์„ฑ(Parallelism)
      • ๋ฌผ๋ฆฌ์ ์ธ ์šฉ์–ด
      • ์‹ค์ œ๋กœ ์ž‘์—…์ด ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ
      • ๋ฉ€ํ‹ฐ์ฝ”์–ด์—์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ๋™์ž‘์‹œํ‚ค๋Š” ๋ฐฉ์‹
      • ํ•œ ๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ ์ฝ”์–ด๋“ค์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์„ฑ์งˆ
      • ๋ณ‘๋ ฌ์„ฑ์€ ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์„ฑ(Data Parallelism)๊ณผ ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ(Task Parallelism)์œผ๋กœ ๊ตฌ๋ถ„
        • ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์„ฑ : ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„์–ด ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋“ค๋กœ ๋งŒ๋“  ๋’ค, ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•ด์„œ ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
        • ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ : ์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋™๊ธฐ(asynchronous)์™€ ๋น„๋™๊ธฐ(asynchronous)์˜ ๊ฐœ๋…์€ ์–ด๋–ค ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ๊นŒ?
    • ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ ์‹คํ–‰ ํ๋ฆ„์„ ๋ฉˆ์ถ”์–ด์„œ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฝ”๋“œ์˜ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ๋ณ„๋„์˜ ๊ณต๊ฐ„์— ๋งก๊ฒจ๋‘” ๋’ค ๊ทธ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋‹ค. ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ง€์›ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ๋…ผ๋ฆฌ์ ์ธ ์šฉ์–ด๋กœ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ฐฉ์‹์ด๋‹ค. ์‹ฑ๊ธ€ ์ฝ”์–ด์—์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉด์„œ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
    • Async vs Sync
      • Async๋Š” ๋น„๋™๊ธฐ๋‹ค. ๋น„๋™๊ธฐ๋ž€ ๋‚ด๊ฐ€ ์ž‘์—…์„ ๋งก๊ธฐ๊ณ  ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์— ๋‚˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์•„๋ฌด๊ฒƒ๋„ ๋ชปํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ๋Š๋‚Œ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ Sync๋Š” ํ•ด๋‹น ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.
  • ์• ํ”Œ์ด ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋˜๋Š” ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์—” ๋ฌด์—‡๋ฌด์—‡์ด ์žˆ์„๊นŒ?
    • Grand Central Dispatch(GCD)
      • ๋ฉ€ํ‹ฐ ์ฝ”์–ด์™€ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ ํ™˜๊ฒฝ์—์„œ ์ตœ์ ํ™” ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์• ํ”Œ์ด ๊ฐœ๋ฐœํ•œ ๊ธฐ์ˆ ์ด๋‹ค.
    • Operation Queue
      • ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผํ•˜๋Š” ์ž‘์—…์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค
    • Thread
      • ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…ํ๋ฆ„์˜ ๋‹จ์œ„๋ฅผ ๋งํ•œ๋‹ค. ๋ณดํ†ต ํ•œ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ด ์‹œ์ž‘๋  ๋•Œ๋ถ€ํ„ฐ ๋™์ž‘ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•˜๊ณ  ๋‚˜์ค‘์— ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๋ฅผ ์„œ๋ธŒ ์Šค๋ ˆ๋“œ ๋˜๋Š” ์„ธ์ปจ๋”๋ฆฌ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ Thread๋Š” ๋ฌด์—‡์ด๊ณ  iOS ํ™˜๊ฒฝ์—์„œ ์ด๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์—๋Š” ๋ฌด์—‡๋ฌด์—‡์ด ์žˆ์œผ๋ฉฐ ๊ทธ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?
    • Thread
      • ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…ํ๋ฆ„์˜ ๋‹จ์œ„๋ฅผ ๋งํ•œ๋‹ค. ๋ณดํ†ต ํ•œ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ด ์‹œ์ž‘๋  ๋•Œ๋ถ€ํ„ฐ ๋™์ž‘ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•˜๊ณ  ๋‚˜์ค‘์— ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๋ฅผ ์„œ๋ธŒ ์Šค๋ ˆ๋“œ ๋˜๋Š” ์„ธ์ปจ๋”๋ฆฌ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.
  • iOS ํ™˜๊ฒฝ์—์„œ์˜ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์› ์ข…๋ฅ˜
    • GCD (Grand Central Dispatch) : ๋ฉ€ํ‹ฐ ์ฝ”์–ด์™€ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ ํ™˜๊ฒฝ์—์„œ ์ตœ์ ํ™”๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์• ํ”Œ์ด ๊ฐœ๋ฐœํ•œ ๊ธฐ์ˆ ์ด๋‹ค.
    • Operation Queue : ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค
    • Thread : ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ์• ํ”Œ์—์„œ ์ œ๊ณตํ•˜๋Š” ์Šค๋ ˆ๋“œ ํด๋ž˜์Šค

[๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ]

  • ํ•˜๋“œ์›จ์–ด ์‹œ์Šคํ…œ๋“ค์€ ๋‹ค ๋™๊ธฐ์— ๋งž์ถฐ ๋™์ž‘ํ•œ๋‹ค.
  • ์„œ๋ฒ„์— ์žˆ๋Š” ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋‹ค ๋ฐ›์•„์˜ฌ ๋•Œ ๊นŒ์ง€ ๋ฉˆ์ถฐ์žˆ๋Š”๋‹ค.

[๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ]

  • ์ž‘์—…์„ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๊ณ  ์•ฑ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์„œ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ํ˜•ํƒœ๋กœ ์•ฑ์ด ๋งŒ๋“ค์–ด์งˆ ๊ฒƒ์ด๋‹ค.

[Parallel(๋ณ‘๋ ฌ) vs Concurrency(๋™์‹œ)]

  • ๋ณ‘๋ ฌ
    • ๋ฌผ๋ฆฌ์ 
    • ๋ฌผ๋ฆฌ์  ์Šค๋ ˆ๋“œ์—์„œ ์‹ค์ œ ๋™์‹œ์— ์ผ์„ ํ•˜๋Š” ๊ฐœ๋…
  • ๋™์‹œ
    • ๋…ผ๋ฆฌ์ 
    • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด์ ์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ผ์„ ํ•˜๋Š” ๊ฐœ๋…
  • Concurrent Programming
    • ์žฅ์ 
      • UI ํ™”๋ฉด์€ ์–ธ์ œ๋‚˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
      • ๋ณ‘๋ ฌ ์‹คํ–‰์€ ๋” ๋น ๋ฅด๋‹ค
    • ๋น„์šฉ
      • ์ œ๋Œ€๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ์— ๋ฌด์ง€๋ง‰์ง€ํ•˜๊ฒŒ ์–ด๋ ต๋‹ค.
      • ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋“ค
    • ๊ทธ๋Ÿผ์—๋„ ๋ฐฐ์›Œ์•ผํ•œ๋‹ค ์™œ?
      • ๋ณ‘๋ ฌ์„ฑ๊ณผ ๋™์‹œ์„ฑ์ด ์ข‹์•„์ง€๋Š” ์‹œ๋Œ€๊ฐ€ ์™”๋‹ค.
      • ์ฝ”์–ด๋ฅผ ๋Š˜๋ฆฌ๋Š”๊ฒŒ ๋Œ€์„ธ๋‹ค.
      • ์ด์ œ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š”๊ฒŒ ์ค‘์š”ํ•œ๊ฒŒ ์•„๋‹ˆ๋‹ค.
      • ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š”๊ฑด ์šด์˜์ฒด์ œ๊ฐ€ ํ•ด์ค„ํƒœ๋‹ˆ๊นŒ ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ทธ ์Šค๋ ˆ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ํ์—๋‹ค๊ฐ€ ํด๋กœ์ €๋ฅผ ๋„ฃ์–ด์ฃผ๊ธฐ๋งŒ ํ•ด > ํ ๋‹จ์œ„๋กœ ํด๋กœ์ €์—์„œ ํ์—์„œ ๊บผ๋‚ด์„œ ํด๋กœ์ €๋“ค์„ ์Šค๋ ˆ๋“œ์—๋‹ค๊ฐ€ ๋ถ™์—ฌ์„œ ๊ทธ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด์„œ ์‹คํ–‰ํ•˜๊ณ  ๋˜ ์ฒ˜๋ฆฌํ•ด์ค„๊ฒŒ.
      • ๋” ์ž‘์€ ํด๋กœ์ € ๋‹จ์œ„๋กœ ํ์—๋‹ค๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ํด๋กœ์ € ๋‹จ์œ„๋กœ ๊บผ๋‚ด์„œ ์–ด๋–ค ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋ฅผ ์ด์ œ ํด๋กœ์ € ๋‹จ์œ„๋กœ ์ž‘์—… ์Šค์ผ€์ค„์—์„œ ๋งŒ๋“ค์ž ๋ผ๋Š”๊ฒŒ ์ปจ์…‰์ด๋‹ค.

[Grand Central Dispatch]

  • ์ปค๋„ ์œ„์— ๋ฐ”๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค.
  • ๋งฅ์—๋‚˜ iOS์—์„œ๋Š” lib ์‹œ์Šคํ…œ์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์•ˆ์— ๋“ค์–ด์žˆ๋‹ค.
  • ์Šค๋ ˆ๋“œ๋ฅผ ์ž˜ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ์–ด๋ ต๋”๋ผ. ์ž˜์“ฐ๋Š” ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค์–ด๋ณด์ž ํ•ด์„œ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ์ฝ”๋“œ๋ธ”๋Ÿญ ๋‹จ์œ„๋ฅผ ํด๋กœ์ €๋กœ ๋ฌถ์–ด์„œ ๊ทธ๊ฑฐ๋ฅผ ํ์—๋‹ค ๋„ฃ๊ณ  ํ๊ฐ€ ๊ทธ๊ฑฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ด๋Ÿฐ ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์ž๋Š” ์˜๋„
  • ํŠน์žฅ์ 
    • ๋ฐ˜์‘์„ฑ์„ ๊ฐœ์„ 
    • ๋‹ค์ด๋‚˜๋ฏน ํ™•์žฅ
    • ๋ณด๋‹ค ๋‚˜์€ ํ”„๋กœ์„ธ์Šค ์‚ฌ์šฉ
    • ๊น”๋”ํ•œ ์ฝ”๋“œ
  • ์Šค๋ ˆ๋“œ๋ฅผ ๋งŽ์ด ๋งŒ๋“œ๋Š”๊ฒŒ ์ข‹์€ ์ผ์ด ์•„๋‹ˆ๋‹ค.
  • ์ ์ •ํ•œ ๊ฐฏ์ˆ˜๋งŒํผ๋งŒ cpu ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์šด์˜ํ•˜๋Š”๊ฒŒ ์ข‹์„ํƒ ๋ฐ, ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ์šด์˜์ฒด์ œ๊ฐ€ cpu ์•„ํ‚คํ…์ฒ˜์— ๋งž๊ฒŒ ์šด์˜ํ•˜๋Š”๊ฒŒ ๋” ์ข‹๋‹ค ๊ทธ๊ฑธ GCD๊ฐ€ ํ•ด์ฃผ๊ฒ ๋‹ค. ๋ผ๋Š”๊ฑฐ๋‹ค.
  • ํ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ตฌ์กฐ๋Š” ๋™์ผํ•˜๋‹ค.
  • ์ด๋ฒคํŠธ ์†Œ์‹ฑ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
    • ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœํ•ด์„œ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ทธ ์ฒ˜๋ฆฌ๋„ ๊ฐ™์€ ์‹์˜ q์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ๋””์ŠคํŒจ์น˜ ์†Œ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ๋„ ์žˆ๋‹ค.
  • GCD๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” Pool์ด ์žˆ๋‹ค.
  • ๋” ์ข‹์€ ๊ตฌ์กฐ์—์„œ๋Š” Pool์ด ๋” ๋งŽ์„ ์ˆ˜๋„ ์žˆ๋‹ค.
  • GCD๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ์จ ์–ป๋Š” ์ด์ 
    • ํšจ์œจ์„ฑ
      • ์ฝ”๋“œ๊ฐ€ CPU ์‚ฌ์ดํด์„ ๋” ํšจ๊ณผ์ ์œผ๋กœ
    • ๋” ๋‚˜์€ ํ‘œํ˜„
      • ์„ ์–ธํ•˜๊ธฐ ํŽธํ•œ ํด๋กœ์ €
      • ํ”„๋กœ๋“€์„œ/์ปจ์Šˆ๋จธ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํ(Queues)
    • ์‹œ์Šคํ…œ ์ˆ˜์ค€ ๊ด€๋ฆฌ
      • ์„œ๋ธŒ ์‹œ์Šคํ…œ์— ๋…๋ฆฝ์ ์œผ๋กœ OS๊ฐ€ ๊ด€๋ฆฌ
    • ๊ธฐ์กด ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ๋‚˜ ๋™๊ธฐํ™” ๋ฐฉ์‹๊ณผ 100% ํ˜ธํ™˜ ๊ฐ€๋Šฅ
    • GCD ์Šค๋ ˆ๋“œ๋Š” POSIX ์Šค๋ ˆ๋“œ๋ฅผ ํฌ์žฅ
      • GCD ์Šค๋ ˆ๋“œ๋ฅผ cancel, exit, kill, join, or detach ํ•˜์ง€๋งˆ๋ผ
    • GCD ์Šค๋ ˆ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉ
      • ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ์Šค๋ ˆ๋“œ๋ณ„ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๋ณต๊ตฌํ•˜๋ผ
  • ์Šค๋ ˆ๋“œ ์ž์ฒด๋Š” GCD๊ฐ€ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ์Šค๋ ˆ๋“œ ํด๋ž˜์Šค ์˜ˆ์ œ
  • GCD๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ 2์ค„๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • GCD Advantages
    • Thread recycling
      • ์Šค๋ ˆ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์„ฑ์ด ์ข‹์•„์ง„๋‹ค.
    • Deferred based on availability
  • ๋ณดํ˜ธํ•˜๊ธฐ Locking
    • Enforce mutually exclusive access to critical sections
    • Serialize access to shared state between thrads
    • Ensure data integrity
  • ์œ„ ์ฒ˜๋Ÿผ lock์„ ๋„ฃ์–ด์ค˜์•ผ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•œ ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค.
  • lock์ด ์—†์œผ๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š”๊ฒŒ ๋ณด์žฅ์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋Š ์ˆœ๊ฐ„ ๋™์‹œ์— ์“ธ๋ ค๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์•ฑ์ด ๋ฉˆ์ถœ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๋™์‹œ์— ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ํ•˜๋‚˜๋ฅผ ์“ฐ๊ธฐ์ „์— ๋‹ค๋ฅธ๊ฒŒ ๋จผ์ € ์จ์ค˜๊ฐ€์ง€๊ณ  ๊ฐ’์ด ๊นจ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.
    • ์›ํ•˜๋Š” ํ‘œํ˜„์ด ์•ˆ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
  • GCD๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ์œ„ ์ฝ”๋“œ ๋ธ”๋Ÿญ๋งŒํผ์€ ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.
  • ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ํ์— ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ ๋‚  ์ผ์ด ์—†๋‹ค.
  • ์œ„ ๋นจ๊ฐ„ ๋ฐ•์Šค ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋‹ค ์‹คํ–‰ํ•  ๋•Œ ๊นŒ์ง€ ๋™๊ธฐํ™”๊ฐ€ ๋˜์„œ ๋ฉˆ์ถฐ์ ธ ์žˆ๋‹ค. ์‹คํ–‰์ด ๋๋‚˜๊ณ  ๋‚˜๋ฉด ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค.
  • async๊ฐ€ ๋˜๋ฉด ํ์—๋‹ค๊ฐ€ ๋„ฃ๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ๊ทธ๋ƒฅ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค.
  • sync๋กœ ํ•˜๋˜ async๋กœ ํ•˜๋˜ ํด๋กœ์ € ์•ˆ์€ ์ถฉ๋Œ๋‚˜์ง€ ์•Š๊ณ  ๊ฐ๊ฐ์˜ ํ์— ์žˆ๋Š” ํด๋กœ์ €๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ Lock์„ ์“ฐ์ง€ ์•Š๋”๋ผ๋„ GCD์—์„œ๋Š” Lock์„ ์“ฐ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ํŠน์ •ํ•œ ์‹œ๊ฐ„ ๋’ค์— ์ด ์ฝ”๋“œ ๋ธ”๋Ÿญ์„ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด์ค€๋‹ค.
  • ํ”„๋ ˆ์ž„ ๋“œ๋ž์ด ๋ฐœ์ƒํ•  ์ •๋„๋กœ ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฐ”์˜๋ฉด ์ด๊ฒƒ๋„ ๋”œ๋ ˆ์ด๊ฐ€ ๋˜์–ด ํ˜ธ์ถœ์ด ๋Šฆ์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ํ™”๋ฉด์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๊ผญ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์— ๋„ฃ์„ ํ•„์š”์—†๋‹ค. ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์— ๋„ฃ์–ด๋„ ๋œ๋‹ค.
  • โ€˜๋‚˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์–ด๋”˜๊ฐ€์—์„œ ์š” ์ฝ”๋“œ๊ฐ€ ๋˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ผโ€™ ๊ทธ๋Ÿฌ๋ฉด ๊ธ€๋กœ๋ฒŒ ํ์— ๋„ฃ์–ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ํ์˜ ์ข…๋ฅ˜
    • ๋™์‹œ์„ฑ ํ
      • Concurrent Queue Execute multiple blocks at the same time
      • Concurrently executed closures may complete out of order
      • Queues execute concurrently with respect to other queues
    • ์‹œ๋ฆฌ์–ผ ํ
      • Lightweight list of closures
      • Enqueue and dequeue are FiFO
      • Serial queue execute blocks one at a time
  • ํ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง๋ ฌ์„ฑ์ด๋‹ค.
  • ์ง๋ ฌ์„ฑ์œผ๋กœ ๋งŒ๋“ค๊ฑด์ง€ ๋™์‹œ์„ฑ์œผ๋กœ ๋งŒ๋“ค๊ฑด์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์•„๋ฌด ์˜ต์…˜์„ ์ฃผ์ง€์•Š์œผ๋ฉด ์ง๋ ฌํ๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ  ๊ธ€๋กœ๋ฒŒ ํ๋กœ ๋งŒ๋“ค๋ฉด ๋™์‹œ์„ฑ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.
  • ๋™์‹œ์„ฑ์— ์žˆ๋Š” ํ๋Š” ํ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋‹ค.
  • DispatchGroup
    • ์—ฌ๋Ÿฌ์ž‘์—…๋“ค์„ ํ•  ๋•Œ ๊ทธ ์ž‘์—…๋“ค์ด ํ•œ๊บผ๋ฒˆ์— ๊ทธ๋ฃนํ•‘ํ•ด์„œ ๋๋‚˜์•ผ์ง€๋งŒ ๋‹ค ๋๋‚ฌ๋‹ค๋ผ๊ณ  ํŒ๋‹จํ•  ๋•Œ ์‚ฌ์šฉ
  • DispatchQoS
    • ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค. ํ ์ค‘์—์„œ๋„ ์–ด๋–ค ์ž‘์—…๋“ค์ด ๋จผ์ € ๋“ค์–ด๊ฐ€์•ผ๋ ์ง€ ๋ง์•„์•ผ ๋ ์ง€๋ฅผ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.
  • DispatchWorkItemFlags
    • ์˜ต์…˜๋“ค์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • concurrentPerform?
    • ํƒ€์ž…๋ฉ”์„œ๋“œ
    • for๋ฌธ ์ฒ˜๋Ÿผ ๊ฐ™์€ ์ž‘์—…์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณตํ•ด์•ผํ•˜๋Š” ๊ฒƒ๋“ค, ํด๋กœ์ €๋ฅผ N๋ฒˆ ์‹คํ–‰ํ•ด์•ผํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • Suspending and resuming execution
    • func suspend()
    • func resume()
  • ํ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์˜ํ•  ์ 
    • ์ผ๋ฐ˜์ ์ธ ๋ชฉ์ ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋‹ค.
    • GCD์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ๋ฆ„ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค
    • ํ์— ๋ธ”๋ก์„ ํ•œ๋ฒˆ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด์ค€๋‹ค.
    • ๋™๊ธฐํ™” sync API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.
      • Dead lock ์ƒํƒœ๋กœ ๋ฉˆ์ถฐ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.
    • ์ทจ์†Œํ•˜๋ ค๋ฉด DispatchWorkItem ๋˜๋Š” OperationQueue
  • GCD Design Patterns
    • ์‰ฌ์šด๋ฐฉ๋ฒ•
      • Dispatch_async()๋ฅผ ์จ๋ผ
    • ํ๋Š” ํ”„๋กœ๋“€์„œ/์ปจ์Šˆ๋จธ ๊ตฌ์กฐ๋กœ
      • ํด๋กœ์ €๊ฐ€ ์ž‘์—… ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ฒจ์ค€๋‹ค.
    • ํ๋Š” ๊ฐ€๋ณ๊ณ  ํšจ์œจ์ ์œผ๋กœ
      • ์Šค๋ ˆ๋“œ๊ฐ€ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉ๋œ๋‹ค.
    • UI ์ด๋ฒคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ๊ณผ ๋น„์Šทํ•จ
    • ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ํด๋งํ•˜์ง€ ๋งˆ๋ผ
      • ์˜ˆ) ์†Œ์ผ“๋Œ€๊ธฐ, ๋””๋ ‰ํ† ๋ฆฌ ๋ณ€ํ™” ๊ฐ์‹œ
    • ๋””์ŠคํŒจ์น˜ ์†Œ์Šค ๊ณ ๋ ค
      • ์šด์˜์ฒด์ œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์‹œํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆด ๋•Œ