· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
greendrm

´ÙÀ½ ¹®¼­´Â [http]KELPÀÇ ¸ñ¿ä¼¼¹Ì³ª¸¦ À§ÇÑ Âü°í ÀÚ·áÀÌ´Ù.


1. Ä¿³Î µ¿±âÈ­ ¹æ¹ý

´ÙÀ½ÀÇ ³»¿ëÀº ¸®´ª½º Ä¿³Î ½ÉÃþ ºÐ¼®ÀÇ 8Àå Ä¿³Î µ¿±âÈ­ ¹æ¹ýÀ» Á¤¸®ÇÑ °ÍÀÌ´Ù.

1.1. ¿øÀÚÀû µ¿ÀÛ

¿øÀÚÀû µ¿ÀÛ(atomic operation)À̶õ ÁߴܵÊÀÌ ¾øÀÌ Çѹø¿¡ ½ÇÇàµÇ´Â ¸í·ÉÀ» ¶æÇÑ´Ù.

1.1.1. ¿øÀÚÀûÀÎ Á¤¼ö ¿¬»ê

¿øÀÚÀû Á¤¼ö ¿¬»êÀº Ưº°ÇÑ ÀÚ·á ±¸Á¶ÀÎ atomic_t¸¦ »ç¿ëÇÑ´Ù. ¸®´ª½º Ä¿³Î 2.6.11ÀÇ include/asm/atomic.h¿¡ ¼±¾ðµÈ ³»¿ëÀº ´ÙÀ½°ú °°´Ù.


typedef struct { volatile int counter; } atomic_t;


Ã¥ÀÇ ³»¿ëÁß sparc¿¡¼­´Â 24ºñÆ®¸¸À» »ç¿ëÇÑ´Ù´Â ºÎºÐÀº Ãʱâ Ä¿³Î ¹öÀü¿¡¼­ÀÇ À̾߱âÀÌ´Ù. Çö Ä¿³Î 2.6.11¿¡¼­´Â ¾Õ¼­ º¸´Â °Í°ú °°Àº ÀÚ·áÇüÀ¸·Î ¼±¾ðµÇ¾î ÀÖÀ¸¸ç spin_lock_irqsave/spin_unlock_irqrestore¸¦ ÀÌ¿ëÇÏ¿© ¿øÀÚÀû µ¿ÀÛÀ» ó¸®ÇÏ°í ÀÖ´Ù. ÀÌ¿¡ ´ëÇÑ ºÎºÐÀº Ä¿³Î ¼Ò½º include/asm-sparc/atomic.h¿Í arch/sparc/lib/atomic32.c¸¦ º¸¶ó.


atomic_t´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÑ´Ù.
atomic_t u; /* ÃʱâÈ­ ÇÏÁö ¾ÊÀº »óÅ·Πu¸¦ Á¤ÀÇ */

atomic_t v = ATOMIC_INIT(0); /* v¸¦ Á¤ÀÇÇÏ°í 0À¸·Î ÃʱâÈ­ */

ƯÈ÷ ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­ ÇÏÁö ¾Êµµ·Ï ÁÖÀÇÇØ¾ß ÇÑ´Ù.
atomic_t v = 0; /* À߸øµÈ ÃʱâÈ­´Ù */


ÇÔ¼öµéÀº ¸ðµÎ °£´ÜÇÑ ÇüÅ·ΠµÅ ÀÖ´Ù.


atomic_set(&v, 4); /* v->counter = 4 (atomically) */

atomic_add(2, &v); /* v->counter = v->counter + 2 = 6 (atomically) */

atomic_inc(&v); /* v->counter = v->counter + 1 = 7 (atomically) */


°ü·Ã ÇÔ¼ö´Â <asm/atomic.h>¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. °ü·Ã ÇÔ¼ö ¸ñ·ÏÀº Ã¥ p119ÀÇ Ç¥ 8.1 ¿øÀÚÀû Á¤¼ö ¿¬»ê ¸ñ·ÏÀ» Âü°íÇ϶ó.

1.1.2. ¿øÀÚÀûÀÎ ºñÆ® ¿¬»ê

Ä¿³ÎÀº ¿øÀÚÀûÀÎ Á¤¼ö ¿¬»ê°ú ÇÔ²², ºñÆ® ´ÜÀ§·Î µ¿ÀÛÇÏ´Â ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. À̵é ÇÔ¼ö´Â <asm/bitops.h>¿¡ Á¤ÀǵǾî ÀÖ´Ù.


