https://twitter.com/steipete/status/676851647042203648
๋๊ธ์ ์์ ํ๊ฒ ์ต๋๋ค (iOS์์ ๋ถ๋ฒ์ด๋ผ๋ฉด ์ ๊ณต๊ฐ API์ธ๊ฐ ???)
๋ถ๋ช
ํ pthread
๋ฎคํ
์ค๋ ์ด์ ๋ ๋น ๋ฆ
๋๋ค . ๋น๊ตํ ๋ฒค์น ๋งํฌ๋ฅผ ๋ง๋ค๊ณ Atomic
๋ฅผ์ด ๊ฐ์ผ๋ก ๋ณํํด์ผํฉ๋๋ค ( RACCompoundDisposable
๋ฐ RACSerialDisposable
?).
"๋ถ๋ฒ"์ด ๋ฌด์จ ๋ป์ธ์ง์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฒ์๋ถํฐ ์์๊ธฐ ๋๋ฌธ์ ๊ถ๊ธํฉ๋๋ค.ํ์ง๋ง Atomic
์ ํ์ด ์ฒ์๋ถํฐ OSSpinLock
์ฌ์ฉ ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
NSLock
์ฌ์ฉํ ๋ค์ ๋๋ฌด ๋๋ฆฐ ๊ฒ์ผ๋ก ๋ํ ๋ฌ์ผ๋ฉฐ, pthread_mutex_t
๋ ํ
์คํธ ํ ๊ฒฐ๊ณผ ๋๋ฌด ๋๋ฆฐ ๊ฒ์ผ๋ก ๋ํ ๋ฌ์ต๋๊น? ๋ถํํ๋ git์๋ "์์ค ์ด๋โฆ"์ด์ ์ ๊ธฐ๋ก์ด ์์ต๋๋ค.
Spinlocks๋ ์ปค๋์ด ์๋ ์ฅ์น ๋๋ผ์ด๋ฒ ์ปจํ
์คํธ์์ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ๋ฌป๋ ์ด์ ์
๋๋ค. ์ด์จ๋ , ์ฌ๊ธฐ์ ๋ฒ๊ทธ๋ OSSpinLock
๊ฐ ์ ํ ์ฌ์ฉ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. : stuck_out_tongue :
์์ ์๊ฒฌ์ ๋์๋ฒ์ ์ถ๊ฐํ๋ ค๋ฉด ์ ๋ชฉ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค ์์๋ ๊ฒ๋ง ํผ ํฐ ๋ฌธ์ ๋ ์๋๋๋ค. https://twitter.com/Catfish_Man/status/676854531615883265
CPU ๊ณ ๊ฐ ์ํ์์๋ ์ค์ ์น์ ์ด ๋๋ฌด ์์ ์ค์ ์ํฉ์์ ๊ด์ฐฎ์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
โ @Catfish_Man ํธ์ํฐ
@kastiglione์ ์์ ์๊ฒฌ์
"๋ถ๋ฒ"์ด ๋ฌด์จ ๋ป์ธ์ง์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ต์ ์์ง๋ง ARM CPU์ ์ด๋ค ๊ฒ์ด ์คํ ๋ฝ ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ Intel CPU์์์ ๊ฐ์ ๋ง์ ์ด์ / ๋ณด์ฆ / ๊ฐ์ ์ ์ฆ๊ธธ ์ ์๋๋ก ํ์ฉํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. (๊ทธ๋ฌ๋ https://twitter.com/Catfish_Man/status/676851988596809728์ ๋ฐ๋ฅด๋ฉด ๋ชจ๋๋ ์๋ ์ ์์ต๋๋ค.)
์ด์จ๋ , ์ค์ ๋ก๋ "์ฌ๊ธฐ์์ ๋ณผ ์์๋ ๊ฒ์ด ์์"์ด์์ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ๋์ @NachoSoto๊ฐ ์ ์ํ ๊ฒ์ฒ๋ผ ๋ ์์ ํ ๊ธฐ๋ณธ ํ์์ผ๋ก ๋์ฒดํ๊ณ ์ฑ๋ฅ ํ๊ท๋ฅผ ์ธก์ ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์กฐ์ฌ๋ฅผ ์ํํด์ผํฉ๋๋ค.
https://twitter.com/jspahrsummers/status/679245419931660288 ๋ฐ ํ์ ์กฐ์น ( ์ฐธ์กฐํ์ญ์์ค.
๋๋ ์ฐ๋ฆฌ๊ฐ OSSpinLock
์ ์ฌ์ฉ์ ๋์ฒดํด์ผํ๋ค๊ณ ์๊ฐํ์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์์๋ ๋ฌธ์๋ฅผ ๊ณ ๋ คํ ๋ ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ๋ ์ฐ๋ฆฌ / ๋ด ์ด์ ๋ ํ๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์, ๊ด๋ จ ์ญ์ฌ ์ปค๋ฐ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ฃผ์ด์ง ํ์ผ์ ๋ํ ๊ธฐ๋ก์ด ์์ฒญ ๋ ๋ GitHub๊ฐ git log --follow
์ํํ์ง ์๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด์จ๋ ๋๋ "์๋ง ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค"๋ ๊ฒ์ ๋ฐ๋ณต ํ ๊ฒ์ด๋ค. "์ด์ ๋ ๋นจ๋ผ์ง"๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ง๋ ๊ฐ๋จํ ์์ ์ผ ์ ์์ง๋ง ์์ํ๊ธฐ ์ํด ํ๋กํ์ผ ๋ง / ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๋ฉด ๋ ๊ฐ๋จํฉ๋๋ค. ๊ฑฐ๊ธฐ์ ์ ์ / ํฌ์ธํฐ๊ฐ ์์ต๋๊น?
์ฑ๋ฅ์ด ๋ฌธ์ ๊ฐ๋๋ ๊ฒฝ์ฐ / ์ธ์ ์์ผ๋ก ๋์๊ฐ ๋ฐฉ๋ฒ์ ์ ๊ธ์๋ ๋๊ธฐ์ด์ ์กฐ์ฌ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค. (๋ค์์ ๊ฐ๋ ์ ์ต์ํ์ง ์์ ๋ ์๋ฅผ์ํ ๊ฝค ์ข์ ๊ธฐ์ฌ์ ๋๋ค : http://www.linuxjournal.com/content/lock-free-multi-producer-multi-consumer-queue-ring-buffer?page=0,0). ์ผ๋ง ์ ์ ๋ด๋ถ ์ค๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํด ๋น์ทํ ๊ฒ์ ๋ง๋ค์๋๋ฐ, ์ด์ ๊ฐ์ด ์ผ๋ฐ์ ์ธ ์ฉ๋๋ก ์ ์ฉ ํ ์์์ ๊ฒ์ ๋๋ค.
"์ด์ ๋ ๋นจ๋ผ์ง"๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ง๋ ๊ฐ๋จํ ์์ ์ผ ์ ์์ง๋ง ์์ํ๊ธฐ ์ํด ํ๋กํ์ผ ๋ง / ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๋ฉด ๋ ๊ฐ๋จํฉ๋๋ค. ๊ฑฐ๊ธฐ์ ์ ์ / ํฌ์ธํฐ๊ฐ ์์ต๋๊น?
์ ๋ Instruments์ Time Profiler ๋ฐ Allocations์์ GitHub Desktop์ ์คํํ๊ณ ์์๊ณ RAC๊ฐ ๋ง์ ์คํ์ ์ง์คํ์ต๋๋ค. ์ง๊ธ์ @joshaber ๋๋ @mdiep ์๊ฒ
์์๋๋ฉด ์ข์ต๋๋ค. Swift ์ธก์ ๊ฒฝ์ฐ ํ ์คํธํ๋ ค๋ฉด ๋น์ทํ๊ฒ ํฌ๊ณ ๊น์ ์ฝ๋ ๊ธฐ๋ฐ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ง๋ ๋ช ๋ฌ 1 ์ด์ ๋ด ์์ ์ ์ผ๋ถ๋ฅผ ์ฑ์ฅํ์ง๋ง ๋ ๊ทธ๊ฒ์ ์ถฉ๋ถํ ์ํ์ ์ป๊ธฐ ์ํด ๋ด๊ฐ RAC "์ด์ฌํ"๋ฅผ ๋ฐ์ด ์ฌ๋ถ๋ฅผ ์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ง์ ๊ฒ๋ค์ด ๋ด ์ฑ๊ณผ ๊ฐ์ ์ธ์คํธ๋ฃจ๋จผํธ ์ฐจํธ์ ๋ฒ๋ธ ๋ง๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. :๋ฏธ์:
1 ํ๋ฌ๊ทธ! http://capoapp.com , http://capoapp.com/neptune ์ ๊ฐ์ฅ ์ต๊ทผ์ ์์ ํ ์ค๊ณ๋ RAC4 ๊ตฌ์ฑ ์์์ ๋๋ค.
์ ๋ ์ค๋ iOS์์ ์คํ ๋ฝ์ด "๋ถ๋ฒ"์ธ ์ด์ ์ ๋ํด ์์ธํ ์ค๋ช ํ๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ์ต๋๋ค. http://engineering.postmates.com/Spinlocks-Considered-Harmful-On-iOS/
๋๋ ์กฐ๊ธ ์ ์ Atomic์ ์ค๋จํ๊ณ pthread_mutex_lock์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ต๋๋ค. ๋ชจ๋ ๊ณ์ ์์ ๊ฐ์ฅ ์ข์ ์ ๊ธ ์ฅ์น์ ๋๋ค. NSLock๊ณผ ๊ฐ์ ๋์ ๋์คํจ์น๊ฐ ์์ผ๋ฉฐ, ์คํ ์ ๊ธ์ฒ๋ผ ๊ฒฝ์ํ์ง ์์ผ๋ฉด ์ธ์คํดํธ ์ ๊ธ์ด ์คํ ์ ๊ธ๊ณผ ๋ฌ๋ฆฌ ์๋์ง๋ฅผ ๋ญ๋นํ์ง ์์ต๋๋ค.
๋ด ์ ์ฅ์์์ ์์ค๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ๊ฑฐ๋ ์ํ๋๋๋ก ํ ์ ์์ต๋๋ค.
https://github.com/Adlai-Holler/Atomic
https://github.com/Adlai-Holler/Atomic/blob/master/Atomic/Atomic.swift
@kballard ์ข์ ์ค๋ช ์ ๋๋ค, ๊ฐ์ฌํฉ๋๋ค!
๋๋ ๋ฌธ์ ์ ๋ํ ์ ๋ฌธ๊ฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ํด ๊ฐํ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ ๊ธ ์ ํ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ณ๊ฒฝํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ๋ ๊ฒ์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋ฏธ๋ฃฐ ๊ฒ์ ๋๋ค.
์ด์ ๊ฐ์ ๋ฒค์น ๋งํฌ๋ ์์ค ์์ด๋ ์์ ํ ์ธ๋ชจ๊ฐ ์์ต๋๋ค. ๋์ฑ์ด ์๊ฐ์ด ์ค์ ๋ก ๋ฌด์์ ๋ํ๋ด๋ ์ง ๋ฌธ์ํํ์ง ์๊ณ ๊ฐ ๊ตฌ์ฑ์ ๋ํด ํ ๋ฒ๋ง ํ์ํฉ๋๋ค. ๋ค์ํ ๊ตฌ์ฑ์ ๊ฒฝํฉ ์ค์ธ์ง ์ฌ๋ถ, ์ ๊ธ์ ๋ํด ๊ฒฝํฉํ๋ ์ค๋ ๋์ ์ฐ์ ์์ ๋ฑ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค. @synchronized
๋ ํฅ๋ฏธ๋ก์ด ์ง์น์ด๋ฉฐ ์ฑ๋ฅ์ ์ก์ธ์ค ํจํด์ ํฌ๊ฒ ์ข์ฐ๋ฉ๋๋ค. , ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ๊ทธ๊ฑฐ๋ ์ ๊ฐ์ฒด๋ฅผ ์ ๊ทธ๋ ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋์์ ๋ค์ด์ค๊ณ ๋๊ฐ๋ @synchronized
๋ธ๋ก ์ ๋ฑ
์ฃผ์ : dispatch_semaphore
๋ ์ฐ์ ์์๋ฅผ ๊ธฐ๋ถํ์ง ์์ผ๋ฉฐ ์ด๋ ๋ ๋ค๋ฅธ ์ ์ฌ์ ํจ์ ์
๋๋ค.
@jspahrsummers @kballard ์์ CAS๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ์ต๋๋ค. ๊ด์ฌ์ด ์์ผ์๋ฉด PR์ ์ ์ถํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
ํธ์ง : Atomic
์ฌ์ฉ์ ๋ณด๋ฉด ๋ด ๊ตฌํ์ด ์ ์ฉํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฉฑ ๋ฑ์ฑ ์
๋ฐ์ดํธ๋ฅผ ํ ์ ์๋ค๋ฉด CAS๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ผ์ข
์ ๋๊ด์ ํธ๋์ญ์
์ ์ํ ํ ์ ์์ต๋๋ค.์ด ํธ๋์ญ์
์ ํ๋ฅญ ํ ์ ์์ง๋ง ์๋นํ ๋ฆฌํฉํ ๋ง์ด ํ์ํฉ๋๋ค (๋ชจ๋ ๊ฒ์ด CoW ๋ถ๋ณ์ด๋ฉด ์ ๋ง ์ ์๋ํ์ง๋ง ๋์ฐ๋ณ์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ด ํธ๋์ญ์
).
์ค๋์ด ์ค๋ ๋๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋ค์ํ ์ ํ์ ๋๊ธฐํ๋ฅผ ์กฐ์ฌํ๊ณ iOS ์๋ฎฌ๋ ์ดํฐ ๋ฐ ์ค์ ์ฅ์น์์ ๋ฒค์น ๋งํฌ๋ฅผ ์คํํ์ต๋๋ค.
๊ฒฐ๊ณผ๋ ์ ์๊ฒ ๋งค์ฐ ํฅ๋ฏธ ๋กญ์ต๋๋ค. iOS 10์์๋ dispatch_semaphore์ ์ฑ๋ฅ ์ ํ๊ฐ ๋์ ๋๊ฒ ๋ํ๋ฌ์ต๋๋ค. ์ด๋ ์๋ง๋ ์ค๋ ๋ ์ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ๊ทธ์ ๋์์ ๋ณ๊ฒฝํ์ ๊ฒ์
๋๋ค.
๋ค์์ iOS์์ ์ฌ์ฉํ ์์๋ ๊ธฐ๋ณธ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์์ฝ ๋ค์ด์ด๊ทธ๋จ์
๋๋ค. ๋ชจ๋ ํ
์คํธ๋ ๋ฆด๋ฆฌ์ค ๊ตฌ์ฑ์ผ๋ก ์คํ๋ฉ๋๋ค (Swift ์ต์ ํ -O).
SDK9 ์ฉ ๋ฒค์น ๋งํฌ ์ฝ๋
SDK10 ์ฉ ๋ฒค์น ๋งํฌ ์ฝ๋
๋น์ ์ ์ซ์๋ ๋์๊ฒ ๋งค์ฐ ์์ฌ์ค๋ฌ์ ๋ณด์ ๋๋ค. ํ ์คํธ๋ฅผ ๋ช ๋ฒ ์คํ ํ์ต๋๊น?
๋น๊ต๋ฅผ ์ํด ์ผ๋ง ์ ์ ์์ฑํ ํดํค ๋ฒค์น ๋งํฌ ํ๋ค์ค๋ฅผ ์ฌ์ฉํ์ฌ OS X 10.11.5์์ ์์ฒด ๋ฒค์น ๋งํฌ ( source )๋ฅผ ์คํํ์ต๋๋ค. ์ ์ฒด ๋ฒค์น ๋งํฌ๋ฅผ 10 ๋ฒ ์คํํ๊ณ ๊ฐ ํ ์คํธ์์ ์์ 2 ๊ฐ ์ซ์๋ฅผ ์ญ์ ํ๊ณ (์ด์ ์น๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด) ๋๋จธ์ง ์ซ์๋ ๋ค์ ๋ฒ์๋ฅผ ์์ฑํ์ต๋๋ค.
๋๊ธฐํ ์์ : 22-41ns
์คํ ๋ฝ : 24ns
์ธ๋งํฌ์ด : 29ns
NSLock : 45-71ns
๋ฎคํ
์ค : 40-64ns
๋๊ธฐํ : 75-122ns
๋๊ธฐ์ด : 505-554ns
์ฌ๊ธฐ์์ spinlock์ด ํจ์ฌ ์ ๋ ดํ๊ณ ์ธ๋งํฌ์ด, ๋ฎคํ ์ค, NSLock์ด ๋ฎคํ ์ค (๊ธฐ๋ณธ์ ์ผ๋ก ๋ฎคํ ์ค + objc_msgSend์ด๊ธฐ ๋๋ฌธ์)๋ณด๋ค ์ฝ๊ฐ ๋ค์ณ์ง๊ณ ๋๊ธฐํ๊ฐ ๊ฑฐ์ ๋ ๋ฐฐ๋ ๋น์ธ๊ณ ๋ง์ง๋ง์ผ๋ก ๋๊ธฐ์ด์ด ๊ทน๋๋ก ๋น์ธ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ด๊ฐ ์์ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น์ธ๋ค.
@kballard ์์ ๋ณผ ์ ์๋ฏ์ด ๋ด ๋ฒค์น ๋งํฌ๋ ๋งค์ฐ ๊ฐ๋จํ์ง๋ง ์คํ ์๊ฐ์ ์ธก์ ํ๊ธฐ ์ํด ๊ธฐ๋ณธ xctest ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ซ์๋ ๊ฐ ๋๊ธฐํ๊ฐ ์๋ ๊ฐ ํ ์คํธ์ ํ๊ท ์คํ ์๊ฐ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋น์ ๊ณผ ๋์ ๊ฒฐ๊ณผ๋ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ๊ฒ์ฒ๋ผ ๊ทธ๋ ๊ฒ ๋์์ง ์์ ๋๊ธฐ์ด์ ์ ์ธํ๊ณ ๋ ์๊ด ๊ด๊ณ๊ฐ ์์ต๋๋ค.
์์ธ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ค๋์ด ์ค๋ ๋๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋ค์ํ ์ ํ์ ๋๊ธฐํ๋ฅผ ์กฐ์ฌํ๊ณ iOS ์๋ฎฌ๋ ์ดํฐ ๋ฐ ์ค์ ์ฅ์น์์ ๋ฒค์น ๋งํฌ๋ฅผ ์คํํ์ต๋๋ค.
๊ฒฐ๊ณผ๋ ์ ์๊ฒ ๋งค์ฐ ํฅ๋ฏธ ๋กญ์ต๋๋ค. iOS 10์์๋ dispatch_semaphore์ ์ฑ๋ฅ ์ ํ๊ฐ ๋์ ๋๊ฒ ๋ํ๋ฌ์ต๋๋ค. ์ด๋ ์๋ง๋ ์ค๋ ๋ ์ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ๊ทธ์ ๋์์ ๋ณ๊ฒฝํ์ ๊ฒ์ ๋๋ค.
๋ค์์ iOS์์ ์ฌ์ฉํ ์์๋ ๊ธฐ๋ณธ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์์ฝ ๋ค์ด์ด๊ทธ๋จ์ ๋๋ค. ๋ชจ๋ ํ ์คํธ๋ ๋ฆด๋ฆฌ์ค ๊ตฌ์ฑ์ผ๋ก ์คํ๋ฉ๋๋ค (Swift ์ต์ ํ -O).
SDK9 ์ฉ ๋ฒค์น ๋งํฌ ์ฝ๋
SDK10 ์ฉ ๋ฒค์น ๋งํฌ ์ฝ๋