Skip to content

Latest commit

ย 

History

History
100 lines (64 loc) ยท 18.7 KB

Dispath-Queues.md

File metadata and controls

100 lines (64 loc) ยท 18.7 KB

Dispath Queues

Grand Central Dispath (GDC) dispath queues๋Š” task ์ˆ˜ํ–‰์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ ์ž…๋‹ˆ๋‹ค. Dispath queues๋Š” ์ž„์˜์˜ ์ฝ”๋“œ ๋ธ”๋ก์„ ๋น„๋™๊ธฐ ๋˜๋Š” ๋™๊ธฐ์‹์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋ถ„๋ฆฌ๋œ ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰ํ–ˆ๋˜ ๊ฑฐ์˜ ๋ชจ๋“  task๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ dispath queues๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. dispath queues์˜ ์ด์ ์€ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ์— ํ•ด๋‹น๋˜๋Š” ๊ฒƒ๋ณด๋‹ค task๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์‚ฌ์šฉํ•˜๊ธฐ ๊ฐ„ํŽธํ•˜๊ณ  ๋”์šฑ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ฑ•ํ„ฐ๋Š” dispath queues๋ฅผ ๋‹น์‹ ์˜ ์•ฑ์—์„œ general task๋ฅผ ์‹คํ–‰ ํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ์†Œ๊ฐœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ๋ฅผ dispatch queues๋กœ ๊ต์ฒดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Mirgrating Away from Thread์—์„œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ํŒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค

Dispatch Queues์— ๋Œ€ํ•˜์—ฌ

Dispatch queues๋Š” ์•ฑ์—์„œ task๋ฅผ ๋น„๋™๊ธฐ์ ์ด๊ณ  ๋™์‹œ์— task๋ฅผ ์ˆ˜ํ–‰ ํ•˜๊ธฐ ์œ„ํ•œ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. task๋Š” ๋‹จ์ˆœํžˆ ์•ฑ์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์–ด๋– ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ๋‹น์‹ ์€ ์–ด๋–ค ๊ณ„์‚ฐ์„ ํ•˜๋Š”, ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š”, ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ณผ์ •, ํ˜น์€ ๋” ๋งŽ์€ ๊ฒƒ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋Š” task๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ•จ์ˆ˜ ๋˜๋Š” ๋ธ”๋ก ๊ฐ์ฒด ์•ˆ์—์„œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์œ„์น˜ ์‹œํ‚ค๊ณ  dispatch queue์— ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ task๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

dispatch queue๋Š” ์ „์†กํ•œ task๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  dispatxh queue๋“ค์€ ์„ ์ž…์„ ์ถœ(FIFO) ์ž๋ฃŒ ๊ตฌ์กฐ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, queue์— ์ถ”๊ฐ€๋œ task๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์ถ”๊ฐ€ ๋œ ์ˆœ์„œ์™€ ํ•ญ์ƒ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. GCD๋Š” ์ž๋™์œผ๋กœ ์ผ๋ถ€ dispath queue๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ํŠน์ • ์šฉ๋„๋ฅผ ์œ„ํ•ด์„œ ๋‹น์‹ ์ด ์ƒ์„ฑํ•  ์ˆ˜ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ 3-1์€ ๋‹น์‹ ์˜ ์•ฑ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ dispatch queue์˜ ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋‚˜์—ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ 3-1 dispatch queue์˜ ์ข…๋ฅ˜

