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๋ ์ฑ์์ 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๋ฅผ ํ์ธํ์ธ์.
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 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๋ฅผ ์ฐธ๊ณ ํ์ธ์.
queue์ task๋ฅผ ์ถ๊ฐ ํ๊ธฐ ์ ์, queue์ ํ์ ๊ณผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. Dispath queue๋ task๋ฅผ ์ฐ์์ผ๋ก ๊ทธ๋ฆฌ๊ณ ๋์์ ์คํ ํ ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ, queue๋ฅผ ์ฌ์ฉํ ํน์ ํ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ๊ทธ์ ๋ฐ๋ผ 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์ ์ง์ํ์ง ์์ต๋๋ค.