ÀÚ¼¼ÇÑ ³»¿ëÀº Ã¥ p120, 121À» Âü°íÇÑ´Ù.

°ü·Ã ÇÔ¼ö ¸ñ·ÏÀº Ã¥ p121ÀÇ Ç¥ 8.2 ¿øÀÚÀû ºñÆ® ¿¬»ê ¸ñ·ÏÀ» Âü°íÇ϶ó.

1.2. ½ºÇÉ·Ï

¸ðµç À§Ç豸¿ª(critical region)À» ÇϳªÀÇ º¯¼ö¸¦ ´Ã¸®´Â °Í°ú °°Àº °°Àº °£´ÜÇÑ µ¿ÀÛÀ¸·Î Ç×»ó º¸Á¸ÇÒ ¼ö ¾ø´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡ ÃæºÐÇÑ º¸È£¸¦ Á¦°øÇÒ ÇÊ¿ä°¡ ÀÖÀ¸¸ç À̸¦ À§ÇØ ·Ï(lock)ÀÌ ÇÊ¿äÇÏ´Ù.

¸®´ª½º Ä¿³Î¿¡¼­´Â À̸¦ À§ÇØ °¡Àå ¸¹ÀÌ »ç¿ëÇÏ´Â °ÍÀÌ ½ºÇÉ·Ï(spin lock)ÀÌ´Ù. ½ºÇÉ·ÏÀº ÃÖ´ëÇÑ ÇϳªÀÇ ½º·¹µå¿¡ ÀÇÇØ Àá±æ ¼ö ÀÖ´Â ·ÏÀ» ¸»ÇÑ´Ù. ¸¸¾à ¾î¶² ½º·¹µå°¡ ÀÌ¹Ì Àá°ÜÁø ½ºÇÉ·ÏÀ» ´Ù½Ã Àá±×·Á ½ÃµµÇÑ´Ù¸é ±× ½º·¹µå´Â ·çÇÁ(busy loop)¸¦ µ¹¸é¼­(spin) ·ÏÀ» Àá±Û ¼ö ÀÖÀ» ¶§±îÁö ±â´Ù¸°´Ù.

½ºÇÉ·ÏÀº °¡º±°í ¼ÒÀ¯ÀÚ°¡ ÇϳªÀÎ ·ÏÀ¸·Î¼­ ªÀº ±â°£ µ¿¾È¸¸ ¼ÒÀ¯ µÅ¾ß ÇÑ´Ù.

½ºÇÉ·Ï°ú °ü·ÃµÈ ÀÎÅÍÆäÀ̽º´Â <linux/spinlock.h>¿¡ Á¤ÀǵǾî ÀÖ´Ù.

½ºÇÉ·ÏÀÇ ±âº»ÀûÀÎ »ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.

spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;


spin_lock(&mr_lock);
/* critical region ... */
spin_unlock(&mr_lock);


½ºÇÉ·ÏÀº SMP¿¡¼­¸¸ À¯È¿ÇÏ´Ù. UP ±â±â¿¡¼­´Â ÄÄÆÄÀϽà ·ÏÀÌ Á¦°ÅµÇ¾î Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. ±×·¯³ª Ä¿³ÎÀÇ ¼±Á¡ÀÌ °¡´ÉÇÑ°¡¸¦ ³ªÅ¸³»´Â Ç¥Áö·Î »ç¿ëµÉ ¼ö ÀÖ´Ù. ¸¸¾à Ä¿³Î ¼±Á¡ÀÌ ºñÈ°¼ºÈ­ µÇ¾î ÀÖ´Â °æ¿ì¿¡´Â ÄÄÆÄÀÏ ½Ã ¿ÏÀüÈ÷ Á¦°ÅµÈ´Ù.


ÁÖÀÇ: ½ºÇÉ·ÏÀº Àç±ÍÀûÀÌÁö ¾Ê´Ù


½ºÇÉ·ÏÀº ÀÎÅÍ·´Æ® Çڵ鷯¿¡¼­µµ »ç¿ë °¡´ÉÇÏ´Ù. ÀÎÅÍ·´Æ® Çڵ鷯¿¡¼­ ·ÏÀ» »ç¿ëÇÒ °æ¿ì¿¡, Ä¿³Î ³»ÀÇ µ¥ÀÌÅ͸¦ ÀÎÅÍ·´Æ® Çڵ鷯¿¡¼­ °øÀ¯ÇÏ´Â °æ¿ì ·ÏÀ» ¾ò±â Àü¿¡ ¹Ýµå½Ã ·ÎÄà ÀÎÅÍ·´Æ®¸¦ ºñÈ°¼ºÈ­ÇØ¾ß ÇÑ´Ù.