Type Description
Serial Serial queue๋Š” (private dispath queue๋กœ๋„ ์•Œ๋ ค์ง„)๋Š” queue์— ์ถ”๊ฐ€๋œ ์ˆœ์„œ๋Œ€๋กœ ํ•œ๋ฒˆ์— ํ•œ ๊ฐœ์˜ task๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ task๋Š” dispatch queue์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ณ ์œ ํ•œ ์“ฐ๋ ˆ๋“œ(task๋งˆ๋‹ค ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š”)์—์„œ ์ž‘๋™ํ•œ๋‹ค. Serial queue๋Š” ๋ณดํ†ต ํŠน์ • ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋™๊ธฐํ™” ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.๋‹น์‹ ์€ ํ•„์š”ํ•œ ๋งŒํผ ๋งŽ์ด serial queue๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ๊ฐ์˜ queue๋Š” ๋‚˜๋จธ์ง€ ๋ชจ๋“  queue๋“ค๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋™์‹œ์— ์ž‘๋™๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ, ๋งŒ์•ฝ 4๊ฐœ์˜ serial queue๋“ค์„ ์ƒ์„ฑํ•œ๋‹ค๋ฉด, ๊ฐ๊ฐ์˜ queue๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ task๋งŒ ์‹คํ–‰ ํ•˜์ง€๋งŒ ์ตœ๋Œ€ 4๊ฐœ ๊นŒ์ง€์˜ task๊ฐ€ ๊ฐ queue์—์„œ ๋™์‹œ์— ์‹คํ–‰ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. serail queue๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€, Creating Serial Dispath Queues์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Concurrent Concurrent queue๋Š” (global dispatch queue์˜ ํ•œ ์ข…๋ฅ˜๋กœ ์•Œ๋ ค์ง„)๋Š” ํ•˜๋‚˜ ๋˜๋Š” ์ด์ƒ์˜ task๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜์ง€๋งŒ, task๋“ค์€ ์—ฌ์ „ํžˆ queue์— ์ถ”๊ฐ€ ๋œ ์ˆœ์„œ๋Œ€๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ task๋Š” dispatch queue์— ์˜ํ•ด ๊ด€๋ฆฌ ๋˜๋Š” ๊ณ ์œ ํ•œ ์“ฐ๋ ˆ๋“œ์—์„œ ์ž‘๋™๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ฃผ์–ด์ง„ ์‹œ์ ์— ์‹คํ–‰ ์ค‘์ธ task์˜ ์ •ํ™•ํ•œ ๊ฐœ์ˆ˜๋Š” ๊ฐ€๋ณ€์ ์ด๊ณ  ์‹œ์Šคํ…œ ์ƒํƒœ์— ์˜์กด์ ์ž…๋‹ˆ๋‹ค.iOS 5 ์ด์ƒ์—์„œ, queue์˜ ํƒ€์ž…์„ DISPATCH_QUEUE_CONCURRENT๋ฅผ ์ง€์ •ํ•จ์œผ๋กœ์จ concurrent dispatch queue๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์•ฑ์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” 4๊ฐœ์˜ ๋ฏธ๋ฆฌ ์ง€์ •๋œ global concurrent queue๋„ ์žˆ์Šต๋‹ˆ๋‹ค. global concurrent queues๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๋Š”, Getting the Global Concurrent Dispatch Queues ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Main dispatch queue Main dispatch queue๋Š” ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์—์„œ task๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ serail queue์ž…๋‹ˆ๋‹ค. ์ด queue๋Š” ์‹คํ–‰ ๋ฃจํ”„์— ๋ถ™์–ด ์žˆ๋Š” ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์ž์›๋“ค์˜ ์‹คํ–‰๊ณผ queue์— ์žˆ๋Š” task์˜ ์‹คํ–‰์„ ๊ต์ฐจ๋กœ ๋ฐฐ์น˜(interleave)ํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ์˜ ์‹คํ–‰ ๋ฃจํ”„์—์„œ ์ž‘๋™๋ฉ๋‹ˆ๋‹ค. ์•ฑ์˜ ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์—์„œ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”์ธ queue๋Š” ์ข…์ข… ์•ฑ์˜ ์ฃผ์š” ๋™๊ธฐํ™” ์‹œ์ ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.dispatch queue๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ, ๊ทธ๊ฒƒ๋“ค์ด ์ ์ ˆํžˆ ๋น ์ ธ ๋‚˜๊ฐ€๋Š”์ง€ ๊ผญ ์•Œ์•„์•ผ ํ•œ๋‹ค. queue๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š”, Performing Tasks on the Main Thread ์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interleave : ์ปดํ“จํ„ฐ ํ•˜๋“œ๋””์Šคํฌ์˜ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ์ธ์ ‘ํ•˜์ง€ ์•Š๊ฒŒ ๋ฐฐ์—ดํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. ์ธํ„ฐ๋ฆฌ๋ธŒ(interleave)๋ผ๋Š” ๋‹จ์–ด๋Š” โ€˜๊ต์ฐจ๋กœ ๋ฐฐ์น˜ํ•˜๋‹คโ€™๋ผ๋Š” ๋œป์ด๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋””์Šคํฌ ๋“œ๋ผ์ด๋ธŒ๋ฅผ ์ข€๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค. ์ธํ„ฐ๋ฆฌ๋ธŒ๋Š” ๊ธฐ์–ต์žฅ์น˜๋ฅผ ๋ช‡ ๊ฐœ์˜ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ ๋™์‹œ์— ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ์œผ๋กœ์จ ๋ณต์ˆ˜์˜ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค์˜ ํšจ์œจํ™”๋ฅผ ๋„๋ชจํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ•˜๋“œ๋””์Šคํฌ๋Š” ๋“œ๋ผ์ด๋ธŒ์˜ ์†๋„์™€ ์šด์˜์ฒด์ œ(OS), ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋“ฑ์— ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐ๋ฆฌ๋ธŒ ๊ฐ’์„ ๋ฏธ๋ฆฌ ์„ค์ •ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ์ธํ„ฐ๋ฆฌ๋ธŒ ๊ฐ’์ด ์ž‘์„์ˆ˜๋ก ํ•˜๋“œ๋””์Šคํฌ ๋“œ๋ผ์ด๋ธŒ์˜ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.

