ä»ã®å€ãã®èª¿æ»ãšåæ§ã«ããã¹ãŠã¯
ãã°ã¬ããŒãããå§ãŸããŸããã
ã¬ããŒãã®ååã¯éåžžã«ã·ã³ãã«ã§ããïŒãHTTPã«æ¥ç¶ãããšããiter_contentã¯ãã£ãããšå€§ããªãã£ã³ã¯ã§æ©èœããŸããã é¡äŒŒã®ååã«ã¯ã2ã€ã®çç±ã§é ã®äžã«ãµã€ã¬ã³ãããã«å«ãŸããŠããŸããã ãŸããããã§ãé
ããã®æå³ãå€æããã®ã¯ããªãå°é£ã§ãã ãªããŠé
ã ã倧ããªãµã€ãºãã¯ã©ã®ãããã§ããïŒ ç¬¬äºã«ãèšè¿°ããããã®ãæ¬åœã«çå£ã«æããã«ãããå Žåãæã
ã¯ãã§ã«ãããç¥ã£ãŠããã§ãããã
iter_content
ã¡ãœããã¯é·ãé䜿çšãããŠ
iter_content
ãäžè¬ãŠãŒã¶ãŒã¢ãŒãã§å€§å¹
ã«é床ãäœäžããå Žåããã®ãããªæ
å ±ã¯æž¡ãããŸããã§ããã
ç§ã¯ããã«ã¬ããŒãã«ç®ãéããŸããã èè
ã¯ããã€ãã®è©³çŽ°ãæäŸããŸãããããããæžããŠããŸãïŒãããã¯100ïŒ
ã®ããã»ããµè² è·ã«ã€ãªããããããã¯ãŒã¯åž¯åå¹
ã1 Mb / sæªæºã«æžãããŸããã ãããã§ããªãã®ã§ãç§ã¯ãã®ãã¬ãŒãºãã€ãã¿ãŸããã æå°éã®åŠçã§ç°¡åãªããŠã³ããŒããé
ããªãããšã¯ãããŸããïŒ
ãã ããæåŠåã®ãã°ã®å ±åã¯ãã¹ãŠèª¿æ»ã«å€ããŸãã ã¬ããŒãã®äœæè
ãšè©±ãããŠããã°ã®å
åã®ã·ããªãªã埩å
ããããšãã§ããŸããïŒPyOpenSSLã§ãªã¯ãšã¹ãã䜿çšãã次ã®ã³ãŒããå®è¡ãããšãããã»ããµãå®å
šã«ããŒãããããããã¯ãŒã¯åž¯åå¹
ãæå°ã«äœäžããŸãã
import requests https = requests.get("https://az792536.vo.msecnd.net/vms/VMBuild_20161102/VirtualBox/MSEdge/MSEdge.Win10_preview.VirtualBox.zip", stream=True) for content in https.iter_content(100 * 2 ** 20):
ããã¯ããªã¯ãšã¹ãã¹ã¿ãã¯ãæ確ã«æããŠããããã
éåžžã«åçŸæ§ã®
é«ãã¹ã¯ãªããã§ãã ãŠãŒã¶ãŒãæå®ããã³ãŒãã¯ããã§ã¯å®è¡ãããŸããããªã¯ãšã¹ãã©ã€ãã©ãªã®äžéšãŸãã¯ãã®äŸåé¢ä¿ã®1ã€ã§ãã ãã®ãŠãŒã¶ãŒãæããªäœããã©ãŒãã³ã¹ã³ãŒããæžããå¯èœæ§ã¯äœãã§ãã æ¬åœã®ãã£ã¯ã·ã§ã³ã ãããªãã¯URLã®äœ¿çšã¯ããã«çŽ æŽãããã§ãã
ã¹ã¯ãªãããå®è¡ã§ããŸãã ïŒ ãããŠããããè¡ã£ãåŸããã°ã«ééããŸããã å®è¡ããšã«ã
å¥ã®çŽ æµãªè©³çŽ°ããããŸããïŒ
10 MBã§ã¯ãããã»ããµã®è² è·ããããã«å¢å ããããšããã¹ã«ãŒãããã«åœ±é¿ããããšããããŸããã 1 GBã§ã¯ã100 MBã®å Žåã®ããã«ããã»ããµã«100ïŒ
ã®è² è·ãããããŸãããã¹ã«ãŒãããã¯100 MBã§1 Mb / sãšã¯å¯Ÿç
§çã«100 Kb / sæªæºã«äœäžããŸãã
ããã¯éåžžã«èå³æ·±ãç¹ã§ãããã£ã³ã¯ãµã€ãºã®
ãªãã©ã«å€ãã¯ãŒã¯ããŒãã«åœ±é¿ããããšã瀺åããŠã
ãŸã ã ããã¯PyOpenSSLã䜿çšããŠããå Žåã«ã®ã¿çºçããããšãããã³ã»ãšãã©ã®å Žåã¹ã¿ãã¯ãäžèšã®ã³ãŒããåŠçããããšãèæ
®ãããšãåé¡ãæããã«ãªããŸãã
File "/home/user/.local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1299, in recv buf = _ffi.new("char[]", bufsiz)
調æ»ã®çµæãFFI.newã«é¢ãã
FFI.new
æšæºçãªåäœã¯ã
ãŒãåãããã¡ã¢ãªãè¿ãããšã§ãã ããã¯ãå²ãåœãŠãããã¡ã¢ãªã®ãµã€ãºã«å¿ããŠåé·æ§ãçŽç·çã«å¢å ããããšãæå³ããŸããããã倧ããªããªã¥ãŒã ã¯ããŒãã«é·ããªã»ããããå¿
èŠããããŸããã ãããã£ãŠã倧èŠæš¡ãªããªã¥ãŒã ã®å²ãåœãŠã«äžé©åãªåäœãé¢é£ä»ããããŸãã ãããã®ãããã¡ãŒã®ãŒãåãç¡å¹ã«ããCFFIã®æ©èœãå©çšããŠãåé¡ã¯ãªããªããŸãã
1 ã 解決ããŸããããïŒ
ééã£ãã
æ¬åœã®ãã°
åè«ã¯å¥ãšããŠãããã§åé¡ãæ¬åœã«è§£æ±ºã§ããŸããã ããããæ°æ¥åŸã圌ãã¯ç§ã«éåžžã«ææ
®æ·±ã質åãããŸããã
ãªãèšæ¶ã掻çºã«ãªã»ãããããã®ã§ããïŒ åé¡ã®æ¬è³ªãç解ããããã«ãPOSIXã·ã¹ãã ã§ã®ã¡ã¢ãªå²ãåœãŠã«ã€ããŠèª¬æããŸãã
mallocãšcallocãšvmallocãããïŒ
å€ãã®ããã°ã©ãã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã¡ã¢ãªãèŠæ±ããæšæºçãªæ¹æ³ãç¥ã£ãŠããŸãã æšæºCã©ã€ãã©ãªã®
malloc
é¢æ°ããã®ã¡ã«ããºã ã«é¢äžããŠããŸãïŒæåæ€çŽ¢ã§
man 3 malloc
ãšå
¥åããããšã«ãããOSã®ããã¥ã¡ã³ããèªãããšãã§ããŸãïŒã ãã®é¢æ°ã¯ã1ã€ã®åŒæ°-å²ãåœãŠãã¡ã¢ãªã®ãã€ãæ°ãåããŸãã æšæºCã©ã€ãã©ãªã¯ãããã€ãã®ç°ãªãæ¹æ³ã®ããããã䜿çšããŠã¡ã¢ãªãå²ãåœãŠãŸãããäœããã®æ¹æ³ã§ã
å°ãªããšãèŠæ±ããéãš
åã倧ããã®ã¡ã¢ãªã»ã¯ã·ã§ã³ãžã®ãã€ã³ã¿ãè¿ããŸãã
ããã©ã«ãã§ã¯ã
malloc
ã¯
åæåãããŠããªãã¡ã¢ãªãè¿ã
ãŸã ã ã€ãŸããæšæºã®Cã©ã€ãã©ãªã¯ã
æ¢ã«ããããŒã¿ãå€æŽããããšãªããããªã¥ãŒã ãå²ãåœãŠãŠããã«ããã°ã©ã ã«æž¡ããŸãã ã€ãŸãã
malloc
ã䜿çšãã
malloc
ãããã°ã©ã ã¯æ¢ã«ããŒã¿ãæžã蟌ãã ãããã¡ãŒãè¿ããŸãã ããã¯ãCãªã©ã®ã¡ã¢ãªã«å®å
šã§ãªãèšèªã®ãã°ã®äžè¬çãªåå ã§ããäžè¬çã«ãåæåãããŠããªãã¡ã¢ãªããã®èªã¿åãã¯éåžžã«å±éºã§ãã
ãã ãã
malloc
ã¯ãããã¥ã¢ã«ã®åãããŒãžã«èšèŒãããŠããå人
calloc
ãŸãã äž»ãªéãã¯ãã«ãŠã³ã¿ãŒãšãµã€ãºã®
2ã€ã®åŒæ°ã䜿çšããããšã§ãã
malloc
ã䜿çšããŠãæšæºCã©ã€ãã©ãªãèŠæ±ããŸãïŒãå°ãªããšã
n
ãã€ããå²ãåœãŠãŠãã ãããã ãããŠ
calloc
ãåŒã³åºããšã
calloc
圌女ã«å°ããŸãïŒããµã€ãº
m
ãã€ãã®
n
ãªããžã§ã¯ãã«ååãªã¡ã¢ãªãå²ãåœãŠãŠãã ãããã æããã«ã
calloc
ãåŒã³åºã
äž»ãªç®çã¯ããªããžã§ã¯ãé
åã«ããŒããå®å
šã«å²ãåœãŠãããšã§ãã
2 ã
ãã ãã
calloc
ã¯ãã¡ã¢ãªã«é
åãé
眮ãããšããæ¬æ¥ã®ç®çã«é¢é£ããå¯äœçšããããŸãã ããã¯ããã¥ã¢ã«ã§éåžžã«æ§ããã«èšåãããŠããŸãã
å²ãåœãŠãããã¡ã¢ãªã¯ãŒããã€ãã§åããããŸãã
ããã¯ã
calloc
å®å
ãšé£åããŸãã ããšãã°ãå€ã®é
åãã¡ã¢ãªã«é
眮ããå Žåãå€ãã®å Žåãåæç¶æ
ãåæç¶æ
ã«ãããšéåžžã«äŸ¿å©ã§ãã äžéšã®ææ°ã®ã¡ã¢ãªã»ãŒãèšèªã§ã¯ãããã¯æ¢ã«é
åãšæ§é ãäœæããéã®æšæºçãªåäœã«ãªã£ãŠããŸãã Goã§æ§é ãåæåãããšãããã©ã«ãã§ã¯ããã¹ãŠã®ã¡ã³ããŒãããããããŒããå€ã«åæžãããŸããããã¯ããã¹ãŠããŒãã«ãªã»ãããããå Žåã®å€ãã«çžåœããŸãã ããã¯ããã¹ãŠã®Goæ§é ã
calloc
3ã䜿çšããŠã¡ã¢ãªå
ã«é
眮ããããšããçŽæãšèŠãªãããšãã§ããŸãã
ãã®åäœã¯ã
malloc
ãåæåãããŠããªãã¡ã¢ãªãè¿ãã
calloc
ãåæåãããã¡ã¢ãªãè¿ãããšãæå³ããŸãã ãããããªãããããŠäžèšã®å³ããçŽæã«ç
§ãããŠããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯å²ãåœãŠãããã¡ã¢ãªãæé©åã§ããŸãã å®éãå€ãã®ææ°ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããããè¡ã£ãŠããŸãã
ã«ããã¯ã䜿çš
ãã¡ããã
calloc
ãå®è£
ããæãç°¡åãªæ¹æ³ã¯ã次ã®ãããªèšè¿°ã§ãã
void *calloc(size_t count, size_t size) { assert(!multiplication_would_overflow(count, size)); size_t allocation_size = count * size; void *allocation = malloc(allocation_size); memset(allocation, 0, allocation_size); return allocation; }
ãã®ãããªé¢æ°ã®ã³ã¹ãã¯ãå²ãåœãŠãããã¡ã¢ãªã®ãµã€ãºã«å¯ŸããŠã»ãŒç·åœ¢ã«å€åããŸãããã€ããå€ãã»ã©ããã¹ãŠããªã»ããããã®ã«è²»çšãããããŸãã çŸåšãã»ãšãã©ã®OSã«ã¯ãå®éã«
memset
æé©åããããã¹ãèšè¿°
ãããæšæºCã©ã€ãã©ãªãå«ãŸ
ããŠããŸãïŒéåžžãç¹å¥ãªããã»ããµãã¯ãã«åœä»€ã䜿çšããã1ã€ã®åœä»€ã§äžåºŠã«å€æ°ã®ãã€ãããªã»ããã§ããŸãïŒã ãã ãããã®æé ã®ã³ã¹ãã¯çŽç·çã«ç°ãªããŸãã
倧éã®ããªã¥ãŒã ãå²ãåœãŠãããã«ãOSã¯ä»®æ³ã¡ã¢ãªã«é¢é£ããå¥ã®ããªãã¯ã䜿çšããŸãã
ä»®æ³ã¡ã¢ãª
ããã§ã¯ãä»®æ³ã¡ã¢ãªã®æ§é ãšåäœå
šäœãåæããŸããããããã«ã€ããŠèªãããšã匷ããå§ãããŸãïŒãã®ãããã¯ã¯éåžžã«èå³æ·±ãã§ãïŒïŒã èŠããã«ãä»®æ³ã¡ã¢ãªã¯ãå©çšå¯èœãªã¡ã¢ãªã«é¢ããããã»ã¹ã«å¯ŸããOSã«ãŒãã«ã®åã§ãã å®è¡ãããåããã»ã¹ã¯ã圌ãšåœŒã ãã«å±ããã¡ã¢ãªã®ç¬èªã®ã¢ã€ãã¢ãæã£ãŠããŸãã ãã®ãã¥ãŒã¯ãç©çã¡ã¢ãªã«éæ¥çã«ããããããŸãã
ãã®çµæãOSã¯ããããçš®é¡ã®ããªãããŒãªããªãã¯ãã¹ã¯ããŒã«ã§ããŸãã ã»ãšãã©ã®å Žåãã¡ã¢ãªã«è¡šç€ºãããç¹æ®ãã¡ã€ã«ïŒã¡ã¢ãªããããã¡ã€ã«ïŒãæäŸããŸãã ãããã¯ãã¡ã¢ãªã®å
容ããã£ã¹ã¯ã«ããŠã³ããŒãããããã¡ã¢ãªå
ã®ã¡ã¢ãªã衚瀺ãããããããã«äœ¿çšãããŸãã åŸè
ã®å Žåãããã°ã©ã ã¯OSã«æ¬¡ã®ããã«å°ããŸãããnãã€ãã®ã¡ã¢ãªãå²ãåœãŠãŠããã£ã¹ã¯äžã®ãã¡ã€ã«ã«ä¿åããŠãã ãããã¡ã¢ãªã«æžã蟌ããšãã«ãã¹ãŠã®æžã蟌ã¿ããã®ãã¡ã€ã«ã«è¡ãããã¡ã¢ãªããèªã¿åããšãã«ããŒã¿ãããããèªã¿åãããã§ããããã
ã«ãŒãã«ã¬ãã«ã§ã¯ã次ã®ããã«æ©èœããŸããããã»ã¹ããã®ãããªã¡ã¢ãªããèªã¿åãããšãããšãããã»ããµã¯ã¡ã¢ãªãååšããªãããšãéç¥ããããã»ã¹ãäžæåæ¢ãããããŒãžãã©ãŒã«ãããã¹ããŒããŸãã ã«ãŒãã«
ã¯ãå®éã®ããŒã¿ãã¡ã¢ãªã«å
¥ããŠãã¢ããªã±ãŒã·ã§ã³ãèªã¿åããããã«ããŸãã ãã®åŸãããã»ã¹ãäžæåæ¢ãããéæ³ã®ããã«è¡šç€ºãããããŒã¿ãé©åãªå Žæã§æ€åºãããŸãã ããã»ã¹ã®èŠ³ç¹ããèŠããšããã¹ãŠãäžæåæ¢ããããšãªãå³åº§ã«çºçããŸããã
ãã®ã¡ã«ããºã ã䜿çšããŠãä»ã®åŸ®åŠãªããªãã¯ãå®è¡ã§ããŸãã ãã®1ã€ã¯ãéåžžã«å€§éã®ã¡ã¢ãªã®ãç¡æãå²ãåœãŠã§ãã ãŸãã¯ãããæ£ç¢ºã«ã¯ã
å²ãåœãŠããããµã€ãºã§ã¯ãªãããã®ã¡ã¢ãªã®
䜿çšåºŠã«æ¯äŸããå€ãäœæããŸã
ãæŽå²çã«ãå®è¡æã«ãŸãšããªã¡ã¢ãªãã£ã³ã¯ãå¿
èŠãšããå€ãã®ããã°ã©ã ã¯ãèµ·åæã«
倧ããªãããã¡ãäœæããã©ã€ããµã€ã¯ã«äžã«ããã°ã©ã å
ã§å²ãåœãŠãããšãã§ããŸãã ããã¯ãããã°ã©ã ãä»®æ³ã¡ã¢ãªã䜿çšããªãç°å¢åãã«äœæãããããã§ãã ããã°ã©ã ã¯ããã«ããçšåºŠã®ã¡ã¢ãªã䜿çšããå¿
èŠããã£ããããåŸã§ã¡ã¢ãªãäžè¶³ããããšã¯ãããŸããã§ããã ããããä»®æ³ã¡ã¢ãªã®å°å
¥åŸããã®åäœã¯äžèŠã«ãªããŸãããåããã°ã©ã ã¯ãä»ã®ããã°ã©ã ããå£ãç Žãããšãªããå¿
èŠãªã ãã®ã¡ã¢ãªãå²ãåœãŠãããšãã§ããŸã
4 ã
ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«éåžžã«é«ãã³ã¹ããåé¿ããããã«ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ã¢ããªã±ãŒã·ã§ã³ã«æšªãããå§ããŸããã ã»ãšãã©ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¯ã1åã®åŒã³åºãã§128 KB以äžãå²ãåœãŠãããšãããšãæšæºCã©ã€ãã©ãªã¯ãèŠæ±ãããããªã¥ãŒã ãã«ããŒããå®å
šã«æ°ããä»®æ³ã¡ã¢ãªããŒãžãOSã«çŽæ¥èŠæ±ããŸãã ããããäž»ãªããšïŒãã®ãããª
éžæã«ã¯ã»ãšãã©è²»çšãããããŸãã ã çµå±ã®ãšãããå®éã«ã¯ãOSã¯äœãããŸãããä»®æ³ã¡ã¢ãªã¹ããŒã ãåæ§æããã ãã§ãã ãããã£ãŠã
malloc
ã䜿çšããå Žå
malloc
ã³ã¹ãã¯æ²æšã§ãã
ã¡ã¢ãªã¯ããã»ã¹ã«ãå²ãåœãŠãããããã®ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ãå®éã«äœ¿çšããããšãããšããã«ãã¡ã¢ãªããŒãžã§ãšã©ãŒãçºçããŸãã ããã§ã¯ãã¡ã¢ãªãšã©ãŒãããããããã¡ã¢ãªãã¡ã€ã«ã®å Žåãšåæ§ã«ãOSãä»å
¥ããç®çã®ããŒãžãèŠã€ããŠãããã»ã¹ãã¢ã¯ã»ã¹ããŠããå Žæã«é
眮ããŸãã å¯äžã®éãã¯ãä»®æ³ã¡ã¢ãªããã¡ã€ã«ã§ã¯ãªãç©çã¡ã¢ãªã«ãã£ãŠæäŸãããããšã§ãã
ãã®çµæã
malloc(1024 * 1024 * 1024)
ãåŒã³åºããŠ1 GBã®ã¡ã¢ãªãå²ãåœãŠããšãå®éã«ã¯ã¡ã¢ãªãããã»ã¹ã«å²ãåœãŠãããªããããããã¯ã»ãŒç¬æã«çºçããŸãã ããããããã°ã©ã ã¯ç¬æã«å€ãã®ã®ã¬ãã€ãããå²ãåœãŠããããšãã§ããŸãããå®éã«ã¯ããã¯ããã«ã¯èµ·ãããŸããã
ããããããã«é©ãã¹ãããšã¯ãåãæé©åã
calloc
ã§å©çšã§ããããšã§ãã OSã¯ãããããããŒãããŒãžãã«ãŸã£ããæ°ããããŒãžã衚瀺ã§ããŸããããã¯èªã¿åãå°çšã®ã¡ã¢ãªããŒãžã§ããããããããŒãã®ã¿ãèªã¿åãããŸãã åœåããã®ãããã³ã°ã¯ã³ããŒãªã³ã©ã€ãã§ããããã»ã¹ããã®æ°ããã¡ã¢ãªã«ããŒã¿ãæžã蟌ãããšãããšãã«ãŒãã«ãä»å
¥ãããã¹ãŠã®ãŒããæ°ããããŒãžã«ã³ããŒããŠãããæžã蟌ã¿ãèš±å¯ããŸãã
OSåŽã®ãã®ããªãã¯ã®ãããã§ã
calloc
ã¯ã倧ããªããªã¥ãŒã ãå²ãåœãŠããšãã«
malloc
ãšåãããšãå®è¡ããŠãä»®æ³ã¡ã¢ãªã®æ°ããããŒãžãèŠæ±ã§ããŸãã ããã¯ãã¡ã¢ãªã®äœ¿çšãéå§ããããŸã§ç¡æã§çºçããŸãã ãã®ãããªæé©åã¯ã
calloc(1024 * 1024 * 1024, 1)
ãã¡ã¢ãªããŒãã§åããããšãçŽæãããšããäºå®ã«ããããããã
calloc(1024 * 1024 * 1024, 1)
ã®ã³ã¹ã
calloc(1024 * 1024 * 1024, 1)
ãåãéã®ã¡ã¢ãªã«å¯ŸããŠ
malloc
ãåŒã³åºãããšã«çããããšãæå³ããŸãã è³¢ãïŒ
ãã°ã«æ»ã
CFFIã
calloc
䜿çšããå Žåãã¡ã¢ãªããªã»ãããããã®ã¯ãªãã§ããïŒ
ã¯ããã«ïŒ
calloc
åžžã«äœ¿çšãã
calloc
ããã§
calloc
ãŸããã ãããããã®å Žåã
calloc
ã䜿çšããŠã¹ããŒããŠã³ãçŽæ¥åçŸã§ããã®ã§ã¯ãªãããšçã£ããããããã°ã©ã ãå床æããŸããã
#include <stdlib.h> #define ALLOCATION_SIZE (100 * 1024 * 1024) int main (int argc, char *argv[]) { for (int i = 0; i < 10000; i++) { void *temp = calloc(ALLOCATION_SIZE, 1); free(temp); } return 0; }
calloc
1äžååŒã³åºãããšã§100 MBãå²ãåœãŠãŠè§£æŸããéåžžã«åçŽãªCããã°ã©ã ã ãã®åŸãåºå£ãå®è¡ãããŸãã 次ã¯2ã€ã®ãªãã·ã§ã³
5ã§ãã
calloc
ã¯ãä»®æ³ã¡ã¢ãªã§äžèšã®ããªãã¯ã䜿çšã§ããŸãã ãã®å Žåãããã°ã©ã ã¯è¿
éã«åäœããã¯ãã§ããå²ãåœãŠãããã¡ã¢ãªã¯å®éã«ã¯äœ¿çšããããããŒãžã«åå²ããããããŒãžãããŒãã£ã«ãªããŸããã OSã¯å²ãåœãŠã«ã€ããŠåãã€ããŠããŸãããç§ãã¡ã¯åœŒå¥³ã®æãã€ããŸãªãã®ã§ããã¹ãŠãæ£åžžã«åäœããŸããcalloc
ã¯ã malloc
ãæç»ãã memset
ã䜿çšããŠã¡ã¢ãªãæåã§ãªã»ããã§ããŸãã ããã¯éåžžã«ãã£ãããšè¡ãå¿
èŠããããŸããåèšã§ã ãã©ãã€ãã®ã¡ã¢ãªããªã»ããããå¿
èŠããããŸãïŒå100 MBã®1äžãµã€ã¯ã«ïŒãããã¯éåžžã«å°é£ã§ãã
ããã¯ãæåã®ãªãã·ã§ã³ã䜿çšããããã®æšæºOSã®ãããå€ã倧ããè¶
ããŠããããããã®ãããªåäœãæåŸ
ã§ããŸãã 確ãã«ãLinuxã¯ãŸãã«ãããè¡ããŸããGCCã䜿çšããŠã³ãŒããã³ã³ãã€ã«ããŠå®è¡ãããšãéåžžã«é«éã«å®è¡ãããæ°ããŒãžã®ãšã©ãŒãçºçããã¡ã¢ãªã®è² è·ã¯ã»ãšãã©çããŸããã ããããåãããã°ã©ã ãMacOSã§å®è¡ãããšã
éåžžã«é·ãå®è¡ãããŸããçŽ
8åããããŸãã ã
ããã«ã
ALLOCATION_SIZE
ãå¢ãããšïŒããšãã°ã
1000 * 1024 * 1024
ïŒãMacOSã§ã¯ããã®ããã°ã©ã ã¯ã»ãŒç¬æã«åäœããŸãïŒ
äžäœäœïŒããã§äœãèµ·ãã£ãŠããŸããïŒ
詳现ãªåæ
MacOSã«ã¯
sample
ãŠãŒãã£ãªãã£ïŒ
man 1 sample
åç
§ïŒããããã¹ããŒã¿ã¹ãèšé²ããããšã§ãå®è¡ãããŠããããã»ã¹ã«ã€ããŠå€ããç¥ãããšãã§ããŸãã ã³ãŒãã®å Žåã
sample
ã¯ãããçæããŸãã
Sampling process 57844 for 10 seconds with 1 millisecond of run time between samples Sampling completed, processing symbols... Sample analysis of process 57844 written to file /tmp/a.out_2016-12-05_153352_8Lp9.sample.txt Analysis of sampling a.out (pid 57844) every 1 millisecond Process: a.out [57844] Path: /Users/cory/tmp/a.out Load Address: 0x10a279000 Identifier: a.out Version: 0 Code Type: X86-64 Parent Process: zsh [1021] Date/Time: 2016-12-05 15:33:52.123 +0000 Launch Time: 2016-12-05 15:33:42.352 +0000 OS Version: Mac OS X 10.12.2 (16C53a) Report Version: 7 Analysis Tool: /usr/bin/sample ---- Call graph: 3668 Thread_7796221 DispatchQueue_1: com.apple.main-thread (serial) 3668 start (in libdyld.dylib) + 1 [0x7fffca829255] 3444 main (in a.out) + 61 [0x10a279f5d] + 3444 calloc (in libsystem_malloc.dylib) + 30 [0x7fffca9addd7] + 3444 malloc_zone_calloc (in libsystem_malloc.dylib) + 87 [0x7fffca9ad496] + 3444 szone_malloc_should_clear (in libsystem_malloc.dylib) + 365 [0x7fffca9ab4a7] + 3227 large_malloc (in libsystem_malloc.dylib) + 989 [0x7fffca9afe47] + ! 3227 _platform_bzero$VARIANT$Haswel (in libsystem_platform.dylib) + 41 [0x7fffcaa3abc9] + 217 large_malloc (in libsystem_malloc.dylib) + 961 [0x7fffca9afe2b] + 217 madvise (in libsystem_kernel.dylib) + 10 [0x7fffca958f32] 221 main (in a.out) + 74 [0x10a279f6a] + 217 free_large (in libsystem_malloc.dylib) + 538 [0x7fffca9b0481] + ! 217 madvise (in libsystem_kernel.dylib) + 10 [0x7fffca958f32] + 4 free_large (in libsystem_malloc.dylib) + 119 [0x7fffca9b02de] + 4 madvise (in libsystem_kernel.dylib) + 10 [0x7fffca958f32] 3 main (in a.out) + 61 [0x10a279f5d] Total number in stack (recursive counted multiple, when >=5): Sort by top of stack, same collapsed (when >= 5): _platform_bzero$VARIANT$Haswell (in libsystem_platform.dylib) 3227 madvise (in libsystem_kernel.dylib) 438
ããã§ã¯ã
_platform_bzero$VARIANT$Haswell
ã¡ãœããã«å€ãã®æéã浪費ãããŠããããšã
_platform_bzero$VARIANT$Haswell
ãŸãã ãããã¡ããŒãã«ããããã«äœ¿çšãããŸãã ã€ãŸããMacOSã¯ãããããªã»ããããŸãã ãªãã§ïŒ
ãªãªãŒã¹åŸãã°ããããŠãAppleã¯OSã®ã³ã¢ã³ãŒãã®ã»ãšãã©ãå
¬éããŠããŸãã ãããŠããã®ããã°ã©ã ã
libsystem_malloc
å€ãã®æéãè²»ãããŠããããšã
libsystem_malloc
ãŸãã ç§ã¯
opensource.apple.comã«è¡ããå¿
èŠãªãœãŒã¹ã³ãŒãã§
libmalloc-116ã¢ãŒã«ã€ããããŠã³ããŒããã調æ»ãå§ããŸããã
ãã¹ãŠã®éæ³ã¯
large_mallocã§çºçãã
ããã§ãã ãã®ãã©ã³ãã¯ã127 Kbãè¶
ããã¡ã¢ãªãå²ãåœãŠãããã«å¿
èŠã§ããä»®æ³ã¡ã¢ãªã§ããªãã¯ã䜿çšããŸãã ã§ã¯ããªããã¹ãŠãç§ãã¡ã«ãšã£ãŠãã£ãããšæ©èœããã®ã§ããããïŒ
äºå®ãAppleã¯æŽç·ŽãããããŠããããã§ãã
large_malloc
ã
large_malloc
ã®ã³ãŒã
CONFIG_LARGE_CACHE
ã
#define
å®æ°ã®èåŸã«é ãããŠããŸãã åºæ¬çã«ããã®ã³ãŒãã¯ãã¹ãŠãããã°ã©ã ã«å²ãåœãŠããã倧éã®ã¡ã¢ãªã®ããŒãžã®ã空ããªã¹ããã«ãªããŸãã MacOSãé£æ¥ãããã¡ãŒã127 KBãã
LARGE_CACHE_SIZE_ENTRY_LIMIT
ïŒçŽ125 MBïŒã«å²ãåœãŠãå Žåã
libsystem_malloc
ã¯ãå¥ã®ã¡ã¢ãªãŒå²ãåœãŠããã»ã¹ã䜿çšã§ããå Žåããããã®ããŒãžãå床䜿çšããããšããŸãã ããã«ãããDarwinã«ãŒãã«ããããŒãžãèŠæ±ããå¿
èŠããªããªããã³ã³ããã¹ãã®åãæ¿ããšã·ã¹ãã ã³ãŒã«ãç¯çŽã§ããŸããååãšããŠãéèŠãªç¯çŽã«ãªããŸãã
ãã ããããã¯ããã€ãããªã»ããããå¿
èŠãããå Žåã®
calloc
å Žåã§ãã ãŸããMacOSãåå©çšå¯èœãªããŒãžãèŠã€ããããã
calloc
ããåŒã³åºãããå Žåã
ã¡ã¢ãªã¯ãªã»ãããããŸãã ãã¹ãŠã ãããŠæ¯åã
ããã«ã¯ç¬èªã®çç±ããããŸãããŒãåãããããŒãžã¯ãç¹ã«æ§ãããªéã®å ŽåãéããããªãœãŒã¹ã§ãïŒApple WatchãèŠãŠãã ããïŒã ãã®ãããããŒãžãåå©çšã§ããå Žåãããã«ãã倧å¹
ã«ç¯çŽã§ããŸãã
ãã ããããŒãžãã£ãã·ã¥ã¯ã
calloc
ã䜿çšããŠã¡ã¢ãªã®ãŒãããŒãžãæäŸããå©ç¹ãå®å
šã«å¥ªããŸãã ããŒãã£ããŒãžã«å¯ŸããŠã®ã¿è¡ãããå Žåãããã¯ããã»ã©æªãããšã§ã¯ãããŸããã ã¢ããªã±ãŒã·ã§ã³ããã«å¯èœããŒãžã«æžã蟌ãå Žåãããããç¡å¹åãããŸããã ããããMacOSã¯ããã
ç¡æ¡ä»¶ã«è¡ããŸãã ããã¯ãã¡ã¢ãªã«ãŸã£ãã觊ããã«
alloc
ã
free
ã
calloc
ãåŒã³åºããå Žåã§ãã2çªç®ã®
calloc
ã¯æåã®åŒã³åºãäžã«å²ãåœãŠãããããŒãžã䜿çšããç©çã¡ã¢ãªã§ãµããŒããããªãããšãæå³ããŸãã ãããã£ãŠãOS
㯠ã
ãã§ã«ãªã»ãããããŠããã«ããããããããªã»ããããããã«ãã®ã¡ã¢ãªããã¹ãŠããŒãïŒããŒãžã€ã³ïŒããå¿
èŠããããŸãã ããã¯ã倧容éã®å²ãåœãŠã«é¢ããŠã¯ãä»®æ³ã¡ã¢ãªããŒã¹ã®é
åžããŒã«ã䜿çšããŠåé¿ããããã®ã§ããæªäœ¿çšã®ã¡ã¢ãª
ã¯äœ¿çšæžã¿ã®ã空ããªã¹ããããŒãžã«ãªããŸãã
ãã®çµæãMacOSã§ã¯ãä»ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã127 Kbããå§ãŸãOïŒ1ïŒåäœã瀺ãã«ãããããããå²ãåœãŠãããã¡ã¢ãªã®ãµã€ãºã«å¿ããŠ
calloc
ã®ã³ã¹ããæ倧125 MBãŸã§çŽç·çã«å¢å ããŸãã 125 MBãè¶
ãããšãMacOSã¯ããŒãžã®ãã£ãã·ã¥ãåæ¢ããé床ãéæ³ã®ããã«äžæããŸãã
Pythonããã°ã©ã ãããã®ãããªãã°ãèŠã€ããããšã¯æåŸ
ããŠããªãã£ãã®ã§ãããã€ã質åããããŸããã ããšãã°ããã§ã«ãªã»ãããããã¡ã¢ãªããªã»ãããããšãããã»ããµãµã€ã¯ã«ãããã€å€±ãããŸããïŒ OSãç¡æå³ã«ã¡ã¢ãªãç¡å¹ã«ã§ããããã«ãã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠããªãïŒããã³äœ¿çšããªãïŒã¡ã¢ãªã匷å¶çã«ããŒãïŒããŒãžã€ã³ïŒããã®ã«äœåã®ã³ã³ããã¹ãã¹ã€ãããå¿
èŠã§ããïŒ
ããã¯ãã¹ãŠãå€ãããšããã®åŠ¥åœæ§ã確èªããŠããããã§ãïŒãã¹ãŠã®æœè±¡åã«ã¯ãªãŒã¯ããããŸãïŒ
ãã¹ãŠã®æœè±¡åã¯ãªãŒã¯ãå€ã ïŒã Pythonã§ããã°ã©ãã³ã°ããŠãããããšãã£ãŠãå¿ããããšã¯ã§ããŸããã ããã°ã©ã ã¯ãã¡ã¢ãªãšãããå¶åŸ¡ããããããçš®é¡ã®ããªãã¯ã䜿çšãããã·ã³ã§å®è¡ãããŸãã , , . , .
Radar 29508271 . , .
çµè«
- , ? , CFFI : , , , .
char
OpenSSL, , OpenSSL . , OpenSSL . , OpenSSL , . . ) , OpenSSL, , ) . ( ) : OpenSSL , , . . - «». C-, , :
type *array = malloc(number_of_elements * size_of_element)
. , : number_of_elements size_of_element
, . calloc
, . , . - , « » â «». runtime Go .
- , , .
- , : !