ä»ã®ãšããããã£ãŠããããã«ãé¢é£æ§ã®ããèå³æ·±ã䞊è¡æ§ã®åé¡ã解決ããããã«ã¯ãããã¯ãšæ¡ä»¶å€æ°ã®äž¡æ¹ãå¿ èŠã§ãããã®æ°å¹Žåã«å®çŸããæåã®äººã®ã²ãšãã¯ãEdsger Dijkstra(æ£ç¢ºãªæŽå²[GR92]ãç¥ãããšã¯é£ããã)ã§ãããã°ã©ãçè«[D59]ã®æåãªãæççµè·¯ãã¢ã«ãŽãªãºã ã§ç¥ãããŠããããGoto Statements Considered HarmfulãD68aãšããååã®æ§é åããã°ã©ãã³ã°ã«ã€ããŠèª¬æããããã§ã¯ã»ããã©ãŒ[D68bãD72]ãšåŒã°ããåæããªããã£ãã®å°å ¥ãæ€èšããŸããå®éãDijkstraãã¯ãã»ããã©ãåæã«é¢é£ãããã¹ãŠã®ãã®ã®åäžã®ããªããã£ããšããŠèæ¡ããŸããã衚瀺ãããããã«ãã»ããã©ã¯ããã¯ãšæ¡ä»¶å€æ°ã®äž¡æ¹ãšããŠäœ¿çšã§ããŸãã
THE CRUX: HOW TO USE SEMAPHORES
ããã¯ãšæ¡ä»¶å€æ°ã®ä»£ããã«ã»ããã©ã䜿çšããã«ã¯ã©ãããã°ããã§ããïŒã»ããã©ã®å®çŸ©ã¯äœã§ããïŒãã€ããªã»ããã©ãšã¯äœã§ããïŒããã¯ãšæ¡ä»¶å€æ°ããã»ããã©ãŒãæ§ç¯ããã®ã¯ç°¡åã§ããïŒã»ããã©ããããã¯ãšæ¡ä»¶å€æ°ãæ§ç¯ããã«ã¯ã©ãããã°ããã§ãããïŒ
ã»ããã©ã¯ã2ã€ã®ã«ãŒãã³ã§æäœã§ããæŽæ°å€ãæã€ãªããžã§ã¯ãã§ããPOSIXæšæºã§ã¯ããããã®ã«ãŒãã³ã¯sem_wait()
ãšsem_post()
ã§ããã»ããã©ã®åæå€ã¯ãã»ããã©ãšçžäºäœçšããä»ã®ã«ãŒãã³ãåŒã³åºãåã«ããã®åäœã決å®ãããããå³31.1ã®ã³ãŒããšåãããã«ãæåã«ã»ããã©ãããå€ã«åæåããå¿
èŠããããŸãã
ãã®å³ã§ã¯ãã»ããã©sã宣èšãã3çªç®ã®åŒæ°ãšããŠ1ãæž¡ããŠå€1ã«åæåããŸããsem_init()
ã®2çªç®ã®åŒæ°ã¯ããã¹ãŠã®äŸã§0ã«èšå®ãããŠããŸããã»ããã©ãåãããã»ã¹å
ã®ã¹ã¬ããéã§å
±æãããŠããããšã瀺ããŸããã»ããã©ãŒã®ä»ã®äœ¿çšæ³(ã€ãŸããç°ãªãããã»ã¹éã§ã¢ã¯ã»ã¹ãåæãããããã«ããããã©ã®ããã«äœ¿çšããããšãã§ããã)ã®è©³çŽ°ã«ã€ããŠã¯ã第2åŒæ°ã®å€ãç°ãªãå¿
èŠããããŸãã
ã»ããã©ãåæåãããåŸãsem_wait()
ãŸãã¯sem_post()
ã®2ã€ã®é¢æ°ã®ãããããåŒã³åºãããšãã§ããŸãããããã®2ã€ã®æ©èœã®åäœãå³31.2ã«ç€ºããŸãã
ä»ã®ãšããããããã®ã«ãŒãã³ã®å®è£
ã«ã¯é¢å¿ããããŸãããsem_wait()
ãšsem_post()
ãåŒã³åºãè€æ°ã®ã¹ã¬ããã§ã¯ããããã®ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã管çããããã«å¿
èŠãããããšã¯æããã§ããããã§ã¯ããããã®ããªããã£ãã®äœ¿çšæ¹æ³ã«çŠç¹ãåœãŠãŸããåŸã«ãããããã©ã®ããã«æ§ç¯ãããããè°è«ãããããããŸããã
ããã§ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®ããã€ãã®é¡èãªåŽé¢ã«ã€ããŠè°è«ããå¿
èŠããããŸããsem_wait()
ã¯sem_wait()
ãåŒã³åºãããšãã«ã»ããã©ã®å€ã1以äžã ã£ãããããã«è¿ãããããåŒã³åºãåŽãåŸç¶ã®ãã¹ããåŸ
ã£ãŠå®è¡ãäžæãããŸãããã¡ãããè€æ°ã®åŒã³åºãã¹ã¬ãããsem_wait()
ãåŒã³åºãããšããããŸãããããã£ãŠããã¹ãŠãåŒã³åºãããã®ãåŸ
ã£ãŠãã¥ãŒã«å
¥ããããŸãã
第2ã«ãsem_post()
ã¯sem_wait()
ã®ããã«ç¹å®ã®æ¡ä»¶ãæç«ããã®ãåŸ
ããªãããšãããããŸããããããåã«ã»ããã©ã®å€ãã€ã³ã¯ãªã¡ã³ããã次ã«ç®èŠããããšããŠããã¹ã¬ãããããã°ããããã®1ã€ãèµ·åãããŸãã
第3ã«ãã»ããã©ã®å€ãè² ã®å ŽåãåŸ æ©ã¹ã¬ããã®æ°ã«çãã[D68b]ããã®å€ã¯äžè¬çã«ã»ããã©ã®ãŠãŒã¶ã«ã¯èŠãããŸããããç¥ã䟡å€ããããã»ããã©ãã©ã®ããã«æ©èœããããèŠããŠããã®ã«åœ¹ç«ã¡ãŸãã
ã»ããã©ãŒå ã§å¯èœãªç«¶åç¶æ ãå¿é ããªãã§ãã ããããããã®ã¢ã¯ã·ã§ã³ãã¢ãããã¯ã«å®è¡ããããšä»®å®ããŸããç§ãã¡ã¯ãããè¡ãããã«ããã¯ãšæ¡ä»¶å€æ°ã䜿çšããŸãã
ã»ããã©ã䜿çšããæºåãã§ããŸãããç§ãã¡ã®æåã®äœ¿ãæ¹ã¯ããã§ã«ããç¥ãããŠãããã®ã§ããããã¯ãã»ããã©ãããã¯ãšããŠäœ¿çšããŸããã³ãŒãã¹ããããã«ã€ããŠã¯ãå³31.3ãåç
§ããŠãã ãããéèŠãªã»ã¯ã·ã§ã³ãsem_wait()
/sem_post()
ã®ãã¢ã§å²ãã ãã§ããããšãããããŸãããã ãããã®äœæ¥ãè¡ãäžã§éèŠãªã®ã¯ãã»ããã©mã®åæå€ã§ã(å³ã®Xã«åæåãããŠããŸã)ãXã¯äœããã¹ãã§ããïŒ
...(å ã«é²ãåã«ããã«ã€ããŠèããŠã¿ãŠãã ãã)...
äžèšã®sem_wait()
ãšsem_post()
ã«ãŒãã³ã®å®çŸ©ãæ¯ãè¿ã£ãŠã¿ããšãåæå€ã¯1ã§ããã¯ãã§ãã
ãããæ確ã«ããããã«ã2ã€ã®ã¹ã¬ãããæã€ã·ããªãªãæ³åããŠã¿ãŸããããæåã®ã¹ã¬ãã(ã¹ã¬ãã0)ã¯sem_wait()
ãåŒã³åºããŸããã»ããã©ã®å€ãæåã«ãã¯ãªã¡ã³ããã0ã«å€æŽããŸãããã®åŸãå€ã0以äžã§ãªãå Žåã«ã®ã¿åŸ
æ©ããŸããå€ã0ã§ãããããsem_wait()
ã¯åã«æ»ãå€ãè¿ããŸããç¶ç¶ããŸããã¹ã¬ãã0ã¯ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã«èªç±ã«å
¥ããŸããã¹ã¬ãã0ãã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³å
ã«ããéã«ä»ã®ã¹ã¬ãããããã¯ãååŸããããšããªãå Žåãsem_post()
ãåŒã³åºããšãã»ããã©ã®å€ã1ã«åŸ©å
ããŸã(ååšããªãããåŸ
æ©ã¹ã¬ãããèµ·åããŸãã)ãå³31.4ã«ããã®ã·ããªãªã®ãã¬ãŒã¹ã瀺ããŸãã
ã¹ã¬ãã0ãããã¯ãä¿æã(ã€ãŸãsem_wait()
ã¯ãŸã sem_post()
ãšåŒã°ããŠããªã)ãå¥ã®ã¹ã¬ãã(ã¹ã¬ãã1)sem_wait()
ãåŒã³åºããŠã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã«å
¥ãããšãè©Šã¿ãŠãããšããã¹ã¬ãã1ã¯ã»ããã©ã®å€ãæžãããŠ-1ã«ããåŸ
æ©ããŸã(ããã»ããµãã¹ãªãŒããããŠæŸæ£ãã)ã¹ã¬ãã0ãåã³å®è¡ããããšãæçµçã«sem_post()
ãåŒã³åºãããã»ããã©ã®å€ããŒãã«æ»ãããŠåŸ
æ©ã¹ã¬ãã(ã¹ã¬ãã1)ãèµ·åãããããã¯ãç²åŸãããŸããã¹ã¬ãã1ãçµäºãããšãã»ããã©ã®å€ãåã³ã€ã³ã¯ãªã¡ã³ããããåã³1ã«æ»ãããŸãã
å³31.5ã«ããã®äŸã®ãã¬ãŒã¹ã瀺ããŸããã¹ã¬ããåäœã«å ããŠãå³ã¯åã¹ã¬ããã®ã¹ã±ãžã¥ãŒã©ç¶æ ãããªãã¡å®è¡äžãå®è¡å¯èœ(å®è¡å¯èœã§ãããå®è¡äžã§ã¯ãªã)ãããã³ã¹ãªãŒãã瀺ããŠããŸããç¹ã«ããã§ã«ä¿æãããŠããããã¯ãååŸããããšãããšãã¹ã¬ãã1ã¯ã¹ãªãŒãç¶æ ã«ãªããŸããã¹ã¬ãã0ãåã³å®è¡ãããå Žåã«ã®ã¿ãã¹ã¬ãã1ãèµ·åããæœåšçã«åã³å®è¡ããããšãã§ããŸãã
ç¬èªã®äŸã䜿çšããŠäœæ¥ãããå Žåã¯ãè€æ°ã®ã¹ã¬ãããããã¯ãåŸ ã£ãŠåŸ æ©ããã·ããªãªãè©ŠããŠã¿ãŠãã ããããã®ãããªãã¬ãŒã¹äžã«ã»ããã©ã®å€ã¯ã©ã®ããã«ãªããŸããïŒ
ãã®ãããªãšããã»ããã©ãããã¯ãšããŠäœ¿çšããããšãã§ããŸããããã¯ã¯2ã€ã®ç¶æ (ä¿æãããä¿æãããŠããªã)ããæããªãã®ã§ãããã¯ãšããŠäœ¿çšãããã»ããã©ããã€ããªã»ããã©ãšåŒã¶ããšããããŸãã泚æãšããŠããã®ãã€ããªåœ¢åŒã§ã®ã¿ã»ããã©ã䜿çšããŠããå Žåã¯ãããã«ç€ºãæ±çšã»ããã©ããç°¡åãªæ¹æ³ã§å®è£ ã§ããŸãã
ã»ããã©ã¯ã䞊è¡ããã°ã©ã ã§ã€ãã³ããé åºä»ããã®ã«ã圹ç«ã¡ãŸããäŸãã°ãã¹ã¬ããã¯ããªã¹ãã空ã§ãªããªãã®ãåŸ ã€ããšãæããããããªãã®ã§ãããããèŠçŽ ãåé€ããããšãã§ããŸãããã®äœ¿çšãã¿ãŒã³ã§ã¯ãããã¹ã¬ãããäœãèµ·ããã®ãåŸ ã£ãŠããŠãå¥ã®ã¹ã¬ãããäœãèµ·ãã£ãŠããããšã確èªããŠããããããèµ·ãã£ãããšãã·ã°ãã«ã§åŸ æ©ã¹ã¬ãããåŒã³èµ·ãããŸãããã®ããã«ããŠãã»ããã©ãé åºä»ãããªããã£ããšããŠäœ¿çšããŠããŸã(以åã®æ¡ä»¶å€æ°ã®äœ¿çšãšåæ§)ã
ç°¡åãªäŸã¯æ¬¡ã®ãšããã§ããã¹ã¬ãããå¥ã®ã¹ã¬ãããäœæããå®è¡ãå®äºããã®ãåŸ ã£ãŠãããšããŸã(å³31.6)ããã®ããã°ã©ã ãå®è¡ããããšã次ã®æ å ±ã衚瀺ãããŸãã
parent: begin
child
parent: end
åé¡ã¯ããã®å¹æãéæããããã«ã»ããã©ã䜿çšããæ¹æ³ã§ãããããå€æãããšããçãã¯æ¯èŒçç解ããããã§ããã³ãŒãã§ãããããã«ã芪ã¯sem_wait()
ãšåsem_post()
ãåŒã³åºããŠãå®è¡ãçµäºããåã®ç¶æ
ãçã«ãªãã®ãåŸ
ã€ã ãã§ããããããããã«ããããã®ã»ããã©ã®åæå€ã¯ã©ããªãã¹ãããšããçåãçããŸãã
(ãã¯ãå èªã¿ã§ã¯ãªããããã§èããŠã¿ãŠãã ãã)
çãã¯ãã¡ãããã»ããã©ã®å€ã0ã«èšå®ããå¿
èŠããããŸããèæ
®ãã¹ã2ã€ã®ã±ãŒã¹ããããŸããæåã«ã芪ãåãäœæããããåã¯ãŸã å®è¡ãããŠããªã(ããªãã¡ãæºåå®äºãã¥ãŒã«å
¥ã£ãŠãããå®è¡ãããŠããªã)ãšä»®å®ããŸãããã®å Žå(å³31.7)ã芪ã¯sem_post()
ãåŒã³åºãåã«sem_wait()
ãåŒã³åºããŸããç§ãã¡ã¯èŠªãåäŸãèµ°ãã®ãåŸ
ã€ããšãæã¿ãŸãããããèµ·ããå¯äžã®æ¹æ³ã¯ãã»ããã©ã®å€ã0ãã倧ãããªãå Žåã§ããåŸã£ãŠã0ãåæå€ã«ãªããŸãã芪ãå®è¡ãããã»ããã©ãæžãããŠ-1ã«ããŠãããã¹ãªãŒãããŸããåãæçµçã«å®è¡ããããšãsem_post()
ãåŒã³åºããã»ããã©ã®å€ã0ã«ã€ã³ã¯ãªã¡ã³ããã芪ãã¹ãªãŒã解é€ããŠsem_wait()
ããæ»ããããã°ã©ã ãçµäºããŸãã
2çªç®ã®ã±ãŒã¹(å³31.8ãããŒãž364)ã¯ã芪ãsem_wait()
ãåŒã³åºãåã«åããã»ã¹ãå®äºãããŸã§å®è¡ããããšãã«çºçããŸãããã®å Žåãåããã»ã¹ã¯sem_post()
ãæåã«åŒã³åºããã»ããã©ã®å€ã0ãã1ã«ã€ã³ã¯ãªã¡ã³ãããŸãã芪ããã»ã¹ãå®è¡ããããšãsem_wait()
ãã³ãŒã«ãããã»ããã©ã®å€ã1ãã©ãããæ€çŽ¢ããŸããããã ã£ããšãã芪ã¯ãã®å€ã(0ã«)ãã¯ãªã¡ã³ãããåŸ
ããã«sem_wait()
ããæ»ããæãã å¹æãåŸãŸãã
ãã®ç« ã§çŽé¢ãã次ã®åé¡ã¯ããããã¥ãŒãµ/ã³ã³ã·ã¥ãŒãã®åé¡ãæã«ã¯éå®ããããããã¡ã®åé¡[D72]ãšããŠç¥ãããŠããŸãããã®åé¡ã¯ãåã®ç« ã®æ¡ä»¶å€æ°ã§è©³ãã説æããŠããŸãã詳现ã¯ãã¡ããã芧ãã ããã
ãã®åé¡ã解決ããããã®æåã®è©Šã¿ã¯ã空ãšãã£ã±ããšãã2ã€ã®ã»ããã©ãå°å ¥ããŸãããããã®ã¹ã¬ããã¯ããããã¡ãšã³ããªã空ã«ãªã£ããšãããŸãã¯ãã£ã±ãã«ãªã£ããšãã瀺ãããã«äœ¿çšããŸããputãšgetã«ãŒãã³ã®ã³ãŒãã¯å³31.9ã«ããããããã¥ãŒãµãšã³ã³ã·ã¥ãŒãã®åé¡ã解決ããããã®è©Šã¿ã¯å³31.10ã«ãããŸãã
ãã®äŸã§ã¯ããããã¥ãŒãµã¯ãŸãããŒã¿ãæ ŒçŽããããã«ãããã¡ã空ã«ãªãã®ãåŸ ã¡ãã³ã³ã·ã¥ãŒãã¯ãããã¡ã䜿çšããåã«ãããã¡ããã£ã±ãã«ãªãã®ãåŸ ã¡ãŸããæåã«MAX = 1(é åå ã«iãšãã1ã€ã®ãããã¡ãããããŸãã)ãšä»®å®ãããããæ©èœãããã©ãããèŠãŠã¿ãŸãããã
å床ããããã¥ãŒãµãšã³ã³ã·ã¥ãŒãã®2ã€ã®ã¹ã¬ããããããšæ³åããŠãã ãããåäžã®CPUã§ç¹å®ã®ã·ããªãªãæ€èšããŸããããã³ã³ã·ã¥ãŒããæåã«èµ°ããšä»®å®ããŸãããããã£ãŠãã³ã³ã·ã¥ãŒãã¯ãsem_wait(ïŒfull)ãåŒã³åºãå³31.10ã®C1è¡ç®ã«ãããããŸããfullã¯å€0ã«åæåãããŠãããããã³ãŒã«ã¯fullãæžãããŠ(-1)ãã³ã³ã·ã¥ãŒãããããã¯ããå¿
èŠã«å¿ããŠå¥ã®ã¹ã¬ãããfullã§sem_post()
ãåŒã³åºãã®ãåŸ
ã¡ãŸãã
ãããã¥ãŒãµãå®è¡ãããŠãããšããŸããããã¯P1è¡ç®ã§ãããããsem_wait(ïŒempty)ã«ãŒãã³ãåŒã³åºããŸããã³ã³ã·ã¥ãŒããšã¯ç°ãªããemptyã¯å€MAX(ãã®å Žåã¯1)ã«åæåãããããããããã¥ãŒãµã¯ãã®è¡ãä»ããŠç¶ç¶ããŸãããããã£ãŠemptyã¯0ã«ãã¯ãªã¡ã³ãããããããã¥ãŒãµã¯ããŒã¿å€ããããã¡ã®æåã®ãšã³ããªã«å ¥ããŸã(P2è¡ç®)ã次ã«ããããã¥ãŒãµã¯P3ã«é²ã¿ãsem_post(ïŒfull)ãåŒã³åºããfullã®ã»ããã©ã®å€ã-1ãã0ã«å€æŽããã³ã³ã·ã¥ãŒããç®èŠããããŸã(äŸãã°ããããã¯ããæºåå®äºã«ç§»åãã)ã
ãã®å Žåã2ã€ã®ãã¡ã®1ã€ãèµ·ããå¯èœæ§ããããŸãããããã¥ãŒãµãèµ°ãç¶ãããšãã«ãŒãããŠåã³P1è¡ç®ã«ãããããŸãããã ããemptyã®ã»ããã©ã®å€ã0ã§ãããããä»åã¯ãããã¯ãããŸãããããã¥ãŒãµãäžæããã代ããã«ãã³ã³ã·ã¥ãŒããå®è¡ãéå§ãããšãsem_wait(ïŒfull)(C1è¡ç®)ãåŒã³åºãããæ¶è²»ããŸãããããã®å Žåã§ããæãã ã®æåãéæããŸãã
ãã®åãäŸããã£ãšå€ãã®ã¹ã¬ããã§è©Šãããšãã§ããŸã(è€æ°ã®ãããã¥ãŒãµãè€æ°ã®ã³ã³ã·ã¥ãŒããªã©)ãããã§ãåäœããã¯ãã§ãã
ããã§ãMAXã1ãã倧ãã(ããšãã°MAX = 10)ãšæ³åããŠã¿ãŸãããããã®äŸã§ã¯ãè€æ°ã®ãããã¥ãŒãµãšè€æ°ã®ã³ã³ã·ã¥ãŒããååšãããšä»®å®ããŸããããã§ãåé¡ãæ±ããŠããŸããããã¯ç«¶äºç¶æ
ã§ããã©ãã§çºçããã®ãèŠããŠããŸããïŒ(ãã°ããæéããšã£ãŠèŠãŠãã ãã)èŠããªãå Žåã¯ããã³ãããããŸããããã¯ãput()
ãšget()
ã³ãŒãä»è¿ã詳ããèŠãŠãã ããã
ããŠãåé¡ãç解ããŸãããã2人ã®ãããã¥ãŒãµãŒ(PaãšPb)ãput()
ãã»ãŒåæã«åŒã³åºããšããŸãããããã¥ãŒãµPaãæåã«å®è¡ãããæåã®ãããã¡ãšã³ããª(F1è¡ç®ã§fill = 0)ãæžãå§ãããšä»®å®ããŸããPaãfillã«ãŠã³ã¿ã1ã«ã€ã³ã¯ãªã¡ã³ããããã£ã³ã¹ãåŸãåã«ãããã¯äžæãããŸãããããã¥ãŒãµãŒPbãå®è¡ãéå§ããF1è¡ç®ã§ãããã¡ãŒã®0çªç®ã®èŠçŽ ã«ãããŒã¿ãæžã蟌ãŸããŸããã€ãŸããå€ãããŒã¿ãäžæžããããŸããããã¯ãããããŸããããããã¥ãŒãµããã®ããŒã¿ã倱ãããããšã¯æãŸãããããŸããã
ã芧ã®ãšãããããã§å¿ããŠããŸã£ãã®ã¯çžäºæé€ã§ãããããã¡ã®å å¡«ãšãããã¡ãžã®ã€ã³ããã¯ã¹ã®ã€ã³ã¯ãªã¡ã³ãã¯ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã§ããããã泚ææ·±ã管çããå¿ èŠããããŸãããã®ããããã€ããªã»ããã©ã䜿çšããŠããã€ãã®ããã¯ãè¿œå ããŸããããå³31.11ã«ç§ãã¡ã®è©Šã¿ã瀺ããŸãã
ããã§ãNEW LINEã³ã¡ã³ãã§ç€ºãããŠããããã«ãã³ãŒãã®put()
/get()
éšåå
šäœã«ããã€ãã®ããã¯ãè¿œå ãããŸãããããã¯æ£ããã¢ã€ãã¢ã®ããã«èŠããŸãããå®éã¯ããŸããããŸãããã©ãããŠã§ããããïŒãã³ãã¯ãããããã¯ã§ãããªããããããã¯ãçºçããã®ã§ããããïŒãããèããŠã¿ãŸãããããããããã¯ãçºçããã±ãŒã¹ãèŠã€ããŠã¿ãŸããããããã°ã©ã ããããããã¯ããããã«ã¯ã©ã®ãããªæé ãå®è¡ããå¿
èŠããããŸããïŒ
ããŠãããªãã¯å³ãç解ããã®ã§ãããã«çãããããŸãã1ã€ã®ãããã¥ãŒãµãš1ã€ã®ã³ã³ã·ã¥ãŒãã®2ã€ã®ã¹ã¬ãããæ³åããŠãã ããããŸãã³ã³ã·ã¥ãŒããæåã«èµ°ããŸãããã¥ãŒããã¯ã¹(C0è¡ç®)ãååŸããfullã»ããã©(c1è¡ç®)ã§sem_wait()
ãåŒã³åºããŸãããŸã ããŒã¿ããªãããããã®åŒã³åºãã«ãã£ãŠã³ã³ã·ã¥ãŒãã¯ãããã¯ããŠCPUãçæããŸããéèŠãªããšã§ãããã³ã³ã·ã¥ãŒãã¯ãŸã ããã¯ãä¿æããŠããŸãã
ãããã¥ãŒãµãŒãå®è¡ãããŸããããã¯çç£ããããŒã¿ãæã£ãŠããŠããããåãããšãã§ããã°ãããã¯ã³ã³ã·ã¥ãŒãã®ã¹ã¬ãããèµ·ããããšãã§ãããã¹ãŠãããŸãããã§ããããæ®å¿µãªããšã«ãæåã«è¡ãããšã¯ããã€ããªãã¥ãŒããã¯ã¹ã»ããã©(P0è¡ç®)ã«å¯ŸããŠsem_wait()
ãåŒã³åºãããšã§ããããã¯ã¯ãã§ã«ä¿æãããŠããŸãããããã£ãŠããããã¥ãŒãµãŒã¯çŸåšãåŸ
ã£ãŠããŸãã
ããã«ã¯åçŽãªãµã€ã¯ã«ããããŸããã³ã³ã·ã¥ãŒãã¯ãã¥ãŒããã¯ã¹ãä¿æãã誰ãããã«ã·ã°ãã«ããã®ãåŸ ã£ãŠããŸãããããã¥ãŒãµã¯ãã«ã·ã°ãã«ãéãããšãã§ããŸããããã¥ãŒããã¯ã¹ãåŸ ã£ãŠããŸãããããã£ãŠããããã¥ãŒãµãšã³ã³ã·ã¥ãŒãã¯ãäºãã«åŸ ã£ãŠããŸããå€å žçãªãããããã¯ã§ãã
ãã®åé¡ã解決ããã«ã¯ãåã«ããã¯ã®ç¯å²ãå°ããããå¿ èŠããããŸããå³31.12ã«æ£ãã解ã瀺ããŸããã芧ã®ãšããããã¥ãŒããã¯ã¹ã®ååŸãšè§£æŸãã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®ãŸããã§è¡ãã ãã§ãããã«ããã³ç©ºã®åŸ æ©ããã³ã·ã°ãã«ã³ãŒãã¯å€éšã«æ®ãããŸãããã®çµæããã«ãã¹ã¬ããããã°ã©ã ã§ãã䜿çšããããã¿ãŒã³ã§ããåçŽã§äœæ¥å¹çã®è¯ãæéãããã¡ãŒãåŸãããŸãããããä»ç解ããŠãã ãããåŸã§ããã䜿çšããŠãã ãããããªãã¯äœå¹Žãç§ãã¡ã«æè¬ããããšã§ãããã
å¥ã®å€å žçãªåé¡ã¯ãç°ãªãããŒã¿æ§é ã¢ã¯ã»ã¹ãç°ãªãçš®é¡ã®ããã¯ãå¿ èŠãšããå¯èœæ§ãããããšãèªãããããæè»ãªããã¯ããªããã£ãã«å¯ŸããèŠæããçããŸããããšãã°ãæ¿å ¥ãç°¡åãªæ€çŽ¢ãªã©ãå€æ°ã®äžŠè¡ãªã¹ãæäœãæ³åããŠã¿ãŠãã ãããæ¿å ¥ããªã¹ãã®ç¶æ ãå€ãã(ãããã£ãŠäŒçµ±çãªã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ãæå³ããªããªã)éã«ãã«ãã¯ã¢ããã¯åã«ããŒã¿æ§é ãèªã¿èŸŒã¿ãŸããæ¿å ¥ãè¡ãããŠããªãããšãä¿èšŒã§ããã°ãå€ãã®ã«ãã¯ã¢ããã䞊è¡ããŠé²ããããšãã§ããŸãããã®ã¿ã€ãã®æäœããµããŒãããããã«éçºããç¹æ®ã¿ã€ãã®ããã¯ã¯ããªãŒãã©ã€ã¿ããã¯[CHP71]ãšããŠç¥ãããŠããŸãããã®ãããªããã¯ã®ã³ãŒãã¯ãå³31.13ã§äœ¿çšã§ããŸãã
ã³ãŒãã¯ããªãç°¡åã§ããåé¡ã®ããŒã¿æ§é ãæŽæ°ãããã¹ã¬ãããããã°ãæžã蟌ã¿ããã¯ãç²åŸããããã®rwlock_acquire_writelock()
ãšããã解æŸããããã®rwlock_release_writelock()
ãšããæ°ããåææäœã®ãã¢ãåŒã³åºãå¿
èŠããããŸããå
éšçã«ã¯ããããã¯åã«æžã蟌ã¿ããã¯ã»ããã©ã䜿çšããŠã1人ã®ã©ã€ã¿ãŒã ããããã¯ã解é€ããåé¡ã®ããŒã¿æ§é ãæŽæ°ããã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã«å
¥ãããšãã§ããããã«ããŸãã
ããã«èå³æ·±ãã®ã¯ãèªã¿åãããã¯ãååŸããŠè§£æŸããããã®ã«ãŒãã³ã®ãã¢ã§ããèªåãããã¯ãç²åŸãããšããèªè
ã¯æåã«ããã¯ãç²åŸãã次ã«èªè
å€æ°ãã€ã³ã¯ãªã¡ã³ãããŠãçŸåšããŒã¿æ§é å
ã«ããèªè
ã®æ°ã远跡ããŸããrwlock_acquire_readlock()
å
ã§å®è¡ãããéèŠãªã¹ãããã¯ãæåã®èªè
ãããã¯ãååŸãããšãã«çºçããŸãããã®å Žåãèªè
ã¯ãæžã蟌ã¿ããã¯ã»ããã©ã«å¯ŸããŠsem_wait()
ãåŒã³åºããsem_post()
ãåŒã³åºããŠããã¯ã解æŸããããšã«ãã£ãŠãæžã蟌ã¿ããã¯ãååŸããŸãã
ãããã£ãŠãèªè
ãèªåãããã¯ãååŸãããšãããå€ãã®èªè
ãèªåãããã¯ãååŸããããšãèš±å¯ãããŸãããã ããæžã蟌ã¿ããã¯ãååŸããã¹ã¬ããã¯ããã¹ãŠã®èªè
ãçµäºãããŸã§åŸ
æ©ããå¿
èŠããããŸããã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ãçµäºããæåŸã®ãã®ã¯"writelock"ã®sem_post()
ãåŒã³åºãã®ã§ãåŸ
æ©äžã®ã©ã€ã¿ãŒã¯ããã¯ãç²åŸã§ããŸãããã®ã¢ãããŒãã¯(å¿
èŠã«å¿ããŠ)æ©èœããŸãããç¹ã«å
¬å¹³æ§ã«é¢ããŠã¯ãããã€ãã®ãã¬ãã£ããªç¹ããããŸããç¹ã«ãèªè
ãã©ã€ã¿ãŒã飢ããããã®ã¯æ¯èŒçç°¡åã§ãããã®åé¡ã«å¯Ÿããããé«åºŠãªè§£æ±ºçãååšããŸããããããããªãã¯ããè¯ãå®è£
ãèããããšãã§ããŸããïŒãã³ãïŒã©ã€ã¿ãŒãåŸ
ã£ãŠãããšãããå€ãã®èªè
ãããã¯ã«å
¥ãã®ãé²ãããã«ãããªããããå¿
èŠãããããšãèããŠãã ããã
æåŸã«ããªãŒãã©ã€ã¿ã®ããã¯ã泚æããŠäœ¿çšããå¿ èŠãããããšã«æ³šæããŠãã ããããããã¯ãã°ãã°ãªãŒããŒããããçºçããŸã(ç¹ã«ããæŽç·Žãããå®è£ ã§ã¯)ãåçŽã§é«éãªããã¯ããªããã£ã[CB08]ã䜿çšããã®ãšæ¯ã¹ãŠããã©ãŒãã³ã¹ã®ã¹ããŒãã¢ããã«ã€ãªãããŸããããããã«ããŠããã»ããã©ãèå³æ·±ãæçšãªæ¹æ³ã§äœ¿çšããæ¹æ³ãããäžåºŠçŽ¹ä»ããŸãã
TIP: SIMPLE AND DUMB CAN BE BETTER (HILLâS LAW)
ã·ã³ãã«ã§æããªã¢ãããŒããæé«ã®ãã®ã«ãªããšããèããéå°è©äŸ¡ããã¹ãã§ã¯ãããŸãããããã¯ãããšãå®è£ ãç°¡åã§é«éã§ãããããåçŽãªã¹ãã³ããã¯ãæé©ãªå ŽåããããŸãããªãŒãã©ã€ã¿ã®ãããªãã®ã¯ããã¯ãããŠããŸãããè€éã§è€éãªãã®ã¯é ããšããæå³ã§ãããããã£ãŠããŸããã·ã³ãã«ã§æããªã¢ãããŒãããŸãè©Šã¿ãŠãã ããã ã·ã³ãã«ãã«èšŽãããã®ã¢ã€ãã¢ã¯ãå€ãã®å Žæã§èŠãããŸããåæã®æ å ±æºã¯ãMark Hillã®è«æ[H87]ã§ãããCPUçšã®ãã£ãã·ã¥ãèšèšããæ¹æ³ãç 究ããŸããããã«æ°ã¯ãã·ã³ãã«ãªãã€ã¬ã¯ãããããã£ãã·ã¥ã¯ããã¡ã³ã·ãŒã§å é²çãªãã¶ã€ã³ãããåªããŠããããšãçºèŠããŸãã(ãã£ãã·ã³ã°ã§ã¯ããã¶ã€ã³ãåçŽãªãããæ€çŽ¢ãé«éã«ãªããŸã)ããã«ãç°¡æœã«åœŒã®äœåãèŠçŽããããã«ãã巚倧ã§æããªæ¹ãè¯ãããšèšããŸããã
ãã€ã¯ã¹ãã©ã«ãã£ãŠæèµ·ããã解決ããããã£ãšãæåãªäžŠè¡æ§ã®åé¡ã®1ã€ã¯ãé£å ã®å²åŠè ã®åé¡[D71]ãšããŠç¥ãããŠããŸãããã®åé¡ã¯ãããã楜ãããå€åç¥çã«é¢çœãã®ã§æåã§ãããããããã®å®çšæ§ã¯äœãã§ãããããããã®å声ã¯ããã«å«ãŸããŠããŸããå®éã«ã¯ãããé¢æ¥ã§ããã«ã€ããŠå°ãããããããããŸããããããªãããã®è³ªåãèŠèœãšããŠä»äºãåŸããªãã£ãããããªãã¯OSã®ææãæ¬åœã«æšãã§ããããéã«ãããªããä»äºãåŸãããããªãã®OSææã«çŽ æµãªã¡ã¢ããŸãã¯ããã€ãã®ã¹ããã¯ãªãã·ã§ã³ãéã£ãŠãã ããã
åé¡ã®åºæ¬çãªèšå®ã¯ããã§ã(å³31.14ãåç §)ãããŒãã«ã®åšãã«5人ã®"å²åŠè "ã座ã£ãŠãããšããŸããå²åŠè ã®åãã¢ã®éã«ã¯1ã€ã®ãã©ãŒã¯(ãããã£ãŠåèš5ã€)ããããŸããå²åŠè ã¯ããããèããŠããæéãããããã©ãŒã¯ãé£ã¹ãæéã¯å¿ èŠãããŸãããé£ã¹ãããã«ã¯ãå²åŠè ã¯2æ¬ã®ãã©ãŒã¯ãå¿ èŠãšããŸããå·ŠåŽã®ãã®ãšå³åŽã®ãã®ã®äž¡æ¹ããããŸãããããã®ãã©ãŒã¯ã®ç«¶åãããã«ç¶ãåæã®åé¡ã¯ããããåæããã°ã©ãã³ã°ã§ç 究ããåé¡ãšãªã£ãŠããŸãã
åå²åŠè ã®åºæ¬çãªã«ãŒãã¯æ¬¡ã®ãšããã§ãã
while (1) {
think();
getforks();
eat();
putforks();
}
ããŒãšãªãææŠã¯ããããããã¯ããªããå²åŠè
ã飢ãããé£ã¹ãããšããªãã䞊è¡æ§ãé«ã(ã€ãŸããåæã«å€ãã®å²åŠè
ãåæã«é£ã¹ãããšãã§ããããã«)æžã蟌ã¿ã®ã«ãŒãã³ã§ããgetforks()
ãšputfork()
ãã§ããã ãå®è¡ã§ããããã«ããããšã§ãã
ããŠããŒã®ãœãªã¥ãŒã·ã§ã³[D08]ã«ç¶ããŠãããã€ãã®ãã«ããŒé¢æ°ã䜿çšããŠãç§ãã¡ã解決çã«å°ããŸãã
int left(int p) { return p; }
int right(int p) { return (p + 1) % 5; }
å²åŠè pãå·Šã®ãã©ãŒã¯ãåç §ããããšãã圌ãã¯åã«left(p)ãåŒã³åºããŸããåæ§ã«ãå²åŠè pã®å³åŽã®ãã©ãŒã¯ã¯right(p)ãåŒã³åºãããšã«ãã£ãŠåç §ãããŸãããã®äžã®å°äœæŒç®åã¯ãæåŸã®å²åŠè (p = 4)ããã©ãŒã¯ã0ã§ãããšãå³æã§ã€ããããšããåŠçãããŸãã
ãŸãããã®åé¡ã解決ããããã«ã»ããã©ãŒãå¿ èŠã«ãªããŸããããããã®ãã©ãŒã¯ã«å¯ŸããŠ1ã€ãã€ãsem_t forks [5]ã5ã€ãããšããŸãã
æã
ã¯ãã®åé¡ã«å¯Ÿããæåã®è§£æ±ºçãè©Šã¿ãŸããåã»ããã©ãŒ(ãã©ãŒã¯é
åå
ã®)ã1ã®å€ã«åæåãããã®ãšããŸããåå²åŠè
ãããèªèº«ã®æ°(p)ãç¥ã£ãŠãããšããŸãããããã£ãŠãå³31.15ã«ç€ºãgetforks()
ãšputforks()
ã«ãŒãã³ãèšè¿°ããããšãã§ããŸãã
ãã®(å£ãã)ãœãªã¥ãŒã·ã§ã³ã®èåŸã«ããçŽæã¯æ¬¡ã®ãšããã§ãããã©ãŒã¯ãååŸããã«ã¯ããŸãããããã®ããã¯ãååŸããŸããæåã¯å·Šã«ã次ã«å³ã«ããããã¯ã§ããé£ã¹çµãããšãç§ãã¡ã¯ããã解æŸããŸããã·ã³ãã«ã§ãããïŒæ®å¿µãªããããã®å ŽåãåçŽãªæ段ã¯å£ããŠããŸããçºçããåé¡ãç解ã§ããŸããïŒããã«ã€ããŠèããŠã¿ãŸãããã
åé¡ã¯ãããããã¯ã§ããå²åŠè ãèªåã®å³ã«ãããã©ãŒã¯ãã€ããåã«ãåå²åŠè ãå·Šã«ãããã©ãŒã¯ãã€ããã§ããŸã£ãããããããã®ãã©ãŒã¯ãã€ããã§å¥ã®ãã®ãæ°žé ã«åŸ ã€ããšã«ãªããŸããå ·äœçã«ã¯ãå²åŠè 0ã¯ãã©ãŒã¯0ãå²åŠè 1ã¯ãã©ãŒã¯1ãå²åŠè 2ã¯ãã©ãŒã¯2ãå²åŠè 3ã¯ãã©ãŒã¯3ããå²åŠè 4ã¯ãã©ãŒã¯4ãã€ããããã¹ãŠã®ãã©ãŒã¯ãç²åŸããããã¹ãŠã®å²åŠè ãå¥ã®å²åŠè ãææãããã©ãŒã¯ãåŸ ã£ãŠããŸããç§ãã¡ã¯ããã«ãããããã¯ã詳ããç 究ããŸããä»ã®ãšãããããã¯å®çšçãªè§£æ±ºçã§ã¯ãªããšèšã£ãŠãéèšã§ã¯ãããŸããã
ãã®åé¡ãæ»æããæãç°¡åãªæ¹æ³ã¯ãå²åŠè ã®å°ãªããšã1人ããã©ãŒã¯ãååŸããæ¹æ³ãå€æŽããããšã§ãã確ãã«ãããã¯Dijkstraèªèº«ãã©ã®ããã«åé¡ã解決ãããã§ããå ·äœçã«ã¯ãå²åŠè 4(äžçªé«ãçªå·ã®å²åŠè )ããã©ãŒã¯ãå¥ã®é åºã§ååŸãããšä»®å®ããŸãããããããè¡ãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
æåŸã®å²åŠè ã¯å·Šæã®åã«å³æãã€ãã¿ãããšããŠããã®ã§ãåå²åŠè ã1ã€ã®ãã©ãŒã¯ãã€ãã¿ãå¥ã®ãã©ãŒã¯ãåŸ ã£ãŠããç¶æ³ã¯ãããŸãããããã§åŸ ã¡ã®ãµã€ã¯ã«ã解æ¶ãããŸããããã®ãœãªã¥ãŒã·ã§ã³ã®ææãèããŠããããæ©èœããããšãèªåèªèº«ã§åãããŠãã ããã
ãã®ãããªä»ã®ãæåãªãåé¡ãäŸãã°ãã°ãå«ç è ã®åé¡ãŸãã¯ç¡ç äžã®ç髪垫ã®åé¡ãªã©ããããŸãããããã®ã»ãšãã©ã¯ã䞊è¡æ§ã«ã€ããŠèããããšã®èšãèš³ã§ãããããã®ããã€ãã¯é åçãªååãæã£ãŠããŸããããå€ãã®ããšãåŠã¶ããšã«èå³ãããå Žåã¯ãããããèŠãŠãã ããããããã¯åæã«ããå€ãã®ç·Žç¿ãåæã«è¡ãããšãã§ããŸã[D08]ã
æåŸã«ãäœã¬ãã«ã®åæããªããã£ããããã¯ãããã³æ¡ä»¶å€æ°ã䜿çšããŠã...(ãã©ã ããŒã«)ãšããã»ããã©ã®ç¬èªã®ããŒãžã§ã³ãæ§ç¯ããŸããã...Zemaphoresãå³31.16ã«ç€ºãããã«ããã®äœæ¥ã¯ããªãç°¡åã§ãã
ãã®å³ãããããããã«ãã»ããã©ã®å€ã远跡ããããã«ãããã¯ãšæ¡ä»¶å€æ°ã1ã€ã ã䜿çšããç¶æ å€æ°ã䜿çšããŸããããªããæ¬åœã«ç解ãããŸã§ãããªãèªèº«ã®ããã«ã³ãŒããç 究ããŠãã ããããã€ã¯ã¹ãã©ã«ãã£ãŠå®çŸ©ãããZemaphoreãšçŽç²ãªã»ããã©ã®1ã€ã®åŸ®åŠãªéãã¯ãã»ããã©ã®å€ãè² ã®å Žåã¯åŸ æ©ã¹ã¬ããã®æ°ãåæ ãããšããäžå€å€ãç¶æããªãããšã§ããå®éã«ã¯ãå€ã¯æ±ºããŠãŒãããäœããªãããšã¯ãããŸããããã®åäœã¯å®è£ ã容æã§ãçŸåšã®Linuxã®å®è£ ãšäžèŽããŸãã
TIP: BE CAREFUL WITH GENERALIZATION
ãããã£ãŠãäžè¬åã®æœè±¡çãªææ³ã¯ãã·ã¹ãã èšèšã«ãããŠéåžžã«æçšã§ãããããã§ã¯ã1ã€ã®è¯ãã¢ã€ãã¢ããããã«åºããŠãã倧ããªã¯ã©ã¹ã®åé¡ã解決ããããšãã§ããŸãããã ããäžè¬åãããšãã¯æ³šæããŠãã ãããLampsonã¯ç§ãã¡ã«"äžè¬åããªãã§ãã ãããäžè¬åã¯äžè¬ã«ééã£ãŠãã[L83]ã
ã»ããã©ãããã¯ãšæ¡ä»¶å€æ°ã®äžè¬åãšããŠèŠãããšãã§ããŸãããããããã®ãããªäžè¬åãå¿ èŠã§ããïŒãŸããã»ããã©ã®äžã«æ¡ä»¶å€æ°ãå®çŸããã®ãé£ããããšãèãããšããããããã®äžè¬åã¯äžè¬çã§ã¯ãããŸããã
äžæè°ãªããšã«ãã»ããã©ããæ¡ä»¶å€æ°ãæ§ç¯ããããšã¯ãã¯ããã«ããªãããŒãªåœé¡ã§ããçµéšã®è±å¯ãªäžŠè¡ããã°ã©ãã®äžã«ã¯ãWindowsç°å¢ã§ãããå®è¡ããããšãããã®ããããããŸããŸãªãã°ãçºçããŸãã[B04]ãèªåã§è©ŠããŠãã»ããã©ãããã«ãæ¡ä»¶å€æ°ã衚瀺ããã®ããªãé£ããããç解ã§ãããã©ããã確èªããŠãã ããã
ã»ããã©ã¯ã䞊è¡ããã°ã©ã ãäœæããããã®åŒ·åãã€æè»ãªããªããã£ãã§ããäžéšã®ããã°ã©ããŒã¯ããã®ã·ã³ãã«ããšæçšæ§ã«ãããã¯ãšæ¡ä»¶å€æ°ãé¿ããç¬å çã«ãããã䜿çšããŠããŸãããã®ç« ã§ã¯ãããã€ãã®å€å žçãªåé¡ãšè§£æ±ºçã玹ä»ããŸããã詳现ãç¥ãããå Žåã¯ãåç §ã§ããä»ã®å€ãã®è³æããããŸãã1ã€ã®å倧ãª(ãããŠèªç±ãªåç §)ã¯ã䞊è¡æ§ãšã»ããã©ãŒ[D08]ã«ããããã°ã©ãã³ã°ã«é¢ããAllen Downeyã®æ¬ã§ãããã®æ¬ã¯ãäžè¬çã«ç¹å®ã®äžŠè¡æ§ãšäžŠè¡æ§ã®äž¡æ¹ã®ã»ããã©ã®ç解ãåäžãããããã«åãçµãããšãã§ããå€ãã®ããºã«ãæã£ãŠããŸããçã®åæå®è¡æ§ã®å°é家ã«ãªãã«ã¯é·å¹Žã®åªåãå¿ èŠã§ãããããããã®ã¯ã©ã¹ã§åŠãã ããšãè¶ ããŠããã¹ã¿ãŒããéµã§ãã
[B04] âImplementing Condition Variables with Semaphoresâ
Andrew Birrell
December 2004
An interesting read on how difficult implementing CVs on top of semaphores really is, and the mistakes the author and co-workers made along the way. Particularly relevant because the group had done a ton of concurrent programming; Birrell, for example, is known for (among other things) writing various thread-programming guides.
[CB08] âReal-world Concurrencyâ
Bryan Cantrill and Jeff Bonwick
ACM Queue. Volume 6, No. 5. September 2008
A nice article by some kernel hackers from a company formerly known as Sun on the real problems faced in concurrent code.
[CHP71] âConcurrent Control with Readers and Writersâ
P.J. Courtois, F. Heymans, D.L. Parnas
Communications of the ACM, 14:10, October 1971
The introduction of the reader-writer problem, and a simple solution. Later work introduced more complex solutions, skipped here because, well, they are pretty complex.
[D59] âA Note on Two Problems in Connexion with Graphsâ
E. W. Dijkstra
Numerische Mathematik 1, 269271, 1959
Available: http://www-m3.ma.tum.de/twiki/pub/MN0506/WebHome/dijkstra.pdf
Can you believe people worked on algorithms in 1959? We canât. Even before computers were any fun to use, these people had a sense that they would transform the world...
[D68a] âGo-to Statement Considered Harmfulâ
E.W. Dijkstra
Communications of the ACM, volume 11(3): pages 147148, March 1968
Available: http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF
Sometimes thought as the beginning of the field of software engineering.
[D68b] âThe Structure of the THE Multiprogramming Systemâ
E.W. Dijkstra
Communications of the ACM, volume 11(5), pages 341346, 1968
One of the earliest papers to point out that systems work in computer science is an engaging intellectual endeavor. Also argues strongly for modularity in the form of layered systems.
[D72] âInformation Streams Sharing a Finite Bufferâ
E.W. Dijkstra
Information Processing Letters 1: 179180, 1972
Available: http://www.cs.utexas.edu/users/EWD/ewd03xx/EWD329.PDF
Did Dijkstra invent everything? No, but maybe close. He certainly was the first to clearly write down what the problems were in concurrent code. However, it is true that practitioners in operating system design knew of many of the problems described by Dijkstra, so perhaps giving him too much credit would be a misrepresentation of history.
[D08] âThe Little Book of Semaphoresâ
A.B. Downey
Available: http://greenteapress.com/semaphores/
A nice (and free!) book about semaphores. Lots of fun problems to solve, if you like that sort of thing.
[D71] âHierarchical ordering of sequential processesâ
E.W. Dijkstra
Available: http://www.cs.utexas.edu/users/EWD/ewd03xx/EWD310.PDF
Presents numerous concurrency problems, including the Dining Philosophers. The wikipedia page about this problem is also quite informative.
[GR92] âTransaction Processing: Concepts and Techniquesâ
Jim Gray and Andreas Reuter
Morgan Kaufmann, September 1992
The exact quote that we find particularly humorous is found on page 485, at the top of Section 8.8: âThe first multiprocessors, circa 1960, had test and set instructions ... presumably the OS implementors worked out the appropriate algorithms, although Dijkstra is generally credited with inventing semaphores many years later.â
[H87] âAspects of Cache Memory and Instruction Buffer Performanceâ
Mark D. Hill
Ph.D. Dissertation, U.C. Berkeley, 1987
Hillâs dissertation work, for those obsessed with caching in early systems. A great example of a quantitative dissertation.
[L83] âHints for Computer Systems Designâ
Butler Lampson
ACM Operating Systems Review, 15:5, October 1983
Lampson, a famous systems researcher, loved using hints in the design of computer systems. A hint is something that is often correct but can be wrong; in this use, a signal() is telling a waiting thread that it changed the condition that the waiter was waiting on, but not to trust that the condition will be in the desired state when the waiting thread wakes up. In this paper about hints for designing systems, one of Lampsonâs general hints is that you should use hints. It is not as confusing as it sounds.