์•ฑ์— ๋™์‹œ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•ด์„œ, dispath queue๋Š” ์“ฐ๋ ˆ๋“œ์— ๋น„ํ•ด ๋ช‡๊ฐ€์ง€ ์žฅ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ง์ ‘์ ์ธ ์žฅ์ ์€ work-queue(์ž‘์—… ๋Œ€๊ธฐ์—ด) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์˜ ๊ฐ„๊ฒฐ์„ฑ์ž…๋‹ˆ๋‹ค. ์“ฐ๋ ˆ๋“œ์—์„œ๋Š”, ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…๊ณผ ์“ฐ๋ ˆ๋“œ ์ž์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Dispatch queue๋Š” ์“ฐ๋ ˆ๋“œ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ๊ฑฑ์ • ์—†์ด ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…์—๋งŒ ์ง‘์ค‘ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ ๋Œ€์‹ ์—, ์‹œ์Šคํ…œ์ด ๋‹น์‹ ์„ ์œ„ํ•ด ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋‹จ์ผ ์•ฑ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๋ณด๋‹ค ์‹œ์Šคํ…œ์ด ์“ฐ๋ ˆ๋“œ๋ฅผ ํ›จ์”ฌ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์žฅ์ ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ํ•œ ์ž์›๊ณผ ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ์— ๊ธฐ๋ฐ˜ํ•ด ์“ฐ๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋™์ ์œผ๋กœ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ณดํ†ต ์‹œ์Šคํ…œ์€ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ๋ณด๋‹ค task์˜ ์ž‘๋™์„ ๋” ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

dispatch queue์— ๋Œ€ํ•ด ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์žฌ์ž‘์„ฑ ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์“ฐ๋ ˆ๋“œ์— ๊ด€ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค dispatch queue๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ณดํ†ต ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ž‘์„ฑ์˜ ํ•ต์‹ฌ์€ ๋…๋ฆฝ์ ์ด๊ณ  ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๊ฒŒ task๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ์‚ฌ์‹ค ์“ฐ๋ ˆ๋“œ์™€ dispatch queue ๋ชจ๋‘์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.) ํ•˜์ง€๋งŒ, dispatch queue๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด๋ผ๋Š” ์ด์ ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‘๊ฐœ์˜ task๊ฐ€ ๊ฐ™์€ ๊ณต์œ  ๋œ ์ž์›์— ์ ‘๊ทผ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—์„œ ์ž‘๋™ ๋œ๋‹ค๋ฉด, ์“ฐ๋ ˆ๋“œ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋จผ์ € ์ˆ˜์ •ํ•  ๊ฒƒ ์ด๊ณ , ๋‹น์‹ ์€ ๋‘๊ฐœ์˜ task๊ฐ€ ๋™์‹œ์— ๊ทธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด lock์„ ํ•ด์•ผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. dispatch queue๋กœ๋Š”, ์ฃผ์–ด์ง„ ์‹œ๊ฐ„์— ํ•˜๋‚˜์˜ task๋งŒ ์ˆ˜์ • ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด task๋ฅผ ๋ชจ๋‘ serial dipatch queue์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ queue ๊ธฐ๋ฐ˜ ๋™๊ธฐํ™” ํƒ€์ž…์€ lock๋ณด๋‹ค ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. lock์€ ํ•ญ์ƒ ๊ฒฝ์Ÿ, ๊ฒฝ์Ÿ์ด ์—†๋Š” ๋‘ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๋†’์€ ๋น„์šฉ์˜ kernel trap์„ ์š”๊ตฌํ•˜๋Š” ๋ฐ˜๋ฉด์—, dispatch queue๋Š” ์ฃผ๋กœ ์•ฑ์˜ process ๊ณต๊ฐ„์—์„œ ์ž‘๋™ํ•˜๊ณ  ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ kernel์— ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋น„๋ก serial queue ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋‘๊ฐœ์˜ task๊ฐ€ ๋™์‹œ์— ์ž‘๋™ ๋˜์ง€ ์•Š๋Š” ๋‹ค๋Š” ๊ฒƒ์„ ์ง€์  ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๋‘๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— lock์ด ๊ฑธ๋ฆฌ๋ฉด, ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋™์‹œ์„ฑ์„ ์žƒ๊ฑฐ๋‚˜ ์ƒ๋‹นํžˆ ๊ฐ์†Œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€, ์“ฐ๋ ˆ๋“œ ๋ชจ๋ธ์€ kernel๊ณผ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๋‘๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. Dispatch queue๋Š” ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์†์‹ค์„ ์š”๊ตฌ ํ•˜์ง€ ์•Š๊ณ , ์‚ฌ์šฉ ๋˜๋Š” ์“ฐ๋ ˆ๋“œ๋Š” ๋ฐ”์˜๊ฒŒ ์œ ์ง€ ๋˜๊ณ , ์ฐจ๋‹จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