À̶§ ·ÎÄà ÀÎÅÍ·´Æ®ÀÇ È°¼ºÈ­ ¿©ºÎ¸¦ ¾Ë ¼ö ¾ø´Ù¸é ´ÙÀ½°ú °°Àº ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù.


spinlock_t mr_lock = SPIN_LOCK_UNLOCKED; unsigned long flags;


spin_lock_irqsave(&mr_lock, flags);
/* critical region ... */
spin_unlock_irqrestore(&mr_lock, flags);


¸¸¾à ÀÎÅÍ·´Æ® È°¼ºÈ­ »óÅÂÀÓÀ» ¾Ë°í ÀÖ´Ù¸é ´ÙÀ½ÀÇ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇصµ µÈ´Ù.


spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;


spin_lock_irq(&mr_lock);
/* critical region ... */
spin_unlock_irq(&mr_lock);


½ºÇÉ·Ï µð¹ö±ë

¼³Á¤ ¿É¼ÇÀÇ ÇϳªÀÎ CONFIG_DEBUG_SPINLOCKÀº ½ºÇÉ·Ï ÄÚµåÀÇ ¸¹Àº µð¹ö±ë °Ë»ç¸¦ È°¼ºÈ­½ÃŲ´Ù.

1.2.1. ´Ù¸¥ ½ºÇÉ·Ï ÇÔ¼öµé

Ã¥ p124¿Í Ç¥ 8.3 ½ºÇÉ·Ï ÇÔ¼ö ¸ñ·ÏÀ» Âü°íÇ϶ó.

1.2.2. ½ºÇÉ·Ï°ú º¸ÅèÇÏÇÁ

  • spin_lock_bh() ÁÖ¾îÁø ·ÏÀ» Àá±×°í ¸ðµç º¸ÅèÇÏÇÁ¸¦ ºñÈ°¼ºÈ­ ÇÑ´Ù.
  • spin_unlock_bh() À§ ÇÔ¼ö¿Í ¹Ý´ë·Î ÀÛµ¿ÇÑ´Ù.


    º¸ÆûÇÏÇÁ´Â ÇÁ·Î¼¼½º ÄÁÅؽºÆ® Äڵ带 ¼±Á¡ÇÒ ¼ö ÀÖÀ¸¹Ç·Î, ¸¸¾à ¾î¶² µ¥ÀÌÅÍ°¡ º¸ÆûÇÏÇÁ¿Í ÇÁ·Î¼¼½º ÄÁÅؽºÆ®°£¿¡ °øÀ¯µÈ´Ù¸é ·ÏÀ» »ç¿ëÇÔ°ú ÇÔ²² º¸ÆûÇÏÇÁ¸¦ ºñÈ°¼ºÈ­½ÃÄÑ µ¥ÀÌÅ͸¦ º¸È£ÇØ¾ß ÇÑ´Ù.


    (¹®Á¦)
    1. °°Àº Çü½ÄÀÇ Å½ºÅ©¸´ ³»¿¡¼­¸¸ °øÀ¯µÇ´Â µ¥ÀÌÅÍ´Â º¸È£ÇØ¾ß Çϴ°¡?
    2. ¼­·Î ´Ù¸¥ Çü½ÄÀÇ Å½ºÅ©¸´¿¡¼­ °øÀ¯µÇ´Â µ¥ÀÌÅÍ´Â º¸È£ÇØ¾ß Çϴ°¡?
    3. softirqÀÇ °æ¿ì °°Àº Çü½Ä³»¿¡¼­¸¸ °øÀ¯µÇ´Â µ¥ÀÌÅÍ´Â º¸È£ÇØ¾ß Çϴ°¡?
    4. softirqÀÇ °æ¿ì ¼­·Î ´Ù¸¥ Çü½Ä³»¿¡¼­ °øÀ¯µÇ´Â µ¥ÀÌÅÍ´Â º¸È£ÇØ¾ß Çϴ°¡?

1.3. ¸®´õ-¶óÀÌÅÍ ½ºÇÉ·Ï

·ÏÀÇ »ç¿ëÀÌ ¸®´õ(reader)¿Í ¶óÀÌÅÍ(writer)·Î È®¿¬È÷ ±¸ºÐµÇ´Â °æ¿ì¿¡ »ç¿ëÇÑ´Ù.

