HOME > °­ÁÂ >
°­ÁÂ| ¸®´ª½º ¹× ¿ÀǼҽº¿¡ °ü·ÃµÈ °­Á¸¦ º¸½Ç ¼ö ÀÖ½À´Ï´Ù.
 
Step by Step Ä¿³Î ÇÁ·Î±×·¡¹Ö °­Á¨ê
Á¶È¸ : 17,225  


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»ç¾÷ÆÀ ¹ß°£

 


[¿ø±Û¸µÅ©] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1642


ÀÌ ±ÛÀ» Æ®À§ÅÍ·Î º¸³»±â ÀÌ ±ÛÀ» ÆäÀ̽ººÏÀ¸·Î º¸³»±â ÀÌ ±ÛÀ» ¹ÌÅõµ¥ÀÌ·Î º¸³»±â

 
Çѱ¹¼ÒÇÁÆ®¿þ¾îÁøÈï¿ø °ø°³SW»ç¾÷ÆÀ