è¯ãäžæ¥ïŒ
New Medioã® CTOã§ãã
Jonathan Bartlettã«ããèšäºã®ç¿»èš³ã«æ³šç®ããããšæããŸãã ãã®èšäºã¯2004幎11æ16æ¥ã«
ibm.comã§å
¬éãããã¡ã¢ãªãŒç®¡çææ³ã«çŠç¹ãåœãŠãŠããŸãã ãã®èšäºã®æ代ã¯ïŒITã®åºæºã«ãããšïŒéåžžã«é«ãã§ããããã®æ
å ±ã¯åºæ¬çãªãã®ã§ãããã¡ã¢ãªå²ãåœãŠãžã®ã¢ãããŒãããã®é·æãšçæã«ã€ããŠèª¬æããŠããŸãã ãã®ãã¹ãŠã«ã¯ãçŽ æã®ããè¯ãååã®ããã«ããèªäœãã®å®è£
ã䌎ããŸãã
èè
ããã®èŠçŽåçã¡ã¢ãªå²ãåœãŠã®æ±ºå®ããã¬ãŒããªããå®è£
Linuxéçºè
ãå©çšã§ããã¡ã¢ãªç®¡çæ¹æ³ã®ã¢ã€ãã¢ãå
¥æããŠãã ããã ãããã®ã¡ãœããã¯Cèšèªã«éå®ããããä»ã®ããã°ã©ãã³ã°èšèªã§ã䜿çšãããŸãã ãã®èšäºã§ã¯ãæåã¢ãããŒãïŒ
æå ïŒãåç
§ã«ãŠã³ãïŒ
åç
§ã«ãŠã³ã ïŒãŸãã¯ããŒã«ïŒ
ããŒãªã³ã° ïŒã䜿çšãã
åæåïŒ
å æå ïŒãããã³
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã䜿çšããèªåã®äŸã䜿çšããŠãã¡ã¢ãªç®¡çã®å®è¡æ¹æ³ã«ã€ããŠè©³ãã説æããŸãã
ã¡ã¢ãªãŒç®¡çãå¿
èŠãªçç±ã¡ã¢ãªç®¡çã¯ãããã°ã©ãã³ã°ã®æãåºæ¬çãªåéã®1ã€ã§ãã å€ãã®ã¹ã¯ãªããèšèªã§ã¯ãã¡ã¢ãªç®¡çã«ã€ããŠå¿é
ããå¿
èŠã¯ãããŸããããããã«ãããã®ã¡ã«ããºã ã®éèŠæ§ãäœäžããããšã¯ãããŸããã
ã¡ã¢ãªãããŒãžã£ã®æ©èœãšãã®äœæ¥ã®è€éãã«é¢ããç¥èã¯ãå¹æçãªããã°ã©ãã³ã°ã®éµãšãªããŸãã C / C ++ãªã©ã®ã»ãšãã©ã®ã·ã¹ãã èšèªã§ã¯ãéçºè
ã¯èªåã§äœ¿çšããã¡ã¢ãªãç£èŠããå¿
èŠããããŸãã ãã®èšäºã§ã¯ãæåãåèªåãããã³èªåã®ã¡ã¢ãªç®¡çæ¹æ³ã«ã€ããŠèª¬æããŠããŸãã
ã¡ã¢ãªç®¡çã倧ããªåé¡ã§ã¯ãªãã£ãæ代ããããŸããã äŸãšããŠãApple IIã®ã¢ã»ã³ãã©ãŒã§ã®éçºæéãæãåºãããšãã§ããŸãã åºæ¬çã«ãããã°ã©ã ã¯OSãšã¯å¥ã«ã§ã¯ãªããOSãšãšãã«èµ·åãããŸããã ã·ã¹ãã ãšéçºè
ã®äž¡æ¹ãä»»æã®ã¡ã¢ãªã䜿çšã§ããŸãã ã¡ã¢ãªã®åèšéãèšç®ããå¿
èŠã¯ãããŸããã§ããã ãã¹ãŠã®ã³ã³ãã¥ãŒã¿ãŒã§åãã§ããã ãã®ãããã¡ã¢ãªèŠä»¶ã¯ããªãéçã§ãããã¡ã¢ãªãéžæããŠäœ¿çšããå¿
èŠããããŸããã
ããã«ããããããããã®ãããªåçŽãªã³ã³ãã¥ãŒã¿ãŒã§ãã£ãŠããç¹ã«ããã°ã©ã ã®ç¹å®ã®éšåã«å¿
èŠãªã¡ã¢ãªãŒéãããããªãå Žåã¯ãåé¡ãã€ããããšãã§ããŸãã
ã¡ã¢ãªã«é¢é£ããå¶éãããå Žåã次ã®ãããªã¿ã¹ã¯ãåŠçããã¢ãããŒããå¿
èŠã§ãã
- ååãªã¡ã¢ãªããããã©ãããå€æããŸãã
- å©çšå¯èœãªã¡ã¢ãªããã»ã¯ã·ã§ã³ãååŸããŸãã
- ã»ã¯ã·ã§ã³ãããŒã«ã«æ»ããããã°ã©ã ã®ä»ã®éšåãŸãã¯ä»ã®ããã°ã©ã ã§äœ¿çšã§ããããã«ããŸãã
ïŒ
翻蚳è
ã®ã¡ã¢ ïŒåŸã§åç
§ããããã«ããã®ãªã¹ãã
ã¡ã¢ãªèŠä»¶ãšããŠæå®ããŸãããïŒ
ã¡ã¢ãªãæ€çŽ¢/å²ãåœãŠ/解æŸããã©ã€ãã©ãªã¯ãã¢ãã±ãŒã¿ãšåŒã°ããŸãã ããã°ã©ã ã®è€éããå¢ããšãã¡ã¢ãªç®¡çã®è€éããå¢ãããã®ãããªããã°ã©ã ã§ã®ã¢ãã±ãŒã¿ãŒã®åœ¹å²ãå¢ããŸãã ããŸããŸãªã¡ã¢ãªç®¡çæ¹æ³ãèŠãŠããããã®é·æãšçæãããã³ããããæãå¹æçãªç¶æ³ãèããŠã¿ãŸãããã
ã¢ãã±ãŒã¿ãŒïŒCã¹ã¿ã€ã«ïŒCèšèªã¯ãã¡ã¢ãªèŠä»¶ã®ã¿ã¹ã¯ãåŠçãã2ã€ã®é¢æ°ããµããŒãããŠããŸãã
- malloc ïŒæå®ããããã€ãæ°ãéžæããããããžã®ãã€ã³ã¿ãŒãè¿ããŸãã ååãªã¡ã¢ãªããªãå ŽåãNULLãžã®ãã€ã³ã¿ïŒ null pointer ïŒãè¿ããŸãã
- free ïŒ mallocã䜿çšããŠå²ãåœãŠãããã¡ã¢ãªå
ã®é åãžã®å
¥åãã€ã³ã¿ãåãå
¥ãããããããã°ã©ã ãŸãã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§åŸã§äœ¿çšããããã«è¿ããŸãïŒå®éãäžéšã®mallocã¯ãOSã§ãªãããã°ã©ã ã®ã¿ã§äœ¿çšããããã«ã¡ã¢ãªãè¿ããŸãïŒã
ç©çã¡ã¢ãªãšä»®æ³ã¡ã¢ãªããã°ã©ã å
ã§å²ãåœãŠãã©ã®ããã«çºçããããç解ããã«ã¯ãOSãããã°ã©ã ã«ã¡ã¢ãªãå²ãåœãŠãæ¹æ³ãææ¡ããå¿
èŠããããŸãã ïŒ
翻蚳è
ã®ã¡ã¢ ïŒããã°ã©ã ã¯ç¹å®ã®OSã§å®è¡ããããããç¹å®ã®ããã°ã©ã ã«å²ãåœãŠãã¡ã¢ãªéã決å®ããã®ã¯åœŒå¥³ã§ãïŒå®è¡äžã®åããã»ã¹ã¯ãã³ã³ãã¥ãŒã¿ãŒã®ç©çã¡ã¢ãªå
šäœã«ã¢ã¯ã»ã¹ã§ãããšèŠãªããŸãã å€ãã®ããã»ã¹ãåæã«åäœããåããã»ã¹ããã¹ãŠã®ã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããªãããšã¯æããã§ãã ããããããã»ã¹ãä»®æ³ã¡ã¢ãªïŒ
ä»®æ³ã¡ã¢ãª ïŒã䜿çšãããšã©ããªããŸããã
äŸãšããŠãããã°ã©ã ãã¡ã¢ãªã®629çªç®ã®ã»ã¯ã·ã§ã³ã«ã¢ã¯ã»ã¹ãããšããŸãã ä»®æ³ã¡ã¢ãªã·ã¹ãã ïŒ
ä»®æ³ã¡ã¢ãªã·ã¹ãã ïŒã¯ãããŒã¿ã629çªå°ã®RAMã«ä¿åãããããšãä¿èšŒããŸãããå®éãRAMã§ãããšã¯éããŸãããRAMããã£ã±ãã«ãªã£ãå ŽåãããŒã¿ã¯ãã£ã¹ã¯ã«è»¢éãããŸãã ã€ãŸã ã¯ãŒã¹ãžã ã¡ã¢ãªã«ã¯ãç©çââããã€ã¹ã«å¯Ÿå¿ããã¢ãã¬ã¹ãæ ŒçŽã§ããŸãã OSã¯Wirth察å¿ããŒãã«ãä¿åããŸãã ç©ç
ã¢ãã¬ã¹ïŒä»®æ³ã¢ãã¬ã¹ããç©çã¢ãã¬ã¹ ïŒ
ãžã®ã¢ãã¬ã¹ãããã«ãããã³ã³ãã¥ãŒã¿ã¯ãã®
ã¢ãã¬ã¹ã§ã®èŠæ± ïŒ
ã¢ãã¬ã¹èŠæ± ïŒã«æ£ããå¿çã§ã
ãŸã ã RAMã«ç©çã¢ãã¬ã¹ãæ ŒçŽãããŠããå ŽåãOSã¯ããã»ã¹ãäžæçã«äžæããããŒã¿ãDISKã«ïŒRAMããïŒã¢ããããŒãããããã»ã¹ãDISKããæ©èœããããã«å¿
èŠãªããŒã¿ãããŒãããããã»ã¹ãåèµ·åããŸãã ãããã£ãŠãåããã»ã¹ã¯ãããèªäœãåäœã§ããç¬èªã®ã¢ãã¬ã¹ç©ºéãåãåããããã«å²ãåœãŠãããOSãããå€ãã®ã¡ã¢ãªãåãåãããšãã§ããŸãã
32ãããã¢ããªã±ãŒã·ã§ã³ïŒ
x86ã¢ãŒããã¯ãã£ïŒã§ã¯ãåããã»ã¹ã¯4ã®ã¬ãã€ãã®ã¡ã¢ãªã§åäœã§ããŸãã çŸæç¹ã§ã¯ãã»ãšãã©ã®ãŠãŒã¶ãŒã¯ãã®ãããªããªã¥ãŒã ãææããŠããŸããã
ã¹ã¯ããã䜿çšããå Žåã§ããããã»ã¹ããšã«4 GBæªæºã§ããå¿
èŠããããŸãã ãããã£ãŠãããã»ã¹ãã¡ã¢ãªã«ã¢ã³ããŒãããããšãç¹å®ã®ã¹ããŒã¹ãå²ãåœãŠãããŸãã ãã®ã¡ã¢ãªã®çµããã¯ã
ã·ã¹ãã ãã¬ãŒã¯ãšåŒã°ã
ãŸã ã ãã®å¢çãè¶
ãããšãå²ãåœãŠãããŠããªãã¡ã¢ãªãã€ãŸã ãã£ã¹ã¯ãŸãã¯RAMãžã®æ圱ãªãã ãããã£ãŠãããã»ã¹ã®ã¡ã¢ãªãïŒããŒãæã«å²ãåœãŠããããã®ããïŒãªããªããšãOSãããã倧ããªã¡ã¢ãªãèŠæ±ããå¿
èŠããããŸãã ïŒ
ãããã³ã° ïŒè±èªã®
ãããã³ã°ãã-ãªãã¬ã¯ã·ã§ã³ããããžã§ã¯ã·ã§ã³ïŒã¯ã1察1ã®å¯Ÿå¿-ã€ãŸããå®éã®ããŒã¿ãæ¢ã«æ ŒçŽãããŠããä»®æ³ã¢ãã¬ã¹ïŒãã£ã¹ã¯äžã®ã¢ãã¬ã¹ïŒã«ç°ãªãã¢ãã¬ã¹ãæ ŒçŽãããŠããããšãæå³ããæ°åŠçšèªã§ãïŒ
UNIXããŒã¹ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ã¯ãè¿œå ã®ã¡ã¢ãªã¬ã€ã¢ãŠãã®ããã®2ã€ã®ã·ã¹ãã ã³ãŒã«ããããŸãã
- brk ïŒbrkïŒïŒã¯éåžžã«ã·ã³ãã«ãªã·ã¹ãã ã³ãŒã«ã§ãã ã·ã¹ãã ãã¬ãŒã¯ã¯ãããã»ã¹ã«å²ãåœãŠãããã¡ã¢ãªã®æ¥µç«¯ãªå¢çã§ãã brkïŒïŒã¯ãåã«ãã®å¢çãååŸã«ç§»åããŠãå²ãåœãŠãããã¡ã¢ãªã®éãå¢æžããŸãã ïŒ ãã©ã³ã¹ã¬ãŒã¿ã«æ³šæããŠãã ãã ïŒåãMS Wordã®ã¹ã±ãŒã«ã¹ã±ãŒã«ãæ³åããŠãã ãã ã ã·ã¹ãã ãã¬ãŒã¯ã¯ã¹ã©ã€ããŒãåãããšãã§ããæ倧å€ã§ãããã¹ã©ã€ããŒèªäœã¯çŸåšã®ãã¬ãŒã¯ã§ã ïŒ
- mmap ïŒmmapïŒïŒïŒãŸãã¯ãã¡ã¢ãªããããïŒã¯brkïŒïŒã«äŒŒãŠããŸãããããæè»ãªããŒã«ã§ãã ãŸããããã»ã¹ã®æåŸã ãã§ãªããã¢ãã¬ã¹ç©ºéå
ã®ä»»æã®å Žæã«ã¡ã¢ãªãããŒã¯ã§ããŸãã 第äºã«ãã¡ã¢ãªïŒä»®æ³ïŒãç©çãŸãã¯ã¹ã¯ããïŒ swap ïŒãžã®ãããžã§ã¯ã·ã§ã³ãšããŠããŒã¯ããã ãã§ãªããã¡ã¢ãªãç¹å®ã®ãã¡ã€ã«ã«ãã€ã³ãã§ãããããèªã¿åããšæžã蟌ã¿ããã¡ã€ã«ã§çŽæ¥åäœããŸãã mmapïŒïŒã® 察極ã¯munmapïŒïŒã§ãã
ã芧ã®ãšãããããã»ã¹ã¡ã¢ãªãæ¡åŒµããã«ã¯ã
brkïŒïŒãŸãã¯
mmapïŒïŒã®åçŽãªåŒã³åºãã䜿çšã§ããŸãã ããã«ããã¹ãã§ã¯
brkïŒïŒã䜿çšãããŸã æãã·ã³ãã«ã§äžè¬çãªããŒã«ã§ãã
ã·ã³ãã«ãªã¢ãã±ãŒã¿ãŒã®å®è£
Cããã°ã©ã ãæžããã®ã§ããã°ããããã
mallocïŒïŒã
freeïŒïŒãªã©ã®
é¢æ°ã䜿çšããã§ãããã 確ãã«ããªãã¯ãããã®å®è£
ã«ã€ããŠãèããŠããŸããã§ããã ãã®ã»ã¯ã·ã§ã³ã§ã¯ããããã®é¢æ°ã®ç°¡åãªå®è£
ã瀺ããããããã¡ã¢ãªå²ãåœãŠã«ã©ã®ããã«é¢äžãããã説æããŸãã
ããšãã°ããã®
ãªã¹ããå¿
èŠã§ãã ãããã³ããŒããŠ
malloc.cãšãããã¡ã€ã«ã«è²Œãä»ããŸãã å°ãåŸã§åæããŸãã
2ã€ã®ç°¡åãªæ©èœã«é¢é£ä»ããããŠããã»ãšãã©ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¡ã¢ãªãå²ãåœãŠãŸãã
- void * malloc ïŒlong numbytesïŒïŒã¡ã¢ãªå
ã®numbytesãã€ããå²ãåœãŠãæåã®ãã€ããžã®ãã€ã³ã¿ãŒãè¿ããŸãã
- void free ïŒvoid * firstbyteïŒïŒ firstbyte - mallocïŒïŒã䜿çšããŠååŸãããã€ã³ã¿ãŒãšã解æŸã«å¿
èŠãªã¡ã¢ãªãŒã
ã¢ãã±ãŒã¿ãŒãåæå
ããmalloc_inité¢æ°ã
宣èšããŸãã ããã¯ãã¢ãã±ãŒã¿ãåæåæžã¿ãšããŠããŒã¯ããã¡ã¢ãªå
ã®æåŸã®æå¹ãªã¢ãã¬ã¹ãèŠã€ããŠïŒã€ãŸããå²ãåœãŠã«äœ¿çšã§ããïŒããã®ã¡ã¢ãªã®å
é ã«ãã€ã³ã¿ãèšå®ãããšãã3ã€ã®ããšãæå³ããŸãã ãããè¡ãã«ã¯ã3ã€ã®ã°ããŒãã«å€æ°ã宣èšããŸãã
ã³ãŒããªã¹ã1ïŒ ã¢ãã±ãŒã¿ãŒã®ã°ããŒãã«å€æ°int has_initialized = 0; void *managed_memory_start; void *last_valid_address;
äžèšã®ããã«ãã©ãã«ä»ãã¡ã¢ãªã®ããšããžãïŒæåŸã®æå¹ãªã¢ãã¬ã¹ïŒã«ã¯ããã€ãã®ååããã
ãŸã-System breakãŸãã¯
Current breakã§ãã ã»ãšãã©ã®Unixã©ã€ã¯ã·ã¹ãã ã§ã¯ã
sbrkïŒ0ïŒé¢æ°ã䜿çšããŠ
çŸåšã®ã·ã¹ãã ãã¬ãŒã¯ãèŠã€ããŸãã
sbrkã¯ã çŸåšã®ãã¬ãŒã¯ãïŒåŒæ°ã§æž¡ãããïŒnãã€ãã ãããã·ã¥ããŸãããã®åŸã
çŸåšã®ãã¬ãŒã¯ã¯æ°ããå€ãåããŸãã
sbrkïŒ0ïŒãåŒã³åºããšãåã«
çŸåšã®ã·ã¹ãã ãè¿ãã
ãŸã ã
çŸåšã®ãã¬ãŒã¯ãæ¢ããŠå€æ°ãåæåãã
mallocã®ã³ãŒããèšè¿°ããŸãã
ã³ãŒããªã¹ã2ïŒ ã¢ãã±ãŒã¿ãŒã®åæå #include <unistd.h> void malloc_init() { /* ( ) */ last_valid_address = sbrk(0); /* , * last_valid_address */ managed_memory_start = last_valid_address; /* , */ has_initialized = 1; }
é©åã«ç®¡çããã«ã¯ãå²ãåœãŠãããã¡ã¢ãªãšè§£æŸãããã¡ã¢ãªãç£èŠããå¿
èŠããããŸãã ã¡ã¢ãªã®äžéšã«å¯ŸããŠ
freeïŒïŒãåŒã³åºããåŸãã¡ã¢ãªããæªäœ¿çšããšããŠããŒã¯ããå¿
èŠããããŸãã ããã¯ã
mallocïŒïŒãåŒã³åºããããšãã«ç©ºãã¡ã¢ãªãèŠã€ããããã«å¿
èŠã§ãã ãããã£ãŠã
mallocïŒïŒãè¿ãã¡ã¢ãªã®åéšåã®å
é ã¯æ¬¡ã®æ§é ã«ãªããŸãã
ã³ãŒããªã¹ã3ïŒ ã¡ã¢ãªå¶åŸ¡ãããã¯ã®æ§é struct mem_control_block { int is_available; int size; };
ãã®æ§é äœãžã®ãã€ã³ã¿ãŒãè¿ãïŒ
mallocé¢æ°ãåŒã³åºãïŒãšããã®æ§é äœãå¹²æžãããšæšæž¬ã§ããŸãã ïŒ
翻蚳è
ã®ã³ã¡ã³ã ïŒãã€ã³ã¿ããã®æ§é ã®å
é ã«èšå®ãããŠããå Žåããã®ã¡ã¢ãªã«æžã蟌ããšãå²ãåœãŠãããã¡ã¢ãªéã«é¢ããæ
å ±ã倱ãããŸãïŒãã¹ãŠãéåžžã«ç°¡åã«è§£æ±ºãããŸã-é衚瀺ã«ããå¿
èŠããããŸããã€ãŸãããã€ã³ã¿ãã¡ã¢ãªã«æ»ãããã®æ§é ã®ããåŸãã«ãããŸãã ã€ãŸã å®éãæ
å ±ãæ ŒçŽããŠããªãé åãžã®ãã€ã³ã¿ãè¿ããããŒã¿ããæžã蟌ããããšãã§ããŸãã ãã€ã³ã¿ãŒãæž¡ããã
freeïŒïŒåŒã³åºããè¡ããããšãç¹å®ã®ãã€ãæ°ïŒå
·äœçã«ã¯
sizeof ïŒmem_control_blockïŒïŒãå·»ãæ»ããŠããã®æ§é ã®ããŒã¿ãããã«æ€çŽ¢ããããã«äœ¿çšããŸãã
ãŸããã¡ã¢ãªã®è§£æŸã«ã€ããŠèª¬æããŸãããããªããªãã ãã®ããã»ã¹ã¯åŒ·èª¿è¡šç€ºãããç°¡åã§ãã ã¡ã¢ãªã解æŸããããã«å¿
èŠãªã®ã¯ããã©ã¡ãŒã¿ãšããŠæž¡ããããã€ã³ã¿ã
freeïŒïŒé¢æ°ã«åãã
sizeof ïŒstruct mem_control_blockïŒãã€ãã«æ»ããã¡ã¢ãªã空ããšããŠããŒã¯ããããšã§ãã ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
ã³ãŒããªã¹ã4ïŒ ã¡ã¢ãªã解æŸãã void free(void *firstbyte) { struct mem_control_block *mcb; mcb = firstbyte - sizeof(struct mem_control_block); mcb->is_available = 1; return; }
ã芧ã®ãšããããã®äŸã§ã¯ããªãªãŒã¹ã¯äžå®ã®æéã§è¡ãããŸãã å®è£
ã¯éåžžã«ç°¡åã§ãã éžæã§ã¯ãããå°ãé£ãããªããŸãã äžè¬çãªçšèªã§ã¢ã«ãŽãªãºã ãæ€èšããŠãã ããã
ã³ãŒããªã¹ã5ïŒ ã¢ãã±ãŒã¿ãŒã¢ã«ãŽãªãºã ã®æ¬äŒŒã³ãŒã 1. , . 2. sizeof(struct mem_control_block) ; 3. managed_memory_start. 4. last_valid address? 5. : A. . 6. : A. ?( mem_control_block->is_available == 1)? B. : I) - (mem_control_block->is_available >= )? II) : a. (mem_control_block->is_available = 0) b. mem_control_block III) : a. "size" b. 4 C. : I) "size" II) 4
å
šäœã®ãã€ã³ãã¯ãç¡æã®ãµã€ããèŠã€ããããã®ã¡ã¢ãªããã®äžçš®ã®ããŠã©ãŒã¯ãã§ãã ã³ãŒããèŠãŠãã ããïŒ
ã³ãŒããªã¹ã6ïŒ ã¯ãŒã¯ãããŒã®å®è£
void *malloc(long numbytes) { void *current_location; struct mem_control_block *current_location_mcb; void *memory_location; if(! has_initialized) { malloc_init(); } numbytes = numbytes + sizeof(struct mem_control_block); memory_location = 0; current_location = managed_memory_start; while(current_location != last_valid_address) { current_location_mcb = (struct mem_control_block *)current_location; if(current_location_mcb->is_available) { if(current_location_mcb->size >= numbytes) { current_location_mcb->is_available = 0; memory_location = current_location; break; } } current_location = current_location + current_location_mcb->size; } if(! memory_location) { sbrk(numbytes); memory_location = last_valid_address; last_valid_address = last_valid_address + numbytes; current_location_mcb = memory_location; current_location_mcb->is_available = 0; current_location_mcb->size = numbytes; } memory_location = memory_location + sizeof(struct mem_control_block); return memory_location; }
ãããã¡ã¢ãªãããŒãžã£ã§ãã 次ã«ãããã°ã©ã ã§äœ¿çšããããã«ã¢ã»ã³ãã«ããå¿
èŠããããŸãã
mallocã«äŒŒãã¢ãã±ãŒã¿ãŒãæ§ç¯ããã«ã¯ã次ã®ã³ãã³ããå
¥åããå¿
èŠããããŸãïŒ
reallocïŒïŒãªã©ã®é¢æ°ã«ã¯è§ŠããŸããã§ãããã
mallocïŒïŒããã³
freeïŒïŒãæãéèŠã§ãïŒã
ã³ãŒããªã¹ã7ïŒ ã³ã³ãã€ã« gcc -shared -fpic malloc.c -o malloc.so
åºåã§ã
malloc.soãã¡ã€ã«ãååŸããŸããããã¯ã©ã€ãã©ãªã§ãããã³ãŒããå«ãŸããŠããŸãã
Unixã·ã¹ãã ã§ã¯ãã·ã¹ãã ã®ä»£ããã«ã¢ãã±ãŒã¿ãŒã䜿çšã§ããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
ã³ãŒããªã¹ã8ïŒ æšæºmallocã®çœ®ãæã LD_PRELOAD=/path/to/malloc.so export LD_PRELOAD
LD_PRELOADã¯
ç°å¢å€æ°ã§ã ã ãã®ã©ã€ãã©ãªãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠããŒããããåã«ãã©ã€ãã©ãªã«å«ãŸããæåã決å®ããããã«ãåçãªã³ã«ãŒã«ãã£ãŠäœ¿çšãããŸãã ããã¯ãåçã©ã€ãã©ãªã§ã®ã·ã³ãã«ã®éèŠæ§ã匷調ããŠããŸãã ãããã£ãŠãçŸåšã®ã»ãã·ã§ã³ã®äžéšãšããŠäœæãããã¢ããªã±ãŒã·ã§ã³ã¯ãå
ã»ã©äœæãã
mallocïŒïŒã䜿çšããŸãã äžéšã®ã¢ããªã±ãŒã·ã§ã³ã¯
mallocïŒïŒã䜿çšããŸããããããã¯ã«ãŒã«ã§ã¯ãªãäŸå€ã§ãã
reallocïŒïŒã®ããã«ã¢ãã±ãŒã¿ãŒã䜿çšããŠãã人ããmallocïŒïŒã®å
éšåäœã«ã€ããŠãŸã£ããç¥ããªã人ã¯ãé¥ããããã§ãããã
Ashã·ã§ã«ïŒashã¯ãã®ãããªã·ã¹ãã ã®UNIXã³ãã³ãã·ã§ã«ã§ãïŒã¯ã
mallocã¢ãã±ãŒã¿ãŒã§ããŸãæ©èœããŸãã
mallocïŒïŒã䜿çšãããŠããããšã確èªãããå Žåã¯ãé¢æ°ã®å
é ã«
writeïŒïŒåŒã³åºããè¿œå ã§ããŸãã
æ©èœé¢ã§ã¯ãã¡ã¢ãªãããŒãžã£ïŒ
ã¡ã¢ãªãããŒãžã£ ïŒã«ã¯å€ãã®èŠæãæ®ãããŠããŸãããäœæ¥ã瀺ãäŸãšããŠã¯çŽ æŽããããã®ã§ãã ãã®æ¬ ç¹ã®ãã¡ã次ã®ç¹ã«æ³šæããå¿
èŠããããŸãã
- ãªããªã System break ïŒã°ããŒãã«å€æ°ïŒã§åäœããä»ã®ã¢ãã±ãŒã¿ãŒãmmapãšå
±åã§ããŸããã
- ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã¯ãææªã®å Žåãã¢ãã±ãŒã¿ãŒã¯ããã»ã¹ã¡ã¢ãªå
šäœãåŠçããå¿
èŠããããŸããããã»ã¹ã¡ã¢ãªã«ã¯ããã£ã¹ã¯ã«ä¿åãããŠããããŒã¿ã®ã¢ãã¬ã¹ãå«ãŸããå ŽåããããŸãã ããã«ãããOSã¯ãã£ã¹ã¯ããä»®æ³ãžã®ããŒã¿ã®ç§»åã«æéãè²»ããããšã«ãªããŸãã ã¡ã¢ãªããã³ãã®éã
- æé©ãªã¡ã¢ãªäžè¶³ãšã©ãŒåŠçã¯ãããŸããã
- reallocïŒïŒãªã©ãä»ã®å€ãã®é¢æ°ã®å®è£
ã¯ãããŸããã
- ãªããªã sbrkïŒïŒã¯ãèŠæ±ãããããå€ãã®ã¡ã¢ãªãå²ãåœãŠãããšããããŸããããã«ãããããŒãã®æåŸã§ã¡ã¢ãªãªãŒã¯ãçºçããŸãã
- is_availableã¯4ãã€ãã䜿çšããŸãããå®éã«ã¯1ãããã®ã¿ãå¿
èŠã§ãã
- ã¢ãã±ãŒã¿ãŒã«ã¯ã¹ã¬ããã»ãŒãããããŸããã
倧ããªãããã¯ã«ããŒãžã§ããŸããã ïŒç¿»èš³è
ã®ã¡ã¢ïŒ32ãã€ããèŠæ±ãããšããŸããã¡ã¢ãªã«ã¯16ãã€ãã®ç©ºããããã¯ãé£ç¶ããŠ2ã€ãããŸããã¢ãã±ãŒã¿ã¯ãããèæ
®ããŸãããïŒ; - æœåšçã«ã¡ã¢ãªã®æçåã«ã€ãªããéèªæãªã¢ã«ãŽãªãºã ã䜿çšããŸãã
- ãã¡ãããä»ã®åé¡ããããŸãã ããããããã¯ã»ãã®äžäŸã§ãïŒ
ä»ã®mallocå®è£
é·æãšçæã®äž¡æ¹ãæã€ä»ã®å€ãã®
mallocïŒïŒå®è£
ããããŸãã ã¢ãã±ãŒã¿ãŒãèšèšããéã«èæ
®ãã¹ãå€ãã®åºæºããããŸãã
- ã¡ã¢ãªå²ãåœãŠé床 ïŒ å²ãåœãŠé床 ïŒ;
- å²ãåœãŠè§£é€é床
- ãã«ãã¹ã¬ããç°å¢ã§ã®åäœã
- ã¡ã¢ãªäžè¶³ã®åäœã
- ãã£ãã·ã¥ã®å Žæã
- è¿œå ã®ã¡ã¢ãªã³ã¹ããèæ
®ããŸãã
- ä»®æ³ã¡ã¢ãªã§ã®åäœã
- 倧å°ã®ãªããžã§ã¯ãã
- ãªã¢ã«ã¿ã€ã ã§å®å®ããäœæ¥ã
ããšãã°ãã¢ãã±ãŒã¿ã®å Žåããã©ã¹ã¯ã¡ã¢ãªã®ã¯ã€ãã¯ãªãªãŒã¹ã§ããããã€ãã¹ã¯é
ãå²ãåœãŠã§ãã ãŸããWirthãæäœããããã®ããªããã£ãã¢ã«ãŽãªãºã ãåå ã§ãã ã¡ã¢ãªãããã¯å€§ããªãªããžã§ã¯ãã«æé©ã§ãã
ã¢ãã±ãŒã¿ãŒã«ã¯å€ãã®çš®é¡ããããŸãã ãããã®ããã€ãã次ã«ç€ºããŸãã
- Doug Lea malloc ïŒã¯ããªãªãžãã«ã®Doug Leaã¢ãã±ãŒã¿ãŒã GNU libcã¢ãã±ãŒã¿ãŒã ptmallocãå«ãã¢ãã±ãŒã¿ãŒã®ãµãã»ããã§ãã Deug Leaã¢ãã±ãŒã¿ãŒã¯ãã¢ãã±ãŒã¿ãŒãšåæ§ã®æ§é ãæã£ãŠããŸãããæ€çŽ¢ãé«éåããããã®æŠåšåº«ã«ã€ã³ããã¯ã¹ããããããã€ãã®æªäœ¿çšãããã¯ã1ã€ã®å€§ããªãããã¯ã«çµåã§ããŸãã ãã£ãã·ã¥ã®ãµããŒãããããæè¿è§£æŸãããã¡ã¢ãªãåå©çšããããã»ã¹ãé«éåããŸãã ptmallocã¯ããã«ãã¹ã¬ããããµããŒãããããã«æ¡åŒµãããDeug Leaãšåãã§ã ã Doug Leaã®mallocã®èª¬æã¯ãèšäºã®æåŸã«ããåç
§ãªã¹ãã«ãããŸãã
- BSD malloc ïŒ BSD Mallocã¯ãããŒãžã§ã³4.2以éã«BSDã§é
åžãããŠããå®è£
ã§ãããã¡ã¢ãªå
ã®æ¢ç¥ã®ãµã€ãºã®ããŒã«ãããªããžã§ã¯ããå²ãåœãŠãã¢ãã±ãŒã¿ãŒãšããŠFreeBSDã«å«ãŸããŠããŸãã 圌ã¯ãªããžã§ã¯ãã«é¢é£ããã¯ã©ã¹ã®ãµã€ãº-2ã®ã¹ãä¹ããå®æ°ãèªç±ã«äœ¿çšã§ããŸãã ãããã£ãŠããªããžã§ã¯ãã®ã¡ã¢ãªãèŠæ±ãããšããµã€ãºãé©åãªä»»æã®ã¯ã©ã¹ã®ã¡ã¢ãªãåçŽã«å²ãåœãŠãããŸãã ããã«ãããç°¡åãªå®è£
ãæäŸãããŸãããã¡ã¢ãªã®ãªãŒããŒããããçºçããå¯èœæ§ããããŸãã 説æã¯èšäºã®æåŸã«ããããŸãã
- Hoard ïŒ Hoardã¯ããã«ãã¹ã¬ããç°å¢ã§ãã°ããåäœããããã«äœæãããŸããã ãããã£ãŠãã¡ã¢ãªã®å²ãåœãŠãåŸ
æ©ããŠããããã»ã¹ãæäœããã®ã«åœ¹ç«ã€ããã¯ãæäœããããã«æçãããã¡ã¢ãªãåžžã«äœ¿çšãããã«ãã¹ã¬ããããã»ã¹ã倧å¹
ã«é«éåã§ããŸãã åç
§ãªã¹ãã®èª¬æã
ãããã¯ãå€ãã®ã¢ãã±ãŒã¿ãŒã®äžã§æãæåã§ãã ã¢ããªã±ãŒã·ã§ã³ã§ç¹å¥ãªã¡ã¢ãªå²ãåœãŠãå¿
èŠãªå Žåã¯ãèŠä»¶ã«åºã¥ããŠæ©èœããèªäœïŒã«ã¹ã¿ã ïŒã¢ãã±ãŒã¿ãäœæã§ããŸãã ãšã«ãããã¢ãã±ãŒã¿ãŒã®æŠå¿µã«æ
£ããŠããªãå Žåãèªå·±èšè¿°ã®å®è£
ã¯å©çããããããããå€ãã®é çã®çš®ãäœæããŸãã ãµããžã§ã¯ãé åã®è©³çŽ°ã«ã€ããŠã¯ã次ã®æ¬ãèªãããšããå§ãããŸãã
ããã«ãã¯ããŒã¹ïŒããã°ã©ãã³ã°ã¢ãŒã1ïŒåºæ¬ã¢ã«ãŽãªãºã -ã»ã¯ã·ã§ã³2.5ïŒåçã¡ã¢ãªå²ãåœãŠã ãã¡ããçŽ æã¯æ代é
ãã§ãããWirthã§ã®äœæ¥ã¯ããã§ã¯åœ±é¿ãåããŸããã ç°å¢ã¡ã¢ãªã§ãããã¢ã«ãŽãªãºã ã®ããŒã¹ã¯å€æŽãããŠããŸããã
C ++ã§ã¯ã
newïŒïŒæŒç®åã®ãªãŒããŒããŒãæŒç®åã䜿çšããŠãã¯ã©ã¹ãŸãã¯ãã³ãã¬ãŒãã«ã¢ãã±ãŒã¿ãŒãå®è£
ã§ããŸãã Andrei Alexandrescuã¯èæž
Modern C ++ Programmingã§å°ããªã¢ãã±ãŒã¿ãŒãªããžã§ã¯ãã«ã€ããŠèª¬æããŠããŸãïŒç¬¬4ç« ïŒå°ããªãªããžã§ã¯ããã¡ã¢ãªã«é
眮ããïŒã
mallocïŒïŒã䜿çšããé
åžã®æ¬ ç¹ã¡ã¢ãªãããŒãžã£ã«æ¬ é¥ãããã ãã§ãªããä»ã®å®è£
ã«ãååšããŸãã
mallocïŒïŒã§ç®¡çããããš
ã¯ãããŒã¿ãé·æéä¿åããç°¡åã«ã¢ã¯ã»ã¹ã§ããããã°ã©ã ã«ãšã£ãŠ
ã¯éåžžã«å±éºãªããšã§ãã åçã«å²ãåœãŠãããã¡ã¢ãªãžã®å€ãã®åç
§ãããããããã€è§£æŸããå¿
èŠãããããèŠã€ããã®ã¯å°é£ã§ãã å€æ°ã®æå¹æéïŒãŸãã¯ã¡ã¢ãªã®äžéšãæäœããæéïŒãé¢æ°ã®ã¹ã³ãŒãïŒããŒã«ã«å€æ°ïŒã«ãã£ãŠå¶éãããŠããå ŽåããããŒãžã£ã¯éåžžç°¡åã«ä»äºãããŸãããããã°ã©ã å
šäœã§ã¡ã¢ãªã䜿çšãããã°ããŒãã«å€æ°ã®å Žåãã¿ã¹ã¯ã¯å€§å¹
ã«ãªããŸãé£ããã ãŸããå€ãã®APIã¯å®å
šã«ã¯èšè¿°ãããŠããããããã°ã©ã èªäœãŸãã¯åŒã³åºãããé¢æ°ã§ã誰ãã¡ã¢ãªã管çãã責任ãããã®ãââãæ確ã«ãªããŸããã
ãã®ãããªåé¡ã®ãããå€ãã®ããã°ã©ã ã¯ç¬èªã®ã«ãŒã«ã«åŸã£ãŠã¡ã¢ãªãæäœããŸãã å Žåã«ãã£ãŠã¯ãã³ã³ãã¥ãŒãã£ã³ã°ã³ã³ããŒãã³ããããã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã«å€ãã®æäœïŒ
çŽTranslator ïŒããã¹ãå
ã®ãããå€ãã®ã³ãŒããïŒãè²»ããããããšã瀺ãããšããããŸãã ãããã£ãŠãã¡ã¢ãªã管çããå¥ã®æ¹æ³ãæ€èšããŸãã
ã¡ã¢ãªç®¡çãžã®åèªåã¢ãããŒã
åç
§ã«ãŠã³ãåç
§ã«ãŠã³ãã¯ãè¿œå ã®ã³ãŒããå¿
èŠãšããã¡ã¢ãªãæäœããåèªåã®æ¹æ³ã§ãããã¡ã¢ãªã䜿çšãããªããªã£ãææã远跡ã§ããŸããã
åç
§ã«ãŠã³ãããããè¡ããŸãã
äœæ¥ã®ã¡ã«ããºã ã¯æ¬¡ã®ãšããã§ããåçã«å²ãåœãŠãããã¡ã¢ãªããšã«ããããžã®åç
§ã®æ°ãæ ŒçŽãããã£ãŒã«ãããããŸãã ãã®ã¡ã¢ãªãåç
§ããå€æ°ãããã°ã©ã ã«è¡šç€ºããããšãã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ããããŸãã ãããŠãã®é-ãã®ã¡ã¢ãªãåç
§ããå€æ°ãæžå°ãããšãã«ãŠã³ã¿ãŒãæžå°ããŸãã ã«ãŠã³ã¿ãŒããã¯ãªã¡ã³ããããšããã§ãã¯ãçºçããŸãããªã³ã¯ã®æ°ã0ã®å Žåãã¡ã¢ãªã¯è§£æŸãããŸãã
ãã®ã¡ã¢ãªãåç
§ããåãªã³ã¯ã¯ãåã«ã«ãŠã³ã¿ãå¢æžããŸãã ããã«ããã䜿çšäžã®ã¡ã¢ãªã¯ãªãŒãã³ã°ç¶æ³ãåé¿ãããŸãã ãããã«ããããã®ã¿ã€ãã®ïŒãã«ãŠã³ãããããïŒæ§é ã§äœæ¥ããŠããå Žåããªã³ã¯ã®ã«ãŠã³ããæ
åœããé¢æ°ã䜿çšããããšãå¿ããªãã§ãã ããã ãŸããçµã¿èŸŒã¿é¢æ°ãšãµãŒãããŒãã£ã©ã€ãã©ãªã¯ã
åç
§ã«ãŠã³ãã䜿çšããããç¬èªã®åäœã¡ã«ããºã ã䜿çšã§ããªãå ŽåããããŸãã
ãã®ã¡ã«ããºã ãå®è£
ããã«ã¯ã2ã€ã®æ©èœã§ååã§ãã 1ã€ç®ã¯åç
§ã«ãŠã³ã¿ãå¢ããã2ã€ç®ã¯æžå°ããŠãŒãã«éãããšã¡ã¢ãªã解æŸããŸãã
ããšãã°ããªã³ã¯ã«ãŠã³ãé¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
ãªã¹ã9. åç
§ã«ãŠã³ãã®ä»çµã¿ struct refcountedstruct { int refcount; } void REF(void *data) { struct refcountedstruct *rstruct; rstruct = (struct refcountedstruct *) data; rstruct->refcount++; } void UNREF(void *data) { struct refcountedstruct *rstruct; rstruct = (struct refcountedstruct *) data; rstruct->refcount--; if(rstruct->refcount == 0) { free(rstruct); } }
REFãš
UNREFã¯ããè€éã«ãªãå¯èœæ§ããããŸã-ããã¯ãã¹ãŠããªããè¿œæ±ããç®æšã«äŸåããŸãã ããšãã°ããã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ã«ããã¯ãè¿œå ããããšãã§ããŸãã 次ã«ã
refcountedstructã« ãã¡ã¢ãªã解æŸããé¢æ°ãžã®ãã€ã³ã¿ãè¿œå ããå¿
èŠããããŸãïŒãªããžã§ã¯ãæåèšèªã®ãã¹ãã©ã¯ã¿ãªã©-ããã¯ãæ§é äœã«ãã€ã³ã¿ãå«ãŸããŠããå Žåã«å¿
èŠã§ãïŒ
REFããã³
UNREFã䜿çšããå Žåã¯ããã€ã³ã¿ãŒãå²ãåœãŠããšãã«æ¬¡ã®èŠåã«åŸãå¿
èŠããããŸãã
- UNREF-å²ãåœãŠã®åã«åŒã³åºãããŸã
- REF-å²ãåœãŠåŸã«åŒã³åºãããŸã
å
ã«ãŠã³ããããæ§é ãåãå
¥ããé¢æ°ã®å Žåã次ã®èŠåã䜿çšãããŸãã
- REF-é¢æ°ã®éå§æã«åŒã³åºãããŸã
- UNREF-é¢æ°ã®çµããã«åŒã³åºãããŸã
å¥ã®å°ããªäŸã次ã«ç€ºããŸãã
struct mydata { int refcount; int datafield1; int datafield2; }; void dosomething(struct mydata *data) { REF(data); UNREF(data); } struct mydata *globalvar1; void storesomething(struct mydata *data) { REF(data); globalvar1 = data; REF(data); UNREF(data); }
ãªããªã
åç
§ã«ãŠã³ãã¯éåžžã«ç°¡åãªã¡ã«ããºã ã§ãããããå€ãã®éçºè
ã¯ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãé¿ããŠèªåã§å®è£
ããŸãã ãã ãããããã®å®è£
ã¯ãã¡ã¢ãªã®å²ãåœãŠãšè§£æŸå°çšã®
mallocã
freeãªã©ã®ã¢ãã±ãŒã¿ãŒã«åºã¥ããŠããŸãã
åç
§ã«ãŠã³ãã¯ã
Perlãªã©ã®é«ã¬ãã«èšèªã§ã䜿çšãããŸãã ãããã®çŸ©åã¯èšèªèªäœã«å²ãåœãŠãããŠããããããã¡ããæ¡åŒµãããå Žåãé€ããäœãå¿é
ããå¿
èŠã¯ãããŸããã ãã¡ããããªã³ã¯ã«ãŠã³ãã¯äœæ¥ã®é床ããããã«äœäžãããŸãããéçºã«å°ãã®ã»ãã¥ãªãã£ãšã·ã³ãã«ããè¿œå ããŸãã äž»ãªå©ç¹ãèæ
®ããŠãã ããã
- ç°¡åãªå®è£
ã
- 䜿çšããã ãã§ãã
- ãªããžã§ã¯ãåç
§ã¯æ§é ã®äžéšã§ãããè¯å¥œãªãã£ãã·ã¥å±ææ§ãæäŸããŸãã
æ¬ ç¹ããããŸãïŒ
- ãªã³ã¯ã«ãŠã³ãæ©èœãåŒã³åºãããšãå¿ããªãã§ãã ããã
- ãªããžã§ã¯ãããªã³ã°æ§é ã®äžéšã§ããå Žåãã¡ã¢ãªã解æŸã§ããŸããã
- ã€ã³ããã¯ã¹ã®å²ãåœãŠæã®é床ã®äœäžã
- äŸå€ãåŠçãããšãã¯ãç¹ã«æ³šæããå¿
èŠããããŸãïŒ tryãŸãã¯setjmpïŒïŒ / longjmpïŒïŒ ïŒã
- ãªã³ã¯ã䜿çšããå Žåãè¿œå ã®ã¡ã¢ãªãå¿
èŠã§ãã
- åç
§ã«ãŠã³ã¿ãŒã¯æ§é äœã®æåã®å Žæã«ãããã»ãšãã©ã®ãã·ã³ã«ãã°ããã¢ã¯ã»ã¹ã§ããŸãã
- ãã«ãã¹ã¬ããç°å¢ã§äœæ¥ããå Žåãå®è¡ãé
ããªããè€éããå¢ããŸãã
C ++ã¯ã
åç
§ã«ãŠã³ããšåããããèŠåŽããŠãã€ã³ã¿ãæäœãã
ã¹ããŒããã€ã³ã¿ã䜿çšã㊠ããšã©ãŒã®å¯èœæ§ãæžããããšãã§ã
ãŸã ã
ã¹ããŒããã€ã³ã¿ãŒãå®è¡ããŠããªãã¬ã¬ã·ã³ãŒãã®ææè
ïŒããšãã°ãCã©ã€ãã©ãªã§ã®ãªã³ã±ãŒãžïŒã®å Žåããã®ã³ãŒããããã«äœ¿çšãããšã²ã©ãæ··ä¹±ã«ã€ãªãããã¹ããŒããã€ã³ã¿ãŒã«ãã£ãŠå¶åŸ¡ãããã³ãŒãã«æ¯ã¹ãŠã³ãŒããè€éã§æ··ä¹±ããŸãããããã£ãŠãéåžžã¯C ++ãããžã§ã¯ãã§ã®ã¿äœ¿çšãããŸããã¹ããŒããã€ã³ã¿ãŒã䜿çšããå Žåã¯ãModern C ++ ProgrammingïŒAndrei AlexandreksuèïŒã®ãã¹ããŒããã€ã³ã¿ãŒãã®ç« ãèªãã ãã§æžã¿ãŸããã¡ã¢ãªããŒã«ã¡ã¢ãªããŒã«ã¯ãåèªåã¡ã¢ãªç®¡çã®å¥ã®æ¹æ³ã§ããç¹å®ã®ã¹ããŒãž/ãã©ã°ã¡ã³ãïŒã¹ããŒãžãééããããã°ã©ã ã®ããã»ã¹ãèªååããŸãïŒå®è¡ãããã°ã©ã ã®å段éã§ãããã°ã©ã ã«å¿
èŠãªã¹ããŒã¹ã®éãããã£ãŠããŸããããšãã°ãæ¥ç¶ã«å€§éã®ã¡ã¢ãªãå²ãåœãŠããããµãŒããŒããã»ã¹ã§ãããã®æ倧寿åœã¯æ¥ç¶ã®å¯¿åœãšäžèŽããŸããåãApache-åæ¥ç¶ã¯åå¥ã®ã¹ããŒãžã§ãããç¬èªã®ã¡ã¢ãªããŒã«ããããŸãããã©ã°ã¡ã³ããå®è¡ããããšãã¡ã¢ãªã¯å³åº§ã«è§£æŸãããŸãããããŒã«ã管çã¢ãã«ã§ã¯ãåã¡ã¢ãªå²ãåœãŠã¯ãã¡ã¢ãªãå²ãåœãŠãããç¹å®ã®ããŒã«ãåç
§ããŸããïŒã³ã¡ã³ã翻蚳è
ïŒcharåã®ããŒã«ã«å€æ°ã5ã€ããé¢æ°ãæ³åããŠãã ãããã€ãŸããã®æ©èœãå®è¡ããå Žåã5ãã€ãã®ã¡ã¢ãªãå¿
èŠã«ãªãããšãäºåã«ããã£ãŠããŸããã€ãŸããã®é¢æ°ã®æ¬äœã¯ãå®è¡äžã«ããã°ã©ã ãééãã段éã«äŒŒãŠããããã®äžã«5ãã€ãã®åºå®ãµã€ãºã®ã¡ã¢ãªãããã«å²ãåœãŠãããšãã§ããŸããããã«ãããå€æ°ãé¢æ°ã«è¡šç€ºããããããã¡ã¢ãªã®æ€çŽ¢ãšãã«ãããã«ãããæéãç¯çŽãããåžžã«ååãªã¡ã¢ãªãããããšãä¿èšŒãããŸããåããŒã«ã«ã¯ç¬èªã®æå¹æéããããŸãã Apacheã§ã¯ãããŒã«ãµãŒããŒã®æéãæ¥ç¶æéãèŠæ±åŠçæéãªã©ã«çããã©ã€ãã¿ã€ã ããããŸãããããã£ãŠãæ¥ç¶ã®ãµã€ãºãè¶
ããªãã¡ã¢ãªãå¿
èŠãšããäžé£ã®æ©èœãããå Žåãæ¥ç¶ããŒã«ããåçŽã«å²ãåœãŠãããäœæ¥ãå®äºãããšãèªåçã«ãªãªãŒã¹ãããŸããããã«ãäžéšã®å®è£
ã§ã¯ãããŒã«ãã¯ãªã¢ãããåã«ããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã«åŒã³åºãããã¯ãªãŒã³ã¢ããé¢æ°ïŒOOPã®ãã¹ãã©ã¯ã¿ã®ãããªãã®ïŒãç»é²ã§ããŸããããã°ã©ã ã§ããŒã«ã䜿çšããã«ã¯ãåã«obstackïŒGNU -libcïŒãŸãã¯Apache Protable RuntimeïŒApacheïŒå®è£
ã䜿çšã§ããŸããobstackã®å©ç¹ããã¯ããã¹ãŠã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ããã©ã«ãã§ä»å±ããŠãããã®ã§ãããŸããApache Portable Runtimeã¯å€ãã®ãã©ãããã©ãŒã ã§äœ¿çšããæ©äŒã§ããå®è£
ã®è©³çŽ°ã«ã€ããŠã¯ãèšäºã®æåŸã«ãªã³ã¯ããããŸãã次ã®ã工倫ããããäŸã¯ãobstackã®äœ¿çšæ³ã瀺ããŠããŸãããªã¹ã11. obstackã䜿çšããäŸ #include <obstack.h> #include <stdlib.h> /* obstack */ /* obstack (xmalloc * malloc, , (.. ) */ #define obstack_chunk_alloc xmalloc #define obstack_chunk_free free /* Pools */ /* Only permanent allocations should go in this pool */ struct obstack *global_pool; /* pool (per-connection) */ struct obstack *connection_pool; /* (per-request) */ struct obstack *request_pool; void allocation_failed() { exit(1); } int main() { /* */ global_pool = (struct obstack *) xmalloc (sizeof (struct obstack)); obstack_init(global_pool); connection_pool = (struct obstack *) xmalloc (sizeof (struct obstack)); obstack_init(connection_pool); request_pool = (struct obstack *) xmalloc (sizeof (struct obstack)); obstack_init(request_pool); /* */ obstack_alloc_failed_handler = &allocation_failed; /* */ while(1) { wait_for_connection(); /* */ while(more_requests_available()) { /* */ handle_request(); /* (request pool) */ obstack_free(request_pool, NULL); } /* - */ obstack_free(connection_pool, NULL); } } int handle_request() { /* , (request pool) */ int bytes_i_need = 400; void *data1 = obstack_alloc(request_pool, bytes_i_need); /* */ /* */ return 0; }
ååãšããŠãåã¹ããŒãžãå®äºãããšãobstackã®ã¡ã¢ãªãŒã解æŸãããŸãããã ããå®è¡ããã»ã¹äžã«ã¹ããŒãžã«å²ãåœãŠãããŠãããããå€ãã®ã¡ã¢ãªãå¿
èŠãªå Žåãæ¥ç¶ãŸãã¯ã°ããŒãã«å€æ°ã®ã©ã€ãã¿ã€ã ã«å¹æµããobstackã©ã€ãã¿ã€ã ãå¢å ããå¯èœæ§ãããããšã«æ³šæããŠãã ãããå Žåobstack_freeïŒïŒãã©ã¡ãŒã¿ãæå®ããŠåŒã³åºãNULLããã®åŸããã¹ãŠããªãªãŒã¹ãããŸãobstackããä»ã®ãã©ã¡ãŒã¿ãŒã䜿çšããåŒã³åºãã¯ãŸãã§ããããŒã«ã䜿çšããå©ç¹ïŒ- ã¢ããªã±ãŒã·ã§ã³ã§ã®ã·ã³ãã«ãªã¡ã¢ãªç®¡çã
- ã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã¯é«éã§ãããªããªãããã¹ãŠã¯ããŒã«å
ã§çºçããŸããå²ãåœãŠã¯OïŒ1ïŒã§è¡ãããã»ãŒåæã«è§£æŸãããŸãïŒå®éã«ã¯OïŒnïŒã§ãããããŒã«ã®åå²ã¯éåžžã«éèŠã§ãããã»ãšãã©ã®å ŽåOïŒ1ïŒã«ã€ãªãããŸãïŒã
- ãšã©ãŒãã³ãã©ãŒãããŒã«ã«èšå®ã§ããŸããããã«ãããã¡ã¢ãªã䜿ãæããããå Žåã«ããã°ã©ã ãèœã¡ãªãããã«ãªããŸãã
- 䜿ããããæšæºçãªå®è£
ããããŸãã
æ¬ ç¹ã®äžã§ã次ã®ç¹ã«æ³šæããããšãã§ããŸãã- ããã°ã©ã ã§äœ¿çšãããŠãããã®å®è£
ã¯ãå¥ã
ã®æ®µéïŒã«åããããšãã§ãã段éïŒã
- å€ãã®å ŽåããµãŒãããŒãã£ã®ã©ã€ãã©ãªã§ã¯åäœããŸããã
- ããã°ã©ã ã®æ§é ãå€æŽããããšãã¡ã¢ãªããŒã«ãå€æŽãããå¯èœæ§ããããã¡ã¢ãªç®¡çã·ã¹ãã ïŒã¡ã¢ãªç®¡çã·ã¹ãã ïŒã®åæ§ç¯ãå¿
èŠã«ãªããŸãã
- ã¡ã¢ãªãå²ãåœãŠãããŒã«ãèŠããŠããå¿
èŠããããŸããééããå Žåãæ€åºãå°é£ã«ãªããŸãã
ã¬ããŒãžã³ã¬ã¯ã¿ïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯ -å®å
šã«èªåæ€åºããã¡ã¢ãªããæªäœ¿çšã®ãªããžã§ã¯ããé€å»ããããšã§ããã¡ã¢ãªãç¹å®ã®ãããå€ãäžåããšåŒãç¶ããŸãã圌ã¯ããã°ã©ã ãéå¶ãããåºæ¬çãªãããŒã¿ãã«æž¡ãéåžžãæåã®ãã®-ã¹ã¿ãã¯ïŒç©ã¿éãïŒãã°ããŒãã«å€æ°ïŒã°ããŒãã«å€æ°ã¢ã³ïŒãšã¬ãžã¹ã¿ïŒã¬ãžã¹ã¿ïŒã³ã¬ã¯ã¿ãŒã¯ãããã°ã©ã ã§ã®ãã®ããŒã¿ã®äœ¿çšã远跡ããããšããŠããŸãããã®ããŒã¿ãžã®ãªã³ã¯ãèŠã€ãã£ãå Žåããããã«ã¢ã¯ã»ã¹ããŸãããããã§ãªãå Žåãã¡ã¢ãªã¯æ¶å»ãããåå©çšã§ããŸããããå¹ççãªã¡ã¢ãªç®¡çã®ããã«ãå€ãã®ã³ã¬ã¯ã¿ãŒã¯æ§é ãžã®ãã€ã³ã¿ã®äžçš®ã®ãããŒã¹ããèªç±ã«äœ¿çšã§ãããããæ£ããåäœããã«ã¯èšèªã®äžéšã§ããå¿
èŠããããŸããã³ã¬ã¯ã¿ãŒã®ã¿ã€ã- ( Coping ) : . ââ , ââ . , ââ, . , . garbage collector .
- ( Mark and sweep ) : . , ââ ââ , 1 , , .
- ( Incremental ) : . , ( ). .
- ( Conservative ) : . , . , . , , . ( . : int . , .) . , .
ä¿å®å
sboschik ãã³ã¹ã»ããŒã ïŒãã³ã¹ã»ããŒã ã«ãã£ãŠã¯ïŒä»¥æ¥ãã³ã¬ã¯ã¿ãŒã®äžã§æã人æ°ã®äžã€ã§ãç¡æã§ãä¿å®çã§å¢åçã§ãã-enable-redirect-mallocãã©ã°ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåãã·ã¹ãã ã¢ãã±ãŒã¿ã®ä»£ãããšããŠïŒç¬èªã®APIã®ä»£ããã«malloc / freeã䜿çšããŠïŒéåžžã«ãã䜿çšã§ããŸããå®éã«ãããã¯è±èªã§ïŒããªãã¯ã¹ãšåãã§ãããããªãã¯-ããªãã¯ãããªãã¯ïŒã¢ãã±ãŒã¿ãŒã§äœ¿çšããLD_PRELOADã䜿çšããŸãããã®å Žåã®ã¿ãã³ã¬ã¯ã¿ãŒãã»ãšãã©ãã¹ãŠã®ããã°ã©ã ã«ãªã³ã¯ããã®ã«åœ¹ç«ã¡ãŸããããã°ã©ã ã§ã¡ã¢ãªãªãŒã¯ãçºçããŠãããšæãããå Žåã¯ããã®ã³ã¬ã¯ã¿ã䜿çšããŠãæ¶è²»ãããã¡ã¢ãªã®éãæžããããšãã§ããŸããå€ãã®äººã
ã¯ãMozilaãæåã«ç»å Žããæ代ã«ãã®ææ³ã䜿çšããŸããããã®åŸãã¡ã¢ãªãªãŒã¯ã§æ·±å»ãªç
æ°ã«ãªããŸãããã³ã¬ã¯ã¿ãŒã¯ãWindowsãšLinuxã®äž¡æ¹ã§æ©èœããŸããã³ã¬ã¯ã¿ãŒã®å©ç¹ïŒ- äºé解æŸããªããžã§ã¯ãã®åç¶æéã«ã€ããŠå¿é
ããå¿
èŠã¯ãããŸããã
- äžéšã®ã³ã¬ã¯ã¿ãŒã®APIã¯ãã¢ãã±ãŒã¿ãŒã§äžè¬çã«äœ¿çšãããŠãããã®ãšåãã§ãã
çæïŒ
- ã»ãšãã©ã®ã³ã¬ã¯ã¿ãŒã¯ãã¡ã¢ãªã解æŸãããããšãéç¥ããŸããã
- ã»ãšãã©ã®å Žåãã³ã¬ã¯ã¿ãŒã¯ä»ã®ã¡ã¢ãªç®¡çæè¡ãããé
ããªããŸãã
- ã³ã¬ã¯ã¿ãŒã®èª€åäœã«ãã£ãŠåŒãèµ·ããããåé¡ã¯ãããã°ãå°é£ã§ãã
- ãã€ã³ã¿ãŒãNULLã«èšå®ããã®ãå¿ãããšãå¿
ç¶çã«ãªãŒã¯ãçºçããŸãã
ãŸãšãããã¯åŠ¥åã®äžçã§ãïŒããã©ãŒãã³ã¹ã䜿ãããããå®è£
ã®ããããããã«ãã¹ã¬ãããšã®äºææ§ãå€ãã®ã¡ã¢ãªç®¡çãã³ãã¬ãŒãããããŸã-ãããžã§ã¯ãã®èŠä»¶ã確å®ã«æºãããã®ããããŸããåãã³ãã¬ãŒãã«ã¯é·æãšçæããããŸããæšæºçãªæ¹æ³ã¯ã»ãšãã©ã®ããã°ã©ã ã«é©ããŠããŸããããããžã§ã¯ãã«åºæã®èŠä»¶ãããå Žåã¯ã代æ¿æ¹æ³ã®ç¥èã圹ç«ã¡ãŸããçµè«ãšããŠããã®èšäºã§èª¬æããã¡ã¢ãªç®¡çæ¹æ³ã®æ¯èŒè¡šã玹ä»ããŸããè¡š1ïŒã¡ã¢ãªå²ãåœãŠã®ã¢ãããŒãã®æ¯èŒã¢ãããŒã | å²ãåœãŠé床 | ãªãªãŒã¹é床 | ãã£ãã·ã¥ã®å±ææ§ | | é©çšæ§ | real time | SMP |
---|
Custom allocator | | | | | | | |
Simple allocator | | | | | | ãã | ãã |
GNU malloc | | | | | | ãã | |
Hoard | | | | | | ãã | ã¯ã |
Reference counting | - | - | | | | ( malloc ) | |
Pooling | | | | | | ( malloc ) | |
Garbage collection | ( ) | | | | | ãã | |
Incremental garbage collection | | | | | | ãã | |
Incremental conservative garbage collection | | | | | | ãã | |
:- GNU C Libraryããã¥ã¢ã«ã®obstacksã»ã¯ã·ã§ã³ã«ã¯ãobstacksã®ããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ãèšèŒãããŠããŸãã
- Apache Portable Runtimeã®ããã¥ã¡ã³ãã§ã¯ãããŒã«ãããã¢ãã±ãŒã¿ãŒãžã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠèª¬æããŠããŸãã
- Doug Leaã®Mallocã¯ãããäžè¬çãªã¡ã¢ãªã¢ãã±ãŒã¿ãŒã®1ã€ã§ãã
- BSD Mallocã¯ãã»ãšãã©ã®BSDããŒã¹ã®ã·ã¹ãã ã§äœ¿çšãããŠããŸãã
- ptmalloc is derived from Doug Lea's malloc and is used in GLIBC.
- GNU Memory-Mapped Malloc (part of GDB) is a
malloc
implementation that is based on mmap() . - GNU Obstacks (part of GNU Libc) is the most widely installed pooled allocator, since it's on every glibc-based system.
- Apache's pooled allocator (in the Apache Portable Runtime) is the most widely used pooled allocator.
- NetBSD also has its own pooled allocator.
- The Loki C++ Library has a number of generic patterns implemented for C++, including smart pointers and a custom small-object allocator.
- The Hahns Boehm Conservative Garbage Collector is the most popular open source garbage collector, which can be used in regular C/C++ programs.
- A New Virtual Memory Implementation for Berkeley UNIX by Marshall Kirk McKusick and Michael J. Karels discusses BSD's VM system.
- Mel Gorman's Linux VM Documentation discusses the Linux VM system.
- Malloc in Modern Virtual Memory Environments by Poul-Henning Kamp talks about BSD's malloc and how it interacts with BSD virtual memory.
- Design of a General Purpose Memory Allocator for the 4.3BSD UNIX Kernel by Marshall Kirk McKusick and Michael J. Karels discusses kernel-level allocators.
- A Memory Allocator by Doug Lea gives an overview of the design and implementation of allocators, including design choices and tradeoffs.
- Memory Management for High-Performance Applications by Emery D. Berger talks about custom memory management and how it affects high-performance applications.
- Some Storage Management Techniques for Container Classes by Doug Lea describes writing custom allocators for C++ classes.
- The Measured Cost of Garbage Collection by Benjamin Zorn presents hard data on garbage allocation and performance.
- Memory Allocation Myths and Half-Truths by Hans-Juergen Boehm presents the myths surrounding garbage collection.
- Space Efficient Conservative Garbage Collection by Hans-Juergen Boehm is a paper describing his garbage collector for C/C++.
- The Memory Management Reference contains numerous references and links to papers on memory management.
- OOPS Group Papers on Memory Management and Memory Hierarchies is a great set of technical papers on the subject.
- Memory Management in C++ discusses writing custom allocators for C++.
- Programming Alternatives: Memory Management discusses several choices programmers have for memory management.
- Richard Jones's Garbage Collection Bibliography has links to any paper you ever wanted about garbage collection.
- C++ Pointers and Dynamic Memory Management by Michael Daconta covers numerous techniques on memory management.
- Memory as a Programming Concept in C and C++ by Frantisek Franek discusses techniques and tools for developing effective memory use and gives the role of memory-related errors the prominence it deserves in computer programming.
- Garbage Collection: Algorithms for Automatic Dynamic Memory Management by Richard Jones and Rafael Lins describes the most common algorithms for garbage collection in use.
- Section 2.5, «Dynamic Storage Allocation» from Fundamental Algorithms , Volume 1 of The Art of Computer Programming by Donald Knuth describes several techniques for implementing basic allocators.
- Section 2.3.5, «Lists and Garbage Collection» from Fundamental Algorithms , volume 1 of The Art of Computer Programming by Donald Knuth discusses garbage collection algorithms for lists.
- Chapter 4, «Small Object Allocation» from Modern C++ Design by Andrei Alexandrescu describes a high-speed small-object allocator that is quite a bit more efficient than the C++ standard allocator.
- Chapter 7, «Smart Pointers» from Modern C++ Design by Andrei Alexandrescu describes the implementation of smart pointers in C++.
- Jonathan's Chapter 8, «Intermediate Memory Topics» from Programming from the Ground Up contains an assembly-language version of the simple allocator used in this article.
- Self-manage data buffer memory (developerWorks, January 2004) outlines a pseudo-C implementation of a self-managing, abstract data buffer for managing memory.
- A framework for the user defined malloc replacement feature (developerWorks, February 2002) shows how to take advantage of a facility in AIX that lets you replace the memory subsystem with one of your own design.
- Mastering Linux debugging techniques (developerWorks, August 2002) describes debugging methods you can use in four different scenarios: segmentation faults, memory overruns, memory leaks, and hangs.
- In Handling memory leaks in Java programs (developerWorks, February 2001), learn what causes Java memory leaks and when they should be of concern.
- In the developerWorks Linux zone , find more resources for Linux developers, and scan our most popular articles and tutorials .
- See all Linux tips and Linux tutorials on developerWorks.
- Stay current with developerWorks technical events and Webcasts .