Àд ÁßÀÎ °æ¿ì¿¡´Â ¾²±â¸¸ ¹æÁöÇØ¾ß Çϸç, ¾²±â ÁßÀÏ ¶§´Â Àбâ¿Í ¾²±â ¸ðµÎ ¹æÁöÇØ¾ß ÇÑ´Ù.


¸®´õ-¶óÀÌÅÍ ½ºÇÉ·ÏÀ» ÃʱâÈ­ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

rwlock_t mr_rwlock = RW_LOCK_UNLOCKED;


¸®´õÀÎ °æ¿ì¿¡´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù.

read_lock(&mr_rwlock);
/* critical section (read only) ... */
read_unlock(&mr_rwlock);

¶óÀÌÅÍÀÎ °æ¿ì¿¡´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù.

write_lock(&mr_lock);
/* critical section (read and write) ... */
write_unlock(&mr_rwlock);


¸®´õ·ÏÀ» ÇÑ »óÅ¿¡¼­ ¶óÀÌÆ®·ÏÀ» ÇÒ ¼ö ¾ø´Ù.
read_lock(&mr_rwlock); write_lock(&mr_rwlock);
ÀÌ¿Í °°Àº °æ¿ì¿£ µ¥µå·Ï¿¡ ºüÁö°Ô µÈ´Ù. ¸¸¾à, ¸®´õ¿Í ¶óÀÌÅÍ°¡ ¼¯ÀÌ´Â °æ¿ì°¡ ÀÖ´Ù¸é À̶§´Â ½ºÇÉ·ÏÀ» »ç¿ëÇÑ´Ù.


±×¸®°í ÀÎÅÍ·´Æ® Çڵ鷯°¡ ÀÖÀ» ¶§ ÇÁ·Î¼¼½º ÄÁÅؽºÆ®¿¡¼­´Â ¸®´õ ½ºÇÉ·ÏÀ» ÀÎÅÍ·´Æ® Çڵ鷯¿¡¼­´Â ¶óÀÌÅÍ ½ºÇÉ·ÏÀ» »ç¿ëÇÑ´Ù¸é ÀÎÅÍ·´Æ®¸¦ ºñÈ°¼ºÈ­ ½ÃÅ°´Â ·ÏÀ» »ç¿ëÇؾ߸¸ ÇÑ´Ù.


°ü·Ã ÇÔ¼ö´Â Ã¥ p127ÀÇ Ç¥ 8.4 ¸®´õ-¶óÀÌÅÍ ½ºÇÉ·Ï ÇÔ¼ö¸¦ Âü°íÇ϶ó.

1.4. ¼¼¸¶Æ÷¾î

¸®´ª½ºÀÇ ¼¼¸¶Æ÷¾î(semaphore)´Â ÈÞ¸éÇÏ´Â ·ÏÀ̶ó »ý°¢ÇÒ ¼ö ÀÖ´Ù.

1.4.1. ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇÏ°í ÃʱâÈ­

¼¼¸¶Æ÷¾î ±¸ÇöÀº <asm/semaphore.h>¿¡ Á¤ÀǵŠÀÖ´Ù. ÀÚ·áÇüÀº struct smeaphore ÀÌ´Ù.


¼¼¸¶Æ÷¾î´Â Á¤Àû°ú µ¿ÀûÀ¸·Î »ý¼ºÇÒ ¼ö ÀÖ´Ù.
  • Á¤Àû ¼±¾ð static DECLARE_SEMAPHORE_GENERIC(name, count);
    ¶Ç´Â count°¡ 1ÀÎ ¹ÂÅؽº¸¦ ´ÙÀ½°ú °°ÀÌ °£´ÜÈ÷ ¼±¾ðÇÒ ¼öµµ ÀÖ´Ù.
    static DECLARE_MUTEX(name);
  • µ¿Àû ¼±¾ð sema_init(sem, count);
    ¹ÂÅؽºÀÇ °æ¿ì¿¡´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
    init_MUTEX(sem);

1.4.2. ¼¼¸¶Æ÷¾î »ç¿ë

