memory-barriers.txt 139 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136
  1. NOTE:
  2. This is a version of Documentation/memory-barriers.txt translated into Korean.
  3. This document is maintained by SeongJae Park <sj38.park@gmail.com>.
  4. If you find any difference between this document and the original file or
  5. a problem with the translation, please contact the maintainer of this file.
  6. Please also note that the purpose of this file is to be easier to
  7. read for non English (read: Korean) speakers and is not intended as
  8. a fork. So if you have any comments or updates for this file please
  9. update the original English file first. The English version is
  10. definitive, and readers should look there if they have any doubt.
  11. ===================================
  12. ์ด ๋ฌธ์„œ๋Š”
  13. Documentation/memory-barriers.txt
  14. ์˜ ํ•œ๊ธ€ ๋ฒˆ์—ญ์ž…๋‹ˆ๋‹ค.
  15. ์—ญ์ž๏ผš ๋ฐ•์„ฑ์žฌ <sj38.park@gmail.com>
  16. ===================================
  17. =========================
  18. ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด
  19. =========================
  20. ์ €์ž: David Howells <dhowells@redhat.com>
  21. Paul E. McKenney <paulmck@linux.vnet.ibm.com>
  22. Will Deacon <will.deacon@arm.com>
  23. Peter Zijlstra <peterz@infradead.org>
  24. ========
  25. ๋ฉด์ฑ…์กฐํ•ญ
  26. ========
  27. ์ด ๋ฌธ์„œ๋Š” ๋ช…์„ธ์„œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค; ์ด ๋ฌธ์„œ๋Š” ์™„๋ฒฝํ•˜์ง€ ์•Š์€๋ฐ, ๊ฐ„๊ฒฐ์„ฑ์„ ์œ„ํ•ด ์˜๋„๋œ
  28. ๋ถ€๋ถ„๋„ ์žˆ๊ณ , ์˜๋„ํ•˜์ง„ ์•Š์•˜์ง€๋งŒ ์‚ฌ๋žŒ์— ์˜ํ•ด ์“ฐ์˜€๋‹ค๋ณด๋‹ˆ ๋ถˆ์™„์ „ํ•œ ๋ถ€๋ถ„๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  29. ์ด ๋ฌธ์„œ๋Š” ๋ฆฌ๋ˆ…์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ
  30. ์•ˆ๋‚ด์„œ์ž…๋‹ˆ๋‹ค๋งŒ, ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค ์‹ถ์œผ๋ฉด (๊ทธ๋Ÿฐ๊ฒŒ ๋งŽ์„ ๊ฒ๋‹ˆ๋‹ค) ์งˆ๋ฌธ์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  31. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด ๋ฌธ์„œ๋Š” ๋ฆฌ๋ˆ…์Šค๊ฐ€ ํ•˜๋“œ์›จ์–ด์— ๊ธฐ๋Œ€ํ•˜๋Š” ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ช…์„ธ์„œ๊ฐ€
  32. ์•„๋‹™๋‹ˆ๋‹ค.
  33. ์ด ๋ฌธ์„œ์˜ ๋ชฉ์ ์€ ๋‘๊ฐ€์ง€์ž…๋‹ˆ๋‹ค:
  34. (1) ์–ด๋–ค ํŠน์ • ๋ฐฐ๋ฆฌ์–ด์— ๋Œ€ํ•ด ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ์„ ๋ช…์„ธํ•˜๊ธฐ ์œ„ํ•ด์„œ,
  35. ๊ทธ๋ฆฌ๊ณ 
  36. (2) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฐ๋ฆฌ์–ด๋“ค์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์•ˆ๋‚ด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ
  37. ์œ„ํ•ด์„œ.
  38. ์–ด๋–ค ์•„ํ‚คํ…์ณ๋Š” ํŠน์ •ํ•œ ๋ฐฐ๋ฆฌ์–ด๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ์ตœ์†Œํ•œ์˜
  39. ์š”๊ตฌ์‚ฌํ•ญ๋“ค๋ณด๋‹ค ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐํ•˜๋Š”
  40. ์š”๊ตฌ์‚ฌํ•ญ๋“ค์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ์•„ํ‚คํ…์ณ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์•„ํ‚คํ…์ณ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋ž€ ์ ์„
  41. ์•Œ์•„๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  42. ๋˜ํ•œ, ํŠน์ • ์•„ํ‚คํ…์ณ์—์„œ ์ผ๋ถ€ ๋ฐฐ๋ฆฌ์–ด๋Š” ํ•ด๋‹น ์•„ํ‚คํ…์ณ์˜ ํŠน์ˆ˜ํ•œ ๋™์ž‘ ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด
  43. ํ•ด๋‹น ๋ฐฐ๋ฆฌ์–ด์˜ ๋ช…์‹œ์  ์‚ฌ์šฉ์ด ๋ถˆํ•„์š”ํ•ด์„œ no-op ์ด ๋ ์ˆ˜๋„ ์žˆ์Œ์„ ์•Œ์•„๋‘์‹œ๊ธฐ
  44. ๋ฐ”๋ž๋‹ˆ๋‹ค.
  45. ์—ญ์ž: ๋ณธ ๋ฒˆ์—ญ ์—ญ์‹œ ์™„๋ฒฝํ•˜์ง€ ์•Š์€๋ฐ, ์ด ์—ญ์‹œ ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ์˜๋„๋œ ๊ฒƒ์ด๊ธฐ๋„
  46. ํ•ฉ๋‹ˆ๋‹ค. ์—ฌํƒ€ ๊ธฐ์ˆ  ๋ฌธ์„œ๋“ค์ด ๊ทธ๋ ‡๋“ฏ ์™„๋ฒฝํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ฒˆ์—ญ๋ฌธ๊ณผ ์›๋ฌธ์„ ํ•จ๊ป˜
  47. ์ฝ์œผ์‹œ๋˜ ๋ฒˆ์—ญ๋ฌธ์„ ํ•˜๋‚˜์˜ ๊ฐ€์ด๋“œ๋กœ ํ™œ์šฉํ•˜์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ฆฌ๋ฉฐ, ๋ฐœ๊ฒฌ๋˜๋Š” ์˜ค์—ญ ๋“ฑ์—
  48. ๋Œ€ํ•ด์„œ๋Š” ์–ธ์ œ๋“  ์˜๊ฒฌ์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ณผํ•œ ๋ฒˆ์—ญ์œผ๋กœ ์ธํ•œ ์˜คํ•ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด
  49. ์• ๋งคํ•œ ๋ถ€๋ถ„์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ์–ด์ƒ‰ํ•จ์ด ์žˆ๋”๋ผ๋„ ์›๋ž˜์˜ ์šฉ์–ด๋ฅผ ์ฐจ์šฉํ•ฉ๋‹ˆ๋‹ค.
  50. =====
  51. ๋ชฉ์ฐจ:
  52. =====
  53. (*) ์ถ”์ƒ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ๋ชจ๋ธ.
  54. - ๋””๋ฐ”์ด์Šค ์˜คํผ๋ ˆ์ด์…˜.
  55. - ๋ณด์žฅ์‚ฌํ•ญ.
  56. (*) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
  57. - ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์˜ ์ข…๋ฅ˜.
  58. - ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์— ๋Œ€ํ•ด ๊ฐ€์ •ํ•ด์„  ์•ˆ๋  ๊ฒƒ.
  59. - ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด.
  60. - ์ปจํŠธ๋กค ์˜์กด์„ฑ.
  61. - SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ.
  62. - ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์‹œํ€€์Šค์˜ ์˜ˆ.
  63. - ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด vs ๋กœ๋“œ ์˜ˆ์ธก.
  64. - ์ดํ–‰์„ฑ
  65. (*) ๋ช…์‹œ์  ์ปค๋„ ๋ฐฐ๋ฆฌ์–ด.
  66. - ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด.
  67. - CPU ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  68. - MMIO ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด.
  69. (*) ์•”๋ฌต์  ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  70. - ๋ฝ Acquisition ํ•จ์ˆ˜.
  71. - ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ํ•จ์ˆ˜.
  72. - ์Šฌ๋ฆฝ๊ณผ ์›จ์ดํฌ์—… ํ•จ์ˆ˜.
  73. - ๊ทธ์™ธ์˜ ํ•จ์ˆ˜๋“ค.
  74. (*) CPU ๊ฐ„ ACQUIRING ๋ฐฐ๋ฆฌ์–ด์˜ ํšจ๊ณผ.
  75. - Acquire vs ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค.
  76. - Acquire vs I/O ์•ก์„ธ์Šค.
  77. (*) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ณณ
  78. - ํ”„๋กœ์„ธ์„œ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ.
  79. - ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜.
  80. - ๋””๋ฐ”์ด์Šค ์•ก์„ธ์Šค.
  81. - ์ธํ„ฐ๋ŸฝํŠธ.
  82. (*) ์ปค๋„ I/O ๋ฐฐ๋ฆฌ์–ด์˜ ํšจ๊ณผ.
  83. (*) ๊ฐ€์ •๋˜๋Š” ๊ฐ€์žฅ ์™„ํ™”๋œ ์‹คํ–‰ ์ˆœ์„œ ๋ชจ๋ธ.
  84. (*) CPU ์บ์‹œ์˜ ์˜ํ–ฅ.
  85. - ์บ์‹œ ์ผ๊ด€์„ฑ.
  86. - ์บ์‹œ ์ผ๊ด€์„ฑ vs DMA.
  87. - ์บ์‹œ ์ผ๊ด€์„ฑ vs MMIO.
  88. (*) CPU ๋“ค์ด ์ €์ง€๋ฅด๋Š” ์ผ๋“ค.
  89. - ๊ทธ๋ฆฌ๊ณ , Alpha ๊ฐ€ ์žˆ๋‹ค.
  90. - ๊ฐ€์ƒ ๋จธ์‹  ๊ฒŒ์ŠคํŠธ.
  91. (*) ์‚ฌ์šฉ ์˜ˆ.
  92. - ์ˆœํ™˜์‹ ๋ฒ„ํผ.
  93. (*) ์ฐธ๊ณ  ๋ฌธํ—Œ.
  94. =======================
  95. ์ถ”์ƒ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ๋ชจ๋ธ
  96. =======================
  97. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”์ƒํ™”๋œ ์‹œ์Šคํ…œ ๋ชจ๋ธ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  98. : :
  99. : :
  100. : :
  101. +-------+ : +--------+ : +-------+
  102. | | : | | : | |
  103. | | : | | : | |
  104. | CPU 1 |<----->| Memory |<----->| CPU 2 |
  105. | | : | | : | |
  106. | | : | | : | |
  107. +-------+ : +--------+ : +-------+
  108. ^ : ^ : ^
  109. | : | : |
  110. | : | : |
  111. | : v : |
  112. | : +--------+ : |
  113. | : | | : |
  114. | : | | : |
  115. +---------->| Device |<----------+
  116. : | | :
  117. : | | :
  118. : +--------+ :
  119. : :
  120. ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ๋Ÿฌ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์˜คํผ๋ ˆ์ด์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ๊ฐ๊ฐ์˜ CPU ๋Š” ๊ทธ๋Ÿฐ
  121. ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒํ™”๋œ CPU ๋ชจ๋ธ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ์ˆœ์„œ๋Š”
  122. ๋งค์šฐ ์™„ํ™”๋˜์–ด ์žˆ๊ณ , CPU ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ธ๊ณผ๊ด€๊ณ„๋ฅผ ์–ด๊ธฐ์ง€ ์•Š๋Š” ์ƒํƒœ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค๊ณ 
  123. ๋ณด์ผ ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์„ ์ž์‹ ์ด ์›ํ•˜๋Š” ์–ด๋–ค ์ˆœ์„œ๋Œ€๋กœ๋“  ์žฌ๋ฐฐ์น˜ํ•ด
  124. ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ, ์ปดํŒŒ์ผ๋Ÿฌ ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •์ƒ์  ๋™์ž‘์„ ํ•ด์น˜์ง€
  125. ์•Š๋Š” ํ•œ๋„ ๋‚ด์—์„œ๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ๋“  ์ž์‹ ์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜
  126. ์žˆ์Šต๋‹ˆ๋‹ค.
  127. ๋”ฐ๋ผ์„œ ์œ„์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ํ•œ CPU๊ฐ€ ๋™์ž‘์‹œํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์ด ๋งŒ๋“ค์–ด๋‚ด๋Š”
  128. ๋ณ€ํ™”๋Š” ํ•ด๋‹น ์˜คํผ๋ ˆ์ด์…˜์ด CPU ์™€ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋“ค ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค(์ ์„ )๋ฅผ
  129. ์ง€๋‚˜๊ฐ€๋ฉด์„œ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๋“ค์— ์ธ์ง€๋ฉ๋‹ˆ๋‹ค.
  130. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋“ค์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  131. CPU 1 CPU 2
  132. =============== ===============
  133. { A == 1; B == 2 }
  134. A = 3; x = B;
  135. B = 4; y = A;
  136. ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ๊ฐ€์šด๋ฐ์— ์œ„์น˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ๋ณด์—ฌ์ง€๊ฒŒ ๋˜๋Š” ์•ก์„ธ์Šค๋“ค์€ ๋‹ค์Œ์˜ ์ด
  137. 24๊ฐœ์˜ ์กฐํ•ฉ์œผ๋กœ ์žฌ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  138. STORE A=3, STORE B=4, y=LOAD A->3, x=LOAD B->4
  139. STORE A=3, STORE B=4, x=LOAD B->4, y=LOAD A->3
  140. STORE A=3, y=LOAD A->3, STORE B=4, x=LOAD B->4
  141. STORE A=3, y=LOAD A->3, x=LOAD B->2, STORE B=4
  142. STORE A=3, x=LOAD B->2, STORE B=4, y=LOAD A->3
  143. STORE A=3, x=LOAD B->2, y=LOAD A->3, STORE B=4
  144. STORE B=4, STORE A=3, y=LOAD A->3, x=LOAD B->4
  145. STORE B=4, ...
  146. ...
  147. ๋”ฐ๋ผ์„œ ๋‹ค์Œ์˜ ๋„ค๊ฐ€์ง€ ์กฐํ•ฉ์˜ ๊ฐ’๋“ค์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  148. x == 2, y == 1
  149. x == 2, y == 3
  150. x == 4, y == 1
  151. x == 4, y == 3
  152. ํ•œ๋ฐœ ๋” ๋‚˜์•„๊ฐ€์„œ, ํ•œ CPU ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ๋ฐ˜์˜ํ•œ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ๊ฒฐ๊ณผ๋Š”
  153. ๋‹ค๋ฅธ CPU ์—์„œ์˜ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ์ธ์ง€๋˜๋Š”๋ฐ, ์ด ๋•Œ ์Šคํ† ์–ด๊ฐ€ ๋ฐ˜์˜๋œ ์ˆœ์„œ์™€
  154. ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ธ์ง€๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  155. ์˜ˆ๋กœ, ์•„๋ž˜์˜ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋“ค์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  156. CPU 1 CPU 2
  157. =============== ===============
  158. { A == 1, B == 2, C == 3, P == &A, Q == &C }
  159. B = 4; Q = P;
  160. P = &B D = *Q;
  161. D ๋กœ ์ฝํ˜€์ง€๋Š” ๊ฐ’์€ CPU 2 ์—์„œ P ๋กœ๋ถ€ํ„ฐ ์ฝํ˜€์ง„ ์ฃผ์†Œ๊ฐ’์— ์˜์กด์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—”
  162. ๋ถ„๋ช…ํ•œ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ด๋ฒคํŠธ๋“ค์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ๋Š” ์•„๋ž˜์˜
  163. ๊ฒฐ๊ณผ๋“ค์ด ๋ชจ๋‘ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  164. (Q == &A) and (D == 1)
  165. (Q == &B) and (D == 2)
  166. (Q == &B) and (D == 4)
  167. CPU 2 ๋Š” *Q ์˜ ๋กœ๋“œ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์ „์— P ๋ฅผ Q ์— ๋„ฃ๊ธฐ ๋•Œ๋ฌธ์— D ์— C ๋ฅผ ์ง‘์–ด๋„ฃ๋Š”
  168. ์ผ์€ ์—†์Œ์„ ์•Œ์•„๋‘์„ธ์š”.
  169. ๋””๋ฐ”์ด์Šค ์˜คํผ๋ ˆ์ด์…˜
  170. -------------------
  171. ์ผ๋ถ€ ๋””๋ฐ”์ด์Šค๋Š” ์ž์‹ ์˜ ์ปจํŠธ๋กค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์˜ ํŠน์ • ์˜์—ญ์œผ๋กœ ๋งคํ•‘ํ•ด์„œ
  172. ์ œ๊ณตํ•˜๋Š”๋ฐ(Memory mapped I/O), ํ•ด๋‹น ์ปจํŠธ๋กค ๋ ˆ์ง€์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ์ˆœ์„œ๋Š” ๋งค์šฐ
  173. ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋“œ๋ ˆ์Šค ํฌํŠธ ๋ ˆ์ง€์Šคํ„ฐ (A) ์™€ ๋ฐ์ดํ„ฐ ํฌํŠธ ๋ ˆ์ง€์Šคํ„ฐ (D)
  174. ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ๋˜๋Š” ๋‚ด๋ถ€ ๋ ˆ์ง€์Šคํ„ฐ ์ง‘ํ•ฉ์„ ๊ฐ–๋Š” ์ด๋”๋„ท ์นด๋“œ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค. ๋‚ด๋ถ€์˜
  175. 5๋ฒˆ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์˜ ์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  176. *A = 5;
  177. x = *D;
  178. ํ•˜์ง€๋งŒ, ์ด๊ฑด ๋‹ค์Œ์˜ ๋‘ ์กฐํ•ฉ ์ค‘ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  179. STORE *A = 5, x = LOAD *D
  180. x = LOAD *D, STORE *A = 5
  181. ๋‘๋ฒˆ์งธ ์กฐํ•ฉ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜จ _ํ›„์—_ ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•˜๋ฏ€๋กœ, ์˜ค๋™์ž‘์„ ์ผ์œผํ‚ฌ ๊ฒ๋‹ˆ๋‹ค.
  182. ๋ณด์žฅ์‚ฌํ•ญ
  183. --------
  184. CPU ์—๊ฒŒ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ๋ณด์žฅ์‚ฌํ•ญ ๋ช‡๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
  185. (*) ์–ด๋–ค CPU ๋“ , ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์€ ํ•ด๋‹น CPU ์ž์‹ ์—๊ฒŒ
  186. ์žˆ์–ด์„œ๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ˆ˜ํ–‰ ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ์— ๋Œ€ํ•ด์„œ:
  187. Q = READ_ONCE(P); smp_read_barrier_depends(); D = READ_ONCE(*Q);
  188. CPU ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜ ์‹œํ€€์Šค๋ฅผ ์ˆ˜ํ–‰ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค:
  189. Q = LOAD P, D = LOAD *Q
  190. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์‹œํ€€์Šค ๋‚ด์—์„œ์˜ ์ˆœ์„œ๋Š” ํ•ญ์ƒ ์ง€์ผœ์ง‘๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ
  191. smp_read_barrier_depends() ๋Š” ์•„๋ฌด์ผ๋„ ์•ˆํ•˜์ง€๋งŒ DEC Alpha ์—์„œ๋Š”
  192. ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต์˜ ๊ฒฝ์šฐ์—๋Š” smp_read_barrier_depends()
  193. ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  rcu_dereference() ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„
  194. ์•Œ์•„๋‘์„ธ์š”.
  195. (*) ํŠน์ • CPU ๋‚ด์—์„œ ๊ฒน์น˜๋Š” ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ํ–‰ํ•ด์ง€๋Š” ๋กœ๋“œ์™€ ์Šคํ† ์–ด ๋“ค์€ ํ•ด๋‹น
  196. CPU ์•ˆ์—์„œ๋Š” ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ์— ๋Œ€ํ•ด์„œ:
  197. a = READ_ONCE(*X); WRITE_ONCE(*X, b);
  198. CPU ๋Š” ๋‹ค์Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜ ์‹œํ€€์Šค๋งŒ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์š”์ฒญํ•  ๊ฒ๋‹ˆ๋‹ค:
  199. a = LOAD *X, STORE *X = b
  200. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์— ๋Œ€ํ•ด์„œ๋Š”:
  201. WRITE_ONCE(*X, c); d = READ_ONCE(*X);
  202. CPU ๋Š” ๋‹ค์Œ์˜ ์ˆ˜ํ–‰ ์š”์ฒญ๋งŒ์„ ๋งŒ๋“ค์–ด ๋ƒ…๋‹ˆ๋‹ค:
  203. STORE *X = c, d = LOAD *X
  204. (๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๊ณผ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜์ด ๊ฒน์น˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•ด
  205. ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด ํ•ด๋‹น ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ๊ฒน์นœ๋‹ค๊ณ  ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค).
  206. ๊ทธ๋ฆฌ๊ณ  _๋ฐ˜๋“œ์‹œ_ ๋˜๋Š” _์ ˆ๋Œ€๋กœ_ ๊ฐ€์ •ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ •ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  207. (*) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ READ_ONCE() ๋‚˜ WRITE_ONCE() ๋กœ ๋ณดํ˜ธ๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ
  208. ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ •์€ _์ ˆ๋Œ€๋กœ_ ํ•ด์„  ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด
  209. ์—†๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด ์„น์…˜์—์„œ ๋‹ค๋ฃจ๊ฒŒ ๋ , ๋ชจ๋“  "์ฐฝ์˜์ ์ธ"
  210. ๋ณ€๊ฒฝ๋“ค์„ ๋งŒ๋“ค์–ด๋‚ผ ๊ถŒํ•œ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  211. (*) ๊ฐœ๋ณ„์ ์ธ ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋“ค์ด ์ฃผ์–ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ์š”์ฒญ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ •์€ _์ ˆ๋Œ€๋กœ_
  212. ํ•˜์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ง์€ ๊ณง:
  213. X = *A; Y = *B; *D = Z;
  214. ๋Š” ๋‹ค์Œ์˜ ๊ฒƒ๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ์œผ๋กœ๋“  ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค:
  215. X = LOAD *A, Y = LOAD *B, STORE *D = Z
  216. X = LOAD *A, STORE *D = Z, Y = LOAD *B
  217. Y = LOAD *B, X = LOAD *A, STORE *D = Z
  218. Y = LOAD *B, STORE *D = Z, X = LOAD *A
  219. STORE *D = Z, X = LOAD *A, Y = LOAD *B
  220. STORE *D = Z, Y = LOAD *B, X = LOAD *A
  221. (*) ๊ฒน์น˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์€ ํ•ฉ์ณ์ง€๊ฑฐ๋‚˜ ๋ฒ„๋ ค์งˆ ์ˆ˜ ์žˆ์Œ์„ _๋ฐ˜๋“œ์‹œ_ ๊ฐ€์ •ํ•ด์•ผ
  222. ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ์ฝ”๋“œ๋Š”:
  223. X = *A; Y = *(A + 4);
  224. ๋‹ค์Œ์˜ ๊ฒƒ๋“ค ์ค‘ ๋ญ๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  225. X = LOAD *A; Y = LOAD *(A + 4);
  226. Y = LOAD *(A + 4); X = LOAD *A;
  227. {X, Y} = LOAD {*A, *(A + 4) };
  228. ๊ทธ๋ฆฌ๊ณ :
  229. *A = X; *(A + 4) = Y;
  230. ๋Š” ๋‹ค์Œ ์ค‘ ๋ญ๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  231. STORE *A = X; STORE *(A + 4) = Y;
  232. STORE *(A + 4) = Y; STORE *A = X;
  233. STORE {*A, *(A + 4) } = {X, Y};
  234. ๊ทธ๋ฆฌ๊ณ  ๋ณด์žฅ์‚ฌํ•ญ์— ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒƒ๋“ค(anti-guarantees)์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  235. (*) ์ด ๋ณด์žฅ์‚ฌํ•ญ๋“ค์€ bitfield ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋ฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์€ bitfield ๋ฅผ
  236. ์ˆ˜์ •ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์›์ž์„ฑ ์—†๋Š”(non-atomic) ์ฝ๊ณ -์ˆ˜์ •ํ•˜๊ณ -์“ฐ๋Š”
  237. ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์˜ ์กฐํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณ‘๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜
  238. ๋™๊ธฐํ™”์— bitfield ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  239. (*) bitfield ๋“ค์ด ์—ฌ๋Ÿฌ ๋ฝ์œผ๋กœ ๋ณดํ˜ธ๋˜๋Š” ๊ฒฝ์šฐ๋ผ ํ•˜๋”๋ผ๋„, ํ•˜๋‚˜์˜ bitfield ์˜
  240. ๋ชจ๋“  ํ•„๋“œ๋“ค์€ ํ•˜๋‚˜์˜ ๋ฝ์œผ๋กœ ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•œ bitfield ์˜ ๋‘
  241. ํ•„๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฝ์œผ๋กœ ๋ณดํ˜ธ๋œ๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์›์ž์„ฑ ์—†๋Š”
  242. ์ฝ๊ณ -์ˆ˜์ •ํ•˜๊ณ -์“ฐ๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์กฐํ•ฉ์€ ํ•œ ํ•„๋“œ์—์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ทผ์ฒ˜์˜
  243. ํ•„๋“œ์—๋„ ์˜ํ–ฅ์„ ๋ผ์น˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  244. (*) ์ด ๋ณด์žฅ์‚ฌํ•ญ๋“ค์€ ์ ์ ˆํ•˜๊ฒŒ ์ •๋ ฌ๋˜๊ณ  ํฌ๊ธฐ๊ฐ€ ์žกํžŒ ์Šค์นผ๋ผ ๋ณ€์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ
  245. ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. "์ ์ ˆํ•˜๊ฒŒ ํฌ๊ธฐ๊ฐ€ ์žกํžŒ" ์ด๋ผํ•จ์€ ํ˜„์žฌ๋กœ์จ๋Š” "char", "short",
  246. "int" ๊ทธ๋ฆฌ๊ณ  "long" ๊ณผ ๊ฐ™์€ ํฌ๊ธฐ์˜ ๋ณ€์ˆ˜๋“ค์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "์ ์ ˆํ•˜๊ฒŒ ์ •๋ ฌ๋œ"
  247. ์€ ์ž์—ฐ์Šค๋Ÿฐ ์ •๋ ฌ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ๋”ฐ๋ผ์„œ "char" ์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ฌด ์ œ์•ฝ์ด ์—†๊ณ ,
  248. "short" ์— ๋Œ€ํ•ด์„œ๋Š” 2๋ฐ”์ดํŠธ ์ •๋ ฌ์„, "int" ์—๋Š” 4๋ฐ”์ดํŠธ ์ •๋ ฌ์„, ๊ทธ๋ฆฌ๊ณ 
  249. "long" ์— ๋Œ€ํ•ด์„œ๋Š” 32-bit ์‹œ์Šคํ…œ์ธ์ง€ 64-bit ์‹œ์Šคํ…œ์ธ์ง€์— ๋”ฐ๋ผ 4๋ฐ”์ดํŠธ ๋˜๋Š”
  250. 8๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณด์žฅ์‚ฌํ•ญ๋“ค์€ C11 ํ‘œ์ค€์—์„œ ์†Œ๊ฐœ๋˜์—ˆ์œผ๋ฏ€๋กœ,
  251. C11 ์ „์˜ ์˜ค๋ž˜๋œ ์ปดํŒŒ์ผ๋Ÿฌ(์˜ˆ๋ฅผ ๋“ค์–ด, gcc 4.6) ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—” ์ฃผ์˜ํ•˜์‹œ๊ธฐ
  252. ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ‘œ์ค€์— ์ด ๋ณด์žฅ์‚ฌํ•ญ๋“ค์€ "memory location" ์„ ์ •์˜ํ•˜๋Š” 3.14
  253. ์„น์…˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:
  254. (์—ญ์ž: ์ธ์šฉ๋ฌธ์ด๋ฏ€๋กœ ๋ฒˆ์—ญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)
  255. memory location
  256. either an object of scalar type, or a maximal sequence
  257. of adjacent bit-fields all having nonzero width
  258. NOTE 1: Two threads of execution can update and access
  259. separate memory locations without interfering with
  260. each other.
  261. NOTE 2: A bit-field and an adjacent non-bit-field member
  262. are in separate memory locations. The same applies
  263. to two bit-fields, if one is declared inside a nested
  264. structure declaration and the other is not, or if the two
  265. are separated by a zero-length bit-field declaration,
  266. or if they are separated by a non-bit-field member
  267. declaration. It is not safe to concurrently update two
  268. bit-fields in the same structure if all members declared
  269. between them are also bit-fields, no matter what the
  270. sizes of those intervening bit-fields happen to be.
  271. =========================
  272. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
  273. =========================
  274. ์•ž์—์„œ ๋ดค๋“ฏ์ด, ์ƒํ˜ธ๊ฐ„ ์˜์กด์„ฑ์ด ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์‹ค์ œ๋กœ๋Š” ๋ฌด์ž‘์œ„์ 
  275. ์ˆœ์„œ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” CPU ์™€ CPU ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ I/O ์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜
  276. ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ์™€ CPU ๊ฐ€ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š”๋ฐ ์ œ์•ฝ์„ ๊ฑธ ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์ž…ํ• 
  277. ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  278. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๊ทธ๋Ÿฐ ๊ฐœ์ž… ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์ด์— ๋‘” ์•ž๊ณผ
  279. ๋’ค ์–‘์ธก์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค ๊ฐ„์— ๋ถ€๋ถ„์  ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜๋„๋ก ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์ค๋‹ˆ๋‹ค.
  280. ์‹œ์Šคํ…œ์˜ CPU ๋“ค๊ณผ ์—ฌ๋Ÿฌ ๋””๋ฐ”์ด์Šค๋“ค์€ ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ช…๋ น์–ด ์žฌ๋ฐฐ์น˜, ์‹คํ–‰
  281. ์œ ์˜ˆ, ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ์กฐํ•ฉ, ์˜ˆ์ธก์  ๋กœ๋“œ(speculative load), ๋ธŒ๋žœ์น˜
  282. ์˜ˆ์ธก(speculative branch prediction), ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์บ์‹ฑ(caching) ๋“ฑ์˜ ๋‹ค์–‘ํ•œ
  283. ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๊ฐ•์ œ๋ ฅ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ์ด๋Ÿฐ
  284. ํŠธ๋ฆญ๋“ค์„ ๋ฌดํšจ๋กœ ํ•˜๊ฑฐ๋‚˜ ์–ต์ œํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์ ธ์„œ ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ CPU ์™€
  285. ๋””๋ฐ”์ด์Šค๋“ค ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ •์ƒ์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  286. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์˜ ์ข…๋ฅ˜
  287. --------------------
  288. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋„ค๊ฐœ์˜ ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค:
  289. (1) ์“ฐ๊ธฐ (๋˜๋Š” ์Šคํ† ์–ด) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  290. ์“ฐ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์— ํ•ด๋‹น ๋ฐฐ๋ฆฌ์–ด๋ณด๋‹ค ์•ž์„œ
  291. ๋ช…์‹œ๋œ ๋ชจ๋“  STORE ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ํ•ด๋‹น ๋ฐฐ๋ฆฌ์–ด ๋’ค์— ๋ช…์‹œ๋œ ๋ชจ๋“  STORE
  292. ์˜คํผ๋ ˆ์ด์…˜๋“ค๋ณด๋‹ค ๋จผ์ € ์ˆ˜ํ–‰๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ผ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  293. ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์— ๋Œ€ํ•œ ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ์ž…๋‹ˆ๋‹ค; ๋กœ๋“œ
  294. ์˜คํผ๋ ˆ์ด์…˜๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  295. CPU ๋Š” ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ผ๋ จ์˜ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์„
  296. ํ•˜๋‚˜์”ฉ ์š”์ฒญํ•ด ์ง‘์–ด๋„ฃ์Šต๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ๋ชจ๋“  ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์€
  297. ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ๋ชจ๋“  ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค๋ณด๋‹ค _์•ž์„œ_ ์ˆ˜ํ–‰๋  ๊ฒ๋‹ˆ๋‹ค.
  298. [!] ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ์ฝ๊ธฐ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด์™€ ํ•จ๊ป˜ ์ง์„ ๋งž์ถฐ
  299. ์‚ฌ์šฉ๋˜์–ด์•ผ๋งŒ ํ•จ์„ ์•Œ์•„๋‘์„ธ์š”; "SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  300. (2) ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด.
  301. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด์˜ ๋ณด๋‹ค ์™„ํ™”๋œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๋‘๊ฐœ์˜ ๋กœ๋“œ
  302. ์˜คํผ๋ ˆ์ด์…˜์ด ์žˆ๊ณ  ๋‘๋ฒˆ์งธ ๊ฒƒ์ด ์ฒซ๋ฒˆ์งธ ๊ฒƒ์˜ ๊ฒฐ๊ณผ์— ์˜์กดํ•˜๊ณ  ์žˆ์„ ๋•Œ(์˜ˆ:
  303. ๋‘๋ฒˆ์งธ ๋กœ๋“œ๊ฐ€ ์ฐธ์กฐํ•  ์ฃผ์†Œ๋ฅผ ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ๊ฐ€ ์ฝ๋Š” ๊ฒฝ์šฐ), ๋‘๋ฒˆ์งธ ๋กœ๋“œ๊ฐ€ ์ฝ์–ด์˜ฌ
  304. ๋ฐ์ดํ„ฐ๋Š” ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ์— ์˜ํ•ด ๊ทธ ์ฃผ์†Œ๊ฐ€ ์–ป์–ด์ง€๊ธฐ ์ „์— ์—…๋ฐ์ดํŠธ ๋˜์–ด ์žˆ์Œ์„
  305. ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  306. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ƒํ˜ธ ์˜์กด์ ์ธ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค ์‚ฌ์ด์˜ ๋ถ€๋ถ„์  ์ˆœ์„œ
  307. ์„ธ์šฐ๊ธฐ์ž…๋‹ˆ๋‹ค; ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด๋‚˜ ๋…๋ฆฝ์ ์ธ ๋กœ๋“œ๋“ค, ๋˜๋Š” ์ค‘๋ณต๋˜๋Š”
  308. ๋กœ๋“œ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  309. (1) ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ์‹œ์Šคํ…œ์˜ CPU ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ผ๋ จ์˜ ์Šคํ† ์–ด
  310. ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ๋˜์ ธ ๋„ฃ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฑฐ๊ธฐ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋‹ค๋ฅธ CPU ๋Š” ๊ทธ
  311. ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ
  312. ๋‹ค๋ฅธ CPU ์˜ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜์˜ ๊ฒฐ๊ณผ์— ๊ด€์‹ฌ์„ ๋‘๊ณ  ์žˆ๋Š” CPU ๊ฐ€ ์ˆ˜ํ–‰ ์š”์ฒญํ•œ
  313. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š”, ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ์–ด๋–ค ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์ด ๋‹ค๋ฅธ CPU ์—์„œ
  314. ๋˜์ ธ ๋„ฃ์€ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๊ณผ ๊ฐ™์€ ์˜์—ญ์„ ํ–ฅํ–ˆ๋‹ค๋ฉด, ๊ทธ๋Ÿฐ ์Šคํ† ์–ด
  315. ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ๋กœ๋“œ
  316. ์˜คํผ๋ ˆ์ด์…˜๋“ค์—๊ฒŒ๋Š” ๋ณด์ผ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  317. ์ด ์ˆœ์„œ ์„ธ์šฐ๊ธฐ ์ œ์•ฝ์— ๋Œ€ํ•œ ๊ทธ๋ฆผ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„  "๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์‹œํ€€์Šค์˜ ์˜ˆ"
  318. ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  319. [!] ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ _๋ฐ์ดํ„ฐ_ ์˜์กด์„ฑ์„ ๊ฐ€์ ธ์•ผ์ง€ ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ๊ฐ€์ ธ์•ผ
  320. ํ•˜๋Š”๊ฒŒ ์•„๋‹˜์„ ์•Œ์•„๋‘์‹ญ์‹œ์˜ค. ๋งŒ์•ฝ ๋‘๋ฒˆ์งธ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์ฃผ์†Œ๊ฐ€ ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ์—
  321. ์˜์กด์ ์ด์ง€๋งŒ ๊ทธ ์˜์กด์„ฑ์€ ์กฐ๊ฑด์ ์ด์ง€ ๊ทธ ์ฃผ์†Œ ์ž์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด,
  322. ๊ทธ๊ฒƒ์€ _์ปจํŠธ๋กค_ ์˜์กด์„ฑ์ด๊ณ , ์ด ๊ฒฝ์šฐ์—๋Š” ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ๊ทธ๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ
  323. ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์œ„ํ•ด์„œ๋Š” "์ปจํŠธ๋กค ์˜์กด์„ฑ" ์„œ๋ธŒ์„น์…˜์„
  324. ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  325. [!] ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ณดํ†ต ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ ํ•จ๊ป˜ ์ง์„ ๋งž์ถฐ ์‚ฌ์šฉ๋˜์–ด์•ผ
  326. ํ•ฉ๋‹ˆ๋‹ค; "SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  327. (3) ์ฝ๊ธฐ (๋˜๋Š” ๋กœ๋“œ) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  328. ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด ๊ธฐ๋Šฅ์˜ ๋ณด์žฅ์‚ฌํ•ญ์— ๋”ํ•ด์„œ ๋ฐฐ๋ฆฌ์–ด๋ณด๋‹ค
  329. ์•ž์„œ ๋ช…์‹œ๋œ ๋ชจ๋“  LOAD ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ๋ฐฐ๋ฆฌ์–ด ๋’ค์— ๋ช…์‹œ๋˜๋Š” ๋ชจ๋“  LOAD
  330. ์˜คํผ๋ ˆ์ด์…˜๋“ค๋ณด๋‹ค ๋จผ์ € ํ–‰ํ•ด์ง„ ๊ฒƒ์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์— ๋ณด์—ฌ์งˆ ๊ฒƒ์„
  331. ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  332. ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์— ํ–‰ํ•ด์ง€๋Š” ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ์ž…๋‹ˆ๋‹ค; ์Šคํ† ์–ด
  333. ์˜คํผ๋ ˆ์ด์…˜์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  334. ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ด์žฅํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ
  335. ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  336. [!] ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ ํ•จ๊ป˜ ์ง์„ ๋งž์ถฐ ์‚ฌ์šฉ๋˜์–ด์•ผ
  337. ํ•ฉ๋‹ˆ๋‹ค; "SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  338. (4) ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  339. ๋ฒ”์šฉ(general) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐฐ๋ฆฌ์–ด๋ณด๋‹ค ์•ž์„œ ๋ช…์‹œ๋œ ๋ชจ๋“  LOAD ์™€ STORE
  340. ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ๋ฐฐ๋ฆฌ์–ด ๋’ค์— ๋ช…์‹œ๋œ ๋ชจ๋“  LOAD ์™€ STORE ์˜คํผ๋ ˆ์ด์…˜๋“ค๋ณด๋‹ค
  341. ๋จผ์ € ์ˆ˜ํ–‰๋œ ๊ฒƒ์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ์ปดํฌ๋„ŒํŠธ๋“ค์— ๋ณด์ด๊ฒŒ ๋จ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  342. ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋กœ๋“œ์™€ ์Šคํ† ์–ด ๋ชจ๋‘์— ๋Œ€ํ•œ ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ์ž…๋‹ˆ๋‹ค.
  343. ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด, ์“ฐ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋ชจ๋‘๋ฅผ
  344. ๋‚ด์žฅํ•˜๋ฏ€๋กœ, ๋‘ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋ชจ๋‘ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  345. ๊ทธ๋ฆฌ๊ณ  ๋‘๊ฐœ์˜ ๋ช…์‹œ์ ์ด์ง€ ์•Š์€ ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  346. (5) ACQUIRE ์˜คํผ๋ ˆ์ด์…˜.
  347. ์ด ํƒ€์ž…์˜ ์˜คํผ๋ ˆ์ด์…˜์€ ๋‹จ๋ฐฉํ–ฅ์˜ ํˆฌ๊ณผ์„ฑ ๋ฐฐ๋ฆฌ์–ด์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ACQUIRE
  348. ์˜คํผ๋ ˆ์ด์…˜ ๋’ค์˜ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ACQUIRE ์˜คํผ๋ ˆ์ด์…˜ ํ›„์—
  349. ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ์ปดํฌ๋„ŒํŠธ๋“ค์— ๋ณด์ด๊ฒŒ ๋  ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  350. LOCK ์˜คํผ๋ ˆ์ด์…˜๊ณผ smp_load_acquire(), smp_cond_acquire() ์˜คํผ๋ ˆ์ด์…˜๋„
  351. ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. smp_cond_acquire() ์˜คํผ๋ ˆ์ด์…˜์€ ์ปจํŠธ๋กค
  352. ์˜์กด์„ฑ๊ณผ smp_rmb() ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ACQUIRE ์˜ ์˜๋ฏธ์  ์š”๊ตฌ์‚ฌํ•ญ(semantic)์„
  353. ์ถฉ์กฑ์‹œํ‚ต๋‹ˆ๋‹ค.
  354. ACQUIRE ์˜คํผ๋ ˆ์ด์…˜ ์•ž์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ACQUIRE ์˜คํผ๋ ˆ์ด์…˜ ์™„๋ฃŒ ํ›„์—
  355. ์ˆ˜ํ–‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  356. ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์€ ๊ฑฐ์˜ ํ•ญ์ƒ RELEASE ์˜คํผ๋ ˆ์ด์…˜๊ณผ ์ง์„ ์ง€์–ด ์‚ฌ์šฉ๋˜์–ด์•ผ
  357. ํ•ฉ๋‹ˆ๋‹ค.
  358. (6) RELEASE ์˜คํผ๋ ˆ์ด์…˜.
  359. ์ด ํƒ€์ž…์˜ ์˜คํผ๋ ˆ์ด์…˜๋“ค๋„ ๋‹จ๋ฐฉํ–ฅ ํˆฌ๊ณผ์„ฑ ๋ฐฐ๋ฆฌ์–ด์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. RELEASE
  360. ์˜คํผ๋ ˆ์ด์…˜ ์•ž์˜ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ RELEASE ์˜คํผ๋ ˆ์ด์…˜ ์ „์— ์™„๋ฃŒ๋œ
  361. ๊ฒƒ์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์— ๋ณด์—ฌ์งˆ ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. UNLOCK ๋ฅ˜์˜
  362. ์˜คํผ๋ ˆ์ด์…˜๋“ค๊ณผ smp_store_release() ์˜คํผ๋ ˆ์ด์…˜๋„ RELEASE ์˜คํผ๋ ˆ์ด์…˜์˜
  363. ์ผ์ข…์ž…๋‹ˆ๋‹ค.
  364. RELEASE ์˜คํผ๋ ˆ์ด์…˜ ๋’ค์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ RELEASE ์˜คํผ๋ ˆ์ด์…˜์ด
  365. ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ํ–‰ํ•ด์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  366. ACQUIRE ์™€ RELEASE ์˜คํผ๋ ˆ์ด์…˜์˜ ์‚ฌ์šฉ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์˜
  367. ํ•„์š”์„ฑ์„ ์—†์•ฑ๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ "MMIO ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด" ์„œ๋ธŒ์„น์…˜์—์„œ ์„ค๋ช…๋˜๋Š” ์˜ˆ์™ธ๋ฅผ
  368. ์•Œ์•„๋‘์„ธ์š”). ๋˜ํ•œ, RELEASE+ACQUIRE ์กฐํ•ฉ์€ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์ฒ˜๋Ÿผ ๋™์ž‘ํ• 
  369. ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-. ํ•˜์ง€๋งŒ, ์–ด๋–ค ๋ณ€์ˆ˜์— ๋Œ€ํ•œ RELEASE ์˜คํผ๋ ˆ์ด์…˜์„
  370. ์•ž์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” ์ด RELEASE ์˜คํผ๋ ˆ์ด์…˜์„ ๋’ค์ด์–ด ๊ฐ™์€
  371. ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋œ ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์„ ๋’ค๋”ฐ๋ฅด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค์—๋Š” ๋ณด์—ฌ์งˆ
  372. ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜์ž๋ฉด, ์ฃผ์–ด์ง„ ๋ณ€์ˆ˜์˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜์—์„œ๋Š”, ํ•ด๋‹น
  373. ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์•ž์˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜์—์„œ์˜ ๋ชจ๋“  ์•ก์„ธ์Šค๋“ค์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๊ฒƒ์„
  374. ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  375. ์ฆ‰, ACQUIRE ๋Š” ์ตœ์†Œํ•œ์˜ "์ทจ๋“" ๋™์ž‘์ฒ˜๋Ÿผ, ๊ทธ๋ฆฌ๊ณ  RELEASE ๋Š” ์ตœ์†Œํ•œ์˜ "๊ณต๊ฐœ"
  376. ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  377. atomic_ops.txt ์—์„œ ์„ค๋ช…๋˜๋Š” ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜๋“ค ์ค‘์—๋Š” ์™„์ „ํžˆ ์ˆœ์„œ์žกํžŒ ๊ฒƒ๋“ค๊ณผ
  378. (๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”) ์™„ํ™”๋œ ์ˆœ์„œ์˜ ๊ฒƒ๋“ค ์™ธ์— ACQUIRE ์™€ RELEASE ๋ถ€๋ฅ˜์˜
  379. ๊ฒƒ๋“ค๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋Š” ์กฐํ•ฉ๋œ ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜์—์„œ,
  380. ACQUIRE ๋Š” ํ•ด๋‹น ์˜คํผ๋ ˆ์ด์…˜์˜ ๋กœ๋“œ ๋ถ€๋ถ„์—๋งŒ ์ ์šฉ๋˜๊ณ  RELEASE ๋Š” ํ•ด๋‹น
  381. ์˜คํผ๋ ˆ์ด์…˜์˜ ์Šคํ† ์–ด ๋ถ€๋ถ„์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  382. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ๋‘ CPU ๊ฐ„, ๋˜๋Š” CPU ์™€ ๋””๋ฐ”์ด์Šค ๊ฐ„์— ์ƒํ˜ธ์ž‘์šฉ์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„
  383. ๋•Œ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์–ด๋–ค ์ฝ”๋“œ์— ๊ทธ๋Ÿฐ ์ƒํ˜ธ์ž‘์šฉ์ด ์—†์„ ๊ฒƒ์ด ๋ณด์žฅ๋œ๋‹ค๋ฉด, ํ•ด๋‹น
  384. ์ฝ”๋“œ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  385. ์ด๊ฒƒ๋“ค์€ _์ตœ์†Œํ•œ์˜_ ๋ณด์žฅ์‚ฌํ•ญ๋“ค์ž„์„ ์•Œ์•„๋‘์„ธ์š”. ๋‹ค๋ฅธ ์•„ํ‚คํ…์ณ์—์„œ๋Š” ๋” ๊ฐ•๋ ฅํ•œ
  386. ๋ณด์žฅ์‚ฌํ•ญ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ๊ทธ๋Ÿฐ ๋ณด์žฅ์‚ฌํ•ญ์€ ์•„ํ‚คํ…์ณ ์ข…์†์  ์ฝ”๋“œ ์ด์™ธ์˜
  387. ๋ถ€๋ถ„์—์„œ๋Š” ์‹ ๋ขฐ๋˜์ง€ _์•Š์„_ ๊ฒ๋‹ˆ๋‹ค.
  388. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์— ๋Œ€ํ•ด ๊ฐ€์ •ํ•ด์„  ์•ˆ๋  ๊ฒƒ
  389. -------------------------------------
  390. ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์ด ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  391. (*) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์•ž์—์„œ ๋ช…์‹œ๋œ ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋ช…๋ น์˜ ์ˆ˜ํ–‰
  392. ์™„๋ฃŒ ์‹œ์ ๊นŒ์ง€ _์™„๋ฃŒ_ ๋  ๊ฒƒ์ด๋ž€ ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค; ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•˜๋Š” ์ผ์€ CPU ์˜
  393. ์•ก์„ธ์Šค ํ์— ํŠน์ • ํƒ€์ž…์˜ ์•ก์„ธ์Šค๋“ค์€ ๋„˜์„ ์ˆ˜ ์—†๋Š” ์„ ์„ ๊ธ‹๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋  ์ˆ˜
  394. ์žˆ์Šต๋‹ˆ๋‹ค.
  395. (*) ํ•œ CPU ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๊ฒŒ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ CPU ๋‚˜ ํ•˜๋“œ์›จ์–ด์—
  396. ์–ด๋–ค ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค๋Š” ๋ณด์žฅ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ๋ฆฌ์–ด ์ˆ˜ํ–‰์ด
  397. ๋งŒ๋“œ๋Š” ๊ฐ„์ ‘์  ์˜ํ–ฅ์€ ๋‘๋ฒˆ์งธ CPU ๊ฐ€ ์ฒซ๋ฒˆ์งธ CPU ์˜ ์•ก์„ธ์Šค๋“ค์˜ ๊ฒฐ๊ณผ๋ฅผ
  398. ๋ฐ”๋ผ๋ณด๋Š” ์ˆœ์„œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค๋งŒ, ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋ณด์„ธ์š”:
  399. (*) ์ฒซ๋ฒˆ์งธ CPU ๊ฐ€ ๋‘๋ฒˆ์งธ CPU ์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋ผ๋ณผ ๋•Œ, _์„ค๋ น_
  400. ๋‘๋ฒˆ์งธ CPU ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค ํ•ด๋„, ์ฒซ๋ฒˆ์งธ CPU _๋˜ํ•œ_ ๊ทธ์— ๋งž๋Š”
  401. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ("SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ" ์„œ๋ธŒ์„น์…˜์„
  402. ์ฐธ๊ณ ํ•˜์„ธ์š”) ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ๋ณด์—ฌ์ง„๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
  403. (*) CPU ๋ฐ”๊นฅ์˜ ํ•˜๋“œ์›จ์–ด[*] ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ณด์žฅ์€
  404. ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CPU ์บ์‹œ ์ผ๊ด€์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์˜ ๊ฐ„์ ‘์ 
  405. ์˜ํ–ฅ์„ CPU ์‚ฌ์ด์— ์ „ํŒŒํ•˜๊ธด ํ•˜์ง€๋งŒ, ์ˆœ์„œ๋Œ€๋กœ ์ „ํŒŒํ•˜์ง€๋Š” ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  406. [*] ๋ฒ„์Šค ๋งˆ์Šคํ„ฐ๋ง DMA ์™€ ์ผ๊ด€์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค:
  407. Documentation/PCI/pci.txt
  408. Documentation/DMA-API-HOWTO.txt
  409. Documentation/DMA-API.txt
  410. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด
  411. --------------------
  412. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด์˜ ์‚ฌ์šฉ์— ์žˆ์–ด ์ง€์ผœ์•ผ ํ•˜๋Š” ์‚ฌํ•ญ๋“ค์€ ์•ฝ๊ฐ„ ๋ฏธ๋ฌ˜ํ•˜๊ณ , ๋ฐ์ดํ„ฐ
  413. ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ๋„ ํ•ญ์ƒ ๋ช…๋ฐฑํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์„ค๋ช…์„ ์œ„ํ•ด
  414. ๋‹ค์Œ์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  415. CPU 1 CPU 2
  416. =============== ===============
  417. { A == 1, B == 2, C == 3, P == &A, Q == &C }
  418. B = 4;
  419. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  420. WRITE_ONCE(P, &B)
  421. Q = READ_ONCE(P);
  422. D = *Q;
  423. ์—ฌ๊ธฐ์—” ๋ถ„๋ช…ํ•œ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋ฏ€๋กœ, ์ด ์‹œํ€€์Šค๊ฐ€ ๋๋‚ฌ์„ ๋•Œ Q ๋Š” &A ๋˜๋Š” &B
  424. ์ผ ๊ฒƒ์ด๊ณ , ๋”ฐ๋ผ์„œ:
  425. (Q == &A) ๋Š” (D == 1) ๋ฅผ,
  426. (Q == &B) ๋Š” (D == 4) ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  427. ํ•˜์ง€๋งŒ! CPU 2 ๋Š” B ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ธ์‹ํ•˜๊ธฐ ์ „์— P ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ณ ,
  428. ๋”ฐ๋ผ์„œ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  429. (Q == &B) and (D == 2) ????
  430. ์ด๋Ÿฐ ๊ฒฐ๊ณผ๋Š” ์ผ๊ด€์„ฑ์ด๋‚˜ ์ธ๊ณผ ๊ด€๊ณ„ ์œ ์ง€๊ฐ€ ์‹คํŒจํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ,
  431. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์ด ํ˜„์ƒ์€ (DEC Alpha ์™€ ๊ฐ™์€) ์—ฌ๋Ÿฌ CPU ์—์„œ ์‹ค์ œ๋กœ
  432. ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  433. ์ด ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ œ๋Œ€๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ๊ทธ๋ณด๋‹ค ๊ฐ•ํ™”๋œ
  434. ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ฃผ์†Œ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ ์‚ฌ์ด์— ์ถ”๊ฐ€๋˜์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค:
  435. CPU 1 CPU 2
  436. =============== ===============
  437. { A == 1, B == 2, C == 3, P == &A, Q == &C }
  438. B = 4;
  439. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  440. WRITE_ONCE(P, &B);
  441. Q = READ_ONCE(P);
  442. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด>
  443. D = *Q;
  444. ์ด ๋ณ€๊ฒฝ์€ ์•ž์˜ ์ฒ˜์Œ ๋‘๊ฐ€์ง€ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋งŒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ์„ธ๋ฒˆ์งธ์˜ ๊ฒฐ๊ณผ๋Š”
  445. ๋ฐœ์ƒํ•  ์ˆ˜ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  446. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ์˜์กด์  ์“ฐ๊ธฐ์— ๋Œ€ํ•ด์„œ๋„ ์ˆœ์„œ๋ฅผ ์žก์•„์ค๋‹ˆ๋‹ค:
  447. CPU 1 CPU 2
  448. =============== ===============
  449. { A == 1, B == 2, C = 3, P == &A, Q == &C }
  450. B = 4;
  451. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  452. WRITE_ONCE(P, &B);
  453. Q = READ_ONCE(P);
  454. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด>
  455. *Q = 5;
  456. ์ด ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” Q ๋กœ์˜ ์ฝ๊ธฐ๊ฐ€ *Q ๋กœ์˜ ์Šคํ† ์–ด์™€ ์ˆœ์„œ๋ฅผ ๋งž์ถ”๊ฒŒ
  457. ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค:
  458. (Q == &B) && (B == 4)
  459. ์ด๋Ÿฐ ํŒจํ„ด์€ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•จ์„ ์•Œ์•„ ๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค๋„, ์˜์กด์„ฑ
  460. ์ˆœ์„œ ๊ทœ์น™์˜ ์˜๋„๋Š” ์“ฐ๊ธฐ ์ž‘์—…์„ -์˜ˆ๋ฐฉ- ํ•ด์„œ ๊ทธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋น„์‹ผ ์บ์‹œ ๋ฏธ์Šค๋„
  461. ์—†์• ๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ ์กฐ๊ฑด ๊ฐ™์€๊ฒƒ๋“ค์„ ๊ธฐ๋กํ•˜๋Š”๋ฐ
  462. ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ณ , ์ด๋ ‡๊ฒŒ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๊ฒŒ ํ•จ์œผ๋กœ์จ ๊ทธ๋Ÿฐ ๊ธฐ๋ก์ด
  463. ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
  464. [!] ์ƒ๋‹นํžˆ ๋น„์ง๊ด€์ ์ธ ์ด ์ƒํ™ฉ์€ ๋ถ„๋ฆฌ๋œ ์บ์‹œ๋ฅผ ๊ฐ€์ง„ ๊ธฐ๊ณ„, ์˜ˆ๋ฅผ ๋“ค์–ด ํ•œ ์บ์‹œ
  465. ๋ฑ…ํฌ๊ฐ€ ์ง์ˆ˜๋ฒˆ ์บ์‹œ ๋ผ์ธ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฑ…ํฌ๋Š” ํ™€์ˆ˜๋ฒˆ ์บ์‹œ ๋ผ์ธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๊ณ„
  466. ๋“ฑ์—์„œ ๊ฐ€์žฅ ์ž˜ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ P ๋Š” ํ™€์ˆ˜ ๋ฒˆํ˜ธ์˜ ์บ์‹œ ๋ผ์ธ์— ์žˆ๊ณ , ๋ณ€์ˆ˜ B ๋Š”
  467. ์ง์ˆ˜ ๋ฒˆํ˜ธ ์บ์‹œ ๋ผ์ธ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค. ๊ทธ๋Ÿฐ ์ƒํƒœ์—์„œ ์ฝ๊ธฐ ์ž‘์—…์„ ํ•˜๋Š” CPU
  468. ์˜ ์ง์ˆ˜๋ฒˆ ๋ฑ…ํฌ๋Š” ํ•  ์ผ์ด ์Œ“์—ฌ ๋งค์šฐ ๋ฐ”์˜์ง€๋งŒ ํ™€์ˆ˜๋ฒˆ ๋ฑ…ํฌ๋Š” ํ•  ์ผ์ด ์—†์–ด ์•„๋ฌด
  469. ์ผ๋„ ํ•˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด, ํฌ์ธํ„ฐ P ๋Š” ์ƒˆ ๊ฐ’ (&B) ์„, ๊ทธ๋ฆฌ๊ณ  ๋ณ€์ˆ˜ B ๋Š” ์˜›๋‚  ๊ฐ’
  470. (2) ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋ณด์—ฌ์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  471. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด RCU ์‹œ์Šคํ…œ์—์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
  472. include/linux/rcupdate.h ์˜ rcu_assign_pointer() ์™€ rcu_dereference() ๋ฅผ
  473. ์ฐธ๊ณ ํ•˜์„ธ์š”. ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” RCU ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ํฌ์ธํ„ฐ์˜ ํƒ€๊ฒŸ์„ ํ˜„์žฌ
  474. ํƒ€๊ฒŸ์—์„œ ์ˆ˜์ •๋œ ์ƒˆ๋กœ์šด ํƒ€๊ฒŸ์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ž‘์—…์—์„œ ์ƒˆ๋กœ ์ˆ˜์ •๋œ ํƒ€๊ฒŸ์ด ์ดˆ๊ธฐํ™”๊ฐ€
  475. ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ฑ„๋กœ ๋ณด์—ฌ์ง€๋Š” ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  476. ๋” ๋งŽ์€ ์˜ˆ๋ฅผ ์œ„ํ•ด์„  "์บ์‹œ ์ผ๊ด€์„ฑ" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  477. ์ปจํŠธ๋กค ์˜์กด์„ฑ
  478. -------------
  479. ๋กœ๋“œ-๋กœ๋“œ ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋งŒ์œผ๋กœ๋Š” ์ •ํ™•ํžˆ ๋™์ž‘ํ•  ์ˆ˜๊ฐ€
  480. ์—†์–ด์„œ ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ด…์‹œ๋‹ค:
  481. q = READ_ONCE(a);
  482. if (q) {
  483. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด> /* BUG: No data dependency!!! */
  484. p = READ_ONCE(b);
  485. }
  486. ์ด ์ฝ”๋“œ๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ์˜ ํšจ๊ณผ๋ฅผ ๋‚ด์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ์ฝ”๋“œ์—๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด
  487. ์•„๋‹ˆ๋ผ ์ปจํŠธ๋กค ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์œผ๋กœ, ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ CPU ๋Š” ์‹คํ–‰ ์†๋„๋ฅผ ๋”
  488. ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๊ธฐ ์กฐ๊ฑด์˜ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋‹ค๋ฅธ
  489. CPU ๋Š” b ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์ด a ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋ณด๋‹ค ๋จผ์ € ๋ฐœ์ƒํ•œ
  490. ๊ฑธ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ •๋ง๋กœ ํ•„์š”ํ–ˆ๋˜ ๊ฑด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  491. q = READ_ONCE(a);
  492. if (q) {
  493. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  494. p = READ_ONCE(b);
  495. }
  496. ํ•˜์ง€๋งŒ, ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜์€ ์˜ˆ์ธก์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ ์˜ˆ์—์„œ์™€
  497. ๊ฐ™์ด ๋กœ๋“œ-์Šคํ† ์–ด ์ปจํŠธ๋กค ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ˆœ์„œ๊ฐ€ -์ง€์ผœ์ง„๋‹ค-๋Š”
  498. ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  499. q = READ_ONCE(a);
  500. if (q) {
  501. WRITE_ONCE(b, p);
  502. }
  503. ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ๋ณดํ†ต ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ ์ง์„ ๋งž์ถฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณค
  504. ํ•˜๋‚˜, READ_ONCE() ๋Š” ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ๋ถ€๋”” ๋ช…์‹ฌํ•˜์„ธ์š”! READ_ONCE() ๊ฐ€
  505. ์—†๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 'a' ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๋ฅผ 'a' ๋กœ๋ถ€ํ„ฐ์˜ ๋˜๋‹ค๋ฅธ ๋กœ๋“œ์™€, 'b' ๋กœ์˜
  506. ์Šคํ† ์–ด๋ฅผ 'b' ๋กœ์˜ ๋˜๋‹ค๋ฅธ ์Šคํ† ์–ด์™€ ์กฐํ•ฉํ•ด ๋ฒ„๋ ค ๋งค์šฐ ๋น„์ง๊ด€์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜
  507. ์žˆ์Šต๋‹ˆ๋‹ค.
  508. ์ด๊ฑธ๋กœ ๋์ด ์•„๋‹Œ๊ฒŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณ€์ˆ˜ 'a' ์˜ ๊ฐ’์ด ํ•ญ์ƒ 0์ด ์•„๋‹ˆ๋ผ๊ณ  ์ฆ๋ช…ํ•  ์ˆ˜
  509. ์žˆ๋‹ค๋ฉด, ์•ž์˜ ์˜ˆ์—์„œ "if" ๋ฌธ์„ ์—†์• ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ตœ์ ํ™” ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  510. q = a;
  511. b = p; /* BUG: Compiler and CPU can both reorder!!! */
  512. ๊ทธ๋Ÿฌ๋‹ˆ READ_ONCE() ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•˜์„ธ์š”.
  513. ๋‹ค์Œ๊ณผ ๊ฐ™์ด "if" ๋ฌธ์˜ ์–‘๊ฐˆ๋ž˜ ๋ธŒ๋žœ์น˜์— ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๋™์ผํ•œ ์Šคํ† ์–ด์— ๋Œ€ํ•ด ์ˆœ์„œ๋ฅผ
  514. ๊ฐ•์ œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  515. q = READ_ONCE(a);
  516. if (q) {
  517. barrier();
  518. WRITE_ONCE(b, p);
  519. do_something();
  520. } else {
  521. barrier();
  522. WRITE_ONCE(b, p);
  523. do_something_else();
  524. }
  525. ์•ˆํƒ€๊น๊ฒŒ๋„, ํ˜„์žฌ์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์€ ๋†’์€ ์ตœ์ ํ™” ๋ ˆ๋ฒจ์—์„œ๋Š” ์ด๊ฑธ ๋‹ค์Œ๊ณผ ๊ฐ™์ด
  526. ๋ฐ”๊ฟ”๋ฒ„๋ฆฝ๋‹ˆ๋‹ค:
  527. q = READ_ONCE(a);
  528. barrier();
  529. WRITE_ONCE(b, p); /* BUG: No ordering vs. load from a!!! */
  530. if (q) {
  531. /* WRITE_ONCE(b, p); -- moved up, BUG!!! */
  532. do_something();
  533. } else {
  534. /* WRITE_ONCE(b, p); -- moved up, BUG!!! */
  535. do_something_else();
  536. }
  537. ์ด์ œ 'a' ์—์„œ์˜ ๋กœ๋“œ์™€ 'b' ๋กœ์˜ ์Šคํ† ์–ด ์‚ฌ์ด์—๋Š” ์กฐ๊ฑด์  ๊ด€๊ณ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— CPU
  538. ๋Š” ์ด๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค: ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์กฐ๊ฑด์  ๊ด€๊ณ„๋Š” ๋ฐ˜๋“œ์‹œ
  539. ํ•„์š”ํ•œ๋ฐ, ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ๋‚œ ํ›„์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์—์„œ๋„
  540. ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด ์˜ˆ์—์„œ ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” smp_store_release()
  541. ์™€ ๊ฐ™์€ ๋ช…์‹œ์  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:
  542. q = READ_ONCE(a);
  543. if (q) {
  544. smp_store_release(&b, p);
  545. do_something();
  546. } else {
  547. smp_store_release(&b, p);
  548. do_something_else();
  549. }
  550. ๋ฐ˜๋ฉด์— ๋ช…์‹œ์  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์—†๋‹ค๋ฉด, ์ด๋Ÿฐ ๊ฒฝ์šฐ์˜ ์ˆœ์„œ๋Š” ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด
  551. ์„œ๋กœ ๋‹ค๋ฅผ ๋•Œ์—๋งŒ ๋ณด์žฅ๋˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค:
  552. q = READ_ONCE(a);
  553. if (q) {
  554. WRITE_ONCE(b, p);
  555. do_something();
  556. } else {
  557. WRITE_ONCE(b, r);
  558. do_something_else();
  559. }
  560. ์ฒ˜์Œ์˜ READ_ONCE() ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 'a' ์˜ ๊ฐ’์„ ์ฆ๋ช…ํ•ด๋‚ด๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ
  561. ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  562. ๋˜ํ•œ, ๋กœ์ปฌ ๋ณ€์ˆ˜ 'q' ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด
  563. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ ๊ฐ’์„ ์ถ”์ธกํ•˜๊ณ  ๋˜๋‹ค์‹œ ํ•„์š”ํ•œ ์กฐ๊ฑด๊ด€๊ณ„๋ฅผ ์—†์• ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  564. ์˜ˆ๋ฅผ ๋“ค๋ฉด:
  565. q = READ_ONCE(a);
  566. if (q % MAX) {
  567. WRITE_ONCE(b, p);
  568. do_something();
  569. } else {
  570. WRITE_ONCE(b, r);
  571. do_something_else();
  572. }
  573. ๋งŒ์•ฝ MAX ๊ฐ€ 1 ๋กœ ์ •์˜๋œ ์ƒ์ˆ˜๋ผ๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” (q % MAX) ๋Š” 0์ด๋ž€ ๊ฒƒ์„ ์•Œ์•„์ฑ„๊ณ ,
  574. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ”๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  575. q = READ_ONCE(a);
  576. WRITE_ONCE(b, p);
  577. do_something_else();
  578. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, CPU ๋Š” ๋ณ€์ˆ˜ 'a' ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ์™€ ๋ณ€์ˆ˜ 'b' ๋กœ์˜ ์Šคํ† ์–ด ์‚ฌ์ด์˜ ์ˆœ์„œ๋ฅผ
  579. ์ง€์ผœ์ค„ ํ•„์š”๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค. barrier() ๋ฅผ ์ถ”๊ฐ€ํ•ด ํ•ด๊ฒฐํ•ด ๋ณด๊ณ  ์‹ถ๊ฒ ์ง€๋งŒ, ๊ทธ๊ฑด
  580. ๋„์›€์ด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด ๊ด€๊ณ„๋Š” ์‚ฌ๋ผ์กŒ๊ณ , barrier() ๋Š” ์ด๋ฅผ ๋˜๋Œ๋ฆฌ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  581. ๋”ฐ๋ผ์„œ, ์ด ์ˆœ์„œ๋ฅผ ์ง€์ผœ์•ผ ํ•œ๋‹ค๋ฉด, MAX ๊ฐ€ 1 ๋ณด๋‹ค ํฌ๋‹ค๋Š” ๊ฒƒ์„, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„
  582. ์‚ฌ์šฉํ•ด ๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  583. q = READ_ONCE(a);
  584. BUILD_BUG_ON(MAX <= 1); /* Order load from a with store to b. */
  585. if (q % MAX) {
  586. WRITE_ONCE(b, p);
  587. do_something();
  588. } else {
  589. WRITE_ONCE(b, r);
  590. do_something_else();
  591. }
  592. 'b' ๋กœ์˜ ์Šคํ† ์–ด๋“ค์€ ์—ฌ์ „ํžˆ ์„œ๋กœ ๋‹ค๋ฆ„์„ ์•Œ์•„๋‘์„ธ์š”. ๋งŒ์•ฝ ๊ทธ๊ฒƒ๋“ค์ด ๋™์ผํ•˜๋ฉด,
  593. ์•ž์—์„œ ์ด์•ผ๊ธฐํ–ˆ๋“ฏ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ 'if' ๋ฌธ ๋ฐ”๊นฅ์œผ๋กœ
  594. ๋„์ง‘์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  595. ๋˜ํ•œ ์ด์ง„ ์กฐ๊ฑด๋ฌธ ํ‰๊ฐ€์— ๋„ˆ๋ฌด ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์กฐ์‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ์˜ˆ๋ฅผ
  596. ๋ด…์‹œ๋‹ค:
  597. q = READ_ONCE(a);
  598. if (q || 1 > 0)
  599. WRITE_ONCE(b, 1);
  600. ์ฒซ๋ฒˆ์งธ ์กฐ๊ฑด๋งŒ์œผ๋กœ๋Š” ๋ธŒ๋žœ์น˜ ์กฐ๊ฑด ์ „์ฒด๋ฅผ ๊ฑฐ์ง“์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๊ณ  ๋‘๋ฒˆ์งธ ์กฐ๊ฑด์€ ํ•ญ์ƒ
  601. ์ฐธ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ์˜ˆ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ”์„œ ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ์—†์• ๋ฒ„๋ฆด
  602. ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  603. q = READ_ONCE(a);
  604. WRITE_ONCE(b, 1);
  605. ์ด ์˜ˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ถ”์ธก์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก ๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„
  606. ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•ด์„œ, READ_ONCE() ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ฃผ์–ด์ง„ ๋กœ๋“œ
  607. ์˜คํผ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ •๋ง๋กœ ๋งŒ๋“ค๋„๋ก ํ•˜์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„
  608. ์ฝ”๋“œ์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  609. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ์ดํ–‰์„ฑ (transitivity) ์„ ์ œ๊ณตํ•˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-. ์ด๊ฑด
  610. x ์™€ y ๊ฐ€ ๋‘˜ ๋‹ค 0 ์ด๋ผ๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์กŒ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์˜ ๋‘๊ฐœ์˜ ์˜ˆ์ œ๋กœ
  611. ๋ณด์ด๊ฒ ์Šต๋‹ˆ๋‹ค:
  612. CPU 0 CPU 1
  613. ======================= =======================
  614. r1 = READ_ONCE(x); r2 = READ_ONCE(y);
  615. if (r1 > 0) if (r2 > 0)
  616. WRITE_ONCE(y, 1); WRITE_ONCE(x, 1);
  617. assert(!(r1 == 1 && r2 == 1));
  618. ์ด ๋‘ CPU ์˜ˆ์ œ์—์„œ assert() ์˜ ์กฐ๊ฑด์€ ํ•ญ์ƒ ์ฐธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ๋งŒ์•ฝ ์ปจํŠธ๋กค
  619. ์˜์กด์„ฑ์ด ์ดํ–‰์„ฑ์„ (์‹ค์ œ๋กœ๋Š” ๊ทธ๋Ÿฌ์ง€ ์•Š์ง€๋งŒ) ๋ณด์žฅํ•œ๋‹ค๋ฉด, ๋‹ค์Œ์˜ CPU ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด๋„
  620. ์•„๋ž˜์˜ assert() ์กฐ๊ฑด์€ ์ฐธ์ด ๋ ๊ฒƒ์ž…๋‹ˆ๋‹ค:
  621. CPU 2
  622. =====================
  623. WRITE_ONCE(x, 2);
  624. assert(!(r1 == 2 && r2 == 1 && x == 2)); /* FAILS!!! */
  625. ํ•˜์ง€๋งŒ ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ์ดํ–‰์„ฑ์„ ์ œ๊ณตํ•˜์ง€ -์•Š๊ธฐ- ๋•Œ๋ฌธ์—, ์„ธ๊ฐœ์˜ CPU ์˜ˆ์ œ๊ฐ€ ์‹คํ–‰
  626. ์™„๋ฃŒ๋œ ํ›„์— ์œ„์˜ assert() ์˜ ์กฐ๊ฑด์€ ๊ฑฐ์ง“์œผ๋กœ ํ‰๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ๊ฐœ์˜ CPU
  627. ์˜ˆ์ œ๊ฐ€ ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๊ธธ ์›ํ•œ๋‹ค๋ฉด, CPU 0 ์™€ CPU 1 ์ฝ”๋“œ์˜ ๋กœ๋“œ์™€ ์Šคํ† ์–ด ์‚ฌ์ด, "if"
  628. ๋ฌธ ๋ฐ”๋กœ ๋‹ค์Œ์— smp_mb()๋ฅผ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์•„๊ฐ€์„œ, ์ตœ์ดˆ์˜ ๋‘ CPU ์˜ˆ์ œ๋Š”
  629. ๋งค์šฐ ์œ„ํ—˜ํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  630. ์ด ๋‘๊ฐœ์˜ ์˜ˆ์ œ๋Š” ๋‹ค์Œ ๋…ผ๋ฌธ:
  631. http://www.cl.cam.ac.uk/users/pes20/ppc-supplemental/test6.pdf ์™€
  632. ์ด ์‚ฌ์ดํŠธ: https://www.cl.cam.ac.uk/~pes20/ppcmem/index.html ์— ๋‚˜์˜จ LB ์™€ WWC
  633. ๋ฆฌํŠธ๋จธ์Šค ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
  634. ์š”์•ฝํ•˜์ž๋ฉด:
  635. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ์•ž์˜ ๋กœ๋“œ๋“ค์„ ๋’ค์˜ ์Šคํ† ์–ด๋“ค์— ๋Œ€ํ•ด ์ˆœ์„œ๋ฅผ ๋งž์ถฐ์ค๋‹ˆ๋‹ค.
  636. ํ•˜์ง€๋งŒ, ๊ทธ ์™ธ์˜ ์–ด๋–ค ์ˆœ์„œ๋„ ๋ณด์žฅํ•˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-: ์•ž์˜ ๋กœ๋“œ์™€ ๋’ค์˜ ๋กœ๋“œ๋“ค
  637. ์‚ฌ์ด์—๋„, ์•ž์˜ ์Šคํ† ์–ด์™€ ๋’ค์˜ ์Šคํ† ์–ด๋“ค ์‚ฌ์ด์—๋„์š”. ์ด๋Ÿฐ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜
  638. ์ˆœ์„œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด smp_rmb() ๋‚˜ smp_wmb()๋ฅผ, ๋˜๋Š”, ์•ž์˜ ์Šคํ† ์–ด๋“ค๊ณผ ๋’ค์˜
  639. ๋กœ๋“œ๋“ค ์‚ฌ์ด์˜ ์ˆœ์„œ๋ฅผ ์œ„ํ•ด์„œ๋Š” smp_mb() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  640. (*) "if" ๋ฌธ์˜ ์–‘๊ฐˆ๋ž˜ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜์—์˜ ๋™์ผํ•œ ์Šคํ† ์–ด๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด, ๊ทธ
  641. ์Šคํ† ์–ด๋“ค์€ ๊ฐ ์Šคํ† ์–ด ์•ž์— smp_mb() ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ smp_store_release() ๋ฅผ
  642. ์‚ฌ์šฉํ•ด์„œ ์Šคํ† ์–ด๋ฅผ ํ•˜๋Š” ์‹์œผ๋กœ ์ˆœ์„œ๋ฅผ ๋งž์ถฐ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ
  643. ์œ„ํ•ด "if" ๋ฌธ์˜ ์–‘๊ฐˆ๋ž˜ ๋ธŒ๋žœ์น˜์˜ ์‹œ์ž‘ ์ง€์ ์— barrier() ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š”
  644. ์ถฉ๋ถ„ํ•œ ํ•ด๊ฒฐ์ด ๋˜์ง€ ์•Š๋Š”๋ฐ, ์ด๋Š” ์•ž์˜ ์˜ˆ์—์„œ ๋ณธ๊ฒƒ๊ณผ ๊ฐ™์ด, ์ปดํŒŒ์ผ๋Ÿฌ์˜
  645. ์ตœ์ ํ™”๋Š” barrier() ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ง€ํ‚ค๋ฉด์„œ๋„ ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ์†์ƒ์‹œํ‚ฌ
  646. ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๋Š” ์ ์„ ๋ถ€๋”” ์•Œ์•„๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  647. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ์•ž์˜ ๋กœ๋“œ์™€ ๋’ค์˜ ์Šคํ† ์–ด ์‚ฌ์ด์— ์ตœ์†Œ ํ•˜๋‚˜์˜, ์‹คํ–‰
  648. ์‹œ์ ์—์„œ์˜ ์กฐ๊ฑด๊ด€๊ณ„๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฉฐ, ์ด ์กฐ๊ฑด๊ด€๊ณ„๋Š” ์•ž์˜ ๋กœ๋“œ์™€ ๊ด€๊ณ„๋˜์–ด์•ผ
  649. ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์กฐ๊ฑด ๊ด€๊ณ„๋ฅผ ์ตœ์ ํ™”๋กœ ์—†์•จ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ˆœ์„œ๋„
  650. ์ตœ์ ํ™”๋กœ ์—†์• ๋ฒ„๋ ธ์„ ๊ฒ๋‹ˆ๋‹ค. READ_ONCE() ์™€ WRITE_ONCE() ์˜ ์ฃผ์˜ ๊นŠ์€
  651. ์‚ฌ์šฉ์€ ์ฃผ์–ด์ง„ ์กฐ๊ฑด ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  652. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ์œ„ํ•ด์„  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์กฐ๊ฑด๊ด€๊ณ„๋ฅผ ์—†์• ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ๋ง‰์•„์•ผ
  653. ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์˜ ๊นŠ์€ READ_ONCE() ๋‚˜ atomic{,64}_read() ์˜ ์‚ฌ์šฉ์ด ์ปจํŠธ๋กค
  654. ์˜์กด์„ฑ์ด ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ฒŒ ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ
  655. ์œ„ํ•ด์„  "์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด" ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  656. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ๋ณดํ†ต ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ ์ง์„ ๋งž์ถฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  657. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ์ดํ–‰์„ฑ์„ ์ œ๊ณตํ•˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-. ์ดํ–‰์„ฑ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด,
  658. smp_mb() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  659. SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ
  660. --------------------
  661. CPU ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹ค๋ฃฐ ๋•Œ์— ์ผ๋ถ€ ํƒ€์ž…์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ํ•ญ์ƒ ์ง์„ ๋งž์ถฐ
  662. ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•˜๊ฒŒ ์ง์„ ๋งž์ถ”์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ์‚ฌ์‹ค์ƒ ์—๋Ÿฌ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.
  663. ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋ผ๋ฆฌ๋„ ์ง์„ ๋งž์ถ”์ง€๋งŒ ์ดํ–‰์„ฑ์ด ์—†๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ
  664. ํƒ€์ž…์˜ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ๋„ ์ง์„ ๋งž์ถฅ๋‹ˆ๋‹ค. ACQUIRE ๋ฐฐ๋ฆฌ์–ด๋Š” RELEASE ๋ฐฐ๋ฆฌ์–ด์™€ ์ง์„
  665. ๋งž์ถฅ๋‹ˆ๋‹ค๋งŒ, ๋‘˜ ๋‹ค ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ํฌํ•จํ•ด ๋‹ค๋ฅธ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ๋„ ์ง์„ ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  666. ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ์ปจํŠธ๋กค ์˜์กด์„ฑ, ACQUIRE ๋ฐฐ๋ฆฌ์–ด, RELEASE
  667. ๋ฐฐ๋ฆฌ์–ด, ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด, ๋˜๋Š” ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด์™€ ์ง์„ ๋งž์ถฅ๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜
  668. ์ปจํŠธ๋กค ์˜์กด์„ฑ, ๋˜๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ACQUIRE ๋ฐฐ๋ฆฌ์–ด,
  669. RELEASE ๋ฐฐ๋ฆฌ์–ด, ๋˜๋Š” ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด์™€ ์ง์„ ๋งž์ถ”๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  670. CPU 1 CPU 2
  671. =============== ===============
  672. WRITE_ONCE(a, 1);
  673. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  674. WRITE_ONCE(b, 2); x = READ_ONCE(b);
  675. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  676. y = READ_ONCE(a);
  677. ๋˜๋Š”:
  678. CPU 1 CPU 2
  679. =============== ===============================
  680. a = 1;
  681. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  682. WRITE_ONCE(b, &a); x = READ_ONCE(b);
  683. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด>
  684. y = *x;
  685. ๋˜๋Š”:
  686. CPU 1 CPU 2
  687. =============== ===============================
  688. r1 = READ_ONCE(y);
  689. <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด>
  690. WRITE_ONCE(y, 1); if (r2 = READ_ONCE(x)) {
  691. <๋ฌต์‹œ์  ์ปจํŠธ๋กค ์˜์กด์„ฑ>
  692. WRITE_ONCE(y, 1);
  693. }
  694. assert(r1 == 0 || r2 == 0);
  695. ๊ธฐ๋ณธ์ ์œผ๋กœ, ์—ฌ๊ธฐ์„œ์˜ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” "๋” ์™„ํ™”๋œ" ํƒ€์ž…์ผ ์ˆœ ์žˆ์–ด๋„ ํ•ญ์ƒ ์กด์žฌํ•ด์•ผ
  696. ํ•ฉ๋‹ˆ๋‹ค.
  697. [!] ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ๋ฐ์ดํ„ฐ
  698. ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๊ณผ ๋งค์น˜๋  ๊ฒƒ์ด๊ณ , ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค:
  699. CPU 1 CPU 2
  700. =================== ===================
  701. WRITE_ONCE(a, 1); }---- --->{ v = READ_ONCE(c);
  702. WRITE_ONCE(b, 2); } \ / { w = READ_ONCE(d);
  703. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด> \ <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  704. WRITE_ONCE(c, 3); } / \ { x = READ_ONCE(a);
  705. WRITE_ONCE(d, 4); }---- --->{ y = READ_ONCE(b);
  706. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์‹œํ€€์Šค์˜ ์˜ˆ
  707. -------------------------
  708. ์ฒซ์งธ, ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  709. ์•„๋ž˜์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ๋ณด์„ธ์š”:
  710. CPU 1
  711. =======================
  712. STORE A = 1
  713. STORE B = 2
  714. STORE C = 3
  715. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  716. STORE D = 4
  717. STORE E = 5
  718. ์ด ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ผ๊ด€์„ฑ ์‹œ์Šคํ…œ์— ์›์†Œ๋ผ๋ฆฌ์˜ ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ง‘ํ•ฉ
  719. { STORE A, STORE B, STORE C } ๊ฐ€ ์—ญ์‹œ ์›์†Œ๋ผ๋ฆฌ์˜ ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ง‘ํ•ฉ
  720. { STORE D, STORE E } ๋ณด๋‹ค ๋จผ์ € ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ๋“ค์— ๋ณด์ด๋„๋ก
  721. ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค:
  722. +-------+ : :
  723. | | +------+
  724. | |------>| C=3 | } /\
  725. | | : +------+ }----- \ -----> ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ์—
  726. | | : | A=1 | } \/ ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ๋“ค
  727. | | : +------+ }
  728. | CPU 1 | : | B=2 | }
  729. | | +------+ }
  730. | | wwwwwwwwwwwwwwww } <--- ์—ฌ๊ธฐ์„œ ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐฐ๋ฆฌ์–ด ์•ž์˜
  731. | | +------+ } ๋ชจ๋“  ์Šคํ† ์–ด๊ฐ€ ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ์Šคํ† ์–ด
  732. | | : | E=5 | } ์ „์— ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ „๋‹ฌ๋˜๋„๋ก
  733. | | : +------+ } ํ•ฉ๋‹ˆ๋‹ค
  734. | |------>| D=4 | }
  735. | | +------+
  736. +-------+ : :
  737. |
  738. | CPU 1 ์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ „๋‹ฌ๋˜๋Š”
  739. | ์ผ๋ จ์˜ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค
  740. V
  741. ๋‘˜์งธ, ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์  ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ๋ถ€๋ถ„์  ์ˆœ์„œ
  742. ์„ธ์šฐ๊ธฐ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋“ค์„ ๋ณด์„ธ์š”:
  743. CPU 1 CPU 2
  744. ======================= =======================
  745. { B = 7; X = 9; Y = 8; C = &Y }
  746. STORE A = 1
  747. STORE B = 2
  748. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  749. STORE C = &B LOAD X
  750. STORE D = 4 LOAD C (gets &B)
  751. LOAD *C (reads B)
  752. ์—ฌ๊ธฐ์— ๋ณ„๋‹ค๋ฅธ ๊ฐœ์ž…์ด ์—†๋‹ค๋ฉด, CPU 1 ์˜ ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  CPU 2 ๋Š” CPU 1
  753. ์˜ ์ด๋ฒคํŠธ๋“ค์„ ์™„์ „ํžˆ ๋ฌด์ž‘์œ„์  ์ˆœ์„œ๋กœ ์ธ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
  754. +-------+ : : : :
  755. | | +------+ +-------+ | CPU 2 ์— ์ธ์ง€๋˜๋Š”
  756. | |------>| B=2 |----- --->| Y->8 | | ์—…๋ฐ์ดํŠธ ์ด๋ฒคํŠธ
  757. | | : +------+ \ +-------+ | ์‹œํ€€์Šค
  758. | CPU 1 | : | A=1 | \ --->| C->&Y | V
  759. | | +------+ | +-------+
  760. | | wwwwwwwwwwwwwwww | : :
  761. | | +------+ | : :
  762. | | : | C=&B |--- | : : +-------+
  763. | | : +------+ \ | +-------+ | |
  764. | |------>| D=4 | ----------->| C->&B |------>| |
  765. | | +------+ | +-------+ | |
  766. +-------+ : : | : : | |
  767. | : : | |
  768. | : : | CPU 2 |
  769. | +-------+ | |
  770. ๋ถ„๋ช…ํžˆ ์ž˜๋ชป๋œ ---> | | B->7 |------>| |
  771. B ์˜ ๊ฐ’ ์ธ์ง€ (!) | +-------+ | |
  772. | : : | |
  773. | +-------+ | |
  774. X ์˜ ๋กœ๋“œ๊ฐ€ B ์˜ ---> \ | X->9 |------>| |
  775. ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ \ +-------+ | |
  776. ์ง€์—ฐ์‹œํ‚ด ----->| B->2 | +-------+
  777. +-------+
  778. : :
  779. ์•ž์˜ ์˜ˆ์—์„œ, CPU 2 ๋Š” (B ์˜ ๊ฐ’์ด ๋ ) *C ์˜ ๊ฐ’ ์ฝ๊ธฐ๊ฐ€ C ์˜ LOAD ๋’ค์— ์ด์–ด์ง์—๋„
  780. B ๊ฐ€ 7 ์ด๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
  781. ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ C ์˜ ๋กœ๋“œ์™€ *C (์ฆ‰, B) ์˜ ๋กœ๋“œ ์‚ฌ์ด์—
  782. ์žˆ์—ˆ๋‹ค๋ฉด:
  783. CPU 1 CPU 2
  784. ======================= =======================
  785. { B = 7; X = 9; Y = 8; C = &Y }
  786. STORE A = 1
  787. STORE B = 2
  788. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  789. STORE C = &B LOAD X
  790. STORE D = 4 LOAD C (gets &B)
  791. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด>
  792. LOAD *C (reads B)
  793. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค:
  794. +-------+ : : : :
  795. | | +------+ +-------+
  796. | |------>| B=2 |----- --->| Y->8 |
  797. | | : +------+ \ +-------+
  798. | CPU 1 | : | A=1 | \ --->| C->&Y |
  799. | | +------+ | +-------+
  800. | | wwwwwwwwwwwwwwww | : :
  801. | | +------+ | : :
  802. | | : | C=&B |--- | : : +-------+
  803. | | : +------+ \ | +-------+ | |
  804. | |------>| D=4 | ----------->| C->&B |------>| |
  805. | | +------+ | +-------+ | |
  806. +-------+ : : | : : | |
  807. | : : | |
  808. | : : | CPU 2 |
  809. | +-------+ | |
  810. | | X->9 |------>| |
  811. | +-------+ | |
  812. C ๋กœ์˜ ์Šคํ† ์–ด ์•ž์˜ ---> \ ddddddddddddddddd | |
  813. ๋ชจ๋“  ์ด๋ฒคํŠธ ๊ฒฐ๊ณผ๊ฐ€ \ +-------+ | |
  814. ๋’ค์˜ ๋กœ๋“œ์—๊ฒŒ ----->| B->2 |------>| |
  815. ๋ณด์ด๊ฒŒ ๊ฐ•์ œํ•œ๋‹ค +-------+ | |
  816. : : +-------+
  817. ์…‹์งธ, ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์—์˜ ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  818. ์•„๋ž˜์˜ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ด…์‹œ๋‹ค:
  819. CPU 1 CPU 2
  820. ======================= =======================
  821. { A = 0, B = 9 }
  822. STORE A=1
  823. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  824. STORE B=2
  825. LOAD B
  826. LOAD A
  827. CPU 1 ์€ ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ณค์ง€๋งŒ, ๋ณ„๋‹ค๋ฅธ ๊ฐœ์ž…์ด ์—†๋‹ค๋ฉด CPU 2 ๋Š” CPU 1 ์—์„œ ํ–‰ํ•ด์ง„
  828. ์ด๋ฒคํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฌด์ž‘์œ„์  ์ˆœ์„œ๋กœ ์ธ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  829. +-------+ : : : :
  830. | | +------+ +-------+
  831. | |------>| A=1 |------ --->| A->0 |
  832. | | +------+ \ +-------+
  833. | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 |
  834. | | +------+ | +-------+
  835. | |------>| B=2 |--- | : :
  836. | | +------+ \ | : : +-------+
  837. +-------+ : : \ | +-------+ | |
  838. ---------->| B->2 |------>| |
  839. | +-------+ | CPU 2 |
  840. | | A->0 |------>| |
  841. | +-------+ | |
  842. | : : +-------+
  843. \ : :
  844. \ +-------+
  845. ---->| A->1 |
  846. +-------+
  847. : :
  848. ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ B ์˜ ๋กœ๋“œ์™€ A ์˜ ๋กœ๋“œ ์‚ฌ์ด์— ์กด์žฌํ•œ๋‹ค๋ฉด:
  849. CPU 1 CPU 2
  850. ======================= =======================
  851. { A = 0, B = 9 }
  852. STORE A=1
  853. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  854. STORE B=2
  855. LOAD B
  856. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  857. LOAD A
  858. CPU 1 ์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ถ€๋ถ„์  ์ˆœ์„œ๊ฐ€ CPU 2 ์—๋„ ๊ทธ๋Œ€๋กœ ์ธ์ง€๋ฉ๋‹ˆ๋‹ค:
  859. +-------+ : : : :
  860. | | +------+ +-------+
  861. | |------>| A=1 |------ --->| A->0 |
  862. | | +------+ \ +-------+
  863. | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 |
  864. | | +------+ | +-------+
  865. | |------>| B=2 |--- | : :
  866. | | +------+ \ | : : +-------+
  867. +-------+ : : \ | +-------+ | |
  868. ---------->| B->2 |------>| |
  869. | +-------+ | CPU 2 |
  870. | : : | |
  871. | : : | |
  872. ์—ฌ๊ธฐ์„œ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ----> \ rrrrrrrrrrrrrrrrr | |
  873. B ๋กœ์˜ ์Šคํ† ์–ด ์ „์˜ \ +-------+ | |
  874. ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ CPU 2 ์— ---->| A->1 |------>| |
  875. ๋ณด์ด๋„๋ก ํ•œ๋‹ค +-------+ | |
  876. : : +-------+
  877. ๋” ์™„๋ฒฝํ•œ ์„ค๋ช…์„ ์œ„ํ•ด, A ์˜ ๋กœ๋“œ๊ฐ€ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด ์•ž๊ณผ ๋’ค์— ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ์ง€
  878. ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  879. CPU 1 CPU 2
  880. ======================= =======================
  881. { A = 0, B = 9 }
  882. STORE A=1
  883. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  884. STORE B=2
  885. LOAD B
  886. LOAD A [first load of A]
  887. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  888. LOAD A [second load of A]
  889. A ์˜ ๋กœ๋“œ ๋‘๊ฐœ๊ฐ€ ๋ชจ๋‘ B ์˜ ๋กœ๋“œ ๋’ค์— ์žˆ์ง€๋งŒ, ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ์–ป์–ด์˜ฌ ์ˆ˜
  890. ์žˆ์Šต๋‹ˆ๋‹ค:
  891. +-------+ : : : :
  892. | | +------+ +-------+
  893. | |------>| A=1 |------ --->| A->0 |
  894. | | +------+ \ +-------+
  895. | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 |
  896. | | +------+ | +-------+
  897. | |------>| B=2 |--- | : :
  898. | | +------+ \ | : : +-------+
  899. +-------+ : : \ | +-------+ | |
  900. ---------->| B->2 |------>| |
  901. | +-------+ | CPU 2 |
  902. | : : | |
  903. | : : | |
  904. | +-------+ | |
  905. | | A->0 |------>| 1st |
  906. | +-------+ | |
  907. ์—ฌ๊ธฐ์„œ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ----> \ rrrrrrrrrrrrrrrrr | |
  908. B ๋กœ์˜ ์Šคํ† ์–ด ์ „์˜ \ +-------+ | |
  909. ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ CPU 2 ์— ---->| A->1 |------>| 2nd |
  910. ๋ณด์ด๋„๋ก ํ•œ๋‹ค +-------+ | |
  911. : : +-------+
  912. ํ•˜์ง€๋งŒ CPU 1 ์—์„œ์˜ A ์—…๋ฐ์ดํŠธ๋Š” ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์—๋„ ๋ณด์ผ ์ˆ˜๋„
  913. ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค:
  914. +-------+ : : : :
  915. | | +------+ +-------+
  916. | |------>| A=1 |------ --->| A->0 |
  917. | | +------+ \ +-------+
  918. | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 |
  919. | | +------+ | +-------+
  920. | |------>| B=2 |--- | : :
  921. | | +------+ \ | : : +-------+
  922. +-------+ : : \ | +-------+ | |
  923. ---------->| B->2 |------>| |
  924. | +-------+ | CPU 2 |
  925. | : : | |
  926. \ : : | |
  927. \ +-------+ | |
  928. ---->| A->1 |------>| 1st |
  929. +-------+ | |
  930. rrrrrrrrrrrrrrrrr | |
  931. +-------+ | |
  932. | A->1 |------>| 2nd |
  933. +-------+ | |
  934. : : +-------+
  935. ์—ฌ๊ธฐ์„œ ๋ณด์žฅ๋˜๋Š” ๊ฑด, ๋งŒ์•ฝ B ์˜ ๋กœ๋“œ๊ฐ€ B == 2 ๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ดค๋‹ค๋ฉด, A ์—์˜ ๋‘๋ฒˆ์งธ
  936. ๋กœ๋“œ๋Š” ํ•ญ์ƒ A == 1 ์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒ๋‹ˆ๋‹ค. A ์—์˜ ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ์—๋Š” ๊ทธ๋Ÿฐ
  937. ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค; A == 0 ์ด๊ฑฐ๋‚˜ A == 1 ์ด๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ฒŒ ๋ ๊ฒ๋‹ˆ๋‹ค.
  938. ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด VS ๋กœ๋“œ ์˜ˆ์ธก
  939. -------------------------------
  940. ๋งŽ์€ CPU๋“ค์ด ๋กœ๋“œ๋ฅผ ์˜ˆ์ธก์ ์œผ๋กœ (speculatively) ํ•ฉ๋‹ˆ๋‹ค: ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ
  941. ๋กœ๋“œํ•ด์•ผ ํ•˜๊ฒŒ ๋ ์ง€ ์˜ˆ์ธก์„ ํ–ˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์‹ค์ œ๋กœ๋Š”
  942. ์•„์ง ๋งŒ๋‚˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋กœ๋“œ ์ž‘์—…์ด ์—†์–ด ๋ฒ„์Šค (bus) ๊ฐ€ ์•„๋ฌด ์ผ๋„ ํ•˜๊ณ  ์žˆ์ง€
  943. ์•Š๋‹ค๋ฉด, ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„์— ์‹ค์ œ ๋กœ๋“œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ์‹คํ–‰๋˜๋ฉด CPU ๊ฐ€
  944. ์ด๋ฏธ ๊ทธ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋กœ๋“œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ์ฆ‰์‹œ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  945. ํ•ด๋‹น CPU ๋Š” ์‹ค์ œ๋กœ๋Š” ๊ทธ ๊ฐ’์ด ํ•„์š”์น˜ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋‚˜์ค‘์— ๋“œ๋Ÿฌ๋‚  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ -
  946. ํ•ด๋‹น ๋กœ๋“œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ๋ธŒ๋žœ์น˜๋กœ ์šฐํšŒ๋˜๊ฑฐ๋‚˜ ํ–ˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ฃ  - , ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์•ž์„œ
  947. ์ฝ์–ด๋‘” ๊ฐ’์„ ๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ๋‚˜์ค‘์˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์บ์‹œ์— ๋„ฃ์–ด๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  948. ๋‹ค์Œ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  949. CPU 1 CPU 2
  950. ======================= =======================
  951. LOAD B
  952. DIVIDE } ๋‚˜๋ˆ„๊ธฐ ๋ช…๋ น์€ ์ผ๋ฐ˜์ ์œผ๋กœ
  953. DIVIDE } ๊ธด ์‹œ๊ฐ„์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค
  954. LOAD A
  955. ๋Š” ์ด๋ ‡๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  956. : : +-------+
  957. +-------+ | |
  958. --->| B->2 |------>| |
  959. +-------+ | CPU 2 |
  960. : :DIVIDE | |
  961. +-------+ | |
  962. ๋‚˜๋ˆ„๊ธฐ ํ•˜๋Š๋ผ ๋ฐ”์œ ---> --->| A->0 |~~~~ | |
  963. CPU ๋Š” A ์˜ LOAD ๋ฅผ +-------+ ~ | |
  964. ์˜ˆ์ธกํ•ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค : : ~ | |
  965. : :DIVIDE | |
  966. : : ~ | |
  967. ๋‚˜๋ˆ„๊ธฐ๊ฐ€ ๋๋‚˜๋ฉด ---> ---> : : ~-->| |
  968. CPU ๋Š” ํ•ด๋‹น LOAD ๋ฅผ : : | |
  969. ์ฆ‰๊ฐ ์™„๋ฃŒํ•œ๋‹ค : : +-------+
  970. ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‘๋ฒˆ์งธ ๋กœ๋“œ ์ง์ „์— ๋†“๋Š”๋‹ค๋ฉด:
  971. CPU 1 CPU 2
  972. ======================= =======================
  973. LOAD B
  974. DIVIDE
  975. DIVIDE
  976. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  977. LOAD A
  978. ์˜ˆ์ธก์œผ๋กœ ์–ป์–ด์ง„ ๊ฐ’์€ ์‚ฌ์šฉ๋œ ๋ฐฐ๋ฆฌ์–ด์˜ ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ฐ’์ด ์˜ณ์€์ง€ ๊ฒ€ํ† ๋˜๊ฒŒ
  979. ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ณ€ํ™”๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด, ์˜ˆ์ธก์œผ๋กœ ์–ป์–ด๋‘์—ˆ๋˜ ๊ฐ’์ด
  980. ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค:
  981. : : +-------+
  982. +-------+ | |
  983. --->| B->2 |------>| |
  984. +-------+ | CPU 2 |
  985. : :DIVIDE | |
  986. +-------+ | |
  987. ๋‚˜๋ˆ„๊ธฐ ํ•˜๋Š๋ผ ๋ฐ”์œ ---> --->| A->0 |~~~~ | |
  988. CPU ๋Š” A ์˜ LOAD ๋ฅผ +-------+ ~ | |
  989. ์˜ˆ์ธกํ•œ๋‹ค : : ~ | |
  990. : :DIVIDE | |
  991. : : ~ | |
  992. : : ~ | |
  993. rrrrrrrrrrrrrrrr~ | |
  994. : : ~ | |
  995. : : ~-->| |
  996. : : | |
  997. : : +-------+
  998. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ CPU ์—์„œ ์—…๋ฐ์ดํŠธ๋‚˜ ๋ฌดํšจํ™”๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด, ๊ทธ ์˜ˆ์ธก์€ ๋ฌดํšจํ™”๋˜๊ณ  ๊ทธ ๊ฐ’์€
  999. ๋‹ค์‹œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค:
  1000. : : +-------+
  1001. +-------+ | |
  1002. --->| B->2 |------>| |
  1003. +-------+ | CPU 2 |
  1004. : :DIVIDE | |
  1005. +-------+ | |
  1006. ๋‚˜๋ˆ„๊ธฐ ํ•˜๋Š๋ผ ๋ฐ”์œ ---> --->| A->0 |~~~~ | |
  1007. CPU ๋Š” A ์˜ LOAD ๋ฅผ +-------+ ~ | |
  1008. ์˜ˆ์ธกํ•œ๋‹ค : : ~ | |
  1009. : :DIVIDE | |
  1010. : : ~ | |
  1011. : : ~ | |
  1012. rrrrrrrrrrrrrrrrr | |
  1013. +-------+ | |
  1014. ์˜ˆ์ธก์„ฑ ๋™์ž‘์€ ๋ฌดํšจํ™” ๋˜๊ณ  ---> --->| A->1 |------>| |
  1015. ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’์ด ๋‹ค์‹œ ์ฝํ˜€์ง„๋‹ค +-------+ | |
  1016. : : +-------+
  1017. ์ดํ–‰์„ฑ
  1018. ------
  1019. ์ดํ–‰์„ฑ(transitivity)์€ ์‹ค์ œ์˜ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์—์„œ ํ•ญ์ƒ ์ œ๊ณต๋˜์ง€๋Š” ์•Š๋Š”, ์ˆœ์„œ
  1020. ๋งž์ถ”๊ธฐ์— ๋Œ€ํ•œ ์ƒ๋‹นํžˆ ์ง๊ด€์ ์ธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ์˜ˆ๊ฐ€ ์ดํ–‰์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:
  1021. CPU 1 CPU 2 CPU 3
  1022. ======================= ======================= =======================
  1023. { X = 0, Y = 0 }
  1024. STORE X=1 LOAD X STORE Y=1
  1025. <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด> <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด>
  1026. LOAD Y LOAD X
  1027. CPU 2 ์˜ X ๋กœ๋“œ๊ฐ€ 1์„ ๋ฆฌํ„ดํ–ˆ๊ณ  Y ๋กœ๋“œ๊ฐ€ 0์„ ๋ฆฌํ„ดํ–ˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ์ด๋Š” CPU 2 ์˜
  1028. X ๋กœ๋“œ๊ฐ€ CPU 1 ์˜ X ์Šคํ† ์–ด ๋’ค์— ์ด๋ฃจ์–ด์กŒ๊ณ  CPU 2 ์˜ Y ๋กœ๋“œ๋Š” CPU 3 ์˜ Y ์Šคํ† ์–ด
  1029. ์ „์— ์ด๋ฃจ์–ด์กŒ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ "CPU 3 ์˜ X ๋กœ๋“œ๋Š” 0์„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋‚˜์š”?"
  1030. CPU 2 ์˜ X ๋กœ๋“œ๋Š” CPU 1 ์˜ ์Šคํ† ์–ด ํ›„์— ์ด๋ฃจ์–ด์กŒ์œผ๋‹ˆ, CPU 3 ์˜ X ๋กœ๋“œ๋Š” 1์„
  1031. ๋ฆฌํ„ดํ•˜๋Š”๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ƒ๊ฐ์ด ์ดํ–‰์„ฑ์˜ ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค: CPU A ์—์„œ ์‹คํ–‰๋œ
  1032. ๋กœ๋“œ๊ฐ€ CPU B ์—์„œ์˜ ๊ฐ™์€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋กœ๋“œ๋ฅผ ๋’ค๋”ฐ๋ฅธ๋‹ค๋ฉด, CPU A ์˜ ๋กœ๋“œ๋Š” CPU B
  1033. ์˜ ๋กœ๋“œ๊ฐ€ ๋‚ด๋†“์€ ๊ฐ’๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๊ทธ ํ›„์˜ ๊ฐ’์„ ๋‚ด๋†“์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1034. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์—์„œ ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด์˜ ์‚ฌ์šฉ์€ ์ดํ–‰์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์•ž์˜ ์˜ˆ์—์„œ
  1035. CPU 2 ์˜ X ๋กœ๋“œ๊ฐ€ 1์„, Y ๋กœ๋“œ๋Š” 0์„ ๋ฆฌํ„ดํ–ˆ๋‹ค๋ฉด, CPU 3 ์˜ X ๋กœ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ 1์„
  1036. ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
  1037. ํ•˜์ง€๋งŒ, ์ฝ๊ธฐ๋‚˜ ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด์— ๋Œ€ํ•ด์„œ๋Š” ์ดํ–‰์„ฑ์ด ๋ณด์žฅ๋˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-. ์˜ˆ๋ฅผ ๋“ค์–ด,
  1038. ์•ž์˜ ์˜ˆ์—์„œ CPU 2 ์˜ ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋กœ ๋ฐ”๋€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด
  1039. ๋ด…์‹œ๋‹ค:
  1040. CPU 1 CPU 2 CPU 3
  1041. ======================= ======================= =======================
  1042. { X = 0, Y = 0 }
  1043. STORE X=1 LOAD X STORE Y=1
  1044. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด> <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด>
  1045. LOAD Y LOAD X
  1046. ์ด ์ฝ”๋“œ๋Š” ์ดํ–‰์„ฑ์„ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค: ์ด ์˜ˆ์—์„œ๋Š”, CPU 2 ์˜ X ๋กœ๋“œ๊ฐ€ 1์„
  1047. ๋ฆฌํ„ดํ•˜๊ณ , Y ๋กœ๋“œ๋Š” 0์„ ๋ฆฌํ„ดํ•˜์ง€๋งŒ CPU 3 ์˜ X ๋กœ๋“œ๊ฐ€ 0์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ๋„ ์™„์ „ํžˆ
  1048. ํ•ฉ๋ฒ•์ ์ž…๋‹ˆ๋‹ค.
  1049. CPU 2 ์˜ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์ž์‹ ์˜ ์ฝ๊ธฐ๋Š” ์ˆœ์„œ๋ฅผ ๋งž์ถฐ์ค˜๋„, CPU 1 ์˜ ์Šคํ† ์–ด์™€์˜
  1050. ์ˆœ์„œ๋ฅผ ๋งž์ถฐ์ค€๋‹ค๊ณ ๋Š” ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค๋Š”๊ฒŒ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, CPU 1 ๊ณผ CPU 2 ๊ฐ€
  1051. ๋ฒ„ํผ๋‚˜ ์บ์‹œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์ด ์˜ˆ์ œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋ฉด, CPU 2 ๋Š” CPU 1 ์ด
  1052. ์“ด ๊ฐ’์— ์ข€ ๋นจ๋ฆฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ CPU 1 ๊ณผ CPU 2 ์˜ ์ ‘๊ทผ์œผ๋กœ
  1053. ์กฐํ•ฉ๋œ ์ˆœ์„œ๋ฅผ ๋ชจ๋“  CPU ๊ฐ€ ๋™์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  1054. ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋Š” "๊ธ€๋กœ๋ฒŒ ์ดํ–‰์„ฑ"์„ ์ œ๊ณตํ•ด์„œ, ๋ชจ๋“  CPU ๋“ค์ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ์ˆœ์„œ์—
  1055. ๋™์˜ํ•˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, release-acquire ์กฐํ•ฉ์€ "๋กœ์ปฌ ์ดํ–‰์„ฑ" ๋งŒ์„
  1056. ์ œ๊ณตํ•ด์„œ, ํ•ด๋‹น ์กฐํ•ฉ์ด ์‚ฌ์šฉ๋œ CPU ๋“ค๋งŒ์ด ํ•ด๋‹น ์•ก์„ธ์Šค๋“ค์˜ ์กฐํ•ฉ๋œ ์ˆœ์„œ์— ๋™์˜ํ•จ์ด
  1057. ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์กด๊ฒฝ์Šค๋Ÿฐ Herman Hollerith ์˜ C ์ฝ”๋“œ๋กœ ๋ณด๋ฉด:
  1058. int u, v, x, y, z;
  1059. void cpu0(void)
  1060. {
  1061. r0 = smp_load_acquire(&x);
  1062. WRITE_ONCE(u, 1);
  1063. smp_store_release(&y, 1);
  1064. }
  1065. void cpu1(void)
  1066. {
  1067. r1 = smp_load_acquire(&y);
  1068. r4 = READ_ONCE(v);
  1069. r5 = READ_ONCE(u);
  1070. smp_store_release(&z, 1);
  1071. }
  1072. void cpu2(void)
  1073. {
  1074. r2 = smp_load_acquire(&z);
  1075. smp_store_release(&x, 1);
  1076. }
  1077. void cpu3(void)
  1078. {
  1079. WRITE_ONCE(v, 1);
  1080. smp_mb();
  1081. r3 = READ_ONCE(u);
  1082. }
  1083. cpu0(), cpu1(), ๊ทธ๋ฆฌ๊ณ  cpu2() ๋Š” smp_store_release()/smp_load_acquire() ์Œ์˜
  1084. ์—ฐ๊ฒฐ์„ ํ†ตํ•œ ๋กœ์ปฌ ์ดํ–‰์„ฑ์— ๋™์ฐธํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋Š” ๋‚˜์˜ค์ง€ ์•Š์„
  1085. ๊ฒ๋‹ˆ๋‹ค:
  1086. r0 == 1 && r1 == 1 && r2 == 1
  1087. ๋” ๋‚˜์•„๊ฐ€์„œ, cpu0() ์™€ cpu1() ์‚ฌ์ด์˜ release-acquire ๊ด€๊ณ„๋กœ ์ธํ•ด, cpu1() ์€
  1088. cpu0() ์˜ ์“ฐ๊ธฐ๋ฅผ ๋ด์•ผ๋งŒ ํ•˜๋ฏ€๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋„ ์—†์„ ๊ฒ๋‹ˆ๋‹ค:
  1089. r1 == 1 && r5 == 0
  1090. ํ•˜์ง€๋งŒ, release-acquire ํƒ€๋™์„ฑ์€ ๋™์ฐธํ•œ CPU ๋“ค์—๋งŒ ์ ์šฉ๋˜๋ฏ€๋กœ cpu3() ์—๋Š”
  1091. ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  1092. r0 == 0 && r1 == 1 && r2 == 1 && r3 == 0 && r4 == 0
  1093. ๋น„์Šทํ•˜๊ฒŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  1094. r0 == 0 && r1 == 1 && r2 == 1 && r3 == 0 && r4 == 0 && r5 == 1
  1095. cpu0(), cpu1(), ๊ทธ๋ฆฌ๊ณ  cpu2() ๋Š” ๊ทธ๋“ค์˜ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ฒŒ ๋˜์ง€๋งŒ,
  1096. release-acquire ์ฒด์ธ์— ๊ด€์—ฌ๋˜์ง€ ์•Š์€ CPU ๋“ค์€ ๊ทธ ์ˆœ์„œ์— ์ด๊ฒฌ์„ ๊ฐ€์งˆ ์ˆ˜
  1097. ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ด๊ฒฌ์€ smp_load_acquire() ์™€ smp_store_release() ์˜ ๊ตฌํ˜„์—
  1098. ์‚ฌ์šฉ๋˜๋Š” ์™„ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์€ ํ•ญ์ƒ ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ์Šคํ† ์–ด๋“ค์„ ๋’ค์˜
  1099. ๋กœ๋“œ๋“ค์— ์•ž์„ธ์šธ ํ•„์š”๋Š” ์—†๋‹ค๋Š” ์‚ฌ์‹ค์—์„œ ๊ธฐ์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ง์€ cpu3() ๋Š” cpu0() ์˜
  1100. u ๋กœ์˜ ์Šคํ† ์–ด๋ฅผ cpu1() ์˜ v ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ ๋’ค์— ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š”
  1101. ๋œป์ž…๋‹ˆ๋‹ค, cpu0() ์™€ cpu1() ์€ ์ด ๋‘ ์˜คํผ๋ ˆ์ด์…˜์ด ์˜๋„๋œ ์ˆœ์„œ๋Œ€๋กœ ์ผ์–ด๋‚ฌ์Œ์—
  1102. ๋ชจ๋‘ ๋™์˜ํ•˜๋Š”๋ฐ๋„ ๋ง์ž…๋‹ˆ๋‹ค.
  1103. ํ•˜์ง€๋งŒ, smp_load_acquire() ๋Š” ๋งˆ์ˆ ์ด ์•„๋‹˜์„ ๋ช…์‹ฌํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ,
  1104. ์ด ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ ์ˆœ์„œ ๊ทœ์น™์„ ์ง€ํ‚ค๋ฉฐ ์ธ์ž๋กœ๋ถ€ํ„ฐ์˜ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€
  1105. ์–ด๋–ค ํŠน์ •ํ•œ ๊ฐ’์ด ์ฝํž ๊ฒƒ์ธ์ง€๋Š” ๋ณด์žฅํ•˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-. ๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋„
  1106. ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  1107. r0 == 0 && r1 == 0 && r2 == 0 && r5 == 0
  1108. ์ด๋Ÿฐ ๊ฒฐ๊ณผ๋Š” ์–ด๋–ค ๊ฒƒ๋„ ์žฌ๋ฐฐ์น˜ ๋˜์ง€ ์•Š๋Š”, ์ˆœ์ฐจ์  ์ผ๊ด€์„ฑ์„ ๊ฐ€์ง„ ๊ฐ€์ƒ์˜
  1109. ์‹œ์Šคํ…œ์—์„œ๋„ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ด ๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  1110. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋‹น์‹ ์˜ ์ฝ”๋“œ๊ฐ€ ๊ธ€๋กœ๋ฒŒ ์ดํ–‰์„ฑ์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด, ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋ฅผ
  1111. ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  1112. ==================
  1113. ๋ช…์‹œ์  ์ปค๋„ ๋ฐฐ๋ฆฌ์–ด
  1114. ==================
  1115. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๊ณ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฐ๋ฆฌ์–ด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1116. (*) ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด.
  1117. (*) CPU ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  1118. (*) MMIO ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด.
  1119. ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด
  1120. ---------------
  1121. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ๋Š” ๋ช…์‹œ์ ์ธ
  1122. ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1123. barrier();
  1124. ์ด๊ฑด ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด์ž…๋‹ˆ๋‹ค -- barrier() ์˜ ์ฝ๊ธฐ-์ฝ๊ธฐ ๋‚˜ ์“ฐ๊ธฐ-์“ฐ๊ธฐ ๋ณ€์ข…์€ ์—†์Šต๋‹ˆ๋‹ค.
  1125. ํ•˜์ง€๋งŒ, READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ํŠน์ • ์•ก์„ธ์Šค๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ๋™์ž‘ํ•˜๋Š”
  1126. barrier() ์˜ ์™„ํ™”๋œ ํ˜•ํƒœ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1127. barrier() ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค:
  1128. (*) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ barrier() ๋’ค์˜ ์•ก์„ธ์Šค๋“ค์ด barrier() ์•ž์˜ ์•ก์„ธ์Šค๋ณด๋‹ค ์•ž์œผ๋กœ
  1129. ์žฌ๋ฐฐ์น˜๋˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ ์ฝ”๋“œ์™€ ์ธํ„ฐ๋ŸฝํŠธ ๋‹นํ•œ
  1130. ์ฝ”๋“œ ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ์‹ ์ค‘ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1131. (*) ๋ฃจํ”„์—์„œ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฃจํ”„ ์กฐ๊ฑด์— ์‚ฌ์šฉ๋œ ๋ณ€์ˆ˜๋ฅผ ๋งค ์ดํ„ฐ๋ ˆ์ด์…˜๋งˆ๋‹ค
  1132. ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋กœ๋“œํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ์ตœ์ ํ™” ํ•˜๋Š”๊ฑธ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  1133. READ_ONCE() ์™€ WRITE_ONCE() ํ•จ์ˆ˜๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ๋Š” ๋ฌธ์ œ ์—†์ง€๋งŒ ๋™์‹œ์„ฑ์ด
  1134. ์žˆ๋Š” ์ฝ”๋“œ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ตœ์ ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฅ˜์˜ ์ตœ์ ํ™”์—
  1135. ๋Œ€ํ•œ ์˜ˆ๋ฅผ ๋ช‡๊ฐ€์ง€ ๋“ค์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  1136. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ™์€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ๊ณ , ์–ด๋–ค
  1137. ๊ฒฝ์šฐ์—๋Š” CPU๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๋“ค์„ ์žฌ๋ฐฐ์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š”
  1138. ๋‹ค์Œ์˜ ์ฝ”๋“œ๊ฐ€:
  1139. a[0] = x;
  1140. a[1] = x;
  1141. x ์˜ ์˜ˆ์ „ ๊ฐ’์ด a[1] ์—, ์ƒˆ ๊ฐ’์ด a[0] ์— ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  1142. ์ปดํŒŒ์ผ๋Ÿฌ์™€ CPU๊ฐ€ ์ด๋Ÿฐ ์ผ์„ ๋ชปํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  1143. a[0] = READ_ONCE(x);
  1144. a[1] = READ_ONCE(x);
  1145. ์ฆ‰, READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ์—ฌ๋Ÿฌ CPU ์—์„œ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜์— ๊ฐ€ํ•ด์ง€๋Š”
  1146. ์•ก์„ธ์Šค๋“ค์— ์บ์‹œ ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  1147. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ™์€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์—ฐ์†์ ์ธ ๋กœ๋“œ๋“ค์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ
  1148. ๋ณ‘ํ•ฉ ์ž‘์—…์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ:
  1149. while (tmp = a)
  1150. do_something_with(tmp);
  1151. ๋‹ค์Œ๊ณผ ๊ฐ™์ด, ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ๋Š” ๋ง์ด ๋˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž์˜ ์˜๋„์™€ ์ „ํ˜€ ๋งž์ง€
  1152. ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ "์ตœ์ ํ™”" ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1153. if (tmp = a)
  1154. for (;;)
  1155. do_something_with(tmp);
  1156. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋Ÿฐ ์ง“์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด READ_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1157. while (tmp = READ_ONCE(a))
  1158. do_something_with(tmp);
  1159. (*) ์˜ˆ์ปจ๋Œ€ ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์•„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ์— ๋‹ด์„ ์ˆ˜
  1160. ์—†๋Š” ๊ฒฝ์šฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š”
  1161. ์•ž์˜ ์˜ˆ์—์„œ ๋ณ€์ˆ˜ 'tmp' ์‚ฌ์šฉ์„ ์ตœ์ ํ™”๋กœ ์—†์• ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1162. while (tmp = a)
  1163. do_something_with(tmp);
  1164. ์ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์—์„œ๋Š” ์™„๋ฒฝํ•˜์ง€๋งŒ ๋™์‹œ์„ฑ์ด ์กด์žฌํ•˜๋Š”
  1165. ๊ฒฝ์šฐ์—” ์น˜๋ช…์ ์ธ ์ฝ”๋“œ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1166. while (a)
  1167. do_something_with(a);
  1168. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ตœ์ ํ™”๋œ ์ด ์ฝ”๋“œ๋Š” ๋ณ€์ˆ˜ a ๊ฐ€ ๋‹ค๋ฅธ CPU ์— ์˜ํ•ด "while" ๋ฌธ๊ณผ
  1169. do_something_with() ํ˜ธ์ถœ ์‚ฌ์ด์— ๋ฐ”๋€Œ์–ด do_something_with() ์— 0์„ ๋„˜๊ธธ
  1170. ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  1171. ์ด๋ฒˆ์—๋„, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋Ÿฐ ์ง“์„ ํ•˜๋Š”๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•ด READ_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1172. while (tmp = READ_ONCE(a))
  1173. do_something_with(tmp);
  1174. ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋ถ€์กฑํ•œ ์ƒํ™ฉ์„ ๊ฒช๋Š” ๊ฒฝ์šฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” tmp ๋ฅผ ์Šคํƒ์— ์ €์žฅํ•ด๋‘˜ ์ˆ˜๋„
  1175. ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ์ฝ์–ด๋“ค์ด๋Š”๊ฑด ์ด๋ ‡๊ฒŒ ์ €์žฅํ•ด๋‘๊ณ  ํ›„์— ๋‹ค์‹œ
  1176. ์ฝ์–ด๋“ค์ด๋Š”๋ฐ ๋“œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š”๊ฒŒ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ
  1177. ์ฝ”๋“œ์—์„œ๋Š” ์•ˆ์ „ํ•˜๋ฏ€๋กœ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ง์ ‘ ์•Œ๋ ค์ค˜์•ผ
  1178. ํ•ฉ๋‹ˆ๋‹ค.
  1179. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ ๊ฐ’์ด ๋ฌด์—‡์ผ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋กœ๋“œ๋ฅผ ์•„์˜ˆ ์•ˆํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  1180. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ์ฝ”๋“œ๋Š” ๋ณ€์ˆ˜ 'a' ์˜ ๊ฐ’์ด ํ•ญ์ƒ 0์ž„์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด:
  1181. while (tmp = a)
  1182. do_something_with(tmp);
  1183. ์ด๋ ‡๊ฒŒ ์ตœ์ ํ™” ๋˜์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1184. do { } while (0);
  1185. ์ด ๋ณ€ํ™˜์€ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ๋Š” ๋„์›€์ด ๋˜๋Š”๋ฐ ๋กœ๋“œ์™€ ๋ธŒ๋žœ์น˜๋ฅผ ์ œ๊ฑฐํ–ˆ๊ธฐ
  1186. ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 'a' ์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š”๊ฑด ํ˜„์žฌ์˜ CPU ํ•˜๋‚˜
  1187. ๋ฟ์ด๋ผ๋Š” ๊ฐ€์ • ์œ„์—์„œ ์ฆ๋ช…์„ ํ–ˆ๋‹ค๋Š”๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ณ€์ˆ˜ 'a' ๊ฐ€ ๊ณต์œ ๋˜์–ด
  1188. ์žˆ๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฆ๋ช…์€ ํ‹€๋ฆฐ ๊ฒƒ์ด ๋ ๊ฒ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ ์ž์‹ ์ด
  1189. ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋งŒํผ ๋งŽ์€ ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€ ๋ชปํ•จ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด
  1190. READ_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1191. while (tmp = READ_ONCE(a))
  1192. do_something_with(tmp);
  1193. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” READ_ONCE() ๋’ค์— ๋‚˜์˜ค๋Š” ๊ฐ’์— ๋Œ€ํ•ด์„œ๋„ ๋ˆˆ๊ธธ์„ ๋‘๊ณ  ์žˆ์Œ์„
  1194. ๊ธฐ์–ตํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ์ฝ”๋“œ์—์„œ MAX ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ๋งคํฌ๋กœ๋กœ, 1์˜ ๊ฐ’์„
  1195. ๊ฐ–๋Š”๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค:
  1196. while ((tmp = READ_ONCE(a)) % MAX)
  1197. do_something_with(tmp);
  1198. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” MAX ๋ฅผ ๊ฐ€์ง€๊ณ  ์ˆ˜ํ–‰๋˜๋Š” "%" ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ
  1199. 0์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‹ค์งˆ์ ์œผ๋กœ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”
  1200. ๊ฒƒ์ฒ˜๋Ÿผ ์ตœ์ ํ™” ํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์–ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ('a' ๋ณ€์ˆ˜์˜ ๋กœ๋“œ๋Š” ์—ฌ์ „ํžˆ
  1201. ํ–‰ํ•ด์งˆ ๊ฒ๋‹ˆ๋‹ค.)
  1202. (*) ๋น„์Šทํ•˜๊ฒŒ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅํ•˜๋ ค ํ•˜๋Š” ๊ฐ’์„ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„
  1203. ์•Œ๋ฉด ์Šคํ† ์–ด ์ž์ฒด๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋„, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ˜„์žฌ์˜ CPU
  1204. ๋งŒ์ด ๊ทธ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์“ฐ๋Š” ์˜ค๋กœ์ง€ ํ•˜๋‚˜์˜ ์กด์žฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๊ณต์œ ๋œ ๋ณ€์ˆ˜์—
  1205. ๋Œ€ํ•ด์„œ๋Š” ์ž˜๋ชป๋œ ์ผ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜
  1206. ์žˆ์Šต๋‹ˆ๋‹ค:
  1207. a = 0;
  1208. ... ๋ณ€์ˆ˜ a ์— ์Šคํ† ์–ด๋ฅผ ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ...
  1209. a = 0;
  1210. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณ€์ˆ˜ 'a' ์˜ ๊ฐ’์€ ์ด๋ฏธ 0์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ , ๋”ฐ๋ผ์„œ ๋‘๋ฒˆ์งธ ์Šคํ† ์–ด๋ฅผ
  1211. ์‚ญ์ œํ•  ๊ฒ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ CPU ๊ฐ€ ๊ทธ ์‚ฌ์ด ๋ณ€์ˆ˜ 'a' ์— ๋‹ค๋ฅธ ๊ฐ’์„ ์ผ๋‹ค๋ฉด
  1212. ํ™ฉ๋‹นํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฒ๋‹ˆ๋‹ค.
  1213. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋Ÿฐ ์ž˜๋ชป๋œ ์ถ”์ธก์„ ํ•˜์ง€ ์•Š๋„๋ก WRITE_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1214. WRITE_ONCE(a, 0);
  1215. ... ๋ณ€์ˆ˜ a ์— ์Šคํ† ์–ด๋ฅผ ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ...
  1216. WRITE_ONCE(a, 0);
  1217. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•˜์ง€ ๋ง๋ผ๊ณ  ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์„ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜
  1218. ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ํ”„๋กœ์„ธ์Šค ๋ ˆ๋ฒจ ์ฝ”๋“œ์™€ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ ์‚ฌ์ด์˜
  1219. ์ƒํ˜ธ์ž‘์šฉ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  1220. void process_level(void)
  1221. {
  1222. msg = get_message();
  1223. flag = true;
  1224. }
  1225. void interrupt_handler(void)
  1226. {
  1227. if (flag)
  1228. process_message(msg);
  1229. }
  1230. ์ด ์ฝ”๋“œ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ process_level() ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„
  1231. ์ˆ˜๋‹จ์ด ์—†๊ณ , ์ด๋Ÿฐ ๋ณ€ํ™˜์€ ์‹ฑ๊ธ€์“ฐ๋ ˆ๋“œ์—์„œ๋ผ๋ฉด ์‹ค์ œ๋กœ ํ›Œ๋ฅญํ•œ ์„ ํƒ์ผ ์ˆ˜
  1232. ์žˆ์Šต๋‹ˆ๋‹ค:
  1233. void process_level(void)
  1234. {
  1235. flag = true;
  1236. msg = get_message();
  1237. }
  1238. ์ด ๋‘๊ฐœ์˜ ๋ฌธ์žฅ ์‚ฌ์ด์— ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, interrupt_handler() ๋Š” ์˜๋ฏธ๋ฅผ
  1239. ์•Œ ์ˆ˜ ์—†๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด
  1240. WRITE_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1241. void process_level(void)
  1242. {
  1243. WRITE_ONCE(msg, get_message());
  1244. WRITE_ONCE(flag, true);
  1245. }
  1246. void interrupt_handler(void)
  1247. {
  1248. if (READ_ONCE(flag))
  1249. process_message(READ_ONCE(msg));
  1250. }
  1251. interrupt_handler() ์•ˆ์—์„œ๋„ ์ค‘์ฒฉ๋œ ์ธํ„ฐ๋ŸฝํŠธ๋‚˜ NMI ์™€ ๊ฐ™์ด ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ
  1252. ์—ญ์‹œ 'flag' ์™€ 'msg' ์— ์ ‘๊ทผํ•˜๋Š” ๋˜๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€์— ์ธํ„ฐ๋ŸฝํŠธ ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด
  1253. READ_ONCE() ์™€ WRITE_ONCE() ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ๊ธฐ์–ตํ•ด ๋‘์„ธ์š”. ๋งŒ์•ฝ ๊ทธ๋Ÿฐ
  1254. ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๋ฉด, interrupt_handler() ์•ˆ์—์„œ๋Š” ๋ฌธ์„œํ™” ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ๋ฉด
  1255. READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ํ•„์š”์น˜ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทผ๋ž˜์˜ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์—์„œ
  1256. ์ค‘์ฒฉ๋œ ์ธํ„ฐ๋ŸฝํŠธ๋Š” ๋ณดํ†ต ์ž˜ ์ผ์–ด๋‚˜์ง€ ์•Š์Œ๋„ ๊ธฐ์–ตํ•ด ๋‘์„ธ์š”, ์‹ค์ œ๋กœ, ์–ด๋–ค
  1257. ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ฑ„๋กœ ๋ฆฌํ„ดํ•˜๋ฉด WARN_ONCE() ๊ฐ€
  1258. ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.)
  1259. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” READ_ONCE() ์™€ WRITE_ONCE() ๋’ค์˜ READ_ONCE() ๋‚˜ WRITE_ONCE(),
  1260. barrier(), ๋˜๋Š” ๋น„์Šทํ•œ ๊ฒƒ๋“ค์„ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์›€์ง์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ
  1261. ๊ฐ€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1262. ์ด ํšจ๊ณผ๋Š” barrier() ๋ฅผ ํ†ตํ•ด์„œ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, READ_ONCE() ์™€
  1263. WRITE_ONCE() ๊ฐ€ ์ข€ ๋” ์•ˆ๋ชฉ ๋†’์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค: READ_ONCE() ์™€ WRITE_ONCE()๋Š”
  1264. ์ปดํŒŒ์ผ๋Ÿฌ์— ์ฃผ์–ด์ง„ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•ด์„œ๋งŒ ์ตœ์ ํ™” ๊ฐ€๋Šฅ์„ฑ์„ ํฌ๊ธฐํ•˜๋„๋ก
  1265. ํ•˜์ง€๋งŒ, barrier() ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๊ธฐ๊ณ„์˜ ๋ ˆ์ง€์Šคํ„ฐ์— ์บ์‹œํ•ด ๋†“์€
  1266. ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๊ฐ’์„ ๋ฒ„๋ ค์•ผ ํ•˜๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์ปดํŒŒ์ผ๋Ÿฌ๋Š”
  1267. READ_ONCE() ์™€ WRITE_ONCE() ๊ฐ€ ์ผ์–ด๋‚œ ์ˆœ์„œ๋„ ์ง€์ผœ์ค๋‹ˆ๋‹ค, CPU ๋Š” ๋‹น์—ฐํžˆ
  1268. ๊ทธ ์ˆœ์„œ๋ฅผ ์ง€ํ‚ฌ ์˜๋ฌด๊ฐ€ ์—†์ง€๋งŒ์š”.
  1269. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ์˜ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด ๋ณ€์ˆ˜์—์˜ ์Šคํ† ์–ด๋ฅผ ๋‚ ์กฐํ•ด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1270. if (a)
  1271. b = a;
  1272. else
  1273. b = 42;
  1274. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ตœ์ ํ™”๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ์ค„์ผ ๊ฒ๋‹ˆ๋‹ค:
  1275. b = 42;
  1276. if (a)
  1277. b = a;
  1278. ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ ์ด ์ตœ์ ํ™”๋Š” ์•ˆ์ „ํ•  ๋ฟ ์•„๋‹ˆ๋ผ ๋ธŒ๋žœ์น˜ ๊ฐฏ์ˆ˜๋ฅผ
  1279. ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„, ๋™์‹œ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ์—์„œ๋Š” ์ด ์ตœ์ ํ™”๋Š” ๋‹ค๋ฅธ
  1280. CPU ๊ฐ€ 'b' ๋ฅผ ๋กœ๋“œํ•  ๋•Œ, -- 'a' ๊ฐ€ 0์ด ์•„๋‹Œ๋ฐ๋„ -- ๊ฐ€์งœ์ธ ๊ฐ’, 42๋ฅผ ๋ณด๊ฒŒ
  1281. ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด WRITE_ONCE() ๋ฅผ
  1282. ์‚ฌ์šฉํ•˜์„ธ์š”:
  1283. if (a)
  1284. WRITE_ONCE(b, a);
  1285. else
  1286. WRITE_ONCE(b, 42);
  1287. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋กœ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€
  1288. ์•Š์ง€๋งŒ, ์บ์‹œ ๋ผ์ธ ๋ฐ”์šด์‹ฑ์„ ์ผ์œผ์ผœ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1289. ๋‚ ์กฐ๋œ ๋กœ๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„  READ_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  1290. (*) ์ •๋ ฌ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์œ„์น˜ํ•œ, ํ•œ๋ฒˆ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ์•ก์„ธ์Šค
  1291. ๊ฐ€๋Šฅํ•œ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ํฐ ์•ก์„ธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์€ ์•ก์„ธ์Šค๋“ค๋กœ
  1292. ๋Œ€์ฒด๋˜๋Š” "๋กœ๋“œ ํ‹ฐ์–ด๋ง(load tearing)" ๊ณผ "์Šคํ† ์–ด ํ‹ฐ์–ด๋ง(store tearing)" ์„
  1293. ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ์–ด์ง„ ์•„ํ‚คํ…์ณ๊ฐ€ 7-bit imeediate field ๋ฅผ ๊ฐ–๋Š”
  1294. 16-bit ์Šคํ† ์–ด ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์ œ๊ณตํ•œ๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ์˜ 32-bit ์Šคํ† ์–ด๋ฅผ
  1295. ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์— ๋‘๊ฐœ์˜ 16-bit store-immediate ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ ค ํ• ๊ฒ๋‹ˆ๋‹ค:
  1296. p = 0x00010002;
  1297. ์Šคํ† ์–ด ํ•  ์ƒ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ’์„ ์Šคํ† ์–ด ํ•˜๊ธฐ ์œ„ํ•ด ๋‘๊ฐœ๊ฐ€ ๋„˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์„
  1298. ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”, ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ตœ์ ํ™”๋ฅผ GCC ๋Š” ์‹ค์ œ๋กœ ํ•จ์„ ๋ถ€๋”” ์•Œ์•„ ๋‘์‹ญ์‹œ์˜ค.
  1299. ์ด ์ตœ์ ํ™”๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ๋Š” ์„ฑ๊ณต์ ์ธ ์ตœ์ ํ™” ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ๊ทผ๋ž˜์—
  1300. ๋ฐœ์ƒํ•œ (๊ทธ๋ฆฌ๊ณ  ๊ณ ์ณ์ง„) ๋ฒ„๊ทธ๋Š” GCC ๊ฐ€ volatile ์Šคํ† ์–ด์— ๋น„์ •์ƒ์ ์œผ๋กœ ์ด
  1301. ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ฒ„๊ทธ๊ฐ€ ์—†๋‹ค๋ฉด, ๋‹ค์Œ์˜ ์˜ˆ์—์„œ
  1302. WRITE_ONCE() ์˜ ์‚ฌ์šฉ์€ ์Šคํ† ์–ด ํ‹ฐ์–ด๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค:
  1303. WRITE_ONCE(p, 0x00010002);
  1304. Packed ๊ตฌ์กฐ์ฒด์˜ ์‚ฌ์šฉ ์—ญ์‹œ ๋‹ค์Œ์˜ ์˜ˆ์ฒ˜๋Ÿผ ๋กœ๋“œ / ์Šคํ† ์–ด ํ‹ฐ์–ด๋ง์„ ์œ ๋ฐœํ•  ์ˆ˜
  1305. ์žˆ์Šต๋‹ˆ๋‹ค:
  1306. struct __attribute__((__packed__)) foo {
  1307. short a;
  1308. int b;
  1309. short c;
  1310. };
  1311. struct foo foo1, foo2;
  1312. ...
  1313. foo2.a = foo1.a;
  1314. foo2.b = foo1.b;
  1315. foo2.c = foo1.c;
  1316. READ_ONCE() ๋‚˜ WRITE_ONCE() ๋„ ์—†๊ณ  volatile ๋งˆํ‚น๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์—,
  1317. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ์„ธ๊ฐœ์˜ ๋Œ€์ž…๋ฌธ์„ ๋‘๊ฐœ์˜ 32-bit ๋กœ๋“œ์™€ ๋‘๊ฐœ์˜ 32-bit ์Šคํ† ์–ด๋กœ
  1318. ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” 'foo1.b' ์˜ ๊ฐ’์˜ ๋กœ๋“œ ํ‹ฐ์–ด๋ง๊ณผ 'foo2.b' ์˜
  1319. ์Šคํ† ์–ด ํ‹ฐ์–ด๋ง์„ ์ดˆ๋ž˜ํ•  ๊ฒ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋„ READ_ONCE() ์™€ WRITE_ONCE()
  1320. ๊ฐ€ ํ‹ฐ์–ด๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1321. foo2.a = foo1.a;
  1322. WRITE_ONCE(foo2.b, READ_ONCE(foo1.b));
  1323. foo2.c = foo1.c;
  1324. ๊ทธ๋ ‡์ง€๋งŒ, volatile ๋กœ ๋งˆํฌ๋œ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” READ_ONCE() ์™€ WRITE_ONCE() ๊ฐ€
  1325. ํ•„์š”์น˜ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 'jiffies' ๋Š” volatile ๋กœ ๋งˆํฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
  1326. READ_ONCE(jiffies) ๋ผ๊ณ  ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. READ_ONCE() ์™€ WRITE_ONCE() ๊ฐ€
  1327. ์‹ค์€ volatile ์บ์ŠคํŒ…์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์„œ ์ธ์ž๊ฐ€ ์ด๋ฏธ volatile ๋กœ ๋งˆํฌ๋˜์–ด
  1328. ์žˆ๋‹ค๋ฉด ๋˜๋‹ค๋ฅธ ํšจ๊ณผ๋ฅผ ๋‚ด์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  1329. ์ด ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ CPU ์—๋Š” ์ง์ ‘์  ํšจ๊ณผ๋ฅผ ์ „ํ˜€ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ตญ์€
  1330. ์žฌ๋ฐฐ์น˜๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ์Œ์„ ๋ถ€๋”” ๊ธฐ์–ตํ•ด ๋‘์‹ญ์‹œ์˜ค.
  1331. CPU ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด
  1332. -----------------
  1333. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ๋‹ค์Œ์˜ ์—ฌ๋Ÿ๊ฐœ ๊ธฐ๋ณธ CPU ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1334. TYPE MANDATORY SMP CONDITIONAL
  1335. =============== ======================= ===========================
  1336. ๋ฒ”์šฉ mb() smp_mb()
  1337. ์“ฐ๊ธฐ wmb() smp_wmb()
  1338. ์ฝ๊ธฐ rmb() smp_rmb()
  1339. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ read_barrier_depends() smp_read_barrier_depends()
  1340. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ
  1341. ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—์˜ ์ถ”๊ฐ€์ ์ธ ์ˆœ์„œ ๋ณด์žฅ์„ ํฌํ•จํ•˜์ง€
  1342. ์•Š์Šต๋‹ˆ๋‹ค.
  1343. ๋ฐฉ๋ฐฑ: ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ด๋‹น ๋กœ๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์ผ์œผํ‚ฌ
  1344. ๊ฒƒ์œผ๋กœ (์˜ˆ: `a[b]` ๋Š” a[b] ๋ฅผ ๋กœ๋“œ ํ•˜๊ธฐ ์ „์— b ์˜ ๊ฐ’์„ ๋จผ์ € ๋กœ๋“œํ•œ๋‹ค)
  1345. ๊ธฐ๋Œ€๋˜์ง€๋งŒ, C ์–ธ์–ด ์‚ฌ์–‘์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ b ์˜ ๊ฐ’์„ ์ถ”์ธก (์˜ˆ: 1 ๊ณผ ๊ฐ™์Œ) ํ•ด์„œ
  1346. b ๋กœ๋“œ ์ „์— a ๋กœ๋“œ๋ฅผ ํ•˜๋Š” ์ฝ”๋“œ (์˜ˆ: tmp = a[1]; if (b != 1) tmp = a[b]; ) ๋ฅผ
  1347. ๋งŒ๋“ค์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๋‚ด์šฉ ๊ฐ™์€ ๊ฑด ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” a[b] ๋ฅผ ๋กœ๋“œํ•œ
  1348. ํ›„์— b ๋ฅผ ๋˜๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ, a[b] ๋ณด๋‹ค ์ตœ์‹  ๋ฒ„์ „์˜ b ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜๋„
  1349. ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์˜ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•œ ์˜๊ฒฌ ์ผ์น˜๋Š” ์•„์ง ์—†์Šต๋‹ˆ๋‹ค๋งŒ, ์ผ๋‹จ
  1350. READ_ONCE() ๋งคํฌ๋กœ๋ถ€ํ„ฐ ๋ณด๊ธฐ ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ์ข‹์€ ์‹œ์ž‘์ด ๋ ๊ฒ๋‹ˆ๋‹ค.
  1351. SMP ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ์œ ๋‹ˆํ”„๋กœ์„ธ์„œ๋กœ ์ปดํŒŒ์ผ๋œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋กœ
  1352. ๋ฐ”๋€Œ๋Š”๋ฐ, ํ•˜๋‚˜์˜ CPU ๋Š” ์Šค์Šค๋กœ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ๊ฒน์น˜๋Š” ์•ก์„ธ์Šค๋“ค ์—ญ์‹œ ์˜ฌ๋ฐ”๋ฅธ
  1353. ์ˆœ์„œ๋กœ ํ–‰ํ•ด์งˆ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์•„๋ž˜์˜ "Virtual Machine
  1354. Guests" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  1355. [!] SMP ์‹œ์Šคํ…œ์—์„œ ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ๋กœ์˜ ์ ‘๊ทผ๋“ค์„ ์ˆœ์„œ ์„ธ์›Œ์•ผ ํ•  ๋•Œ, SMP ๋ฉ”๋ชจ๋ฆฌ
  1356. ๋ฐฐ๋ฆฌ์–ด๋Š” _๋ฐ˜๋“œ์‹œ_ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•จ์„ ๊ธฐ์–ตํ•˜์„ธ์š”, ๊ทธ๋Œ€์‹  ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋„
  1357. ์ถฉ๋ถ„ํ•˜๊ธด ํ•˜์ง€๋งŒ ๋ง์ด์ฃ .
  1358. Mandatory ๋ฐฐ๋ฆฌ์–ด๋“ค์€ SMP ์‹œ์Šคํ…œ์—์„œ๋„ UP ์‹œ์Šคํ…œ์—์„œ๋„ SMP ํšจ๊ณผ๋งŒ ํ†ต์ œํ•˜๊ธฐ์—๋Š”
  1359. ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— SMP ํšจ๊ณผ๋งŒ ํ†ต์ œํ•˜๋ฉด ๋˜๋Š” ๊ณณ์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ
  1360. ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋Š์Šจํ•œ ์ˆœ์„œ ๊ทœ์น™์˜ ๋ฉ”๋ชจ๋ฆฌ I/O ์œˆ๋„์šฐ๋ฅผ ํ†ตํ•œ MMIO ์˜ ํšจ๊ณผ๋ฅผ
  1361. ํ†ต์ œํ•  ๋•Œ์—๋Š” mandatory ๋ฐฐ๋ฆฌ์–ด๋“ค์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฐ๋ฆฌ์–ด๋“ค์€
  1362. ์ปดํŒŒ์ผ๋Ÿฌ์™€ CPU ๋ชจ๋‘ ์žฌ๋ฐฐ์น˜๋ฅผ ๋ชปํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ๋””๋ฐ”์ด์Šค์—
  1363. ๋ณด์—ฌ์ง€๋Š” ์ˆœ์„œ์—๋„ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, SMP ๊ฐ€ ์•„๋‹Œ ์‹œ์Šคํ…œ์ด๋ผ ํ• ์ง€๋ผ๋„ ํ•„์š”ํ•  ์ˆ˜
  1364. ์žˆ์Šต๋‹ˆ๋‹ค.
  1365. ์ผ๋ถ€ ๊ณ ๊ธ‰ ๋ฐฐ๋ฆฌ์–ด ํ•จ์ˆ˜๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1366. (*) smp_store_mb(var, value)
  1367. ์ด ํ•จ์ˆ˜๋Š” ํŠน์ • ๋ณ€์ˆ˜์— ํŠน์ • ๊ฐ’์„ ๋Œ€์ž…ํ•˜๊ณ  ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์นฉ๋‹ˆ๋‹ค.
  1368. UP ์ปดํŒŒ์ผ์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋ณด๋‹ค ๋”ํ•œ ๊ฒƒ์„ ์นœ๋‹ค๊ณ ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1369. (*) smp_mb__before_atomic();
  1370. (*) smp_mb__after_atomic();
  1371. ์ด๊ฒƒ๋“ค์€ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๋Š” (๋”ํ•˜๊ธฐ, ๋นผ๊ธฐ, ์ฆ๊ฐ€, ๊ฐ์†Œ์™€ ๊ฐ™์€) ์–ดํ† ๋ฏน
  1372. ํ•จ์ˆ˜๋“ค์„ ์œ„ํ•œ, ํŠนํžˆ ๊ทธ๊ฒƒ๋“ค์ด ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ…์— ์‚ฌ์šฉ๋  ๋•Œ๋ฅผ ์œ„ํ•œ
  1373. ํ•จ์ˆ˜๋“ค์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  1374. ์ด๊ฒƒ๋“ค์€ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š์œผ๋ฉฐ ์–ดํ† ๋ฏนํ•œ (set_bit ๊ณผ clear_bit ๊ฐ™์€) ๋น„ํŠธ
  1375. ์—ฐ์‚ฐ์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1376. ํ•œ ์˜ˆ๋กœ, ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ๋ฌดํšจํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ๊ทธ ๊ฐ์ฒด์˜ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ๋ฅผ
  1377. ๊ฐ์†Œ์‹œํ‚ค๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด์„ธ์š”:
  1378. obj->dead = 1;
  1379. smp_mb__before_atomic();
  1380. atomic_dec(&obj->ref_count);
  1381. ์ด ์ฝ”๋“œ๋Š” ๊ฐ์ฒด์˜ ์—…๋ฐ์ดํŠธ๋œ death ๋งˆํฌ๊ฐ€ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํ„ฐ ๊ฐ์†Œ ๋™์ž‘
  1382. *์ „์—* ๋ณด์ผ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  1383. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  Documentation/atomic_ops.txt ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  1384. ์–ด๋””์„œ ์ด๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด "์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜" ์„œ๋ธŒ์„น์…˜์„
  1385. ์ฐธ๊ณ ํ•˜์„ธ์š”.
  1386. (*) lockless_dereference();
  1387. ์ด ํ•จ์ˆ˜๋Š” smp_read_barrier_depends() ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”
  1388. ํฌ์ธํ„ฐ ์ฝ์–ด์˜ค๊ธฐ ๋ž˜ํผ(wrapper) ํ•จ์ˆ˜๋กœ ์ƒ๊ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1389. ๊ฐ์ฒด์˜ ๋ผ์ดํ”„ํƒ€์ž„์ด RCU ์™ธ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด
  1390. rcu_dereference() ์™€๋„ ์œ ์‚ฌํ•œ๋ฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด ๊ฐ์ฒด๊ฐ€ ์‹œ์Šคํ…œ์ด ๊บผ์งˆ ๋•Œ์—๋งŒ
  1391. ์ œ๊ฑฐ๋˜๋Š” ๊ฒฝ์šฐ ๋“ฑ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, lockless_dereference() ์€ RCU ์™€ ํ•จ๊ป˜
  1392. ์‚ฌ์šฉ๋ ์ˆ˜๋„, RCU ์—†์ด ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋Š” ์ผ๋ถ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์‚ฌ์šฉ๋˜๊ณ 
  1393. ์žˆ์Šต๋‹ˆ๋‹ค.
  1394. (*) dma_wmb();
  1395. (*) dma_rmb();
  1396. ์ด๊ฒƒ๋“ค์€ CPU ์™€ DMA ๊ฐ€๋Šฅํ•œ ๋””๋ฐ”์ด์Šค์—์„œ ๋ชจ๋‘ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜
  1397. ์ฝ๊ธฐ, ์“ฐ๊ธฐ ์ž‘์—…๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด consistent memory ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ
  1398. ์œ„ํ•œ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.
  1399. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋””๋ฐ”์ด์Šค์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ, ๋””์Šคํฌ๋ฆฝํ„ฐ ์ƒํƒœ ๊ฐ’์„ ์‚ฌ์šฉํ•ด
  1400. ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋””๋ฐ”์ด์Šค์— ์†ํ•ด ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด CPU ์— ์†ํ•ด ์žˆ๋Š”์ง€ ํ‘œ์‹œํ•˜๊ณ ,
  1401. ๊ณต์ง€์šฉ ์ดˆ์ธ์ข…(doorbell) ์„ ์‚ฌ์šฉํ•ด ์—…๋ฐ์ดํŠธ๋œ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋””๋ฐ”์ด์Šค์— ์‚ฌ์šฉ
  1402. ๊ฐ€๋Šฅํ•ด์กŒ์Œ์„ ๊ณต์ง€ํ•˜๋Š” ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  1403. if (desc->status != DEVICE_OWN) {
  1404. /* ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์†Œ์œ ํ•˜๊ธฐ ์ „์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ์•Š์Œ */
  1405. dma_rmb();
  1406. /* ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์”€ */
  1407. read_data = desc->data;
  1408. desc->data = write_data;
  1409. /* ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ „ ์ˆ˜์ •์‚ฌํ•ญ์„ ๋ฐ˜์˜ */
  1410. dma_wmb();
  1411. /* ์†Œ์œ ๊ถŒ์„ ์ˆ˜์ • */
  1412. desc->status = DEVICE_OWN;
  1413. /* MMIO ๋ฅผ ํ†ตํ•ด ๋””๋ฐ”์ด์Šค์— ๊ณต์ง€๋ฅผ ํ•˜๊ธฐ ์ „์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™๊ธฐํ™” */
  1414. wmb();
  1415. /* ์—…๋ฐ์ดํŠธ๋œ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ๋””๋ฐ”์ด์Šค์— ๊ณต์ง€ */
  1416. writel(DESC_NOTIFY, doorbell);
  1417. }
  1418. dma_rmb() ๋Š” ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๊ธฐ ์ „์— ๋””๋ฐ”์ด์Šค๊ฐ€ ์†Œ์œ ๊ถŒ์„
  1419. ๋‚ด๋†“์•˜์Œ์„ ๋ณด์žฅํ•˜๊ฒŒ ํ•˜๊ณ , dma_wmb() ๋Š” ๋””๋ฐ”์ด์Šค๊ฐ€ ์ž์‹ ์ด ์†Œ์œ ๊ถŒ์„ ๋‹ค์‹œ
  1420. ๊ฐ€์กŒ์Œ์„ ๋ณด๊ธฐ ์ „์— ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์“ฐ์˜€์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. wmb() ๋Š”
  1421. ์บ์‹œ ์ผ๊ด€์„ฑ์ด ์—†๋Š” (cache incoherent) MMIO ์˜์—ญ์— ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์ „์—
  1422. ์บ์‹œ ์ผ๊ด€์„ฑ์ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ (cache coherent memory) ์“ฐ๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Œ์„
  1423. ๋ณด์žฅํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  1424. consistent memory ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์œ„ํ•ด์„  Documentation/DMA-API.txt
  1425. ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  1426. MMIO ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด
  1427. ----------------
  1428. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ๋˜ํ•œ memory-mapped I/O ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ๋ฐฐ๋ฆฌ์–ด๋„ ๊ฐ€์ง€๊ณ 
  1429. ์žˆ์Šต๋‹ˆ๋‹ค:
  1430. mmiowb();
  1431. ์ด๊ฒƒ์€ mandatory ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด์˜ ๋ณ€์ข…์œผ๋กœ, ์™„ํ™”๋œ ์ˆœ์„œ ๊ทœ์น™์˜ I/O ์˜์—ญ์—์œผ๋กœ์˜
  1432. ์“ฐ๊ธฐ๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ์ˆœ์„œ๋ฅผ ๋งž์ถ”๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” CPU->ํ•˜๋“œ์›จ์–ด ์‚ฌ์ด๋ฅผ
  1433. ๋„˜์–ด์„œ ์‹ค์ œ ํ•˜๋“œ์›จ์–ด์—๊นŒ์ง€ ์ผ๋ถ€ ์ˆ˜์ค€์˜ ์˜ํ–ฅ์„ ๋ผ์นฉ๋‹ˆ๋‹ค.
  1434. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  "Acquire vs I/O ์•ก์„ธ์Šค" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  1435. =========================
  1436. ์•”๋ฌต์  ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด
  1437. =========================
  1438. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ์ผ๋ถ€ ํ•จ์ˆ˜๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ฝ(lock)๊ณผ
  1439. ์Šค์ผ€์ฅด๋ง ๊ด€๋ จ ํ•จ์ˆ˜๋“ค์ด ๋Œ€๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
  1440. ์—ฌ๊ธฐ์„  _์ตœ์†Œํ•œ์˜_ ๋ณด์žฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค; ํŠน์ • ์•„ํ‚คํ…์ณ์—์„œ๋Š” ์ด ์„ค๋ช…๋ณด๋‹ค ๋” ๋งŽ์€
  1441. ๋ณด์žฅ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ ํ•ด๋‹น ์•„ํ‚คํ…์ณ์— ์ข…์†์ ์ธ ์ฝ”๋“œ ์™ธ์˜ ๋ถ€๋ถ„์—์„œ๋Š”
  1442. ๊ทธ๋Ÿฐ ๋ณด์žฅ์„ ๊ธฐ๋Œ€ํ•ด์„  ์•ˆ๋ ๊ฒ๋‹ˆ๋‹ค.
  1443. ๋ฝ ACQUISITION ํ•จ์ˆ˜
  1444. -------------------
  1445. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ๋‹ค์–‘ํ•œ ๋ฝ ๊ตฌ์„ฑ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1446. (*) ์Šคํ•€ ๋ฝ
  1447. (*) R/W ์Šคํ•€ ๋ฝ
  1448. (*) ๋ฎคํ…์Šค
  1449. (*) ์„ธ๋งˆํฌ์–ด
  1450. (*) R/W ์„ธ๋งˆํฌ์–ด
  1451. ๊ฐ ๊ตฌ์„ฑ์ฒด๋งˆ๋‹ค ๋ชจ๋“  ๊ฒฝ์šฐ์— "ACQUIRE" ์˜คํผ๋ ˆ์ด์…˜๊ณผ "RELEASE" ์˜คํผ๋ ˆ์ด์…˜์˜ ๋ณ€์ข…์ด
  1452. ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ๋ชจ๋‘ ์ ์ ˆํ•œ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1453. (1) ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์˜ ์˜ํ–ฅ:
  1454. ACQUIRE ๋’ค์—์„œ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์€ ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋œ
  1455. ๋’ค์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  1456. ACQUIRE ์•ž์—์„œ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์€ ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋œ ํ›„์—
  1457. ์™„๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. smp_mb__before_spinlock() ๋’ค์— ACQUIRE ๊ฐ€ ์‹คํ–‰๋˜๋Š”
  1458. ์ฝ”๋“œ ๋ธ”๋ก์€ ๋ธ”๋ก ์•ž์˜ ์Šคํ† ์–ด๋ฅผ ๋ธ”๋ก ๋’ค์˜ ๋กœ๋“œ์™€ ์Šคํ† ์–ด์— ๋Œ€ํ•ด ์ˆœ์„œ
  1459. ๋งž์ถฅ๋‹ˆ๋‹ค. ์ด๊ฑด smp_mb() ๋ณด๋‹ค ์™„ํ™”๋œ ๊ฒƒ์ž„์„ ๊ธฐ์–ตํ•˜์„ธ์š”! ๋งŽ์€ ์•„ํ‚คํ…์ณ์—์„œ
  1460. smp_mb__before_spinlock() ์€ ์‚ฌ์‹ค ์•„๋ฌด์ผ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1461. (2) RELEASE ์˜คํผ๋ ˆ์ด์…˜์˜ ์˜ํ–ฅ:
  1462. RELEASE ์•ž์—์„œ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์€ RELEASE ์˜คํผ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋˜๊ธฐ
  1463. ์ „์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  1464. RELEASE ๋’ค์—์„œ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์€ RELEASE ์˜คํผ๋ ˆ์ด์…˜ ์™„๋ฃŒ ์ „์—
  1465. ์™„๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1466. (3) ACQUIRE vs ACQUIRE ์˜ํ–ฅ:
  1467. ์–ด๋–ค ACQUIRE ์˜คํผ๋ ˆ์ด์…˜๋ณด๋‹ค ์•ž์—์„œ ์š”์ฒญ๋œ ๋ชจ๋“  ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์€ ๊ทธ
  1468. ACQUIRE ์˜คํผ๋ ˆ์ด์…˜ ์ „์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  1469. (4) ACQUIRE vs RELEASE implication:
  1470. ์–ด๋–ค RELEASE ์˜คํผ๋ ˆ์ด์…˜๋ณด๋‹ค ์•ž์„œ ์š”์ฒญ๋œ ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์€ ๊ทธ RELEASE
  1471. ์˜คํผ๋ ˆ์ด์…˜๋ณด๋‹ค ๋จผ์ € ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  1472. (5) ์‹คํŒจํ•œ ์กฐ๊ฑด์  ACQUIRE ์˜ํ–ฅ:
  1473. ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์˜ ์ผ๋ถ€ ๋ฝ(lock) ๋ณ€์ข…์€ ๋ฝ์ด ๊ณง๋ฐ”๋กœ ํš๋“ํ•˜๊ธฐ์—๋Š”
  1474. ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ด๊ฑฐ๋‚˜ ๋ฝ์ด ํš๋“ ๊ฐ€๋Šฅํ•ด์ง€๋„๋ก ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋„์ค‘ ์‹œ๊ทธ๋„์„ ๋ฐ›๊ฑฐ๋‚˜
  1475. ํ•ด์„œ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๋ฝ์€ ์–ด๋–ค ๋ฐฐ๋ฆฌ์–ด๋„ ๋‚ดํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1476. [!] ์ฐธ๊ณ : ๋ฝ ACQUIRE ์™€ RELEASE ๊ฐ€ ๋‹จ๋ฐฉํ–ฅ ๋ฐฐ๋ฆฌ์–ด์—ฌ์„œ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ ์ค‘ ํ•˜๋‚˜๋Š”
  1477. ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜ ๋ฐ”๊นฅ์˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์˜ํ–ฅ์ด ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜ ๋‚ด๋ถ€๋กœ๋„ ๋“ค์–ด์˜ฌ ์ˆ˜
  1478. ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  1479. RELEASE ํ›„์— ์š”์ฒญ๋˜๋Š” ACQUIRE ๋Š” ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ผ ์—ฌ๊ฒจ์ง€๋ฉด ์•ˆ๋˜๋Š”๋ฐ,
  1480. ACQUIRE ์•ž์˜ ์•ก์„ธ์Šค๊ฐ€ ACQUIRE ํ›„์— ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๊ณ , RELEASE ํ›„์˜ ์•ก์„ธ์Šค๊ฐ€
  1481. RELEASE ์ „์— ์ˆ˜ํ–‰๋  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ ๋‘๊ฐœ์˜ ์•ก์„ธ์Šค๊ฐ€ ์„œ๋กœ๋ฅผ ์ง€๋‚˜์น  ์ˆ˜๋„ ์žˆ๊ธฐ
  1482. ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค:
  1483. *A = a;
  1484. ACQUIRE M
  1485. RELEASE M
  1486. *B = b;
  1487. ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1488. ACQUIRE M, STORE *B, STORE *A, RELEASE M
  1489. ACQUIRE ์™€ RELEASE ๊ฐ€ ๋ฝ ํš๋“๊ณผ ํ•ด์ œ๋ผ๋ฉด, ๊ทธ๋ฆฌ๊ณ  ๋ฝ์˜ ACQUIRE ์™€ RELEASE ๊ฐ€
  1490. ๊ฐ™์€ ๋ฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด, ํ•ด๋‹น ๋ฝ์„ ์ฅ๊ณ  ์žˆ์ง€ ์•Š์€ ๋‹ค๋ฅธ CPU ์˜ ์‹œ์•ผ์—๋Š”
  1491. ์ด์™€ ๊ฐ™์€ ์žฌ๋ฐฐ์น˜๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์•ฝํ•˜์ž๋ฉด, ACQUIRE ์—
  1492. ์ด์–ด RELEASE ์˜คํผ๋ ˆ์ด์…˜์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ํ–‰์œ„๊ฐ€ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋กœ
  1493. ์ƒ๊ฐ๋˜์–ด์„  -์•ˆ๋ฉ๋‹ˆ๋‹ค-.
  1494. ๋น„์Šทํ•˜๊ฒŒ, ์•ž์˜ ๋ฐ˜๋Œ€ ์ผ€์ด์Šค์ธ RELEASE ์™€ ACQUIRE ๋‘๊ฐœ ์˜คํผ๋ ˆ์ด์…˜์˜ ์ˆœ์ฐจ์  ์‹คํ–‰
  1495. ์—ญ์‹œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, RELEASE, ACQUIRE ๋กœ
  1496. ๊ทœ์ •๋˜๋Š” ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜์˜ CPU ์ˆ˜ํ–‰์€ RELEASE ์™€ ACQUIRE ๋ฅผ ๊ฐ€๋กœ์ง€๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ,
  1497. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋Š”:
  1498. *A = a;
  1499. RELEASE M
  1500. ACQUIRE N
  1501. *B = b;
  1502. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1503. ACQUIRE N, STORE *B, STORE *A, RELEASE M
  1504. ์ด๋Ÿฐ ์žฌ๋ฐฐ์น˜๋Š” ๋ฐ๋“œ๋ฝ์„ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ทธ๋Ÿฐ
  1505. ๋ฐ๋“œ๋ฝ์˜ ์กฐ์ง์ด ์žˆ๋‹ค๋ฉด RELEASE ๋Š” ๋‹จ์ˆœํžˆ ์™„๋ฃŒ๋  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐ๋“œ๋ฝ์€ ์กด์žฌํ•  ์ˆ˜
  1506. ์—†์Šต๋‹ˆ๋‹ค.
  1507. ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
  1508. ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐ ํ•˜๊ณ  ์žˆ๋Š”๊ฑด ์žฌ๋ฐฐ์น˜๋ฅผ ํ•˜๋Š” CPU ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์ด์ง€,
  1509. ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ž€ ์ ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ (๋˜๋Š”, ๊ฐœ๋ฐœ์ž)
  1510. ๊ฐ€ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ์ด๋ ‡๊ฒŒ ์žฌ๋ฐฐ์น˜ํ•˜๋ฉด, ๋ฐ๋“œ๋ฝ์ด ์ผ์–ด๋‚  ์ˆ˜ -์žˆ์Šต-๋‹ˆ๋‹ค.
  1511. ํ•˜์ง€๋งŒ CPU ๊ฐ€ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ์žฌ๋ฐฐ์น˜ ํ–ˆ๋‹ค๋Š”๊ฑธ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. ์ด ์˜ˆ์—์„œ,
  1512. ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ ์ƒ์œผ๋กœ๋Š” ์–ธ๋ฝ์ด ๋ฝ์„ ์•ž์„œ๊ฒŒ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. CPU ๊ฐ€ ์ด๋ฅผ
  1513. ์žฌ๋ฐฐ์น˜ํ•ด์„œ ๋’ค์˜ ๋ฝ ์˜คํผ๋ ˆ์ด์…˜์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ฐ๋“œ๋ฝ์ด
  1514. ์กด์žฌํ•œ๋‹ค๋ฉด, ์ด ๋ฝ ์˜คํผ๋ ˆ์ด์…˜์€ ๊ทธ์ € ์Šคํ•€์„ ํ•˜๋ฉฐ ๊ณ„์†ํ•ด์„œ ๋ฝ์„
  1515. ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š”, ํ•œ์ฐธ ํ›„์—๊ฒ ์ง€๋งŒ, ์ž ๋“ญ๋‹ˆ๋‹ค). CPU ๋Š” ์–ธ์  ๊ฐ€๋Š”
  1516. (์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์—์„œ๋Š” ๋ฝ์„ ์•ž์„œ๋Š”) ์–ธ๋ฝ ์˜คํผ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ, ์ด ์–ธ๋ฝ
  1517. ์˜คํผ๋ ˆ์ด์…˜์ด ์ž ์žฌ์  ๋ฐ๋“œ๋ฝ์„ ํ•ด๊ฒฐํ•˜๊ณ , ๋ฝ ์˜คํผ๋ ˆ์ด์…˜๋„ ๋’ค์ด์–ด ์„ฑ๊ณตํ•˜๊ฒŒ
  1518. ๋ฉ๋‹ˆ๋‹ค.
  1519. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ๋ฝ์ด ์ž ์„ ์ž๋Š” ํƒ€์ž…์ด์—ˆ๋‹ค๋ฉด์š”? ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ์ฝ”๋“œ๋Š”
  1520. ์Šค์ผ€์ฅด๋Ÿฌ๋กœ ๋“ค์–ด๊ฐ€๋ ค ํ•  ๊ฑฐ๊ณ , ์—ฌ๊ธฐ์„œ ๊ฒฐ๊ตญ์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋งŒ๋‚˜๊ฒŒ
  1521. ๋˜๋Š”๋ฐ, ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์•ž์˜ ์–ธ๋ฝ ์˜คํผ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋˜๋„๋ก ๋งŒ๋“ค๊ณ ,
  1522. ๋ฐ๋“œ๋ฝ์€ ์ด๋ฒˆ์—๋„ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ž ์„ ์ž๋Š” ํ–‰์œ„์™€ ์–ธ๋ฝ ์‚ฌ์ด์˜ ๊ฒฝ์ฃผ ์ƒํ™ฉ
  1523. (race) ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค๋งŒ, ๋ฝ ๊ด€๋ จ ๊ธฐ๋Šฅ๋“ค์€ ๊ทธ๋Ÿฐ ๊ฒฝ์ฃผ ์ƒํ™ฉ์„ ๋ชจ๋“ 
  1524. ๊ฒฝ์šฐ์— ์ œ๋Œ€๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1525. ๋ฝ๊ณผ ์„ธ๋งˆํฌ์–ด๋Š” UP ์ปดํŒŒ์ผ๋œ ์‹œ์Šคํ…œ์—์„œ์˜ ์ˆœ์„œ์— ๋Œ€ํ•ด ๋ณด์žฅ์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—,
  1526. ๊ทธ๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ์˜คํผ๋ ˆ์ด์…˜๊ณผ ํ•จ๊ป˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์–ด๋–ค ์ผ์—๋„ - ํŠนํžˆ
  1527. I/O ์•ก์„ธ์Šค์™€ ๊ด€๋ จํ•ด์„œ๋Š” - ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์„ ๊ฒ๋‹ˆ๋‹ค.
  1528. "CPU ๊ฐ„ ACQUIRING ๋ฐฐ๋ฆฌ์–ด ํšจ๊ณผ" ์„น์…˜๋„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  1529. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  1530. *A = a;
  1531. *B = b;
  1532. ACQUIRE
  1533. *C = c;
  1534. *D = d;
  1535. RELEASE
  1536. *E = e;
  1537. *F = f;
  1538. ์—ฌ๊ธฐ์„  ๋‹ค์Œ์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1539. ACQUIRE, {*F,*A}, *E, {*C,*D}, *B, RELEASE
  1540. [+] {*F,*A} ๋Š” ์กฐํ•ฉ๋œ ์•ก์„ธ์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  1541. ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜์ฃ :
  1542. {*F,*A}, *B, ACQUIRE, *C, *D, RELEASE, *E
  1543. *A, *B, *C, ACQUIRE, *D, RELEASE, *E, *F
  1544. *A, *B, ACQUIRE, *C, RELEASE, *D, *E, *F
  1545. *B, ACQUIRE, *C, *D, RELEASE, {*F,*A}, *E
  1546. ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ํ•จ์ˆ˜
  1547. ----------------------
  1548. ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•˜๋Š” ํ•จ์ˆ˜ (ACQUIRE ์™€ ๋™์ผ) ์™€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ™œ์„ฑํ™” ํ•˜๋Š” ํ•จ์ˆ˜
  1549. (RELEASE ์™€ ๋™์ผ) ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด์ฒ˜๋Ÿผ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ
  1550. ๋ฐฐ๋ฆฌ์–ด๋‚˜ I/O ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๋ผ๋ฉด ๊ทธ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ํ•จ์ˆ˜
  1551. ์™ธ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ œ๊ณต๋˜์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  1552. ์Šฌ๋ฆฝ๊ณผ ์›จ์ดํฌ์—… ํ•จ์ˆ˜
  1553. --------------------
  1554. ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ์— ํ‘œ์‹œ๋œ ์ด๋ฒคํŠธ์— ์˜ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž ์— ๋น ํŠธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊นจ์šฐ๋Š” ๊ฒƒ์€
  1555. ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํƒœ์Šคํฌ์˜ ํƒœ์Šคํฌ ์ƒํƒœ์™€ ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š”
  1556. ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ, ๋‘ ๋ฐ์ดํ„ฐ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ณ์€ ์ˆœ์„œ๋Œ€๋กœ
  1557. ์ผ์–ด๋‚จ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด, ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž ์— ๋“ค๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๊นจ์šฐ๋Š” ๊ธฐ๋Šฅ์€
  1558. ๋ช‡๊ฐ€์ง€ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•ฉ๋‹ˆ๋‹ค.
  1559. ๋จผ์ €, ์ž ์„ ์žฌ์šฐ๋Š” ์ชฝ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:
  1560. for (;;) {
  1561. set_current_state(TASK_UNINTERRUPTIBLE);
  1562. if (event_indicated)
  1563. break;
  1564. schedule();
  1565. }
  1566. set_current_state() ์— ์˜ํ•ด, ํƒœ์Šคํฌ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€ ํ›„ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€
  1567. ์ž๋™์œผ๋กœ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค:
  1568. CPU 1
  1569. ===============================
  1570. set_current_state();
  1571. smp_store_mb();
  1572. STORE current->state
  1573. <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด>
  1574. LOAD event_indicated
  1575. set_current_state() ๋Š” ๋‹ค์Œ์˜ ๊ฒƒ๋“ค๋กœ ๊ฐ์‹ธ์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1576. prepare_to_wait();
  1577. prepare_to_wait_exclusive();
  1578. ์ด๊ฒƒ๋“ค ์—ญ์‹œ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•œ ํ›„ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  1579. ์•ž์˜ ์ „์ฒด ์‹œํ€€์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค๋กœ ํ•œ๋ฒˆ์— ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘
  1580. ์˜ฌ๋ฐ”๋ฅธ ์žฅ์†Œ์— ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค:
  1581. wait_event();
  1582. wait_event_interruptible();
  1583. wait_event_interruptible_exclusive();
  1584. wait_event_interruptible_timeout();
  1585. wait_event_killable();
  1586. wait_event_timeout();
  1587. wait_on_bit();
  1588. wait_on_bit_lock();
  1589. ๋‘๋ฒˆ์งธ๋กœ, ๊นจ์šฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒ๋‹ˆ๋‹ค:
  1590. event_indicated = 1;
  1591. wake_up(&event_wait_queue);
  1592. ๋˜๋Š”:
  1593. event_indicated = 1;
  1594. wake_up_process(event_daemon);
  1595. wake_up() ๋ฅ˜์— ์˜ํ•ด ์“ฐ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ๋‚ดํฌ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๊ฒƒ๋“ค์ด ๋ญ”๊ฐ€๋ฅผ
  1596. ๊นจ์šด๋‹ค๋ฉด์š”. ์ด ๋ฐฐ๋ฆฌ์–ด๋Š” ํƒœ์Šคํฌ ์ƒํƒœ๊ฐ€ ์ง€์›Œ์ง€๊ธฐ ์ „์— ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ, ์ด๋ฒคํŠธ๋ฅผ
  1597. ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ STORE ์™€ ํƒœ์Šคํฌ ์ƒํƒœ๋ฅผ TASK_RUNNING ์œผ๋กœ ์„ค์ •ํ•˜๋Š” STORE ์‚ฌ์ด์—
  1598. ์œ„์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  1599. CPU 1 CPU 2
  1600. =============================== ===============================
  1601. set_current_state(); STORE event_indicated
  1602. smp_store_mb(); wake_up();
  1603. STORE current->state <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  1604. <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด> STORE current->state
  1605. LOAD event_indicated
  1606. ํ•œ๋ฒˆ๋” ๋งํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์ด ์“ฐ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ด ์ฝ”๋“œ๊ฐ€ ์ •๋ง๋กœ ๋ญ”๊ฐ€๋ฅผ ๊นจ์šธ ๋•Œ์—๋งŒ
  1607. ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด, X ์™€ Y ๋Š” ๋ชจ๋‘ 0 ์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฐ€์ •
  1608. ํ•˜์— ์•„๋ž˜์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  1609. CPU 1 CPU 2
  1610. =============================== ===============================
  1611. X = 1; STORE event_indicated
  1612. smp_mb(); wake_up();
  1613. Y = 1; wait_event(wq, Y == 1);
  1614. wake_up(); load from Y sees 1, no memory barrier
  1615. load from X might see 0
  1616. ์œ„ ์˜ˆ์ œ์—์„œ์˜ ๊ฒฝ์šฐ์™€ ๋‹ฌ๋ฆฌ ๊นจ์šฐ๊ธฐ๊ฐ€ ์ •๋ง๋กœ ํ–‰ํ•ด์กŒ๋‹ค๋ฉด, CPU 2 ์˜ X ๋กœ๋“œ๋Š” 1 ์„
  1617. ๋ณธ๋‹ค๊ณ  ๋ณด์žฅ๋  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.
  1618. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊นจ์šฐ๊ธฐ๋ฅ˜ ํ•จ์ˆ˜๋“ค๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  1619. complete();
  1620. wake_up();
  1621. wake_up_all();
  1622. wake_up_bit();
  1623. wake_up_interruptible();
  1624. wake_up_interruptible_all();
  1625. wake_up_interruptible_nr();
  1626. wake_up_interruptible_poll();
  1627. wake_up_interruptible_sync();
  1628. wake_up_interruptible_sync_poll();
  1629. wake_up_locked();
  1630. wake_up_locked_poll();
  1631. wake_up_nr();
  1632. wake_up_poll();
  1633. wake_up_process();
  1634. [!] ์ž ์žฌ์šฐ๋Š” ์ฝ”๋“œ์™€ ๊นจ์šฐ๋Š” ์ฝ”๋“œ์— ๋‚ดํฌ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ๊นจ์šฐ๊ธฐ ์ „์—
  1635. ์ด๋ฃจ์–ด์ง„ ์Šคํ† ์–ด๋ฅผ ์ž ์žฌ์šฐ๋Š” ์ฝ”๋“œ๊ฐ€ set_current_state() ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์— ํ–‰ํ•˜๋Š”
  1636. ๋กœ๋“œ์— ๋Œ€ํ•ด ์ˆœ์„œ๋ฅผ ๋งž์ถ”์ง€ _์•Š๋Š”๋‹ค๋Š”_ ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž ์žฌ์šฐ๋Š”
  1637. ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๊ณ :
  1638. set_current_state(TASK_INTERRUPTIBLE);
  1639. if (event_indicated)
  1640. break;
  1641. __set_current_state(TASK_RUNNING);
  1642. do_something(my_data);
  1643. ๊นจ์šฐ๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด:
  1644. my_data = value;
  1645. event_indicated = 1;
  1646. wake_up(&event_wait_queue);
  1647. event_indecated ์—์˜ ๋ณ€๊ฒฝ์ด ์ž ์žฌ์šฐ๋Š” ์ฝ”๋“œ์—๊ฒŒ my_data ์—์˜ ๋ณ€๊ฒฝ ํ›„์— ์ด๋ฃจ์–ด์ง„
  1648. ๊ฒƒ์œผ๋กœ ์ธ์ง€๋  ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์–‘์ชฝ ์ฝ”๋“œ ๋ชจ๋‘ ๊ฐ๊ฐ์˜
  1649. ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์‚ฌ์ด์— ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ง์ ‘ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ž์˜ ์žฌ์šฐ๋Š”
  1650. ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด:
  1651. set_current_state(TASK_INTERRUPTIBLE);
  1652. if (event_indicated) {
  1653. smp_rmb();
  1654. do_something(my_data);
  1655. }
  1656. ๊ทธ๋ฆฌ๊ณ  ๊นจ์šฐ๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  1657. my_data = value;
  1658. smp_wmb();
  1659. event_indicated = 1;
  1660. wake_up(&event_wait_queue);
  1661. ๊ทธ์™ธ์˜ ํ•จ์ˆ˜๋“ค
  1662. -------------
  1663. ๊ทธ์™ธ์˜ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜๋Š” ํ•จ์ˆ˜๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  1664. (*) schedule() ๊ณผ ๊ทธ ์œ ์‚ฌํ•œ ๊ฒƒ๋“ค์ด ์™„์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•ฉ๋‹ˆ๋‹ค.
  1665. ==============================
  1666. CPU ๊ฐ„ ACQUIRING ๋ฐฐ๋ฆฌ์–ด์˜ ํšจ๊ณผ
  1667. ==============================
  1668. SMP ์‹œ์Šคํ…œ์—์„œ์˜ ๋ฝ ๊ธฐ๋Šฅ๋“ค์€ ๋”์šฑ ๊ฐ•๋ ฅํ•œ ํ˜•ํƒœ์˜ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: ์ด
  1669. ๋ฐฐ๋ฆฌ์–ด๋Š” ๋™์ผํ•œ ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ CPU ๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์ˆœ์„œ์—๋„ ์˜ํ–ฅ์„
  1670. ๋ผ์นฉ๋‹ˆ๋‹ค.
  1671. ACQUIRE VS ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค
  1672. ------------------------
  1673. ๋‹ค์Œ์˜ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค: ์‹œ์Šคํ…œ์€ ๋‘๊ฐœ์˜ ์Šคํ•€๋ฝ (M) ๊ณผ (Q), ๊ทธ๋ฆฌ๊ณ  ์„ธ๊ฐœ์˜ CPU
  1674. ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค; ์—ฌ๊ธฐ์— ๋‹ค์Œ์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:
  1675. CPU 1 CPU 2
  1676. =============================== ===============================
  1677. WRITE_ONCE(*A, a); WRITE_ONCE(*E, e);
  1678. ACQUIRE M ACQUIRE Q
  1679. WRITE_ONCE(*B, b); WRITE_ONCE(*F, f);
  1680. WRITE_ONCE(*C, c); WRITE_ONCE(*G, g);
  1681. RELEASE M RELEASE Q
  1682. WRITE_ONCE(*D, d); WRITE_ONCE(*H, h);
  1683. *A ๋กœ์˜ ์•ก์„ธ์Šค๋ถ€ํ„ฐ *H ๋กœ์˜ ์•ก์„ธ์Šค๊นŒ์ง€๊ฐ€ ์–ด๋–ค ์ˆœ์„œ๋กœ CPU 3 ์—๊ฒŒ ๋ณด์—ฌ์งˆ์ง€์—
  1684. ๋Œ€ํ•ด์„œ๋Š” ๊ฐ CPU ์—์„œ์˜ ๋ฝ ์‚ฌ์šฉ์— ์˜ํ•ด ๋‚ดํฌ๋˜์–ด ์žˆ๋Š” ์ œ์•ฝ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์–ด๋–ค
  1685. ๋ณด์žฅ๋„ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, CPU 3 ์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋ณด์—ฌ์ง€๋Š”
  1686. ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  1687. *E, ACQUIRE M, ACQUIRE Q, *G, *C, *F, *A, *B, RELEASE Q, *D, *H, RELEASE M
  1688. ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ด์ง€๋Š” ์•Š์„ ๊ฒ๋‹ˆ๋‹ค:
  1689. *B, *C or *D preceding ACQUIRE M
  1690. *A, *B or *C following RELEASE M
  1691. *F, *G or *H preceding ACQUIRE Q
  1692. *E, *F or *G following RELEASE Q
  1693. ACQUIRE VS I/O ์•ก์„ธ์Šค
  1694. ----------------------
  1695. ํŠน์ •ํ•œ (ํŠนํžˆ NUMA ๊ฐ€ ๊ด€๋ จ๋œ) ํ™˜๊ฒฝ ํ•˜์—์„œ ๋‘๊ฐœ์˜ CPU ์—์„œ ๋™์ผํ•œ ์Šคํ•€๋ฝ์œผ๋กœ
  1696. ๋ณดํ˜ธ๋˜๋Š” ๋‘๊ฐœ์˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜ ์•ˆ์˜ I/O ์•ก์„ธ์Šค๋Š” PCI ๋ธŒ๋ฆฟ์ง€์— ๊ฒน์ณ์ง„ I/O
  1697. ์•ก์„ธ์Šค๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, PCI ๋ธŒ๋ฆฟ์ง€๋Š” ์บ์‹œ ์ผ๊ด€์„ฑ ํ”„๋กœํ† ์ฝœ๊ณผ ํ•ฉ์„ ๋งž์ถฐ์•ผ ํ• 
  1698. ์˜๋ฌด๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ํ•„์š”ํ•œ ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  1699. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ:
  1700. CPU 1 CPU 2
  1701. =============================== ===============================
  1702. spin_lock(Q)
  1703. writel(0, ADDR)
  1704. writel(1, DATA);
  1705. spin_unlock(Q);
  1706. spin_lock(Q);
  1707. writel(4, ADDR);
  1708. writel(5, DATA);
  1709. spin_unlock(Q);
  1710. ๋Š” PCI ๋ธŒ๋ฆฟ์ง€์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1711. STORE *ADDR = 0, STORE *ADDR = 4, STORE *DATA = 1, STORE *DATA = 5
  1712. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ•˜๋“œ์›จ์–ด์˜ ์˜ค๋™์ž‘์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1713. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—” ์žก์•„๋‘” ์Šคํ•€๋ฝ์„ ๋‚ด๋ ค๋†“๊ธฐ ์ „์— mmiowb() ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ
  1714. ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  1715. CPU 1 CPU 2
  1716. =============================== ===============================
  1717. spin_lock(Q)
  1718. writel(0, ADDR)
  1719. writel(1, DATA);
  1720. mmiowb();
  1721. spin_unlock(Q);
  1722. spin_lock(Q);
  1723. writel(4, ADDR);
  1724. writel(5, DATA);
  1725. mmiowb();
  1726. spin_unlock(Q);
  1727. ์ด ์ฝ”๋“œ๋Š” CPU 1 ์—์„œ ์š”์ฒญ๋œ ๋‘๊ฐœ์˜ ์Šคํ† ์–ด๊ฐ€ PCI ๋ธŒ๋ฆฟ์ง€์— CPU 2 ์—์„œ ์š”์ฒญ๋œ
  1728. ์Šคํ† ์–ด๋“ค๋ณด๋‹ค ๋จผ์ € ๋ณด์—ฌ์ง์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  1729. ๋˜ํ•œ, ๊ฐ™์€ ๋””๋ฐ”์ด์Šค์—์„œ ์Šคํ† ์–ด๋ฅผ ์ด์–ด ๋กœ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ์ด ๋กœ๋“œ๋Š” ๋กœ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ
  1730. ์ „์— ์Šคํ† ์–ด๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ฐ•์ œํ•˜๋ฏ€๋กœ mmiowb() ์˜ ํ•„์š”๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค:
  1731. CPU 1 CPU 2
  1732. =============================== ===============================
  1733. spin_lock(Q)
  1734. writel(0, ADDR)
  1735. a = readl(DATA);
  1736. spin_unlock(Q);
  1737. spin_lock(Q);
  1738. writel(4, ADDR);
  1739. b = readl(DATA);
  1740. spin_unlock(Q);
  1741. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  Documenataion/DocBook/deviceiobook.tmpl ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  1742. =========================
  1743. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ณณ
  1744. =========================
  1745. ์„ค๋ น SMP ์ปค๋„์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”
  1746. ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์งˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ‰๋ฒ”ํ•œ ์‹œ์Šคํ…œ ์šด์˜์ค‘์— ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜ ์žฌ๋ฐฐ์น˜๋Š”
  1747. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์žฌ๋ฐฐ์น˜๊ฐ€ ๋ฌธ์ œ๊ฐ€ _๋  ์ˆ˜ ์žˆ๋Š”_ ๋„ค๊ฐ€์ง€
  1748. ํ™˜๊ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  1749. (*) ํ”„๋กœ์„ธ์„œ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ.
  1750. (*) ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜.
  1751. (*) ๋””๋ฐ”์ด์Šค ์•ก์„ธ์Šค.
  1752. (*) ์ธํ„ฐ๋ŸฝํŠธ.
  1753. ํ”„๋กœ์„ธ์„œ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ
  1754. --------------------
  1755. ๋‘๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์„œ๋ฅผ ๊ฐ€์ง„ ์‹œ์Šคํ…œ์ด ์žˆ๋‹ค๋ฉด, ์‹œ์Šคํ…œ์˜ ๋‘๊ฐœ ์ด์ƒ์˜ CPU ๋Š” ๋™์‹œ์—
  1756. ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ณ ,
  1757. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ผ๋ฐ˜์  ๋ฐฉ๋ฒ•์€ ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฝ์€ ์ƒ๋‹นํžˆ
  1758. ๋น„์šฉ์ด ๋น„์‹ธ์„œ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ
  1759. ๊ฒฝ์šฐ, ๋‘ CPU ๋ชจ๋‘์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์˜ค๋™์ž‘์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‹ ์ค‘ํ•˜๊ฒŒ
  1760. ์ˆœ์„œ๊ฐ€ ๋งž์ถฐ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1761. ์˜ˆ๋ฅผ ๋“ค์–ด, R/W ์„ธ๋งˆํฌ์–ด์˜ ๋Š๋ฆฐ ์ˆ˜ํ–‰๊ฒฝ๋กœ (slow path) ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.
  1762. ์„ธ๋งˆํฌ์–ด๋ฅผ ์œ„ํ•ด ๋Œ€๊ธฐ๋ฅผ ํ•˜๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์˜ ์Šคํƒ ์ค‘ ์ผ๋ถ€๋ฅผ ์ด
  1763. ์„ธ๋งˆํฌ์–ด์˜ ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ์— ๋งํฌํ•œ ์ฑ„๋กœ ์žˆ์Šต๋‹ˆ๋‹ค:
  1764. struct rw_semaphore {
  1765. ...
  1766. spinlock_t lock;
  1767. struct list_head waiters;
  1768. };
  1769. struct rwsem_waiter {
  1770. struct list_head list;
  1771. struct task_struct *task;
  1772. };
  1773. ํŠน์ • ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์šฐ๊ธฐ ์œ„ํ•ด, up_read() ๋‚˜ up_write() ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ
  1774. ๊ฐ™์€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค:
  1775. (1) ๋‹ค์Œ ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค ๋ ˆ์ฝ”๋“œ๋Š” ์–ด๋””์žˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ์ด ๋Œ€๊ธฐ ์ƒํƒœ
  1776. ํ”„๋กœ์„ธ์Šค ๋ ˆ์ฝ”๋“œ์˜ next ํฌ์ธํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค;
  1777. (2) ์ด ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค์˜ task ๊ตฌ์กฐ์ฒด๋กœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค;
  1778. (3) ์ด ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„ธ๋งˆํฌ์–ด๋ฅผ ํš๋“ํ–ˆ์Œ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด task
  1779. ํฌ์ธํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค;
  1780. (4) ํ•ด๋‹น ํƒœ์Šคํฌ์— ๋Œ€ํ•ด wake_up_process() ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค; ๊ทธ๋ฆฌ๊ณ 
  1781. (5) ํ•ด๋‹น ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค์˜ task ๊ตฌ์กฐ์ฒด๋ฅผ ์žก๊ณ  ์žˆ๋˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
  1782. ๋‹ฌ๋ฆฌ ๋งํ•˜์ž๋ฉด, ๋‹ค์Œ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  1783. LOAD waiter->list.next;
  1784. LOAD waiter->task;
  1785. STORE waiter->task;
  1786. CALL wakeup
  1787. RELEASE task
  1788. ๊ทธ๋ฆฌ๊ณ  ์ด ์ด๋ฒคํŠธ๋“ค์ด ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด, ์˜ค๋™์ž‘์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1789. ํ•œ๋ฒˆ ์„ธ๋งˆํฌ์–ด์˜ ๋Œ€๊ธฐ์ค„์— ๋“ค์–ด๊ฐ”๊ณ  ์„ธ๋งˆํฌ์–ด ๋ฝ์„ ๋†“์•˜๋‹ค๋ฉด, ํ•ด๋‹น ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค๋Š”
  1790. ๋ฝ์„ ๋‹ค์‹œ๋Š” ์žก์ง€ ์•Š์Šต๋‹ˆ๋‹ค; ๋Œ€์‹  ์ž์‹ ์˜ task ํฌ์ธํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  1791. ๊ทธ ๋ ˆ์ฝ”๋“œ๋Š” ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค์˜ ์Šคํƒ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ์ŠคํŠธ์˜ next ํฌ์ธํ„ฐ๊ฐ€ ์ฝํ˜€์ง€๊ธฐ
  1792. _์ „์—_ task ํฌ์ธํ„ฐ๊ฐ€ ์ง€์›Œ์ง„๋‹ค๋ฉด, ๋‹ค๋ฅธ CPU ๋Š” ํ•ด๋‹น ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ด ๋ฒ„๋ฆฌ๊ณ 
  1793. up*() ํ•จ์ˆ˜๊ฐ€ next ํฌ์ธํ„ฐ๋ฅผ ์ฝ๊ธฐ ์ „์— ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค์˜ ์Šคํƒ์„ ๋งˆ๊ตฌ ๊ฑด๋“œ๋ฆด ์ˆ˜
  1794. ์žˆ์Šต๋‹ˆ๋‹ค.
  1795. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์œ„์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค์— ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณด์ฃ :
  1796. CPU 1 CPU 2
  1797. =============================== ===============================
  1798. down_xxx()
  1799. Queue waiter
  1800. Sleep
  1801. up_yyy()
  1802. LOAD waiter->task;
  1803. STORE waiter->task;
  1804. Woken up by other event
  1805. <preempt>
  1806. Resume processing
  1807. down_xxx() returns
  1808. call foo()
  1809. foo() clobbers *waiter
  1810. </preempt>
  1811. LOAD waiter->list.next;
  1812. --- OOPS ---
  1813. ์ด ๋ฌธ์ œ๋Š” ์„ธ๋งˆํฌ์–ด ๋ฝ์˜ ์‚ฌ์šฉ์œผ๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๊นจ์–ด๋‚œ ํ›„์—
  1814. down_xxx() ํ•จ์ˆ˜๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์Šคํ•€๋ฝ์„ ๋˜๋‹ค์‹œ ์–ป์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  1815. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฒ”์šฉ SMP ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค:
  1816. LOAD waiter->list.next;
  1817. LOAD waiter->task;
  1818. smp_mb();
  1819. STORE waiter->task;
  1820. CALL wakeup
  1821. RELEASE task
  1822. ์ด ๊ฒฝ์šฐ์—, ๋ฐฐ๋ฆฌ์–ด๋Š” ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ CPU ๋“ค์—๊ฒŒ ๋ชจ๋“  ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๊ฐ€
  1823. ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ณด๋‹ค ์•ž์„œ ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฐฐ๋ฆฌ์–ด ์•ž์˜
  1824. ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์ด ๋ฐฐ๋ฆฌ์–ด ๋ช…๋ น ์ž์ฒด๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ๊นŒ์ง€ ์™„๋ฃŒ๋œ๋‹ค๊ณ ๋Š” ๋ณด์žฅํ•˜์ง€
  1825. _์•Š์Šต๋‹ˆ๋‹ค_.
  1826. (์ด๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„) ๋‹จ์ผ ํ”„๋กœ์„ธ์„œ ์‹œ์Šคํ…œ์—์„œ smp_mb() ๋Š” ์‹ค์ œ๋กœ๋Š” ๊ทธ์ €
  1827. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ CPU ์•ˆ์—์„œ์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š๊ณ  ์ฃผ์–ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ๋ช…๋ น์„
  1828. ๋‚ด๋ฆฌ๋„๋ก ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์˜ค์ง ํ•˜๋‚˜์˜ CPU ๋งŒ ์žˆ์œผ๋‹ˆ, CPU ์˜
  1829. ์˜์กด์„ฑ ์ˆœ์„œ ๋กœ์ง์ด ๊ทธ ์™ธ์˜ ๋ชจ๋“ ๊ฒƒ์„ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•  ๊ฒ๋‹ˆ๋‹ค.
  1830. ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜
  1831. -----------------
  1832. ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ํ”„๋กœ์„ธ์„œ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ๋ถ„๋ฅ˜๋˜๋ฉฐ ๊ทธ ์ค‘ ์ผ๋ถ€๋Š”
  1833. ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜๊ณ  ๋˜ ์ผ๋ถ€๋Š” ๋‚ดํฌํ•˜์ง€ ์•Š์ง€๋งŒ, ์ปค๋„์—์„œ ์ƒ๋‹นํžˆ
  1834. ์˜์กด์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
  1835. ๋ฉ”๋ชจ๋ฆฌ์˜ ์–ด๋–ค ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ํ•ด๋‹น ์ƒํƒœ์— ๋Œ€ํ•œ (์˜ˆ์ „์˜ ๋˜๋Š” ์ตœ์‹ ์˜) ์ •๋ณด๋ฅผ
  1836. ๋ฆฌํ„ดํ•˜๋Š” ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜์€ ๋ชจ๋‘ SMP-์กฐ๊ฑด์  ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด(smp_mb())๋ฅผ
  1837. ์‹ค์ œ ์˜คํผ๋ ˆ์ด์…˜์˜ ์•ž๊ณผ ๋’ค์— ๋‚ดํฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์˜คํผ๋ ˆ์ด์…˜์€ ๋‹ค์Œ์˜ ๊ฒƒ๋“ค์„
  1838. ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:
  1839. xchg();
  1840. atomic_xchg(); atomic_long_xchg();
  1841. atomic_inc_return(); atomic_long_inc_return();
  1842. atomic_dec_return(); atomic_long_dec_return();
  1843. atomic_add_return(); atomic_long_add_return();
  1844. atomic_sub_return(); atomic_long_sub_return();
  1845. atomic_inc_and_test(); atomic_long_inc_and_test();
  1846. atomic_dec_and_test(); atomic_long_dec_and_test();
  1847. atomic_sub_and_test(); atomic_long_sub_and_test();
  1848. atomic_add_negative(); atomic_long_add_negative();
  1849. test_and_set_bit();
  1850. test_and_clear_bit();
  1851. test_and_change_bit();
  1852. /* exchange ์กฐ๊ฑด์ด ์„ฑ๊ณตํ•  ๋•Œ */
  1853. cmpxchg();
  1854. atomic_cmpxchg(); atomic_long_cmpxchg();
  1855. atomic_add_unless(); atomic_long_add_unless();
  1856. ์ด๊ฒƒ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ํšจ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ACQUIRE ๋ถ€๋ฅ˜์™€ RELEASE ๋ถ€๋ฅ˜ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„
  1857. ๊ตฌํ˜„ํ•  ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด ํ•ด์ œ๋ฅผ ์œ„ํ•ด ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํ„ฐ๋ฅผ ์กฐ์ •ํ•  ๋•Œ, ์•”๋ฌต์  ๋ฉ”๋ชจ๋ฆฌ
  1858. ๋ฐฐ๋ฆฌ์–ด ํšจ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ๊ณณ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  1859. ๋‹ค์Œ์˜ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜์ง€ _์•Š๊ธฐ_ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜
  1860. ์žˆ์ง€๋งŒ, RELEASE ๋ถ€๋ฅ˜์˜ ์˜คํผ๋ ˆ์ด์…˜๋“ค๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋  ์ˆ˜๋„
  1861. ์žˆ์Šต๋‹ˆ๋‹ค:
  1862. atomic_set();
  1863. set_bit();
  1864. clear_bit();
  1865. change_bit();
  1866. ์ด๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ํ•„์š”ํ•˜๋‹ค๋ฉด ์ ์ ˆํ•œ (์˜ˆ๋ฅผ ๋“ค๋ฉด smp_mb__before_atomic()
  1867. ๊ฐ™์€) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1868. ์•„๋ž˜์˜ ๊ฒƒ๋“ค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜์ง€ _์•Š๊ธฐ_ ๋•Œ๋ฌธ์—, ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ๋Š” (์˜ˆ๋ฅผ
  1869. ๋“ค๋ฉด smp_mb__before_atomic() ๊ณผ ๊ฐ™์€) ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์‚ฌ์šฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  1870. atomic_add();
  1871. atomic_sub();
  1872. atomic_inc();
  1873. atomic_dec();
  1874. ์ด๊ฒƒ๋“ค์ด ํ†ต๊ณ„ ์ƒ์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค๋ฉด, ๊ทธ๋ฆฌ๊ณ  ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์— ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•˜์ง€
  1875. ์•Š๋Š”๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ํ•„์š”์น˜ ์•Š์„ ๊ฒ๋‹ˆ๋‹ค.
  1876. ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ… ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด, ๋ ˆํผ๋Ÿฐ์Šค
  1877. ์นด์šดํ„ฐ๋Š” ๋ฝ์œผ๋กœ ๋ณดํ˜ธ๋˜๋Š” ์„น์…˜์—์„œ๋งŒ ์กฐ์ •๋˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์ด ์ด๋ฏธ ์ถฉ๋ถ„ํ•œ
  1878. ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์žก๊ณ  ์žˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์•„๋งˆ ํ•„์š” ์—†์„ ๊ฒ๋‹ˆ๋‹ค.
  1879. ๋งŒ์•ฝ ์–ด๋–ค ๋ฝ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค๋ฉด, ๋ฝ ๊ด€๋ จ ๋™์ž‘์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์—…์„ ํŠน์ •
  1880. ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1881. ๊ธฐ๋ณธ์ ์œผ๋กœ, ๊ฐ ์‚ฌ์šฉ์ฒ˜์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•„๋‹Œ์ง€ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ คํ•ด์•ผ
  1882. ํ•ฉ๋‹ˆ๋‹ค.
  1883. ์•„๋ž˜์˜ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ํŠน๋ณ„ํ•œ ๋ฝ ๊ด€๋ จ ๋™์ž‘๋“ค์ž…๋‹ˆ๋‹ค:
  1884. test_and_set_bit_lock();
  1885. clear_bit_unlock();
  1886. __clear_bit_unlock();
  1887. ์ด๊ฒƒ๋“ค์€ ACQUIRE ๋ฅ˜์™€ RELEASE ๋ฅ˜์˜ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋ฝ ๊ด€๋ จ ๋„๊ตฌ๋ฅผ
  1888. ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” ์ด๊ฒƒ๋“ค์„ ์ข€ ๋” ์„ ํ˜ธํ•˜๋Š” ํŽธ์ด ๋‚˜์€๋ฐ, ์ด๊ฒƒ๋“ค์˜ ๊ตฌํ˜„์€ ๋งŽ์€
  1889. ์•„ํ‚คํ…์ณ์—์„œ ์ตœ์ ํ™” ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  1890. [!] ์ด๋Ÿฐ ์ƒํ™ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋„๊ตฌ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์ผ๋ถ€
  1891. CPU ์—์„œ๋Š” ์‚ฌ์šฉ๋˜๋Š” ์–ดํ† ๋ฏน ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ž์ฒด์— ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ๋‚ดํฌ๋˜์–ด ์žˆ์–ด์„œ
  1892. ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ถˆํ•„์š”ํ•œ ์ผ์ด ๋  ์ˆ˜
  1893. ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ์ด ํŠน์ˆ˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋„๊ตฌ๋“ค์€ no-op ์ด ๋˜์–ด ์‹ค์งˆ์ ์œผ๋กœ
  1894. ์•„๋ฌด์ผ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1895. ๋” ๋งŽ์€ ๋‚ด์šฉ์„ ์œ„ํ•ด์„  Documentation/atomic_ops.txt ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  1896. ๋””๋ฐ”์ด์Šค ์•ก์„ธ์Šค
  1897. ---------------
  1898. ๋งŽ์€ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ๊ธฐ๋ฒ•์œผ๋กœ ์ œ์–ด๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ์ œ์–ด๋˜๋Š”
  1899. ๋””๋ฐ”์ด์Šค๋Š” CPU ์—๋Š” ๋‹จ์ง€ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ์ง‘ํ•ฉ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„๋Š”
  1900. ๊ทธ๋Ÿฐ ๋””๋ฐ”์ด์Šค๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ •ํ™•ํžˆ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ
  1901. ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1902. ํ•˜์ง€๋งŒ, ์•ก์„ธ์Šค๋“ค์„ ์žฌ๋ฐฐ์น˜ ํ•˜๊ฑฐ๋‚˜ ์กฐํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉํ•˜๋Š”๊ฒŒ ๋” ํšจ์œจ์ ์ด๋ผ ํŒ๋‹จํ•˜๋Š”
  1903. ์˜๋ฆฌํ•œ CPU ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ๋“œ๋ผ์ด๋ฒ„ ์ฝ”๋“œ์˜ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ˆœ์„œ ๋งž์ถฐ์ง„
  1904. ์•ก์„ธ์Šค๋“ค์ด ๋””๋ฐ”์ด์Šค์—๋Š” ์š”์ฒญ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋„์ฐฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” - ๋””๋ฐ”์ด์Šค๊ฐ€
  1905. ์˜ค๋™์ž‘์„ ํ•˜๊ฒŒ ํ•  - ์ž ์žฌ์  ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1906. ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๋‚ด๋ถ€์—์„œ, I/O ๋Š” ์–ด๋–ป๊ฒŒ ์•ก์„ธ์Šค๋“ค์„ ์ ์ ˆํžˆ ์ˆœ์ฐจ์ ์ด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€
  1907. ์•Œ๊ณ  ์žˆ๋Š”, - inb() ๋‚˜ writel() ๊ณผ ๊ฐ™์€ - ์ ์ ˆํ•œ ์•ก์„ธ์Šค ๋ฃจํ‹ด์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ ธ์•ผ๋งŒ
  1908. ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ๋ช…์‹œ์  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ํ•„์š”๊ฐ€
  1909. ์—†์Šต๋‹ˆ๋‹ค๋งŒ, ๋‹ค์Œ์˜ ๋‘๊ฐ€์ง€ ์ƒํ™ฉ์—์„œ๋Š” ๋ช…์‹œ์  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1910. (1) ์ผ๋ถ€ ์‹œ์Šคํ…œ์—์„œ I/O ์Šคํ† ์–ด๋Š” ๋ชจ๋“  CPU ์— ์ผ๊ด€๋˜๊ฒŒ ์ˆœ์„œ ๋งž์ถฐ์ง€์ง€ ์•Š๋Š”๋ฐ,
  1911. ๋”ฐ๋ผ์„œ _๋ชจ๋“ _ ์ผ๋ฐ˜์ ์ธ ๋“œ๋ผ์ด๋ฒ„๋“ค์— ๋ฝ์ด ์‚ฌ์šฉ๋˜์–ด์•ผ๋งŒ ํ•˜๊ณ  ์ด ํฌ๋ฆฌํ‹ฐ์ปฌ
  1912. ์„น์…˜์„ ๋น ์ ธ๋‚˜์˜ค๊ธฐ ์ „์— mmiowb() ๊ฐ€ ๊ผญ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1913. (2) ๋งŒ์•ฝ ์•ก์„ธ์Šค ํ•จ์ˆ˜๋“ค์ด ์™„ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์†์„ฑ์„ ๊ฐ–๋Š” I/O ๋ฉ”๋ชจ๋ฆฌ ์œˆ๋„์šฐ๋ฅผ
  1914. ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ˆœ์„œ๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด์„  _mandatory_ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  1915. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  Documentation/DocBook/deviceiobook.tmpl ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  1916. ์ธํ„ฐ๋ŸฝํŠธ
  1917. --------
  1918. ๋“œ๋ผ์ด๋ฒ„๋Š” ์ž์‹ ์˜ ์ธํ„ฐ๋ŸฝํŠธ ์„œ๋น„์Šค ๋ฃจํ‹ด์— ์˜ํ•ด ์ธํ„ฐ๋ŸฝํŠธ ๋‹นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
  1919. ๋“œ๋ผ์ด๋ฒ„์˜ ์ด ๋‘ ๋ถ€๋ถ„์€ ์„œ๋กœ์˜ ๋””๋ฐ”์ด์Šค ์ œ์–ด ๋˜๋Š” ์•ก์„ธ์Šค ๋ถ€๋ถ„๊ณผ ์ƒํ˜ธ ๊ฐ„์„ญํ•  ์ˆ˜
  1920. ์žˆ์Šต๋‹ˆ๋‹ค.
  1921. ์Šค์Šค๋กœ์—๊ฒŒ ์ธํ„ฐ๋ŸฝํŠธ ๋‹นํ•˜๋Š” ๊ฑธ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ , ๋“œ๋ผ์ด๋ฒ„์˜ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ
  1922. ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ๋ชจ๋‘ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ ์˜์—ญ์— ์ง‘์–ด๋„ฃ๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ฐฉ๋ฒ• (๋ฝ์˜
  1923. ํ•œ ํ˜•ํƒœ) ์œผ๋กœ ์ด๋Ÿฐ ์ƒํ˜ธ ๊ฐ„์„ญ์„ - ์ตœ์†Œํ•œ ๋ถ€๋ถ„์ ์œผ๋กœ๋ผ๋„ - ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1924. ๋“œ๋ผ์ด๋ฒ„์˜ ์ธํ„ฐ๋ŸฝํŠธ ๋ฃจํ‹ด์ด ์‹คํ–‰ ์ค‘์ธ ๋™์•ˆ, ํ•ด๋‹น ๋“œ๋ผ์ด๋ฒ„์˜ ์ฝ”์–ด๋Š” ๊ฐ™์€ CPU ์—์„œ
  1925. ์ˆ˜ํ–‰๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ, ํ˜„์žฌ์˜ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ์ค‘์—๋Š” ๋˜๋‹ค์‹œ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€
  1926. ์ผ์–ด๋‚˜์ง€ ๋ชปํ•˜๋„๋ก ๋˜์–ด ์žˆ์œผ๋‹ˆ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ทธ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฝ์„ ์žก์ง€ ์•Š์•„๋„
  1927. ๋ฉ๋‹ˆ๋‹ค.
  1928. ํ•˜์ง€๋งŒ, ์–ด๋“œ๋ ˆ์Šค ๋ ˆ์ง€์Šคํ„ฐ์™€ ๋ฐ์ดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ–๋Š” ์ด๋”๋„ท ์นด๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š”
  1929. ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค. ๋งŒ์•ฝ ์ด ๋“œ๋ผ์ด๋ฒ„์˜ ์ฝ”์–ด๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”์‹œํ‚จ
  1930. ์ฑ„๋กœ ์ด๋”๋„ท ์นด๋“œ์™€ ๋Œ€ํ™”ํ•˜๊ณ  ๋“œ๋ผ์ด๋ฒ„์˜ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค๋ฉด:
  1931. LOCAL IRQ DISABLE
  1932. writew(ADDR, 3);
  1933. writew(DATA, y);
  1934. LOCAL IRQ ENABLE
  1935. <interrupt>
  1936. writew(ADDR, 4);
  1937. q = readw(DATA);
  1938. </interrupt>
  1939. ๋งŒ์•ฝ ์ˆœ์„œ ๊ทœ์น™์ด ์ถฉ๋ถ„ํžˆ ์™„ํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ์—์˜ ์Šคํ† ์–ด๋Š” ์–ด๋“œ๋ ˆ์Šค
  1940. ๋ ˆ์ง€์Šคํ„ฐ์— ๋‘๋ฒˆ์งธ๋กœ ํ–‰ํ•ด์ง€๋Š” ์Šคํ† ์–ด ๋’ค์— ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1941. STORE *ADDR = 3, STORE *ADDR = 4, STORE *DATA = y, q = LOAD *DATA
  1942. ๋งŒ์•ฝ ์ˆœ์„œ ๊ทœ์น™์ด ์ถฉ๋ถ„ํžˆ ์™„ํ™”๋˜์–ด ์žˆ๊ณ  ๋ฌต์‹œ์ ์œผ๋กœ๋“  ๋ช…์‹œ์ ์œผ๋กœ๋“  ๋ฐฐ๋ฆฌ์–ด๊ฐ€
  1943. ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ์„น์…˜์—์„œ ์ผ์–ด๋‚œ ์•ก์„ธ์Šค๊ฐ€ ๋ฐ”๊นฅ์œผ๋กœ ์ƒˆ์–ด์„œ
  1944. ์ธํ„ฐ๋ŸฝํŠธ ๋‚ด์—์„œ ์ผ์–ด๋‚œ ์•ก์„ธ์Šค์™€ ์„ž์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  - ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ˜๋Œ€๋„ - ๊ฐ€์ •ํ•ด์•ผ๋งŒ
  1945. ํ•ฉ๋‹ˆ๋‹ค.
  1946. ๊ทธ๋Ÿฐ ์˜์—ญ ์•ˆ์—์„œ ์ผ์–ด๋‚˜๋Š” I/O ์•ก์„ธ์Šค๋“ค์€ ์—„๊ฒฉํ•œ ์ˆœ์„œ ๊ทœ์น™์˜ I/O ๋ ˆ์ง€์Šคํ„ฐ์—
  1947. ๋ฌต์‹œ์  I/O ๋ฐฐ๋ฆฌ์–ด๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋™๊ธฐ์  (synchronous) ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์„ ํฌํ•จํ•˜๊ธฐ
  1948. ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ด๋Ÿฐ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด๊ฑธ๋กœ๋Š” ์ถฉ๋ถ„์น˜ ์•Š๋‹ค๋ฉด
  1949. mmiowb() ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  1950. ํ•˜๋‚˜์˜ ์ธํ„ฐ๋ŸฝํŠธ ๋ฃจํ‹ด๊ณผ ๋ณ„๋„์˜ CPU ์—์„œ ์ˆ˜ํ–‰์ค‘์ด๋ฉฐ ์„œ๋กœ ํ†ต์‹ ์„ ํ•˜๋Š” ๋‘ ๋ฃจํ‹ด
  1951. ์‚ฌ์ด์—๋„ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด
  1952. ์žˆ๋‹ค๋ฉด, ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ๋ฝ์ด ์‚ฌ์šฉ๋˜์–ด์ ธ์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  1953. ======================
  1954. ์ปค๋„ I/O ๋ฐฐ๋ฆฌ์–ด์˜ ํšจ๊ณผ
  1955. ======================
  1956. I/O ๋ฉ”๋ชจ๋ฆฌ์— ์•ก์„ธ์Šคํ•  ๋•Œ, ๋“œ๋ผ์ด๋ฒ„๋Š” ์ ์ ˆํ•œ ์•ก์„ธ์Šค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  1957. (*) inX(), outX():
  1958. ์ด๊ฒƒ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋ณด๋‹ค๋Š” I/O ๊ณต๊ฐ„์— ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋ ค๋Š” ์˜๋„๋กœ
  1959. ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค๋งŒ, ๊ทธ๊ฑด ๊ธฐ๋ณธ์ ์œผ๋กœ CPU ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ปจ์…‰์ž…๋‹ˆ๋‹ค. i386 ๊ณผ
  1960. x86_64 ํ”„๋กœ์„ธ์„œ๋“ค์€ ํŠน๋ณ„ํ•œ I/O ๊ณต๊ฐ„ ์•ก์„ธ์Šค ์‚ฌ์ดํด๊ณผ ๋ช…๋ น์–ด๋ฅผ ์‹ค์ œ๋กœ ๊ฐ€์ง€๊ณ 
  1961. ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๋งŽ์€ CPU ๋“ค์—๋Š” ๊ทธ๋Ÿฐ ์ปจ์…‰์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1962. ๋‹ค๋ฅธ ๊ฒƒ๋“ค ์ค‘์—์„œ๋„ PCI ๋ฒ„์Šค๊ฐ€ I/O ๊ณต๊ฐ„ ์ปจ์…‰์„ ์ •์˜ํ•˜๋Š”๋ฐ, ์ด๋Š” - i386 ๊ณผ
  1963. x86_64 ๊ฐ™์€ CPU ์—์„œ - CPU ์˜ I/O ๊ณต๊ฐ„ ์ปจ์…‰์œผ๋กœ ์‰ฝ๊ฒŒ ๋งค์น˜๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ,
  1964. ๋Œ€์ฒดํ•  I/O ๊ณต๊ฐ„์ด ์—†๋Š” CPU ์—์„œ๋Š” CPU ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋งต์˜ ๊ฐ€์ƒ I/O ๊ณต๊ฐ„์œผ๋กœ
  1965. ๋งคํ•‘๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  1966. ์ด ๊ณต๊ฐ„์œผ๋กœ์˜ ์•ก์„ธ์Šค๋Š” (i386 ๋“ฑ์—์„œ๋Š”) ์™„์ „ํ•˜๊ฒŒ ๋™๊ธฐํ™” ๋ฉ๋‹ˆ๋‹ค๋งŒ, ์ค‘๊ฐ„์˜
  1967. (PCI ํ˜ธ์ŠคํŠธ ๋ธŒ๋ฆฌ์ง€์™€ ๊ฐ™์€) ๋ธŒ๋ฆฌ์ง€๋“ค์€ ์ด๋ฅผ ์™„์ „ํžˆ ๋ณด์žฅํ•˜์ง„ ์•Š์„์ˆ˜๋„
  1968. ์žˆ์Šต๋‹ˆ๋‹ค.
  1969. ์ด๊ฒƒ๋“ค์˜ ์ƒํ˜ธ๊ฐ„์˜ ์ˆœ์„œ๋Š” ์™„์ „ํ•˜๊ฒŒ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  1970. ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜, I/O ์˜คํผ๋ ˆ์ด์…˜์— ๋Œ€ํ•œ ์ˆœ์„œ๋Š” ์™„์ „ํ•˜๊ฒŒ
  1971. ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  1972. (*) readX(), writeX():
  1973. ์ด๊ฒƒ๋“ค์ด ์ˆ˜ํ–‰ ์š”์ฒญ๋˜๋Š” CPU ์—์„œ ์„œ๋กœ์—๊ฒŒ ์™„์ „ํžˆ ์ˆœ์„œ๊ฐ€ ๋งž์ถฐ์ง€๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ
  1974. ์ˆ˜ํ–‰๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ณด์žฅ ์—ฌ๋ถ€๋Š” ์ด๋“ค์ด ์•ก์„ธ์Šค ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์œˆ๋„์šฐ์— ์ •์˜๋œ
  1975. ํŠน์„ฑ์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ตœ์‹ ์˜ i386 ์•„ํ‚คํ…์ณ ๋จธ์‹ ์—์„œ๋Š” MTRR
  1976. ๋ ˆ์ง€์Šคํ„ฐ๋กœ ์ด ํŠน์„ฑ์ด ์กฐ์ •๋ฉ๋‹ˆ๋‹ค.
  1977. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š”, ํ”„๋ฆฌํŽ˜์น˜ (prefetch) ๊ฐ€๋Šฅํ•œ ๋””๋ฐ”์ด์Šค๋ฅผ ์•ก์„ธ์Šค ํ•˜๋Š”๊ฒŒ
  1978. ์•„๋‹ˆ๋ผ๋ฉด, ์ด๊ฒƒ๋“ค์€ ์™„์ „ํžˆ ์ˆœ์„œ๊ฐ€ ๋งž์ถฐ์ง€๊ณ  ๊ฒฐํ•ฉ๋˜์ง€ ์•Š๊ฒŒ ๋ณด์žฅ๋  ๊ฒ๋‹ˆ๋‹ค.
  1979. ํ•˜์ง€๋งŒ, (PCI ๋ธŒ๋ฆฌ์ง€์™€ ๊ฐ™์€) ์ค‘๊ฐ„์˜ ํ•˜๋“œ์›จ์–ด๋Š” ์ž์‹ ์ด ์›ํ•œ๋‹ค๋ฉด ์ง‘ํ–‰์„
  1980. ์—ฐ๊ธฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค; ์Šคํ† ์–ด ๋ช…๋ น์„ ์‹ค์ œ๋กœ ํ•˜๋“œ์›จ์–ด๋กœ ๋‚ด๋ ค๋ณด๋‚ด๊ธฐ(flush)
  1981. ์œ„ํ•ด์„œ๋Š” ๊ฐ™์€ ์œ„์น˜๋กœ๋ถ€ํ„ฐ ๋กœ๋“œ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ[*], PCI ์˜ ๊ฒฝ์šฐ๋Š”
  1982. ๊ฐ™์€ ๋””๋ฐ”์ด์Šค๋‚˜ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ์˜์—ญ์—์„œ์˜ ๋กœ๋“œ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ๊ฒ๋‹ˆ๋‹ค.
  1983. [*] ์ฃผ์˜! ์“ฐ์—ฌ์ง„ ๊ฒƒ๊ณผ ๊ฐ™์€ ์œ„์น˜๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋™์ž‘์„
  1984. ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค - ์˜ˆ๋กœ 16650 Rx/Tx ์‹œ๋ฆฌ์–ผ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ƒ๊ฐํ•ด
  1985. ๋ณด์„ธ์š”.
  1986. ํ”„๋ฆฌํŽ˜์น˜ ๊ฐ€๋Šฅํ•œ I/O ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด, ์Šคํ† ์–ด ๋ช…๋ น๋“ค์ด ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๋„๋ก
  1987. ํ•˜๊ธฐ ์œ„ํ•ด mmiowb() ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1988. PCI ํŠธ๋žœ์žญ์…˜ ์‚ฌ์ด์˜ ์ƒํ˜ธ์ž‘์šฉ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  PCI ๋ช…์„ธ์„œ๋ฅผ
  1989. ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  1990. (*) readX_relaxed(), writeX_relaxed()
  1991. ์ด๊ฒƒ๋“ค์€ readX() ์™€ writeX() ๋ž‘ ๋น„์Šทํ•˜์ง€๋งŒ, ๋” ์™„ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์ˆœ์„œ ๋ณด์žฅ์„
  1992. ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ์ด๊ฒƒ๋“ค์€ ์ผ๋ฐ˜์  ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค (์˜ˆ: DMA ๋ฒ„ํผ) ์—๋„
  1993. LOCK ์ด๋‚˜ UNLOCK ์˜คํผ๋ ˆ์ด์…˜๋“ค์—๋„ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LOCK ์ด๋‚˜
  1994. UNLOCK ์˜คํผ๋ ˆ์ด์…˜๋“ค์— ๋งž์ถฐ์ง€๋Š” ์ˆœ์„œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, mmiowb() ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์‚ฌ์šฉ๋ 
  1995. ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์ฃผ๋ณ€ ์žฅ์น˜์—์˜ ์™„ํ™”๋œ ์•ก์„ธ์Šค๋ผ๋ฆฌ๋Š” ์ˆœ์„œ๊ฐ€ ์ง€์ผœ์ง์„ ์•Œ์•„
  1996. ๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  1997. (*) ioreadX(), iowriteX()
  1998. ์ด๊ฒƒ๋“ค์€ inX()/outX() ๋‚˜ readX()/writeX() ์ฒ˜๋Ÿผ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์•ก์„ธ์Šค์˜
  1999. ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ์ˆ˜ํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2000. ===================================
  2001. ๊ฐ€์ •๋˜๋Š” ๊ฐ€์žฅ ์™„ํ™”๋œ ์‹คํ–‰ ์ˆœ์„œ ๋ชจ๋ธ
  2002. ===================================
  2003. ์ปจ์…‰์ ์œผ๋กœ CPU ๋Š” ์ฃผ์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ํ”„๋กœ๊ทธ๋žจ ๊ทธ ์ž์ฒด์—๋Š” ์ธ๊ณผ์„ฑ (program
  2004. causality) ์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ˆœ์„œ๋ฅผ ๊ฑฐ์˜ ์ง€์ผœ์ฃผ์ง€
  2005. ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •๋˜์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. (i386 ์ด๋‚˜ x86_64 ๊ฐ™์€) ์ผ๋ถ€ CPU ๋“ค์€ ์ฝ”๋“œ
  2006. ์žฌ๋ฐฐ์น˜์— (powerpc ๋‚˜ frv ์™€ ๊ฐ™์€) ๋‹ค๋ฅธ ๊ฒƒ๋“ค์— ๋น„ํ•ด ๊ฐ•ํ•œ ์ œ์•ฝ์„ ๊ฐ–์ง€๋งŒ, ์•„ํ‚คํ…์ณ
  2007. ์ข…์†์  ์ฝ”๋“œ ์ด์™ธ์˜ ์ฝ”๋“œ์—์„œ๋Š” ์ˆœ์„œ์— ๋Œ€ํ•œ ์ œ์•ฝ์ด ๊ฐ€์žฅ ์™„ํ™”๋œ ๊ฒฝ์šฐ (DEC Alpha)
  2008. ๋ฅผ ๊ฐ€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2009. ์ด ๋ง์€, CPU ์—๊ฒŒ ์ฃผ์–ด์ง€๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ŠคํŠธ๋ฆผ ๋‚ด์˜ ํ•œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ์•ž์˜
  2010. ์ธ์ŠคํŠธ๋Ÿญ์…˜์— ์ข…์†์ ์ด๋ผ๋ฉด ์•ž์˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ๋’ค์˜ ์ข…์†์  ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ์‹คํ–‰๋˜๊ธฐ
  2011. ์ „์— ์™„๋ฃŒ[*]๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ (๋‹ฌ๋ฆฌ ๋งํ•ด์„œ, ์ธ๊ณผ์„ฑ์ด ์ง€์ผœ์ง€๋Š” ๊ฒƒ์œผ๋กœ
  2012. ๋ณด์ด๊ฒŒ ํ•จ) ์™ธ์—๋Š” ์ž์‹ ์ด ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ - ์‹ฌ์ง€์–ด ๋ณ‘๋ ฌ์ ์œผ๋กœ๋„ - ๊ทธ ์ŠคํŠธ๋ฆผ์„
  2013. ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค
  2014. [*] ์ผ๋ถ€ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์˜ํ–ฅ - ์กฐ๊ฑด ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พผ๋‹ค๋˜์ง€, ๋ ˆ์ง€์Šคํ„ฐ๋‚˜
  2015. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค๋˜์ง€ - ์„ ๋งŒ๋“ค์–ด๋‚ด๋ฉฐ, ๋‹ค๋ฅธ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ๋‹ค๋ฅธ ํšจ๊ณผ์—
  2016. ์ข…์†์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2017. CPU ๋Š” ์ตœ์ข…์ ์œผ๋กœ ์•„๋ฌด ํšจ๊ณผ๋„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์‹œํ€€์Šค๋Š” ์—†์• ๋ฒ„๋ฆด ์ˆ˜๋„
  2018. ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ ๋‘๊ฐœ์˜ ์—ฐ์†๋˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ๋‘˜ ๋‹ค ๊ฐ™์€ ๋ ˆ์ง€์Šคํ„ฐ์—
  2019. ์ง์ ‘์ ์ธ ๊ฐ’ (immediate value) ์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค๋ฉด, ์ฒซ๋ฒˆ์งธ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ๋ฒ„๋ ค์งˆ ์ˆ˜๋„
  2020. ์žˆ์Šต๋‹ˆ๋‹ค.
  2021. ๋น„์Šทํ•˜๊ฒŒ, ์ปดํŒŒ์ผ๋Ÿฌ ์—ญ์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ๊ณผ์„ฑ๋งŒ ์ง€์ผœ์ค€๋‹ค๋ฉด ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ŠคํŠธ๋ฆผ์„
  2022. ์ž์‹ ์ด ๋ณด๊ธฐ์— ์˜ฌ๋ฐ”๋ฅด๋‹ค ์ƒ๊ฐ๋˜๋Š”๋Œ€๋กœ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2023. ===============
  2024. CPU ์บ์‹œ์˜ ์˜ํ–ฅ
  2025. ===============
  2026. ์บ์‹œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ์‹œ์Šคํ…œ ์ „์ฒด์— ์–ด๋–ป๊ฒŒ ์ธ์ง€๋˜๋Š”์ง€๋Š” CPU ์™€ ๋ฉ”๋ชจ๋ฆฌ
  2027. ์‚ฌ์ด์— ์กด์žฌํ•˜๋Š” ์บ์‹œ๋“ค, ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ผ๊ด€์„ฑ
  2028. ์‹œ์Šคํ…œ์— ์ƒ๋‹น ๋ถ€๋ถ„ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  2029. ํ•œ CPU ๊ฐ€ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋“ค๊ณผ ์บ์‹œ๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์€
  2030. CPU ์˜ ์บ์‹œ๋“ค์„ ํฌํ•จํ•ด์•ผ ํ•˜๋ฉฐ, CPU ์™€ CPU ์ž์‹ ์˜ ์บ์‹œ ์‚ฌ์ด์—์„œ์˜ ๋™์ž‘์„ ์œ„ํ•œ
  2031. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” ๋‹ค์Œ ๊ทธ๋ฆผ์˜
  2032. ์ ์„ ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค):
  2033. <--- CPU ---> : <----------- Memory ----------->
  2034. :
  2035. +--------+ +--------+ : +--------+ +-----------+
  2036. | | | | : | | | | +--------+
  2037. | CPU | | Memory | : | CPU | | | | |
  2038. | Core |--->| Access |----->| Cache |<-->| | | |
  2039. | | | Queue | : | | | |--->| Memory |
  2040. | | | | : | | | | | |
  2041. +--------+ +--------+ : +--------+ | | | |
  2042. : | Cache | +--------+
  2043. : | Coherency |
  2044. : | Mechanism | +--------+
  2045. +--------+ +--------+ : +--------+ | | | |
  2046. | | | | : | | | | | |
  2047. | CPU | | Memory | : | CPU | | |--->| Device |
  2048. | Core |--->| Access |----->| Cache |<-->| | | |
  2049. | | | Queue | : | | | | | |
  2050. | | | | : | | | | +--------+
  2051. +--------+ +--------+ : +--------+ +-----------+
  2052. :
  2053. :
  2054. ํŠน์ • ๋กœ๋“œ๋‚˜ ์Šคํ† ์–ด๋Š” ํ•ด๋‹น ์˜คํผ๋ ˆ์ด์…˜์„ ์š”์ฒญํ•œ CPU ์˜ ์บ์‹œ ๋‚ด์—์„œ ๋™์ž‘์„ ์™„๋ฃŒํ• 
  2055. ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น CPU ์˜ ๋ฐ”๊นฅ์—๋Š” ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ CPU ๊ฐ€ ๊ด€์‹ฌ์„
  2056. ๊ฐ–๋Š”๋‹ค๋ฉด ์บ์‹œ ์ผ๊ด€์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•ด๋‹น ์บ์‹œ๋ผ์ธ์„ ํ•ด๋‹น CPU ์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ํ•ด๋‹น
  2057. ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•œ ์˜คํผ๋ ˆ์ด์…˜์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ ์˜ํ–ฅ์„ ์ „ํŒŒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น
  2058. ์˜คํผ๋ ˆ์ด์…˜์€ ๋ฉ”๋ชจ๋ฆฌ์— ์‹ค์ œ๋กœ ์•ก์„ธ์Šค๋ฅผ ํ•œ๊ฒƒ์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2059. CPU ์ฝ”์–ด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ๊ณผ์„ฑ์ด ์œ ์ง€๋œ๋‹ค๊ณ ๋งŒ ์—ฌ๊ฒจ์ง„๋‹ค๋ฉด ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์„ ์–ด๋–ค
  2060. ์ˆœ์„œ๋กœ๋“  ์žฌ๋ฐฐ์น˜ํ•ด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์€ ๋กœ๋“œ๋‚˜ ์Šคํ† ์–ด
  2061. ์˜คํผ๋ ˆ์ด์…˜์„ ๋งŒ๋“œ๋Š”๋ฐ ์ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์ดํ›„ ์ˆ˜ํ–‰๋  ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ํ์— ๋“ค์–ด๊ฐ€๊ฒŒ
  2062. ๋ฉ๋‹ˆ๋‹ค. ์ฝ”์–ด๋Š” ์ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ํ•ด๋‹น ํ์— ์–ด๋–ค ์ˆœ์„œ๋กœ๋“  ์›ํ•˜๋Š”๋Œ€๋กœ ๋„ฃ์„ ์ˆ˜
  2063. ์žˆ๊ณ , ๋‹ค๋ฅธ ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ๊ฐ•์ œ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ˆ˜ํ–‰์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
  2064. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•˜๋Š” ์ผ์€ CPU ์ชฝ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ชฝ์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์•ก์„ธ์Šค๋“ค์˜ ์ˆœ์„œ,
  2065. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์•ก์„ธ์Šค์˜ ๊ฒฐ๊ณผ๊ฐ€ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๊ด€์ฐฐ์ž๋“ค์—๊ฒŒ ์ธ์ง€๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๋Š”
  2066. ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2067. [!] CPU ๋“ค์€ ํ•ญ์ƒ ๊ทธ๋“ค ์ž์‹ ์˜ ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋Š” ํ”„๋กœ๊ทธ๋žจ ์ˆœ์„œ๋Œ€๋กœ ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ
  2068. ๋ณด๊ธฐ ๋•Œ๋ฌธ์—, ์ฃผ์–ด์ง„ CPU ๋‚ด์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ _์—†์Šต๋‹ˆ๋‹ค_.
  2069. [!] MMIO ๋‚˜ ๋‹ค๋ฅธ ๋””๋ฐ”์ด์Šค ์•ก์„ธ์Šค๋“ค์€ ์บ์‹œ ์‹œ์Šคํ…œ์„ ์šฐํšŒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐํšŒ
  2070. ์—ฌ๋ถ€๋Š” ๋””๋ฐ”์ด์Šค๊ฐ€ ์•ก์„ธ์Šค ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์œˆ๋„์šฐ์˜ ํŠน์„ฑ์— ์˜ํ•ด ๊ฒฐ์ •๋  ์ˆ˜๋„ ์žˆ๊ณ , CPU
  2071. ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ํ•œ ๋””๋ฐ”์ด์Šค ํ†ต์‹  ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์‚ฌ์šฉ์— ์˜ํ•ด์„œ ๊ฒฐ์ •๋ 
  2072. ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  2073. ์บ์‹œ ์ผ๊ด€์„ฑ
  2074. -----------
  2075. ํ•˜์ง€๋งŒ ์‚ถ์€ ์•ž์—์„œ ์ด์•ผ๊ธฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: ์บ์‹œ๋“ค์€ ์ผ๊ด€์ ์ผ ๊ฒƒ์œผ๋กœ
  2076. ๊ธฐ๋Œ€๋˜์ง€๋งŒ, ๊ทธ ์ผ๊ด€์„ฑ์ด ์ˆœ์„œ์—๋„ ์ ์šฉ๋  ๊ฑฐ๋ผ๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ํ•œ CPU ์—์„œ
  2077. ๋งŒ๋“ค์–ด์ง„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ตœ์ข…์ ์œผ๋กœ๋Š” ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  CPU ์—๊ฒŒ ๋ณด์—ฌ์ง€๊ฒŒ ๋˜์ง€๋งŒ, ๋‹ค๋ฅธ
  2078. CPU ๋“ค์—๊ฒŒ๋„ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋ณด์ด๊ฒŒ ๋  ๊ฑฐ๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  2079. ๋‘๊ฐœ์˜ CPU (1 & 2) ๊ฐ€ ๋‹ฌ๋ ค ์žˆ๊ณ , ๊ฐ CPU ์— ๋‘๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์บ์‹œ(CPU 1 ์€ A/B ๋ฅผ,
  2080. CPU 2 ๋Š” C/D ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค)๊ฐ€ ๋ณ‘๋ ฌ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ๋‹ค๋ฃฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ด
  2081. ๋ด…์‹œ๋‹ค:
  2082. :
  2083. : +--------+
  2084. : +---------+ | |
  2085. +--------+ : +--->| Cache A |<------->| |
  2086. | | : | +---------+ | |
  2087. | CPU 1 |<---+ | |
  2088. | | : | +---------+ | |
  2089. +--------+ : +--->| Cache B |<------->| |
  2090. : +---------+ | |
  2091. : | Memory |
  2092. : +---------+ | System |
  2093. +--------+ : +--->| Cache C |<------->| |
  2094. | | : | +---------+ | |
  2095. | CPU 2 |<---+ | |
  2096. | | : | +---------+ | |
  2097. +--------+ : +--->| Cache D |<------->| |
  2098. : +---------+ | |
  2099. : +--------+
  2100. :
  2101. ์ด ์‹œ์Šคํ…œ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ๊ฐ–๋Š”๋‹ค ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  2102. (*) ํ™€์ˆ˜๋ฒˆ ์บ์‹œ๋ผ์ธ์€ ์บ์‹œ A, ์บ์‹œ C ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ์Œ;
  2103. (*) ์ง์ˆ˜๋ฒˆ ์บ์‹œ๋ผ์ธ์€ ์บ์‹œ B, ์บ์‹œ D ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ์Œ;
  2104. (*) CPU ์ฝ”์–ด๊ฐ€ ํ•œ๊ฐœ์˜ ์บ์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๋™์•ˆ, ๋‹ค๋ฅธ ์บ์‹œ๋Š” - ๋”ํ‹ฐ ์บ์‹œ๋ผ์ธ์„
  2105. ๋ฉ”๋ชจ๋ฆฌ์— ๋‚ด๋ฆฌ๊ฑฐ๋‚˜ ์ถ”์ธก์„ฑ ๋กœ๋“œ๋ฅผ ํ•˜๊ฑฐ๋‚˜ ํ•˜๊ธฐ ์œ„ํ•ด - ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—
  2106. ์•ก์„ธ์Šค ํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ;
  2107. (*) ๊ฐ ์บ์‹œ๋Š” ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๋“ค๊ณผ ์ผ๊ด€์„ฑ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์บ์‹œ์—
  2108. ์ ์šฉ๋˜์–ด์•ผ ํ•  ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ํ๋ฅผ ๊ฐ€์ง;
  2109. (*) ์ด ์ผ๊ด€์„ฑ ํ๋Š” ์บ์‹œ์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ผ์ธ์— ๊ฐ€ํ•ด์ง€๋Š” ํ‰๋ฒ”ํ•œ ๋กœ๋“œ์— ์˜ํ•ด์„œ๋Š”
  2110. ๋น„์›Œ์ง€์ง€ ์•Š๋Š”๋ฐ, ํ์˜ ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ์ด ๋กœ๋“œ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ๋‹ค
  2111. ํ• ์ง€๋ผ๋„ ๊ทธ๋Ÿฌํ•จ.
  2112. ์ด์ œ, ์ฒซ๋ฒˆ์งธ CPU ์—์„œ ๋‘๊ฐœ์˜ ์“ฐ๊ธฐ ์˜คํผ๋ ˆ์ด์…˜์„ ๋งŒ๋“œ๋Š”๋ฐ, ํ•ด๋‹น CPU ์˜ ์บ์‹œ์—
  2113. ์š”์ฒญ๋œ ์ˆœ์„œ๋กœ ์˜คํผ๋ ˆ์ด์…˜์ด ๋„๋‹ฌ๋จ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ์˜คํผ๋ ˆ์ด์…˜ ์‚ฌ์ด์— ์“ฐ๊ธฐ
  2114. ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค:
  2115. CPU 1 CPU 2 COMMENT
  2116. =============== =============== =======================================
  2117. u == 0, v == 1 and p == &u, q == &u
  2118. v = 2;
  2119. smp_wmb(); v ์˜ ๋ณ€๊ฒฝ์ด p ์˜ ๋ณ€๊ฒฝ ์ „์— ๋ณด์ผ ๊ฒƒ์„
  2120. ๋ถ„๋ช…ํžˆ ํ•จ
  2121. <A:modify v=2> v ๋Š” ์ด์ œ ์บ์‹œ A ์— ๋…์ ์ ์œผ๋กœ ์กด์žฌํ•จ
  2122. p = &v;
  2123. <B:modify p=&v> p ๋Š” ์ด์ œ ์บ์‹œ B ์— ๋…์ ์ ์œผ๋กœ ์กด์žฌํ•จ
  2124. ์—ฌ๊ธฐ์„œ์˜ ์“ฐ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” CPU 1 ์˜ ์บ์‹œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์—…๋ฐ์ดํŠธ ๋œ ๊ฒƒ์œผ๋กœ
  2125. ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ CPU ๋“ค์ด ์ธ์ง€ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ด์ œ ๋‘๋ฒˆ์งธ CPU ๊ฐ€ ๊ทธ ๊ฐ’๋“ค์„
  2126. ์ฝ์œผ๋ ค ํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  2127. CPU 1 CPU 2 COMMENT
  2128. =============== =============== =======================================
  2129. ...
  2130. q = p;
  2131. x = *q;
  2132. ์œ„์˜ ๋‘๊ฐœ์˜ ์ฝ๊ธฐ ์˜คํผ๋ ˆ์ด์…˜์€ ์˜ˆ์ƒ๋œ ์ˆœ์„œ๋กœ ์ผ์–ด๋‚˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‘๋ฒˆ์งธ CPU
  2133. ์˜ ํ•œ ์บ์‹œ์— ๋‹ค๋ฅธ ์บ์‹œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด v ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์บ์‹œ๋ผ์ธ์˜ ํ•ด๋‹น ์บ์‹œ์—์˜
  2134. ์—…๋ฐ์ดํŠธ๊ฐ€ ์ง€์—ฐ๋˜๋Š” ์‚ฌ์ด, p ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์บ์‹œ๋ผ์ธ์€ ๋‘๋ฒˆ์งธ CPU ์˜ ๋‹ค๋ฅธ ์บ์‹œ์—
  2135. ์—…๋ฐ์ดํŠธ ๋˜์–ด๋ฒ„๋ ธ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  2136. CPU 1 CPU 2 COMMENT
  2137. =============== =============== =======================================
  2138. u == 0, v == 1 and p == &u, q == &u
  2139. v = 2;
  2140. smp_wmb();
  2141. <A:modify v=2> <C:busy>
  2142. <C:queue v=2>
  2143. p = &v; q = p;
  2144. <D:request p>
  2145. <B:modify p=&v> <D:commit p=&v>
  2146. <D:read p>
  2147. x = *q;
  2148. <C:read *q> ์บ์‹œ์— ์—…๋ฐ์ดํŠธ ๋˜๊ธฐ ์ „์˜ v ๋ฅผ ์ฝ์Œ
  2149. <C:unbusy>
  2150. <C:commit v=2>
  2151. ๊ธฐ๋ณธ์ ์œผ๋กœ, ๋‘๊ฐœ์˜ ์บ์‹œ๋ผ์ธ ๋ชจ๋‘ CPU 2 ์— ์ตœ์ข…์ ์œผ๋กœ๋Š” ์—…๋ฐ์ดํŠธ ๋  ๊ฒƒ์ด์ง€๋งŒ,
  2152. ๋ณ„๋„์˜ ๊ฐœ์ž… ์—†์ด๋Š”, ์—…๋ฐ์ดํŠธ์˜ ์ˆœ์„œ๊ฐ€ CPU 1 ์—์„œ ๋งŒ๋“ค์–ด์ง„ ์ˆœ์„œ์™€ ๋™์ผํ• 
  2153. ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค.
  2154. ์—ฌ๊ธฐ์— ๊ฐœ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„ , ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค
  2155. ์‚ฌ์ด์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์บ์‹œ๊ฐ€ ๋‹ค์Œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ์ผ๊ด€์„ฑ
  2156. ํ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  2157. CPU 1 CPU 2 COMMENT
  2158. =============== =============== =======================================
  2159. u == 0, v == 1 and p == &u, q == &u
  2160. v = 2;
  2161. smp_wmb();
  2162. <A:modify v=2> <C:busy>
  2163. <C:queue v=2>
  2164. p = &v; q = p;
  2165. <D:request p>
  2166. <B:modify p=&v> <D:commit p=&v>
  2167. <D:read p>
  2168. smp_read_barrier_depends()
  2169. <C:unbusy>
  2170. <C:commit v=2>
  2171. x = *q;
  2172. <C:read *q> ์บ์‹œ์— ์—…๋ฐ์ดํŠธ ๋œ v ๋ฅผ ์ฝ์Œ
  2173. ์ด๋Ÿฐ ๋ถ€๋ฅ˜์˜ ๋ฌธ์ œ๋Š” DEC Alpha ๊ณ„์—ด ํ”„๋กœ์„ธ์„œ๋“ค์—์„œ ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋“ค์€
  2174. ๋ฐ์ดํ„ฐ ๋ฒ„์Šค๋ฅผ ์ข€ ๋” ์ž˜ ์‚ฌ์šฉํ•ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”, ๋ถ„ํ• ๋œ ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ
  2175. ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ CPU ๋Š” ํ•˜๋‚˜์˜ ์ฝ๊ธฐ ์˜คํผ๋ ˆ์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ์ฝ๊ธฐ
  2176. ์˜คํผ๋ ˆ์ด์…˜์— ์˜์กด์ ์ด๋ผ๋ฉด ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌ์‹œํ‚ต๋‹ˆ๋‹ค๋งŒ, ๋ชจ๋‘๊ฐ€ ๊ทธ๋Ÿฐ๊ฑด
  2177. ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ ์— ์˜์กดํ•ด์„  ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  2178. ๋‹ค๋ฅธ CPU ๋“ค๋„ ๋ถ„ํ• ๋œ ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋Ÿฐ CPU ๋“ค์€ ํ‰๋ฒ”ํ•œ ๋ฉ”๋ชจ๋ฆฌ
  2179. ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด์„œ๋„ ์ด ๋ถ„ํ• ๋œ ์บ์‹œ๋“ค ์‚ฌ์ด์˜ ์กฐ์ •์„ ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. Alpha ๋Š” ๊ฐ€์žฅ
  2180. ์•ฝํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ˆœ์„œ ์‹œ๋งจํ‹ฑ (semantic) ์„ ์„ ํƒํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ
  2181. ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์„ ๋•Œ์—๋Š” ๊ทธ๋Ÿฐ ์กฐ์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2182. ์บ์‹œ ์ผ๊ด€์„ฑ VS DMA
  2183. ------------------
  2184. ๋ชจ๋“  ์‹œ์Šคํ…œ์ด DMA ๋ฅผ ํ•˜๋Š” ๋””๋ฐ”์ด์Šค์— ๋Œ€ํ•ด์„œ๊นŒ์ง€ ์บ์‹œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜์ง€๋Š”
  2185. ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ, DMA ๋ฅผ ์‹œ๋„ํ•˜๋Š” ๋””๋ฐ”์ด์Šค๋Š” RAM ์œผ๋กœ๋ถ€ํ„ฐ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ
  2186. ์ฝ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋”ํ‹ฐ ์บ์‹œ ๋ผ์ธ์ด CPU ์˜ ์บ์‹œ์— ๋จธ๋ฌด๋ฅด๊ณ  ์žˆ๊ณ , ๋ฐ”๋€ ๊ฐ’์ด ์•„์ง
  2187. RAM ์— ์จ์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„ , ์ปค๋„์˜
  2188. ์ ์ ˆํ•œ ๋ถ€๋ถ„์—์„œ ๊ฐ CPU ์บ์‹œ์˜ ๋ฌธ์ œ๋˜๋Š” ๋น„ํŠธ๋“ค์„ ํ”Œ๋Ÿฌ์‹œ (flush) ์‹œ์ผœ์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค
  2189. (๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ๋ฌดํšจํ™” - invalidation - ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ ).
  2190. ๋˜ํ•œ, ๋””๋ฐ”์ด์Šค์— ์˜ํ•ด RAM ์— DMA ๋กœ ์“ฐ์—ฌ์ง„ ๊ฐ’์€ ๋””๋ฐ”์ด์Šค๊ฐ€ ์“ฐ๊ธฐ๋ฅผ ์™„๋ฃŒํ•œ ํ›„์—
  2191. CPU ์˜ ์บ์‹œ์—์„œ RAM ์œผ๋กœ ์“ฐ์—ฌ์ง€๋Š” ๋”ํ‹ฐ ์บ์‹œ ๋ผ์ธ์— ์˜ํ•ด ๋ฎ์–ด์จ์งˆ ์ˆ˜๋„ ์žˆ๊ณ , CPU
  2192. ์˜ ์บ์‹œ์— ์กด์žฌํ•˜๋Š” ์บ์‹œ ๋ผ์ธ์ด ํ•ด๋‹น ์บ์‹œ์—์„œ ์‚ญ์ œ๋˜๊ณ  ๋‹ค์‹œ ๊ฐ’์„ ์ฝ์–ด๋“ค์ด๊ธฐ
  2193. ์ „๊นŒ์ง€๋Š” RAM ์ด ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค ์ž์ฒด๊ฐ€ ์ˆจ๊ฒจ์ ธ ๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด
  2194. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„ , ์ปค๋„์˜ ์ ์ ˆํ•œ ๋ถ€๋ถ„์—์„œ ๊ฐ CPU ์˜ ์บ์‹œ ์•ˆ์˜ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”
  2195. ๋น„ํŠธ๋“ค์„ ๋ฌดํšจํ™” ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2196. ์บ์‹œ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  Documentation/cachetlb.txt ๋ฅผ
  2197. ์ฐธ๊ณ ํ•˜์„ธ์š”.
  2198. ์บ์‹œ ์ผ๊ด€์„ฑ VS MMIO
  2199. -------------------
  2200. Memory mapped I/O ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ CPU ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋‚ด์˜ ํ•œ ์œˆ๋„์šฐ์˜ ํŠน์ • ๋ถ€๋ถ„
  2201. ๋‚ด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ญ์— ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ, ์ด ์œˆ๋„์šฐ๋Š” ์ผ๋ฐ˜์ ์ธ, RAM ์œผ๋กœ ํ–ฅํ•˜๋Š”
  2202. ์œˆ๋„์šฐ์™€๋Š” ๋‹ค๋ฅธ ํŠน์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
  2203. ๊ทธ๋Ÿฐ ํŠน์„ฑ ๊ฐ€์šด๋ฐ ํ•˜๋‚˜๋Š”, ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋Ÿฐ ์•ก์„ธ์Šค๋Š” ์บ์‹œ๋ฅผ ์™„์ „ํžˆ ์šฐํšŒํ•˜๊ณ 
  2204. ๋””๋ฐ”์ด์Šค ๋ฒ„์Šค๋กœ ๊ณง๋ฐ”๋กœ ํ–ฅํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ง์€ MMIO ์•ก์„ธ์Šค๋Š” ๋จผ์ €
  2205. ์‹œ์ž‘๋˜์–ด์„œ ์บ์‹œ์—์„œ ์™„๋ฃŒ๋œ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ ์ถ”์›”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ
  2206. ๊ฒฝ์šฐ์—” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„์น˜ ์•Š๊ณ , ๋งŒ์•ฝ ์บ์‹œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์“ฐ๊ธฐ ์˜คํผ๋ ˆ์ด์…˜๊ณผ
  2207. MMIO ์•ก์„ธ์Šค๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์˜์กด์ ์ด๋ผ๋ฉด ํ•ด๋‹น ์บ์‹œ๋Š” ๋‘ ์˜คํผ๋ ˆ์ด์…˜ ์‚ฌ์ด์—
  2208. ๋น„์›Œ์ ธ(flush)์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  2209. ======================
  2210. CPU ๋“ค์ด ์ €์ง€๋ฅด๋Š” ์ผ๋“ค
  2211. ======================
  2212. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” CPU ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ์ •ํ™•ํžˆ ์š”์ฒญํ•œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•ด ์ค„ ๊ฒƒ์ด๋ผ๊ณ 
  2213. ์ƒ๊ฐํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ CPU ์—๊ฒŒ ๋„˜๊ธด๋‹ค๋ฉด:
  2214. a = READ_ONCE(*A);
  2215. WRITE_ONCE(*B, b);
  2216. c = READ_ONCE(*C);
  2217. d = READ_ONCE(*D);
  2218. WRITE_ONCE(*E, e);
  2219. CPU ๋Š” ๋‹ค์Œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ํ˜„์žฌ์˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ
  2220. ์˜คํผ๋ ˆ์ด์…˜์„ ์™„๋ฃŒํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ , ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ ์™ธ๋ถ€์—์„œ ๊ด€์ฐฐํ•˜๊ธฐ์—๋„ ์ •ํ•ด์ง„
  2221. ์ˆœ์„œ๋Œ€๋กœ ์˜คํผ๋ ˆ์ด์…˜์ด ์ˆ˜ํ–‰๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค:
  2222. LOAD *A, STORE *B, LOAD *C, LOAD *D, STORE *E.
  2223. ๋‹น์—ฐํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ํ›จ์”ฌ ์—‰๋ง์ž…๋‹ˆ๋‹ค. ๋งŽ์€ CPU ์™€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์•ž์˜ ๊ฐ€์ •์€
  2224. ์„ฑ๋ฆฝํ•˜์ง€ ๋ชปํ•˜๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  2225. (*) ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์‹คํ–‰์„ ๊ณ„์† ํ•ด๋‚˜๊ฐ€๊ธฐ ์œ„ํ•ด ๊ณง๋ฐ”๋กœ ์™„๋ฃŒ๋  ํ•„์š”๊ฐ€ ์žˆ๋Š”
  2226. ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€ ๋ฐ˜๋ฉด, ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์ข…์ข… ๋ณ„๋‹ค๋ฅธ ๋ฌธ์ œ ์—†์ด ์œ ์˜ˆ๋  ์ˆ˜
  2227. ์žˆ์Šต๋‹ˆ๋‹ค;
  2228. (*) ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์˜ˆ์ธก์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•„์š”์—†๋Š” ๋กœ๋“œ์˜€๋‹ค๊ณ 
  2229. ์ฆ๋ช…๋œ ์˜ˆ์ธก์  ๋กœ๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค;
  2230. (*) ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์˜ˆ์ธก์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์˜ˆ์ƒ๋œ ์ด๋ฒคํŠธ์˜
  2231. ์‹œํ€€์Šค์™€ ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ๋กœ๋“œ๊ฐ€ ์ด๋ค„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค;
  2232. (*) ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์ˆœ์„œ๋Š” CPU ๋ฒ„์Šค์™€ ์บ์‹œ๋ฅผ ์ข€ ๋” ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์žฌ๋ฐฐ์น˜
  2233. ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค;
  2234. (*) ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋Š” ์ธ์ ‘ํ•œ ์œ„์น˜์—์˜ ์•ก์„ธ์Šค๋“ค์„ ์ผ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”
  2235. ๋ฉ”๋ชจ๋ฆฌ๋‚˜ I/O ํ•˜๋“œ์›จ์–ด (๋ฉ”๋ชจ๋ฆฌ์™€ PCI ๋””๋ฐ”์ด์Šค ๋‘˜ ๋‹ค ์ด๊ฒŒ ๊ฐ€๋Šฅํ•  ์ˆ˜
  2236. ์žˆ์Šต๋‹ˆ๋‹ค) ์— ๋Œ€ํ•ด ์š”์ฒญ๋˜๋Š” ๊ฒฝ์šฐ, ๊ฐœ๋ณ„ ์˜คํผ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ์„ค์ •
  2237. ๋น„์šฉ์„ ์•„๋ผ๊ธฐ ์œ„ํ•ด ์กฐํ•ฉ๋˜์–ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค; ๊ทธ๋ฆฌ๊ณ 
  2238. (*) ํ•ด๋‹น CPU ์˜ ๋ฐ์ดํ„ฐ ์บ์‹œ๊ฐ€ ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜๋„ ์žˆ๊ณ , ์บ์‹œ ์ผ๊ด€์„ฑ
  2239. ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด - ์Šคํ† ์–ด๊ฐ€ ์‹ค์ œ๋กœ ์บ์‹œ์— ๋„๋‹ฌํ•œ๋‹ค๋ฉด - ์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”์‹œํ‚ฌ ์ˆ˜๋Š”
  2240. ์žˆ์ง€๋งŒ ์ด ์ผ๊ด€์„ฑ ๊ด€๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ CPU ๋“ค์—๋„ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ „๋‹ฌ๋œ๋‹ค๋Š” ๋ณด์žฅ์€
  2241. ์—†์Šต๋‹ˆ๋‹ค.
  2242. ๋”ฐ๋ผ์„œ, ์•ž์˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ CPU ๊ฐ€ ๋ณด๋Š” ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  2243. LOAD *A, ..., LOAD {*C,*D}, STORE *E, STORE *B
  2244. ("LOAD {*C,*D}" ๋Š” ์กฐํ•ฉ๋œ ๋กœ๋“œ์ž…๋‹ˆ๋‹ค)
  2245. ํ•˜์ง€๋งŒ, CPU ๋Š” ์Šค์Šค๋กœ๋Š” ์ผ๊ด€์ ์ผ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค: CPU _์ž์‹ _ ์˜ ์•ก์„ธ์Šค๋“ค์€
  2246. ์ž์‹ ์—๊ฒŒ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ •ํ™•ํžˆ ์ˆœ์„œ ์„ธ์›Œ์ง„ ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์งˆ
  2247. ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์˜ ์ฝ”๋“œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๋ฉด:
  2248. U = READ_ONCE(*A);
  2249. WRITE_ONCE(*A, V);
  2250. WRITE_ONCE(*A, W);
  2251. X = READ_ONCE(*A);
  2252. WRITE_ONCE(*A, Y);
  2253. Z = READ_ONCE(*A);
  2254. ๊ทธ๋ฆฌ๊ณ  ์™ธ๋ถ€์˜ ์˜ํ–ฅ์— ์˜ํ•œ ๊ฐ„์„ญ์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด
  2255. ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  2256. U == *A ์˜ ์ตœ์ดˆ ๊ฐ’
  2257. X == W
  2258. Z == Y
  2259. *A == Y
  2260. ์•ž์˜ ์ฝ”๋“œ๋Š” CPU ๊ฐ€ ๋‹ค์Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์‹œํ€€์Šค๋ฅผ ๋งŒ๋“ค๋„๋ก ํ• ๊ฒ๋‹ˆ๋‹ค:
  2261. U=LOAD *A, STORE *A=V, STORE *A=W, X=LOAD *A, STORE *A=Y, Z=LOAD *A
  2262. ํ•˜์ง€๋งŒ, ๋ณ„๋‹ค๋ฅธ ๊ฐœ์ž…์ด ์—†๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์•ผ์— ์ด ์„ธ์ƒ์ด ์—ฌ์ „ํžˆ ์ผ๊ด€์ ์ด๋ผ๊ณ 
  2263. ๋ณด์ธ๋‹ค๋Š” ๋ณด์žฅ๋งŒ ์ง€์ผœ์ง„๋‹ค๋ฉด ์ด ์‹œํ€€์Šค๋Š” ์–ด๋–ค ์กฐํ•ฉ์œผ๋กœ๋“  ์žฌ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ
  2264. ์•ก์„ธ์Šค๋“ค์€ ํ•ฉ์ณ์ง€๊ฑฐ๋‚˜ ๋ฒ„๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์•„ํ‚คํ…์ณ์—์„œ CPU ๋Š” ๊ฐ™์€ ์œ„์น˜์—
  2265. ๋Œ€ํ•œ ์—ฐ์†์ ์ธ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ž์˜ ์˜ˆ์—์„œ์˜
  2266. READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•จ์„ ์•Œ์•„๋‘์„ธ์š”. ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜
  2267. ์•„ํ‚คํ…์ณ์—์„œ READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ผ์„
  2268. ๋ญ๊ฐ€ ๋๋“ ์ง€ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด Itanium ์—์„œ๋Š” READ_ONCE() ์™€ WRITE_ONCE()
  2269. ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” volatile ์บ์ŠคํŒ…์€ GCC ๊ฐ€ ๊ทธ๋Ÿฐ ์žฌ๋ฐฐ์น˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํŠน์ˆ˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ธ
  2270. ld.acq ์™€ stl.rel ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ๊ฐ๊ฐ ๋งŒ๋“ค์–ด ๋‚ด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2271. ์ปดํŒŒ์ผ๋Ÿฌ ์—ญ์‹œ ์ด ์‹œํ€€์Šค์˜ ์•ก์„ธ์Šค๋“ค์„ CPU ๊ฐ€ ๋ณด๊ธฐ๋„ ์ „์— ํ•ฉ์น˜๊ฑฐ๋‚˜ ๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ๋’ค๋กœ
  2272. ๋ฏธ๋ค„๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2273. ์˜ˆ๋ฅผ ๋“ค์–ด:
  2274. *A = V;
  2275. *A = W;
  2276. ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ˜•๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  2277. *A = W;
  2278. ๋”ฐ๋ผ์„œ, ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ WRITE_ONCE() ๊ฐ€ ์—†๋‹ค๋ฉด *A ๋กœ์˜ V ๊ฐ’์˜ ์ €์žฅ์˜ ํšจ๊ณผ๋Š”
  2279. ์‚ฌ๋ผ์ง„๋‹ค๊ณ  ๊ฐ€์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ:
  2280. *A = Y;
  2281. Z = *A;
  2282. ๋Š”, ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋‚˜ READ_ONCE() ์™€ WRITE_ONCE() ์—†์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ˜•๋  ์ˆ˜
  2283. ์žˆ์Šต๋‹ˆ๋‹ค:
  2284. *A = Y;
  2285. Z = Y;
  2286. ๊ทธ๋ฆฌ๊ณ  ์ด LOAD ์˜คํผ๋ ˆ์ด์…˜์€ CPU ๋ฐ”๊นฅ์—๋Š” ์•„์˜ˆ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2287. ๊ทธ๋ฆฌ๊ณ , ALPHA ๊ฐ€ ์žˆ๋‹ค
  2288. ---------------------
  2289. DEC Alpha CPU ๋Š” ๊ฐ€์žฅ ์™„ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์ˆœ์„œ์˜ CPU ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,
  2290. Alpha CPU ์˜ ์ผ๋ถ€ ๋ฒ„์ „์€ ๋ถ„ํ• ๋œ ๋ฐ์ดํ„ฐ ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ, ์˜๋ฏธ์ ์œผ๋กœ
  2291. ๊ด€๊ณ„๋˜์–ด ์žˆ๋Š” ๋‘๊ฐœ์˜ ์บ์‹œ ๋ผ์ธ์ด ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ์—…๋ฐ์ดํŠธ ๋˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  2292. ์ด๊ฒŒ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์ •๋ง ํ•„์š”ํ•ด์ง€๋Š” ๋ถ€๋ถ„์ธ๋ฐ, ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š”
  2293. ๋ฉ”๋ชจ๋ฆฌ ์ผ๊ด€์„ฑ ์‹œ์Šคํ…œ๊ณผ ํ•จ๊ป˜ ๋‘๊ฐœ์˜ ์บ์‹œ๋ฅผ ๋™๊ธฐํ™” ์‹œ์ผœ์„œ, ํฌ์ธํ„ฐ ๋ณ€๊ฒฝ๊ณผ ์ƒˆ๋กœ์šด
  2294. ๋ฐ์ดํ„ฐ์˜ ๋ฐœ๊ฒฌ์„ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์ผ์–ด๋‚˜๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  2295. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋ชจ๋ธ์€ Alpha ์— ๊ธฐ์ดˆํ•ด์„œ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2296. ์œ„์˜ "์บ์‹œ ์ผ๊ด€์„ฑ" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  2297. ๊ฐ€์ƒ ๋จธ์‹  ๊ฒŒ์ŠคํŠธ
  2298. ----------------
  2299. ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒŒ์ŠคํŠธ๋“ค์€ ๊ฒŒ์ŠคํŠธ ์ž์ฒด๋Š” SMP ์ง€์› ์—†์ด ์ปดํŒŒ์ผ ๋˜์—ˆ๋‹ค
  2300. ํ•ด๋„ SMP ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑด UP ์ปค๋„์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ SMP ํ˜ธ์ŠคํŠธ์™€
  2301. ๊ฒฐ๋ถ€๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ๋ถ€์ž‘์šฉ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” mandatory ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ
  2302. ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๊ทธ๋Ÿฐ ํ•ด๊ฒฐ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ตœ์ ์˜ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค.
  2303. ์ด ๋ฌธ์ œ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋กœ์šฐ ๋ ˆ๋ฒจ์˜ virt_mb() ๋“ฑ์˜ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜
  2304. ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ SMP ๊ฐ€ ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๋‹ค๋ฉด smp_mb() ๋“ฑ๊ณผ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ
  2305. ๊ฐ–์Šต๋‹ˆ๋‹ค๋งŒ, SMP ์™€ SMP ์•„๋‹Œ ์‹œ์Šคํ…œ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.
  2306. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์ƒ ๋จธ์‹  ๊ฒŒ์ŠคํŠธ๋“ค์€ (SMP ์ผ ์ˆ˜ ์žˆ๋Š”) ํ˜ธ์ŠคํŠธ์™€ ๋™๊ธฐํ™”๋ฅผ ํ•  ๋•Œ์—๋Š”
  2307. smp_mb() ๊ฐ€ ์•„๋‹ˆ๋ผ virt_mb() ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2308. ์ด๊ฒƒ๋“ค์€ smp_mb() ๋ฅ˜์˜ ๊ฒƒ๋“ค๊ณผ ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ๋™์ผํ•˜๋ฉฐ, ํŠนํžˆ, MMIO ์˜ ์˜ํ–ฅ์—
  2309. ๋Œ€ํ•ด์„œ๋Š” ๊ฐ„์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: MMIO ์˜ ์˜ํ–ฅ์„ ์ œ์–ดํ•˜๋ ค๋ฉด, mandatory ๋ฐฐ๋ฆฌ์–ด๋ฅผ
  2310. ์‚ฌ์šฉํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  2311. =======
  2312. ์‚ฌ์šฉ ์˜ˆ
  2313. =======
  2314. ์ˆœํ™˜์‹ ๋ฒ„ํผ
  2315. -----------
  2316. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ˆœํ™˜์‹ ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑ์ž(producer)์™€ ์†Œ๋น„์ž(consumer) ์‚ฌ์ด์˜
  2317. ๋™๊ธฐํ™”์— ๋ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„
  2318. ์œ„ํ•ด์„  ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”:
  2319. Documentation/circular-buffers.txt
  2320. =========
  2321. ์ฐธ๊ณ  ๋ฌธํ—Œ
  2322. =========
  2323. Alpha AXP Architecture Reference Manual, Second Edition (Sites & Witek,
  2324. Digital Press)
  2325. Chapter 5.2: Physical Address Space Characteristics
  2326. Chapter 5.4: Caches and Write Buffers
  2327. Chapter 5.5: Data Sharing
  2328. Chapter 5.6: Read/Write Ordering
  2329. AMD64 Architecture Programmer's Manual Volume 2: System Programming
  2330. Chapter 7.1: Memory-Access Ordering
  2331. Chapter 7.4: Buffering and Combining Memory Writes
  2332. IA-32 Intel Architecture Software Developer's Manual, Volume 3:
  2333. System Programming Guide
  2334. Chapter 7.1: Locked Atomic Operations
  2335. Chapter 7.2: Memory Ordering
  2336. Chapter 7.4: Serializing Instructions
  2337. The SPARC Architecture Manual, Version 9
  2338. Chapter 8: Memory Models
  2339. Appendix D: Formal Specification of the Memory Models
  2340. Appendix J: Programming with the Memory Models
  2341. UltraSPARC Programmer Reference Manual
  2342. Chapter 5: Memory Accesses and Cacheability
  2343. Chapter 15: Sparc-V9 Memory Models
  2344. UltraSPARC III Cu User's Manual
  2345. Chapter 9: Memory Models
  2346. UltraSPARC IIIi Processor User's Manual
  2347. Chapter 8: Memory Models
  2348. UltraSPARC Architecture 2005
  2349. Chapter 9: Memory
  2350. Appendix D: Formal Specifications of the Memory Models
  2351. UltraSPARC T1 Supplement to the UltraSPARC Architecture 2005
  2352. Chapter 8: Memory Models
  2353. Appendix F: Caches and Cache Coherency
  2354. Solaris Internals, Core Kernel Architecture, p63-68:
  2355. Chapter 3.3: Hardware Considerations for Locks and
  2356. Synchronization
  2357. Unix Systems for Modern Architectures, Symmetric Multiprocessing and Caching
  2358. for Kernel Programmers:
  2359. Chapter 13: Other Memory Models
  2360. Intel Itanium Architecture Software Developer's Manual: Volume 1:
  2361. Section 2.6: Speculation
  2362. Section 4.4: Memory Access