dispatch queue์— ๋Œ€ํ•ด ๊ธฐ์–ต ํ•ด์•ผํ•˜๋Š” ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Dispatch queue๋Š” ๋‹ค๋ฅธ dispatch queue๋ฅผ ์ค€์ˆ˜ํ•˜์—ฌ ๋™์‹œ์— task๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์“ฐ๋ ˆ๋“œ์˜ ์ง๋ ฌํ™”๋Š” single dispatch queue์˜ task๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ์ด ๋™์‹œ์— ์‹คํ–‰ํ•  task์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, 100๊ฐœ์˜ ๋‹ค๋ฅธ queue์˜ 100๊ฐœ์˜ task๋ฅผ ๊ฐ–๋Š” ์•ฑ์€ ๋ชจ๋“  task๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ์€ ์‹œ์ž‘ํ•  ์ƒˆ๋กœ์šด task๋ฅผ ์„ ํƒํ•  ๋•Œ queue์˜ ์šฐ์„ ์ˆœ์œ„ ๋ ˆ๋ฒจ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. serial queue์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๋Š”, Providing a Clean Up Function For a Queue์—์„œ ๋ด…์‹œ๋‹ค.
  • queue์— ์žˆ๋Š” task๋Š” queue์— ์ถ”๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„ ์‹คํ–‰ ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๋งŒ์•ฝ CoCoa operation object๋ฅผ ์ „์— ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, model operation์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹ ์ž…๋‹ˆ๋‹ค.)
  • Private dispatch queue๋Š” reference-counted ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ฝ”๋“œ์— queue๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด, dipatch source๊ฐ€ queue์— ์ฐธ๊ณ  ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋˜ํ•œ retain count๋ฅผ ์ฆ๊ฐ€ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, ๋ชจ๋“  dispatch source๊ฐ€ ์ทจ์†Œ ๋˜์—ˆ๋Š”์ง€ ํ™•์‹  ํ•ด์•ผํ•˜๊ณ  ๋ชจ๋“  reatin call์ด ์ ์ ˆํ•œ release call๊ณผ ๊ท ํ˜•์ด ๋งž๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. queue๋ฅผ ์œ ์ง€, ํ•ด์ œ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” Memory Mangament for Dispatch Queues์—์„œ ๋ณด์„ธ์š”. dispatch source์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋Š”, About Dispatch Sources๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Queue ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ๋“ค

dispatch queue ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Grand Central Dispatch๋Š” ๋ช‡๊ฐ€์ง€ ๊ธฐ์ˆ ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ 3-2 dipatch queue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋“ค