¼¼¸¶Æ÷¾î¸¦ ¾ò´Â ¹æ¹ýÀ¸·Î´Â µÎ°¡Áö°¡ ÀÖ´Ù.
  • down_interruptible() - ¼¼¸¶Æ÷¾î¸¦ ¾òÁö ¸øÇÏ´Â °æ¿ì ÈÞ¸éÇÏ°Ô µÈ´Ù.
  • down_trylock() - ¼¼¸¶Æ÷¾î¸¦ ¾òÁö ¸øÇÏ´Â °æ¿ì 0ÀÌ ¾Æ´Ñ °ªÀ» ¹Ù·Î ¸®ÅÏÇÑ´Ù. ¼¼¸¶Æ÷¾î¸¦ ¹ÝȯÇÏ´Â °æ¿ì¿¡´Â up()À» È£ÃâÇÏ¸é µÈ´Ù.


    if (down_interruptible(&mr_sem))
    return -ERESTARTSYS; /* ½Ã±×³ÎÀ» ¹Þ¾ÒÁö¸¸ ¼¼¸¶Æ÷¾î¸¦ ¾òÁö ¸øÇÔ */


  • /* critical region ... */


    up(&mr_sem);


    °ü·ÃÇÔ¼ö´Â Ã¥ p130 Ç¥ 8.5 ¼¼¸¶Æ÷¾î ÇÔ¼ö¸¦ Âü°íÇ϶ó.

1.4.3. ¸®´õ-¶óÀÌÅÍ ¼¼¸¶Æ÷¾î

½ºÇÉ·Ï°ú °°Àº ¹æ½ÄÀ¸·Î ½ºÇɷϺ¸´Ù´Â ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇØ¾ß ÇÏ´Â °æ¿ì¿¡ »ç¿ëÇÑ´Ù. ¸®´õ-¶óÀÌÅÍ ¼¼¸¶Æ÷¾î´Â <linux/rwsem.h>¿¡ Á¤ÀÇµÈ struct rw_semaphore ÀÚ·áÇü¿¡ ÀÇÇØ Ç¥ÇöµÈ´Ù.

¼±¾ð ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
  • Á¤Àû ¼±¾ð
    static DECLARE_RWSEM(name);
  • µ¿Àû ¼±¾ð
    init_rwsem(struct rw_semaphore *sem)


    down_read(&mr_rwsem);
    /* critical region (read only) ... */
    up_read(&mr_rwsem);


    down_write(&mr_rwsem);
    /* critical region (read and write) ... */
    up_write(&mr_rwsem);


  • Ç¥8.6 ½ºÇÉ·Ï°ú ¼¼¸¶Æ÷¾îÁß ¾î´À ÂÊÀÌ Á¢ÇÑÇÑ°¡
¿ä±¸»çÇ×Ãßõ¹æ¹ý
·Ï ºÎ´ãÀÌ Àû¾î¾ß ÇÏ´Â °æ¿ì½ºÇÉ·ÏÀ» Ãßõ
·Ï ±â°£ÀÌ ÂªÀº °æ¿ì½ºÇÉ·ÏÀ» Ãßõ
·Ï ±â°£ÀÌ ±ä °æ¿ì¼¼¸¶Æ÷¾î¸¦ Ãßõ
ÀÎÅÍ·´Æ® Çڵ鷯¿¡¼­ ·ÏÀ» ÇØ¾ß ÇÏ´Â °æ¿ì¹Ýµå½Ã ½ºÇÉ·ÏÀ» »ç¿ë
·ÏÀ» ¼ÒÀ¯ÇÑ Ã¤ ÈÞ¸éÇØ¾ß ÇÏ´Â °æ¿ì¹Ýµå½Ã ¼¼¸¶Æ÷¾î¸¦ »ç¿ë

1.5. ¿Ï·á º¯¼ö

¿Ï·á º¯¼ö(completion variable)´Â Ä¿³ÎÀÇ µÎ ŽºÅ©¸¦ µ¿±âÈ­½ÃÅ°±â À§ÇØ »ç¿ëµÇ´Â Æí¸®ÇÑ ¹æ¹ý Áß ÇϳªÀÌ´Ù. ¿Ï·á º¯¼ö´Â <linux/completion.h> Á¤ÀÇµÈ struct completion ÀÚ·áÇü¿¡ ÀÇÇØ Ç¥ÇöµÈ´Ù. ¼±¾ðÀº ´ÙÀ½°ú °°´Ù.
  • Á¤Àû ¼±¾ð
    DECLARE_COMPLETION(mr_comp);
  • µ¿Àû ¼±¾ð
    init_completion()

  • ¾î¶² ¿Ï·á º¯¼ö¿¡ ´ëÇÏ¿© ´ë±âÇϱ⸦ ¿øÇϴ ŽºÅ©µéÀº wait_for_competion()À» È£ÃâÇÑ´Ù. ÀÌ ÈÄ À̺¥Æ®°¡ µµÂøÇϸé complete()À» È£ÃâÇÏ¿© ´ë±âÁßÀÎ ¸ðµç ŽºÅ©¸¦ ±ú¿ì°Ô µÈ´Ù.

    °ü·Ã ÇÔ¼ö´Â Ã¥ p132 Ç¥ 8.7 ¿Ï·á º¯¼ö ÇÔ¼öÀ» Âü°íÇ϶ó.

