memory-barriers.txt 134 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931
  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.ibm.com>
  22. Will Deacon <will.deacon@arm.com>
  23. Peter Zijlstra <peterz@infradead.org>
  24. ========
  25. ๋ฉด์ฑ…์กฐํ•ญ
  26. ========
  27. ์ด ๋ฌธ์„œ๋Š” ๋ช…์„ธ์„œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค; ์ด ๋ฌธ์„œ๋Š” ์™„๋ฒฝํ•˜์ง€ ์•Š์€๋ฐ, ๊ฐ„๊ฒฐ์„ฑ์„ ์œ„ํ•ด ์˜๋„๋œ
  28. ๋ถ€๋ถ„๋„ ์žˆ๊ณ , ์˜๋„ํ•˜์ง„ ์•Š์•˜์ง€๋งŒ ์‚ฌ๋žŒ์— ์˜ํ•ด ์“ฐ์˜€๋‹ค๋ณด๋‹ˆ ๋ถˆ์™„์ „ํ•œ ๋ถ€๋ถ„๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  29. ์ด ๋ฌธ์„œ๋Š” ๋ฆฌ๋ˆ…์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ
  30. ์•ˆ๋‚ด์„œ์ž…๋‹ˆ๋‹ค๋งŒ, ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค ์‹ถ์œผ๋ฉด (๊ทธ๋Ÿฐ๊ฒŒ ๋งŽ์„ ๊ฒ๋‹ˆ๋‹ค) ์งˆ๋ฌธ์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  31. ์ผ๋ถ€ ์ด์ƒํ•œ ์ ๋“ค์€ ๊ณต์‹์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ผ๊ด€์„ฑ ๋ชจ๋ธ๊ณผ tools/memory-model/ ์— ์žˆ๋Š”
  32. ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์กฐ์ฐจ๋„ ๊ทธ
  33. ๊ด€๋ฆฌ์ž๋“ค์˜ ์˜๊ฒฌ์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ด์•ผ์ง€, ์ ˆ๋Œ€ ์˜ณ์€ ์˜ˆ์–ธ์ž๋กœ ์‹ ๋ด‰ํ•ด์„  ์•ˆ๋  ๊ฒ๋‹ˆ๋‹ค.
  34. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด ๋ฌธ์„œ๋Š” ๋ฆฌ๋ˆ…์Šค๊ฐ€ ํ•˜๋“œ์›จ์–ด์— ๊ธฐ๋Œ€ํ•˜๋Š” ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ช…์„ธ์„œ๊ฐ€
  35. ์•„๋‹™๋‹ˆ๋‹ค.
  36. ์ด ๋ฌธ์„œ์˜ ๋ชฉ์ ์€ ๋‘๊ฐ€์ง€์ž…๋‹ˆ๋‹ค:
  37. (1) ์–ด๋–ค ํŠน์ • ๋ฐฐ๋ฆฌ์–ด์— ๋Œ€ํ•ด ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ์„ ๋ช…์„ธํ•˜๊ธฐ ์œ„ํ•ด์„œ,
  38. ๊ทธ๋ฆฌ๊ณ 
  39. (2) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฐ๋ฆฌ์–ด๋“ค์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์•ˆ๋‚ด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ
  40. ์œ„ํ•ด์„œ.
  41. ์–ด๋–ค ์•„ํ‚คํ…์ณ๋Š” ํŠน์ •ํ•œ ๋ฐฐ๋ฆฌ์–ด๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ์ตœ์†Œํ•œ์˜
  42. ์š”๊ตฌ์‚ฌํ•ญ๋“ค๋ณด๋‹ค ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐํ•˜๋Š”
  43. ์š”๊ตฌ์‚ฌํ•ญ๋“ค์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ์•„ํ‚คํ…์ณ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์•„ํ‚คํ…์ณ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋ž€ ์ ์„
  44. ์•Œ์•„๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  45. ๋˜ํ•œ, ํŠน์ • ์•„ํ‚คํ…์ณ์—์„œ ์ผ๋ถ€ ๋ฐฐ๋ฆฌ์–ด๋Š” ํ•ด๋‹น ์•„ํ‚คํ…์ณ์˜ ํŠน์ˆ˜ํ•œ ๋™์ž‘ ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด
  46. ํ•ด๋‹น ๋ฐฐ๋ฆฌ์–ด์˜ ๋ช…์‹œ์  ์‚ฌ์šฉ์ด ๋ถˆํ•„์š”ํ•ด์„œ no-op ์ด ๋ ์ˆ˜๋„ ์žˆ์Œ์„ ์•Œ์•„๋‘์‹œ๊ธฐ
  47. ๋ฐ”๋ž๋‹ˆ๋‹ค.
  48. ์—ญ์ž: ๋ณธ ๋ฒˆ์—ญ ์—ญ์‹œ ์™„๋ฒฝํ•˜์ง€ ์•Š์€๋ฐ, ์ด ์—ญ์‹œ ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ์˜๋„๋œ ๊ฒƒ์ด๊ธฐ๋„
  49. ํ•ฉ๋‹ˆ๋‹ค. ์—ฌํƒ€ ๊ธฐ์ˆ  ๋ฌธ์„œ๋“ค์ด ๊ทธ๋ ‡๋“ฏ ์™„๋ฒฝํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ฒˆ์—ญ๋ฌธ๊ณผ ์›๋ฌธ์„ ํ•จ๊ป˜
  50. ์ฝ์œผ์‹œ๋˜ ๋ฒˆ์—ญ๋ฌธ์„ ํ•˜๋‚˜์˜ ๊ฐ€์ด๋“œ๋กœ ํ™œ์šฉํ•˜์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ฆฌ๋ฉฐ, ๋ฐœ๊ฒฌ๋˜๋Š” ์˜ค์—ญ ๋“ฑ์—
  51. ๋Œ€ํ•ด์„œ๋Š” ์–ธ์ œ๋“  ์˜๊ฒฌ์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ณผํ•œ ๋ฒˆ์—ญ์œผ๋กœ ์ธํ•œ ์˜คํ•ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด
  52. ์• ๋งคํ•œ ๋ถ€๋ถ„์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ์–ด์ƒ‰ํ•จ์ด ์žˆ๋”๋ผ๋„ ์›๋ž˜์˜ ์šฉ์–ด๋ฅผ ์ฐจ์šฉํ•ฉ๋‹ˆ๋‹ค.
  53. =====
  54. ๋ชฉ์ฐจ:
  55. =====
  56. (*) ์ถ”์ƒ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ๋ชจ๋ธ.
  57. - ๋””๋ฐ”์ด์Šค ์˜คํผ๋ ˆ์ด์…˜.
  58. - ๋ณด์žฅ์‚ฌํ•ญ.
  59. (*) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
  60. - ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์˜ ์ข…๋ฅ˜.
  61. - ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์— ๋Œ€ํ•ด ๊ฐ€์ •ํ•ด์„  ์•ˆ๋  ๊ฒƒ.
  62. - ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด (์—ญ์‚ฌ์ ).
  63. - ์ปจํŠธ๋กค ์˜์กด์„ฑ.
  64. - SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ.
  65. - ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์‹œํ€€์Šค์˜ ์˜ˆ.
  66. - ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด vs ๋กœ๋“œ ์˜ˆ์ธก.
  67. - Multicopy ์›์ž์„ฑ.
  68. (*) ๋ช…์‹œ์  ์ปค๋„ ๋ฐฐ๋ฆฌ์–ด.
  69. - ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด.
  70. - CPU ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  71. (*) ์•”๋ฌต์  ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  72. - ๋ฝ Acquisition ํ•จ์ˆ˜.
  73. - ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ํ•จ์ˆ˜.
  74. - ์Šฌ๋ฆฝ๊ณผ ์›จ์ดํฌ์—… ํ•จ์ˆ˜.
  75. - ๊ทธ์™ธ์˜ ํ•จ์ˆ˜๋“ค.
  76. (*) CPU ๊ฐ„ ACQUIRING ๋ฐฐ๋ฆฌ์–ด์˜ ํšจ๊ณผ.
  77. - Acquire vs ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค.
  78. (*) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ณณ
  79. - ํ”„๋กœ์„ธ์„œ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ.
  80. - ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜.
  81. - ๋””๋ฐ”์ด์Šค ์•ก์„ธ์Šค.
  82. - ์ธํ„ฐ๋ŸฝํŠธ.
  83. (*) ์ปค๋„ I/O ๋ฐฐ๋ฆฌ์–ด์˜ ํšจ๊ณผ.
  84. (*) ๊ฐ€์ •๋˜๋Š” ๊ฐ€์žฅ ์™„ํ™”๋œ ์‹คํ–‰ ์ˆœ์„œ ๋ชจ๋ธ.
  85. (*) CPU ์บ์‹œ์˜ ์˜ํ–ฅ.
  86. - ์บ์‹œ ์ผ๊ด€์„ฑ.
  87. - ์บ์‹œ ์ผ๊ด€์„ฑ vs DMA.
  88. - ์บ์‹œ ์ผ๊ด€์„ฑ vs MMIO.
  89. (*) CPU ๋“ค์ด ์ €์ง€๋ฅด๋Š” ์ผ๋“ค.
  90. - ๊ทธ๋ฆฌ๊ณ , Alpha ๊ฐ€ ์žˆ๋‹ค.
  91. - ๊ฐ€์ƒ ๋จธ์‹  ๊ฒŒ์ŠคํŠธ.
  92. (*) ์‚ฌ์šฉ ์˜ˆ.
  93. - ์ˆœํ™˜์‹ ๋ฒ„ํผ.
  94. (*) ์ฐธ๊ณ  ๋ฌธํ—Œ.
  95. =======================
  96. ์ถ”์ƒ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ๋ชจ๋ธ
  97. =======================
  98. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”์ƒํ™”๋œ ์‹œ์Šคํ…œ ๋ชจ๋ธ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  99. : :
  100. : :
  101. : :
  102. +-------+ : +--------+ : +-------+
  103. | | : | | : | |
  104. | | : | | : | |
  105. | CPU 1 |<----->| Memory |<----->| CPU 2 |
  106. | | : | | : | |
  107. | | : | | : | |
  108. +-------+ : +--------+ : +-------+
  109. ^ : ^ : ^
  110. | : | : |
  111. | : | : |
  112. | : v : |
  113. | : +--------+ : |
  114. | : | | : |
  115. | : | | : |
  116. +---------->| Device |<----------+
  117. : | | :
  118. : | | :
  119. : +--------+ :
  120. : :
  121. ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ๋Ÿฌ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์˜คํผ๋ ˆ์ด์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ๊ฐ๊ฐ์˜ CPU ๋Š” ๊ทธ๋Ÿฐ
  122. ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒํ™”๋œ CPU ๋ชจ๋ธ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ์ˆœ์„œ๋Š”
  123. ๋งค์šฐ ์™„ํ™”๋˜์–ด ์žˆ๊ณ , CPU ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ธ๊ณผ๊ด€๊ณ„๋ฅผ ์–ด๊ธฐ์ง€ ์•Š๋Š” ์ƒํƒœ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค๊ณ 
  124. ๋ณด์ผ ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์„ ์ž์‹ ์ด ์›ํ•˜๋Š” ์–ด๋–ค ์ˆœ์„œ๋Œ€๋กœ๋“  ์žฌ๋ฐฐ์น˜ํ•ด
  125. ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ, ์ปดํŒŒ์ผ๋Ÿฌ ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •์ƒ์  ๋™์ž‘์„ ํ•ด์น˜์ง€
  126. ์•Š๋Š” ํ•œ๋„ ๋‚ด์—์„œ๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ๋“  ์ž์‹ ์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜
  127. ์žˆ์Šต๋‹ˆ๋‹ค.
  128. ๋”ฐ๋ผ์„œ ์œ„์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ํ•œ CPU๊ฐ€ ๋™์ž‘์‹œํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์ด ๋งŒ๋“ค์–ด๋‚ด๋Š”
  129. ๋ณ€ํ™”๋Š” ํ•ด๋‹น ์˜คํผ๋ ˆ์ด์…˜์ด CPU ์™€ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋“ค ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค(์ ์„ )๋ฅผ
  130. ์ง€๋‚˜๊ฐ€๋ฉด์„œ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๋“ค์— ์ธ์ง€๋ฉ๋‹ˆ๋‹ค.
  131. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋“ค์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  132. CPU 1 CPU 2
  133. =============== ===============
  134. { A == 1; B == 2 }
  135. A = 3; x = B;
  136. B = 4; y = A;
  137. ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ๊ฐ€์šด๋ฐ์— ์œ„์น˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ๋ณด์—ฌ์ง€๊ฒŒ ๋˜๋Š” ์•ก์„ธ์Šค๋“ค์€ ๋‹ค์Œ์˜ ์ด
  138. 24๊ฐœ์˜ ์กฐํ•ฉ์œผ๋กœ ์žฌ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  139. STORE A=3, STORE B=4, y=LOAD A->3, x=LOAD B->4
  140. STORE A=3, STORE B=4, x=LOAD B->4, y=LOAD A->3
  141. STORE A=3, y=LOAD A->3, STORE B=4, x=LOAD B->4
  142. STORE A=3, y=LOAD A->3, x=LOAD B->2, STORE B=4
  143. STORE A=3, x=LOAD B->2, STORE B=4, y=LOAD A->3
  144. STORE A=3, x=LOAD B->2, y=LOAD A->3, STORE B=4
  145. STORE B=4, STORE A=3, y=LOAD A->3, x=LOAD B->4
  146. STORE B=4, ...
  147. ...
  148. ๋”ฐ๋ผ์„œ ๋‹ค์Œ์˜ ๋„ค๊ฐ€์ง€ ์กฐํ•ฉ์˜ ๊ฐ’๋“ค์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  149. x == 2, y == 1
  150. x == 2, y == 3
  151. x == 4, y == 1
  152. x == 4, y == 3
  153. ํ•œ๋ฐœ ๋” ๋‚˜์•„๊ฐ€์„œ, ํ•œ CPU ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ๋ฐ˜์˜ํ•œ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ๊ฒฐ๊ณผ๋Š”
  154. ๋‹ค๋ฅธ CPU ์—์„œ์˜ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ์ธ์ง€๋˜๋Š”๋ฐ, ์ด ๋•Œ ์Šคํ† ์–ด๊ฐ€ ๋ฐ˜์˜๋œ ์ˆœ์„œ์™€
  155. ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ธ์ง€๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  156. ์˜ˆ๋กœ, ์•„๋ž˜์˜ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋“ค์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  157. CPU 1 CPU 2
  158. =============== ===============
  159. { A == 1, B == 2, C == 3, P == &A, Q == &C }
  160. B = 4; Q = P;
  161. P = &B D = *Q;
  162. D ๋กœ ์ฝํ˜€์ง€๋Š” ๊ฐ’์€ CPU 2 ์—์„œ P ๋กœ๋ถ€ํ„ฐ ์ฝํ˜€์ง„ ์ฃผ์†Œ๊ฐ’์— ์˜์กด์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—”
  163. ๋ถ„๋ช…ํ•œ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ด๋ฒคํŠธ๋“ค์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ๋Š” ์•„๋ž˜์˜
  164. ๊ฒฐ๊ณผ๋“ค์ด ๋ชจ๋‘ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  165. (Q == &A) and (D == 1)
  166. (Q == &B) and (D == 2)
  167. (Q == &B) and (D == 4)
  168. CPU 2 ๋Š” *Q ์˜ ๋กœ๋“œ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์ „์— P ๋ฅผ Q ์— ๋„ฃ๊ธฐ ๋•Œ๋ฌธ์— D ์— C ๋ฅผ ์ง‘์–ด๋„ฃ๋Š”
  169. ์ผ์€ ์—†์Œ์„ ์•Œ์•„๋‘์„ธ์š”.
  170. ๋””๋ฐ”์ด์Šค ์˜คํผ๋ ˆ์ด์…˜
  171. -------------------
  172. ์ผ๋ถ€ ๋””๋ฐ”์ด์Šค๋Š” ์ž์‹ ์˜ ์ปจํŠธ๋กค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์˜ ํŠน์ • ์˜์—ญ์œผ๋กœ ๋งคํ•‘ํ•ด์„œ
  173. ์ œ๊ณตํ•˜๋Š”๋ฐ(Memory mapped I/O), ํ•ด๋‹น ์ปจํŠธ๋กค ๋ ˆ์ง€์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ์ˆœ์„œ๋Š” ๋งค์šฐ
  174. ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋“œ๋ ˆ์Šค ํฌํŠธ ๋ ˆ์ง€์Šคํ„ฐ (A) ์™€ ๋ฐ์ดํ„ฐ ํฌํŠธ ๋ ˆ์ง€์Šคํ„ฐ (D)
  175. ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ๋˜๋Š” ๋‚ด๋ถ€ ๋ ˆ์ง€์Šคํ„ฐ ์ง‘ํ•ฉ์„ ๊ฐ–๋Š” ์ด๋”๋„ท ์นด๋“œ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค. ๋‚ด๋ถ€์˜
  176. 5๋ฒˆ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์˜ ์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  177. *A = 5;
  178. x = *D;
  179. ํ•˜์ง€๋งŒ, ์ด๊ฑด ๋‹ค์Œ์˜ ๋‘ ์กฐํ•ฉ ์ค‘ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  180. STORE *A = 5, x = LOAD *D
  181. x = LOAD *D, STORE *A = 5
  182. ๋‘๋ฒˆ์งธ ์กฐํ•ฉ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜จ _ํ›„์—_ ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•˜๋ฏ€๋กœ, ์˜ค๋™์ž‘์„ ์ผ์œผํ‚ฌ ๊ฒ๋‹ˆ๋‹ค.
  183. ๋ณด์žฅ์‚ฌํ•ญ
  184. --------
  185. CPU ์—๊ฒŒ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ๋ณด์žฅ์‚ฌํ•ญ ๋ช‡๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
  186. (*) ์–ด๋–ค CPU ๋“ , ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์€ ํ•ด๋‹น CPU ์ž์‹ ์—๊ฒŒ
  187. ์žˆ์–ด์„œ๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ˆ˜ํ–‰ ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ์— ๋Œ€ํ•ด์„œ:
  188. Q = READ_ONCE(P); D = READ_ONCE(*Q);
  189. CPU ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜ ์‹œํ€€์Šค๋ฅผ ์ˆ˜ํ–‰ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค:
  190. Q = LOAD P, D = LOAD *Q
  191. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์‹œํ€€์Šค ๋‚ด์—์„œ์˜ ์ˆœ์„œ๋Š” ํ•ญ์ƒ ์ง€์ผœ์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, DEC Alpha ์—์„œ
  192. READ_ONCE() ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋ช…๋ น๋„ ๋‚ด๊ฒŒ ๋˜์–ด ์žˆ์–ด์„œ, DEC Alpha CPU ๋Š”
  193. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ๋‚ด๋†“๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
  194. Q = LOAD P, MEMORY_BARRIER, D = LOAD *Q, MEMORY_BARRIER
  195. DEC Alpha ์—์„œ ์ˆ˜ํ–‰๋˜๋“  ์•„๋‹ˆ๋“ , READ_ONCE() ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋กœ๋ถ€ํ„ฐ์˜ ์•…์˜ํ–ฅ
  196. ๋˜ํ•œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  197. (*) ํŠน์ • CPU ๋‚ด์—์„œ ๊ฒน์น˜๋Š” ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ํ–‰ํ•ด์ง€๋Š” ๋กœ๋“œ์™€ ์Šคํ† ์–ด ๋“ค์€ ํ•ด๋‹น
  198. CPU ์•ˆ์—์„œ๋Š” ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ์— ๋Œ€ํ•ด์„œ:
  199. a = READ_ONCE(*X); WRITE_ONCE(*X, b);
  200. CPU ๋Š” ๋‹ค์Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜ ์‹œํ€€์Šค๋งŒ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์š”์ฒญํ•  ๊ฒ๋‹ˆ๋‹ค:
  201. a = LOAD *X, STORE *X = b
  202. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์— ๋Œ€ํ•ด์„œ๋Š”:
  203. WRITE_ONCE(*X, c); d = READ_ONCE(*X);
  204. CPU ๋Š” ๋‹ค์Œ์˜ ์ˆ˜ํ–‰ ์š”์ฒญ๋งŒ์„ ๋งŒ๋“ค์–ด ๋ƒ…๋‹ˆ๋‹ค:
  205. STORE *X = c, d = LOAD *X
  206. (๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๊ณผ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜์ด ๊ฒน์น˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•ด
  207. ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด ํ•ด๋‹น ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ๊ฒน์นœ๋‹ค๊ณ  ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค).
  208. ๊ทธ๋ฆฌ๊ณ  _๋ฐ˜๋“œ์‹œ_ ๋˜๋Š” _์ ˆ๋Œ€๋กœ_ ๊ฐ€์ •ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ •ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  209. (*) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ READ_ONCE() ๋‚˜ WRITE_ONCE() ๋กœ ๋ณดํ˜ธ๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ
  210. ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ •์€ _์ ˆ๋Œ€๋กœ_ ํ•ด์„  ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด
  211. ์—†๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด ์„น์…˜์—์„œ ๋‹ค๋ฃจ๊ฒŒ ๋ , ๋ชจ๋“  "์ฐฝ์˜์ ์ธ"
  212. ๋ณ€๊ฒฝ๋“ค์„ ๋งŒ๋“ค์–ด๋‚ผ ๊ถŒํ•œ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  213. (*) ๊ฐœ๋ณ„์ ์ธ ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋“ค์ด ์ฃผ์–ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ์š”์ฒญ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ •์€ _์ ˆ๋Œ€๋กœ_
  214. ํ•˜์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ง์€ ๊ณง:
  215. X = *A; Y = *B; *D = Z;
  216. ๋Š” ๋‹ค์Œ์˜ ๊ฒƒ๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ์œผ๋กœ๋“  ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค:
  217. X = LOAD *A, Y = LOAD *B, STORE *D = Z
  218. X = LOAD *A, STORE *D = Z, Y = LOAD *B
  219. Y = LOAD *B, X = LOAD *A, STORE *D = Z
  220. Y = LOAD *B, STORE *D = Z, X = LOAD *A
  221. STORE *D = Z, X = LOAD *A, Y = LOAD *B
  222. STORE *D = Z, Y = LOAD *B, X = LOAD *A
  223. (*) ๊ฒน์น˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์€ ํ•ฉ์ณ์ง€๊ฑฐ๋‚˜ ๋ฒ„๋ ค์งˆ ์ˆ˜ ์žˆ์Œ์„ _๋ฐ˜๋“œ์‹œ_ ๊ฐ€์ •ํ•ด์•ผ
  224. ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ์ฝ”๋“œ๋Š”:
  225. X = *A; Y = *(A + 4);
  226. ๋‹ค์Œ์˜ ๊ฒƒ๋“ค ์ค‘ ๋ญ๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  227. X = LOAD *A; Y = LOAD *(A + 4);
  228. Y = LOAD *(A + 4); X = LOAD *A;
  229. {X, Y} = LOAD {*A, *(A + 4) };
  230. ๊ทธ๋ฆฌ๊ณ :
  231. *A = X; *(A + 4) = Y;
  232. ๋Š” ๋‹ค์Œ ์ค‘ ๋ญ๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  233. STORE *A = X; STORE *(A + 4) = Y;
  234. STORE *(A + 4) = Y; STORE *A = X;
  235. STORE {*A, *(A + 4) } = {X, Y};
  236. ๊ทธ๋ฆฌ๊ณ  ๋ณด์žฅ์‚ฌํ•ญ์— ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒƒ๋“ค(anti-guarantees)์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  237. (*) ์ด ๋ณด์žฅ์‚ฌํ•ญ๋“ค์€ bitfield ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋ฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์€ bitfield ๋ฅผ
  238. ์ˆ˜์ •ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์›์ž์„ฑ ์—†๋Š”(non-atomic) ์ฝ๊ณ -์ˆ˜์ •ํ•˜๊ณ -์“ฐ๋Š”
  239. ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์˜ ์กฐํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณ‘๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜
  240. ๋™๊ธฐํ™”์— bitfield ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  241. (*) bitfield ๋“ค์ด ์—ฌ๋Ÿฌ ๋ฝ์œผ๋กœ ๋ณดํ˜ธ๋˜๋Š” ๊ฒฝ์šฐ๋ผ ํ•˜๋”๋ผ๋„, ํ•˜๋‚˜์˜ bitfield ์˜
  242. ๋ชจ๋“  ํ•„๋“œ๋“ค์€ ํ•˜๋‚˜์˜ ๋ฝ์œผ๋กœ ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•œ bitfield ์˜ ๋‘
  243. ํ•„๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฝ์œผ๋กœ ๋ณดํ˜ธ๋œ๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์›์ž์„ฑ ์—†๋Š”
  244. ์ฝ๊ณ -์ˆ˜์ •ํ•˜๊ณ -์“ฐ๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์กฐํ•ฉ์€ ํ•œ ํ•„๋“œ์—์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ทผ์ฒ˜์˜
  245. ํ•„๋“œ์—๋„ ์˜ํ–ฅ์„ ๋ผ์น˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  246. (*) ์ด ๋ณด์žฅ์‚ฌํ•ญ๋“ค์€ ์ ์ ˆํ•˜๊ฒŒ ์ •๋ ฌ๋˜๊ณ  ํฌ๊ธฐ๊ฐ€ ์žกํžŒ ์Šค์นผ๋ผ ๋ณ€์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ
  247. ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. "์ ์ ˆํ•˜๊ฒŒ ํฌ๊ธฐ๊ฐ€ ์žกํžŒ" ์ด๋ผํ•จ์€ ํ˜„์žฌ๋กœ์จ๋Š” "char", "short",
  248. "int" ๊ทธ๋ฆฌ๊ณ  "long" ๊ณผ ๊ฐ™์€ ํฌ๊ธฐ์˜ ๋ณ€์ˆ˜๋“ค์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "์ ์ ˆํ•˜๊ฒŒ ์ •๋ ฌ๋œ"
  249. ์€ ์ž์—ฐ์Šค๋Ÿฐ ์ •๋ ฌ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ๋”ฐ๋ผ์„œ "char" ์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ฌด ์ œ์•ฝ์ด ์—†๊ณ ,
  250. "short" ์— ๋Œ€ํ•ด์„œ๋Š” 2๋ฐ”์ดํŠธ ์ •๋ ฌ์„, "int" ์—๋Š” 4๋ฐ”์ดํŠธ ์ •๋ ฌ์„, ๊ทธ๋ฆฌ๊ณ 
  251. "long" ์— ๋Œ€ํ•ด์„œ๋Š” 32-bit ์‹œ์Šคํ…œ์ธ์ง€ 64-bit ์‹œ์Šคํ…œ์ธ์ง€์— ๋”ฐ๋ผ 4๋ฐ”์ดํŠธ ๋˜๋Š”
  252. 8๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณด์žฅ์‚ฌํ•ญ๋“ค์€ C11 ํ‘œ์ค€์—์„œ ์†Œ๊ฐœ๋˜์—ˆ์œผ๋ฏ€๋กœ,
  253. C11 ์ „์˜ ์˜ค๋ž˜๋œ ์ปดํŒŒ์ผ๋Ÿฌ(์˜ˆ๋ฅผ ๋“ค์–ด, gcc 4.6) ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—” ์ฃผ์˜ํ•˜์‹œ๊ธฐ
  254. ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ‘œ์ค€์— ์ด ๋ณด์žฅ์‚ฌํ•ญ๋“ค์€ "memory location" ์„ ์ •์˜ํ•˜๋Š” 3.14
  255. ์„น์…˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:
  256. (์—ญ์ž: ์ธ์šฉ๋ฌธ์ด๋ฏ€๋กœ ๋ฒˆ์—ญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)
  257. memory location
  258. either an object of scalar type, or a maximal sequence
  259. of adjacent bit-fields all having nonzero width
  260. NOTE 1: Two threads of execution can update and access
  261. separate memory locations without interfering with
  262. each other.
  263. NOTE 2: A bit-field and an adjacent non-bit-field member
  264. are in separate memory locations. The same applies
  265. to two bit-fields, if one is declared inside a nested
  266. structure declaration and the other is not, or if the two
  267. are separated by a zero-length bit-field declaration,
  268. or if they are separated by a non-bit-field member
  269. declaration. It is not safe to concurrently update two
  270. bit-fields in the same structure if all members declared
  271. between them are also bit-fields, no matter what the
  272. sizes of those intervening bit-fields happen to be.
  273. =========================
  274. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
  275. =========================
  276. ์•ž์—์„œ ๋ดค๋“ฏ์ด, ์ƒํ˜ธ๊ฐ„ ์˜์กด์„ฑ์ด ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์‹ค์ œ๋กœ๋Š” ๋ฌด์ž‘์œ„์ 
  277. ์ˆœ์„œ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” CPU ์™€ CPU ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ I/O ์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜
  278. ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ์™€ CPU ๊ฐ€ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š”๋ฐ ์ œ์•ฝ์„ ๊ฑธ ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์ž…ํ• 
  279. ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  280. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๊ทธ๋Ÿฐ ๊ฐœ์ž… ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์ด์— ๋‘” ์•ž๊ณผ
  281. ๋’ค ์–‘์ธก์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค ๊ฐ„์— ๋ถ€๋ถ„์  ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜๋„๋ก ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์ค๋‹ˆ๋‹ค.
  282. ์‹œ์Šคํ…œ์˜ CPU ๋“ค๊ณผ ์—ฌ๋Ÿฌ ๋””๋ฐ”์ด์Šค๋“ค์€ ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ช…๋ น์–ด ์žฌ๋ฐฐ์น˜, ์‹คํ–‰
  283. ์œ ์˜ˆ, ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ์กฐํ•ฉ, ์˜ˆ์ธก์  ๋กœ๋“œ(speculative load), ๋ธŒ๋žœ์น˜
  284. ์˜ˆ์ธก(speculative branch prediction), ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์บ์‹ฑ(caching) ๋“ฑ์˜ ๋‹ค์–‘ํ•œ
  285. ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๊ฐ•์ œ๋ ฅ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ์ด๋Ÿฐ
  286. ํŠธ๋ฆญ๋“ค์„ ๋ฌดํšจ๋กœ ํ•˜๊ฑฐ๋‚˜ ์–ต์ œํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์ ธ์„œ ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ CPU ์™€
  287. ๋””๋ฐ”์ด์Šค๋“ค ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ •์ƒ์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  288. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์˜ ์ข…๋ฅ˜
  289. --------------------
  290. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋„ค๊ฐœ์˜ ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค:
  291. (1) ์“ฐ๊ธฐ (๋˜๋Š” ์Šคํ† ์–ด) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  292. ์“ฐ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์— ํ•ด๋‹น ๋ฐฐ๋ฆฌ์–ด๋ณด๋‹ค ์•ž์„œ
  293. ๋ช…์‹œ๋œ ๋ชจ๋“  STORE ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ํ•ด๋‹น ๋ฐฐ๋ฆฌ์–ด ๋’ค์— ๋ช…์‹œ๋œ ๋ชจ๋“  STORE
  294. ์˜คํผ๋ ˆ์ด์…˜๋“ค๋ณด๋‹ค ๋จผ์ € ์ˆ˜ํ–‰๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ผ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  295. ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์— ๋Œ€ํ•œ ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ์ž…๋‹ˆ๋‹ค; ๋กœ๋“œ
  296. ์˜คํผ๋ ˆ์ด์…˜๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  297. CPU ๋Š” ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ผ๋ จ์˜ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์„
  298. ํ•˜๋‚˜์”ฉ ์š”์ฒญํ•ด ์ง‘์–ด๋„ฃ์Šต๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ๋ชจ๋“  ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์€
  299. ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ๋ชจ๋“  ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค๋ณด๋‹ค _์•ž์„œ_ ์ˆ˜ํ–‰๋  ๊ฒ๋‹ˆ๋‹ค.
  300. [!] ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ์ฝ๊ธฐ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด์™€ ํ•จ๊ป˜ ์ง์„ ๋งž์ถฐ
  301. ์‚ฌ์šฉ๋˜์–ด์•ผ๋งŒ ํ•จ์„ ์•Œ์•„๋‘์„ธ์š”; "SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  302. (2) ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด.
  303. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด์˜ ๋ณด๋‹ค ์™„ํ™”๋œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๋‘๊ฐœ์˜ ๋กœ๋“œ
  304. ์˜คํผ๋ ˆ์ด์…˜์ด ์žˆ๊ณ  ๋‘๋ฒˆ์งธ ๊ฒƒ์ด ์ฒซ๋ฒˆ์งธ ๊ฒƒ์˜ ๊ฒฐ๊ณผ์— ์˜์กดํ•˜๊ณ  ์žˆ์„ ๋•Œ(์˜ˆ:
  305. ๋‘๋ฒˆ์งธ ๋กœ๋“œ๊ฐ€ ์ฐธ์กฐํ•  ์ฃผ์†Œ๋ฅผ ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ๊ฐ€ ์ฝ๋Š” ๊ฒฝ์šฐ), ๋‘๋ฒˆ์งธ ๋กœ๋“œ๊ฐ€ ์ฝ์–ด์˜ฌ
  306. ๋ฐ์ดํ„ฐ๋Š” ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ์— ์˜ํ•ด ๊ทธ ์ฃผ์†Œ๊ฐ€ ์–ป์–ด์ง„ ๋’ค์— ์—…๋ฐ์ดํŠธ ๋จ์„ ๋ณด์žฅํ•˜๊ธฐ
  307. ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  308. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ƒํ˜ธ ์˜์กด์ ์ธ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค ์‚ฌ์ด์˜ ๋ถ€๋ถ„์  ์ˆœ์„œ
  309. ์„ธ์šฐ๊ธฐ์ž…๋‹ˆ๋‹ค; ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด๋‚˜ ๋…๋ฆฝ์ ์ธ ๋กœ๋“œ๋“ค, ๋˜๋Š” ์ค‘๋ณต๋˜๋Š”
  310. ๋กœ๋“œ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  311. (1) ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ์‹œ์Šคํ…œ์˜ CPU ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ผ๋ จ์˜ ์Šคํ† ์–ด
  312. ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ๋˜์ ธ ๋„ฃ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฑฐ๊ธฐ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋‹ค๋ฅธ CPU ๋Š” ๊ทธ
  313. ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ
  314. ๋‹ค๋ฅธ CPU ์˜ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜์˜ ๊ฒฐ๊ณผ์— ๊ด€์‹ฌ์„ ๋‘๊ณ  ์žˆ๋Š” CPU ๊ฐ€ ์ˆ˜ํ–‰ ์š”์ฒญํ•œ
  315. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š”, ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ์–ด๋–ค ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์ด ๋‹ค๋ฅธ CPU ์—์„œ
  316. ๋˜์ ธ ๋„ฃ์€ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๊ณผ ๊ฐ™์€ ์˜์—ญ์„ ํ–ฅํ–ˆ๋‹ค๋ฉด, ๊ทธ๋Ÿฐ ์Šคํ† ์–ด
  317. ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ๋กœ๋“œ
  318. ์˜คํผ๋ ˆ์ด์…˜๋“ค์—๊ฒŒ๋Š” ๋ณด์ผ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  319. ์ด ์ˆœ์„œ ์„ธ์šฐ๊ธฐ ์ œ์•ฝ์— ๋Œ€ํ•œ ๊ทธ๋ฆผ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„  "๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์‹œํ€€์Šค์˜ ์˜ˆ"
  320. ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  321. [!] ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ _๋ฐ์ดํ„ฐ_ ์˜์กด์„ฑ์„ ๊ฐ€์ ธ์•ผ์ง€ ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ๊ฐ€์ ธ์•ผ
  322. ํ•˜๋Š”๊ฒŒ ์•„๋‹˜์„ ์•Œ์•„๋‘์‹ญ์‹œ์˜ค. ๋งŒ์•ฝ ๋‘๋ฒˆ์งธ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์ฃผ์†Œ๊ฐ€ ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ์—
  323. ์˜์กด์ ์ด์ง€๋งŒ ๊ทธ ์˜์กด์„ฑ์€ ์กฐ๊ฑด์ ์ด์ง€ ๊ทธ ์ฃผ์†Œ ์ž์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด,
  324. ๊ทธ๊ฒƒ์€ _์ปจํŠธ๋กค_ ์˜์กด์„ฑ์ด๊ณ , ์ด ๊ฒฝ์šฐ์—๋Š” ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ๊ทธ๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ
  325. ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์œ„ํ•ด์„œ๋Š” "์ปจํŠธ๋กค ์˜์กด์„ฑ" ์„œ๋ธŒ์„น์…˜์„
  326. ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  327. [!] ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ณดํ†ต ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ ํ•จ๊ป˜ ์ง์„ ๋งž์ถฐ ์‚ฌ์šฉ๋˜์–ด์•ผ
  328. ํ•ฉ๋‹ˆ๋‹ค; "SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  329. (3) ์ฝ๊ธฐ (๋˜๋Š” ๋กœ๋“œ) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  330. ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด ๊ธฐ๋Šฅ์˜ ๋ณด์žฅ์‚ฌํ•ญ์— ๋”ํ•ด์„œ ๋ฐฐ๋ฆฌ์–ด๋ณด๋‹ค
  331. ์•ž์„œ ๋ช…์‹œ๋œ ๋ชจ๋“  LOAD ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ๋ฐฐ๋ฆฌ์–ด ๋’ค์— ๋ช…์‹œ๋˜๋Š” ๋ชจ๋“  LOAD
  332. ์˜คํผ๋ ˆ์ด์…˜๋“ค๋ณด๋‹ค ๋จผ์ € ํ–‰ํ•ด์ง„ ๊ฒƒ์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์— ๋ณด์—ฌ์งˆ ๊ฒƒ์„
  333. ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  334. ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์— ํ–‰ํ•ด์ง€๋Š” ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ์ž…๋‹ˆ๋‹ค; ์Šคํ† ์–ด
  335. ์˜คํผ๋ ˆ์ด์…˜์— ๋Œ€ํ•ด์„œ๋Š” ์–ด๋–ค ์˜ํ–ฅ๋„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  336. ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ด์žฅํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ
  337. ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  338. [!] ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ ํ•จ๊ป˜ ์ง์„ ๋งž์ถฐ ์‚ฌ์šฉ๋˜์–ด์•ผ
  339. ํ•ฉ๋‹ˆ๋‹ค; "SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  340. (4) ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  341. ๋ฒ”์šฉ(general) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐฐ๋ฆฌ์–ด๋ณด๋‹ค ์•ž์„œ ๋ช…์‹œ๋œ ๋ชจ๋“  LOAD ์™€ STORE
  342. ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ๋ฐฐ๋ฆฌ์–ด ๋’ค์— ๋ช…์‹œ๋œ ๋ชจ๋“  LOAD ์™€ STORE ์˜คํผ๋ ˆ์ด์…˜๋“ค๋ณด๋‹ค
  343. ๋จผ์ € ์ˆ˜ํ–‰๋œ ๊ฒƒ์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ์ปดํฌ๋„ŒํŠธ๋“ค์— ๋ณด์ด๊ฒŒ ๋จ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  344. ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋กœ๋“œ์™€ ์Šคํ† ์–ด ๋ชจ๋‘์— ๋Œ€ํ•œ ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ์ž…๋‹ˆ๋‹ค.
  345. ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด, ์“ฐ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋ชจ๋‘๋ฅผ
  346. ๋‚ด์žฅํ•˜๋ฏ€๋กœ, ๋‘ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋ชจ๋‘ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  347. ๊ทธ๋ฆฌ๊ณ  ๋‘๊ฐœ์˜ ๋ช…์‹œ์ ์ด์ง€ ์•Š์€ ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  348. (5) ACQUIRE ์˜คํผ๋ ˆ์ด์…˜.
  349. ์ด ํƒ€์ž…์˜ ์˜คํผ๋ ˆ์ด์…˜์€ ๋‹จ๋ฐฉํ–ฅ์˜ ํˆฌ๊ณผ์„ฑ ๋ฐฐ๋ฆฌ์–ด์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ACQUIRE
  350. ์˜คํผ๋ ˆ์ด์…˜ ๋’ค์˜ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ACQUIRE ์˜คํผ๋ ˆ์ด์…˜ ํ›„์—
  351. ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ์ปดํฌ๋„ŒํŠธ๋“ค์— ๋ณด์ด๊ฒŒ ๋  ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  352. LOCK ์˜คํผ๋ ˆ์ด์…˜๊ณผ smp_load_acquire(), smp_cond_load_acquire() ์˜คํผ๋ ˆ์ด์…˜๋„
  353. ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  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. ํ•„์š”์„ฑ์„ ์—†์•ฑ๋‹ˆ๋‹ค. ๋˜ํ•œ, RELEASE+ACQUIRE ์กฐํ•ฉ์€ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์ฒ˜๋Ÿผ
  368. ๋™์ž‘ํ•  ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-. ํ•˜์ง€๋งŒ, ์–ด๋–ค ๋ณ€์ˆ˜์— ๋Œ€ํ•œ RELEASE
  369. ์˜คํผ๋ ˆ์ด์…˜์„ ์•ž์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” ์ด RELEASE ์˜คํผ๋ ˆ์ด์…˜์„
  370. ๋’ค์ด์–ด ๊ฐ™์€ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋œ ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์„ ๋’ค๋”ฐ๋ฅด๋Š” ๋ฉ”๋ชจ๋ฆฌ
  371. ์•ก์„ธ์Šค์—๋Š” ๋ณด์—ฌ์งˆ ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜์ž๋ฉด, ์ฃผ์–ด์ง„ ๋ณ€์ˆ˜์˜
  372. ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜์—์„œ๋Š”, ํ•ด๋‹น ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์•ž์˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜์—์„œ์˜ ๋ชจ๋“ 
  373. ์•ก์„ธ์Šค๋“ค์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  374. ์ฆ‰, ACQUIRE ๋Š” ์ตœ์†Œํ•œ์˜ "์ทจ๋“" ๋™์ž‘์ฒ˜๋Ÿผ, ๊ทธ๋ฆฌ๊ณ  RELEASE ๋Š” ์ตœ์†Œํ•œ์˜ "๊ณต๊ฐœ"
  375. ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  376. atomic_t.txt ์— ์„ค๋ช…๋œ ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜๋“ค ์ค‘ ์ผ๋ถ€๋Š” ์™„์ „ํžˆ ์ˆœ์„œ์žกํžŒ ๊ฒƒ๋“ค๊ณผ
  377. (๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”) ์™„ํ™”๋œ ์ˆœ์„œ์˜ ๊ฒƒ๋“ค ์™ธ์— ACQUIRE ์™€ RELEASE ๋ถ€๋ฅ˜์˜
  378. ๊ฒƒ๋“ค๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋Š” ์กฐํ•ฉ๋œ ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜์—์„œ,
  379. ACQUIRE ๋Š” ํ•ด๋‹น ์˜คํผ๋ ˆ์ด์…˜์˜ ๋กœ๋“œ ๋ถ€๋ถ„์—๋งŒ ์ ์šฉ๋˜๊ณ  RELEASE ๋Š” ํ•ด๋‹น
  380. ์˜คํผ๋ ˆ์ด์…˜์˜ ์Šคํ† ์–ด ๋ถ€๋ถ„์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  381. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ๋‘ CPU ๊ฐ„, ๋˜๋Š” CPU ์™€ ๋””๋ฐ”์ด์Šค ๊ฐ„์— ์ƒํ˜ธ์ž‘์šฉ์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„
  382. ๋•Œ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์–ด๋–ค ์ฝ”๋“œ์— ๊ทธ๋Ÿฐ ์ƒํ˜ธ์ž‘์šฉ์ด ์—†์„ ๊ฒƒ์ด ๋ณด์žฅ๋œ๋‹ค๋ฉด, ํ•ด๋‹น
  383. ์ฝ”๋“œ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  384. ์ด๊ฒƒ๋“ค์€ _์ตœ์†Œํ•œ์˜_ ๋ณด์žฅ์‚ฌํ•ญ๋“ค์ž„์„ ์•Œ์•„๋‘์„ธ์š”. ๋‹ค๋ฅธ ์•„ํ‚คํ…์ณ์—์„œ๋Š” ๋” ๊ฐ•๋ ฅํ•œ
  385. ๋ณด์žฅ์‚ฌํ•ญ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ๊ทธ๋Ÿฐ ๋ณด์žฅ์‚ฌํ•ญ์€ ์•„ํ‚คํ…์ณ ์ข…์†์  ์ฝ”๋“œ ์ด์™ธ์˜
  386. ๋ถ€๋ถ„์—์„œ๋Š” ์‹ ๋ขฐ๋˜์ง€ _์•Š์„_ ๊ฒ๋‹ˆ๋‹ค.
  387. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์— ๋Œ€ํ•ด ๊ฐ€์ •ํ•ด์„  ์•ˆ๋  ๊ฒƒ
  388. -------------------------------------
  389. ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์ด ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  390. (*) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์•ž์—์„œ ๋ช…์‹œ๋œ ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋ช…๋ น์˜ ์ˆ˜ํ–‰
  391. ์™„๋ฃŒ ์‹œ์ ๊นŒ์ง€ _์™„๋ฃŒ_ ๋  ๊ฒƒ์ด๋ž€ ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค; ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•˜๋Š” ์ผ์€ CPU ์˜
  392. ์•ก์„ธ์Šค ํ์— ํŠน์ • ํƒ€์ž…์˜ ์•ก์„ธ์Šค๋“ค์€ ๋„˜์„ ์ˆ˜ ์—†๋Š” ์„ ์„ ๊ธ‹๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋  ์ˆ˜
  393. ์žˆ์Šต๋‹ˆ๋‹ค.
  394. (*) ํ•œ CPU ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๊ฒŒ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ CPU ๋‚˜ ํ•˜๋“œ์›จ์–ด์—
  395. ์–ด๋–ค ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค๋Š” ๋ณด์žฅ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ๋ฆฌ์–ด ์ˆ˜ํ–‰์ด
  396. ๋งŒ๋“œ๋Š” ๊ฐ„์ ‘์  ์˜ํ–ฅ์€ ๋‘๋ฒˆ์งธ CPU ๊ฐ€ ์ฒซ๋ฒˆ์งธ CPU ์˜ ์•ก์„ธ์Šค๋“ค์˜ ๊ฒฐ๊ณผ๋ฅผ
  397. ๋ฐ”๋ผ๋ณด๋Š” ์ˆœ์„œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค๋งŒ, ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋ณด์„ธ์š”:
  398. (*) ์ฒซ๋ฒˆ์งธ CPU ๊ฐ€ ๋‘๋ฒˆ์งธ CPU ์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋ผ๋ณผ ๋•Œ, _์„ค๋ น_
  399. ๋‘๋ฒˆ์งธ CPU ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค ํ•ด๋„, ์ฒซ๋ฒˆ์งธ CPU _๋˜ํ•œ_ ๊ทธ์— ๋งž๋Š”
  400. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ("SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ" ์„œ๋ธŒ์„น์…˜์„
  401. ์ฐธ๊ณ ํ•˜์„ธ์š”) ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ๋ณด์—ฌ์ง„๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
  402. (*) CPU ๋ฐ”๊นฅ์˜ ํ•˜๋“œ์›จ์–ด[*] ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ณด์žฅ์€
  403. ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CPU ์บ์‹œ ์ผ๊ด€์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์˜ ๊ฐ„์ ‘์ 
  404. ์˜ํ–ฅ์„ CPU ์‚ฌ์ด์— ์ „ํŒŒํ•˜๊ธด ํ•˜์ง€๋งŒ, ์ˆœ์„œ๋Œ€๋กœ ์ „ํŒŒํ•˜์ง€๋Š” ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  405. [*] ๋ฒ„์Šค ๋งˆ์Šคํ„ฐ๋ง DMA ์™€ ์ผ๊ด€์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค:
  406. Documentation/driver-api/pci/pci.rst
  407. Documentation/core-api/dma-api-howto.rst
  408. Documentation/core-api/dma-api.rst
  409. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด (์—ญ์‚ฌ์ )
  410. -----------------------------
  411. ๋ฆฌ๋ˆ…์Šค ์ปค๋„ v4.15 ๊ธฐ์ค€์œผ๋กœ, smp_mb() ๊ฐ€ DEC Alpha ์šฉ READ_ONCE() ์ฝ”๋“œ์—
  412. ์ถ”๊ฐ€๋˜์—ˆ๋Š”๋ฐ, ์ด๋Š” ์ด ์„น์…˜์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ DEC Alpha ์•„ํ‚คํ…์ณ
  413. ์ „์šฉ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ READ_ONCE() ์ž์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ๋“ค ๋ฟ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  414. ๊ทธ๋Ÿฐ ๋ถ„๋“ค์„ ์œ„ํ•ด, ๊ทธ๋ฆฌ๊ณ  ์—ญ์‚ฌ์— ๊ด€์‹ฌ ์žˆ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด, ์—ฌ๊ธฐ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ
  415. ๋ฐฐ๋ฆฌ์–ด์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ์ ์Šต๋‹ˆ๋‹ค.
  416. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด์˜ ์‚ฌ์šฉ์— ์žˆ์–ด ์ง€์ผœ์•ผ ํ•˜๋Š” ์‚ฌํ•ญ๋“ค์€ ์•ฝ๊ฐ„ ๋ฏธ๋ฌ˜ํ•˜๊ณ , ๋ฐ์ดํ„ฐ
  417. ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ๋„ ํ•ญ์ƒ ๋ช…๋ฐฑํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์„ค๋ช…์„ ์œ„ํ•ด
  418. ๋‹ค์Œ์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  419. CPU 1 CPU 2
  420. =============== ===============
  421. { A == 1, B == 2, C == 3, P == &A, Q == &C }
  422. B = 4;
  423. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  424. WRITE_ONCE(P, &B)
  425. Q = READ_ONCE(P);
  426. D = *Q;
  427. ์—ฌ๊ธฐ์—” ๋ถ„๋ช…ํ•œ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋ฏ€๋กœ, ์ด ์‹œํ€€์Šค๊ฐ€ ๋๋‚ฌ์„ ๋•Œ Q ๋Š” &A ๋˜๋Š” &B
  428. ์ผ ๊ฒƒ์ด๊ณ , ๋”ฐ๋ผ์„œ:
  429. (Q == &A) ๋Š” (D == 1) ๋ฅผ,
  430. (Q == &B) ๋Š” (D == 4) ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  431. ํ•˜์ง€๋งŒ! CPU 2 ๋Š” B ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ธ์‹ํ•˜๊ธฐ ์ „์— P ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ณ ,
  432. ๋”ฐ๋ผ์„œ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  433. (Q == &B) and (D == 2) ????
  434. ์ด๋Ÿฐ ๊ฒฐ๊ณผ๋Š” ์ผ๊ด€์„ฑ์ด๋‚˜ ์ธ๊ณผ ๊ด€๊ณ„ ์œ ์ง€๊ฐ€ ์‹คํŒจํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ,
  435. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์ด ํ˜„์ƒ์€ (DEC Alpha ์™€ ๊ฐ™์€) ์—ฌ๋Ÿฌ CPU ์—์„œ ์‹ค์ œ๋กœ
  436. ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  437. ์ด ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ œ๋Œ€๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ๊ทธ๋ณด๋‹ค ๊ฐ•ํ™”๋œ
  438. ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ฃผ์†Œ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ ์‚ฌ์ด์— ์ถ”๊ฐ€๋˜์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค:
  439. CPU 1 CPU 2
  440. =============== ===============
  441. { A == 1, B == 2, C == 3, P == &A, Q == &C }
  442. B = 4;
  443. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  444. WRITE_ONCE(P, &B);
  445. Q = READ_ONCE(P);
  446. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด>
  447. D = *Q;
  448. ์ด ๋ณ€๊ฒฝ์€ ์•ž์˜ ์ฒ˜์Œ ๋‘๊ฐ€์ง€ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋งŒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ์„ธ๋ฒˆ์งธ์˜ ๊ฒฐ๊ณผ๋Š”
  449. ๋ฐœ์ƒํ•  ์ˆ˜ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  450. [!] ์ด ์ƒ๋‹นํžˆ ๋ฐ˜์ง๊ด€์ ์ธ ์ƒํ™ฉ์€ ๋ถ„๋ฆฌ๋œ ์บ์‹œ๋ฅผ ๊ฐ€์ง€๋Š” ๊ธฐ๊ณ„๋“ค์—์„œ ๊ฐ€์žฅ ์ž˜
  451. ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด ํ•œ ์บ์‹œ ๋ฑ…ํฌ๋Š” ์ง์ˆ˜ ๋ฒˆํ˜ธ์˜ ์บ์‹œ ๋ผ์ธ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋‹ค๋ฅธ
  452. ๋ฑ…ํฌ๋Š” ํ™€์ˆ˜ ๋ฒˆํ˜ธ์˜ ์บ์‹œ ๋ผ์ธ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ์ž„์„ ์•Œ์•„๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ
  453. P ๋Š” ์ง์ˆ˜ ๋ฒˆํ˜ธ ์บ์‹œ ๋ผ์ธ์— ์ €์žฅ๋˜์–ด ์žˆ๊ณ , ๋ณ€์ˆ˜ B ๋Š” ํ™€์ˆ˜ ๋ฒˆํ˜ธ ์บ์‹œ ๋ผ์ธ์—
  454. ์ €์žฅ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ’์„ ์ฝ์–ด์˜ค๋Š” CPU ์˜ ์บ์‹œ์˜ ํ™€์ˆ˜ ๋ฒˆํ˜ธ ์ฒ˜๋ฆฌ
  455. ๋ฑ…ํฌ๋Š” ์—ด์‹ฌํžˆ ์ผ๊ฐ์„ ์ฒ˜๋ฆฌ์ค‘์ธ ๋ฐ˜๋ฉด ํ™€์ˆ˜ ๋ฒˆํ˜ธ ์ฒ˜๋ฆฌ ๋ฑ…ํฌ๋Š” ํ•  ์ผ ์—†์ด ํ•œ๊ฐ€ํ•œ
  456. ์ค‘์ด๋ผ๋ฉด ํฌ์ธํ„ฐ P (&B) ์˜ ์ƒˆ๋กœ์šด ๊ฐ’๊ณผ ๋ณ€์ˆ˜ B ์˜ ๊ธฐ์กด ๊ฐ’ (2) ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  457. ์˜์กด์  ์“ฐ๊ธฐ๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋งž์ถ”๋Š”๋ฐ์—๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”์น˜ ์•Š์€๋ฐ, ์ด๋Š”
  458. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์ด ์ง€์›ํ•˜๋Š” CPU ๋“ค์€ (1) ์“ฐ๊ธฐ๊ฐ€ ์ •๋ง๋กœ ์ผ์–ด๋‚ ์ง€, (2) ์“ฐ๊ธฐ๊ฐ€ ์–ด๋””์—
  459. ์ด๋ฃจ์–ด์งˆ์ง€, ๊ทธ๋ฆฌ๊ณ  (3) ์“ฐ์—ฌ์งˆ ๊ฐ’์„ ํ™•์‹คํžˆ ์•Œ๊ธฐ ์ „๊นŒ์ง€๋Š” ์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ธฐ
  460. ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ "์ปจํŠธ๋กค ์˜์กด์„ฑ" ์„น์…˜๊ณผ
  461. Documentation/RCU/rcu_dereference.rst ํŒŒ์ผ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ์–ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค:
  462. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋งค์šฐ ์ฐฝ์˜์ ์ธ ๋งŽ์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ข…์†์„ฑ์„ ๊นฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  463. CPU 1 CPU 2
  464. =============== ===============
  465. { A == 1, B == 2, C = 3, P == &A, Q == &C }
  466. B = 4;
  467. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  468. WRITE_ONCE(P, &B);
  469. Q = READ_ONCE(P);
  470. WRITE_ONCE(*Q, 5);
  471. ๋”ฐ๋ผ์„œ, Q ๋กœ์˜ ์ฝ๊ธฐ์™€ *Q ๋กœ์˜ ์“ฐ๊ธฐ ์‚ฌ์ด์—๋Š” ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”์น˜
  472. ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋งํ•˜๋ฉด, ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์—†๋”๋ผ๋„ ๋‹ค์Œ ๊ฒฐ๊ณผ๋Š” ์ƒ๊ธฐ์ง€
  473. ์•Š์Šต๋‹ˆ๋‹ค:
  474. (Q == &B) && (B == 4)
  475. ์ด๋Ÿฐ ํŒจํ„ด์€ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•จ์„ ์•Œ์•„ ๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค๋„, ์˜์กด์„ฑ
  476. ์ˆœ์„œ ๊ทœ์น™์˜ ์˜๋„๋Š” ์“ฐ๊ธฐ ์ž‘์—…์„ -์˜ˆ๋ฐฉ- ํ•ด์„œ ๊ทธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋น„์‹ผ ์บ์‹œ ๋ฏธ์Šค๋„
  477. ์—†์• ๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ ์กฐ๊ฑด ๊ฐ™์€๊ฒƒ๋“ค์„ ๊ธฐ๋กํ•˜๋Š”๋ฐ
  478. ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, CPU์˜ ์ž์—ฐ์ ์ธ ์ˆœ์„œ ๋ณด์žฅ์ด ๊ทธ๋Ÿฐ ๊ธฐ๋ก๋“ค์„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ฒŒ
  479. ํ•ด์ค๋‹ˆ๋‹ค.
  480. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” ์ด ์ˆœ์„œ๊ทœ์น™์€ ์ด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” CPU ์—
  481. ์ง€์—ญ์ ์ž„์„ ์•Œ์•„๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  "Multicopy ์›์ž์„ฑ"
  482. ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  483. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด RCU ์‹œ์Šคํ…œ์—์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
  484. include/linux/rcupdate.h ์˜ rcu_assign_pointer() ์™€ rcu_dereference() ๋ฅผ
  485. ์ฐธ๊ณ ํ•˜์„ธ์š”. ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” RCU ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ํฌ์ธํ„ฐ์˜ ํƒ€๊ฒŸ์„ ํ˜„์žฌ
  486. ํƒ€๊ฒŸ์—์„œ ์ˆ˜์ •๋œ ์ƒˆ๋กœ์šด ํƒ€๊ฒŸ์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ž‘์—…์—์„œ ์ƒˆ๋กœ ์ˆ˜์ •๋œ ํƒ€๊ฒŸ์ด ์ดˆ๊ธฐํ™”๊ฐ€
  487. ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ฑ„๋กœ ๋ณด์—ฌ์ง€๋Š” ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  488. ๋” ๋งŽ์€ ์˜ˆ๋ฅผ ์œ„ํ•ด์„  "์บ์‹œ ์ผ๊ด€์„ฑ" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  489. ์ปจํŠธ๋กค ์˜์กด์„ฑ
  490. -------------
  491. ํ˜„์žฌ์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์€ ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปจํŠธ๋กค ์˜์กด์„ฑ์€
  492. ์•ฝ๊ฐ„ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„น์…˜์˜ ๋ชฉ์ ์€ ์—ฌ๋Ÿฌ๋ถ„์ด ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ฌด์‹œ๋กœ
  493. ์ธํ•ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ๋ง๊ฐ€์ง€๋Š” ๊ฑธ ๋ง‰์„ ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๊ฒ๋‹ˆ๋‹ค.
  494. ๋กœ๋“œ-๋กœ๋“œ ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋งŒ์œผ๋กœ๋Š” ์ •ํ™•ํžˆ ๋™์ž‘ํ•  ์ˆ˜๊ฐ€
  495. ์—†์–ด์„œ ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ด…์‹œ๋‹ค:
  496. q = READ_ONCE(a);
  497. if (q) {
  498. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด> /* BUG: No data dependency!!! */
  499. p = READ_ONCE(b);
  500. }
  501. ์ด ์ฝ”๋“œ๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ์˜ ํšจ๊ณผ๋ฅผ ๋‚ด์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ์ฝ”๋“œ์—๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด
  502. ์•„๋‹ˆ๋ผ ์ปจํŠธ๋กค ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์œผ๋กœ, ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ CPU ๋Š” ์‹คํ–‰ ์†๋„๋ฅผ ๋”
  503. ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๊ธฐ ์กฐ๊ฑด์˜ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋‹ค๋ฅธ
  504. CPU ๋Š” b ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์ด a ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋ณด๋‹ค ๋จผ์ € ๋ฐœ์ƒํ•œ
  505. ๊ฑธ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ •๋ง๋กœ ํ•„์š”ํ–ˆ๋˜ ๊ฑด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  506. q = READ_ONCE(a);
  507. if (q) {
  508. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  509. p = READ_ONCE(b);
  510. }
  511. ํ•˜์ง€๋งŒ, ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜์€ ์˜ˆ์ธก์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ ์˜ˆ์—์„œ์™€
  512. ๊ฐ™์ด ๋กœ๋“œ-์Šคํ† ์–ด ์ปจํŠธ๋กค ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ˆœ์„œ๊ฐ€ -์ง€์ผœ์ง„๋‹ค-๋Š”
  513. ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  514. q = READ_ONCE(a);
  515. if (q) {
  516. WRITE_ONCE(b, 1);
  517. }
  518. ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ๋ณดํ†ต ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ ์ง์„ ๋งž์ถฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณค
  519. ํ•˜๋‚˜, READ_ONCE() ๋„ WRITE_ONCE() ๋„ ์„ ํƒ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ ํ•„์ˆ˜์‚ฌํ•ญ์ž„์„ ๋ถ€๋””
  520. ๋ช…์‹ฌํ•˜์„ธ์š”! READ_ONCE() ๊ฐ€ ์—†๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 'a' ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๋ฅผ 'a' ๋กœ๋ถ€ํ„ฐ์˜
  521. ๋˜๋‹ค๋ฅธ ๋กœ๋“œ์™€ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WRITE_ONCE() ๊ฐ€ ์—†๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 'b' ๋กœ์˜
  522. ์Šคํ† ์–ด๋ฅผ 'b' ๋กœ์˜ ๋˜๋ผ๋Š ์Šคํ† ์–ด๋“ค๊ณผ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์ˆœ์„œ์—
  523. ์žˆ์–ด ์ƒ๋‹นํžˆ ๋น„์ง๊ด€์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  524. ์ด๊ฑธ๋กœ ๋์ด ์•„๋‹Œ๊ฒŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณ€์ˆ˜ 'a' ์˜ ๊ฐ’์ด ํ•ญ์ƒ 0์ด ์•„๋‹ˆ๋ผ๊ณ  ์ฆ๋ช…ํ•  ์ˆ˜
  525. ์žˆ๋‹ค๋ฉด, ์•ž์˜ ์˜ˆ์—์„œ "if" ๋ฌธ์„ ์—†์• ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ตœ์ ํ™” ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  526. q = a;
  527. b = 1; /* BUG: Compiler and CPU can both reorder!!! */
  528. ๊ทธ๋Ÿฌ๋‹ˆ READ_ONCE() ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•˜์„ธ์š”.
  529. ๋‹ค์Œ๊ณผ ๊ฐ™์ด "if" ๋ฌธ์˜ ์–‘๊ฐˆ๋ž˜ ๋ธŒ๋žœ์น˜์— ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๋™์ผํ•œ ์Šคํ† ์–ด์— ๋Œ€ํ•ด ์ˆœ์„œ๋ฅผ
  530. ๊ฐ•์ œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  531. q = READ_ONCE(a);
  532. if (q) {
  533. barrier();
  534. WRITE_ONCE(b, 1);
  535. do_something();
  536. } else {
  537. barrier();
  538. WRITE_ONCE(b, 1);
  539. do_something_else();
  540. }
  541. ์•ˆํƒ€๊น๊ฒŒ๋„, ํ˜„์žฌ์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์€ ๋†’์€ ์ตœ์ ํ™” ๋ ˆ๋ฒจ์—์„œ๋Š” ์ด๊ฑธ ๋‹ค์Œ๊ณผ ๊ฐ™์ด
  542. ๋ฐ”๊ฟ”๋ฒ„๋ฆฝ๋‹ˆ๋‹ค:
  543. q = READ_ONCE(a);
  544. barrier();
  545. WRITE_ONCE(b, 1); /* BUG: No ordering vs. load from a!!! */
  546. if (q) {
  547. /* WRITE_ONCE(b, 1); -- moved up, BUG!!! */
  548. do_something();
  549. } else {
  550. /* WRITE_ONCE(b, 1); -- moved up, BUG!!! */
  551. do_something_else();
  552. }
  553. ์ด์ œ 'a' ์—์„œ์˜ ๋กœ๋“œ์™€ 'b' ๋กœ์˜ ์Šคํ† ์–ด ์‚ฌ์ด์—๋Š” ์กฐ๊ฑด์  ๊ด€๊ณ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— CPU
  554. ๋Š” ์ด๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค: ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์กฐ๊ฑด์  ๊ด€๊ณ„๋Š” ๋ฐ˜๋“œ์‹œ
  555. ํ•„์š”ํ•œ๋ฐ, ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ๋‚œ ํ›„์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์—์„œ๋„
  556. ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด ์˜ˆ์—์„œ ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” smp_store_release()
  557. ์™€ ๊ฐ™์€ ๋ช…์‹œ์  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:
  558. q = READ_ONCE(a);
  559. if (q) {
  560. smp_store_release(&b, 1);
  561. do_something();
  562. } else {
  563. smp_store_release(&b, 1);
  564. do_something_else();
  565. }
  566. ๋ฐ˜๋ฉด์— ๋ช…์‹œ์  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์—†๋‹ค๋ฉด, ์ด๋Ÿฐ ๊ฒฝ์šฐ์˜ ์ˆœ์„œ๋Š” ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด
  567. ์„œ๋กœ ๋‹ค๋ฅผ ๋•Œ์—๋งŒ ๋ณด์žฅ๋˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค:
  568. q = READ_ONCE(a);
  569. if (q) {
  570. WRITE_ONCE(b, 1);
  571. do_something();
  572. } else {
  573. WRITE_ONCE(b, 2);
  574. do_something_else();
  575. }
  576. ์ฒ˜์Œ์˜ READ_ONCE() ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 'a' ์˜ ๊ฐ’์„ ์ฆ๋ช…ํ•ด๋‚ด๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ
  577. ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  578. ๋˜ํ•œ, ๋กœ์ปฌ ๋ณ€์ˆ˜ 'q' ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด
  579. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ ๊ฐ’์„ ์ถ”์ธกํ•˜๊ณ  ๋˜๋‹ค์‹œ ํ•„์š”ํ•œ ์กฐ๊ฑด๊ด€๊ณ„๋ฅผ ์—†์• ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  580. ์˜ˆ๋ฅผ ๋“ค๋ฉด:
  581. q = READ_ONCE(a);
  582. if (q % MAX) {
  583. WRITE_ONCE(b, 1);
  584. do_something();
  585. } else {
  586. WRITE_ONCE(b, 2);
  587. do_something_else();
  588. }
  589. ๋งŒ์•ฝ MAX ๊ฐ€ 1 ๋กœ ์ •์˜๋œ ์ƒ์ˆ˜๋ผ๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” (q % MAX) ๋Š” 0์ด๋ž€ ๊ฒƒ์„ ์•Œ์•„์ฑ„๊ณ ,
  590. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ”๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  591. q = READ_ONCE(a);
  592. WRITE_ONCE(b, 2);
  593. do_something_else();
  594. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, CPU ๋Š” ๋ณ€์ˆ˜ 'a' ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ์™€ ๋ณ€์ˆ˜ 'b' ๋กœ์˜ ์Šคํ† ์–ด ์‚ฌ์ด์˜ ์ˆœ์„œ๋ฅผ
  595. ์ง€์ผœ์ค„ ํ•„์š”๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค. barrier() ๋ฅผ ์ถ”๊ฐ€ํ•ด ํ•ด๊ฒฐํ•ด ๋ณด๊ณ  ์‹ถ๊ฒ ์ง€๋งŒ, ๊ทธ๊ฑด
  596. ๋„์›€์ด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด ๊ด€๊ณ„๋Š” ์‚ฌ๋ผ์กŒ๊ณ , barrier() ๋Š” ์ด๋ฅผ ๋˜๋Œ๋ฆฌ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  597. ๋”ฐ๋ผ์„œ, ์ด ์ˆœ์„œ๋ฅผ ์ง€์ผœ์•ผ ํ•œ๋‹ค๋ฉด, MAX ๊ฐ€ 1 ๋ณด๋‹ค ํฌ๋‹ค๋Š” ๊ฒƒ์„, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„
  598. ์‚ฌ์šฉํ•ด ๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  599. q = READ_ONCE(a);
  600. BUILD_BUG_ON(MAX <= 1); /* Order load from a with store to b. */
  601. if (q % MAX) {
  602. WRITE_ONCE(b, 1);
  603. do_something();
  604. } else {
  605. WRITE_ONCE(b, 2);
  606. do_something_else();
  607. }
  608. 'b' ๋กœ์˜ ์Šคํ† ์–ด๋“ค์€ ์—ฌ์ „ํžˆ ์„œ๋กœ ๋‹ค๋ฆ„์„ ์•Œ์•„๋‘์„ธ์š”. ๋งŒ์•ฝ ๊ทธ๊ฒƒ๋“ค์ด ๋™์ผํ•˜๋ฉด,
  609. ์•ž์—์„œ ์ด์•ผ๊ธฐํ–ˆ๋“ฏ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ 'if' ๋ฌธ ๋ฐ”๊นฅ์œผ๋กœ
  610. ๋„์ง‘์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  611. ๋˜ํ•œ ์ด์ง„ ์กฐ๊ฑด๋ฌธ ํ‰๊ฐ€์— ๋„ˆ๋ฌด ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์กฐ์‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ์˜ˆ๋ฅผ
  612. ๋ด…์‹œ๋‹ค:
  613. q = READ_ONCE(a);
  614. if (q || 1 > 0)
  615. WRITE_ONCE(b, 1);
  616. ์ฒซ๋ฒˆ์งธ ์กฐ๊ฑด๋งŒ์œผ๋กœ๋Š” ๋ธŒ๋žœ์น˜ ์กฐ๊ฑด ์ „์ฒด๋ฅผ ๊ฑฐ์ง“์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๊ณ  ๋‘๋ฒˆ์งธ ์กฐ๊ฑด์€ ํ•ญ์ƒ
  617. ์ฐธ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ์˜ˆ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ”์„œ ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ์—†์• ๋ฒ„๋ฆด
  618. ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  619. q = READ_ONCE(a);
  620. WRITE_ONCE(b, 1);
  621. ์ด ์˜ˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ถ”์ธก์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก ๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„
  622. ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•ด์„œ, READ_ONCE() ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ฃผ์–ด์ง„ ๋กœ๋“œ
  623. ์˜คํผ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ •๋ง๋กœ ๋งŒ๋“ค๋„๋ก ํ•˜์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„
  624. ์ฝ”๋“œ์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  625. ๋˜ํ•œ, ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ if ๋ฌธ์˜ then ์ ˆ๊ณผ else ์ ˆ์— ๋Œ€ํ•ด์„œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ธํžˆ
  626. ๋งํ•ด์„œ, ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ if ๋ฌธ์„ ๋’ค๋”ฐ๋ฅด๋Š” ์ฝ”๋“œ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:
  627. q = READ_ONCE(a);
  628. if (q) {
  629. WRITE_ONCE(b, 1);
  630. } else {
  631. WRITE_ONCE(b, 2);
  632. }
  633. WRITE_ONCE(c, 1); /* BUG: No ordering against the read from 'a'. */
  634. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” volatile ํƒ€์ž…์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์—†๊ณ  ์ด ์กฐ๊ฑด ํ•˜์˜ 'b'
  635. ๋กœ์˜ ์“ฐ๊ธฐ๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์ˆœ์„œ ๊ทœ์น™์ด ์กด์žฌํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ 
  636. ์‹ถ์„ ๊ฒ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ด ๊ฒฝ์šฐ์—, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ์˜ ๊ฐ€์ƒ์˜ pseudo-assembly ์–ธ์–ด
  637. ์ฝ”๋“œ์ฒ˜๋Ÿผ 'b' ๋กœ์˜ ๋‘๊ฐœ์˜ ์“ฐ๊ธฐ ์˜คํผ๋ ˆ์ด์…˜์„ conditional-move ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ
  638. ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  639. ld r1,a
  640. cmp r1,$0
  641. cmov,ne r4,$1
  642. cmov,eq r4,$2
  643. st r4,b
  644. st $1,c
  645. ์™„ํ™”๋œ ์ˆœ์„œ ๊ทœ์น™์˜ CPU ๋Š” 'a' ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ์™€ 'c' ๋กœ์˜ ์Šคํ† ์–ด ์‚ฌ์ด์— ์–ด๋–ค
  646. ์ข…๋ฅ˜์˜ ์˜์กด์„ฑ๋„ ๊ฐ–์ง€ ์•Š์„ ๊ฒ๋‹ˆ๋‹ค. ์ด ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ๋‘๊ฐœ์˜ cmov ์ธ์ŠคํŠธ๋Ÿญ์…˜๊ณผ
  647. ๊ฑฐ๊ธฐ์— ์˜์กดํ•˜๋Š” ์Šคํ† ์–ด ์—๊ฒŒ๋งŒ ์ ์šฉ๋  ๊ฒ๋‹ˆ๋‹ค. ์งง๊ฒŒ ๋งํ•˜์ž๋ฉด, ์ปจํŠธ๋กค ์˜์กด์„ฑ์€
  648. ์ฃผ์–ด์ง„ if ๋ฌธ์˜ then ์ ˆ๊ณผ else ์ ˆ์—๊ฒŒ๋งŒ (๊ทธ๋ฆฌ๊ณ  ์ด ๋‘ ์ ˆ ๋‚ด์—์„œ ํ˜ธ์ถœ๋˜๋Š”
  649. ํ•จ์ˆ˜๋“ค์—๊ฒŒ๊นŒ์ง€) ์ ์šฉ๋˜์ง€, ์ด if ๋ฌธ์„ ๋’ค๋”ฐ๋ฅด๋Š” ์ฝ”๋“œ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  650. ์ปจํŠธ๋กค ์˜์กด์„ฑ์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” ์ด ์ˆœ์„œ๊ทœ์น™์€ ์ด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” CPU ์—
  651. ์ง€์—ญ์ ์ž…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  "Multicopy ์›์ž์„ฑ" ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  652. ์š”์•ฝํ•˜์ž๋ฉด:
  653. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ์•ž์˜ ๋กœ๋“œ๋“ค์„ ๋’ค์˜ ์Šคํ† ์–ด๋“ค์— ๋Œ€ํ•ด ์ˆœ์„œ๋ฅผ ๋งž์ถฐ์ค๋‹ˆ๋‹ค.
  654. ํ•˜์ง€๋งŒ, ๊ทธ ์™ธ์˜ ์–ด๋–ค ์ˆœ์„œ๋„ ๋ณด์žฅํ•˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-: ์•ž์˜ ๋กœ๋“œ์™€ ๋’ค์˜ ๋กœ๋“œ๋“ค
  655. ์‚ฌ์ด์—๋„, ์•ž์˜ ์Šคํ† ์–ด์™€ ๋’ค์˜ ์Šคํ† ์–ด๋“ค ์‚ฌ์ด์—๋„์š”. ์ด๋Ÿฐ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜
  656. ์ˆœ์„œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด smp_rmb() ๋‚˜ smp_wmb()๋ฅผ, ๋˜๋Š”, ์•ž์˜ ์Šคํ† ์–ด๋“ค๊ณผ ๋’ค์˜
  657. ๋กœ๋“œ๋“ค ์‚ฌ์ด์˜ ์ˆœ์„œ๋ฅผ ์œ„ํ•ด์„œ๋Š” smp_mb() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  658. (*) "if" ๋ฌธ์˜ ์–‘๊ฐˆ๋ž˜ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜์—์˜ ๋™์ผํ•œ ์Šคํ† ์–ด๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด, ๊ทธ
  659. ์Šคํ† ์–ด๋“ค์€ ๊ฐ ์Šคํ† ์–ด ์•ž์— smp_mb() ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ smp_store_release() ๋ฅผ
  660. ์‚ฌ์šฉํ•ด์„œ ์Šคํ† ์–ด๋ฅผ ํ•˜๋Š” ์‹์œผ๋กœ ์ˆœ์„œ๋ฅผ ๋งž์ถฐ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ
  661. ์œ„ํ•ด "if" ๋ฌธ์˜ ์–‘๊ฐˆ๋ž˜ ๋ธŒ๋žœ์น˜์˜ ์‹œ์ž‘ ์ง€์ ์— barrier() ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š”
  662. ์ถฉ๋ถ„ํ•œ ํ•ด๊ฒฐ์ด ๋˜์ง€ ์•Š๋Š”๋ฐ, ์ด๋Š” ์•ž์˜ ์˜ˆ์—์„œ ๋ณธ๊ฒƒ๊ณผ ๊ฐ™์ด, ์ปดํŒŒ์ผ๋Ÿฌ์˜
  663. ์ตœ์ ํ™”๋Š” barrier() ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ง€ํ‚ค๋ฉด์„œ๋„ ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ์†์ƒ์‹œํ‚ฌ
  664. ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๋Š” ์ ์„ ๋ถ€๋”” ์•Œ์•„๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  665. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ์•ž์˜ ๋กœ๋“œ์™€ ๋’ค์˜ ์Šคํ† ์–ด ์‚ฌ์ด์— ์ตœ์†Œ ํ•˜๋‚˜์˜, ์‹คํ–‰
  666. ์‹œ์ ์—์„œ์˜ ์กฐ๊ฑด๊ด€๊ณ„๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฉฐ, ์ด ์กฐ๊ฑด๊ด€๊ณ„๋Š” ์•ž์˜ ๋กœ๋“œ์™€ ๊ด€๊ณ„๋˜์–ด์•ผ
  667. ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์กฐ๊ฑด ๊ด€๊ณ„๋ฅผ ์ตœ์ ํ™”๋กœ ์—†์•จ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ˆœ์„œ๋„
  668. ์ตœ์ ํ™”๋กœ ์—†์• ๋ฒ„๋ ธ์„ ๊ฒ๋‹ˆ๋‹ค. READ_ONCE() ์™€ WRITE_ONCE() ์˜ ์ฃผ์˜ ๊นŠ์€
  669. ์‚ฌ์šฉ์€ ์ฃผ์–ด์ง„ ์กฐ๊ฑด ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  670. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ์œ„ํ•ด์„  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์กฐ๊ฑด๊ด€๊ณ„๋ฅผ ์—†์• ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ๋ง‰์•„์•ผ
  671. ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์˜ ๊นŠ์€ READ_ONCE() ๋‚˜ atomic{,64}_read() ์˜ ์‚ฌ์šฉ์ด ์ปจํŠธ๋กค
  672. ์˜์กด์„ฑ์ด ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ฒŒ ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ
  673. ์œ„ํ•ด์„  "์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด" ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  674. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ๊ฐ–๋Š” if ๋ฌธ์˜ then ์ ˆ๊ณผ else ์ ˆ๊ณผ ์ด ๋‘ ์ ˆ
  675. ๋‚ด์—์„œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋“ค์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ์ปจํŠธ๋กค ์˜์กด์„ฑ์„
  676. ๊ฐ–๋Š” if ๋ฌธ์„ ๋’ค๋”ฐ๋ฅด๋Š” ์ฝ”๋“œ์—๋Š” ์ ์šฉ๋˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-.
  677. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ ๋ณดํ†ต ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ ์ง์„ ๋งž์ถฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  678. (*) ์ปจํŠธ๋กค ์˜์กด์„ฑ์€ multicopy ์›์ž์„ฑ์„ ์ œ๊ณตํ•˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-. ๋ชจ๋“  CPU ๋“ค์ด
  679. ํŠน์ • ์Šคํ† ์–ด๋ฅผ ๋™์‹œ์— ๋ณด๊ธธ ์›ํ•œ๋‹ค๋ฉด, smp_mb() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  680. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปจํŠธ๋กค ์˜์กด์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€
  681. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฌ์ง€ ์•Š๋„๋ก ํ•˜๋Š”๊ฑด ์—ฌ๋Ÿฌ๋ถ„์ด ํ•ด์•ผ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.
  682. SMP ๋ฐฐ๋ฆฌ์–ด ์ง๋งž์ถ”๊ธฐ
  683. --------------------
  684. CPU ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹ค๋ฃฐ ๋•Œ์— ์ผ๋ถ€ ํƒ€์ž…์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ํ•ญ์ƒ ์ง์„ ๋งž์ถฐ
  685. ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•˜๊ฒŒ ์ง์„ ๋งž์ถ”์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ์‚ฌ์‹ค์ƒ ์—๋Ÿฌ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.
  686. ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋ผ๋ฆฌ๋„ ์ง์„ ๋งž์ถ”์ง€๋งŒ multicopy ์›์ž์„ฑ์ด ์—†๋Š”
  687. ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ๋„ ์ง์„ ๋งž์ถฅ๋‹ˆ๋‹ค. ACQUIRE ๋ฐฐ๋ฆฌ์–ด๋Š” RELEASE
  688. ๋ฐฐ๋ฆฌ์–ด์™€ ์ง์„ ๋งž์ถฅ๋‹ˆ๋‹ค๋งŒ, ๋‘˜ ๋‹ค ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ํฌํ•จํ•ด ๋‹ค๋ฅธ ๋ฐฐ๋ฆฌ์–ด๋“ค๊ณผ๋„ ์ง์„
  689. ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ์ปจํŠธ๋กค ์˜์กด์„ฑ, ACQUIRE
  690. ๋ฐฐ๋ฆฌ์–ด, RELEASE ๋ฐฐ๋ฆฌ์–ด, ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด, ๋˜๋Š” ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด์™€ ์ง์„ ๋งž์ถฅ๋‹ˆ๋‹ค.
  691. ๋น„์Šทํ•˜๊ฒŒ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ์ปจํŠธ๋กค ์˜์กด์„ฑ, ๋˜๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜
  692. ACQUIRE ๋ฐฐ๋ฆฌ์–ด, RELEASE ๋ฐฐ๋ฆฌ์–ด, ๋˜๋Š” ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด์™€ ์ง์„ ๋งž์ถ”๋Š”๋ฐ, ๋‹ค์Œ๊ณผ
  693. ๊ฐ™์Šต๋‹ˆ๋‹ค:
  694. CPU 1 CPU 2
  695. =============== ===============
  696. WRITE_ONCE(a, 1);
  697. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  698. WRITE_ONCE(b, 2); x = READ_ONCE(b);
  699. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  700. y = READ_ONCE(a);
  701. ๋˜๋Š”:
  702. CPU 1 CPU 2
  703. =============== ===============================
  704. a = 1;
  705. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  706. WRITE_ONCE(b, &a); x = READ_ONCE(b);
  707. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด>
  708. y = *x;
  709. ๋˜๋Š”:
  710. CPU 1 CPU 2
  711. =============== ===============================
  712. r1 = READ_ONCE(y);
  713. <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด>
  714. WRITE_ONCE(x, 1); if (r2 = READ_ONCE(x)) {
  715. <๋ฌต์‹œ์  ์ปจํŠธ๋กค ์˜์กด์„ฑ>
  716. WRITE_ONCE(y, 1);
  717. }
  718. assert(r1 == 0 || r2 == 0);
  719. ๊ธฐ๋ณธ์ ์œผ๋กœ, ์—ฌ๊ธฐ์„œ์˜ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” "๋” ์™„ํ™”๋œ" ํƒ€์ž…์ผ ์ˆœ ์žˆ์–ด๋„ ํ•ญ์ƒ ์กด์žฌํ•ด์•ผ
  720. ํ•ฉ๋‹ˆ๋‹ค.
  721. [!] ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ๋ฐ์ดํ„ฐ
  722. ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๊ณผ ๋งค์น˜๋  ๊ฒƒ์ด๊ณ , ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค:
  723. CPU 1 CPU 2
  724. =================== ===================
  725. WRITE_ONCE(a, 1); }---- --->{ v = READ_ONCE(c);
  726. WRITE_ONCE(b, 2); } \ / { w = READ_ONCE(d);
  727. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด> \ <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  728. WRITE_ONCE(c, 3); } / \ { x = READ_ONCE(a);
  729. WRITE_ONCE(d, 4); }---- --->{ y = READ_ONCE(b);
  730. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์‹œํ€€์Šค์˜ ์˜ˆ
  731. -------------------------
  732. ์ฒซ์งธ, ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  733. ์•„๋ž˜์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ๋ณด์„ธ์š”:
  734. CPU 1
  735. =======================
  736. STORE A = 1
  737. STORE B = 2
  738. STORE C = 3
  739. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  740. STORE D = 4
  741. STORE E = 5
  742. ์ด ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ผ๊ด€์„ฑ ์‹œ์Šคํ…œ์— ์›์†Œ๋ผ๋ฆฌ์˜ ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ง‘ํ•ฉ
  743. { STORE A, STORE B, STORE C } ๊ฐ€ ์—ญ์‹œ ์›์†Œ๋ผ๋ฆฌ์˜ ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ง‘ํ•ฉ
  744. { STORE D, STORE E } ๋ณด๋‹ค ๋จผ์ € ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ๋“ค์— ๋ณด์ด๋„๋ก
  745. ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค:
  746. +-------+ : :
  747. | | +------+
  748. | |------>| C=3 | } /\
  749. | | : +------+ }----- \ -----> ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ์—
  750. | | : | A=1 | } \/ ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ๋“ค
  751. | | : +------+ }
  752. | CPU 1 | : | B=2 | }
  753. | | +------+ }
  754. | | wwwwwwwwwwwwwwww } <--- ์—ฌ๊ธฐ์„œ ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐฐ๋ฆฌ์–ด ์•ž์˜
  755. | | +------+ } ๋ชจ๋“  ์Šคํ† ์–ด๊ฐ€ ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ์Šคํ† ์–ด
  756. | | : | E=5 | } ์ „์— ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ „๋‹ฌ๋˜๋„๋ก
  757. | | : +------+ } ํ•ฉ๋‹ˆ๋‹ค
  758. | |------>| D=4 | }
  759. | | +------+
  760. +-------+ : :
  761. |
  762. | CPU 1 ์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์ „๋‹ฌ๋˜๋Š”
  763. | ์ผ๋ จ์˜ ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค
  764. V
  765. ๋‘˜์งธ, ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์  ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ๋ถ€๋ถ„์  ์ˆœ์„œ
  766. ์„ธ์šฐ๊ธฐ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋“ค์„ ๋ณด์„ธ์š”:
  767. CPU 1 CPU 2
  768. ======================= =======================
  769. { B = 7; X = 9; Y = 8; C = &Y }
  770. STORE A = 1
  771. STORE B = 2
  772. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  773. STORE C = &B LOAD X
  774. STORE D = 4 LOAD C (gets &B)
  775. LOAD *C (reads B)
  776. ์—ฌ๊ธฐ์— ๋ณ„๋‹ค๋ฅธ ๊ฐœ์ž…์ด ์—†๋‹ค๋ฉด, CPU 1 ์˜ ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  CPU 2 ๋Š” CPU 1
  777. ์˜ ์ด๋ฒคํŠธ๋“ค์„ ์™„์ „ํžˆ ๋ฌด์ž‘์œ„์  ์ˆœ์„œ๋กœ ์ธ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:
  778. +-------+ : : : :
  779. | | +------+ +-------+ | CPU 2 ์— ์ธ์ง€๋˜๋Š”
  780. | |------>| B=2 |----- --->| Y->8 | | ์—…๋ฐ์ดํŠธ ์ด๋ฒคํŠธ
  781. | | : +------+ \ +-------+ | ์‹œํ€€์Šค
  782. | CPU 1 | : | A=1 | \ --->| C->&Y | V
  783. | | +------+ | +-------+
  784. | | wwwwwwwwwwwwwwww | : :
  785. | | +------+ | : :
  786. | | : | C=&B |--- | : : +-------+
  787. | | : +------+ \ | +-------+ | |
  788. | |------>| D=4 | ----------->| C->&B |------>| |
  789. | | +------+ | +-------+ | |
  790. +-------+ : : | : : | |
  791. | : : | |
  792. | : : | CPU 2 |
  793. | +-------+ | |
  794. ๋ถ„๋ช…ํžˆ ์ž˜๋ชป๋œ ---> | | B->7 |------>| |
  795. B ์˜ ๊ฐ’ ์ธ์ง€ (!) | +-------+ | |
  796. | : : | |
  797. | +-------+ | |
  798. X ์˜ ๋กœ๋“œ๊ฐ€ B ์˜ ---> \ | X->9 |------>| |
  799. ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ \ +-------+ | |
  800. ์ง€์—ฐ์‹œํ‚ด ----->| B->2 | +-------+
  801. +-------+
  802. : :
  803. ์•ž์˜ ์˜ˆ์—์„œ, CPU 2 ๋Š” (B ์˜ ๊ฐ’์ด ๋ ) *C ์˜ ๊ฐ’ ์ฝ๊ธฐ๊ฐ€ C ์˜ LOAD ๋’ค์— ์ด์–ด์ง์—๋„
  804. B ๊ฐ€ 7 ์ด๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
  805. ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ C ์˜ ๋กœ๋“œ์™€ *C (์ฆ‰, B) ์˜ ๋กœ๋“œ ์‚ฌ์ด์—
  806. ์žˆ์—ˆ๋‹ค๋ฉด:
  807. CPU 1 CPU 2
  808. ======================= =======================
  809. { B = 7; X = 9; Y = 8; C = &Y }
  810. STORE A = 1
  811. STORE B = 2
  812. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  813. STORE C = &B LOAD X
  814. STORE D = 4 LOAD C (gets &B)
  815. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด>
  816. LOAD *C (reads B)
  817. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค:
  818. +-------+ : : : :
  819. | | +------+ +-------+
  820. | |------>| B=2 |----- --->| Y->8 |
  821. | | : +------+ \ +-------+
  822. | CPU 1 | : | A=1 | \ --->| C->&Y |
  823. | | +------+ | +-------+
  824. | | wwwwwwwwwwwwwwww | : :
  825. | | +------+ | : :
  826. | | : | C=&B |--- | : : +-------+
  827. | | : +------+ \ | +-------+ | |
  828. | |------>| D=4 | ----------->| C->&B |------>| |
  829. | | +------+ | +-------+ | |
  830. +-------+ : : | : : | |
  831. | : : | |
  832. | : : | CPU 2 |
  833. | +-------+ | |
  834. | | X->9 |------>| |
  835. | +-------+ | |
  836. C ๋กœ์˜ ์Šคํ† ์–ด ์•ž์˜ ---> \ ddddddddddddddddd | |
  837. ๋ชจ๋“  ์ด๋ฒคํŠธ ๊ฒฐ๊ณผ๊ฐ€ \ +-------+ | |
  838. ๋’ค์˜ ๋กœ๋“œ์—๊ฒŒ ----->| B->2 |------>| |
  839. ๋ณด์ด๊ฒŒ ๊ฐ•์ œํ•œ๋‹ค +-------+ | |
  840. : : +-------+
  841. ์…‹์งธ, ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์—์˜ ๋ถ€๋ถ„์  ์ˆœ์„œ ์„ธ์šฐ๊ธฐ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  842. ์•„๋ž˜์˜ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ด…์‹œ๋‹ค:
  843. CPU 1 CPU 2
  844. ======================= =======================
  845. { A = 0, B = 9 }
  846. STORE A=1
  847. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  848. STORE B=2
  849. LOAD B
  850. LOAD A
  851. CPU 1 ์€ ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ณค์ง€๋งŒ, ๋ณ„๋‹ค๋ฅธ ๊ฐœ์ž…์ด ์—†๋‹ค๋ฉด CPU 2 ๋Š” CPU 1 ์—์„œ ํ–‰ํ•ด์ง„
  852. ์ด๋ฒคํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฌด์ž‘์œ„์  ์ˆœ์„œ๋กœ ์ธ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  853. +-------+ : : : :
  854. | | +------+ +-------+
  855. | |------>| A=1 |------ --->| A->0 |
  856. | | +------+ \ +-------+
  857. | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 |
  858. | | +------+ | +-------+
  859. | |------>| B=2 |--- | : :
  860. | | +------+ \ | : : +-------+
  861. +-------+ : : \ | +-------+ | |
  862. ---------->| B->2 |------>| |
  863. | +-------+ | CPU 2 |
  864. | | A->0 |------>| |
  865. | +-------+ | |
  866. | : : +-------+
  867. \ : :
  868. \ +-------+
  869. ---->| A->1 |
  870. +-------+
  871. : :
  872. ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ B ์˜ ๋กœ๋“œ์™€ A ์˜ ๋กœ๋“œ ์‚ฌ์ด์— ์กด์žฌํ•œ๋‹ค๋ฉด:
  873. CPU 1 CPU 2
  874. ======================= =======================
  875. { A = 0, B = 9 }
  876. STORE A=1
  877. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  878. STORE B=2
  879. LOAD B
  880. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  881. LOAD A
  882. CPU 1 ์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ถ€๋ถ„์  ์ˆœ์„œ๊ฐ€ CPU 2 ์—๋„ ๊ทธ๋Œ€๋กœ ์ธ์ง€๋ฉ๋‹ˆ๋‹ค:
  883. +-------+ : : : :
  884. | | +------+ +-------+
  885. | |------>| A=1 |------ --->| A->0 |
  886. | | +------+ \ +-------+
  887. | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 |
  888. | | +------+ | +-------+
  889. | |------>| B=2 |--- | : :
  890. | | +------+ \ | : : +-------+
  891. +-------+ : : \ | +-------+ | |
  892. ---------->| B->2 |------>| |
  893. | +-------+ | CPU 2 |
  894. | : : | |
  895. | : : | |
  896. ์—ฌ๊ธฐ์„œ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ----> \ rrrrrrrrrrrrrrrrr | |
  897. B ๋กœ์˜ ์Šคํ† ์–ด ์ „์˜ \ +-------+ | |
  898. ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ CPU 2 ์— ---->| A->1 |------>| |
  899. ๋ณด์ด๋„๋ก ํ•œ๋‹ค +-------+ | |
  900. : : +-------+
  901. ๋” ์™„๋ฒฝํ•œ ์„ค๋ช…์„ ์œ„ํ•ด, A ์˜ ๋กœ๋“œ๊ฐ€ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด ์•ž๊ณผ ๋’ค์— ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ์ง€
  902. ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  903. CPU 1 CPU 2
  904. ======================= =======================
  905. { A = 0, B = 9 }
  906. STORE A=1
  907. <์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  908. STORE B=2
  909. LOAD B
  910. LOAD A [first load of A]
  911. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  912. LOAD A [second load of A]
  913. A ์˜ ๋กœ๋“œ ๋‘๊ฐœ๊ฐ€ ๋ชจ๋‘ B ์˜ ๋กœ๋“œ ๋’ค์— ์žˆ์ง€๋งŒ, ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ์–ป์–ด์˜ฌ ์ˆ˜
  914. ์žˆ์Šต๋‹ˆ๋‹ค:
  915. +-------+ : : : :
  916. | | +------+ +-------+
  917. | |------>| A=1 |------ --->| A->0 |
  918. | | +------+ \ +-------+
  919. | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 |
  920. | | +------+ | +-------+
  921. | |------>| B=2 |--- | : :
  922. | | +------+ \ | : : +-------+
  923. +-------+ : : \ | +-------+ | |
  924. ---------->| B->2 |------>| |
  925. | +-------+ | CPU 2 |
  926. | : : | |
  927. | : : | |
  928. | +-------+ | |
  929. | | A->0 |------>| 1st |
  930. | +-------+ | |
  931. ์—ฌ๊ธฐ์„œ ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ----> \ rrrrrrrrrrrrrrrrr | |
  932. B ๋กœ์˜ ์Šคํ† ์–ด ์ „์˜ \ +-------+ | |
  933. ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ CPU 2 ์— ---->| A->1 |------>| 2nd |
  934. ๋ณด์ด๋„๋ก ํ•œ๋‹ค +-------+ | |
  935. : : +-------+
  936. ํ•˜์ง€๋งŒ CPU 1 ์—์„œ์˜ A ์—…๋ฐ์ดํŠธ๋Š” ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์—๋„ ๋ณด์ผ ์ˆ˜๋„
  937. ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค:
  938. +-------+ : : : :
  939. | | +------+ +-------+
  940. | |------>| A=1 |------ --->| A->0 |
  941. | | +------+ \ +-------+
  942. | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 |
  943. | | +------+ | +-------+
  944. | |------>| B=2 |--- | : :
  945. | | +------+ \ | : : +-------+
  946. +-------+ : : \ | +-------+ | |
  947. ---------->| B->2 |------>| |
  948. | +-------+ | CPU 2 |
  949. | : : | |
  950. \ : : | |
  951. \ +-------+ | |
  952. ---->| A->1 |------>| 1st |
  953. +-------+ | |
  954. rrrrrrrrrrrrrrrrr | |
  955. +-------+ | |
  956. | A->1 |------>| 2nd |
  957. +-------+ | |
  958. : : +-------+
  959. ์—ฌ๊ธฐ์„œ ๋ณด์žฅ๋˜๋Š” ๊ฑด, ๋งŒ์•ฝ B ์˜ ๋กœ๋“œ๊ฐ€ B == 2 ๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ดค๋‹ค๋ฉด, A ์—์˜ ๋‘๋ฒˆ์งธ
  960. ๋กœ๋“œ๋Š” ํ•ญ์ƒ A == 1 ์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒ๋‹ˆ๋‹ค. A ์—์˜ ์ฒซ๋ฒˆ์งธ ๋กœ๋“œ์—๋Š” ๊ทธ๋Ÿฐ
  961. ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค; A == 0 ์ด๊ฑฐ๋‚˜ A == 1 ์ด๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ฒŒ ๋ ๊ฒ๋‹ˆ๋‹ค.
  962. ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด VS ๋กœ๋“œ ์˜ˆ์ธก
  963. -------------------------------
  964. ๋งŽ์€ CPU๋“ค์ด ๋กœ๋“œ๋ฅผ ์˜ˆ์ธก์ ์œผ๋กœ (speculatively) ํ•ฉ๋‹ˆ๋‹ค: ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ
  965. ๋กœ๋“œํ•ด์•ผ ํ•˜๊ฒŒ ๋ ์ง€ ์˜ˆ์ธก์„ ํ–ˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์‹ค์ œ๋กœ๋Š”
  966. ์•„์ง ๋งŒ๋‚˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋กœ๋“œ ์ž‘์—…์ด ์—†์–ด ๋ฒ„์Šค (bus) ๊ฐ€ ์•„๋ฌด ์ผ๋„ ํ•˜๊ณ  ์žˆ์ง€
  967. ์•Š๋‹ค๋ฉด, ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„์— ์‹ค์ œ ๋กœ๋“œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ์‹คํ–‰๋˜๋ฉด CPU ๊ฐ€
  968. ์ด๋ฏธ ๊ทธ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋กœ๋“œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ์ฆ‰์‹œ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  969. ํ•ด๋‹น CPU ๋Š” ์‹ค์ œ๋กœ๋Š” ๊ทธ ๊ฐ’์ด ํ•„์š”์น˜ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋‚˜์ค‘์— ๋“œ๋Ÿฌ๋‚  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ -
  970. ํ•ด๋‹น ๋กœ๋“œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ๋ธŒ๋žœ์น˜๋กœ ์šฐํšŒ๋˜๊ฑฐ๋‚˜ ํ–ˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ฃ  - , ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์•ž์„œ
  971. ์ฝ์–ด๋‘” ๊ฐ’์„ ๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ๋‚˜์ค‘์˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์บ์‹œ์— ๋„ฃ์–ด๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  972. ๋‹ค์Œ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  973. CPU 1 CPU 2
  974. ======================= =======================
  975. LOAD B
  976. DIVIDE } ๋‚˜๋ˆ„๊ธฐ ๋ช…๋ น์€ ์ผ๋ฐ˜์ ์œผ๋กœ
  977. DIVIDE } ๊ธด ์‹œ๊ฐ„์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค
  978. LOAD A
  979. ๋Š” ์ด๋ ‡๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  980. : : +-------+
  981. +-------+ | |
  982. --->| B->2 |------>| |
  983. +-------+ | CPU 2 |
  984. : :DIVIDE | |
  985. +-------+ | |
  986. ๋‚˜๋ˆ„๊ธฐ ํ•˜๋Š๋ผ ๋ฐ”์œ ---> --->| A->0 |~~~~ | |
  987. CPU ๋Š” A ์˜ LOAD ๋ฅผ +-------+ ~ | |
  988. ์˜ˆ์ธกํ•ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค : : ~ | |
  989. : :DIVIDE | |
  990. : : ~ | |
  991. ๋‚˜๋ˆ„๊ธฐ๊ฐ€ ๋๋‚˜๋ฉด ---> ---> : : ~-->| |
  992. CPU ๋Š” ํ•ด๋‹น LOAD ๋ฅผ : : | |
  993. ์ฆ‰๊ฐ ์™„๋ฃŒํ•œ๋‹ค : : +-------+
  994. ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‘๋ฒˆ์งธ ๋กœ๋“œ ์ง์ „์— ๋†“๋Š”๋‹ค๋ฉด:
  995. CPU 1 CPU 2
  996. ======================= =======================
  997. LOAD B
  998. DIVIDE
  999. DIVIDE
  1000. <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  1001. LOAD A
  1002. ์˜ˆ์ธก์œผ๋กœ ์–ป์–ด์ง„ ๊ฐ’์€ ์‚ฌ์šฉ๋œ ๋ฐฐ๋ฆฌ์–ด์˜ ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ฐ’์ด ์˜ณ์€์ง€ ๊ฒ€ํ† ๋˜๊ฒŒ
  1003. ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ณ€ํ™”๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด, ์˜ˆ์ธก์œผ๋กœ ์–ป์–ด๋‘์—ˆ๋˜ ๊ฐ’์ด
  1004. ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค:
  1005. : : +-------+
  1006. +-------+ | |
  1007. --->| B->2 |------>| |
  1008. +-------+ | CPU 2 |
  1009. : :DIVIDE | |
  1010. +-------+ | |
  1011. ๋‚˜๋ˆ„๊ธฐ ํ•˜๋Š๋ผ ๋ฐ”์œ ---> --->| A->0 |~~~~ | |
  1012. CPU ๋Š” A ์˜ LOAD ๋ฅผ +-------+ ~ | |
  1013. ์˜ˆ์ธกํ•œ๋‹ค : : ~ | |
  1014. : :DIVIDE | |
  1015. : : ~ | |
  1016. : : ~ | |
  1017. rrrrrrrrrrrrrrrr~ | |
  1018. : : ~ | |
  1019. : : ~-->| |
  1020. : : | |
  1021. : : +-------+
  1022. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ CPU ์—์„œ ์—…๋ฐ์ดํŠธ๋‚˜ ๋ฌดํšจํ™”๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด, ๊ทธ ์˜ˆ์ธก์€ ๋ฌดํšจํ™”๋˜๊ณ  ๊ทธ ๊ฐ’์€
  1023. ๋‹ค์‹œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค:
  1024. : : +-------+
  1025. +-------+ | |
  1026. --->| B->2 |------>| |
  1027. +-------+ | CPU 2 |
  1028. : :DIVIDE | |
  1029. +-------+ | |
  1030. ๋‚˜๋ˆ„๊ธฐ ํ•˜๋Š๋ผ ๋ฐ”์œ ---> --->| A->0 |~~~~ | |
  1031. CPU ๋Š” A ์˜ LOAD ๋ฅผ +-------+ ~ | |
  1032. ์˜ˆ์ธกํ•œ๋‹ค : : ~ | |
  1033. : :DIVIDE | |
  1034. : : ~ | |
  1035. : : ~ | |
  1036. rrrrrrrrrrrrrrrrr | |
  1037. +-------+ | |
  1038. ์˜ˆ์ธก์„ฑ ๋™์ž‘์€ ๋ฌดํšจํ™” ๋˜๊ณ  ---> --->| A->1 |------>| |
  1039. ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’์ด ๋‹ค์‹œ ์ฝํ˜€์ง„๋‹ค +-------+ | |
  1040. : : +-------+
  1041. MULTICOPY ์›์ž์„ฑ
  1042. ----------------
  1043. Multicopy ์›์ž์„ฑ์€ ์‹ค์ œ์˜ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์—์„œ ํ•ญ์ƒ ์ œ๊ณต๋˜์ง€๋Š” ์•Š๋Š”, ์ˆœ์„œ ๋งž์ถ”๊ธฐ์—
  1044. ๋Œ€ํ•œ ์ƒ๋‹นํžˆ ์ง๊ด€์ ์ธ ๊ฐœ๋…์œผ๋กœ, ํŠน์ • ์Šคํ† ์–ด๊ฐ€ ๋ชจ๋“  CPU ๋“ค์—๊ฒŒ ๋™์‹œ์— ๋ณด์—ฌ์ง€๊ฒŒ
  1045. ๋จ์„, ๋‹ฌ๋ฆฌ ๋งํ•˜์ž๋ฉด ๋ชจ๋“  CPU ๋“ค์ด ๋ชจ๋“  ์Šคํ† ์–ด๋“ค์ด ๋ณด์—ฌ์ง€๋Š” ์ˆœ์„œ๋ฅผ ๋™์˜ํ•˜๊ฒŒ ๋˜๋Š”
  1046. ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์™„์ „ํ•œ multicopy ์›์ž์„ฑ์˜ ์‚ฌ์šฉ์€ ๊ฐ€์น˜์žˆ๋Š” ํ•˜๋“œ์›จ์–ด
  1047. ์ตœ์ ํ™”๋“ค์„ ๋ฌด๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ์–ด์„œ, ๋ณด๋‹ค ์™„ํ™”๋œ ํ˜•ํƒœ์˜ ``๋‹ค๋ฅธ multicopy
  1048. ์›์ž์„ฑ'' ๋ผ๋Š” ์ด๋ฆ„์˜, ํŠน์ • ์Šคํ† ์–ด๊ฐ€ ๋ชจ๋“  -๋‹ค๋ฅธ- CPU ๋“ค์—๊ฒŒ๋Š” ๋™์‹œ์— ๋ณด์—ฌ์ง€๊ฒŒ
  1049. ํ•˜๋Š” ๋ณด์žฅ์„ ๋Œ€์‹  ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์˜ ๋’ท๋ถ€๋ถ„๋“ค์€ ์ด ์™„ํ™”๋œ ํ˜•ํƒœ์— ๋Œ€ํ•ด ๋…ผํ•˜๊ฒŒ
  1050. ๋ฉ๋‹ˆ๋‹ค๋งŒ, ๋‹จ์ˆœํžˆ ``multicopy ์›์ž์„ฑ'' ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
  1051. ๋‹ค์Œ์˜ ์˜ˆ๊ฐ€ multicopy ์›์ž์„ฑ์„ ๋ณด์ž…๋‹ˆ๋‹ค:
  1052. CPU 1 CPU 2 CPU 3
  1053. ======================= ======================= =======================
  1054. { X = 0, Y = 0 }
  1055. STORE X=1 r1=LOAD X (reads 1) LOAD Y (reads 1)
  1056. <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด> <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  1057. STORE Y=r1 LOAD X
  1058. CPU 2 ์˜ Y ๋กœ์˜ ์Šคํ† ์–ด์— ์‚ฌ์šฉ๋˜๋Š” X ๋กœ๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ€ 1 ์ด์—ˆ๊ณ  CPU 3 ์˜ Y ๋กœ๋“œ๊ฐ€
  1059. 1์„ ๋ฆฌํ„ดํ–ˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ์ด๋Š” CPU 1 ์˜ X ๋กœ์˜ ์Šคํ† ์–ด๊ฐ€ CPU 2 ์˜ X ๋กœ๋ถ€ํ„ฐ์˜
  1060. ๋กœ๋“œ๋ฅผ ์•ž์„œ๊ณ  CPU 2 ์˜ Y ๋กœ์˜ ์Šคํ† ์–ด๊ฐ€ CPU 3 ์˜ Y ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๋ฅผ ์•ž์„ฌ์„
  1061. ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์—ฌ๊ธฐ์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ CPU 2 ๊ฐ€ ์ž์‹ ์˜ ๋กœ๋“œ๋ฅผ ์ž์‹ ์˜
  1062. ์Šคํ† ์–ด ์ „์— ์ˆ˜ํ–‰ํ•˜๊ณ , CPU 3 ๊ฐ€ Y ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๋ฅผ X ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ ์ „์— ์ˆ˜ํ–‰ํ•จ์„
  1063. ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ "CPU 3 ์˜ X ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๋Š” 0 ์„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?"
  1064. CPU 3 ์˜ X ๋กœ๋“œ๊ฐ€ CPU 2 ์˜ ๋กœ๋“œ๋ณด๋‹ค ๋’ค์— ์ด๋ฃจ์–ด์กŒ์œผ๋ฏ€๋กœ, CPU 3 ์˜ X ๋กœ๋ถ€ํ„ฐ์˜
  1065. ๋กœ๋“œ๋Š” 1 ์„ ๋ฆฌํ„ดํ•œ๋‹ค๊ณ  ์˜ˆ์ƒํ•˜๋Š”๊ฒŒ ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์˜ˆ์ƒ์€ multicopy
  1066. ์›์ž์„ฑ์œผ๋กœ๋ถ€ํ„ฐ ๋‚˜์˜ต๋‹ˆ๋‹ค: CPU B ์—์„œ ์ˆ˜ํ–‰๋œ ๋กœ๋“œ๊ฐ€ CPU A ์˜ ๊ฐ™์€ ๋ณ€์ˆ˜๋กœ๋ถ€ํ„ฐ์˜
  1067. ๋กœ๋“œ๋ฅผ ๋’ค๋”ฐ๋ฅธ๋‹ค๋ฉด (๊ทธ๋ฆฌ๊ณ  CPU A ๊ฐ€ ์ž์‹ ์ด ์ฝ์€ ๊ฐ’์œผ๋กœ ๋จผ์ € ํ•ด๋‹น ๋ณ€์ˆ˜์— ์Šคํ† ์–ด
  1068. ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด) multicopy ์›์ž์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ๋Š”, CPU B ์˜ ๋กœ๋“œ๊ฐ€ CPU A
  1069. ์˜ ๋กœ๋“œ์™€ ๊ฐ™์€ ๊ฐ’ ๋˜๋Š” ๊ทธ ๋‚˜์ค‘ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€
  1070. ์‹œ์Šคํ…œ๋“ค์ด multicopy ์›์ž์„ฑ์„ ์ œ๊ณตํ•  ๊ฒƒ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1071. ์•ž์˜ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด์˜ ์‚ฌ์šฉ์€ ๋ชจ๋“  multicopy ์›์ž์„ฑ์˜ ๋ถ€์กฑ์„ ๋ณด์ƒํ•ด์ค๋‹ˆ๋‹ค.
  1072. ์•ž์˜ ์˜ˆ์—์„œ, CPU 2 ์˜ X ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๊ฐ€ 1 ์„ ๋ฆฌํ„ดํ–ˆ๊ณ  CPU 3 ์˜ Y ๋กœ๋ถ€ํ„ฐ์˜
  1073. ๋กœ๋“œ๊ฐ€ 1 ์„ ๋ฆฌํ„ดํ–ˆ๋‹ค๋ฉด, CPU 3 ์˜ X ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๋Š” 1์„ ๋ฆฌํ„ดํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  1074. ํ•˜์ง€๋งŒ, ์˜์กด์„ฑ, ์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด, ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋Š” ํ•ญ์ƒ non-multicopy ์›์ž์„ฑ์„ ๋ณด์ƒํ•ด
  1075. ์ฃผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, CPU 2 ์˜ ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์•ž์˜ ์˜ˆ์—์„œ ์‚ฌ๋ผ์ ธ์„œ
  1076. ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ๋งŒ ๋‚จ๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค:
  1077. CPU 1 CPU 2 CPU 3
  1078. ======================= ======================= =======================
  1079. { X = 0, Y = 0 }
  1080. STORE X=1 r1=LOAD X (reads 1) LOAD Y (reads 1)
  1081. <๋ฐ์ดํ„ฐ ์˜์กด์„ฑ> <์ฝ๊ธฐ ๋ฐฐ๋ฆฌ์–ด>
  1082. STORE Y=r1 LOAD X (reads 0)
  1083. ์ด ๋ณ€ํ™”๋Š” non-multicopy ์›์ž์„ฑ์ด ๋งŒ์—ฐํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค: ์ด ์˜ˆ์—์„œ, CPU 2 ์˜ X
  1084. ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๊ฐ€ 1์„ ๋ฆฌํ„ดํ•˜๊ณ , CPU 3 ์˜ Y ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๊ฐ€ 1 ์„ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ, CPU 3
  1085. ์˜ X ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๊ฐ€ 0 ์„ ๋ฆฌํ„ดํ•˜๋Š”๊ฒŒ ์™„์ „ํžˆ ํ•ฉ๋ฒ•์ ์ž…๋‹ˆ๋‹ค.
  1086. ํ•ต์‹ฌ์€, CPU 2 ์˜ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ์ž์‹ ์˜ ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋ฅผ ์ˆœ์„œ์ง“์ง€๋งŒ, CPU 1 ์˜
  1087. ์Šคํ† ์–ด์— ๋Œ€ํ•œ ์ˆœ์„œ๋Š” ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด ์˜ˆ์ œ๊ฐ€ CPU 1 ๊ณผ
  1088. CPU 2 ๊ฐ€ ์Šคํ† ์–ด ๋ฒ„ํผ๋‚˜ ํ•œ ์ˆ˜์ค€์˜ ์บ์‹œ๋ฅผ ๊ณต์œ ํ•˜๋Š”, multicopy ์›์ž์„ฑ์„ ์ œ๊ณตํ•˜์ง€
  1089. ์•Š๋Š” ์‹œ์Šคํ…œ์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด CPU 2 ๋Š” CPU 1 ์˜ ์“ฐ๊ธฐ์— ์ด๋ฅธ ์ ‘๊ทผ์„ ํ•  ์ˆ˜๋„
  1090. ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ชจ๋“  CPU ๋“ค์ด ์—ฌ๋Ÿฌ ์ ‘๊ทผ๋“ค์˜ ์กฐํ•ฉ๋œ ์ˆœ์„œ์— ๋Œ€ํ•ด์„œ ๋™์˜ํ•˜๊ฒŒ
  1091. ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  1092. ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋Š” non-multicopy ์›์ž์„ฑ๋งŒ ๋ณด์ƒํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, -๋ชจ๋“ - CPU ๋“ค์ด
  1093. -๋ชจ๋“ - ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ธ์‹ํ•˜๊ฒŒ ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ์ˆœ์„œ ๋ณด์žฅ์„
  1094. ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ, release-acquire ์ง์˜ ์—ฐ๊ฒฐ์€ ์ด๋Ÿฐ ์ถ”๊ฐ€์ ์ธ ์ˆœ์„œ๋Š”
  1095. ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋ฐ, ํ•ด๋‹น ์—ฐ๊ฒฐ์— ๋“ค์–ด์žˆ๋Š” CPU ๋“ค๋งŒ์ด ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์˜ ์กฐํ•ฉ๋œ ์ˆœ์„œ์—
  1096. ๋Œ€ํ•ด ๋™์˜ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์žฅ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์กด๊ฒฝ์Šค๋Ÿฐ Herman Hollerith
  1097. ์˜ ์ฝ”๋“œ๋ฅผ C ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด:
  1098. int u, v, x, y, z;
  1099. void cpu0(void)
  1100. {
  1101. r0 = smp_load_acquire(&x);
  1102. WRITE_ONCE(u, 1);
  1103. smp_store_release(&y, 1);
  1104. }
  1105. void cpu1(void)
  1106. {
  1107. r1 = smp_load_acquire(&y);
  1108. r4 = READ_ONCE(v);
  1109. r5 = READ_ONCE(u);
  1110. smp_store_release(&z, 1);
  1111. }
  1112. void cpu2(void)
  1113. {
  1114. r2 = smp_load_acquire(&z);
  1115. smp_store_release(&x, 1);
  1116. }
  1117. void cpu3(void)
  1118. {
  1119. WRITE_ONCE(v, 1);
  1120. smp_mb();
  1121. r3 = READ_ONCE(u);
  1122. }
  1123. cpu0(), cpu1(), ๊ทธ๋ฆฌ๊ณ  cpu2() ๋Š” smp_store_release()/smp_load_acquire() ์Œ์˜
  1124. ์—ฐ๊ฒฐ์— ์ฐธ์—ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋Š” ๋‚˜์˜ค์ง€ ์•Š์„ ๊ฒ๋‹ˆ๋‹ค:
  1125. r0 == 1 && r1 == 1 && r2 == 1
  1126. ๋” ๋‚˜์•„๊ฐ€์„œ, cpu0() ์™€ cpu1() ์‚ฌ์ด์˜ release-acquire ๊ด€๊ณ„๋กœ ์ธํ•ด, cpu1() ์€
  1127. cpu0() ์˜ ์“ฐ๊ธฐ๋ฅผ ๋ด์•ผ๋งŒ ํ•˜๋ฏ€๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋„ ์—†์„ ๊ฒ๋‹ˆ๋‹ค:
  1128. r1 == 1 && r5 == 0
  1129. ํ•˜์ง€๋งŒ, release-acquire ์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” ์ˆœ์„œ๋Š” ํ•ด๋‹น ์—ฐ๊ฒฐ์— ๋™์ฐธํ•œ CPU ๋“ค์—๋งŒ
  1130. ์ ์šฉ๋˜๋ฏ€๋กœ cpu3() ์—, ์ ์–ด๋„ ์Šคํ† ์–ด๋“ค ์™ธ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ
  1131. ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  1132. r0 == 0 && r1 == 1 && r2 == 1 && r3 == 0 && r4 == 0
  1133. ๋น„์Šทํ•˜๊ฒŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  1134. r0 == 0 && r1 == 1 && r2 == 1 && r3 == 0 && r4 == 0 && r5 == 1
  1135. cpu0(), cpu1(), ๊ทธ๋ฆฌ๊ณ  cpu2() ๋Š” ๊ทธ๋“ค์˜ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ฒŒ ๋˜์ง€๋งŒ,
  1136. release-acquire ์ฒด์ธ์— ๊ด€์—ฌ๋˜์ง€ ์•Š์€ CPU ๋“ค์€ ๊ทธ ์ˆœ์„œ์— ์ด๊ฒฌ์„ ๊ฐ€์งˆ ์ˆ˜
  1137. ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ด๊ฒฌ์€ smp_load_acquire() ์™€ smp_store_release() ์˜ ๊ตฌํ˜„์—
  1138. ์‚ฌ์šฉ๋˜๋Š” ์™„ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์€ ํ•ญ์ƒ ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ์Šคํ† ์–ด๋“ค์„ ๋’ค์˜
  1139. ๋กœ๋“œ๋“ค์— ์•ž์„ธ์šธ ํ•„์š”๋Š” ์—†๋‹ค๋Š” ์‚ฌ์‹ค์—์„œ ๊ธฐ์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ง์€ cpu3() ๋Š” cpu0() ์˜
  1140. u ๋กœ์˜ ์Šคํ† ์–ด๋ฅผ cpu1() ์˜ v ๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ ๋’ค์— ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š”
  1141. ๋œป์ž…๋‹ˆ๋‹ค, cpu0() ์™€ cpu1() ์€ ์ด ๋‘ ์˜คํผ๋ ˆ์ด์…˜์ด ์˜๋„๋œ ์ˆœ์„œ๋Œ€๋กœ ์ผ์–ด๋‚ฌ์Œ์—
  1142. ๋ชจ๋‘ ๋™์˜ํ•˜๋Š”๋ฐ๋„ ๋ง์ž…๋‹ˆ๋‹ค.
  1143. ํ•˜์ง€๋งŒ, smp_load_acquire() ๋Š” ๋งˆ์ˆ ์ด ์•„๋‹˜์„ ๋ช…์‹ฌํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ,
  1144. ์ด ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ ์ˆœ์„œ ๊ทœ์น™์„ ์ง€ํ‚ค๋ฉฐ ์ธ์ž๋กœ๋ถ€ํ„ฐ์˜ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€
  1145. ์–ด๋–ค ํŠน์ •ํ•œ ๊ฐ’์ด ์ฝํž ๊ฒƒ์ธ์ง€๋Š” ๋ณด์žฅํ•˜์ง€ -์•Š์Šต๋‹ˆ๋‹ค-. ๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋„
  1146. ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  1147. r0 == 0 && r1 == 0 && r2 == 0 && r5 == 0
  1148. ์ด๋Ÿฐ ๊ฒฐ๊ณผ๋Š” ์–ด๋–ค ๊ฒƒ๋„ ์žฌ๋ฐฐ์น˜ ๋˜์ง€ ์•Š๋Š”, ์ˆœ์ฐจ์  ์ผ๊ด€์„ฑ์„ ๊ฐ€์ง„ ๊ฐ€์ƒ์˜
  1149. ์‹œ์Šคํ…œ์—์„œ๋„ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ด ๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  1150. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋‹น์‹ ์˜ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“  ์˜คํผ๋ ˆ์ด์…˜๋“ค์˜ ์™„์ „ํ•œ ์ˆœ์„œ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด,
  1151. ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  1152. ==================
  1153. ๋ช…์‹œ์  ์ปค๋„ ๋ฐฐ๋ฆฌ์–ด
  1154. ==================
  1155. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๊ณ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฐ๋ฆฌ์–ด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1156. (*) ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด.
  1157. (*) CPU ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด.
  1158. ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด
  1159. ---------------
  1160. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ๋Š” ๋ช…์‹œ์ ์ธ
  1161. ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1162. barrier();
  1163. ์ด๊ฑด ๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด์ž…๋‹ˆ๋‹ค -- barrier() ์˜ ์ฝ๊ธฐ-์ฝ๊ธฐ ๋‚˜ ์“ฐ๊ธฐ-์“ฐ๊ธฐ ๋ณ€์ข…์€ ์—†์Šต๋‹ˆ๋‹ค.
  1164. ํ•˜์ง€๋งŒ, READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ํŠน์ • ์•ก์„ธ์Šค๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ๋™์ž‘ํ•˜๋Š”
  1165. barrier() ์˜ ์™„ํ™”๋œ ํ˜•ํƒœ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1166. barrier() ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค:
  1167. (*) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ barrier() ๋’ค์˜ ์•ก์„ธ์Šค๋“ค์ด barrier() ์•ž์˜ ์•ก์„ธ์Šค๋ณด๋‹ค ์•ž์œผ๋กœ
  1168. ์žฌ๋ฐฐ์น˜๋˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ ์ฝ”๋“œ์™€ ์ธํ„ฐ๋ŸฝํŠธ ๋‹นํ•œ
  1169. ์ฝ”๋“œ ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ์‹ ์ค‘ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1170. (*) ๋ฃจํ”„์—์„œ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฃจํ”„ ์กฐ๊ฑด์— ์‚ฌ์šฉ๋œ ๋ณ€์ˆ˜๋ฅผ ๋งค ์ดํ„ฐ๋ ˆ์ด์…˜๋งˆ๋‹ค
  1171. ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋กœ๋“œํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ์ตœ์ ํ™” ํ•˜๋Š”๊ฑธ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  1172. READ_ONCE() ์™€ WRITE_ONCE() ํ•จ์ˆ˜๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ๋Š” ๋ฌธ์ œ ์—†์ง€๋งŒ ๋™์‹œ์„ฑ์ด
  1173. ์žˆ๋Š” ์ฝ”๋“œ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ตœ์ ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฅ˜์˜ ์ตœ์ ํ™”์—
  1174. ๋Œ€ํ•œ ์˜ˆ๋ฅผ ๋ช‡๊ฐ€์ง€ ๋“ค์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  1175. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ™์€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋ฅผ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ๊ณ , ์–ด๋–ค
  1176. ๊ฒฝ์šฐ์—๋Š” CPU๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜๋กœ๋ถ€ํ„ฐ์˜ ๋กœ๋“œ๋“ค์„ ์žฌ๋ฐฐ์น˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š”
  1177. ๋‹ค์Œ์˜ ์ฝ”๋“œ๊ฐ€:
  1178. a[0] = x;
  1179. a[1] = x;
  1180. x ์˜ ์˜ˆ์ „ ๊ฐ’์ด a[1] ์—, ์ƒˆ ๊ฐ’์ด a[0] ์— ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  1181. ์ปดํŒŒ์ผ๋Ÿฌ์™€ CPU๊ฐ€ ์ด๋Ÿฐ ์ผ์„ ๋ชปํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  1182. a[0] = READ_ONCE(x);
  1183. a[1] = READ_ONCE(x);
  1184. ์ฆ‰, READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ์—ฌ๋Ÿฌ CPU ์—์„œ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜์— ๊ฐ€ํ•ด์ง€๋Š”
  1185. ์•ก์„ธ์Šค๋“ค์— ์บ์‹œ ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  1186. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ™์€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์—ฐ์†์ ์ธ ๋กœ๋“œ๋“ค์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ
  1187. ๋ณ‘ํ•ฉ ์ž‘์—…์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ:
  1188. while (tmp = a)
  1189. do_something_with(tmp);
  1190. ๋‹ค์Œ๊ณผ ๊ฐ™์ด, ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ๋Š” ๋ง์ด ๋˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž์˜ ์˜๋„์™€ ์ „ํ˜€ ๋งž์ง€
  1191. ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ "์ตœ์ ํ™”" ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1192. if (tmp = a)
  1193. for (;;)
  1194. do_something_with(tmp);
  1195. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋Ÿฐ ์ง“์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด READ_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1196. while (tmp = READ_ONCE(a))
  1197. do_something_with(tmp);
  1198. (*) ์˜ˆ์ปจ๋Œ€ ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์•„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ์— ๋‹ด์„ ์ˆ˜
  1199. ์—†๋Š” ๊ฒฝ์šฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š”
  1200. ์•ž์˜ ์˜ˆ์—์„œ ๋ณ€์ˆ˜ 'tmp' ์‚ฌ์šฉ์„ ์ตœ์ ํ™”๋กœ ์—†์• ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1201. while (tmp = a)
  1202. do_something_with(tmp);
  1203. ์ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์—์„œ๋Š” ์™„๋ฒฝํ•˜์ง€๋งŒ ๋™์‹œ์„ฑ์ด ์กด์žฌํ•˜๋Š”
  1204. ๊ฒฝ์šฐ์—” ์น˜๋ช…์ ์ธ ์ฝ”๋“œ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1205. while (a)
  1206. do_something_with(a);
  1207. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ตœ์ ํ™”๋œ ์ด ์ฝ”๋“œ๋Š” ๋ณ€์ˆ˜ a ๊ฐ€ ๋‹ค๋ฅธ CPU ์— ์˜ํ•ด "while" ๋ฌธ๊ณผ
  1208. do_something_with() ํ˜ธ์ถœ ์‚ฌ์ด์— ๋ฐ”๋€Œ์–ด do_something_with() ์— 0์„ ๋„˜๊ธธ
  1209. ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  1210. ์ด๋ฒˆ์—๋„, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋Ÿฐ ์ง“์„ ํ•˜๋Š”๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•ด READ_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1211. while (tmp = READ_ONCE(a))
  1212. do_something_with(tmp);
  1213. ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋ถ€์กฑํ•œ ์ƒํ™ฉ์„ ๊ฒช๋Š” ๊ฒฝ์šฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” tmp ๋ฅผ ์Šคํƒ์— ์ €์žฅํ•ด๋‘˜ ์ˆ˜๋„
  1214. ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ์ฝ์–ด๋“ค์ด๋Š”๊ฑด ์ด๋ ‡๊ฒŒ ์ €์žฅํ•ด๋‘๊ณ  ํ›„์— ๋‹ค์‹œ
  1215. ์ฝ์–ด๋“ค์ด๋Š”๋ฐ ๋“œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š”๊ฒŒ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ
  1216. ์ฝ”๋“œ์—์„œ๋Š” ์•ˆ์ „ํ•˜๋ฏ€๋กœ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ง์ ‘ ์•Œ๋ ค์ค˜์•ผ
  1217. ํ•ฉ๋‹ˆ๋‹ค.
  1218. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ ๊ฐ’์ด ๋ฌด์—‡์ผ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋กœ๋“œ๋ฅผ ์•„์˜ˆ ์•ˆํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  1219. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ์ฝ”๋“œ๋Š” ๋ณ€์ˆ˜ 'a' ์˜ ๊ฐ’์ด ํ•ญ์ƒ 0์ž„์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด:
  1220. while (tmp = a)
  1221. do_something_with(tmp);
  1222. ์ด๋ ‡๊ฒŒ ์ตœ์ ํ™” ๋˜์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1223. do { } while (0);
  1224. ์ด ๋ณ€ํ™˜์€ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ๋Š” ๋„์›€์ด ๋˜๋Š”๋ฐ ๋กœ๋“œ์™€ ๋ธŒ๋žœ์น˜๋ฅผ ์ œ๊ฑฐํ–ˆ๊ธฐ
  1225. ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 'a' ์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š”๊ฑด ํ˜„์žฌ์˜ CPU ํ•˜๋‚˜
  1226. ๋ฟ์ด๋ผ๋Š” ๊ฐ€์ • ์œ„์—์„œ ์ฆ๋ช…์„ ํ–ˆ๋‹ค๋Š”๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ณ€์ˆ˜ 'a' ๊ฐ€ ๊ณต์œ ๋˜์–ด
  1227. ์žˆ๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฆ๋ช…์€ ํ‹€๋ฆฐ ๊ฒƒ์ด ๋ ๊ฒ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ ์ž์‹ ์ด
  1228. ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋งŒํผ ๋งŽ์€ ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€ ๋ชปํ•จ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด
  1229. READ_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1230. while (tmp = READ_ONCE(a))
  1231. do_something_with(tmp);
  1232. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” READ_ONCE() ๋’ค์— ๋‚˜์˜ค๋Š” ๊ฐ’์— ๋Œ€ํ•ด์„œ๋„ ๋ˆˆ๊ธธ์„ ๋‘๊ณ  ์žˆ์Œ์„
  1233. ๊ธฐ์–ตํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ์ฝ”๋“œ์—์„œ MAX ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ๋งคํฌ๋กœ๋กœ, 1์˜ ๊ฐ’์„
  1234. ๊ฐ–๋Š”๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค:
  1235. while ((tmp = READ_ONCE(a)) % MAX)
  1236. do_something_with(tmp);
  1237. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” MAX ๋ฅผ ๊ฐ€์ง€๊ณ  ์ˆ˜ํ–‰๋˜๋Š” "%" ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ
  1238. 0์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‹ค์งˆ์ ์œผ๋กœ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”
  1239. ๊ฒƒ์ฒ˜๋Ÿผ ์ตœ์ ํ™” ํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์–ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ('a' ๋ณ€์ˆ˜์˜ ๋กœ๋“œ๋Š” ์—ฌ์ „ํžˆ
  1240. ํ–‰ํ•ด์งˆ ๊ฒ๋‹ˆ๋‹ค.)
  1241. (*) ๋น„์Šทํ•˜๊ฒŒ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅํ•˜๋ ค ํ•˜๋Š” ๊ฐ’์„ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„
  1242. ์•Œ๋ฉด ์Šคํ† ์–ด ์ž์ฒด๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋„, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ˜„์žฌ์˜ CPU
  1243. ๋งŒ์ด ๊ทธ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์“ฐ๋Š” ์˜ค๋กœ์ง€ ํ•˜๋‚˜์˜ ์กด์žฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๊ณต์œ ๋œ ๋ณ€์ˆ˜์—
  1244. ๋Œ€ํ•ด์„œ๋Š” ์ž˜๋ชป๋œ ์ผ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜
  1245. ์žˆ์Šต๋‹ˆ๋‹ค:
  1246. a = 0;
  1247. ... ๋ณ€์ˆ˜ a ์— ์Šคํ† ์–ด๋ฅผ ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ...
  1248. a = 0;
  1249. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ณ€์ˆ˜ 'a' ์˜ ๊ฐ’์€ ์ด๋ฏธ 0์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ , ๋”ฐ๋ผ์„œ ๋‘๋ฒˆ์งธ ์Šคํ† ์–ด๋ฅผ
  1250. ์‚ญ์ œํ•  ๊ฒ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ CPU ๊ฐ€ ๊ทธ ์‚ฌ์ด ๋ณ€์ˆ˜ 'a' ์— ๋‹ค๋ฅธ ๊ฐ’์„ ์ผ๋‹ค๋ฉด
  1251. ํ™ฉ๋‹นํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฒ๋‹ˆ๋‹ค.
  1252. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋Ÿฐ ์ž˜๋ชป๋œ ์ถ”์ธก์„ ํ•˜์ง€ ์•Š๋„๋ก WRITE_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1253. WRITE_ONCE(a, 0);
  1254. ... ๋ณ€์ˆ˜ a ์— ์Šคํ† ์–ด๋ฅผ ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ...
  1255. WRITE_ONCE(a, 0);
  1256. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•˜์ง€ ๋ง๋ผ๊ณ  ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์„ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜
  1257. ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์˜ ํ”„๋กœ์„ธ์Šค ๋ ˆ๋ฒจ ์ฝ”๋“œ์™€ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ ์‚ฌ์ด์˜
  1258. ์ƒํ˜ธ์ž‘์šฉ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  1259. void process_level(void)
  1260. {
  1261. msg = get_message();
  1262. flag = true;
  1263. }
  1264. void interrupt_handler(void)
  1265. {
  1266. if (flag)
  1267. process_message(msg);
  1268. }
  1269. ์ด ์ฝ”๋“œ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ process_level() ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„
  1270. ์ˆ˜๋‹จ์ด ์—†๊ณ , ์ด๋Ÿฐ ๋ณ€ํ™˜์€ ์‹ฑ๊ธ€์“ฐ๋ ˆ๋“œ์—์„œ๋ผ๋ฉด ์‹ค์ œ๋กœ ํ›Œ๋ฅญํ•œ ์„ ํƒ์ผ ์ˆ˜
  1271. ์žˆ์Šต๋‹ˆ๋‹ค:
  1272. void process_level(void)
  1273. {
  1274. flag = true;
  1275. msg = get_message();
  1276. }
  1277. ์ด ๋‘๊ฐœ์˜ ๋ฌธ์žฅ ์‚ฌ์ด์— ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, interrupt_handler() ๋Š” ์˜๋ฏธ๋ฅผ
  1278. ์•Œ ์ˆ˜ ์—†๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด
  1279. WRITE_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:
  1280. void process_level(void)
  1281. {
  1282. WRITE_ONCE(msg, get_message());
  1283. WRITE_ONCE(flag, true);
  1284. }
  1285. void interrupt_handler(void)
  1286. {
  1287. if (READ_ONCE(flag))
  1288. process_message(READ_ONCE(msg));
  1289. }
  1290. interrupt_handler() ์•ˆ์—์„œ๋„ ์ค‘์ฒฉ๋œ ์ธํ„ฐ๋ŸฝํŠธ๋‚˜ NMI ์™€ ๊ฐ™์ด ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ
  1291. ์—ญ์‹œ 'flag' ์™€ 'msg' ์— ์ ‘๊ทผํ•˜๋Š” ๋˜๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€์— ์ธํ„ฐ๋ŸฝํŠธ ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด
  1292. READ_ONCE() ์™€ WRITE_ONCE() ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ๊ธฐ์–ตํ•ด ๋‘์„ธ์š”. ๋งŒ์•ฝ ๊ทธ๋Ÿฐ
  1293. ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๋ฉด, interrupt_handler() ์•ˆ์—์„œ๋Š” ๋ฌธ์„œํ™” ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ๋ฉด
  1294. READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ํ•„์š”์น˜ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทผ๋ž˜์˜ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์—์„œ
  1295. ์ค‘์ฒฉ๋œ ์ธํ„ฐ๋ŸฝํŠธ๋Š” ๋ณดํ†ต ์ž˜ ์ผ์–ด๋‚˜์ง€ ์•Š์Œ๋„ ๊ธฐ์–ตํ•ด ๋‘์„ธ์š”, ์‹ค์ œ๋กœ, ์–ด๋–ค
  1296. ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ฑ„๋กœ ๋ฆฌํ„ดํ•˜๋ฉด WARN_ONCE() ๊ฐ€
  1297. ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.)
  1298. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” READ_ONCE() ์™€ WRITE_ONCE() ๋’ค์˜ READ_ONCE() ๋‚˜ WRITE_ONCE(),
  1299. barrier(), ๋˜๋Š” ๋น„์Šทํ•œ ๊ฒƒ๋“ค์„ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์›€์ง์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ
  1300. ๊ฐ€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1301. ์ด ํšจ๊ณผ๋Š” barrier() ๋ฅผ ํ†ตํ•ด์„œ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, READ_ONCE() ์™€
  1302. WRITE_ONCE() ๊ฐ€ ์ข€ ๋” ์•ˆ๋ชฉ ๋†’์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค: READ_ONCE() ์™€ WRITE_ONCE()๋Š”
  1303. ์ปดํŒŒ์ผ๋Ÿฌ์— ์ฃผ์–ด์ง„ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•ด์„œ๋งŒ ์ตœ์ ํ™” ๊ฐ€๋Šฅ์„ฑ์„ ํฌ๊ธฐํ•˜๋„๋ก
  1304. ํ•˜์ง€๋งŒ, barrier() ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๊ธฐ๊ณ„์˜ ๋ ˆ์ง€์Šคํ„ฐ์— ์บ์‹œํ•ด ๋†“์€
  1305. ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๊ฐ’์„ ๋ฒ„๋ ค์•ผ ํ•˜๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์ปดํŒŒ์ผ๋Ÿฌ๋Š”
  1306. READ_ONCE() ์™€ WRITE_ONCE() ๊ฐ€ ์ผ์–ด๋‚œ ์ˆœ์„œ๋„ ์ง€์ผœ์ค๋‹ˆ๋‹ค, CPU ๋Š” ๋‹น์—ฐํžˆ
  1307. ๊ทธ ์ˆœ์„œ๋ฅผ ์ง€ํ‚ฌ ์˜๋ฌด๊ฐ€ ์—†์ง€๋งŒ์š”.
  1308. (*) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ์˜ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด ๋ณ€์ˆ˜์—์˜ ์Šคํ† ์–ด๋ฅผ ๋‚ ์กฐํ•ด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1309. if (a)
  1310. b = a;
  1311. else
  1312. b = 42;
  1313. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ตœ์ ํ™”๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ์ค„์ผ ๊ฒ๋‹ˆ๋‹ค:
  1314. b = 42;
  1315. if (a)
  1316. b = a;
  1317. ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ ์ด ์ตœ์ ํ™”๋Š” ์•ˆ์ „ํ•  ๋ฟ ์•„๋‹ˆ๋ผ ๋ธŒ๋žœ์น˜ ๊ฐฏ์ˆ˜๋ฅผ
  1318. ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„, ๋™์‹œ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ์—์„œ๋Š” ์ด ์ตœ์ ํ™”๋Š” ๋‹ค๋ฅธ
  1319. CPU ๊ฐ€ 'b' ๋ฅผ ๋กœ๋“œํ•  ๋•Œ, -- 'a' ๊ฐ€ 0์ด ์•„๋‹Œ๋ฐ๋„ -- ๊ฐ€์งœ์ธ ๊ฐ’, 42๋ฅผ ๋ณด๊ฒŒ
  1320. ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด WRITE_ONCE() ๋ฅผ
  1321. ์‚ฌ์šฉํ•˜์„ธ์š”:
  1322. if (a)
  1323. WRITE_ONCE(b, a);
  1324. else
  1325. WRITE_ONCE(b, 42);
  1326. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋กœ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€
  1327. ์•Š์ง€๋งŒ, ์บ์‹œ ๋ผ์ธ ๋ฐ”์šด์‹ฑ์„ ์ผ์œผ์ผœ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1328. ๋‚ ์กฐ๋œ ๋กœ๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„  READ_ONCE() ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  1329. (*) ์ •๋ ฌ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์œ„์น˜ํ•œ, ํ•œ๋ฒˆ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ์•ก์„ธ์Šค
  1330. ๊ฐ€๋Šฅํ•œ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋Š” ํ•˜๋‚˜์˜ ํฐ ์•ก์„ธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์€ ์•ก์„ธ์Šค๋“ค๋กœ
  1331. ๋Œ€์ฒด๋˜๋Š” "๋กœ๋“œ ํ‹ฐ์–ด๋ง(load tearing)" ๊ณผ "์Šคํ† ์–ด ํ‹ฐ์–ด๋ง(store tearing)" ์„
  1332. ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ์–ด์ง„ ์•„ํ‚คํ…์ณ๊ฐ€ 7-bit imeediate field ๋ฅผ ๊ฐ–๋Š”
  1333. 16-bit ์Šคํ† ์–ด ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์ œ๊ณตํ•œ๋‹ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ์˜ 32-bit ์Šคํ† ์–ด๋ฅผ
  1334. ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์— ๋‘๊ฐœ์˜ 16-bit store-immediate ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ ค ํ• ๊ฒ๋‹ˆ๋‹ค:
  1335. p = 0x00010002;
  1336. ์Šคํ† ์–ด ํ•  ์ƒ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ’์„ ์Šคํ† ์–ด ํ•˜๊ธฐ ์œ„ํ•ด ๋‘๊ฐœ๊ฐ€ ๋„˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์„
  1337. ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”, ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ตœ์ ํ™”๋ฅผ GCC ๋Š” ์‹ค์ œ๋กœ ํ•จ์„ ๋ถ€๋”” ์•Œ์•„ ๋‘์‹ญ์‹œ์˜ค.
  1338. ์ด ์ตœ์ ํ™”๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ฝ”๋“œ์—์„œ๋Š” ์„ฑ๊ณต์ ์ธ ์ตœ์ ํ™” ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ๊ทผ๋ž˜์—
  1339. ๋ฐœ์ƒํ•œ (๊ทธ๋ฆฌ๊ณ  ๊ณ ์ณ์ง„) ๋ฒ„๊ทธ๋Š” GCC ๊ฐ€ volatile ์Šคํ† ์–ด์— ๋น„์ •์ƒ์ ์œผ๋กœ ์ด
  1340. ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ฒ„๊ทธ๊ฐ€ ์—†๋‹ค๋ฉด, ๋‹ค์Œ์˜ ์˜ˆ์—์„œ
  1341. WRITE_ONCE() ์˜ ์‚ฌ์šฉ์€ ์Šคํ† ์–ด ํ‹ฐ์–ด๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค:
  1342. WRITE_ONCE(p, 0x00010002);
  1343. Packed ๊ตฌ์กฐ์ฒด์˜ ์‚ฌ์šฉ ์—ญ์‹œ ๋‹ค์Œ์˜ ์˜ˆ์ฒ˜๋Ÿผ ๋กœ๋“œ / ์Šคํ† ์–ด ํ‹ฐ์–ด๋ง์„ ์œ ๋ฐœํ•  ์ˆ˜
  1344. ์žˆ์Šต๋‹ˆ๋‹ค:
  1345. struct __attribute__((__packed__)) foo {
  1346. short a;
  1347. int b;
  1348. short c;
  1349. };
  1350. struct foo foo1, foo2;
  1351. ...
  1352. foo2.a = foo1.a;
  1353. foo2.b = foo1.b;
  1354. foo2.c = foo1.c;
  1355. READ_ONCE() ๋‚˜ WRITE_ONCE() ๋„ ์—†๊ณ  volatile ๋งˆํ‚น๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์—,
  1356. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ์„ธ๊ฐœ์˜ ๋Œ€์ž…๋ฌธ์„ ๋‘๊ฐœ์˜ 32-bit ๋กœ๋“œ์™€ ๋‘๊ฐœ์˜ 32-bit ์Šคํ† ์–ด๋กœ
  1357. ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” 'foo1.b' ์˜ ๊ฐ’์˜ ๋กœ๋“œ ํ‹ฐ์–ด๋ง๊ณผ 'foo2.b' ์˜
  1358. ์Šคํ† ์–ด ํ‹ฐ์–ด๋ง์„ ์ดˆ๋ž˜ํ•  ๊ฒ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋„ READ_ONCE() ์™€ WRITE_ONCE()
  1359. ๊ฐ€ ํ‹ฐ์–ด๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1360. foo2.a = foo1.a;
  1361. WRITE_ONCE(foo2.b, READ_ONCE(foo1.b));
  1362. foo2.c = foo1.c;
  1363. ๊ทธ๋ ‡์ง€๋งŒ, volatile ๋กœ ๋งˆํฌ๋œ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” READ_ONCE() ์™€ WRITE_ONCE() ๊ฐ€
  1364. ํ•„์š”์น˜ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 'jiffies' ๋Š” volatile ๋กœ ๋งˆํฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
  1365. READ_ONCE(jiffies) ๋ผ๊ณ  ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. READ_ONCE() ์™€ WRITE_ONCE() ๊ฐ€
  1366. ์‹ค์€ volatile ์บ์ŠคํŒ…์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์„œ ์ธ์ž๊ฐ€ ์ด๋ฏธ volatile ๋กœ ๋งˆํฌ๋˜์–ด
  1367. ์žˆ๋‹ค๋ฉด ๋˜๋‹ค๋ฅธ ํšจ๊ณผ๋ฅผ ๋‚ด์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  1368. ์ด ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ CPU ์—๋Š” ์ง์ ‘์  ํšจ๊ณผ๋ฅผ ์ „ํ˜€ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ตญ์€
  1369. ์žฌ๋ฐฐ์น˜๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ์Œ์„ ๋ถ€๋”” ๊ธฐ์–ตํ•ด ๋‘์‹ญ์‹œ์˜ค.
  1370. CPU ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด
  1371. -----------------
  1372. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ๋‹ค์Œ์˜ ์—ฌ๋Ÿ๊ฐœ ๊ธฐ๋ณธ CPU ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1373. TYPE MANDATORY SMP CONDITIONAL
  1374. =============== ======================= ===========================
  1375. ๋ฒ”์šฉ mb() smp_mb()
  1376. ์“ฐ๊ธฐ wmb() smp_wmb()
  1377. ์ฝ๊ธฐ rmb() smp_rmb()
  1378. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ READ_ONCE()
  1379. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ
  1380. ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—์˜ ์ถ”๊ฐ€์ ์ธ ์ˆœ์„œ ๋ณด์žฅ์„ ํฌํ•จํ•˜์ง€
  1381. ์•Š์Šต๋‹ˆ๋‹ค.
  1382. ๋ฐฉ๋ฐฑ: ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ด๋‹น ๋กœ๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์ผ์œผํ‚ฌ
  1383. ๊ฒƒ์œผ๋กœ (์˜ˆ: `a[b]` ๋Š” a[b] ๋ฅผ ๋กœ๋“œ ํ•˜๊ธฐ ์ „์— b ์˜ ๊ฐ’์„ ๋จผ์ € ๋กœ๋“œํ•œ๋‹ค)
  1384. ๊ธฐ๋Œ€๋˜์ง€๋งŒ, C ์–ธ์–ด ์‚ฌ์–‘์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ b ์˜ ๊ฐ’์„ ์ถ”์ธก (์˜ˆ: 1 ๊ณผ ๊ฐ™์Œ) ํ•ด์„œ
  1385. b ๋กœ๋“œ ์ „์— a ๋กœ๋“œ๋ฅผ ํ•˜๋Š” ์ฝ”๋“œ (์˜ˆ: tmp = a[1]; if (b != 1) tmp = a[b]; ) ๋ฅผ
  1386. ๋งŒ๋“ค์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๋‚ด์šฉ ๊ฐ™์€ ๊ฑด ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” a[b] ๋ฅผ ๋กœ๋“œํ•œ
  1387. ํ›„์— b ๋ฅผ ๋˜๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ, a[b] ๋ณด๋‹ค ์ตœ์‹  ๋ฒ„์ „์˜ b ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜๋„
  1388. ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์˜ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•œ ์˜๊ฒฌ ์ผ์น˜๋Š” ์•„์ง ์—†์Šต๋‹ˆ๋‹ค๋งŒ, ์ผ๋‹จ
  1389. READ_ONCE() ๋งคํฌ๋กœ๋ถ€ํ„ฐ ๋ณด๊ธฐ ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ์ข‹์€ ์‹œ์ž‘์ด ๋ ๊ฒ๋‹ˆ๋‹ค.
  1390. SMP ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ์œ ๋‹ˆํ”„๋กœ์„ธ์„œ๋กœ ์ปดํŒŒ์ผ๋œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋กœ
  1391. ๋ฐ”๋€Œ๋Š”๋ฐ, ํ•˜๋‚˜์˜ CPU ๋Š” ์Šค์Šค๋กœ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ๊ฒน์น˜๋Š” ์•ก์„ธ์Šค๋“ค ์—ญ์‹œ ์˜ฌ๋ฐ”๋ฅธ
  1392. ์ˆœ์„œ๋กœ ํ–‰ํ•ด์งˆ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์•„๋ž˜์˜ "Virtual Machine
  1393. Guests" ์„œ๋ธŒ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  1394. [!] SMP ์‹œ์Šคํ…œ์—์„œ ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ๋กœ์˜ ์ ‘๊ทผ๋“ค์„ ์ˆœ์„œ ์„ธ์›Œ์•ผ ํ•  ๋•Œ, SMP ๋ฉ”๋ชจ๋ฆฌ
  1395. ๋ฐฐ๋ฆฌ์–ด๋Š” _๋ฐ˜๋“œ์‹œ_ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•จ์„ ๊ธฐ์–ตํ•˜์„ธ์š”, ๊ทธ๋Œ€์‹  ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋„
  1396. ์ถฉ๋ถ„ํ•˜๊ธด ํ•˜์ง€๋งŒ ๋ง์ด์ฃ .
  1397. Mandatory ๋ฐฐ๋ฆฌ์–ด๋“ค์€ SMP ์‹œ์Šคํ…œ์—์„œ๋„ UP ์‹œ์Šคํ…œ์—์„œ๋„ SMP ํšจ๊ณผ๋งŒ ํ†ต์ œํ•˜๊ธฐ์—๋Š”
  1398. ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— SMP ํšจ๊ณผ๋งŒ ํ†ต์ œํ•˜๋ฉด ๋˜๋Š” ๊ณณ์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ
  1399. ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋Š์Šจํ•œ ์ˆœ์„œ ๊ทœ์น™์˜ ๋ฉ”๋ชจ๋ฆฌ I/O ์œˆ๋„์šฐ๋ฅผ ํ†ตํ•œ MMIO ์˜ ํšจ๊ณผ๋ฅผ
  1400. ํ†ต์ œํ•  ๋•Œ์—๋Š” mandatory ๋ฐฐ๋ฆฌ์–ด๋“ค์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฐ๋ฆฌ์–ด๋“ค์€
  1401. ์ปดํŒŒ์ผ๋Ÿฌ์™€ CPU ๋ชจ๋‘ ์žฌ๋ฐฐ์น˜๋ฅผ ๋ชปํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ๋””๋ฐ”์ด์Šค์—
  1402. ๋ณด์—ฌ์ง€๋Š” ์ˆœ์„œ์—๋„ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, SMP ๊ฐ€ ์•„๋‹Œ ์‹œ์Šคํ…œ์ด๋ผ ํ• ์ง€๋ผ๋„ ํ•„์š”ํ•  ์ˆ˜
  1403. ์žˆ์Šต๋‹ˆ๋‹ค.
  1404. ์ผ๋ถ€ ๊ณ ๊ธ‰ ๋ฐฐ๋ฆฌ์–ด ํ•จ์ˆ˜๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1405. (*) smp_store_mb(var, value)
  1406. ์ด ํ•จ์ˆ˜๋Š” ํŠน์ • ๋ณ€์ˆ˜์— ํŠน์ • ๊ฐ’์„ ๋Œ€์ž…ํ•˜๊ณ  ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์นฉ๋‹ˆ๋‹ค.
  1407. UP ์ปดํŒŒ์ผ์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด๋ณด๋‹ค ๋”ํ•œ ๊ฒƒ์„ ์นœ๋‹ค๊ณ ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1408. (*) smp_mb__before_atomic();
  1409. (*) smp_mb__after_atomic();
  1410. ์ด๊ฒƒ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜์ง€ ์•Š๋Š” ์–ดํ† ๋ฏน RMW ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ฝ”๋“œ์—
  1411. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜์ง€
  1412. ์•Š๋Š” ์–ดํ† ๋ฏน RMW ํ•จ์ˆ˜๋“ค์˜ ์˜ˆ๋กœ๋Š” ๋”ํ•˜๊ธฐ, ๋นผ๊ธฐ, (์‹คํŒจํ•œ) ์กฐ๊ฑด์ 
  1413. ์˜คํผ๋ ˆ์ด์…˜๋“ค, _relaxed ํ•จ์ˆ˜๋“ค์ด ์žˆ์œผ๋ฉฐ, atomic_read ๋‚˜ atomic_set ์€ ์ด์—
  1414. ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š” ํ”ํ•œ ์˜ˆ๋กœ๋Š” ์–ดํ† ๋ฏน
  1415. ์˜คํผ๋ ˆ์ด์…˜์„ ์‚ฌ์šฉํ•ด ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1416. ์ด๊ฒƒ๋“ค์€ ๋˜ํ•œ (set_bit ๊ณผ clear_bit ๊ฐ™์€) ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜์ง€ ์•Š๋Š”
  1417. ์–ดํ† ๋ฏน RMW bitop ํ•จ์ˆ˜๋“ค์„ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1418. ํ•œ ์˜ˆ๋กœ, ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ๋ฌดํšจํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ๊ทธ ๊ฐ์ฒด์˜ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ๋ฅผ
  1419. ๊ฐ์†Œ์‹œํ‚ค๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด์„ธ์š”:
  1420. obj->dead = 1;
  1421. smp_mb__before_atomic();
  1422. atomic_dec(&obj->ref_count);
  1423. ์ด ์ฝ”๋“œ๋Š” ๊ฐ์ฒด์˜ ์—…๋ฐ์ดํŠธ๋œ death ๋งˆํฌ๊ฐ€ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํ„ฐ ๊ฐ์†Œ ๋™์ž‘
  1424. *์ „์—* ๋ณด์ผ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  1425. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  Documentation/atomic_{t,bitops}.txt ๋ฌธ์„œ๋ฅผ
  1426. ์ฐธ๊ณ ํ•˜์„ธ์š”.
  1427. (*) dma_wmb();
  1428. (*) dma_rmb();
  1429. ์ด๊ฒƒ๋“ค์€ CPU ์™€ DMA ๊ฐ€๋Šฅํ•œ ๋””๋ฐ”์ด์Šค์—์„œ ๋ชจ๋‘ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜
  1430. ์ฝ๊ธฐ, ์“ฐ๊ธฐ ์ž‘์—…๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด consistent memory ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ
  1431. ์œ„ํ•œ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.
  1432. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋””๋ฐ”์ด์Šค์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ, ๋””์Šคํฌ๋ฆฝํ„ฐ ์ƒํƒœ ๊ฐ’์„ ์‚ฌ์šฉํ•ด
  1433. ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋””๋ฐ”์ด์Šค์— ์†ํ•ด ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด CPU ์— ์†ํ•ด ์žˆ๋Š”์ง€ ํ‘œ์‹œํ•˜๊ณ ,
  1434. ๊ณต์ง€์šฉ ์ดˆ์ธ์ข…(doorbell) ์„ ์‚ฌ์šฉํ•ด ์—…๋ฐ์ดํŠธ๋œ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋””๋ฐ”์ด์Šค์— ์‚ฌ์šฉ
  1435. ๊ฐ€๋Šฅํ•ด์กŒ์Œ์„ ๊ณต์ง€ํ•˜๋Š” ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  1436. if (desc->status != DEVICE_OWN) {
  1437. /* ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์†Œ์œ ํ•˜๊ธฐ ์ „์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ์•Š์Œ */
  1438. dma_rmb();
  1439. /* ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์”€ */
  1440. read_data = desc->data;
  1441. desc->data = write_data;
  1442. /* ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์ „ ์ˆ˜์ •์‚ฌํ•ญ์„ ๋ฐ˜์˜ */
  1443. dma_wmb();
  1444. /* ์†Œ์œ ๊ถŒ์„ ์ˆ˜์ • */
  1445. desc->status = DEVICE_OWN;
  1446. /* ์—…๋ฐ์ดํŠธ๋œ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ๋””๋ฐ”์ด์Šค์— ๊ณต์ง€ */
  1447. writel(DESC_NOTIFY, doorbell);
  1448. }
  1449. dma_rmb() ๋Š” ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๊ธฐ ์ „์— ๋””๋ฐ”์ด์Šค๊ฐ€ ์†Œ์œ ๊ถŒ์„
  1450. ๋‚ด๋ ค๋†“์•˜์„ ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ณ , dma_wmb() ๋Š” ๋””๋ฐ”์ด์Šค๊ฐ€ ์ž์‹ ์ด ์†Œ์œ ๊ถŒ์„ ๋‹ค์‹œ
  1451. ๊ฐ€์กŒ์Œ์„ ๋ณด๊ธฐ ์ „์— ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์“ฐ์˜€์„ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ,
  1452. writel() ์„ ์‚ฌ์šฉํ•˜๋ฉด ์บ์‹œ ์ผ๊ด€์„ฑ์ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ (cache coherent memory)
  1453. ์“ฐ๊ธฐ๊ฐ€ MMIO ์˜์—ญ์—์˜ ์“ฐ๊ธฐ ์ „์— ์™„๋ฃŒ๋˜์—ˆ์„ ๊ฒƒ์„ ๋ณด์žฅํ•˜๋ฏ€๋กœ writel() ์•ž์—
  1454. wmb() ๋ฅผ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Œ์„ ์•Œ์•„๋‘์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. writel() ๋ณด๋‹ค ๋น„์šฉ์ด
  1455. ์ €๋ ดํ•œ writel_relaxed() ๋Š” ์ด๋Ÿฐ ๋ณด์žฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„  ์‚ฌ์šฉ๋˜์ง€
  1456. ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1457. writel_relaxed() ์™€ ๊ฐ™์€ ์™„ํ™”๋œ I/O ์ ‘๊ทผ์ž๋“ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์œ„ํ•ด์„œ๋Š”
  1458. "์ปค๋„ I/O ๋ฐฐ๋ฆฌ์–ด์˜ ํšจ๊ณผ" ์„น์…˜์„, consistent memory ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„
  1459. ์œ„ํ•ด์„  Documentation/core-api/dma-api.rst ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  1460. (*) pmem_wmb();
  1461. ์ด๊ฒƒ์€ persistent memory ๋ฅผ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ, persistent ์ €์žฅ์†Œ์— ๊ฐ€ํ•ด์ง„ ๋ณ€๊ฒฝ
  1462. ์‚ฌํ•ญ์ด ํ”Œ๋žซํผ ์—ฐ์†์„ฑ ๋„๋ฉ”์ธ์— ๋„๋‹ฌํ–ˆ์„ ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  1463. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž„์‹œ์ ์ด์ง€ ์•Š์€ pmem ์˜์—ญ์œผ๋กœ์˜ ์“ฐ๊ธฐ ํ›„, ์šฐ๋ฆฌ๋Š” ์“ฐ๊ธฐ๊ฐ€ ํ”Œ๋žซํผ
  1464. ์—ฐ์†์„ฑ ๋„๋ฉ”์ธ์— ๋„๋‹ฌํ–ˆ์„ ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด pmem_wmb() ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  1465. ์ด๋Š” ์“ฐ๊ธฐ๊ฐ€ ๋’ค๋”ฐ๋ฅด๋Š” instruction ๋“ค์ด ์œ ๋ฐœํ•˜๋Š” ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค๋‚˜
  1466. ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ์‹œ์ž‘ ์ „์— persistent ์ €์žฅ์†Œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ–ˆ์„ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  1467. ์ด๋Š” wmb() ์— ์˜ํ•ด ์ด๋ค„์ง€๋Š” ์ˆœ์„œ ๊ทœ์น™์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  1468. Persistent memory ์—์„œ์˜ ๋กœ๋“œ๋ฅผ ์œ„ํ•ด์„  ํ˜„์žฌ์˜ ์ฝ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋กœ๋„ ์ฝ๊ธฐ
  1469. ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋Š”๋ฐ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
  1470. =========================
  1471. ์•”๋ฌต์  ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด
  1472. =========================
  1473. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ์ผ๋ถ€ ํ•จ์ˆ˜๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ฝ(lock)๊ณผ
  1474. ์Šค์ผ€์ฅด๋ง ๊ด€๋ จ ํ•จ์ˆ˜๋“ค์ด ๋Œ€๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
  1475. ์—ฌ๊ธฐ์„  _์ตœ์†Œํ•œ์˜_ ๋ณด์žฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค; ํŠน์ • ์•„ํ‚คํ…์ณ์—์„œ๋Š” ์ด ์„ค๋ช…๋ณด๋‹ค ๋” ๋งŽ์€
  1476. ๋ณด์žฅ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ ํ•ด๋‹น ์•„ํ‚คํ…์ณ์— ์ข…์†์ ์ธ ์ฝ”๋“œ ์™ธ์˜ ๋ถ€๋ถ„์—์„œ๋Š”
  1477. ๊ทธ๋Ÿฐ ๋ณด์žฅ์„ ๊ธฐ๋Œ€ํ•ด์„  ์•ˆ๋ ๊ฒ๋‹ˆ๋‹ค.
  1478. ๋ฝ ACQUISITION ํ•จ์ˆ˜
  1479. -------------------
  1480. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ๋‹ค์–‘ํ•œ ๋ฝ ๊ตฌ์„ฑ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1481. (*) ์Šคํ•€ ๋ฝ
  1482. (*) R/W ์Šคํ•€ ๋ฝ
  1483. (*) ๋ฎคํ…์Šค
  1484. (*) ์„ธ๋งˆํฌ์–ด
  1485. (*) R/W ์„ธ๋งˆํฌ์–ด
  1486. ๊ฐ ๊ตฌ์„ฑ์ฒด๋งˆ๋‹ค ๋ชจ๋“  ๊ฒฝ์šฐ์— "ACQUIRE" ์˜คํผ๋ ˆ์ด์…˜๊ณผ "RELEASE" ์˜คํผ๋ ˆ์ด์…˜์˜ ๋ณ€์ข…์ด
  1487. ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ๋ชจ๋‘ ์ ์ ˆํ•œ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:
  1488. (1) ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์˜ ์˜ํ–ฅ:
  1489. ACQUIRE ๋’ค์—์„œ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์€ ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋œ
  1490. ๋’ค์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  1491. ACQUIRE ์•ž์—์„œ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์€ ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋œ ํ›„์—
  1492. ์™„๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1493. (2) RELEASE ์˜คํผ๋ ˆ์ด์…˜์˜ ์˜ํ–ฅ:
  1494. RELEASE ์•ž์—์„œ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์€ RELEASE ์˜คํผ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋˜๊ธฐ
  1495. ์ „์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  1496. RELEASE ๋’ค์—์„œ ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜์€ RELEASE ์˜คํผ๋ ˆ์ด์…˜ ์™„๋ฃŒ ์ „์—
  1497. ์™„๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1498. (3) ACQUIRE vs ACQUIRE ์˜ํ–ฅ:
  1499. ์–ด๋–ค ACQUIRE ์˜คํผ๋ ˆ์ด์…˜๋ณด๋‹ค ์•ž์—์„œ ์š”์ฒญ๋œ ๋ชจ๋“  ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์€ ๊ทธ
  1500. ACQUIRE ์˜คํผ๋ ˆ์ด์…˜ ์ „์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  1501. (4) ACQUIRE vs RELEASE implication:
  1502. ์–ด๋–ค RELEASE ์˜คํผ๋ ˆ์ด์…˜๋ณด๋‹ค ์•ž์„œ ์š”์ฒญ๋œ ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์€ ๊ทธ RELEASE
  1503. ์˜คํผ๋ ˆ์ด์…˜๋ณด๋‹ค ๋จผ์ € ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  1504. (5) ์‹คํŒจํ•œ ์กฐ๊ฑด์  ACQUIRE ์˜ํ–ฅ:
  1505. ACQUIRE ์˜คํผ๋ ˆ์ด์…˜์˜ ์ผ๋ถ€ ๋ฝ(lock) ๋ณ€์ข…์€ ๋ฝ์ด ๊ณง๋ฐ”๋กœ ํš๋“ํ•˜๊ธฐ์—๋Š”
  1506. ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ด๊ฑฐ๋‚˜ ๋ฝ์ด ํš๋“ ๊ฐ€๋Šฅํ•ด์ง€๋„๋ก ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋„์ค‘ ์‹œ๊ทธ๋„์„ ๋ฐ›๊ฑฐ๋‚˜
  1507. ํ•ด์„œ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๋ฝ์€ ์–ด๋–ค ๋ฐฐ๋ฆฌ์–ด๋„ ๋‚ดํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1508. [!] ์ฐธ๊ณ : ๋ฝ ACQUIRE ์™€ RELEASE ๊ฐ€ ๋‹จ๋ฐฉํ–ฅ ๋ฐฐ๋ฆฌ์–ด์—ฌ์„œ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ ์ค‘ ํ•˜๋‚˜๋Š”
  1509. ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜ ๋ฐ”๊นฅ์˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์˜ํ–ฅ์ด ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜ ๋‚ด๋ถ€๋กœ๋„ ๋“ค์–ด์˜ฌ ์ˆ˜
  1510. ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  1511. RELEASE ํ›„์— ์š”์ฒญ๋˜๋Š” ACQUIRE ๋Š” ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ผ ์—ฌ๊ฒจ์ง€๋ฉด ์•ˆ๋˜๋Š”๋ฐ,
  1512. ACQUIRE ์•ž์˜ ์•ก์„ธ์Šค๊ฐ€ ACQUIRE ํ›„์— ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๊ณ , RELEASE ํ›„์˜ ์•ก์„ธ์Šค๊ฐ€
  1513. RELEASE ์ „์— ์ˆ˜ํ–‰๋  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ทธ ๋‘๊ฐœ์˜ ์•ก์„ธ์Šค๊ฐ€ ์„œ๋กœ๋ฅผ ์ง€๋‚˜์น  ์ˆ˜๋„ ์žˆ๊ธฐ
  1514. ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค:
  1515. *A = a;
  1516. ACQUIRE M
  1517. RELEASE M
  1518. *B = b;
  1519. ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1520. ACQUIRE M, STORE *B, STORE *A, RELEASE M
  1521. ACQUIRE ์™€ RELEASE ๊ฐ€ ๋ฝ ํš๋“๊ณผ ํ•ด์ œ๋ผ๋ฉด, ๊ทธ๋ฆฌ๊ณ  ๋ฝ์˜ ACQUIRE ์™€ RELEASE ๊ฐ€
  1522. ๊ฐ™์€ ๋ฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด, ํ•ด๋‹น ๋ฝ์„ ์ฅ๊ณ  ์žˆ์ง€ ์•Š์€ ๋‹ค๋ฅธ CPU ์˜ ์‹œ์•ผ์—๋Š”
  1523. ์ด์™€ ๊ฐ™์€ ์žฌ๋ฐฐ์น˜๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์•ฝํ•˜์ž๋ฉด, ACQUIRE ์—
  1524. ์ด์–ด RELEASE ์˜คํผ๋ ˆ์ด์…˜์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ํ–‰์œ„๊ฐ€ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋กœ
  1525. ์ƒ๊ฐ๋˜์–ด์„  -์•ˆ๋ฉ๋‹ˆ๋‹ค-.
  1526. ๋น„์Šทํ•˜๊ฒŒ, ์•ž์˜ ๋ฐ˜๋Œ€ ์ผ€์ด์Šค์ธ RELEASE ์™€ ACQUIRE ๋‘๊ฐœ ์˜คํผ๋ ˆ์ด์…˜์˜ ์ˆœ์ฐจ์  ์‹คํ–‰
  1527. ์—ญ์‹œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, RELEASE, ACQUIRE ๋กœ
  1528. ๊ทœ์ •๋˜๋Š” ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜์˜ CPU ์ˆ˜ํ–‰์€ RELEASE ์™€ ACQUIRE ๋ฅผ ๊ฐ€๋กœ์ง€๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ,
  1529. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋Š”:
  1530. *A = a;
  1531. RELEASE M
  1532. ACQUIRE N
  1533. *B = b;
  1534. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1535. ACQUIRE N, STORE *B, STORE *A, RELEASE M
  1536. ์ด๋Ÿฐ ์žฌ๋ฐฐ์น˜๋Š” ๋ฐ๋“œ๋ฝ์„ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ทธ๋Ÿฐ
  1537. ๋ฐ๋“œ๋ฝ์˜ ์กฐ์ง์ด ์žˆ๋‹ค๋ฉด RELEASE ๋Š” ๋‹จ์ˆœํžˆ ์™„๋ฃŒ๋  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐ๋“œ๋ฝ์€ ์กด์žฌํ•  ์ˆ˜
  1538. ์—†์Šต๋‹ˆ๋‹ค.
  1539. ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
  1540. ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐ ํ•˜๊ณ  ์žˆ๋Š”๊ฑด ์žฌ๋ฐฐ์น˜๋ฅผ ํ•˜๋Š” CPU ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์ด์ง€,
  1541. ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ž€ ์ ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ (๋˜๋Š”, ๊ฐœ๋ฐœ์ž)
  1542. ๊ฐ€ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ์ด๋ ‡๊ฒŒ ์žฌ๋ฐฐ์น˜ํ•˜๋ฉด, ๋ฐ๋“œ๋ฝ์ด ์ผ์–ด๋‚  ์ˆ˜ -์žˆ์Šต-๋‹ˆ๋‹ค.
  1543. ํ•˜์ง€๋งŒ CPU ๊ฐ€ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ์žฌ๋ฐฐ์น˜ ํ–ˆ๋‹ค๋Š”๊ฑธ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. ์ด ์˜ˆ์—์„œ,
  1544. ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ ์ƒ์œผ๋กœ๋Š” ์–ธ๋ฝ์ด ๋ฝ์„ ์•ž์„œ๊ฒŒ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. CPU ๊ฐ€ ์ด๋ฅผ
  1545. ์žฌ๋ฐฐ์น˜ํ•ด์„œ ๋’ค์˜ ๋ฝ ์˜คํผ๋ ˆ์ด์…˜์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ฐ๋“œ๋ฝ์ด
  1546. ์กด์žฌํ•œ๋‹ค๋ฉด, ์ด ๋ฝ ์˜คํผ๋ ˆ์ด์…˜์€ ๊ทธ์ € ์Šคํ•€์„ ํ•˜๋ฉฐ ๊ณ„์†ํ•ด์„œ ๋ฝ์„
  1547. ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š”, ํ•œ์ฐธ ํ›„์—๊ฒ ์ง€๋งŒ, ์ž ๋“ญ๋‹ˆ๋‹ค). CPU ๋Š” ์–ธ์  ๊ฐ€๋Š”
  1548. (์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ์—์„œ๋Š” ๋ฝ์„ ์•ž์„œ๋Š”) ์–ธ๋ฝ ์˜คํผ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ, ์ด ์–ธ๋ฝ
  1549. ์˜คํผ๋ ˆ์ด์…˜์ด ์ž ์žฌ์  ๋ฐ๋“œ๋ฝ์„ ํ•ด๊ฒฐํ•˜๊ณ , ๋ฝ ์˜คํผ๋ ˆ์ด์…˜๋„ ๋’ค์ด์–ด ์„ฑ๊ณตํ•˜๊ฒŒ
  1550. ๋ฉ๋‹ˆ๋‹ค.
  1551. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ๋ฝ์ด ์ž ์„ ์ž๋Š” ํƒ€์ž…์ด์—ˆ๋‹ค๋ฉด์š”? ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ์ฝ”๋“œ๋Š”
  1552. ์Šค์ผ€์ฅด๋Ÿฌ๋กœ ๋“ค์–ด๊ฐ€๋ ค ํ•  ๊ฑฐ๊ณ , ์—ฌ๊ธฐ์„œ ๊ฒฐ๊ตญ์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋งŒ๋‚˜๊ฒŒ
  1553. ๋˜๋Š”๋ฐ, ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์•ž์˜ ์–ธ๋ฝ ์˜คํผ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋˜๋„๋ก ๋งŒ๋“ค๊ณ ,
  1554. ๋ฐ๋“œ๋ฝ์€ ์ด๋ฒˆ์—๋„ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ž ์„ ์ž๋Š” ํ–‰์œ„์™€ ์–ธ๋ฝ ์‚ฌ์ด์˜ ๊ฒฝ์ฃผ ์ƒํ™ฉ
  1555. (race) ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค๋งŒ, ๋ฝ ๊ด€๋ จ ๊ธฐ๋Šฅ๋“ค์€ ๊ทธ๋Ÿฐ ๊ฒฝ์ฃผ ์ƒํ™ฉ์„ ๋ชจ๋“ 
  1556. ๊ฒฝ์šฐ์— ์ œ๋Œ€๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1557. ๋ฝ๊ณผ ์„ธ๋งˆํฌ์–ด๋Š” UP ์ปดํŒŒ์ผ๋œ ์‹œ์Šคํ…œ์—์„œ์˜ ์ˆœ์„œ์— ๋Œ€ํ•ด ๋ณด์žฅ์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—,
  1558. ๊ทธ๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ์˜คํผ๋ ˆ์ด์…˜๊ณผ ํ•จ๊ป˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์–ด๋–ค ์ผ์—๋„ - ํŠนํžˆ
  1559. I/O ์•ก์„ธ์Šค์™€ ๊ด€๋ จํ•ด์„œ๋Š” - ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์„ ๊ฒ๋‹ˆ๋‹ค.
  1560. "CPU ๊ฐ„ ACQUIRING ๋ฐฐ๋ฆฌ์–ด ํšจ๊ณผ" ์„น์…˜๋„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  1561. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค:
  1562. *A = a;
  1563. *B = b;
  1564. ACQUIRE
  1565. *C = c;
  1566. *D = d;
  1567. RELEASE
  1568. *E = e;
  1569. *F = f;
  1570. ์—ฌ๊ธฐ์„  ๋‹ค์Œ์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1571. ACQUIRE, {*F,*A}, *E, {*C,*D}, *B, RELEASE
  1572. [+] {*F,*A} ๋Š” ์กฐํ•ฉ๋œ ์•ก์„ธ์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  1573. ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜์ฃ :
  1574. {*F,*A}, *B, ACQUIRE, *C, *D, RELEASE, *E
  1575. *A, *B, *C, ACQUIRE, *D, RELEASE, *E, *F
  1576. *A, *B, ACQUIRE, *C, RELEASE, *D, *E, *F
  1577. *B, ACQUIRE, *C, *D, RELEASE, {*F,*A}, *E
  1578. ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ํ•จ์ˆ˜
  1579. ----------------------
  1580. ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•˜๋Š” ํ•จ์ˆ˜ (ACQUIRE ์™€ ๋™์ผ) ์™€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ™œ์„ฑํ™” ํ•˜๋Š” ํ•จ์ˆ˜
  1581. (RELEASE ์™€ ๋™์ผ) ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด์ฒ˜๋Ÿผ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ
  1582. ๋ฐฐ๋ฆฌ์–ด๋‚˜ I/O ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๋ผ๋ฉด ๊ทธ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ํ•จ์ˆ˜
  1583. ์™ธ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ œ๊ณต๋˜์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  1584. ์Šฌ๋ฆฝ๊ณผ ์›จ์ดํฌ์—… ํ•จ์ˆ˜
  1585. --------------------
  1586. ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ์— ํ‘œ์‹œ๋œ ์ด๋ฒคํŠธ์— ์˜ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž ์— ๋น ํŠธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊นจ์šฐ๋Š” ๊ฒƒ์€
  1587. ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํƒœ์Šคํฌ์˜ ํƒœ์Šคํฌ ์ƒํƒœ์™€ ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š”
  1588. ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ, ๋‘ ๋ฐ์ดํ„ฐ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ณ์€ ์ˆœ์„œ๋Œ€๋กœ
  1589. ์ผ์–ด๋‚จ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด, ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž ์— ๋“ค๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๊นจ์šฐ๋Š” ๊ธฐ๋Šฅ์€
  1590. ๋ช‡๊ฐ€์ง€ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•ฉ๋‹ˆ๋‹ค.
  1591. ๋จผ์ €, ์ž ์„ ์žฌ์šฐ๋Š” ์ชฝ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:
  1592. for (;;) {
  1593. set_current_state(TASK_UNINTERRUPTIBLE);
  1594. if (event_indicated)
  1595. break;
  1596. schedule();
  1597. }
  1598. set_current_state() ์— ์˜ํ•ด, ํƒœ์Šคํฌ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€ ํ›„ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€
  1599. ์ž๋™์œผ๋กœ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค:
  1600. CPU 1
  1601. ===============================
  1602. set_current_state();
  1603. smp_store_mb();
  1604. STORE current->state
  1605. <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด>
  1606. LOAD event_indicated
  1607. set_current_state() ๋Š” ๋‹ค์Œ์˜ ๊ฒƒ๋“ค๋กœ ๊ฐ์‹ธ์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1608. prepare_to_wait();
  1609. prepare_to_wait_exclusive();
  1610. ์ด๊ฒƒ๋“ค ์—ญ์‹œ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•œ ํ›„ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  1611. ์•ž์˜ ์ „์ฒด ์‹œํ€€์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค๋กœ ํ•œ๋ฒˆ์— ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘
  1612. ์˜ฌ๋ฐ”๋ฅธ ์žฅ์†Œ์— ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค:
  1613. wait_event();
  1614. wait_event_interruptible();
  1615. wait_event_interruptible_exclusive();
  1616. wait_event_interruptible_timeout();
  1617. wait_event_killable();
  1618. wait_event_timeout();
  1619. wait_on_bit();
  1620. wait_on_bit_lock();
  1621. ๋‘๋ฒˆ์งธ๋กœ, ๊นจ์šฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒ๋‹ˆ๋‹ค:
  1622. event_indicated = 1;
  1623. wake_up(&event_wait_queue);
  1624. ๋˜๋Š”:
  1625. event_indicated = 1;
  1626. wake_up_process(event_daemon);
  1627. wake_up() ์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๊นจ์šฐ๊ฒŒ ๋˜๋ฉด, ์ด ํ•จ์ˆ˜๋Š” ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  1628. ์ด ํ•จ์ˆ˜๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ๊นจ์šฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ˆ˜ํ–‰๋  ์ˆ˜๋„, ์ˆ˜ํ–‰๋˜์ง€ ์•Š์„
  1629. ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค; ์ด ๊ฒฝ์šฐ์— ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฑฐ๋ผ ์˜คํ•ดํ•ด์„  ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ด
  1630. ๋ฐฐ๋ฆฌ์–ด๋Š” ํƒœ์Šคํฌ ์ƒํƒœ๊ฐ€ ์ ‘๊ทผ๋˜๊ธฐ ์ „์— ์ˆ˜ํ–‰๋˜๋Š”๋ฐ, ์ž์„ธํžˆ ๋งํ•˜๋ฉด ์ด ์ด๋ฒคํŠธ๋ฅผ
  1631. ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ STORE ์™€ TASK_RUNNING ์œผ๋กœ ์ƒํƒœ๋ฅผ ์“ฐ๋Š” STORE ์‚ฌ์ด์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค:
  1632. CPU 1 (Sleeper) CPU 2 (Waker)
  1633. =============================== ===============================
  1634. set_current_state(); STORE event_indicated
  1635. smp_store_mb(); wake_up();
  1636. STORE current->state ...
  1637. <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด> <๋ฒ”์šฉ ๋ฐฐ๋ฆฌ์–ด>
  1638. LOAD event_indicated if ((LOAD task->state) & TASK_NORMAL)
  1639. STORE task->state
  1640. ์—ฌ๊ธฐ์„œ "task" ๋Š” ๊นจ์–ด๋‚˜์ง€๋Š” ์“ฐ๋ ˆ๋“œ์ด๊ณ  CPU 1 ์˜ "current" ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  1641. ๋ฐ˜๋ณตํ•˜์ง€๋งŒ, wake_up() ์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ์ •๋ง ๊นจ์šด๋‹ค๋ฉด ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์ˆ˜ํ–‰๋ 
  1642. ๊ฒƒ์ด ๋ณด์žฅ๋˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๋Ÿฐ ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฑธ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, X ์™€
  1643. Y ๋Š” ๋ชจ๋‘ 0 ์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์•„๋ž˜์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ์ƒ๊ฐํ•ด
  1644. ๋ด…์‹œ๋‹ค:
  1645. CPU 1 CPU 2
  1646. =============================== ===============================
  1647. X = 1; Y = 1;
  1648. smp_mb(); wake_up();
  1649. LOAD Y LOAD X
  1650. ์ •๋ง๋กœ ๊นจ์šฐ๊ธฐ๊ฐ€ ํ–‰ํ•ด์กŒ๋‹ค๋ฉด, ๋‘ ๋กœ๋“œ ์ค‘ (์ตœ์†Œํ•œ) ํ•˜๋‚˜๋Š” 1 ์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  1651. ๋ฐ˜๋ฉด์—, ์‹ค์ œ ๊นจ์šฐ๊ธฐ๊ฐ€ ํ–‰ํ•ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋‘ ๋กœ๋“œ ๋ชจ๋‘ 0์„ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  1652. wake_up_process() ๋Š” ํ•ญ์ƒ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฐ๋ฆฌ์–ด ์—ญ์‹œ
  1653. ํƒœ์Šคํฌ ์ƒํƒœ๊ฐ€ ์ ‘๊ทผ๋˜๊ธฐ ์ „์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์•ž์˜ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ wake_up() ์ด
  1654. wake_up_process() ๋กœ ๋Œ€์ฒด๋œ๋‹ค๋ฉด ๋‘ ๋กœ๋“œ ์ค‘ ํ•˜๋‚˜๋Š” 1์„ ๋ณผ ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  1655. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊นจ์šฐ๊ธฐ๋ฅ˜ ํ•จ์ˆ˜๋“ค๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  1656. complete();
  1657. wake_up();
  1658. wake_up_all();
  1659. wake_up_bit();
  1660. wake_up_interruptible();
  1661. wake_up_interruptible_all();
  1662. wake_up_interruptible_nr();
  1663. wake_up_interruptible_poll();
  1664. wake_up_interruptible_sync();
  1665. wake_up_interruptible_sync_poll();
  1666. wake_up_locked();
  1667. wake_up_locked_poll();
  1668. wake_up_nr();
  1669. wake_up_poll();
  1670. wake_up_process();
  1671. ๋ฉ”๋ชจ๋ฆฌ ์ˆœ์„œ๊ทœ์น™ ๊ด€์ ์—์„œ, ์ด ํ•จ์ˆ˜๋“ค์€ ๋ชจ๋‘ wake_up() ๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๋ณด๋‹ค ๊ฐ•ํ•œ ์ˆœ์„œ
  1672. ๋ณด์žฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  1673. [!] ์ž ์žฌ์šฐ๋Š” ์ฝ”๋“œ์™€ ๊นจ์šฐ๋Š” ์ฝ”๋“œ์— ๋‚ดํฌ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋“ค์€ ๊นจ์šฐ๊ธฐ ์ „์—
  1674. ์ด๋ฃจ์–ด์ง„ ์Šคํ† ์–ด๋ฅผ ์ž ์žฌ์šฐ๋Š” ์ฝ”๋“œ๊ฐ€ set_current_state() ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์— ํ–‰ํ•˜๋Š”
  1675. ๋กœ๋“œ์— ๋Œ€ํ•ด ์ˆœ์„œ๋ฅผ ๋งž์ถ”์ง€ _์•Š๋Š”๋‹ค๋Š”_ ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž ์žฌ์šฐ๋Š”
  1676. ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๊ณ :
  1677. set_current_state(TASK_INTERRUPTIBLE);
  1678. if (event_indicated)
  1679. break;
  1680. __set_current_state(TASK_RUNNING);
  1681. do_something(my_data);
  1682. ๊นจ์šฐ๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด:
  1683. my_data = value;
  1684. event_indicated = 1;
  1685. wake_up(&event_wait_queue);
  1686. event_indecated ์—์˜ ๋ณ€๊ฒฝ์ด ์ž ์žฌ์šฐ๋Š” ์ฝ”๋“œ์—๊ฒŒ my_data ์—์˜ ๋ณ€๊ฒฝ ํ›„์— ์ด๋ฃจ์–ด์ง„
  1687. ๊ฒƒ์œผ๋กœ ์ธ์ง€๋  ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์–‘์ชฝ ์ฝ”๋“œ ๋ชจ๋‘ ๊ฐ๊ฐ์˜
  1688. ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์‚ฌ์ด์— ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ง์ ‘ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ž์˜ ์žฌ์šฐ๋Š”
  1689. ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด:
  1690. set_current_state(TASK_INTERRUPTIBLE);
  1691. if (event_indicated) {
  1692. smp_rmb();
  1693. do_something(my_data);
  1694. }
  1695. ๊ทธ๋ฆฌ๊ณ  ๊นจ์šฐ๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  1696. my_data = value;
  1697. smp_wmb();
  1698. event_indicated = 1;
  1699. wake_up(&event_wait_queue);
  1700. ๊ทธ์™ธ์˜ ํ•จ์ˆ˜๋“ค
  1701. -------------
  1702. ๊ทธ์™ธ์˜ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜๋Š” ํ•จ์ˆ˜๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  1703. (*) schedule() ๊ณผ ๊ทธ ์œ ์‚ฌํ•œ ๊ฒƒ๋“ค์ด ์™„์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•ฉ๋‹ˆ๋‹ค.
  1704. ==============================
  1705. CPU ๊ฐ„ ACQUIRING ๋ฐฐ๋ฆฌ์–ด์˜ ํšจ๊ณผ
  1706. ==============================
  1707. SMP ์‹œ์Šคํ…œ์—์„œ์˜ ๋ฝ ๊ธฐ๋Šฅ๋“ค์€ ๋”์šฑ ๊ฐ•๋ ฅํ•œ ํ˜•ํƒœ์˜ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: ์ด
  1708. ๋ฐฐ๋ฆฌ์–ด๋Š” ๋™์ผํ•œ ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ CPU ๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์ˆœ์„œ์—๋„ ์˜ํ–ฅ์„
  1709. ๋ผ์นฉ๋‹ˆ๋‹ค.
  1710. ACQUIRE VS ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค
  1711. ------------------------
  1712. ๋‹ค์Œ์˜ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค: ์‹œ์Šคํ…œ์€ ๋‘๊ฐœ์˜ ์Šคํ•€๋ฝ (M) ๊ณผ (Q), ๊ทธ๋ฆฌ๊ณ  ์„ธ๊ฐœ์˜ CPU
  1713. ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค; ์—ฌ๊ธฐ์— ๋‹ค์Œ์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:
  1714. CPU 1 CPU 2
  1715. =============================== ===============================
  1716. WRITE_ONCE(*A, a); WRITE_ONCE(*E, e);
  1717. ACQUIRE M ACQUIRE Q
  1718. WRITE_ONCE(*B, b); WRITE_ONCE(*F, f);
  1719. WRITE_ONCE(*C, c); WRITE_ONCE(*G, g);
  1720. RELEASE M RELEASE Q
  1721. WRITE_ONCE(*D, d); WRITE_ONCE(*H, h);
  1722. *A ๋กœ์˜ ์•ก์„ธ์Šค๋ถ€ํ„ฐ *H ๋กœ์˜ ์•ก์„ธ์Šค๊นŒ์ง€๊ฐ€ ์–ด๋–ค ์ˆœ์„œ๋กœ CPU 3 ์—๊ฒŒ ๋ณด์—ฌ์งˆ์ง€์—
  1723. ๋Œ€ํ•ด์„œ๋Š” ๊ฐ CPU ์—์„œ์˜ ๋ฝ ์‚ฌ์šฉ์— ์˜ํ•ด ๋‚ดํฌ๋˜์–ด ์žˆ๋Š” ์ œ์•ฝ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์–ด๋–ค
  1724. ๋ณด์žฅ๋„ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, CPU 3 ์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋ณด์—ฌ์ง€๋Š”
  1725. ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:
  1726. *E, ACQUIRE M, ACQUIRE Q, *G, *C, *F, *A, *B, RELEASE Q, *D, *H, RELEASE M
  1727. ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ด์ง€๋Š” ์•Š์„ ๊ฒ๋‹ˆ๋‹ค:
  1728. *B, *C or *D preceding ACQUIRE M
  1729. *A, *B or *C following RELEASE M
  1730. *F, *G or *H preceding ACQUIRE Q
  1731. *E, *F or *G following RELEASE Q
  1732. =========================
  1733. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ณณ
  1734. =========================
  1735. ์„ค๋ น SMP ์ปค๋„์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”
  1736. ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์งˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ‰๋ฒ”ํ•œ ์‹œ์Šคํ…œ ์šด์˜์ค‘์— ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜ ์žฌ๋ฐฐ์น˜๋Š”
  1737. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์žฌ๋ฐฐ์น˜๊ฐ€ ๋ฌธ์ œ๊ฐ€ _๋  ์ˆ˜ ์žˆ๋Š”_ ๋„ค๊ฐ€์ง€
  1738. ํ™˜๊ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  1739. (*) ํ”„๋กœ์„ธ์„œ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ.
  1740. (*) ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜.
  1741. (*) ๋””๋ฐ”์ด์Šค ์•ก์„ธ์Šค.
  1742. (*) ์ธํ„ฐ๋ŸฝํŠธ.
  1743. ํ”„๋กœ์„ธ์„œ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ
  1744. --------------------
  1745. ๋‘๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์„œ๋ฅผ ๊ฐ€์ง„ ์‹œ์Šคํ…œ์ด ์žˆ๋‹ค๋ฉด, ์‹œ์Šคํ…œ์˜ ๋‘๊ฐœ ์ด์ƒ์˜ CPU ๋Š” ๋™์‹œ์—
  1746. ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ณ ,
  1747. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ผ๋ฐ˜์  ๋ฐฉ๋ฒ•์€ ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฝ์€ ์ƒ๋‹นํžˆ
  1748. ๋น„์šฉ์ด ๋น„์‹ธ์„œ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ
  1749. ๊ฒฝ์šฐ, ๋‘ CPU ๋ชจ๋‘์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์˜ค๋™์ž‘์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‹ ์ค‘ํ•˜๊ฒŒ
  1750. ์ˆœ์„œ๊ฐ€ ๋งž์ถฐ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1751. ์˜ˆ๋ฅผ ๋“ค์–ด, R/W ์„ธ๋งˆํฌ์–ด์˜ ๋Š๋ฆฐ ์ˆ˜ํ–‰๊ฒฝ๋กœ (slow path) ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.
  1752. ์„ธ๋งˆํฌ์–ด๋ฅผ ์œ„ํ•ด ๋Œ€๊ธฐ๋ฅผ ํ•˜๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์˜ ์Šคํƒ ์ค‘ ์ผ๋ถ€๋ฅผ ์ด
  1753. ์„ธ๋งˆํฌ์–ด์˜ ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ์— ๋งํฌํ•œ ์ฑ„๋กœ ์žˆ์Šต๋‹ˆ๋‹ค:
  1754. struct rw_semaphore {
  1755. ...
  1756. spinlock_t lock;
  1757. struct list_head waiters;
  1758. };
  1759. struct rwsem_waiter {
  1760. struct list_head list;
  1761. struct task_struct *task;
  1762. };
  1763. ํŠน์ • ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นจ์šฐ๊ธฐ ์œ„ํ•ด, up_read() ๋‚˜ up_write() ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ
  1764. ๊ฐ™์€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค:
  1765. (1) ๋‹ค์Œ ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค ๋ ˆ์ฝ”๋“œ๋Š” ์–ด๋””์žˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ์ด ๋Œ€๊ธฐ ์ƒํƒœ
  1766. ํ”„๋กœ์„ธ์Šค ๋ ˆ์ฝ”๋“œ์˜ next ํฌ์ธํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค;
  1767. (2) ์ด ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค์˜ task ๊ตฌ์กฐ์ฒด๋กœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค;
  1768. (3) ์ด ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„ธ๋งˆํฌ์–ด๋ฅผ ํš๋“ํ–ˆ์Œ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด task
  1769. ํฌ์ธํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค;
  1770. (4) ํ•ด๋‹น ํƒœ์Šคํฌ์— ๋Œ€ํ•ด wake_up_process() ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค; ๊ทธ๋ฆฌ๊ณ 
  1771. (5) ํ•ด๋‹น ๋Œ€๊ธฐ ์ƒํƒœ ํ”„๋กœ์„ธ์Šค์˜ task ๊ตฌ์กฐ์ฒด๋ฅผ ์žก๊ณ  ์žˆ๋˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
  1772. ๋‹ฌ๋ฆฌ ๋งํ•˜์ž๋ฉด, ๋‹ค์Œ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  1773. LOAD waiter->list.next;
  1774. LOAD waiter->task;
  1775. STORE waiter->task;
  1776. CALL wakeup
  1777. RELEASE task
  1778. ๊ทธ๋ฆฌ๊ณ  ์ด ์ด๋ฒคํŠธ๋“ค์ด ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด, ์˜ค๋™์ž‘์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1779. ํ•œ๋ฒˆ ์„ธ๋งˆํฌ์–ด์˜ ๋Œ€๊ธฐ์ค„์— ๋“ค์–ด๊ฐ”๊ณ  ์„ธ๋งˆํฌ์–ด ๋ฝ์„ ๋†“์•˜๋‹ค๋ฉด, ํ•ด๋‹น ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค๋Š”
  1780. ๋ฝ์„ ๋‹ค์‹œ๋Š” ์žก์ง€ ์•Š์Šต๋‹ˆ๋‹ค; ๋Œ€์‹  ์ž์‹ ์˜ task ํฌ์ธํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  1781. ๊ทธ ๋ ˆ์ฝ”๋“œ๋Š” ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค์˜ ์Šคํƒ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ์ŠคํŠธ์˜ next ํฌ์ธํ„ฐ๊ฐ€ ์ฝํ˜€์ง€๊ธฐ
  1782. _์ „์—_ task ํฌ์ธํ„ฐ๊ฐ€ ์ง€์›Œ์ง„๋‹ค๋ฉด, ๋‹ค๋ฅธ CPU ๋Š” ํ•ด๋‹น ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ด ๋ฒ„๋ฆฌ๊ณ 
  1783. up*() ํ•จ์ˆ˜๊ฐ€ next ํฌ์ธํ„ฐ๋ฅผ ์ฝ๊ธฐ ์ „์— ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค์˜ ์Šคํƒ์„ ๋งˆ๊ตฌ ๊ฑด๋“œ๋ฆด ์ˆ˜
  1784. ์žˆ์Šต๋‹ˆ๋‹ค.
  1785. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์œ„์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค์— ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณด์ฃ :
  1786. CPU 1 CPU 2
  1787. =============================== ===============================
  1788. down_xxx()
  1789. Queue waiter
  1790. Sleep
  1791. up_yyy()
  1792. LOAD waiter->task;
  1793. STORE waiter->task;
  1794. Woken up by other event
  1795. <preempt>
  1796. Resume processing
  1797. down_xxx() returns
  1798. call foo()
  1799. foo() clobbers *waiter
  1800. </preempt>
  1801. LOAD waiter->list.next;
  1802. --- OOPS ---
  1803. ์ด ๋ฌธ์ œ๋Š” ์„ธ๋งˆํฌ์–ด ๋ฝ์˜ ์‚ฌ์šฉ์œผ๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๊นจ์–ด๋‚œ ํ›„์—
  1804. down_xxx() ํ•จ์ˆ˜๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์Šคํ•€๋ฝ์„ ๋˜๋‹ค์‹œ ์–ป์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  1805. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฒ”์šฉ SMP ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค:
  1806. LOAD waiter->list.next;
  1807. LOAD waiter->task;
  1808. smp_mb();
  1809. STORE waiter->task;
  1810. CALL wakeup
  1811. RELEASE task
  1812. ์ด ๊ฒฝ์šฐ์—, ๋ฐฐ๋ฆฌ์–ด๋Š” ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ CPU ๋“ค์—๊ฒŒ ๋ชจ๋“  ๋ฐฐ๋ฆฌ์–ด ์•ž์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๊ฐ€
  1813. ๋ฐฐ๋ฆฌ์–ด ๋’ค์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ณด๋‹ค ์•ž์„œ ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฐฐ๋ฆฌ์–ด ์•ž์˜
  1814. ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋“ค์ด ๋ฐฐ๋ฆฌ์–ด ๋ช…๋ น ์ž์ฒด๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ๊นŒ์ง€ ์™„๋ฃŒ๋œ๋‹ค๊ณ ๋Š” ๋ณด์žฅํ•˜์ง€
  1815. _์•Š์Šต๋‹ˆ๋‹ค_.
  1816. (์ด๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„) ๋‹จ์ผ ํ”„๋กœ์„ธ์„œ ์‹œ์Šคํ…œ์—์„œ smp_mb() ๋Š” ์‹ค์ œ๋กœ๋Š” ๊ทธ์ €
  1817. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ CPU ์•ˆ์—์„œ์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š๊ณ  ์ฃผ์–ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ๋ช…๋ น์„
  1818. ๋‚ด๋ฆฌ๋„๋ก ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฐ๋ฆฌ์–ด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์˜ค์ง ํ•˜๋‚˜์˜ CPU ๋งŒ ์žˆ์œผ๋‹ˆ, CPU ์˜
  1819. ์˜์กด์„ฑ ์ˆœ์„œ ๋กœ์ง์ด ๊ทธ ์™ธ์˜ ๋ชจ๋“ ๊ฒƒ์„ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•  ๊ฒ๋‹ˆ๋‹ค.
  1820. ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜
  1821. -----------------
  1822. ์–ดํ† ๋ฏน ์˜คํผ๋ ˆ์ด์…˜์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ํ”„๋กœ์„ธ์„œ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ๋ถ„๋ฅ˜๋˜๋ฉฐ ๊ทธ ์ค‘ ์ผ๋ถ€๋Š”
  1823. ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๋‚ดํฌํ•˜๊ณ  ๋˜ ์ผ๋ถ€๋Š” ๋‚ดํฌํ•˜์ง€ ์•Š์ง€๋งŒ, ์ปค๋„์—์„œ ์ƒ๋‹นํžˆ
  1824. ์˜์กด์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
  1825. ๋” ๋งŽ์€ ๋‚ด์šฉ์„ ์œ„ํ•ด์„  Documentation/atomic_t.txt ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  1826. ๋””๋ฐ”์ด์Šค ์•ก์„ธ์Šค
  1827. ---------------
  1828. ๋งŽ์€ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ๊ธฐ๋ฒ•์œผ๋กœ ์ œ์–ด๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ์ œ์–ด๋˜๋Š”
  1829. ๋””๋ฐ”์ด์Šค๋Š” CPU ์—๋Š” ๋‹จ์ง€ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ์ง‘ํ•ฉ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„๋Š”
  1830. ๊ทธ๋Ÿฐ ๋””๋ฐ”์ด์Šค๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ •ํ™•ํžˆ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ
  1831. ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1832. ํ•˜์ง€๋งŒ, ์•ก์„ธ์Šค๋“ค์„ ์žฌ๋ฐฐ์น˜ ํ•˜๊ฑฐ๋‚˜ ์กฐํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉํ•˜๋Š”๊ฒŒ ๋” ํšจ์œจ์ ์ด๋ผ ํŒ๋‹จํ•˜๋Š”
  1833. ์˜๋ฆฌํ•œ CPU ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ๋“œ๋ผ์ด๋ฒ„ ์ฝ”๋“œ์˜ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ˆœ์„œ ๋งž์ถฐ์ง„
  1834. ์•ก์„ธ์Šค๋“ค์ด ๋””๋ฐ”์ด์Šค์—๋Š” ์š”์ฒญ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋„์ฐฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” - ๋””๋ฐ”์ด์Šค๊ฐ€
  1835. ์˜ค๋™์ž‘์„ ํ•˜๊ฒŒ ํ•  - ์ž ์žฌ์  ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1836. ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๋‚ด๋ถ€์—์„œ, I/O ๋Š” ์–ด๋–ป๊ฒŒ ์•ก์„ธ์Šค๋“ค์„ ์ ์ ˆํžˆ ์ˆœ์ฐจ์ ์ด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€
  1837. ์•Œ๊ณ  ์žˆ๋Š”, - inb() ๋‚˜ writel() ๊ณผ ๊ฐ™์€ - ์ ์ ˆํ•œ ์•ก์„ธ์Šค ๋ฃจํ‹ด์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ ธ์•ผ๋งŒ
  1838. ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ๋ช…์‹œ์  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ํ•„์š”๊ฐ€
  1839. ์—†์Šต๋‹ˆ๋‹ค๋งŒ, ์™„ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์†์„ฑ์œผ๋กœ I/O ๋ฉ”๋ชจ๋ฆฌ ์œˆ๋„์šฐ๋กœ์˜ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด
  1840. ์•ก์„ธ์Šค ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ์ˆœ์„œ๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด _mandatory_ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€
  1841. ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  1842. ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  Documentation/driver-api/device-io.rst ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  1843. ์ธํ„ฐ๋ŸฝํŠธ
  1844. --------
  1845. ๋“œ๋ผ์ด๋ฒ„๋Š” ์ž์‹ ์˜ ์ธํ„ฐ๋ŸฝํŠธ ์„œ๋น„์Šค ๋ฃจํ‹ด์— ์˜ํ•ด ์ธํ„ฐ๋ŸฝํŠธ ๋‹นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
  1846. ๋“œ๋ผ์ด๋ฒ„์˜ ์ด ๋‘ ๋ถ€๋ถ„์€ ์„œ๋กœ์˜ ๋””๋ฐ”์ด์Šค ์ œ์–ด ๋˜๋Š” ์•ก์„ธ์Šค ๋ถ€๋ถ„๊ณผ ์ƒํ˜ธ ๊ฐ„์„ญํ•  ์ˆ˜
  1847. ์žˆ์Šต๋‹ˆ๋‹ค.
  1848. ์Šค์Šค๋กœ์—๊ฒŒ ์ธํ„ฐ๋ŸฝํŠธ ๋‹นํ•˜๋Š” ๊ฑธ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ , ๋“œ๋ผ์ด๋ฒ„์˜ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ
  1849. ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ๋ชจ๋‘ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ ์˜์—ญ์— ์ง‘์–ด๋„ฃ๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ฐฉ๋ฒ• (๋ฝ์˜
  1850. ํ•œ ํ˜•ํƒœ) ์œผ๋กœ ์ด๋Ÿฐ ์ƒํ˜ธ ๊ฐ„์„ญ์„ - ์ตœ์†Œํ•œ ๋ถ€๋ถ„์ ์œผ๋กœ๋ผ๋„ - ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1851. ๋“œ๋ผ์ด๋ฒ„์˜ ์ธํ„ฐ๋ŸฝํŠธ ๋ฃจํ‹ด์ด ์‹คํ–‰ ์ค‘์ธ ๋™์•ˆ, ํ•ด๋‹น ๋“œ๋ผ์ด๋ฒ„์˜ ์ฝ”์–ด๋Š” ๊ฐ™์€ CPU ์—์„œ
  1852. ์ˆ˜ํ–‰๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ, ํ˜„์žฌ์˜ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ์ค‘์—๋Š” ๋˜๋‹ค์‹œ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€
  1853. ์ผ์–ด๋‚˜์ง€ ๋ชปํ•˜๋„๋ก ๋˜์–ด ์žˆ์œผ๋‹ˆ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ทธ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฝ์„ ์žก์ง€ ์•Š์•„๋„
  1854. ๋ฉ๋‹ˆ๋‹ค.
  1855. ํ•˜์ง€๋งŒ, ์–ด๋“œ๋ ˆ์Šค ๋ ˆ์ง€์Šคํ„ฐ์™€ ๋ฐ์ดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ–๋Š” ์ด๋”๋„ท ์นด๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š”
  1856. ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค. ๋งŒ์•ฝ ์ด ๋“œ๋ผ์ด๋ฒ„์˜ ์ฝ”์–ด๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”์‹œํ‚จ
  1857. ์ฑ„๋กœ ์ด๋”๋„ท ์นด๋“œ์™€ ๋Œ€ํ™”ํ•˜๊ณ  ๋“œ๋ผ์ด๋ฒ„์˜ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค๋ฉด:
  1858. LOCAL IRQ DISABLE
  1859. writew(ADDR, 3);
  1860. writew(DATA, y);
  1861. LOCAL IRQ ENABLE
  1862. <interrupt>
  1863. writew(ADDR, 4);
  1864. q = readw(DATA);
  1865. </interrupt>
  1866. ๋งŒ์•ฝ ์ˆœ์„œ ๊ทœ์น™์ด ์ถฉ๋ถ„ํžˆ ์™„ํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ์—์˜ ์Šคํ† ์–ด๋Š” ์–ด๋“œ๋ ˆ์Šค
  1867. ๋ ˆ์ง€์Šคํ„ฐ์— ๋‘๋ฒˆ์งธ๋กœ ํ–‰ํ•ด์ง€๋Š” ์Šคํ† ์–ด ๋’ค์— ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
  1868. STORE *ADDR = 3, STORE *ADDR = 4, STORE *DATA = y, q = LOAD *DATA
  1869. ๋งŒ์•ฝ ์ˆœ์„œ ๊ทœ์น™์ด ์ถฉ๋ถ„ํžˆ ์™„ํ™”๋˜์–ด ์žˆ๊ณ  ๋ฌต์‹œ์ ์œผ๋กœ๋“  ๋ช…์‹œ์ ์œผ๋กœ๋“  ๋ฐฐ๋ฆฌ์–ด๊ฐ€
  1870. ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ์„น์…˜์—์„œ ์ผ์–ด๋‚œ ์•ก์„ธ์Šค๊ฐ€ ๋ฐ”๊นฅ์œผ๋กœ ์ƒˆ์–ด์„œ
  1871. ์ธํ„ฐ๋ŸฝํŠธ ๋‚ด์—์„œ ์ผ์–ด๋‚œ ์•ก์„ธ์Šค์™€ ์„ž์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  - ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ˜๋Œ€๋„ - ๊ฐ€์ •ํ•ด์•ผ๋งŒ
  1872. ํ•ฉ๋‹ˆ๋‹ค.
  1873. ๊ทธ๋Ÿฐ ์˜์—ญ ์•ˆ์—์„œ ์ผ์–ด๋‚˜๋Š” I/O ์•ก์„ธ์Šค๋Š” ๋ฌต์‹œ์  I/O ๋ฐฐ๋ฆฌ์–ด๋ฅผ ํ˜•์„ฑํ•˜๋Š”, ์—„๊ฒฉํ•œ
  1874. ์ˆœ์„œ ๊ทœ์น™์˜ I/O ๋ ˆ์ง€์Šคํ„ฐ๋กœ์˜ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜์„ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ๋Š”
  1875. ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1876. ํ•˜๋‚˜์˜ ์ธํ„ฐ๋ŸฝํŠธ ๋ฃจํ‹ด๊ณผ ๋ณ„๋„์˜ CPU ์—์„œ ์ˆ˜ํ–‰์ค‘์ด๋ฉฐ ์„œ๋กœ ํ†ต์‹ ์„ ํ•˜๋Š” ๋‘ ๋ฃจํ‹ด
  1877. ์‚ฌ์ด์—๋„ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด
  1878. ์žˆ๋‹ค๋ฉด, ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑํ™” ๋ฝ์ด ์‚ฌ์šฉ๋˜์–ด์ ธ์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  1879. ======================
  1880. ์ปค๋„ I/O ๋ฐฐ๋ฆฌ์–ด์˜ ํšจ๊ณผ
  1881. ======================
  1882. I/O ์•ก์„ธ์Šค๋ฅผ ํ†ตํ•œ ์ฃผ๋ณ€์žฅ์น˜์™€์˜ ํ†ต์‹ ์€ ์•„ํ‚คํ…์ณ์™€ ๊ธฐ๊ธฐ์— ๋งค์šฐ ์ข…์†์ ์ž…๋‹ˆ๋‹ค.
  1883. ๋”ฐ๋ผ์„œ, ๋ณธ์งˆ์ ์œผ๋กœ ์ด์‹์„ฑ์ด ์—†๋Š” ๋“œ๋ผ์ด๋ฒ„๋Š” ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ
  1884. ๋™๊ธฐํ™”๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ž์˜ ํƒ€๊ฒŸ ์‹œ์Šคํ…œ์˜ ํŠน์ • ๋™์ž‘์— ์˜์กดํ•  ๊ฒ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ
  1885. ์•„ํ‚คํ…์ณ์™€ ๋ฒ„์Šค ๊ตฌํ˜„์— ์ด์‹์„ฑ์„ ๊ฐ€์ง€๋ ค ํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์œ„ํ•ด, ์ปค๋„์€ ๋‹ค์–‘ํ•œ
  1886. ์ •๋„์˜ ์ˆœ์„œ ๋ณด์žฅ์„ ์ œ๊ณตํ•˜๋Š” ์ผ๋ จ์˜ ์•ก์„ธ์Šค ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  1887. (*) readX(), writeX():
  1888. readX() ์™€ writeX() MMIO ์•ก์„ธ์Šค ํ•จ์ˆ˜๋Š” ์ ‘๊ทผ๋˜๋Š” ์ฃผ๋ณ€์žฅ์น˜๋กœ์˜ ํฌ์ธํ„ฐ๋ฅผ
  1889. __iomem * ํŒจ๋Ÿฌ๋ฏธํ„ฐ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋””ํดํŠธ I/O ๊ธฐ๋Šฅ์œผ๋กœ ๋งคํ•‘๋˜๋Š” ํฌ์ธํ„ฐ
  1890. (์˜ˆ: ioremap() ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ) ์˜ ์ˆœ์„œ ๋ณด์žฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  1891. 1. ๊ฐ™์€ ์ฃผ๋ณ€์žฅ์น˜๋กœ์˜ ๋ชจ๋“  readX() ์™€ writeX() ์•ก์„ธ์Šค๋Š” ๊ฐ์ž์— ๋Œ€ํ•ด
  1892. ์ˆœ์„œ์ง€์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ™์€ CPU ์“ฐ๋ ˆ๋“œ์— ์˜ํ•œ ํŠน์ • ๋””๋ฐ”์ด์Šค๋กœ์˜ MMIO
  1893. ๋ ˆ์ง€์Šคํ„ฐ ์•ก์„ธ์Šค๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์ˆœ์„œ๋Œ€๋กœ ๋„์ฐฉํ•  ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  1894. 2. ํ•œ ์Šคํ•€๋ฝ์„ ์žก์€ CPU ์“ฐ๋ ˆ๋“œ์— ์˜ํ•œ writeX() ๋Š” ๊ฐ™์€ ์Šคํ•€๋ฝ์„ ๋‚˜์ค‘์—
  1895. ์žก์€ ๋‹ค๋ฅธ CPU ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด ๊ฐ™์€ ์ฃผ๋ณ€์žฅ์น˜๋ฅผ ํ–ฅํ•ด ํ˜ธ์ถœ๋œ writeX()
  1896. ์•ž์œผ๋กœ ์ˆœ์„œ์ง€์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋Š” ์Šคํ•€๋ฝ์„ ์žก์€ ์ฑ„ ํŠน์ • ๋””๋ฐ”์ด์Šค๋ฅผ ํ–ฅํ•ด
  1897. ํ˜ธ์ถœ๋œ MMIO ๋ ˆ์ง€์Šคํ„ฐ ์“ฐ๊ธฐ๋Š” ํ•ด๋‹น ๋ฝ์˜ ํš๋“์— ์ผ๊ด€์ ์ธ ์ˆœ์„œ๋กœ ๋„๋‹ฌํ• 
  1898. ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  1899. 3. ํŠน์ • ์ฃผ๋ณ€์žฅ์น˜๋ฅผ ํ–ฅํ•œ ํŠน์ • CPU ์“ฐ๋ ˆ๋“œ์˜ writeX() ๋Š” ๋จผ์ € ํ•ด๋‹น
  1900. ์“ฐ๋ ˆ๋“œ๋กœ ์ „ํŒŒ๋˜๋Š”, ๋˜๋Š” ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด ์š”์ฒญ๋œ ๋ชจ๋“  ์•ž์„  ๋ฉ”๋ชจ๋ฆฌ
  1901. ์“ฐ๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋จผ์ € ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” dma_alloc_coherent()
  1902. ๋ฅผ ํ†ตํ•ด ํ• ๋‹น๋œ ์ „์†ก์šฉ DMA ๋ฒ„ํผ๋กœ์˜ ํ•ด๋‹น CPU ์˜ ์“ฐ๊ธฐ๊ฐ€ ์ด CPU ๊ฐ€ ์ด
  1903. ์ „์†ก์„ ์‹œ์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•ด MMIO ์ปจํŠธ๋กค ๋ ˆ์ง€์Šคํ„ฐ์— ์“ฐ๊ธฐ๋ฅผ ํ•  ๋•Œ DMA
  1904. ์—”์ง„์— ๋ณด์—ฌ์งˆ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  1905. 4. ํŠน์ • CPU ์“ฐ๋ ˆ๋“œ์— ์˜ํ•œ ์ฃผ๋ณ€์žฅ์น˜๋กœ์˜ readX() ๋Š” ๊ฐ™์€ ์“ฐ๋ ˆ๋“œ์— ์˜ํ•œ
  1906. ๋ชจ๋“  ๋’ค๋”ฐ๋ฅด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ธฐ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š”
  1907. dma_alloc_coherent() ๋ฅผ ํ†ตํ•ด ํ• ๋‹น๋œ ์ˆ˜์‹ ์šฉ DMA ๋ฒ„ํผ๋กœ๋ถ€ํ„ฐ์˜ CPU ์˜
  1908. ์ฝ๊ธฐ๋Š” ์ด DMA ์ˆ˜์‹ ์˜ ์™„๋ฃŒ๋ฅผ ํ‘œ์‹œํ•˜๋Š” DMA ์—”์ง„์˜ MMIO ์ƒํƒœ ๋ ˆ์ง€์Šคํ„ฐ
  1909. ์ฝ๊ธฐ ํ›„์—๋Š” ์˜ค์—ผ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ์•Š์„ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  1910. 5. CPU ์— ์˜ํ•œ ์ฃผ๋ณ€์žฅ์น˜๋กœ์˜ readX() ๋Š” ๋ชจ๋“  ๋’ค๋”ฐ๋ฅด๋Š” delay() ๋ฃจํ”„๊ฐ€
  1911. ์ˆ˜ํ–‰์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” CPU ์˜ ํŠน์ •
  1912. ์ฃผ๋ณ€์žฅ์น˜๋กœ์˜ ๋‘๊ฐœ์˜ MMIO ๋ ˆ์ง€์Šคํ„ฐ ์“ฐ๊ธฐ๊ฐ€ ํ–‰ํ•ด์ง€๋Š”๋ฐ ์ฒซ๋ฒˆ์งธ ์“ฐ๊ธฐ๊ฐ€
  1913. readX() ๋ฅผ ํ†ตํ•ด ๊ณง๋ฐ”๋กœ ์ฝ์–ด์กŒ๊ณ  ์ด์–ด ๋‘๋ฒˆ์งธ writeX() ์ „์— udelay(1)
  1914. ์ด ํ˜ธ์ถœ๋˜์—ˆ๋‹ค๋ฉด ์ด ๋‘๊ฐœ์˜ ์“ฐ๊ธฐ๋Š” ์ตœ์†Œ 1us ์˜ ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ํ–‰ํ•ด์งˆ ๊ฒƒ์„
  1915. ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค:
  1916. writel(42, DEVICE_REGISTER_0); // ๋””๋ฐ”์ด์Šค์— ๋„์ฐฉํ•จ...
  1917. readl(DEVICE_REGISTER_0);
  1918. udelay(1);
  1919. writel(42, DEVICE_REGISTER_1); // ...์ด๊ฒƒ๋ณด๋‹ค ์ตœ์†Œ 1us ์ „์—.
  1920. ๋””ํดํŠธ๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์–ป์–ด์ง€๋Š” __iomem ํฌ์ธํ„ฐ (์˜ˆ: ioremap_wc() ๋ฅผ
  1921. ํ†ตํ•ด ๋ฆฌํ„ด๋˜๋Š” ๊ฒƒ) ์˜ ์ˆœ์„œ ์†์„ฑ์€ ์‹ค์ œ ์•„ํ‚คํ…์ณ์— ์˜์กด์ ์ด์–ด์„œ ์ด๋Ÿฐ
  1922. ์ข…๋ฅ˜์˜ ๋งคํ•‘์œผ๋กœ์˜ ์•ก์„ธ์Šค๋Š” ์•ž์„œ ์„ค๋ช…๋œ ๋ณด์žฅ์‚ฌํ•ญ์— ์˜์กดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  1923. (*) readX_relaxed(), writeX_relaxed()
  1924. ์ด๊ฒƒ๋“ค์€ readX() ์™€ writeX() ๋ž‘ ๋น„์Šทํ•˜์ง€๋งŒ, ๋” ์™„ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์ˆœ์„œ
  1925. ๋ณด์žฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ์ด๊ฒƒ๋“ค์€ ์ผ๋ฐ˜์  ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋‚˜ delay()
  1926. ๋ฃจํ”„ (์˜ˆ:์•ž์˜ 2-5 ํ•ญ๋ชฉ) ์— ๋Œ€ํ•ด ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค๋งŒ ๋””ํดํŠธ I/O
  1927. ๊ธฐ๋Šฅ์œผ๋กœ ๋งคํ•‘๋œ __iomem ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ๋™์ž‘ํ•  ๋•Œ, ๊ฐ™์€ CPU ์“ฐ๋ ˆ๋“œ์— ์˜ํ•œ
  1928. ๊ฐ™์€ ์ฃผ๋ณ€์žฅ์น˜๋กœ์˜ ์•ก์„ธ์Šค์—๋Š” ์ˆœ์„œ๊ฐ€ ๋งž์ถฐ์งˆ ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
  1929. (*) readsX(), writesX():
  1930. readsX() ์™€ writesX() MMIO ์•ก์„ธ์Šค ํ•จ์ˆ˜๋Š” DMA ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์ ์ ˆ์น˜ ์•Š์€,
  1931. ์ฃผ๋ณ€์žฅ์น˜ ๋‚ด์˜ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ฐ˜ FIFO ๋กœ์˜ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด
  1932. ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด ๊ธฐ๋Šฅ๋“ค์€ ์•ž์„œ ์„ค๋ช…๋œ readX_relaxed() ์™€
  1933. writeX_relaxed() ์˜ ์ˆœ์„œ ๋ณด์žฅ๋งŒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  1934. (*) inX(), outX():
  1935. inX() ์™€ outX() ์•ก์„ธ์Šค ํ•จ์ˆ˜๋Š” ์ผ๋ถ€ ์•„ํ‚คํ…์ณ (ํŠนํžˆ x86) ์—์„œ๋Š” ํŠน์ˆ˜ํ•œ
  1936. ๋ช…๋ น์–ด๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฉฐ ํฌํŠธ์— ๋งคํ•‘๋˜๋Š”, ๊ณผ๊ฑฐ์˜ ์œ ์‚ฐ์ธ I/O ์ฃผ๋ณ€์žฅ์น˜๋กœ์˜
  1937. ์ ‘๊ทผ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
  1938. ๋งŽ์€ CPU ์•„ํ‚คํ…์ณ๊ฐ€ ๊ฒฐ๊ตญ์€ ์ด๋Ÿฐ ์ฃผ๋ณ€์žฅ์น˜๋ฅผ ๋‚ด๋ถ€์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘์„
  1939. ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, inX() ์™€ outX() ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ด์‹์„ฑ ์žˆ๋Š” ์ˆœ์„œ
  1940. ๋ณด์žฅ์€ ๋””ํดํŠธ I/O ๊ธฐ๋Šฅ์„ ํ†ตํ•œ ๋งคํ•‘์„ ์ ‘๊ทผํ•  ๋•Œ์˜ readX() ์™€ writeX() ์—
  1941. ์˜ํ•ด ์ œ๊ณต๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ๊ฐ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  1942. ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋Š” outX() ๊ฐ€ ๋ฆฌํ„ดํ•˜๊ธฐ ์ „์— ํ•ด๋‹น I/O ์ฃผ๋ณ€์žฅ์น˜๋กœ๋ถ€ํ„ฐ์˜
  1943. ์™„๋ฃŒ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์“ฐ๊ธฐ ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค๊ณ  ๊ธฐ๋Œ€ํ•  ์ˆ˜๋„
  1944. ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์•„ํ‚คํ…์ณ์—์„œ ๋ณด์žฅ๋˜์ง€๋Š” ์•Š๊ณ , ๋”ฐ๋ผ์„œ ์ด์‹์„ฑ ์žˆ๋Š”
  1945. ์ˆœ์„œ ๊ทœ์น™์˜ ์ผ๋ถ€๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค.
  1946. (*) insX(), outsX():
  1947. ์•ž์—์„œ์™€ ๊ฐ™์ด, insX() ์™€ outsX() ์•ก์„ธ์Šค ํ•จ์ˆ˜๋Š” ๋””ํดํŠธ I/O ๊ธฐ๋Šฅ์„ ํ†ตํ•œ
  1948. ๋งคํ•‘์„ ์ ‘๊ทผํ•  ๋•Œ ๊ฐ๊ฐ readX() ์™€ writeX() ์™€ ๊ฐ™์€ ์ˆœ์„œ ๋ณด์žฅ์„
  1949. ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  1950. (*) ioreadX(), iowriteX()
  1951. ์ด๊ฒƒ๋“ค์€ inX()/outX() ๋‚˜ readX()/writeX() ์ฒ˜๋Ÿผ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์•ก์„ธ์Šค์˜
  1952. ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ์ˆ˜ํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  1953. String ์•ก์„ธ์Šค ํ•จ์ˆ˜ (insX(), outsX(), readsX() ๊ทธ๋ฆฌ๊ณ  writesX()) ์˜ ์˜ˆ์™ธ๋ฅผ
  1954. ์ œ์™ธํ•˜๊ณ ๋Š”, ์•ž์˜ ๋ชจ๋“  ๊ฒƒ์ด ์•„๋žซ๋‹จ์˜ ์ฃผ๋ณ€์žฅ์น˜๊ฐ€ little-endian ์ด๋ผ ๊ฐ€์ •ํ•˜๋ฉฐ,
  1955. ๋”ฐ๋ผ์„œ big-endian ์•„ํ‚คํ…์ณ์—์„œ๋Š” byte-swapping ์˜คํผ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  1956. ===================================
  1957. ๊ฐ€์ •๋˜๋Š” ๊ฐ€์žฅ ์™„ํ™”๋œ ์‹คํ–‰ ์ˆœ์„œ ๋ชจ๋ธ
  1958. ===================================
  1959. ์ปจ์…‰์ ์œผ๋กœ CPU ๋Š” ์ฃผ์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ํ”„๋กœ๊ทธ๋žจ ๊ทธ ์ž์ฒด์—๋Š” ์ธ๊ณผ์„ฑ (program
  1960. causality) ์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ˆœ์„œ๋ฅผ ๊ฑฐ์˜ ์ง€์ผœ์ฃผ์ง€
  1961. ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •๋˜์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. (i386 ์ด๋‚˜ x86_64 ๊ฐ™์€) ์ผ๋ถ€ CPU ๋“ค์€ ์ฝ”๋“œ
  1962. ์žฌ๋ฐฐ์น˜์— (powerpc ๋‚˜ frv ์™€ ๊ฐ™์€) ๋‹ค๋ฅธ ๊ฒƒ๋“ค์— ๋น„ํ•ด ๊ฐ•ํ•œ ์ œ์•ฝ์„ ๊ฐ–์ง€๋งŒ, ์•„ํ‚คํ…์ณ
  1963. ์ข…์†์  ์ฝ”๋“œ ์ด์™ธ์˜ ์ฝ”๋“œ์—์„œ๋Š” ์ˆœ์„œ์— ๋Œ€ํ•œ ์ œ์•ฝ์ด ๊ฐ€์žฅ ์™„ํ™”๋œ ๊ฒฝ์šฐ (DEC Alpha)
  1964. ๋ฅผ ๊ฐ€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1965. ์ด ๋ง์€, CPU ์—๊ฒŒ ์ฃผ์–ด์ง€๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ŠคํŠธ๋ฆผ ๋‚ด์˜ ํ•œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ์•ž์˜
  1966. ์ธ์ŠคํŠธ๋Ÿญ์…˜์— ์ข…์†์ ์ด๋ผ๋ฉด ์•ž์˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ๋’ค์˜ ์ข…์†์  ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ์‹คํ–‰๋˜๊ธฐ
  1967. ์ „์— ์™„๋ฃŒ[*]๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ (๋‹ฌ๋ฆฌ ๋งํ•ด์„œ, ์ธ๊ณผ์„ฑ์ด ์ง€์ผœ์ง€๋Š” ๊ฒƒ์œผ๋กœ
  1968. ๋ณด์ด๊ฒŒ ํ•จ) ์™ธ์—๋Š” ์ž์‹ ์ด ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ - ์‹ฌ์ง€์–ด ๋ณ‘๋ ฌ์ ์œผ๋กœ๋„ - ๊ทธ ์ŠคํŠธ๋ฆผ์„
  1969. ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค
  1970. [*] ์ผ๋ถ€ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์˜ํ–ฅ - ์กฐ๊ฑด ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พผ๋‹ค๋˜์ง€, ๋ ˆ์ง€์Šคํ„ฐ๋‚˜
  1971. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค๋˜์ง€ - ์„ ๋งŒ๋“ค์–ด๋‚ด๋ฉฐ, ๋‹ค๋ฅธ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ๋‹ค๋ฅธ ํšจ๊ณผ์—
  1972. ์ข…์†์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1973. CPU ๋Š” ์ตœ์ข…์ ์œผ๋กœ ์•„๋ฌด ํšจ๊ณผ๋„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์‹œํ€€์Šค๋Š” ์—†์• ๋ฒ„๋ฆด ์ˆ˜๋„
  1974. ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ ๋‘๊ฐœ์˜ ์—ฐ์†๋˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ๋‘˜ ๋‹ค ๊ฐ™์€ ๋ ˆ์ง€์Šคํ„ฐ์—
  1975. ์ง์ ‘์ ์ธ ๊ฐ’ (immediate value) ์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค๋ฉด, ์ฒซ๋ฒˆ์งธ ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ๋ฒ„๋ ค์งˆ ์ˆ˜๋„
  1976. ์žˆ์Šต๋‹ˆ๋‹ค.
  1977. ๋น„์Šทํ•˜๊ฒŒ, ์ปดํŒŒ์ผ๋Ÿฌ ์—ญ์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ๊ณผ์„ฑ๋งŒ ์ง€์ผœ์ค€๋‹ค๋ฉด ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ŠคํŠธ๋ฆผ์„
  1978. ์ž์‹ ์ด ๋ณด๊ธฐ์— ์˜ฌ๋ฐ”๋ฅด๋‹ค ์ƒ๊ฐ๋˜๋Š”๋Œ€๋กœ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1979. ===============
  1980. CPU ์บ์‹œ์˜ ์˜ํ–ฅ
  1981. ===============
  1982. ์บ์‹œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์ด ์‹œ์Šคํ…œ ์ „์ฒด์— ์–ด๋–ป๊ฒŒ ์ธ์ง€๋˜๋Š”์ง€๋Š” CPU ์™€ ๋ฉ”๋ชจ๋ฆฌ
  1983. ์‚ฌ์ด์— ์กด์žฌํ•˜๋Š” ์บ์‹œ๋“ค, ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ผ๊ด€์„ฑ
  1984. ์‹œ์Šคํ…œ์— ์ƒ๋‹น ๋ถ€๋ถ„ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  1985. ํ•œ CPU ๊ฐ€ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋“ค๊ณผ ์บ์‹œ๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์€
  1986. CPU ์˜ ์บ์‹œ๋“ค์„ ํฌํ•จํ•ด์•ผ ํ•˜๋ฉฐ, CPU ์™€ CPU ์ž์‹ ์˜ ์บ์‹œ ์‚ฌ์ด์—์„œ์˜ ๋™์ž‘์„ ์œ„ํ•œ
  1987. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” ๋‹ค์Œ ๊ทธ๋ฆผ์˜
  1988. ์ ์„ ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค):
  1989. <--- CPU ---> : <----------- Memory ----------->
  1990. :
  1991. +--------+ +--------+ : +--------+ +-----------+
  1992. | | | | : | | | | +--------+
  1993. | CPU | | Memory | : | CPU | | | | |
  1994. | Core |--->| Access |----->| Cache |<-->| | | |
  1995. | | | Queue | : | | | |--->| Memory |
  1996. | | | | : | | | | | |
  1997. +--------+ +--------+ : +--------+ | | | |
  1998. : | Cache | +--------+
  1999. : | Coherency |
  2000. : | Mechanism | +--------+
  2001. +--------+ +--------+ : +--------+ | | | |
  2002. | | | | : | | | | | |
  2003. | CPU | | Memory | : | CPU | | |--->| Device |
  2004. | Core |--->| Access |----->| Cache |<-->| | | |
  2005. | | | Queue | : | | | | | |
  2006. | | | | : | | | | +--------+
  2007. +--------+ +--------+ : +--------+ +-----------+
  2008. :
  2009. :
  2010. ํŠน์ • ๋กœ๋“œ๋‚˜ ์Šคํ† ์–ด๋Š” ํ•ด๋‹น ์˜คํผ๋ ˆ์ด์…˜์„ ์š”์ฒญํ•œ CPU ์˜ ์บ์‹œ ๋‚ด์—์„œ ๋™์ž‘์„ ์™„๋ฃŒํ• 
  2011. ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น CPU ์˜ ๋ฐ”๊นฅ์—๋Š” ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ CPU ๊ฐ€ ๊ด€์‹ฌ์„
  2012. ๊ฐ–๋Š”๋‹ค๋ฉด ์บ์‹œ ์ผ๊ด€์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•ด๋‹น ์บ์‹œ๋ผ์ธ์„ ํ•ด๋‹น CPU ์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ํ•ด๋‹น
  2013. ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•œ ์˜คํผ๋ ˆ์ด์…˜์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ ์˜ํ–ฅ์„ ์ „ํŒŒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น
  2014. ์˜คํผ๋ ˆ์ด์…˜์€ ๋ฉ”๋ชจ๋ฆฌ์— ์‹ค์ œ๋กœ ์•ก์„ธ์Šค๋ฅผ ํ•œ๊ฒƒ์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2015. CPU ์ฝ”์–ด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ๊ณผ์„ฑ์ด ์œ ์ง€๋œ๋‹ค๊ณ ๋งŒ ์—ฌ๊ฒจ์ง„๋‹ค๋ฉด ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์„ ์–ด๋–ค
  2016. ์ˆœ์„œ๋กœ๋“  ์žฌ๋ฐฐ์น˜ํ•ด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์€ ๋กœ๋“œ๋‚˜ ์Šคํ† ์–ด
  2017. ์˜คํผ๋ ˆ์ด์…˜์„ ๋งŒ๋“œ๋Š”๋ฐ ์ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์ดํ›„ ์ˆ˜ํ–‰๋  ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ํ์— ๋“ค์–ด๊ฐ€๊ฒŒ
  2018. ๋ฉ๋‹ˆ๋‹ค. ์ฝ”์–ด๋Š” ์ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ํ•ด๋‹น ํ์— ์–ด๋–ค ์ˆœ์„œ๋กœ๋“  ์›ํ•˜๋Š”๋Œ€๋กœ ๋„ฃ์„ ์ˆ˜
  2019. ์žˆ๊ณ , ๋‹ค๋ฅธ ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ๊ฐ•์ œ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ˆ˜ํ–‰์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
  2020. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ํ•˜๋Š” ์ผ์€ CPU ์ชฝ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ชฝ์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์•ก์„ธ์Šค๋“ค์˜ ์ˆœ์„œ,
  2021. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์•ก์„ธ์Šค์˜ ๊ฒฐ๊ณผ๊ฐ€ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๊ด€์ฐฐ์ž๋“ค์—๊ฒŒ ์ธ์ง€๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๋Š”
  2022. ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2023. [!] CPU ๋“ค์€ ํ•ญ์ƒ ๊ทธ๋“ค ์ž์‹ ์˜ ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋Š” ํ”„๋กœ๊ทธ๋žจ ์ˆœ์„œ๋Œ€๋กœ ์ผ์–ด๋‚œ ๊ฒƒ์œผ๋กœ
  2024. ๋ณด๊ธฐ ๋•Œ๋ฌธ์—, ์ฃผ์–ด์ง„ CPU ๋‚ด์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ _์—†์Šต๋‹ˆ๋‹ค_.
  2025. [!] MMIO ๋‚˜ ๋‹ค๋ฅธ ๋””๋ฐ”์ด์Šค ์•ก์„ธ์Šค๋“ค์€ ์บ์‹œ ์‹œ์Šคํ…œ์„ ์šฐํšŒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐํšŒ
  2026. ์—ฌ๋ถ€๋Š” ๋””๋ฐ”์ด์Šค๊ฐ€ ์•ก์„ธ์Šค ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์œˆ๋„์šฐ์˜ ํŠน์„ฑ์— ์˜ํ•ด ๊ฒฐ์ •๋  ์ˆ˜๋„ ์žˆ๊ณ , CPU
  2027. ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ํ•œ ๋””๋ฐ”์ด์Šค ํ†ต์‹  ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์‚ฌ์šฉ์— ์˜ํ•ด์„œ ๊ฒฐ์ •๋ 
  2028. ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  2029. ์บ์‹œ ์ผ๊ด€์„ฑ VS DMA
  2030. ------------------
  2031. ๋ชจ๋“  ์‹œ์Šคํ…œ์ด DMA ๋ฅผ ํ•˜๋Š” ๋””๋ฐ”์ด์Šค์— ๋Œ€ํ•ด์„œ๊นŒ์ง€ ์บ์‹œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜์ง€๋Š”
  2032. ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ, DMA ๋ฅผ ์‹œ๋„ํ•˜๋Š” ๋””๋ฐ”์ด์Šค๋Š” RAM ์œผ๋กœ๋ถ€ํ„ฐ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ
  2033. ์ฝ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋”ํ‹ฐ ์บ์‹œ ๋ผ์ธ์ด CPU ์˜ ์บ์‹œ์— ๋จธ๋ฌด๋ฅด๊ณ  ์žˆ๊ณ , ๋ฐ”๋€ ๊ฐ’์ด ์•„์ง
  2034. RAM ์— ์จ์ง€์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„ , ์ปค๋„์˜
  2035. ์ ์ ˆํ•œ ๋ถ€๋ถ„์—์„œ ๊ฐ CPU ์บ์‹œ์˜ ๋ฌธ์ œ๋˜๋Š” ๋น„ํŠธ๋“ค์„ ํ”Œ๋Ÿฌ์‹œ (flush) ์‹œ์ผœ์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค
  2036. (๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ๋ฌดํšจํ™” - invalidation - ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ ).
  2037. ๋˜ํ•œ, ๋””๋ฐ”์ด์Šค์— ์˜ํ•ด RAM ์— DMA ๋กœ ์“ฐ์—ฌ์ง„ ๊ฐ’์€ ๋””๋ฐ”์ด์Šค๊ฐ€ ์“ฐ๊ธฐ๋ฅผ ์™„๋ฃŒํ•œ ํ›„์—
  2038. CPU ์˜ ์บ์‹œ์—์„œ RAM ์œผ๋กœ ์“ฐ์—ฌ์ง€๋Š” ๋”ํ‹ฐ ์บ์‹œ ๋ผ์ธ์— ์˜ํ•ด ๋ฎ์–ด์จ์งˆ ์ˆ˜๋„ ์žˆ๊ณ , CPU
  2039. ์˜ ์บ์‹œ์— ์กด์žฌํ•˜๋Š” ์บ์‹œ ๋ผ์ธ์ด ํ•ด๋‹น ์บ์‹œ์—์„œ ์‚ญ์ œ๋˜๊ณ  ๋‹ค์‹œ ๊ฐ’์„ ์ฝ์–ด๋“ค์ด๊ธฐ
  2040. ์ „๊นŒ์ง€๋Š” RAM ์ด ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค ์ž์ฒด๊ฐ€ ์ˆจ๊ฒจ์ ธ ๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด
  2041. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„ , ์ปค๋„์˜ ์ ์ ˆํ•œ ๋ถ€๋ถ„์—์„œ ๊ฐ CPU ์˜ ์บ์‹œ ์•ˆ์˜ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”
  2042. ๋น„ํŠธ๋“ค์„ ๋ฌดํšจํ™” ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2043. ์บ์‹œ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„  Documentation/core-api/cachetlb.rst ๋ฅผ
  2044. ์ฐธ๊ณ ํ•˜์„ธ์š”.
  2045. ์บ์‹œ ์ผ๊ด€์„ฑ VS MMIO
  2046. -------------------
  2047. Memory mapped I/O ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ CPU ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋‚ด์˜ ํ•œ ์œˆ๋„์šฐ์˜ ํŠน์ • ๋ถ€๋ถ„
  2048. ๋‚ด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ญ์— ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ, ์ด ์œˆ๋„์šฐ๋Š” ์ผ๋ฐ˜์ ์ธ, RAM ์œผ๋กœ ํ–ฅํ•˜๋Š”
  2049. ์œˆ๋„์šฐ์™€๋Š” ๋‹ค๋ฅธ ํŠน์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
  2050. ๊ทธ๋Ÿฐ ํŠน์„ฑ ๊ฐ€์šด๋ฐ ํ•˜๋‚˜๋Š”, ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋Ÿฐ ์•ก์„ธ์Šค๋Š” ์บ์‹œ๋ฅผ ์™„์ „ํžˆ ์šฐํšŒํ•˜๊ณ 
  2051. ๋””๋ฐ”์ด์Šค ๋ฒ„์Šค๋กœ ๊ณง๋ฐ”๋กœ ํ–ฅํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ง์€ MMIO ์•ก์„ธ์Šค๋Š” ๋จผ์ €
  2052. ์‹œ์ž‘๋˜์–ด์„œ ์บ์‹œ์—์„œ ์™„๋ฃŒ๋œ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ ์ถ”์›”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ
  2053. ๊ฒฝ์šฐ์—” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„์น˜ ์•Š๊ณ , ๋งŒ์•ฝ ์บ์‹œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์“ฐ๊ธฐ ์˜คํผ๋ ˆ์ด์…˜๊ณผ
  2054. MMIO ์•ก์„ธ์Šค๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์˜์กด์ ์ด๋ผ๋ฉด ํ•ด๋‹น ์บ์‹œ๋Š” ๋‘ ์˜คํผ๋ ˆ์ด์…˜ ์‚ฌ์ด์—
  2055. ๋น„์›Œ์ ธ(flush)์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  2056. ======================
  2057. CPU ๋“ค์ด ์ €์ง€๋ฅด๋Š” ์ผ๋“ค
  2058. ======================
  2059. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” CPU ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ์ •ํ™•ํžˆ ์š”์ฒญํ•œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•ด ์ค„ ๊ฒƒ์ด๋ผ๊ณ 
  2060. ์ƒ๊ฐํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ CPU ์—๊ฒŒ ๋„˜๊ธด๋‹ค๋ฉด:
  2061. a = READ_ONCE(*A);
  2062. WRITE_ONCE(*B, b);
  2063. c = READ_ONCE(*C);
  2064. d = READ_ONCE(*D);
  2065. WRITE_ONCE(*E, e);
  2066. CPU ๋Š” ๋‹ค์Œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ํ˜„์žฌ์˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ
  2067. ์˜คํผ๋ ˆ์ด์…˜์„ ์™„๋ฃŒํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ , ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ ์™ธ๋ถ€์—์„œ ๊ด€์ฐฐํ•˜๊ธฐ์—๋„ ์ •ํ•ด์ง„
  2068. ์ˆœ์„œ๋Œ€๋กœ ์˜คํผ๋ ˆ์ด์…˜์ด ์ˆ˜ํ–‰๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค:
  2069. LOAD *A, STORE *B, LOAD *C, LOAD *D, STORE *E.
  2070. ๋‹น์—ฐํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ํ›จ์”ฌ ์—‰๋ง์ž…๋‹ˆ๋‹ค. ๋งŽ์€ CPU ์™€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์•ž์˜ ๊ฐ€์ •์€
  2071. ์„ฑ๋ฆฝํ•˜์ง€ ๋ชปํ•˜๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  2072. (*) ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์‹คํ–‰์„ ๊ณ„์† ํ•ด๋‚˜๊ฐ€๊ธฐ ์œ„ํ•ด ๊ณง๋ฐ”๋กœ ์™„๋ฃŒ๋  ํ•„์š”๊ฐ€ ์žˆ๋Š”
  2073. ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€ ๋ฐ˜๋ฉด, ์Šคํ† ์–ด ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์ข…์ข… ๋ณ„๋‹ค๋ฅธ ๋ฌธ์ œ ์—†์ด ์œ ์˜ˆ๋  ์ˆ˜
  2074. ์žˆ์Šต๋‹ˆ๋‹ค;
  2075. (*) ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์˜ˆ์ธก์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•„์š”์—†๋Š” ๋กœ๋“œ์˜€๋‹ค๊ณ 
  2076. ์ฆ๋ช…๋œ ์˜ˆ์ธก์  ๋กœ๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค;
  2077. (*) ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ์˜ˆ์ธก์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์˜ˆ์ƒ๋œ ์ด๋ฒคํŠธ์˜
  2078. ์‹œํ€€์Šค์™€ ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ๋กœ๋“œ๊ฐ€ ์ด๋ค„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค;
  2079. (*) ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์ˆœ์„œ๋Š” CPU ๋ฒ„์Šค์™€ ์บ์‹œ๋ฅผ ์ข€ ๋” ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์žฌ๋ฐฐ์น˜
  2080. ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค;
  2081. (*) ๋กœ๋“œ์™€ ์Šคํ† ์–ด๋Š” ์ธ์ ‘ํ•œ ์œ„์น˜์—์˜ ์•ก์„ธ์Šค๋“ค์„ ์ผ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”
  2082. ๋ฉ”๋ชจ๋ฆฌ๋‚˜ I/O ํ•˜๋“œ์›จ์–ด (๋ฉ”๋ชจ๋ฆฌ์™€ PCI ๋””๋ฐ”์ด์Šค ๋‘˜ ๋‹ค ์ด๊ฒŒ ๊ฐ€๋Šฅํ•  ์ˆ˜
  2083. ์žˆ์Šต๋‹ˆ๋‹ค) ์— ๋Œ€ํ•ด ์š”์ฒญ๋˜๋Š” ๊ฒฝ์šฐ, ๊ฐœ๋ณ„ ์˜คํผ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ์„ค์ •
  2084. ๋น„์šฉ์„ ์•„๋ผ๊ธฐ ์œ„ํ•ด ์กฐํ•ฉ๋˜์–ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค; ๊ทธ๋ฆฌ๊ณ 
  2085. (*) ํ•ด๋‹น CPU ์˜ ๋ฐ์ดํ„ฐ ์บ์‹œ๊ฐ€ ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜๋„ ์žˆ๊ณ , ์บ์‹œ ์ผ๊ด€์„ฑ
  2086. ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด - ์Šคํ† ์–ด๊ฐ€ ์‹ค์ œ๋กœ ์บ์‹œ์— ๋„๋‹ฌํ•œ๋‹ค๋ฉด - ์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”์‹œํ‚ฌ ์ˆ˜๋Š”
  2087. ์žˆ์ง€๋งŒ ์ด ์ผ๊ด€์„ฑ ๊ด€๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ CPU ๋“ค์—๋„ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ „๋‹ฌ๋œ๋‹ค๋Š” ๋ณด์žฅ์€
  2088. ์—†์Šต๋‹ˆ๋‹ค.
  2089. ๋”ฐ๋ผ์„œ, ์•ž์˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ CPU ๊ฐ€ ๋ณด๋Š” ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  2090. LOAD *A, ..., LOAD {*C,*D}, STORE *E, STORE *B
  2091. ("LOAD {*C,*D}" ๋Š” ์กฐํ•ฉ๋œ ๋กœ๋“œ์ž…๋‹ˆ๋‹ค)
  2092. ํ•˜์ง€๋งŒ, CPU ๋Š” ์Šค์Šค๋กœ๋Š” ์ผ๊ด€์ ์ผ ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค: CPU _์ž์‹ _ ์˜ ์•ก์„ธ์Šค๋“ค์€
  2093. ์ž์‹ ์—๊ฒŒ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ •ํ™•ํžˆ ์ˆœ์„œ ์„ธ์›Œ์ง„ ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์งˆ
  2094. ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์˜ ์ฝ”๋“œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๋ฉด:
  2095. U = READ_ONCE(*A);
  2096. WRITE_ONCE(*A, V);
  2097. WRITE_ONCE(*A, W);
  2098. X = READ_ONCE(*A);
  2099. WRITE_ONCE(*A, Y);
  2100. Z = READ_ONCE(*A);
  2101. ๊ทธ๋ฆฌ๊ณ  ์™ธ๋ถ€์˜ ์˜ํ–ฅ์— ์˜ํ•œ ๊ฐ„์„ญ์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด
  2102. ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  2103. U == *A ์˜ ์ตœ์ดˆ ๊ฐ’
  2104. X == W
  2105. Z == Y
  2106. *A == Y
  2107. ์•ž์˜ ์ฝ”๋“œ๋Š” CPU ๊ฐ€ ๋‹ค์Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์‹œํ€€์Šค๋ฅผ ๋งŒ๋“ค๋„๋ก ํ• ๊ฒ๋‹ˆ๋‹ค:
  2108. U=LOAD *A, STORE *A=V, STORE *A=W, X=LOAD *A, STORE *A=Y, Z=LOAD *A
  2109. ํ•˜์ง€๋งŒ, ๋ณ„๋‹ค๋ฅธ ๊ฐœ์ž…์ด ์—†๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์•ผ์— ์ด ์„ธ์ƒ์ด ์—ฌ์ „ํžˆ ์ผ๊ด€์ ์ด๋ผ๊ณ 
  2110. ๋ณด์ธ๋‹ค๋Š” ๋ณด์žฅ๋งŒ ์ง€์ผœ์ง„๋‹ค๋ฉด ์ด ์‹œํ€€์Šค๋Š” ์–ด๋–ค ์กฐํ•ฉ์œผ๋กœ๋“  ์žฌ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ
  2111. ์•ก์„ธ์Šค๋“ค์€ ํ•ฉ์ณ์ง€๊ฑฐ๋‚˜ ๋ฒ„๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์•„ํ‚คํ…์ณ์—์„œ CPU ๋Š” ๊ฐ™์€ ์œ„์น˜์—
  2112. ๋Œ€ํ•œ ์—ฐ์†์ ์ธ ๋กœ๋“œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์„ ์žฌ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ž์˜ ์˜ˆ์—์„œ์˜
  2113. READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•จ์„ ์•Œ์•„๋‘์„ธ์š”. ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜
  2114. ์•„ํ‚คํ…์ณ์—์„œ READ_ONCE() ์™€ WRITE_ONCE() ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ผ์„
  2115. ๋ญ๊ฐ€ ๋๋“ ์ง€ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด Itanium ์—์„œ๋Š” READ_ONCE() ์™€ WRITE_ONCE()
  2116. ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” volatile ์บ์ŠคํŒ…์€ GCC ๊ฐ€ ๊ทธ๋Ÿฐ ์žฌ๋ฐฐ์น˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํŠน์ˆ˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ธ
  2117. ld.acq ์™€ stl.rel ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ๊ฐ๊ฐ ๋งŒ๋“ค์–ด ๋‚ด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2118. ์ปดํŒŒ์ผ๋Ÿฌ ์—ญ์‹œ ์ด ์‹œํ€€์Šค์˜ ์•ก์„ธ์Šค๋“ค์„ CPU ๊ฐ€ ๋ณด๊ธฐ๋„ ์ „์— ํ•ฉ์น˜๊ฑฐ๋‚˜ ๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ๋’ค๋กœ
  2119. ๋ฏธ๋ค„๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2120. ์˜ˆ๋ฅผ ๋“ค์–ด:
  2121. *A = V;
  2122. *A = W;
  2123. ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ˜•๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  2124. *A = W;
  2125. ๋”ฐ๋ผ์„œ, ์“ฐ๊ธฐ ๋ฐฐ๋ฆฌ์–ด๋‚˜ WRITE_ONCE() ๊ฐ€ ์—†๋‹ค๋ฉด *A ๋กœ์˜ V ๊ฐ’์˜ ์ €์žฅ์˜ ํšจ๊ณผ๋Š”
  2126. ์‚ฌ๋ผ์ง„๋‹ค๊ณ  ๊ฐ€์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ:
  2127. *A = Y;
  2128. Z = *A;
  2129. ๋Š”, ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋‚˜ READ_ONCE() ์™€ WRITE_ONCE() ์—†์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ˜•๋  ์ˆ˜
  2130. ์žˆ์Šต๋‹ˆ๋‹ค:
  2131. *A = Y;
  2132. Z = Y;
  2133. ๊ทธ๋ฆฌ๊ณ  ์ด LOAD ์˜คํผ๋ ˆ์ด์…˜์€ CPU ๋ฐ”๊นฅ์—๋Š” ์•„์˜ˆ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2134. ๊ทธ๋ฆฌ๊ณ , ALPHA ๊ฐ€ ์žˆ๋‹ค
  2135. ---------------------
  2136. DEC Alpha CPU ๋Š” ๊ฐ€์žฅ ์™„ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ์ˆœ์„œ์˜ CPU ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,
  2137. Alpha CPU ์˜ ์ผ๋ถ€ ๋ฒ„์ „์€ ๋ถ„ํ• ๋œ ๋ฐ์ดํ„ฐ ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ, ์˜๋ฏธ์ ์œผ๋กœ
  2138. ๊ด€๊ณ„๋˜์–ด ์žˆ๋Š” ๋‘๊ฐœ์˜ ์บ์‹œ ๋ผ์ธ์ด ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ์—…๋ฐ์ดํŠธ ๋˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  2139. ์ด๊ฒŒ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๊ฐ€ ์ •๋ง ํ•„์š”ํ•ด์ง€๋Š” ๋ถ€๋ถ„์ธ๋ฐ, ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฐฐ๋ฆฌ์–ด๋Š”
  2140. ๋ฉ”๋ชจ๋ฆฌ ์ผ๊ด€์„ฑ ์‹œ์Šคํ…œ๊ณผ ํ•จ๊ป˜ ๋‘๊ฐœ์˜ ์บ์‹œ๋ฅผ ๋™๊ธฐํ™” ์‹œ์ผœ์„œ, ํฌ์ธํ„ฐ ๋ณ€๊ฒฝ๊ณผ ์ƒˆ๋กœ์šด
  2141. ๋ฐ์ดํ„ฐ์˜ ๋ฐœ๊ฒฌ์„ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์ผ์–ด๋‚˜๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  2142. ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด ๋ชจ๋ธ์€ Alpha ์— ๊ธฐ์ดˆํ•ด์„œ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค๋งŒ, v4.15
  2143. ๋ถ€ํ„ฐ๋Š” Alpha ์šฉ READ_ONCE() ์ฝ”๋“œ ๋‚ด์— smp_mb() ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ๋กœ์˜
  2144. Alpha ์˜ ์˜ํ–ฅ๋ ฅ์ด ํฌ๊ฒŒ ์ค„์–ด๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  2145. ๊ฐ€์ƒ ๋จธ์‹  ๊ฒŒ์ŠคํŠธ
  2146. ----------------
  2147. ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒŒ์ŠคํŠธ๋“ค์€ ๊ฒŒ์ŠคํŠธ ์ž์ฒด๋Š” SMP ์ง€์› ์—†์ด ์ปดํŒŒ์ผ ๋˜์—ˆ๋‹ค
  2148. ํ•ด๋„ SMP ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑด UP ์ปค๋„์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ SMP ํ˜ธ์ŠคํŠธ์™€
  2149. ๊ฒฐ๋ถ€๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ๋ถ€์ž‘์šฉ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” mandatory ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ
  2150. ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๊ทธ๋Ÿฐ ํ•ด๊ฒฐ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ตœ์ ์˜ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค.
  2151. ์ด ๋ฌธ์ œ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋กœ์šฐ ๋ ˆ๋ฒจ์˜ virt_mb() ๋“ฑ์˜ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜
  2152. ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ SMP ๊ฐ€ ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๋‹ค๋ฉด smp_mb() ๋“ฑ๊ณผ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ
  2153. ๊ฐ–์Šต๋‹ˆ๋‹ค๋งŒ, SMP ์™€ SMP ์•„๋‹Œ ์‹œ์Šคํ…œ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.
  2154. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์ƒ ๋จธ์‹  ๊ฒŒ์ŠคํŠธ๋“ค์€ (SMP ์ผ ์ˆ˜ ์žˆ๋Š”) ํ˜ธ์ŠคํŠธ์™€ ๋™๊ธฐํ™”๋ฅผ ํ•  ๋•Œ์—๋Š”
  2155. smp_mb() ๊ฐ€ ์•„๋‹ˆ๋ผ virt_mb() ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2156. ์ด๊ฒƒ๋“ค์€ smp_mb() ๋ฅ˜์˜ ๊ฒƒ๋“ค๊ณผ ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ๋™์ผํ•˜๋ฉฐ, ํŠนํžˆ, MMIO ์˜ ์˜ํ–ฅ์—
  2157. ๋Œ€ํ•ด์„œ๋Š” ๊ฐ„์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: MMIO ์˜ ์˜ํ–ฅ์„ ์ œ์–ดํ•˜๋ ค๋ฉด, mandatory ๋ฐฐ๋ฆฌ์–ด๋ฅผ
  2158. ์‚ฌ์šฉํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  2159. =======
  2160. ์‚ฌ์šฉ ์˜ˆ
  2161. =======
  2162. ์ˆœํ™˜์‹ ๋ฒ„ํผ
  2163. -----------
  2164. ๋ฉ”๋ชจ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด๋Š” ์ˆœํ™˜์‹ ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑ์ž(producer)์™€ ์†Œ๋น„์ž(consumer) ์‚ฌ์ด์˜
  2165. ๋™๊ธฐํ™”์— ๋ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„
  2166. ์œ„ํ•ด์„  ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”:
  2167. Documentation/core-api/circular-buffers.rst
  2168. =========
  2169. ์ฐธ๊ณ  ๋ฌธํ—Œ
  2170. =========
  2171. Alpha AXP Architecture Reference Manual, Second Edition (Sites & Witek,
  2172. Digital Press)
  2173. Chapter 5.2: Physical Address Space Characteristics
  2174. Chapter 5.4: Caches and Write Buffers
  2175. Chapter 5.5: Data Sharing
  2176. Chapter 5.6: Read/Write Ordering
  2177. AMD64 Architecture Programmer's Manual Volume 2: System Programming
  2178. Chapter 7.1: Memory-Access Ordering
  2179. Chapter 7.4: Buffering and Combining Memory Writes
  2180. ARM Architecture Reference Manual (ARMv8, for ARMv8-A architecture profile)
  2181. Chapter B2: The AArch64 Application Level Memory Model
  2182. IA-32 Intel Architecture Software Developer's Manual, Volume 3:
  2183. System Programming Guide
  2184. Chapter 7.1: Locked Atomic Operations
  2185. Chapter 7.2: Memory Ordering
  2186. Chapter 7.4: Serializing Instructions
  2187. The SPARC Architecture Manual, Version 9
  2188. Chapter 8: Memory Models
  2189. Appendix D: Formal Specification of the Memory Models
  2190. Appendix J: Programming with the Memory Models
  2191. Storage in the PowerPC (Stone and Fitzgerald)
  2192. UltraSPARC Programmer Reference Manual
  2193. Chapter 5: Memory Accesses and Cacheability
  2194. Chapter 15: Sparc-V9 Memory Models
  2195. UltraSPARC III Cu User's Manual
  2196. Chapter 9: Memory Models
  2197. UltraSPARC IIIi Processor User's Manual
  2198. Chapter 8: Memory Models
  2199. UltraSPARC Architecture 2005
  2200. Chapter 9: Memory
  2201. Appendix D: Formal Specifications of the Memory Models
  2202. UltraSPARC T1 Supplement to the UltraSPARC Architecture 2005
  2203. Chapter 8: Memory Models
  2204. Appendix F: Caches and Cache Coherency
  2205. Solaris Internals, Core Kernel Architecture, p63-68:
  2206. Chapter 3.3: Hardware Considerations for Locks and
  2207. Synchronization
  2208. Unix Systems for Modern Architectures, Symmetric Multiprocessing and Caching
  2209. for Kernel Programmers:
  2210. Chapter 13: Other Memory Models
  2211. Intel Itanium Architecture Software Developer's Manual: Volume 1:
  2212. Section 2.6: Speculation
  2213. Section 4.4: Memory Access