Technology Description
Dispatch groups dispatch group์€ completion์„ ์œ„ํ•œ ๋ธ”๋ก ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. (๋ธ”๋ก๋“ค์„ ํ•„์š”์— ๋”ฐ๋ผ ๋™๊ธฐ์ ์œผ๋กœ ๋˜๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) Group์€ ๋‹ค๋ฅธ task์˜ completion์— ๋”ฐ๋ผ ์ฝ”๋“œ์˜ ์œ ์šฉํ•œ ๋™๊ธฐํ™” ๋งค์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. group์„ ์‚ฌ์šฉํ•˜๋Š” ๋” ๋งŽ์€ ์ •๋ณด๋Š”, Waiting on Groups of Queued Tasks์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Dispatch semaphores dispatch semaphore์€ ์ „ํ†ต์ ์ธ semaphore์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ํšจ์œจ ์ ์ž…๋‹ˆ๋‹ค. Dispatch semaphore์€ semaphore๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†์–ด calling thread๊ฐ€ ์ฐจ๋‹จ ๋  ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ kernel๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. semaphore๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, kernel ํ˜ธ์ถœ์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. dispatch semaphore ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋Š”, Using Dispatch Semaphores to Regulate the Use of Finite Resources๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
Dispatch sources dispatch source๋Š” ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ์˜ ํŠน์ •ํ•œ ํƒ€์ž…์— ๋Œ€ํ•œ ์‘๋‹ต notification์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. dispatch source๋ฅผ notification, signal, descriptor ๊ฐ™์€ ์ด๋ฒคํŠธ๋“ค์„ ๋‹ค๋ฅธ ๊ฒƒ๋“ค ์‚ฌ์ด์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด๋ฒคํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š”๋ฐ์— ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, dispatch source๋Š” ํŠน์ • dispatch queue ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ task ์ฝ”๋“œ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. dispatch source๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์„ฑํ•˜๋Š” ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€, Dispatch Sources๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Block์„ ์‚ฌ์šฉํ•ด์„œ task๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ

Block object๋Š” C, Objective-C ๊ทธ๋ฆฌ๊ณ  C++ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” C ๊ธฐ๋ฐ˜ ์–ธ์–ด์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. Block์€ ์ž์‹ ์„ ํฌํ•จํ•œ ์ž‘์—… ๋‹จ์œ„๋ฅผ ์‰ฝ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋น„๋ก ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, block์€ ์‹ค์ œ๋กœ ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋ณธ ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„๋˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹น์‹ ์ด ์ œ๊ณตํ•œ ์ฝ”๋“œ๋ฅผ (๊ด€๋ จ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜) ํŒจํ‚ค์ง€ํ™” ํ•˜๊ณ  ๊ทธ๊ฒƒ์„ heap์— ๋“ค์–ด ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ์บก์Šํ™” ํ•˜๊ณ  ์•ฑ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

block์˜ ์ค‘์š”ํ•œ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” lexical scope(์ •์  ๋ฒ”์œ„) ์™ธ๋ถ€์—์„œ๋„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ž…๋‹ˆ๋‹ค. block์„ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์— ์ •์˜ํ•˜๋ฉด, block์€ ์–ด๋–ค๋ฉด์—์„œ ์ „ํ†ต์ ์ธ code block ๊ฐ™์ด ์ž‘๋™๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, block์€ ๋ถ€๋ชจ scope์— ์ •์˜๋œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. block์— ์˜ํ•ด ์ ‘๊ทผ ๋œ ๋ณ€์ˆ˜๋Š” heap์— ์žˆ๋Š” block ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋ณต์‚ฌ๋˜์–ด block์ด ์ถ”ํ›„์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. block์ด dispatch queue์— ์ถ”๊ฐ€ ๋˜๋ฉด, ์ด ๊ฐ’๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ์ „์šฉ ํƒ€์ž…์œผ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” block์€ _block ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ์˜ ํ˜ธ์ถœ scope๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

