RunLoop์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

RunLoop

Run loop์€ ์ผ๋‹จ Thread์™€ ๊ด€๋ จ๋œ ๋…€์„์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด, Run loop์€ event๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ loop์ด๋‹ค. Timer ๋˜ํ•œ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ๋ฐ”๊นฅ์—์„œ ํ•œ๋ฒˆ ๊ฐ์‹ผ ๊ตฌ์กฐ์ธ๋ฐ, ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ์ด์œ ๋Š” ํ•  ์ผ์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” Thread๋ฅผ busyํ•˜๊ฒŒ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ๋Š” sleep ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

Run loop์˜ ๊ด€๋ฆฌ๋Š” ์ž๋™์ ์œผ๋กœ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ํƒ€์ด๋ฐ์— thread code๋ฅผ ์‹œ์ž‘ํ•˜๋„๋ก ํ•ด์•ผํ•˜๊ณ , ๋“ค์–ด์˜ค๋Š” ์ด๋ฒคํŠธ์— ๋งž์ถ”์–ด์„œ ๋ฐ˜์‘ํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค. Cocoa, Core Foundation์—์„œ๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ  ์‹ถ์€ thread์˜ run loop์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด run loop ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ฆ‰, ๋ช…์‹œ์ ์œผ๋กœ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ฐ๊ฐ์˜ thread (main ํฌํ•จ)์—๋Š” ๊ฐ๊ฐ์˜ run loop object๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. main thread์˜ ๊ฒฝ์šฐ์—๋Š” run loop์ด ๊ณ„์† ๋Œ๊ณ  ์žˆ์–ด์„œ runํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ, ๋”ฐ๋กœ ๋งŒ๋“  thread์˜ ๊ฒฝ์šฐ์—๋Š” ๋‚ด๊ฐ€ ์ง์ ‘ ์‹คํ–‰ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ฆ‰, ์ •๋ฆฌํ•˜๋ฉด

  • Run Loop์€ Thread๋งˆ๋‹ค ๊ฐ๊ฐ ์žˆ๋‹ค.
  • Main Thread์˜ Run Loop์€ ์ž๋™์ ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
  • ๋‹ค๋ฅธ Thread๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๊ทธ๋ž˜์„œ ๋ช…์‹œ์ ์œผ๋กœ run()ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • RunLoop ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  RunLoop.current ๋˜๋Š” RunLoop.main ๋“ฑ์œผ๋กœ ์‹œ์Šคํ…œ์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

RunLoop์˜ ์กด์žฌ ์ด์œ ์™€ ์›๋ฆฌ

ํ•ต์‹ฌ์€ input source, timer ๋‘๊ฐ€์ง€์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. input source๋Š” ๋‹ค๋ฅธ Thread๋‚˜ Application์œผ๋กœ ๋ถ€ํ„ฐ ์˜จ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. Timer source๋Š” scheduled๋œ ์‹œ๊ฐ„ ํ˜น์€ ํŠน์ • ์ฃผ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.

์ด ๊ทธ๋ฆผ์„ ๋ณด๋ฉด, ์œ„๋Š” Input sources์ด๊ณ , ์•„๋ž˜๋Š” Timer sources์ด๋‹ค. Input sources๋ถ€ํ„ฐ ๋ณด๋ฉด, ์™ผ์ชฝ์— ์žˆ๋Š” Thread์— ์ž‘์—…์„ ๋งˆ๊ตฌ ์Œ“์•„๋‘๊ณ , run loop์˜ run์„ ํ˜ธ์ถœํ•˜์—ฌ ์Œ“์—ฌ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋‹ค. ์ด ๋•Œ, run loop์˜ runUntilDate๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด, ํŠน์ • ๋‚ ์งœ์— run loop์„ ์ข…๋ฃŒํ•˜๋„๋ก ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ์™€ ๋ฐ˜๋Œ€๋กœ ์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” Timer์˜ ๊ฒฝ์šฐ event๋ฅผ ์ „๋‹ฌํ•˜์ง€๋งŒ run loop๊ฐ€ ์ข…๋ฃŒ๋˜๋„๋ก ํ•˜์ง€๋Š” ์•Š๊ณ  ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ณด๋ฉด, run loop์˜ ์กด์žฌ ์ด์œ ์ธ ํ•  ์ผ์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” Thread๋ฅผ busyํ•˜๊ฒŒ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ๋Š” sleep ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์— ์ž˜ ๋งž๋Š” ์„ค๊ณ„๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ programmer๊ฐ€ runํ•˜๋„๋ก ํ•˜์—ฌ resource๋ฅผ ์•„๋ผ๊ฒ ๋‹ค๋Š” ์˜๋„๊ฐ€ ๋‹ค๋ถ„ํžˆ ๋ณด์ธ๋‹ค.

loop๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ฝ๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

Main Run Loop

์‚ฌ์‹ค ์šฐ๋ฆฌ๊ฐ€ ์ด RunLoop์„ ๊ฐ€์žฅ ๋งŽ์ด ๋งˆ์ฃผํ•˜๋Š” ๊ณณ์€ ์ด๊ฑฐ๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๋กœ์„œ ์‚ฌ์šฉ์ž event๋ฅผ ๋ฐ›์•„ application์— ์ „๋‹ฌํ•˜๋Š”, ๊ทธ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ์ด๋…€์„์ด๋‹ค. ๊ทธ๋ž˜์„œ ์œ„์—์„œ ์„ค๋ช…ํ•  ๋•Œ, main run loop๋Š” ํ•ญ์ƒ run๋˜์–ด์žˆ๋Š” ์ƒํƒœ๋ผ๊ณ  ๋งํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. ์ด ๊ทธ๋ฆผ์—์„œ run loop์˜ ์—ญํ• ์„ ์ƒ๊ฐํ•œ๋‹ค๋ฉด, ์™œ ์ €๋Ÿฐ์‹์œผ๋กœ ์ •์˜๋ฅผ ํ•ด๋‘์—ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งˆ๋ฌด๋ฆฌ

์ด ๋ถ€๋ถ„์„ ๊นŠ๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์› ๋‹ค. ๋‘๋ฒˆ์งธ์ธ๋ฐ๋„ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ณด์ง€ ๋ชปํ•˜๋‹ˆ ์–ด๋ ต๋‹ค. ๋!

Reference