1.6. Å« Ä¿³Î ·Ï

Å« Ä¿³Î ·Ï(Big Kernel Lock(BKL)Àº Àü¿ª ½ºÇÉ·ÏÀÌ´Ù.
  • lock_kernel()
  • unlock_kernel()

    ÀÚ¼¼ÇÑ ³»¿ëÀº Ã¥ p133, 134À» Âü°íÇ϶ó.

1.7. Seq ·Ï

Ä¿³Î 2.6¿¡¼­ºÎÅÍ µµÀÔµÈ »õ·Î¿î Á¾·ùÀÇ ·ÏÀÌ´Ù. ÀÌ ·ÏÀº ½ÃÄö½º Ä«¿îÅÍ(sequence counter)¸¦ »ç¿ëÇÏ¿© ±¸ÇöµÈ´Ù. ·ÏÀº 0ºÎÅÍ ½ÃÀÛÇÏ¿© ·ÏÀ» Àá±×¸é Ȧ¼ö°¡ µÇ°í ´Ù½Ã ·ÏÀ» Ç®¸é ¦¼ö°¡ µÈ´Ù.


seqlock_t mr_seq_lock = SEQLOCK_UNLOCKED;


write_seqlock(&mr_seq_lock);
/* write lock is obtained ... */
write_sequnlock(&mr_seq_lock);


unsigned long seq; do {
seq = read_seqbegin(&mr_seq_lock);
/* read data here ... */
} while (read_seqretry(&mr_seq_lock, seq));

1.8. ¼±Á¡ÀÇ ºñÈ°¼ºÈ­

Ä¿³Î ¿ª½Ã ¼±Á¡ÇüÀ̹ǷÎ, Ä¿³Î ¾È¿¡ ÀÖ´Â ÇÁ·Î¼¼½º´Â ¾ðÁ¦¶óµµ ´õ ³ôÀº ¿ì¼±¼øÀ§¸¦ °®´Â ÇÁ·Î¼¼½º¸¦ ½ÇÇà½ÃÅ°±â À§ÇØ Áß´ÜµÉ ¼ö ÀÖ´Ù.


preempt_disable();
/* ¼±Á¡ÀÌ ºñÈ°¼ºÈ­µÊ ... */
preempt_enable();


°ü·Ã ÇÔ¼ö´Â Ã¥ p136 Ç¥ 8.9 Ä¿³Î ¼±Á¡ °ü·Ã ÇÔ¼ö¸¦ Âü°íÇ϶ó.

1.9. ¹è¸®¾î

´Ù¼öÀÇ ÇÁ·Î¼¼¼­³ª Çϵå¿þ µð¹ÙÀ̽º°£ÀÇ µ¿±âÈ­ ¹®Á¦¸¦ ´Ù·ê ¶§´Â, Á¾Á¾ ¸Þ¸ð¸® Àбâ(load)¿Í ¸Þ¸ð¸® ¾²±â(store)¸¦ ÇÁ·Î±×·¥ Äڵ忡 Á¤ÀÇµÈ ¼ø¼­´ë·Î ÇàÇØ¾ß ÇÏ´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù. ¼ø¼­¸¦ ¹Ù²ÙÁö ¸»µµ·Ï Áö½ÃÇÏ´Â ¸í·ÉÀ» ¹è¸®¾î(barrier)¶ó°í ÇÑ´Ù.


  • rmb() - Àб⠸޸𸮠¹è¸®¾î¸¦ Á¦°ø
  • wmb() - ¾²±â ¸Þ¸ð¸® ¹è¸®¾î¸¦ Á¦°ø
  • mb() - Àбâ/¾²±â ¹è¸®¾î Á¦°ø


    °ü·Ã ÇÔ¼ö´Â Ã¥ p139 Ç¥ 8.10 ¸Þ¸ð¸®/ÄÄÆÄÀÏ·¯ ¹è¸®¾î ÇÔ¼ö¸¦ Âü°íÇ϶ó.

ID
Password
Join
Don't speak about Time, until you have spoken to him.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2005-08-04 17:05:11
Processing time 0.0097 sec