lexical scope : ์ •์  ๋ฒ”์œ„๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์‹œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ์œ„์น˜์— ์˜ํ•˜์—ฌ ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ถ€ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ๋Š” ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ ์–ธ๋œ ๋ถ€ํ”„๋กœ๊ทธ๋žจ ๋ฐ–์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. (์ปดํ“จํ„ฐ์ธํ„ฐ๋„ทIT์šฉ์–ด๋Œ€์‚ฌ์ „)

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ๋ฒ•๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉ ํ•˜์—ฌ code์— inline์œผ๋กœ block์„ ์ •์˜ ํ•ฉ๋‹ˆ๋‹ค. block๊ณผ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ block ์ด๋ฆ„ ์•ž์— * ๋Œ€์‹  ^๊ฐ€ ์˜ต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ, ์ธ์ˆ˜๋ฅผ block์— ์ „๋‹ฌํ•˜๊ณ  ๊ทธ๊ฒƒ์œผ๋กœ ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ 3-1์€ ์ฝ”๋“œ์— block์„ ์„ ์–ธํ•˜๊ณ  ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. aBlock ๋ณ€์ˆ˜๋Š” ๋‹จ์ผ integer ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๊ณ  ์•„๋ฌด ๊ฐ’๋„ ๋ฐ˜ํ™˜ ๋ฐ›์ง€ ์•Š๋„๋ก ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ์ผ์น˜ํ•˜๋Š” ์‹ค์ œ block์ด aBlock์— ํ• ๋‹น๋˜๊ณ  inline์œผ๋กœ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ค„์€ ํ‘œ์ค€ํ™” ํ•  ์ง€์ •๋œ integer๋ฅผ ์ถœ๋ ฅํ•˜๋ฉฐ block์„ ์ฆ‰์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์ŠคํŠธ 3-1 ๊ฐ„๋‹จํ•œ block ์˜ˆ์ œ

    int x = 123;
    int y = 456;
    
    //Block declaration and assignment
    void (^aBlock)(int) = ^(int z) {
    	printf("%d %d %d\n", x, y, z);
    }
    
    //Excute the block
    aBlock(789); // prints : 123, 456, 789

์•„๋ž˜๋Š” block ์„ค๊ณ„ ์‹œ ๊ณ ๋ ค ํ•ด์•ผ ํ•  ๋ช‡๊ฐ€์ง€ ์ฃผ์š” ๊ฐ€์ด๋“œ๋ผ์ธ๋“ค์— ๋Œ€ํ•œ ์š”์•ฝ์ž…๋‹ˆ๋‹ค:

  • dispatch queue๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” block์€, ๋ถ€๋ชจ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์†Œ๋“œ์—์„œ ์Šค์นผ๋ผ ๋ณ€์ˆ˜๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  block ์•ˆ์—์„œ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, calling context์— ์˜ํ•ด ํ• ๋‹น๋˜๊ณ  ์‚ญ์ œ ๋˜๋Š” ํฐ ๊ตฌ์กฐ์ฒด๋‚˜ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ๊ธฐ๋ฐ˜ ๋ณ€์ˆ˜๋“ค์„ ์บก์ฒ˜ ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. block์ด ์‹คํ–‰ ๋  ๋•Œ ๊นŒ์ง€๋Š”, ํฌ์ธํ„ฐ์— ์˜ํ•ด ์ฐธ์กฐ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ, ๋ฉ”๋ชจ๋ฆฌ(ํ˜น์€ ๊ฐ์ฒด)๋ฅผ ์ง์ ‘ ํ• ๋‹นํ•˜๊ณ  ํ•ด๋‹น block์— ๋ฉ”๋ชจ๋ฆฌ์˜ ์†Œ์œ ๊ถŒ์„ ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  • Dispatch queue๋Š” ์ถ”๊ฐ€ ๋œ block์„ ๋ณต์‚ฌํ•˜๊ณ , ์‹คํ–‰์„ ์™„๋ฃŒ ํ•˜์˜€์„ ๋•Œ block์„ ํ•ด์ œ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, block์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๋ช…์‹œ์ ์œผ๋กœ ๋ณต์‚ฌ ํ•ด ์ค„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋น„๋ก ์ž‘์€ task๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๋Š”๋ฐ์— queue๊ฐ€ ์›์‹œ ์“ฐ๋ ˆ๋“œ๋ณด๋‹ค ๋” ํšจ์œจ์ ์ด์ง€๋งŒ, block์„ ์ƒ์„ฑํ•˜๊ณ  queue์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์—๋Š” ์—ฌ์ „ํžˆ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ block์ด ๋„ˆ๋ฌด ์ ์€ ์ผ์„ ํ•œ๋‹ค๋ฉด, queue์— dispatchํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค inline์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ €๋ ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. block์ด ๋„ˆ๋ฌด ์ ์€ ์ผ์€ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” perfomance tool์„ ์ด์šฉํ•ด ๊ฐ๊ฐ ๊ฒฝ๋กœ์˜ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œํ•˜์ง€ ๋ง๊ณ  ๋‹ค๋ฅธ ๋ธ”๋ก์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ˆ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ™์€ queue์˜ task๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•œ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋Œ€์‹  dispatxh queue์˜ context pointer์„ ์‚ฌ์šฉํ•˜์„ธ์š”. dispath queue์˜ context data์— ์ ‘๊ทผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” Storing Custom Context Information์„ ํ™•์ธํ•˜์„ธ์š”.
  • ๋งŒ์•ฝ block์ด ๋ช‡ ๊ฐœ ์ด์ƒ์˜ Objective-C ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•œ๋‹ค๋ฉด, ๊ทธ ๊ฐ์ฒด๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด block ์ฝ”๋“œ๋ฅผ @autorelease block์œผ๋กœ ๊ฐ์‹ธ์•ผ ํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋น„๋ก GCD dispatch queue๋Š” ๊ณ ์œ  autorelease pools๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ, pool์ด ์–ธ์ œ ๋น„์šธ์ง€ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์•ฑ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ œ์•ฝ์ด ์žˆ๋‹ค๋ฉด, ๋‹น์‹ ๋งŒ์˜ autorelase pool์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด autorelease๋œ ๊ฐ์ฒด๋ฅผ ๋”์šฑ ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์„ ์–ธ๊ณผ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ํฌํ•จํ•œ block์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š”, Blocks Programming Topics๋ฅผ ํ™•์ธํ•˜์„ธ์š”. dispatch queue์— block์„ ์ถ”๊ฐ€ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€, Adding Tasks to Queue๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Dispatch Queue ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ

