ÆüËܸì¤Î»ñÎÁ¤¬¤¹¤¯¤Ê¤¤GC¥¢¥ë¥´¥ê¥º¥à¤Ë¤Ä¤¤¤Æ¾ÜºÙ¤Ë²òÀ⤷¤Þ¤¹

Partial Mark and Sweep -Cycle Collection-

ÉôʬŪ¤ÊMarkandSweep

¥¢¥ë¥´¥ê¥º¥à

¤Þ¤º¡¢CycleCollection¤È¤Ï
Reference Counting GC(RC)¤ÇȯÀ¸¤¹¤ë½Û´Ä»²¾È¤ò²þÁ±¤¹¤ë°Ù¤ÎGC¤Ç¤¢¤ë¡£
¤Ä¤Þ¤êRC¤Î²þÎÉÈÇ¡£

1.¥¤¥ó¥¯¥ê¥á¥ó¥È
¥¤¥ó¥¯¥ê¥á¥ó¥È¤Ç¤Ï+1¤¹¤ë¤È¶¦¤ËObject¤ÎColor¤òblack¤Ë¤¹¤ë

2.¥Ç¥¯¥ê¥á¥ó¥È
¿Þ¤Î¤è¤¦¤Ë¥Ç¥¯¥ê¥á¥ó¥È¤Ç¤Ï-1¤¹¤ë¤È¶¦¤Ë¡¢control_set¤Ë¥Ý¥¤¥ó¥¿¤ò¥×¥Ã¥·¥å¤¹¤ë¡£
¤½¤ÎºÝ¡¢ObjectColor¤òpurple¤Ë¤·¡¢¤¹¤Ç¤Ëpurple¤Ç¤¢¤ë¤â¤Î¤Ïcontrol_set¤Ë¤ÏÄɲ䷤ʤ¤¡£

3.Mark Gray
control_set¤¬¤¤¤Ã¤Ñ¤¤¤Ë¤Ê¤Ã¤¿¥¿¥¤¥ß¥ó¥°¤Çµ¯Æ°¤·¡¢¿Þ¤ÎÍͤËcontrol_set¤Ë¤¢¤ëObject¤È¤½¤Î»Ò¶¡¤òGray¤Ë¤¹¤ë¡£
¤½¤ì¤Ëȼ¤Ã¤Æ»Ò¶¡Object¤Î¤ß-1¤ò¹Ô¤¤¡¢½Û´Ä»²¾È¤À¤Ã¤¿¾ì¹ç¤ÏÁ´¤Æ0¤Ë¤¹¤ë¤³¤È¤¬½ÐÍè¤ë¡£
°Ê²¼µ¼»÷¥³¡¼¥É
MarkGray(S)
  if (color(S) != gray)
    color(S) = gray
    for C in S.child
      count(C) = count(C) - 1
      MarkGray(C)

4.scan
control_setÆâ¤Ç¥«¥¦¥ó¥È¤¬0¤Î¤â¤Î¤Î¤ßwhite¡¢¤½¤Î¾¤Ïblack¤ËÅɤêʬ¤±¡¢
¥«¥¦¥ó¥È¤ò¸º¤é¤·¤Æ¤¤¤¿gray¥ª¥Ö¥¸¥§¥¯¥È¤Ë+1¤ò¤·¡¢¥«¥¦¥ó¥È¤ò¸µ¤ËÌ᤹¡£
¤Þ¤¿¡¢control_set¤«¤é¤ß¤¨¤ëObject¤¬1°Ê¾å¤Ç¤¢¤Ã¤¿¾ì¹ç¡¢¤½¤ÎObject¤È»Ò¶¡¤Ë¤Ä¤¤¤Æ¤Ï
white¤Ë¤¹¤ë»ö¤Ï¤·¤Ê¤¤¡£
¡Ê¤Þ¤À»²¾È¤µ¤ì¤Æ¤¤¤ë°Ù¡Ë

5.collect_white
white¤ÎObject¤ò²ó¼ý¤·¤Æ¡¢½Û´Ä»²¾È¤¬²ò¾Ã¤µ¤ì¤ë¡£
¤½¤Î¸å¡¢control_set¤«¤épop¤µ¤ì¤ë¡£

ÍøÅÀ

  1. ½Û´Ä»²¾È¤¬²ò·è¤µ¤ì¤ë
  2. MarkandSweep¤òÉôʬŪ¤Ë¹Ô¤¨¡¢»þ´Ö¤Îû½Ì¤Ë¤Ê¤ë¡£

·çÅÀ

  1. ÉÔÌÀ

¼Â¥³¡¼¥É¤ò¸«¤¿¤¤¾ì¹ç

  • PHP5.3°Ê¹ß
  • Python
  • Firefox3

¥³¥á¥ó¥È¤ò¤«¤¯


¡Öhttp://¡×¤ò´Þ¤àÅê¹Æ¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ÍøÍѵ¬Ìó¤ò¤´³Îǧ¤Î¤¦¤¨¤´µ­Æþ²¼¤µ¤¤

WikiÆ⸡º÷

WikiÆ⸡º÷

¥Õ¥ê¡¼¥¨¥ê¥¢

ÊÔ½¸¤Ë¤ÏID¤¬É¬ÍפǤ¹