Step by Step Ä¿³Î ÇÁ·Î±×·¡¹Ö °Á¨ê
Ä¿³ÎÀǵ¿±âÈ¿¡°üÇÏ¿©
µ¿±âÈ ¹®Á¦´Â Ä¿³Î ÇÁ·Î±×·¡¹Ö¿¡ ÀÖ¾î °¡Àå ±î´Ù·Ó°í ¾î·Á¿î ºÎºÐÀÌ´Ù. óÀ½ºÎÅÍ Á¦´ë·Î ÀÌ ¹®Á¦¸¦ °í·ÁÇØ ¼³°èÇÏÁö ¾ÊÀº °æ¿ì °¡Àå ¹ß»ýÇϱ⠽±Áö¸¸ Á¤ÀÛ ÇØ°áÁ¡À» ã±â´Â °¡Àå ¾î·Á¿î ¹®Á¦´Ù. À̹ø È£¿¡¼´Â µ¿±âÈ ¹®Á¦¸¦ °ÞÁö ¾Ê±â À§ÇØ Ä¿³Î¿¡ »ç¿ëµÇ´Â µ¿±âÈ ±â¹ý Áß ´ëÇ¥ÀûÀÎ ¸î °¡Áö¸¦ »ìÆìº¸±â·Î ÇÑ´Ù.
±Û _ ±è¹ÎÂù KLDP ¸â¹ö, Àü¹® ÇÁ·Î±×·¡¸Ó
¿¬Àç ¼ø¼
¨ç Ä¿³Î ÇÁ·Î±×·¡¹Ö ȯ°æ ±¸ÃàÇϱâ¿Í Ư¡
¨è ¸ðµâ ±¸ÇöÇϱâ
¨é ¸®´ª½º Ä¿³ÎÀÇ ¸Þ¸ð¸® °ü¸®
¨ê Ä¿³ÎÀÇ µ¿±âÈ¿¡ °üÇÏ¿©
¨ë Ä¿³ÎÀÇ ½Ã°£°ü¸® ¹× Áö¿¬ ÇÔ¼ö¿¡ ´ëÇÏ¿©
¨ì ÆÄÀϽýºÅÛ°ú proc file system »ç¿ëÇϱâ
±î´Ù·Ó°í ¾î·Á¿î µ¿±âÈ ¹®Á¦
¸®´ª½º Ä¿³ÎÀÌ 2.0À¸·Î ¹ßÀüÇÏ¸é¼ SMP(SymmtricMultiprocessing)À» Áö¿øÇϱ⠽ÃÀÛÇß°í ÀÌ·Î ÀÎÇÏ¿© Ä¿³ÎÀÇ °øÀ¯ ÀÚ¿ø¿¡ ´ëÇÑ LockÀº º¹ÀâÇØÁö±â ½ÃÀÛÇß´Ù. SMP¸¦ Áö¿øÇϱ⠽ÃÀÛÇÏ¸é¼ ¾î¶² Ä¿³Î ÄÚµåÀÌ°Ç 2°³ ÀÌ»óÀÇ CPU¿¡¼ ¼öÇàµÉ ¼ö Àֱ⠶§¹®¿¡ ½ºÅÿ¡ ÇÒ´çµÈ ÀÚ¿øÀ» Á¦¿ÜÇϰí´Â µ¿½Ã¿¡ Çϳª ÀÌ»óÀÇ CPU°¡ Á¢±ÙÇÒ ¼ö ÀÖ°Ô µÆÀ¸¸ç ±×·Î ÀÎÇØ ÇÁ·Î±×·¡¸Ó´Â ¿©·¯ °¡Áö °í·ÁÇØ¾ß ÇÒ °ÍÀÌ ¸¹¾ÆÁ³´Ù. ¹Ý¸é, ¿©ÀüÈ÷ ÇϳªÀÇ CPU¸¸À» °®´Â ȯ°æÀÇ °³¹ßÀÚµéÀº SMP
¸¦ °í·ÁÇÏÁö ¾Ê¾Æµµ µÇ±â ¶§¹®¿¡ »ç½Ç µ¿±âÈ¿¡ ´ëÇØ¼´Â Å« °ü½ÉÀÌ °¡ÁöÁö ¾Ê¾Æ ¿Ô´Ù. ¾ÆÁ÷µµ ÀÓº£µðµå ȯ°æ¿¡¼´Â ÀϹÝÀûÀ¸·Î CPU°¡ ÇϳªÀ̱⠶§¹®¿¡ µ¿±âÈ¿¡ °üÇÏ¿© Å« ½Å°æÀ»
¾²Áö ¾Ê±âµµ ÇÑ´Ù. ÇÏÁö¸¸ Áö±ÝÀº ´Ù ¿¾¸»ÀÌ µÆ´Ù. ¸®´ª½º Ä¿³ÎÀÌ 2.6À¸·Î ¹ßÀüÇÏ¸é¼ ¼±Á¡Çü Ä¿³Î(Preemptible Kernel)À» Áö¿øÇϱ⠽ÃÀÛÇ߱⠶§¹®ÀÌ´Ù. ¼±Á¡Çü Ä¿³ÎÀ̶õ Ä¿³Î ÀÚü°¡
¼±Á¡µÉ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. Áï, Ä¿³ÎÀÌ Æ¯Á¤ Äڵ带 ¼öÇàÇϰí ÀÖ´Â µµÁß ¼±Á¡µÇ¾î Ä¿³ÎÀÇ ´Ù¸¥ ºÎºÐÀÇ Äڵ带, ¶Ç´Â Àü¿¡ ¼±Á¡µÇ±â Á÷Àü¿¡ ½ÇÇàÇϰí ÀÖ´ø Äڵ带 ´Ù½Ã ¼öÇàÇÒ ¼ö ÀÖ´Ù´Â °Í
ÀÌ´Ù. Àü¿¡ ¼öÇàÇÏ´ø ÄÚµå·Î ÀçÁøÀÔÇÑ´Ù´Â °ÍÀº °á±¹ SMP¿Í ´Ù¸¦ ¹Ù ¾ø°Ô ¸¸µç´Ù. ÀÌ·Î ÀÎÇÏ¿© Up(Uniprocessor)ȯ°æ¿¡¼ÀÇ Lock ¶ÇÇÑ º¹ÀâÇØÁö±â ½ÃÀÛÇß´Ù. ±×·¸´Ù. À̹ø È£¿¡¼ ´Ù·ê
ÁÖÁ¦´Â ¸®´ª½º Ä¿³ÎÀÇ µ¿±âÈ¿¡ °üÇÑ °ÍÀÌ´Ù. µ¿±âÈ ¹®Á¦´Â Ä¿³Î ÇÁ·Î±×·¡¹Ö¿¡ ÀÖ¾î °¡Àå ±î´Ù·Ó°í ¾î·Á¿î ºÎºÐÀÌ´Ù. óÀ½ºÎÅÍ µ¿±âÈ ¹®Á¦¸¦ °í·ÁÇϰí Á¦´ë·Î ¼³°èÇÏÁö ¾ÊÀ¸¸é °¡Àå
¹ß»ýÇϱâ´Â ½¬¿î ¹Ý¸é, ÇØ°áÁ¡À» ã±â´Â °¡Àå ¾î·Á¿î °ÍÀÌ ¹Ù·Î ÀÌ µ¿±âÈ ¹®Á¦ÀÌ´Ù. À̹ø È£¿¡¼´Â µ¿±âÈ ¹®Á¦¸¦ °ÞÁö ¾Ê±â À§ÇØ Ä¿³Î¿¡ »ç¿ëµÇ´Â µ¿±âÈ ±â¹ý Áß ´ëÇ¥ÀûÀÎ ¸î °¡Áö¸¦
»ìÆìº¸±â·Î ÇÑ´Ù
1. µ¿½Ã¼º(Concurrency) ¹®Á¦
ÀϹÝÀûÀ¸·Î °øÀ¯µÈ ÀÚ¿øÀ» Á¶ÀÛÇÏ´Â Äڵ尡 ÀÖ´Â ºÎºÐÀ» °æÀﱸ°£(Critical Region)À̶ó°í ÇÑ´Ù. °æÀﱸ°£ÀÇ ÄÚµå´Â ¿øÀÚÀû(Atomic)À¸·Î ¼öÇàµÇ¾î¾ß¸¸ ÇÑ´Ù. ¾î¶² Äڵ尡 ¿øÀÚÀûÀ¸·Î ¼ö
ÇàµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀº °æÀﱸ°£ÀÇ Äڵ尡 ´Ù¸¥ Äڵ忡 ÀÇÇØ ¹æÇعÞÁö(Interrupted) ¾Ê°í ÃÖÃÊ ¼ÒÀ¯ÁÖ°¡ °è¼ÓÇØ¼ Á¦¾î±Ç(Control)À» °®°í ½ÇÇàÇÏ¿©¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÌ·± »óȲÀÌ Áö
ÄÑÁöÁö ¾ÊÀ¸¸é °æÀï»óÅÂ(Race Condition) ¹®Á¦°¡ ¹ß»ýÇÏ¿© ¿¹»óÄ¡ ¸øÇÑ °á°ú¸¦ ¹ß»ý½ÃŰ°Ô µÈ´Ù. ÇöÀçÀÇ ¸®´ª½º Ä¿³ÎÀº ¸¹Àº µ¿½Ã¼º ¹®Á¦¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ·± ¹®Á¦¸¦ ÀÏÀ¸Å°´Â ¿øÀεéÀº ´ÙÀ½°ú °°´Ù.
¡Ü ÀÎÅÍ·´Æ®(interrupt)
¡Ü ¼±Á¡°¡´ÉÇÑ Ä¿³Î(preemptible kernel)
¡Ü smp
¡Ü Áö¿¬ ÇÔ¼ö(delayed function)
°¢°¢À» »ìÆìº¸¸é ´ÙÀ½°ú °°´Ù.
ÀÎÅÍ·´Æ®´Â ºñµ¿±âÀûÀÎ À̺¥Æ®ÀÌ´Ù. ±×·¯¹Ç·Î ÀÎÅÍ·´Æ®°¡ disableµÇ¾î ÀÖÁö ¾Ê´Â ÇÑ ¾ðÁ¦µçÁö Ä¿³Î ÄÚµåÀÇ ¼öÇ൵Áß ÀÎÅÍ·´Æ®´Â ¹ß»ýµÉ ¼ö ÀÖ´Ù. À̶§ ¹®Á¦°¡ µÇ´Â °ÍÀº ÀÎÅÍ·´Æ®°¡
¹ß»ýÇÏ´Â ½Ã°£¿¡ Ä¿³Î¿¡¼ ¼öÇàµÇ°í ÀÖ´ø Äڵ尡 Ä¿³ÎÀÇ °øÀ¯ÀÚ¿øÀ» »ç¿ëÇϰí ÀÖÀ» °æ¿ìÀÌ´Ù. ¶Ç´Â ¼öÇàÁßÀ̾ú´ø ÇÔ¼ö°¡ ÀçÁøÀÔ °¡´ÉÇÏ°Ô ¼³°èµÇ¾î ÀÖÁö ¾ÊÀº °æ¿ìÀÌ´Ù. ÀÎÅÍ·´Æ® ÇÚ
µé·¯¿¡¼ ¼±Á¡µÇ¾ú´ø ÇÔ¼ö·Î ÀçÁøÀÔÇϰųª ¶Ç´Â ÀÎÅÍ·´Æ® Çڵ鷯¿¡¼ È£ÃâÇÑ ÇÔ¼ö°¡ ¼±Á¡µÇ¾ú´ø Äڵ尡 »ç¿ëÁßÀ̾ú´ø Ä¿³ÎÀÇ °øÀ¯ÀÚ¿ø¿¡ ´ëÇÑ ¾÷µ¥ÀÌÆ®¸¦ ÇÒ °æ¿ì ÀÚ¿øÀÇ ¾ÈÁ¤¼ºÀ»
±ú¶ß¸®´Â ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.
Ä¿³Î ¹öÁ¯ÀÌ 2.6À¸·Î ¿Ã¶ó°¡¸é¼ Ä¿³Î ÀÚü°¡ ¼±Á¡ °¡´ÉÇÏ°Ô ¹Ù²î¾ú´Ù. Ä¿³ÎÀÌ ¼±Á¡ °¡´ÉÇÏ´Ù, ÇÏÁö ¾Ê´Ù´Â °ÍÀº ´ÙÀ½°ú °°Àº Â÷À̰¡ ÀÖ´Ù. ¸ÕÀú Ä¿³ÎÀÌ ¼±Á¡ °¡´ÉÇÏÁö ¾Ê´Ù´Â °ÍÀº Ä¿³Î
ÀÇ Äڵ带 ¼öÇà µµÁß ÀÚ½ÅÀÌ Á÷Á¢ Á¦¾î±ÇÀ» ¾çº¸ÇÏÁö ¾Ê´Â ÇÑ °è¼ÓÇØ¼ Á¦¾î±ÇÀ» °¡Áö°í ¼öÇàÇÏ´Â °ÍÀÌ´Ù. ¹Ý¸é Ä¿³ÎÀÌ ¼±Á¡ °¡´ÉÇÏ´Ù´Â °ÍÀº Ä¿³ÎÀÇ ÄÚµå ¼öÇà ÁßÀÌ¶óµµ ÀÚ½ÅÀÇ ÀÇÁö
¿Í´Â »ó°ü¾øÀÌ ´Ù¸¥ ÇÁ·Î¼¼½º·Î Á¦¾î±ÇÀ» ¾çº¸ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÌ Â÷ÀÌ´Â Ä¿³Î ÇÁ·Î±×·¡¸ÓÀÇ ÀÔÀå¿¡¼´Â Å« º¯È·Î ´À²¸Áú ¼ö ¹Û¿¡ ¾ø´Ù. ¿Ö³ÄÇϸé ÀÚ½ÅÀÌ ¸¸µç Äڵ尡 ¾ðÁ¦ ¼±Á¡µÇ¾î ÀçÁøÀԵǰųª ¶Ç´Â °øÀ¯ ÀÚ¿øÀÌ ºÒ¾ÈÁ¤(Inconsistency)ÇÏ°Ô µÉÁö ¸ð¸£±â ¶§¹®ÀÌ´Ù.
¸®´ª½º Ä¿³ÎÀÌ 2.0À¸·Î ¹ßÀüÇϸ鼺ÎÅÍ SMP¸¦ Áö¿øÇϱ⠽ÃÀÛÇß´Ù. ÃÊâ±â¿¡´Â SMP¸¦ Áö¿øÇÑ´Ù ÇÏ´õ¶óµµ ¸¹Àº LockÀ» °¡Áö°í ÀÖÁö´Â ¾Ê¾ÒÁö¸¸ Á¡Â÷ ¼º´É¹®Á¦°¡ ³ªÅ¸³ª¸é¼ ¸¹Àº
LockµéÀÌ ´õ Àß°Ô(Fine-Grained) Âɰ³Áö¸ç ÇöÀç´Â 1000¿©°³ ÀÌ»óÀÇ LockµéÀÌ Ä¿³Î ³»¿¡ Á¸ÀçÇϰí ÀÖ´Ù. SMP¿¡ °üÇÑ ¹®Á¦ÀÇ ±Ùº»¿øÀÎÀº ƯÁ¤ °æÀﱸ°£ÀÌ 2°³ ÀÌ»óÀÇ ÇÁ·Î¼¼¼¿¡
¼ µ¿½Ã¿¡ ½ÇÇàµÉ ¼ö ÀÖ´Ù´Â ¹®Á¦¿¡¼ ºñ·ÔµÈ´Ù.
Ä¿³ÎÀº ºü¸¥ ÀÀ´ä¼ºÀ» º¸ÀåÇϱâ À§ÇØ ¸¹Àº Áö¿¬(Delayed) ÇÔ¼ö(workqueue, softirq, tasklet, timer)µéÀ» Áö¿øÇϰí ÀÖ´Ù. Áö¿¬ ÇÔ¼öµéÀÇ »ç¿ëÀº ƯÁ¤ ŽºÅ©ÀÇ Äڵ带 ¼öÇàÇÏ´Â µµÁß
¼öÇàµÇ°í ÀÖ´ø ŽºÅ©¿Í ÀüÇô °ü·ÃµÇÁö ¾ÊÀº ÄÚµåµéÀÌ ¾ðÁ¦³ª È£ÃâµÉ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÀÌ ¶ÇÇÑ ¾Õ¿¡¼ º» °Íµé°ú ¸¶Âù°¡Áö·Î ÀçÁøÀÔÀ̳ª °øÀ¯ ÀÚ¿øÀÇ ºÒ¾ÈÁ¤¼º¿¡ ¹®Á¦¸¦ ÀÏÀ¸Å³
¼ÒÁö¸¦ °¡Áö°í ÀÖ´Ù. ¾ÕÀ¸·Î ÀÌ·¯ÇÑ ¹®Á¦µéÀ» ¸·±â À§ÇÏ¿© ¸®´ª½º Ä¿³ÎÀº ¾î¶² ±â¹ýµéÀ» Á¦°øÇÏ´ÂÁö ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. (¾ÕÀ¸·Î °Á¸¦ ÁøÇàÇϸé LockÀ» ¾ò´Â °ÍÀ»¡°Àâ¾Ò´Ù¡±, LockÀ» ÇØÁöÇÏ´Â °ÍÀ»¡°Ç®¾ú´Ù¡±¶ó´Â ´Ü¾î·Î »ç¿ëÇÒ °ÍÀÌ´Ù.)
2. semaphore
¸®´ª½º¿¡¼ ¼¼¸¶Æ÷¾î´Â Sleeping LockÀÌ´Ù. Sleeping LockÀÌ ÀǹÌÇÏ´Â °ÍÀº ÇϳªÀÇ Å½ºÅ©°¡ ÀÌ¹Ì LockÀ» Àâ°í ÀÖ´Â »óÅ¿¡¼ ´Ù¸¥ ŽºÅ©°¡ LockÀ» ´Ù½Ã ÀâÀ¸·Á°í ÇÑ´Ù¸é ¼¼¸¶Æ÷
¾î´Â ³ªÁß¿¡ LockÀ» ÀâÀ¸·Á°í Çß´ø ŽºÅ©¸¦ wait queue¿¡ ³Ö°í sleep»óÅ·Π¸¸µé¾î ¹ö¸°´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ±×¸®°í ¼¼¸¶Æ÷¾îÀÇ lockÀ» ¸ÕÀú Àâ°í ÀÖ´ø ŽºÅ©°¡ ¼¼¸¶Æ÷¾î¸¦ Ç®°ÔµÇ
¸é ¼¼¸¶Æ÷¾îÀÇ wait queue¿¡ ´ë±âÇϰí Àִ ŽºÅ© Áß Çϳª¸¦ ±ú¿ö¼ ¼¼¸¶Æ÷¾î¸¦ Àâ°Ô ¸¸µç´Ù. ÀÌ·¯ÇÑ Æ¯¼ºÀ¸·Î ÀÎÇØ ¼¼¸¶Æ÷¾î´Â ÀÎÅÍ·´Æ® ÄÁÅØ½ºÆ®¿¡¼´Â »ç¿ëÇÒ ¼ö ¾ø´Ù. ¿Ö³ÄÇϸé
ÀÎÅÍ·´Æ® ÄÁÅØ½ºÆ®¿¡¼´Â ŽºÅ© ½ºÄÉÁÙ¸µÀÌ ÀϾ¼´Â ¾ÈµÇ±â ¶§¹®ÀÌ´Ù(ÀÌ ºÎºÐÀº ³ªÁß¿¡ ÀÚ¼¼È÷ ¼³¸íÇϵµ·Ï ÇÑ´Ù.) ±×·¯¹Ç·Î ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â »óȲÀº ÇÁ·Î¼¼½º ÄÁÅØ½ºÆ®
¿¡¼¸¸ °¡´ÉÇÏ´Ù. ¶ÇÇÑ ¼¼¸¶Æ÷¾î´Â ¾ÕÀ¸·Î º¸°Ô µÉ spinlockº¸´Ù ±ä ½Ã°£À» ±â´Ù·Á¾ß ÇÏ´Â »óÇ׿¡¼ ÀÚÁÖ »ç¿ëµÈ´Ù. ¼¼¸¶Æ÷¾î¸¦ ¾òÀ¸·Á°í Çϴ ŽºÅ©¸¦ sleep½ÃŰ°í ´Ù½Ã ½ºÄÉÁÙ¸µÇÏ
°í ÇÏ´Â ½Ã°£Àº CPUÀÇ °üÁ¡¿¡¼ ºÃÀ» ¶§´Â ±²ÀåÈ÷ Å« ½Ã°£À̱⠶§¹®ÀÌ´Ù. ±×·¯¹Ç·Î ÀϹÝÀûÀ¸·Î °øÀ¯µÇ´Â ÀÚ¿øÀ» ¾ò±â±îÁöÀÇ ½Ã°£ÀÌ ÂªÁö ¾ÊÀº °æ¿ì »ç¿ëµÈ´Ù. ¼¼¸¶Æ÷¾î°¡ »óÈ£¹èÁ¦(mutual exclusion)À» À§ÇØ »ç¿ëµÉ ¶§, Áï ÇÑ °æÀﱸ°£ÀÌ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ Á¢±Ù°¡´ÉÇϵµ·Ï ÇÒ °æ¿ì
¿ì¸®´Â ¼¼¸¶Æ÷¾î¸¦ ¹ÂÅØ½º(mutex)¶ó°í ºÎ¸¥´Ù. ¹ÂÅØ½º´Â mutual exclusionÀÇ ¾à¾î·Î½á ¸®´ª½º¿¡¼ »ç¿ëµÇ´Â °ÅÀÇ ¸ðµç ¼¼¸¶Æ÷¾î´Â ¹ÂÅØ½º·Î »ç¿ëµÇ°í ÀÖ´Ù.
¼¼¸¶Æ÷¾îÀÇ ±¸ÇöÀº ¾ÆÅ°ÅØÃ³¸¶´Ù ´Ù¸£´Ù. ±×·¯¹Ç·Î Ä¿³ÎÀÇ asm µð·ºÅ丮¿¡ ±¸ÇöµÇ¾î ÀÖ´Ù. ¸ÕÀú ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇϱâÀ§Çؼ´Â <asm/semaphore.h>¸¦ includeÇØ¾ß ÇÑ´Ù. Á¤ÀûÀ¸
·Î ¼±¾ðµÈ ¼¼¸¶Æ÷¾î¸¦ ¸¸µé±â À§Çؼ´Â ´ÙÀ½°ú °°Àº ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÑ´Ù.
static declare_semaphore_generic(name, count);
nameÀÌ ÀǹÌÇÏ´Â °ÍÀº º¯¼öÀÇ À̸§À̰í count´Â ¼¼¸¶Æ÷¾îÀÇ »ç¿ë countÀÌ´Ù. count¸¦ 1·Î ÇÏ¸é ¹ÂÅØ½º°¡ µÇ´Â °ÍÀÌ´Ù. Ä¿³ÎÀº ¹ÂÅØ½º¸¦ ¸¸µé±â À§ÇØ ´õ ÆíÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù.
static declare_mutex(name)
¶ÇÇÑ ¼¼¸¶Æ÷¾î¸¦ µ¿ÀûÀ¸·Î ÃʱâÈÇϱâ À§Çؼ´Â ´ÙÀ½°ú °°Àº ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÑ´Ù.
void sema_init(struct semaphore *sem, int val);
void init_mutex(struct semaphore *sem);
¿©±â¼ semÀº ¼¼¸¶Æ÷¾îÀÇ Æ÷ÀÎÅÍÀ̸ç count´Â ¿ª½Ã usage countÀÌ´Ù.
¼¼¸¶Æ÷¾î¸¦ ¾ò±â À§ÇÑ ÇÔ¼ö·Î½á´Â down_interruptible( ) ÇÔ¼ö°¡ ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â ¼¼¸¶Æ÷¾î¸¦ ¾òÀ¸·Á´Â µ¥ ½ÇÆÐÇϸé ÇØ´çŽºÅ©¸¦ task_interruptible »óÅ·Π¸¸µç´Ù. ŽºÅ©°¡
task_interruptible »óÅ¿¡ ÀÖ´Ù´Â °ÍÀº ÇØ´ç ŽºÅ©°¡ signal¿¡ ÀÇÇØ ±ú¾î³¯ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ±×·¯¹Ç·Î ¼¼¸¶Æ÷¾î¸¦ ±â´Ù¸®°í ÀÖ´Â ÇÁ·Î¼¼½º¸¦ »ç¿ëÀÚ°¡ Áß°£¿¡ ÀÎÅÍ·´Æ®ÇÒ ¼ö
ÀÖ°Ô ¸¸µç´Ù. down_interruptibleÇÔ¼ö°¡ lockÀ» ¾ò¾î¼ ±ú¾î³ °æ¿ì°¡ ¾Æ´Ï°í Áß°£ÀÇ ´Ù¸¥ ÀÎÅÍ·´Æ®·Î ÀÎÇØ ±ú¾î³ª°Ô µÇ¸é eintr¸¦ ¹ÝȯÇÑ´Ù. ±×·¯¹Ç·Î down_interruptible( )À» »ç¿ë
ÇÏ´Â »ç¿ëÀÚ´Â Ç×»ó ¹Ýȯ°ªÀ» Ã¼Å©ÇØ¾ß ÇÑ´Ù. ¹Ý¸é down( )ÇÔ¼ö´Â È£ÃâÇÑ ÇÁ·Î¼¼½º¸¦ non-interruptible state·Î ¸¸µé°Ô µÈ´Ù. ÀÌ´Â ¿©·¯ºÐÀÌ ps ¸í·ÉÀ» ÅëÇØ ÇØ´ç ŽºÅ©¸¦ ºÃÀ» ¶§
state¿¡¡°d state¡±¶ó Ç¥½ÃµÇ´Â ŽºÅ©µéÀÌ´Ù.
¼¼¸¶Æ÷¾î¸¦ ÇØÁöÇÏ´Â ÇÔ¼ö´Â up( ) ÇÔ¼öÀÌ´Ù. ÀϹÝÀûÀ¸·Î ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ´Â ¿¹Á¦´Â ´ÙÀ½°ú °°´Ù.
static declare_mutex(mr_sem);
...
if (down_interruptible(&mr_sem))
..
/* critical region ...*/
up(&mr_sem)
À̹ۿ¡µµ down_trylock( )°ú °°Àº ÇÔ¼ö´Â ÇØ´ç ¼¼¸¶Æ÷¾î¸¦ ¾òÀ¸·Á°í ½ÃµµÇغ¸°í ¼¼¸¶Æ÷¾î°¡ lockµÇ¾î ÀÖ´Ù¸é sleep »óÅ·Πµé¾î°¡´Â °ÍÀÌ ¾Æ´Ï°í 0ÀÌ ¾Æ´Ñ °ªÀ» ¹ÝȯÇÏ°Ô µÈ´Ù.
3. read/write semaphore
¼¼¸¶Æ÷¾î´Â °¢ ¾²·¹µå°¡ ¹«¾ùÀ» ÇÏ´À³Ä¿Í´Â »ó°ü¾øÀÌ ¹«Á¶°Ç ¸ðµç È£ÃâÀÚ¸¦ À§ÇÏ¿© »óÈ£¹èÁ¦¸¦ Á¦°øÇÑ´Ù. ÇÏÁö¸¸ ¸¹Àº ŽºÅ©µéÀÌ °øÀ¯µÇ´Â ÀÚ¿ø¿¡ ´ëÇÏ¿© ÇÏ´Â ÀÏÀº Àбâ¿Í ¾²±â, µÎ
°¡Áö typeÀÇ operationÀ¸·Î ±¸º°µÉ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô ±¸º° µÉ¼ö ÀÖ´Ù¸é ´ÙÀ½°ú °°Àº ÀÏÀÌ °¡´ÉÇØÁø´Ù. °øÀ¯µÇ´Â ÀÚ¿ø¿¡ ´ëÇÏ¿© º¯°æÀÌ ÀÖÁö ¾Ê´Â ÇÑ 2°³ ÀÌ»óÀÇ readerµéÀÌ ÇØ´ç ÀÚ¿ø
¿¡ ´ëÇÏ¿© lockÀÇ ¼ÒÀ¯°¡ °¡´ÉÇØÁö´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î ´Ù¸¥ reader°¡ °æÀﱸ°£¿¡ ÀÖ´õ¶óµµ ¶Ç ´Ù¸¥ reader°¡ °æÀﱸ°£¿¡ ÁøÀÔÀÌ °¡´ÉÇÏ°Ô µÊÀ¸·Î½á ¼¼¸¶Æ÷¾îÀÇ »ç¿ëÀ» º¸´Ù ÃÖÀûÈ ÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
reader/writer ¼¼¸¶Æ÷¾î´Â <linux/rwsem.h>¿¡ Á¤ÀǵǾî ÀÖ´Ù. ¼¼¸¶Æ÷¾î¿Í ¸¶Âù°¡Áö·Î Á¤ÀûÀ¸·Î ÇÒ´çµÈ reader/writer ¼¼¸¶Æ÷¾î¸¦ ¸¸µé±â À§Çؼ´Â ´ÙÀ½°ú °°Àº ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
static declare_rwsem(name);
nameÀº »õ·Ó°Ô ¸¸µé¾îÁú ¼¼¸¶Æ÷¾îÀÇ À̸§ÀÌ´Ù. µ¿ÀûÀ¸·Î´Â ´ÙÀ½°ú °°Àº ÀÎÅÍÆäÀ̽º·Î ¸¸µé ¼ö ÀÖ´Ù.
void init_rwsem(struct rw_semaphore *sem);
ÃʱâÈµÈ lockÀ» Àâ±â À§ÇÑ °æ¿ì read ¼¼¸¶Æ÷¾î¸¦ Àâ±â À§ÇÑ ÀÎÅÍÆäÀ̽º´Â ´ÙÀ½°ú °°´Ù.
void down_read(struct rw_semaphore *sem);
int down_read_trylock(struct rw_semaphore *sem);
void up_read(struct rw_semaphore *sem);
down_read´Â °øÀ¯µÇ´Â ÀÚ¿ø¿¡ ´ëÇÏ¿© read-only access¸¦ Á¦°øÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ŽºÅ©¸¦ uninterruptible state·Î ¸¸µç ´Ù. ±×·¯¹Ç·Î À̸¦ ¿øÄ¡ ¾ÊÀ» °æ¿ì down_read_trylock À» »ç
¿ëÇÏ¸é µÈ´Ù. ÇÏÁö¸¸ ÁÖÀÇÇØ¾ß ÇÒ °ÍÀº down_read_trylockÀº ´Ù¸¥ Ä¿³Î ÇÔ¼ö¿Í´Â ¹Ýȯ°ªÀÌ ´Ù¸£´Ù´Â °ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î 0 À» ¹ÝȯÇϸé ÇÔ¼öÀÇ ¼º°øÀ» ÀǹÌÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é ½ÇÆÐ¸¦
ÀǹÌÇÏ´Â °ÍÀÌ °ü·ÊÀε¥ ÀÌ ÇÔ¼ö´Â ±× ¹Ý´ë·Î 0À» ¹ÝȯÇϸé lockÀ» ÀÌ¹Ì ´©°¡ Àâ°í ÀÖ´Ù´Â °ÍÀ¸·Î ÀǹÌÇÑ´Ù. ±×·¯¹Ç·Î ¹Ýȯ°ª¿¡ ÁÖÀÇÇØ¼ »ç¿ëÇÏÀÚ. down_read·ÎºÎÅÍ È¹µæÇÑ ¼¼¸¶Æ÷
¾î´Â up_read¿¡ ÀÇÇØ ÇØÁöµÈ´Ù. À̹ø¿¡´Â writer¸¦ À§ÇÑ ÀÎÅÍÆäÀ̽º´Ù. reader¿Í À¯»çÇϹǷÎ
¼³¸íÀº »ý·«Çϱâ·Î ÇÑ´Ù.
void down_write(struct rw_semaphore *sem);
int down_write_trylock(struct rw_semaphore *sem);
void up_write(struct rw_semaphore *sem);
reader/writer lockÀÇ ¸ðµç readerµéÀº ¾î¶² writerµµ LockÀ» ¼ÒÀ¯Çϰí ÀÖÁö ¾Ê´Â ÇÑ LockÀ» ÀâÀ» ¼ö ÀÖ°Ô µÈ´Ù. ÇÏÁö¸¸ ¹Ý´ë·Î writer´Â ¾î¶² readerµµ LockÀ» Àâ°í ÀÖÁö ¾Ê°í ´Ù¸¥ ¾î¶² writerµµ lockÀ» Àâ°í ÀÖÁö ¾ÊÀº °æ¿ì¿¡¸¸ LockÀ» ÀâÀ» ¼ö ÀÖ°Ô µÈ´Ù. À̰ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â writer´Â readerº¸´Ù ´õ ³ôÀº ¿ì¼±¼øÀ§¸¦ °¡Áö°í ÀÖ´Ù´Â °ÍÀÌ´Ù.
¿¹¸¦ µé¾î writer°¡ °æÀﱸ°£¿¡ µé¾î°¡°Ô µÇ°í ´Ù¸¥ writer°¡ ¸ÕÀú lockÀ» ¼ÒÀ¯ÇÑ writer¸¦ ±â´Ù¸®°í ÀÖ°í ¶Ç ´Ù¸¥ writer°¡ ¶Ç ¾ÕÀÇ writer¸¦ ±â´Ù¸®°í¡¦ ÀÌ·± »óȲÀÌ °è¼ÓÇØ¼ ¹ß»ýÇÏ°Ô µÇ¸é ¸ðµç writer µéÀÌ ÀÏÀ» ³¡¸¶Ä¡±â Àü¿¡´Â ¾î¶² readerµµ lockÀ» ÀâÀ» ¼ö ¾ø°Ô µÉ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¹®Á¦´Â reader starvation¹®Á¦¸¦ ¹ß»ý½ÃÄÑ ¾î¶² reader·Î lockÀ» ÀâÁö ¸ø ÇÏ°Ô µÉ °ÍÀÌ´Ù. ±×·¸±â ¶§¹®¿¡ ¿©·¯ºÐÀÌ reader-writer ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ·Á ÇÒ ¶§ À¯³äÇØ¾ß ÇÒ °ÍÀº reader/writer ¼¼¸¶Æ÷¾î´Â writeÁ¢±ÙÀÌ º°·Î ¾ø°í Á¢±ÙÀ» ÇÏ´õ¶óµµ ¸Å¿ì ª°Ô »ç¿ëÇÏ°í ¹Ý³³ÇÏ´Â °æ¿ì¿¡ »ç¿ëÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù.
4. completion
Ä¿³Î ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ù º¸¸é ƯÁ¤ À̺¥Æ®°¡ ¿Ï·áµÇ±â¸¦ ±â´Ù·Á¾ß ÇÏ´Â Äڵ带 ÀÛ¼ºÇØ¾ß ÇÒ °æ¿ì°¡ ¸¹´Ù. ¼¼¸¶Æ÷¾î¸¦ ¹è¿î ¿©·¯ºÐµéÀº ´ÙÀ½°ú °°Àº Äڵ带 ÀÛ¼ºÇÏ¿© ¸ñÀûÀ» ´Þ¼ºÇÒ ¼ö
ÀÖÀ» °ÍÀÌ´Ù.
void test_xxx_function(void)
{
struct semaphore sem;
init_mutex_locked(&sem);
start_external_task(&sem);
down(&sem);
....
...
}
void start_external_task(struct semaphore *sem)
{
...
...
up(sem);
}
ÇÏÁö¸¸ À§¿Í °°Àº ÄÚµå´Â ¹®Á¦°¡ ÀÖ´Ù. ¹®Á¦°¡ ¹ß»ýÇÏ´Â ÀÌÀ¯´Â ¿©·¯ºÐÀº ¼¼¸¶Æ÷¾î¸¦ Áö¿ªº¯¼ö·Î ¼±¾ðÇ߱⠶§¹®ÀÌ´Ù. ¶ÇÇÑ Ä¿³ÎÀÇ ¼¼¸¶Æ÷¾îÀÇ ±¸ÇöÀ» »ìÆìº¸¸é down°ú upÇÔ¼ö´Â ¿©·¯CPU¿¡¼ º´·ÄÀûÀ¸·Î ¼öÇàµÉ ¼ö ÀÖµµ·Ï ¸¸µé¾îÁ® Àֱ⠶§¹®ÀÌ´Ù. Áï start_external_task°¡ È£ÃâÇÑ up ÇÔ¼ö¿¡¼´Â test_xxx_function()ÇÔ¼öÀÇ ½ºÅÿ¡¼ »ç¶óÁø sem º¯¼ö¸¦ Á¢±ÙÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϱ⠸®´ª½º Ä¿³Î 2.4.7¿¡¼ completionÀÌ Ãß°¡µÇ¾ú´Ù. completionÀº ÇÑ Å½ºÅ©°¡ ´Ù¸¥ ŽºÅ©¿¡°Ô ÀÛ¾÷ÀÌ ¿Ï·áµÇ¾úÀ» ÅëÁöÇÏ´Â °£´ÜÇÑ ¸ÞÄ¿´ÏÁòÀ¸·Î µÇ¾î ÀÖ´Ù. completionÀÇ ³»ºÎ´Â ´ÙÀ½¿¡ ¹è¿ì°Ô µÉ spinlockÀ» »ç¿ëÇÏ¿© µ¿½Ã¿¡ È£ÃâµÉ ¼ö ¾øµµ·Ï ÀÛ¼ºµÇ¾î Àֱ⶧¹®¿¡ ¼¼¸¶Æ÷¾î¿¡¼ ¹ß»ýÇÑ ¹®Á¦´Â ÀϾÁö ¾Ê´Â´Ù.
completionÀ» »ç¿ëÇϱâ À§Çؼ´Â <linux/completion.h>¸¦ includeÇØ¾ß ÇÑ´Ù. completionÀº ´ÙÀ½°ú °°ÀÌ ¸¸µé¾î Áú ¼ö ÀÖ´Ù.
declare_completion(my_completion);
completionÀÌ µ¿ÀûÀ¸·Î »ý¼ºµÇ¾ß ÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ´Ù.
struct completion my_completion;
...
init_completion(&my_completion);
completionÀ» ±â´Ù·Á¾ß ÇÏ´Â Ãø¿¡¼´Â ´ÙÀ½°ú °°Àº ÇÔ¼ö È£ÃâÀ» ÅëÇÏ¿© ÅëÁö¸¦ ±â´Ù¸®¸é µÈ´Ù.
void wait_for_completion(struct completion *c);
5. spinlock
À§¿¡¼ ¾ð±ÞÇÏ¿´´ø °Íó·³ ¼¼¸¶Æ÷¾î¿Í completion¸¸À¸·Î Ä¿³ÎÀÇ ¸ðµç ¿µ¿ªÀÇ lockÀ» Ä¿¹öÇÒ ¼ö´Â ¾ø´Ù. ¿Ö³ÄÇÏ¸é ¼¼¸¶Æ÷¾î³ª completionÀº ŽºÅ©¸¦ sleepÇÏ°Ô ¸¸µé±â ¶§¹®ÀÌ´Ù. Ä¿³ÎÀÇ ¸¹Àº ÇÔ¼öµéÀº ŽºÅ©°¡ sleep»óÅ·Πµé¾î°¡¸é ¾È µÇ´Â ºÎºÐÀÌ ¸¹ÀÌ ÀÖ´Ù. Ä¿³Î Äڵ尡 ÀÎÅÍ·´Æ® ÄÁÅØ½ºÆ®¿¡¼ ¼öÇàµÇ°í ÀÖÀ» ¶§°¡ ¹Ù·Î ±× ¶§ÀÌ´Ù. À̶§ sleep »óÅ·Πµé¾î°¡¸é ¾È µÇ´Â ÀÌÀ¯´Â ÇöÀçÀÇ Å½ºÅ©ÀÇ Ä¿³Î ½ºÅÿ¡ nestingµÈ ÀÎÅÍ·´Æ®ÀÇ º¹±Í ÁÖ¼Ò¿Í ¹®¸Æ(CPU register set)ÀÌ µé¾î°¡ Àֱ⠶§¹®ÀÌ´Ù. ¿¹¸¦ µé¾î ¼·Î ´Ù¸¥ ÀÎÅÍ·´Æ® Çڵ鷯°¡ 2¹ø ÀÌ»ó nestingµÈ °æ¿ì¸¦ »ý°¢Çغ¸ÀÚ. ÇöÀç ŽºÅ©ÀÇ Ä¿³Î ½ºÅÿ¡´Â ÇöÀç ¼öÇàÁßÀÎ ÀÎÅÍ·´Æ® Çڵ鷯°¡ º¹±ÍÇÒ ÁÖ¼Ò¿Í ¼±Á¡µÇ¾úÀ» ´ç½ÃÀÇ ¹®¸ÆÀ» º¸°üÇϰí ÀÖ´Ù. ±×·±µ¥ À̶§ ŽºÅ© ½ºÀ§ÄªÀ» À¯¹ßÇÏ´Â ÇÔ¼ö¸¦ È£ÃâÇß´Ù°í ÇÏÀÚ. ±×·¡¼ ŽºÅ© ½ºÀ§ÄªÀÌ ¹ß»ýÇÏ¿´´Ù. ÀÎÅÍ·´Æ® Çڵ鷯°¡ µ¹¾Æ¿Ã °÷À» ÀúÀåÇϰí ÀÖ´Â °÷Àº ÀÌ¹Ì »ç¶óÁ® ¹ö·È´Ù. ¹°·Ð ´Ù¸¥ ¹æ¹ýÀ» ÅëÇØ(ÀÌ¹Ì ingo molar°¡ °ü¸®ÇÏ´Â rt tree¿¡´Â irqó¸® ¾²·¹µå¸¦ µû·Î µÎ¾î ÀÎÅÍ·´Æ® ÄÁÅØ½ºÆ®¿¡¼µµ ½ºÄÉÁÙÀÌ °¡´ÉÇϵµ·Ï µÇ¾î ÀÖÀ½. ÇÏÁö¸¸ mainline¿¡´Â ¹Ý¿µµÇ¾î ÀÖÁö ¾ÊÀ½) µ¿ÀÛÇÒ ¼ö ÀÖ°Ô ¸¸µé ¼öµµ
ÀÖÁö¸¸ ÇöÀç±îÁöÀÇ ¸®´ª½º Ä¿³ÎÀº ±×·± ºÎºÐÀ» °¨¾ÈÇÏÁö ¾Ê°í ´Ü¼øÇÏ°Ô Ã³¸®Çϰí ÀÖ´Ù.
À̶§ ¿ì¸®°¡ »ç¿ëÇÒ ¼ö ÀÖ´Â °ÍÀº spinlockÀÌ´Ù. spinlockÀº À̸§¿¡¼ ÀǹÌÇÏ´Â °Í ó·³ ÇÑ CPU°¡ ƯÁ¤ Ç÷¡±×ÀÇ »óŸ¦ º¸¸ç ·çÇÁ¸¦ µ¹°í(spinning) ÀÖ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÏ´Â °ÍÀÇ
ÀåÁ¡Àº ¼¼¸¶Æ÷¾îº¸´Ù ÈξÀ °¡º±´Ù´Â Á¡ÀÌ´Ù.
¼¼¸¶Æ÷¾îÀÇ °æ¿ì ÇÁ·Î¼¼½º¸¦ sleep »óÅ·ΠµÎ¾ú´Ù°¡ ±ú¿ì´Â Áï, 2¹øÀÇ ÄÁÅØ½ºÆ® ½ºÀ§Äª ºñ¿ëÀÏ ¹ß»ýÇÒ »Ó¸¸ ¾Æ´Ï¶ó ±ú¾î³ª ±â Àü±îÁö ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÇ ½ÇÇàÀ¸·Î ÀÚ¿øÀ» ¼ÒÀ¯Çϱâ±îÁö
´Â ¿À·£½Ã°£ÀÌ °É¸°´Ù.
¹Ý¸é spinlockÀº CPUÇϳª°¡ lockÀÌ Ç®·È´ÂÁö¸¦ °Ë»çÇÏ¸ç °è¼ÓÇØ¼ ·çÇÁ¸¦ µ¹°í Àֱ⠶§¹®¿¡ ´Ù¸¥ CPU°¡ lockÀ» Ç®ÀÚ¸¶ÀÚ ±â´Ù¸®°í ÀÖ´ø CPU´Â lockÀ» ÀâÀ» ¼ö ÀÖ°Ô µÈ´Ù. ¹°·Ð ±â´Ù¸®°í ÀÖ´Â µ¿¾ÈÀÇ CPU »ç¿ëÀ» À¯¿ëÇÑ °÷¿¡ ¾²Áö ¸øÇÑ´Ù´Â ´ÜÁ¡ÀÌ ÀÖ±ä ÇÏÁö¸¸ ªÀº ½Ã°£ µ¿¾ÈÀÇ lockÀ̶ó¸é spinlockÀ» »ç¿ëÇÏ´Â °ÍÀÌ È¿À²ÀûÀÌ´Ù.
spinlockÀº Ư¼º»ó SMP ȯ°æ¿¡¼ »ç¿ëµÇµµ·Ï ¸¸µé¾îÁ³´Ù. ÇÏÁö¸¸ 2.6¿¡¼ ¼±Á¡Çü Ä¿³ÎÀ» Áö¿øÇÏ¸é¼ UP ȯ°æ¿¡¼µµ ¸¶Ä¡ SMP¿Í °°ÀÌ Ä¿³Î Äڵ尡 ÀçÁøÀ﵃ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î spinlock
ÀÌ UP ȯ°æ¿¡¼´Â Ä¿³Î ¼±Á¡À» ºñȰ¼ºÈÇÏ´Â ÄÚµå·Î ¹Ù²ï´Ù.
UP ȯ°æ¿¡¼ Ä¿³ÎÀ» ÄÄÆÄÀÏ ÇÒ ¶§ Ä¿³Î ¼±Á¡À» Ȱ¼ºÈ½ÃŰÁö ¾ÊÀº °æ¿ì¿¡´Â spinlockÀº ±×³É ºó ÄÚµå·Î ¹Ù²î¾î ¾Æ¹«°Íµµ ÇÏÁö ¾Ê°Ô µÈ´Ù. ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ Äڵ尡 UP ȯ°æ¿¡¼¸¸ µ¿ÀÛÇÑ´Ù°í ÇØµµ, Ä¿³Î ¼±Á¡¶§¹®¿¡¶óµµ ¿©·¯ºÐÀº spinlockÀ» »ç¿ëÇÏ¿© º¸È£ÇÏ´Â Äڵ带 ÀÛ¼ºÇØ¾ß ÇÒ Çʿ䰡 ÀÖ´Ù.
spinlockÀ» »ç¿ëÇϱâ À§Çؼ´Â <linux/spinlock.h>¸¦ includeÇØ¾ß ÇÑ´Ù. ´Ù¸¥ °Íµé°ú ¸¶Âù°¡Áö·Î ´ÙÀ½°ú °°ÀÌ »ý¼ºµÉ ¼ö ÀÖ´Ù.
spinlock_t my_lock = spin_lock_unlocked;
µ¿ÀûÀ¸·Î »ý¼ºµÇ¾ß ÇÑ´Ù¸é ´ÙÀ½°ú °°Àº ÇÔ¼ö¸¦ ÅëÇÏ¿© »ý¼ºÇÒ ¼ö ÀÖ´Ù.
void spin_lock_init(spinlock_t *lock);
lockÀ» Àâ´Â ÇÔ¼ö¿Í ÇØÁöÇÏ´Â ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.
void spin_lock(spinlock_t *lock);
void spin_unlock(spinlock_t *lock);
spinlockÀ» »ç¿ëÇÒ ¶§´Â ¸Å¿ì ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¿Ö³ÄÇÏ¸é ´ÙÀ½°ú °°Àº °æ¿ì°¡ ¹ß»ýÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¾î¶² ÇÔ¼ö a°¡ ½ÇÇàµÇ°í ÀÖ´Ù. À̶§ ÇÔ¼ö a´Â °øÀ¯ ÀÚ¿ø c¸¦ »ç¿ëÇϱâ À§Çؼ spin_lock(&c)¸¦ Àâ°í ÀÖ´Â »óÅÂÀÌ´Ù. ±×·±µ¥ °©ÀÚ±â ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ¿´°í ÀÎÅÍ·´Æ® Çڵ鷯°¡ ¼öÇàµÇ¾ú´Ù. ¼öÇàµÈ ÀÎÅÍ·´Æ® Çڵ鷯 ¶ÇÇÑ °øÀ¯ ÀÚ¿ø c¿¡ º¼ÀÏÀ» °¡Áö°í ÀÖ¾î¼
spin_lock(&c)¸¦ È£ÃâÇÏ¿´´Ù. ±×·±µ¥ ¾ÆÁÖ °ø±³·Ó°Ôµµ a¸¦ ¼öÇàÇÏ´ø CPU¿Í ÀÎÅÍ·´Æ® Çڵ鷯¸¦ ¼öÇàÇÏ´ø CPU´Â °°Àº CPUÀÌ´Ù. ±×·¸´Ù¸é ´©°¡ lockÀ» Ç®¾îÁÙ °ÍÀΰ¡? ¿©·¯ºÐÀÇ ÄÄÇ»ÅÍ´Â ¾Æ¹«°Í¿¡µµ ÀÀ´äÇÏÁö ¸øÇÏ´Â »óŰ¡ µÉ °ÍÀÌ´Ù. ÀÌ¿Í °°Àº Çö»óÀ» ¸·±â À§Çؼ spinlock¿¡´Â ´ÙÀ½°ú °°Àº ÇÔ¼öµéÀÌ Ãß°¡·Î ÀÖ´Ù.
void spin_lock_irqsave(spinlock_t
*lock,unsigned long flags);
void spin_lock_irq(spinlock_t *lock);
void spin_lock_bh(spinlock_t *lock);
void spin_unlock_irqrestore(spinlock_t
*lock, unsigned long flags);
void spin_unlock_irq(spinlock_t *lock);
void spin_unlock_bh(spinlock_t *lock);
spin_lock_irqsave ÇÔ¼ö´Â spinlockÀ» È£ÃâÇϱâ ÀÌÀü¿¡ local CPUÀÇ ÀÎÅÍ·´Æ®¸¦ ±ÝÁöÇÑ´Ù. ±×¸®°í ÇÔ¼ö È£Ãâ Á÷ÀüÀÇ ÀÎÅÍ·´Æ® enable/disable »óŸ¦ flags¿¡ º¸°üÇÏ¿© µÐ´Ù. À̰ÍÀº
ÇÔ¼ö¸¦ È£ÃâÇϱâ Á÷ÀüÀÇ ÀÎÅÍ·´Æ® enable/disable »óŸ¦ ¾Ë ¼ö ¾øÀ» ¶§ »ç¿ëÇÑ´Ù.
ÇÏÁö¸¸ ÇÔ¼ö È£Ãâ Á÷ÀüÀÇ »óŰ¡ ¾ðÁ¦³ª ÀÎÅÍ·´Æ® enable »óŶó´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Â »óȲÀ̸é spin_lock_irq¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ´õ È¿À²ÀûÀÌ´Ù. spin_lock_bh ÇÔ¼öµµ À¯»çÇÏÁö¸¸ À̰ÍÀº ÀÎÅÍ·´Æ®´Â enable»óÅ·ΠÀ¯ÁöÇϸç softirq¸¸À» disable ÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô Çϸé ÀÎÅÍ·´Æ®´Â ÀÚÀ¯·Ó°Ô ¹ß»ýÇÒ ¼ö ÀÖ¾î ½Ã½ºÅÛÀÇ ÀÀ´ä¼ºÀÌ ÁÁ¾ÆÁø´Ù. ÇÏÁö¸¸ ÇÁ·Î±×·¡¸Ó°¡ ÀÎÅÍ·´Æ® Çڵ鷯¿¡¼´Â °øÀ¯ ÀÚ¿øÀ» Á¢±ÙÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» º¸ÀåÇØ¾ß¸¸ ÇÑ´Ù.
Áö¸é»ó À̹ø È£¿¡¼´Â Ä¿³Î¿¡¼ °¡Àå ÈçÈ÷ »ç¿ëµÇ´Â ¼¼¸¶Æ÷¾î, reader/writer ¼¼¸¶Æ÷¾î, completion, spinlock¸¸À» »ìÆìº¸¾Ò´Ù. À̿ܿ¡µµ Ä¿³Î¿¡´Â reader/writer spinlock, seqlock, atomic_t, rcuµî ´Ù¾çÇÑ µ¿±âÈ ¸ÞÄ¿´ÏÁòÀ» ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. Ä¿³ÎÀÇ µ¿±âÈ ¹®Á¦´Â °áÄÚ ¸¸¸¸ÇÑ ¹®Á¦°¡ ¾Æ´Ï´Ù. Ä¿³ÎÀÇ µ¿±âȰ¡ ¾î·Á¿î °ÍÀº ¾î¶»°Ô »ç¿ëÇÏ´À³Ä°¡ ¾Æ´Ï¶ó ÀÚ½ÅÀÌ ÀÛ¼ºÇÑ Äڵ忡¼ ¾î¶² ºÎºÐÀÌ À§¿Í »óȲÀ» ¸¸µé¾î ³¾ ¼ö ÀÖ´ÂÁö¸¦ ÀÎÁöÇÑ ÈÄ ¾î¶² »óȲ¿¡¼ ¾î¶² ÇüÅÂÀÇ µ¿±âÈ ±â¹ýÀ» »ç¿ëÇÏ´Â °ÍÀÌ °¡Àå È¿À²ÀûÀÏ °ÍÀΰ¡¸¦ ÆÇ´ÜÇÏ´Â °ÍÀÌ´Ù.
ÇÏÁö¸¸ µ¿±âÈ Äڵ带 ÀÛ¼ºÇÏ´Â °Í¿¡ ÀÖ¾î¼ °¡Àå Áß¿äÇÑ °ÍÀº ¿©·¯ºÐÀÌ ÀÛ¼ºÇϰí ÀÖ´Â Ä¿³Î Äڵ尡 °¡´ÉÇÑ ÇÑ °øÀ¯µÇ´Â ÀÚ¿øÀ» »ç¿ëÇÏÁö ¾Êµµ·Ï ¼³°èÇÏ´Â °ÍÀÏ °ÍÀÌ´Ù.
ÇÏÁö¸¸ Çö½ÇÀº Á¾Á¾ ±×·± ¹Ù·¥À» µé¾îÁÖÁø ¾Ê´Â´Ù. ²À µ¿±âȱâ¹ýÀ» ½á¾ß ÇÑ´Ù¸é ¾î¶² Àå¼Ò¿¡ ¾î¶² µ¿±âÈ µµ±¸¸¦ »ç¿ëÇÏ´À³Ä´Â ¿©·¯ºÐÀÇ ½Ã½ºÅÛ¿¡ ¼º´É ´õ ³ª¾Æ°¡¼´Â ¾ÈÁ¤¼º±îÁöµµ °ü·ÃµÈ ¹®Á¦À̹ǷΠº¸´Ù ½Éµµ ÀÖ´Â ÇнÀÀ» ÅëÇØ ÀûÀçÀû¼Ò¿¡ ¸Â´Â µµ±¸¸¦ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù.
Ãâó : °ø°³ SW ¸®Æ÷Æ® 10È£ ÆäÀÌÁö 60 ~ 65 ¹ßÃé(2007³â 12¿ù) - Çѱ¹¼ÒÇÁÆ®¿þ¾î ÁøÈï¿ø °ø°³SW»ç¾÷ÆÀ ¹ß°£