queue์— task๋ฅผ ์ถ”๊ฐ€ ํ•˜๊ธฐ ์ „์—, queue์˜ ํƒ€์ž…๊ณผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Dispath queue๋Š” task๋ฅผ ์—ฐ์†์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์— ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, queue๋ฅผ ์‚ฌ์šฉํ•  ํŠน์ •ํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ์— ๋”ฐ๋ผ queue ์†์„ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์„น์…˜์€ dispatch queue๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

Dispatch Queue์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

Dispatch queue ์™€ ๋‹ค๋ฅธ dispatch ๊ฐ์ฒด๋“ค์€ refernce-counted ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. Dispatch queue๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, 1์ด๋ผ๋Š” ์ดˆ๊ธฐ reference count๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ reference count๋ฅผ ์ฆ๊ฐ€, ๊ฐ์†Œ ํ•˜๊ธฐ ์œ„ํ•ด dispatch_retain ๊ณผ dispatch_release ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. queue์˜ reference count๊ฐ€ 0์œผ๋กœ ๋„๋‹ฌํ•˜๋ฉด, ์‹œ์Šคํ…œ์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ queue์˜ ํ• ๋‹น์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

queue์™€ ๊ฐ™์ด, ๊ทธ๊ฒƒ๋“ค์ด ์‚ฌ์šฉ ๋˜๋Š” ๋™์•ˆ์— ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋˜๋Š”์ง€ ํ™•์‹  ํ•˜๊ธฐ ์œ„ํ•ด dispatch ๊ฐ์ฒด๋ฅผ ์œ ์ง€, ํ•ด์ œ ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. memory-managed CoCoa ๊ฐ์ฒด์™€ ๊ฐ™์ด, ๋งŒ์•ฝ ์ฝ”๋“œ๋กœ ์ „๋‹ฌ ๋œ queue๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ณ„ํšํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— queue์— ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฉฐ ๋”์ด์ƒ ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ํ•ด์ œ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

Note: concurrent dispatch queue๋‚˜ main dispatch queue๋ฅผ ํฌํ•จํ•œ 
      ์–ด๋– ํ•œ global dispatch queue๋„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 
      queue์— ์œ ์ง€๋‚˜ ํ•ด์ œ๋ฅผ ์œ„ํ•œ ์‹œ๋„๋Š” ๋ชจ๋‘ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

garbage-collected ์•ฑ์„ ๊ตฌํ˜„ ํ•˜์˜€๋”๋ผ๋„, ๋‹น์‹ ์€ ์—ฌ์ „ํžˆ dispathc queue์™€ dispatch ๊ฐ์ฒด๋ฅผ ์œ ์ง€ํ•˜๊ณ  ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Grand Centeral Dispatch๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๊ธฐ ์œ„ํ•œ garbage collection model์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.