ç§ãã¡ã翻蚳ããŠããè³æã®èè ã¯ãGoã§ã®ã¡ã¢ãªå²ãåœãŠã®æ段ã®äžçªäžã«è¡ããããã«ã€ããŠè©±ãããšã«ããŸããã
ç©çã¡ã¢ãªãšä»®æ³ã¡ã¢ãª
ã¡ã¢ãªãå²ãåœãŠãããã®ãã¹ãŠã®æ段ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠå¶åŸ¡ãããä»®æ³ã¡ã¢ãªã®ã¢ãã¬ã¹ç©ºéã§åäœããå¿ èŠããããŸãã ã¡ã¢ãªãŒãã©ã®ããã«æ©èœãããããæäœã¬ãã«ããå§ããŠãã¡ã¢ãªãŒã»ã«ãèŠãŠã¿ãŸãããã
RAMã»ã«ãæ³åããæ¹æ³ã次ã«ç€ºããŸãã
ã¡ã¢ãªã»ã«ã®ã¬ã€ã¢ãŠã
éåžžã«ç°¡åãªæ¹æ³ã§ãã¡ã¢ãªã»ã«ãšãããå²ããã®ãæ³åãããšã次ã®ããã«ãªããŸãã
- ã³ã³ãã³ãµïŒããŒã¿ã©ã€ã³ïŒãžã®ã¢ã¯ã»ã¹ãå¯èœã«ããã®ã¯ãã¢ãã¬ã¹ã©ã€ã³ïŒãã©ã³ãžã¹ã¿ãã¹ã€ãããšããŠæ©èœããïŒã§ãã
- ä¿¡å·ïŒèµ€ç·ïŒãã¢ãã¬ã¹ã©ã€ã³ã«è¡šç€ºããããšãããŒã¿ã©ã€ã³ã䜿çšããŠã¡ã¢ãªã»ã«ã«ããŒã¿ãæžã蟌ãããšãã§ããŸããã€ãŸããã³ã³ãã³ãµãå é»ãã1ã«å¯Ÿå¿ããè«çå€ãæ ŒçŽããããšãã§ããŸãã
- ã¢ãã¬ã¹ã©ã€ã³ïŒç·ã®ã©ã€ã³ïŒã«ä¿¡å·ããªãå Žåãã³ã³ãã³ãµã¯åé¢ãããé»è·ã¯å€åããŸããã ã»ã«0ã«æžã蟌ãã«ã¯ããã®ã¢ãã¬ã¹ãéžæããããŒã¿ã©ã€ã³ãä»ããŠè«ç0ãéä¿¡ããå¿ èŠããããŸããã€ãŸããããŒã¿ã©ã€ã³ããã€ãã¹ã§æ¥ç¶ããã³ã³ãã³ãµãæŸé»ããŸãã
- ããã»ããµãã¡ã¢ãªããå€ãèªã¿åãå¿ èŠãããå Žåãä¿¡å·ã¯ã¢ãã¬ã¹ã©ã€ã³ã«æ²¿ã£ãŠéä¿¡ãããŸãïŒã¹ã€ãããéããŸãïŒã ã³ã³ãã³ãµãå é»ãããŠããå Žåãä¿¡å·ã¯ããŒã¿ã©ã€ã³ãéããŸãïŒ1ãèªã¿åãããŸãïŒãããã§ãªãå Žåãä¿¡å·ã¯ããŒã¿ã©ã€ã³ãéããŸããïŒ0ãèªã¿åãããŸãïŒã
ç©çã¡ã¢ãªãšããã»ããµã®çžäºäœçšã®ã¹ããŒã
ããŒã¿ãã¹ã¯ãããã»ããµãšç©çã¡ã¢ãªéã§ããŒã¿ã転éããŸãã
次ã«ãã¢ãã¬ã¹è¡ãšã¢ãã¬ã¹æå®å¯èœãªãã€ãã«ã€ããŠèª¬æããŸãã
ããã»ããµãšç©çã¡ã¢ãªéã®ãã¹ã¢ãã¬ã¹ã©ã€ã³
- RAMã®åãã€ãã«ã¯ãäžæã®æ°å€èå¥åïŒã¢ãã¬ã¹ïŒãå²ãåœãŠãããŸãã ã¡ã¢ãªã«ååšããç©çãã€ãã®æ°ã¯ãã¢ãã¬ã¹è¡ã®æ°ãšçãããªãããšã«æ³šæããŠãã ããã
- åã¢ãã¬ã¹è¡ã¯1ãããå€ãæå®ã§ãããããç¹å®ã®ãã€ãã®ã¢ãã¬ã¹ã®1ãããã瀺ããŸãã
- åè·¯ã«ã¯32è¡ã®ã¢ãã¬ã¹è¡ããããŸãã ãã®çµæãåã¢ãã¬ã¹æå®å¯èœãªãã€ãã¯ãã¢ãã¬ã¹ãšããŠ32ãããã®æ°å€ã䜿çšããŸãã [00000000000000000000000000000000]-æå°ã¡ã¢ãªã¢ãã¬ã¹ã [111111111111111111111111111111111111]-æé«ã¡ã¢ãªã¢ãã¬ã¹ã
- åãã€ãã«ã¯32ãããã®ã¢ãã¬ã¹ããããããã¢ãã¬ã¹ç©ºéã¯2 32ã¢ãã¬ã¹å¯èœãªãã€ãïŒ4 GBïŒã§æ§æãããŸãã
ãã®çµæãã¢ãã¬ã¹å¯èœãªãã€ãæ°ã¯ã¢ãã¬ã¹è¡ã®ç·æ°ã«äŸåããããšãããããŸããã ããšãã°ã64è¡ã®ã¢ãã¬ã¹è¡ïŒx86-64ããã»ããµïŒãããå Žåã2 64ãã€ãïŒ16ãšã¯ãµãã€ãïŒã®ã¡ã¢ãªãã¢ãã¬ã¹æå®ã§ããŸããã64ããããã€ã³ã¿ãŒã䜿çšããã»ãšãã©ã®ã¢ãŒããã¯ãã£ã§ã¯å®éã«48ãããã¢ãã¬ã¹è¡ïŒAMD64ïŒã䜿çšããŸãçè«çã«ã¯ãã³ã³ãã¥ãŒã¿ãŒã«256ãã©ãã€ãã®ç©çã¡ã¢ãªãè£ åã§ããããã«ãã42ãããã¢ãã¬ã¹ã©ã€ã³ïŒIntelïŒ 192 TBïŒã
ç©çRAMã®ãµã€ãºã¯å¶éãããŠãããããåããã»ã¹ã¯ç¬èªã®ããµã³ãããã¯ã¹ãã§å®è¡ãããŸããããã¯ãä»®æ³ã¡ã¢ãªãšåŒã°ãããä»®æ³ã¢ãã¬ã¹ç©ºéããšåŒã°ããŸãã
ä»®æ³ã¢ãã¬ã¹ç©ºéã®ãã€ãã¢ãã¬ã¹ã¯ãããã»ããµãç©çã¡ã¢ãªã«ã¢ã¯ã»ã¹ããããã«äœ¿çšããã¢ãã¬ã¹ãšäžèŽããŸããã ãã®ãããä»®æ³ã¢ãã¬ã¹ãç©çã¢ãã¬ã¹ã«å€æã§ããã·ã¹ãã ãå¿ èŠã§ãã ä»®æ³ã¡ã¢ãªã¢ãã¬ã¹ãã©ã®ããã«èŠããããèŠãŠãã ããã
ä»®æ³ã¢ãã¬ã¹ç©ºéè¡šçŸ
ãã®çµæãããã»ããµãã¡ã¢ãªã¢ãã¬ã¹ãåç §ããåœä»€ãå®è¡ãããšããæåã®ã¹ãããã¯è«çã¢ãã¬ã¹ãç·åœ¢ã¢ãã¬ã¹ã«å€æããããšã§ãã ãã®å€æã¯ãã¡ã¢ãªç®¡çãŠãããã«ãã£ãŠå®è¡ãããŸãã
ä»®æ³ã¡ã¢ãªãšç©çã¡ã¢ãªã®é¢ä¿ã®ç°¡ç¥åãããè¡šçŸ
è«çã¢ãã¬ã¹ã¯å€§ããããŠåå¥ã«æäœããã«ã¯äŸ¿å©ã§ã¯ãªãããïŒããŸããŸãªèŠå ã«ãã£ãŠç°ãªããŸãïŒãã¡ã¢ãªã¯ããŒãžãšåŒã°ããæ§é ã«ç·šæãããŸãã åæã«ãä»®æ³ã¢ãã¬ã¹ç©ºéã¯å°ããªé åãããŒãžã«åå²ãããŸããã»ãšãã©ã®OSã§ã¯ããµã€ãºã¯4 KBã§ãããéåžžã¯ãã®ãµã€ãºãå€æŽã§ããŸãã ããã¯ãä»®æ³ã¡ã¢ãªã®ã¡ã¢ãªç®¡çã®æå°åäœã§ãã ä»®æ³ã¡ã¢ãªã¯äœãä¿åãããåã«ããã°ã©ã ã®ã¢ãã¬ã¹ç©ºéãšç©çã¡ã¢ãªã®å¯Ÿå¿ãèšå®ããŸãã
ããã»ã¹ã¯ä»®æ³ã¡ã¢ãªã¢ãã¬ã¹ã®ã¿ãåç §ããŸãã ããã°ã©ã ã§ããã«åçãªã¡ã¢ãªãå¿ èŠãªå ŽåïŒãã®ã¡ã¢ãªã¯ããŒãã¡ã¢ãªããŸãã¯ãããŒãããšãåŒã°ããŸãïŒãã©ããªããŸããïŒ åçã«å²ãåœãŠãããè¿œå ã¡ã¢ãªãã·ã¹ãã ããèŠæ±ãããåçŽãªã¢ã»ã³ãã©ã³ãŒãã®äŸã次ã«ç€ºããŸãã
_start: mov $12, %rax # brk mov $0, %rdi # 0 - , syscall b0: mov %rax, %rsi # rsi , mov %rax, %rdi # ... add $4, %rdi # .. 4 , mov $12, %rax # brk syscall
ãããå³ã®åœ¢åŒã§è¡šçŸããæ¹æ³ã次ã«ç€ºããŸãã
åçã«å²ãåœãŠãããã¡ã¢ãªãå¢ãã
ããã°ã©ã ã¯brkã·ã¹ãã ã³ãŒã«ïŒsbrk / mmapãªã©ïŒã䜿çšããŠè¿œå ã®ã¡ã¢ãªãèŠæ±ããŸãã ã«ãŒãã«ã¯ä»®æ³ã¡ã¢ãªã«é¢ããæ å ±ãæŽæ°ããŸãããç©çã¡ã¢ãªã«ã¯æ°ããããŒãžããŸã 衚瀺ãããŠããªããããä»®æ³ã¡ã¢ãªãšç©çã¡ã¢ãªã«ã¯éãããããŸãã
ã¡ã¢ãªã¢ãã±ãŒã¿ãŒ
äžè¬çã«ãä»®æ³ã¢ãã¬ã¹ç©ºéã®æäœã«ã€ããŠèª¬æããè¿œå ã®åçã¡ã¢ãªïŒããŒãäžã®ã¡ã¢ãªïŒãèŠæ±ããæ¹æ³ã«ã€ããŠèª¬æããåŸãã¡ã¢ãªãå²ãåœãŠãæ¹æ³ã«ã€ããŠèª¬æããæ¹ãç°¡åã«ãªããŸãã
ããŒãã«ã³ãŒãã®èŠæ±ãæºããã®ã«ååãªã¡ã¢ãªãããå Žåãã¡ã¢ãªã¢ãã±ãŒã¿ã¯ã«ãŒãã«ã«ã¢ã¯ã»ã¹ããã«ãããã®èŠæ±ãå®è¡ã§ããŸãã ãã以å€ã®å Žåã¯ã倧ããªã¡ã¢ãªãããã¯ãèŠæ±ããªãããã·ã¹ãã ã³ãŒã«ã䜿çšããŠïŒããšãã°brkã䜿çšããŠïŒããŒããµã€ãºãå¢ããå¿ èŠããããŸãã mallocã®å Žåãã倧ããšã¯ã
MMAP_THRESHOLD
ãã©ã¡ãŒã¿ãŒã§èšè¿°ããããµã€ãºãæå³ããããã©ã«ãã§ã¯128 Kbã§ãã
ãã ããã¡ã¢ãªã¢ãã±ãŒã¿ã«ã¯ãåã«ã¡ã¢ãªãå²ãåœãŠããããå€ãã®è²¬ä»»ããããŸãã 圌ã®æãéèŠãªè²¬ä»»ã®1ã€ã¯ãå éšããã³å€éšã¡ã¢ãªã®æçåãæžãããã¡ã¢ãªãããã¯ãã§ããã ãæ©ãå²ãåœãŠãããšã§ãã ããã°ã©ã ã
malloc(size)
圢åŒã®é¢æ°ã䜿çšããŠã¡ã¢ãªã®é£ç¶ãããã¯ãå²ãåœãŠãèŠæ±ãé£ç¶ããŠå®è¡ãããã®åŸããã®ã¡ã¢ãªã
free(pointer)
圢åŒã®é¢æ°ã䜿çšããŠè§£æŸããããšã
free(pointer)
ã
å€éšãã©ã°ã¡ã³ããŒã·ã§ã³ã®ãã¢
åã®å³ã§ã¯ãã¹ãããp4ã§ã空ããããã¯ã®åèšéã§èš±å®¹ãããŠããŸããããã®ãããª6ã€ã®ãããã¯ã®å²ãåœãŠèŠæ±ãæºããã®ã«ååãªé£ç¶ããã¡ã¢ãªãããã¯ããããŸããã ãã®ç¶æ³ã¯ãã¡ã¢ãªã®æçåã«ã€ãªãããŸãã
ã¡ã¢ãªã®æçåãæžããæ¹æ³ã¯ïŒ ãã®è³ªåã«å¯Ÿããçãã¯ãç¹å®ã®ã¡ã¢ãªå²ãåœãŠã¢ã«ãŽãªãºã ã«äŸåããŸãããã®ã¢ã«ãŽãªãºã ã§ã¯ãã¡ã¢ãªãæäœããããã«ã©ã®ããŒã¹ã©ã€ãã©ãªã䜿çšãããŸãã
次ã«ãGoã¡ã¢ãªå²ãåœãŠã¡ã«ããºã ã®ããŒã¹ãšãªãTCMallocã¡ã¢ãªå²ãåœãŠããŒã«ã«ã€ããŠèª¬æããŸãã
TCMalloc
TCMallocã¯ãã¡ã¢ãªãããã€ãã®ã¬ãã«ã«åå²ããŠãã¡ã¢ãªã®æçåãæžãããšããèãã«åºã¥ããŠããŸãã TCMallocå ã§ã¯ãã¡ã¢ãªç®¡çã¯2ã€ã®éšåã«åãããŠããŸããã¹ã¬ããã¡ã¢ãªã®æäœãšããŒãã®æäœã§ãã
âã¹ã¬ããã¡ã¢ãª
ã¡ã¢ãªã®åããŒãžã¯ããµã€ãºã¯ã©ã¹ã«åŸã£ãŠéžæãããç¹å®ã®ãµã€ãºã®ãã©ã°ã¡ã³ãã®ã·ãŒã±ã³ã¹ã«åå²ãããŸãã ããã«ãããæçåãæžå°ããŸãã ãã®çµæãåã¹ã¬ããã¯å°ããªãªããžã§ã¯ãçšã®ãã£ãã·ã¥ãèªç±ã«äœ¿çšã§ããããã32 Kb以äžã®ãªããžã§ã¯ãã«å¯ŸããŠéåžžã«å¹ççã«ã¡ã¢ãªãå²ãåœãŠãããšãã§ããŸãã
ã¹ããªãŒã ãã£ãã·ã¥
âæ¿
TCMallocãããŒãžããŒãã¯ãäžé£ã®ããŒãžãäžé£ã®ããŒãžïŒã¹ãã³ïŒãšããŠè¡šãããšãã§ããããŒãžã®ã³ã¬ã¯ã·ã§ã³ã§ãã 32 KBãè¶ ãããªããžã§ã¯ãã«ã¡ã¢ãªãå²ãåœãŠãå¿ èŠãããå ŽåãããŒãã䜿çšããŠã¡ã¢ãªãå²ãåœãŠãŸãã
ããŒããšããŒãžã®æäœ
ã¡ã¢ãªã«å°ããªãªããžã§ã¯ããé 眮ããã®ã«ååãªã¹ããŒã¹ããªãå Žåãã¡ã¢ãªã®ããŒãã«ãªããŸãã ããŒãã«ååãªç©ºãã¡ã¢ãªããªãå Žåãè¿œå ã®ã¡ã¢ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«èŠæ±ãããŸãã
ãã®çµæãæ瀺ãããã¡ã¢ãªæäœã¢ãã«ã¯ãŠãŒã¶ãŒç©ºéã®ã¡ã¢ãªããŒã«ããµããŒããããã®äœ¿çšã«ããã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã®å¹çãå€§å¹ ã«åäžããŸãã
Goã¡ã¢ãªå²ãåœãŠããŒã«ã¯ããšããšTCMallocã«åºã¥ããŠããŸãããããããšã¯å°ãç°ãªããŸãã
Goã¡ã¢ãªã¢ãã±ãŒã¿ãŒ
Goã©ã³ã¿ã€ã ã¯ãè«çããã»ããµã§ãŽã«ãŒãã³ãå®è¡ããããšãèšç»ããŠããŸãã åæ§ã«ãGoã§äœ¿çšãããTCMallocã®ããŒãžã§ã³ã¯ãã¡ã¢ãªããŒãžãã67åã®ãµã€ãºã¯ã©ã¹ã«å¯Ÿå¿ãããµã€ãºã®ãããã¯ã«åå²ããŸãã
Goã¹ã±ãžã¥ãŒã©ã«æ £ããŠããªãå Žåã¯ããã¡ãã§èªãããšãã§ããŸã ã
Goã¯ã©ã¹ãµã€ãº
Goã®æå°ããŒãžãµã€ãºã¯8192ãã€ãïŒ8 KbïŒã§ããããããã®ãããªããŒãžã1 Kbã®ãããã¯ã«åå²ããããšããã®ãããªãããã¯ã8ã€åŸãããŸãã
8 KBã®ããŒãžãµã€ãºã¯ã1 KBã®ã¯ã©ã¹ãµã€ãºã«å¯Ÿå¿ãããããã¯ã«åå²ãããŸãã
Goã®åæ§ã®ããŒãžã·ãŒã±ã³ã¹ã¯ãmspanãšåŒã°ããæ§é ã䜿çšããŠå¶åŸ¡ãããŸãã
msæ§é mspan
mspanæ§é ã¯ãäºéãªã³ã¯ãªã¹ããããŒãžã®éå§ã¢ãã¬ã¹ãããŒãžãµã€ãºã«é¢ããæ å ±ãããã³ããã«å«ãŸããããŒãžæ°ãå«ããªããžã§ã¯ãã§ãã
Mspanæ§é
âmcacheæ§é
TCMallocãšåæ§ã«ãGoã¯åè«çããã»ããµã«mcacheãšåŒã°ããããŒã«ã«ã¹ã¬ãããã£ãã·ã¥ãæäŸããŸãã ãã®çµæããŽã«ãŒãã³ãã¡ã¢ãªãå¿ èŠãšããå ŽåãmcacheããçŽæ¥ã¡ã¢ãªãååŸã§ããŸãã ãããè¡ãããã«ãããã¯ãå®è¡ããå¿ èŠã¯ãããŸããã1ã€ã®è«çããã»ããµã§å®è¡ããããŽã«ãŒãã³ã¯åžžã«1ã€ã ãã ããã§ãã
mcacheæ§é ã«ã¯ãããŸããŸãªãµã€ãºã®ã¯ã©ã¹ã®mspanæ§é ããã£ãã·ã¥åœ¢åŒã§å«ãŸããŠããŸãã
Goã®è«çããã»ããµãmcacheãmspanéã®çžäºäœçš
åè«çããã»ããµã«ã¯ç¬èªã®mcacheããããããmcacheããã¡ã¢ãªãå²ãåœãŠããšãã«ããã¯ããå¿ èŠã¯ãããŸããã
åãµã€ãºã¯ã©ã¹ã¯ã次ã®ãªããžã§ã¯ãã®ããããã§è¡šãããšãã§ããŸãã
- ã¹ãã£ã³ãªããžã§ã¯ãã¯ããã€ã³ã¿ãŒãå«ããªããžã§ã¯ãã§ãã
- noscanãªããžã§ã¯ãã¯ããã€ã³ã¿ãŒã®ãªããªããžã§ã¯ãã§ãã
ãã®ã¢ãããŒãã®é·æã®1ã€ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå®è¡ããããšãã«ãã¡ã¢ãªãå²ãåœãŠãããŠãããªããžã§ã¯ããå«ãŸããŠããªããããnoscanãªããžã§ã¯ããèµ°æ»ããå¿ èŠããªãããšã§ãã
mcacheã«ã¯äœãå ¥ããŸããïŒ ãµã€ãºã32 KBãè¶ ããªããªããžã§ã¯ãã¯ã察å¿ãããµã€ãºã¯ã©ã¹ã®mspanã䜿çšããŠmcacheã«çŽæ¥ç§»åããŸãã
mcacheã«ç©ºãã»ã«ããªãå Žåã¯ã©ããªããŸããïŒ æ¬¡ã«ãmcentralãšããmspanãªããžã§ã¯ãã®ãªã¹ãããç®çã®ãµã€ãºã¯ã©ã¹ã®æ°ããmspanãååŸããŸãã
âäžå€®æ§é
mcentralæ§é ã¯ãç¹å®ã®ãµã€ãºã¯ã©ã¹ã®ãã¹ãŠã®ããŒãžç¯å²ãåéããŸãã åmcentralãªããžã§ã¯ãã«ã¯ãmspanãªããžã§ã¯ãã®2ã€ã®ãªã¹ããå«ãŸããŠããŸãã
- 空ããªããžã§ã¯ãããªãmspanãªããžã§ã¯ãããŸãã¯mcacheã«ããmspanãªããžã§ã¯ãã®ãªã¹ãã
- 空ããªããžã§ã¯ããæã€mspanãªããžã§ã¯ãã®ãªã¹ãã
Mcentralæ§é
åmcentralæ§é ã¯ãmheapæ§é å ã«ååšããŸãã
âããŒãæ§é
mheapæ§é ã¯ãGoã®ããŒã管çãåŠçãããªããžã§ã¯ãã«ãã£ãŠè¡šãããŸãã ä»®æ³ã¢ãã¬ã¹ç©ºéãææããã°ããŒãã«ãªããžã§ã¯ãã¯1ã€ã ãã§ãã
ããŒãæ§é
äžã®å³ãããããããã«ãmheapæ§é ã«ã¯mcentralæ§é ã®é åãå«ãŸããŠããŸãã ãã®é åã«ã¯ããã¹ãŠã®ãµã€ãºã¯ã©ã¹ã®mcentralæ§é ãå«ãŸããŠããŸãã
central [numSpanClasses]struct { mcentral mcentral pad [sys.CacheLineSize unsafe.Sizeof(mcentral{})%sys.CacheLineSize]byte }
åãµã€ãºã¯ã©ã¹ã«mcentralæ§é ããããããmcacheãmcentralããmspanæ§é ãèŠæ±ãããšãåã ã®mcentralã¬ãã«ã§ããã¯ãé©çšãããŸãããã®çµæãä»ã®ãµã€ãºã®mspanæ§é ãèŠæ±ããä»ã®mcacheããã®èŠæ±ãåæã«åŠçã§ããŸãã
äœçœ®åããïŒãããïŒã«ãããmcentralæ§é äœã
CacheLineSize
å€ã«å¯Ÿå¿ãããã€ãæ°ã ãäºãã«åé¢ãããŸãã ãã®çµæãå
mcentral.lock
ã¯ç¬èªã®ãã£ãã·ã¥ã©ã€ã³ãããã誀ã£ãã¡ã¢ãªå ±æã«é¢é£ããåé¡ãåé¿ããŸãã
mcentralãªã¹ãã空ã®å Žåã¯ã©ããªããŸããïŒ æ¬¡ã«ãmcentralã¯ãmheapããäžé£ã®ããŒãžãåãåããå¿ èŠãªãµã€ãºã¯ã©ã¹ã®ã¡ã¢ãªãã©ã°ã¡ã³ããå²ãåœãŠãŸãã
-
free[_MaxMHeapList]mSpanList
ã¯spanListé åã§ãã åspanListã®mspanæ§é ã¯ã1ã127ïŒ_MaxMHeapList-1ïŒããŒãžã§æ§æãããŠããŸãã ããšãã°ãfree [3]ã¯ã3ããŒãžãå«ãmspanæ§é ã®ãªã³ã¯ãªã¹ãã§ãã ãã®å Žåã®ã空ãããšããèšèã¯ãã¡ã¢ãªãå²ãåœãŠãããŠããªã空ã®ãªã¹ãã«ã€ããŠè©±ããŠããããšã瀺ããŠããŸãã ãªã¹ãã¯ã空ã§ã¯ãªããã¡ã¢ãªãå²ãåœãŠãããïŒããžãŒãªïŒãªã¹ãã§ãã -
freelarge mSpanList
ã¯ã空ãmspanæ§é ã®ãªã¹ãã§ãã èŠçŽ ããšã®ããŒãžæ°ïŒmspanïŒã¯127ãè¶ ããŠããŸãããã®ãªã¹ãããµããŒãããããã«ãmtreapããŒã¿æ§é ã䜿çšãããŸãã 䜿çšäžã®mspanæ§é ã®ãªã¹ãã¯ãbusylargeãšåŒã°ããŸãã
32 Kbãè¶ ãããªããžã§ã¯ãã¯ã©ãŒãžãªããžã§ã¯ããšèŠãªããããããã®ã¡ã¢ãªã¯mheapããçŽæ¥å²ãåœãŠãããŸãã ãã®ãããªãªããžã§ã¯ãã«ã¡ã¢ãªãå²ãåœãŠãèŠæ±ã¯ãããã¯ã䜿çšããŠå®è¡ãããŸãããã®çµæãç¹å®ã®æç¹ã§ã1ã€ã®è«çããã»ããµã®ã¿ããåæ§ã®èŠæ±ãåŠçã§ããŸãã
ãªããžã§ã¯ãã«ã¡ã¢ãªãå²ãåœãŠãããã»ã¹
- ãªããžã§ã¯ãã®ãµã€ãºã32 Kbãè¶ ããå Žåãããã¯å€§ãããšèŠãªããããã®ã¡ã¢ãªã¯mheapããçŽæ¥å²ãåœãŠãããŸãã
- ãªããžã§ã¯ãã®ãµã€ãºã16 Kbæªæºã®å Žåãtiny allocatorãšåŒã°ããmcacheã¡ã«ããºã ã䜿çšãããŸãã
- ãªããžã§ã¯ãã®ãµã€ãºã16ã32 Kbã®å Žåã䜿çšãããµã€ãºã¯ã©ã¹ïŒsizeClassïŒãå€æããé©åãªãããã¯ãmcacheã«å²ãåœãŠãããŸãã
- mcacheã«å¯Ÿå¿ããsizeClassã§äœ¿çšå¯èœãªãããã¯ããªãå ŽåãmcentralãåŒã³åºãããŸãã
- mcentralã«ç©ºããããã¯ããªãå ŽåãmheapãåŒã³åºããŠæãé©åãªmspanãæ€çŽ¢ããŸãã ã¢ããªã±ãŒã·ã§ã³ãå¿ èŠãšããã¡ã¢ãªãµã€ãºãå²ãåœãŠå¯èœãªãµã€ãºããã倧ããå ŽåãèŠæ±ãããã¡ã¢ãªãµã€ãºãåŠçããããããããã°ã©ã ã§å¿ èŠãªæ°ã®ããŒãžãè¿ãããšãã§ããæ°ããmspanæ§é ã圢æãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ä»®æ³ã¡ã¢ãªããŸã ååã§ãªãå Žåããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯æ°ããããŒãžã»ããã«ã¢ã¯ã»ã¹ãããŸãïŒå°ãªããšã1 MBã®ã¡ã¢ãªãèŠæ±ãããŸãïŒã
å®éããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¬ãã«ã§ã¯ãGoã¯ã¢ãªãŒããšåŒã°ããããã«å€§ããªã¡ã¢ãªã®å²ãåœãŠãèŠæ±ããŸãã ã¡ã¢ãªã®å€§ããªãã©ã°ã¡ã³ããåæã«å²ãåœãŠããšãã¢ããªã±ãŒã·ã§ã³ã«å²ãåœãŠãããã¡ã¢ãªã®éãšãããã©ãŒãã³ã¹ã«é¢ããŠãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãžã®ã³ã¹ãã®ãããã¢ã¯ã»ã¹ãšã®åŠ¥åç¹ãèŠã€ããããšãã§ããŸãã
ããŒãã§èŠæ±ãããã¡ã¢ãªã¯ãã¢ãªãŒãããå²ãåœãŠãããŸãã ãã®ã¡ã«ããºã ãæ€èšããŠãã ããã
ä»®æ³ã¡ã¢ãªãè¡ã
Goã§æžãããç°¡åãªããã°ã©ã ã§ã¡ã¢ãªäœ¿çšéãèŠãŠã¿ãŸãããã
func main() { for {} }
ããã°ã©ã ããã»ã¹æ å ±
ãã®ãããªåçŽãªããã°ã©ã ã®ä»®æ³ã¢ãã¬ã¹ç©ºéãçŽ100 MBã§ãããRSSã€ã³ããã¯ã¹ã¯ããã696 KBã§ãã ãŸãããã®äžäžèŽã®çç±ã調ã¹ãŠã¿ãŸãããã
ãããããã³ã¹ãããæ å ±
ããã§ã¯ããµã€ãºãçŽ2 MBã64 MBã32 MBã®ã¡ã¢ãªé åã確èªã§ããŸãã ããã¯ã©ããªèšæ¶ã§ããïŒ
reneã¢ã¬ãŒã³
Goã®ä»®æ³ã¡ã¢ãªã¯ãäžé£ã®ã¢ãªãŒãã§æ§æãããŠããããšãããããŸãã ããŒãã®å ã®ã¡ã¢ãªãµã€ãºã¯1ã€ã®ã¢ãªãŒãã«å¯Ÿå¿ããŸããã€ãŸãã64 MBã§ãïŒããã¯Go 1.11.5ã«é¢é£ããŸãïŒã
ããŸããŸãªã·ã¹ãã ã®çŸåšã®ã¢ãªãŒããµã€ãº
ãã®çµæãããã°ã©ã ã®çŸåšã®ããŒãºã«å¿ èŠãªã¡ã¢ãªãå°ããªéšåã«å²ãåœãŠãããŸãã ãã®ããã»ã¹ã¯ã1ã€ã®64 MBã¢ãªãŒãããå§ãŸããŸãã
ããã§èª¬æããŠããæ°å€ã€ã³ãžã±ãŒã¿ã¯ã絶察å€ãå€æŽãããŠããªãå€ã«ã€ããŠã¯äœ¿çšããªãã§ãã ããã 圌ãã¯å€ããããšãã§ããŸãã 以åãããšãã°ãGoã¯äºåã«é£ç¶ä»®æ³ã¹ããŒã¹ãäºçŽããŠããŸããã64ãããã·ã¹ãã ã§ã¯ãã¢ãªãŒããµã€ãºã¯512 GBã§ããïŒå®éã®ã¡ã¢ãªèŠä»¶ãéåžžã«å€§ããã察å¿ãããªã¯ãšã¹ããmmapã«ãã£ãŠæåŠããããšã©ããªãããèããã®ã¯èå³æ·±ãã§ããïŒã
å®éã®ãšãããã¢ãªãŒãã®æãæãšåŒã³ãŸãã Goã§ã¯ãã¢ãªãŒãã¯ã¡ã¢ãªã®æçãšããŠèªèããããµã€ãºã8192ãã€ãïŒ8 KbïŒã®ãããã¯ã«åå²ãããŸãã
1ã€ã®64 MBã¢ãªãŒã
Goã«ã¯ããã«2ã€ã®ã¿ã€ãã®ãããã¯ïŒã¹ãã³ãšããããããïŒããããŸãã ãããã®ã¡ã¢ãªã¯ããŒãå€ã«å²ãåœãŠãããã¢ãªãŒãã¡ã¿ããŒã¿ãä¿åããŸãã ãããã¯äž»ã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã§äœ¿çšãããŸãã
Goã§ã®ã¡ã¢ãªå²ãåœãŠã¡ã«ããºã ã®äžè¬çãªæŠèŠã次ã«ç€ºããŸãã
Goã®ã¡ã¢ãªå²ãåœãŠã¡ã«ããºã ã®æŠèŠ
ãŸãšã
äžè¬ã«ããã®è³æã§ã¯Goã¡ã¢ãªãæäœããããã®ãµãã·ã¹ãã ãéåžžã«äžè¬çãªçšèªã§èª¬æããããšã«æ³šæã§ããŸãã Goã®ã¡ã¢ãªãµãã·ã¹ãã ã®äž»ãªã¢ã€ãã¢ã¯ãããŸããŸãªã¬ãã«ã®ããŸããŸãªæ§é ãšãã£ãã·ã¥ã䜿çšããŠã¡ã¢ãªãå²ãåœãŠãããšã§ãã ããã«ã¯ãã¡ã¢ãªãå²ãåœãŠããããªããžã§ã¯ãã®ãµã€ãºãèæ ®ãããŸãã
ãã«ãã¬ãã«æ§é ã®åœ¢åŒã§ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããåä¿¡ããé£ç¶ããã¡ã¢ãªã¢ãã¬ã¹ã®åäžãããã¯ã®è¡šçŸã¯ããã®ã¢ãããŒããããããã³ã°ãåé¿ãããšããäºå®ã«ãããã¡ã¢ãªå²ãåœãŠã¡ã«ããºã ã®å¹çãåäžãããŸãã ã¡ã¢ãªã«æ ŒçŽããå¿ èŠããããªããžã§ã¯ãã®ãµã€ãºãèæ ®ãããªãœãŒã¹ã®å²ãåœãŠã«ãããæçåã軜æžãããã¡ã¢ãªã解æŸããåŸãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãé«éåã§ããŸãã
芪æãªãèªè ïŒ Goã§æžãããããã°ã©ã ã®ã¡ã¢ãªã®èª€åäœãåå ã§åé¡ãçºçããŸãããïŒ