Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
mallocしただけでメモリが確保できるって本当ですか?
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
MakKi
December 22, 2021
Programming
310
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
mallocしただけでメモリが確保できるって本当ですか?
AWS (t2.micro) デモバージョン
MakKi
December 22, 2021
More Decks by MakKi
See All by MakKi
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
51
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
64
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
Recap: An Operating System in Go
makki_d
2
180
XSLTで作るBrainfuck処理系
makki_d
0
420
眼鏡と視力についての誤解を解く
makki_d
0
230
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
780
range over funcのエラー処理
makki_d
1
1.9k
GoとテストとインプロセスDB
makki_d
3
700
Other Decks in Programming
See All in Programming
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
360
What's New in Android 2026
veronikapj
0
240
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
160
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
200
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
290
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
180
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
150
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
260
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1.1k
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
120
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
280
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
Featured
See All Featured
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
560
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
430
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
340
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
How STYLIGHT went responsive
nonsquared
100
6.2k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.2k
4 Signs Your Business is Dying
shpigford
187
22k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Transcript
mallocしただけで メモリが確保できるって 本当ですか? KLab株式会社 牧内大輔
自己紹介 • 牧内大輔 ◦ Twitter: @makki_d ◦ Github: makiuchi-d •
KLab株式会社 ◦ スマホ向けオンラインゲームの会社 ◦ エンジニアリングマネージャー • 特徴 ◦ Linux使い(Kubuntu + Compiz) ◦ 仕事:オンライン対戦のネットワーク基盤とか ◦ 趣味:バーコード/QRコードライブラリをGoに移植 ▪ そういえば昨晩blog記事かきました • QRコードを1ピクセルずつ消していく闇のゲームの攻略法 • https://makiuchi-d.github.io/2021/12/22/yami-qrcode.ja.html
今日はmallocの話をします
C言語触ったことある人
mallocが何か知っている人
mallocについて • C標準ライブラリの関数 • メモリの動的割り当て #include <stdlib.h> void *malloc(size_t size);
mallocの使い方 • こんなコードを見たことがあると思います void *p = malloc(1000); if(p == NULL){
// メモリ確保失敗の処理 ... }
このプログラムを 見てください
#define MALLOC_COUNT 20 #define PAGE_SIZE 4096 int main() { char
*ptrs[MALLOC_COUNT] = {NULL}; int count = 0; int i; printf("start. pid=%d", getpid()); getchar(); for(i=0; i<MALLOC_COUNT; ++i){ ptrs[i] = (char *) malloc(100 * 1024 * 1024); if(ptrs[i] == NULL){ printf("malloc returns NULL\n"); break; } count++; printf("malloc: p[%d] = %p", i, ptrs[i]); getchar(); } printf("total %d MB allocated", count * 100); getchar(); for(i=0; i<count; ++i){ int t; for(t=0; t<100*1024*1024; t += PAGE_SIZE){ ptrs[i][t] = 0; } printf("touch %d MB", (i+1)100); getchar(); } for(i=0; i<count; ++i){ free(ptrs[i]); } return 0; }
#define MALLOC_COUNT 20 #define PAGE_SIZE 4096 int main() { char
*ptrs[MALLOC_COUNT] = {NULL}; int count = 0; int i; printf("start. pid=%d", getpid()); getchar(); for(i=0; i<MALLOC_COUNT; ++i){ ptrs[i] = (char *) malloc(100 * 1024 * 1024); if(ptrs[i] == NULL){ printf("malloc returns NULL\n"); break; } count++; printf("malloc: p[%d] = %p", i, ptrs[i]); getchar(); } printf("total %d MB allocated", count * 100); getchar(); for(i=0; i<count; ++i){ int t; for(t=0; t<100*1024*1024; t += PAGE_SIZE){ ptrs[i][t] = 0; } printf("touch %d MB", (i+1)100); getchar(); } for(i=0; i<count; ++i){ free(ptrs[i]); } return 0; } 100MBずつ20回malloc 失敗したらbreak 確保できたらアドレスを表示 確保した合計を表示 確保した領域に書き込み 書き込んだ領域のサイズ表示 メモリ解放
問題:何MB確保できるでしょうか • デモ用マシンについて ◦ AWS EC2 t2.micro Ubuntu20.04 LTS ◦
物理メモリ 1GB ▪ total 968MiB、free 700MiBちょっと ◦ スワップ領域 0 1. 700 MB 2. 900 MB 3. 2000 MB
動かしてみます
結果 • 2000MBまでmalloc成功 • この段階ではメモリ使用率は増えていない • 確保したメモリに書き込んではじめてメモリ使用率増加 • 800MBくらいでOOM-Killerによって強制終了
なぜこうなったのか
仮想アドレス空間 • プロセスから見えるメモリアドレス空間 ◦ ひと塊の大きなメモリに見える ◦ 物理メモリの大きさとは無関係 • プロセス毎に独立 ◦
他プロセスのメモリにアクセスできない • 物理メモリとのマッピングはOSが管理 ◦ CPUの機能(MMU)を利用 物理メモリ 仮想アドレス
mallocしたとき • 仮想アドレス空間を予約 ◦ このアドレスが戻り値 • 物理メモリへのマッピングはまだしない ◦ メモリ使用量は増えない 物理メモリ
仮想アドレス ?
書き込みしたとき • このとき初めて物理メモリにマッピング ◦ メモリ使用量増加 最終的に物理メモリが足りなくなり メモリを開放するために プロセスが殺されました(OOM-Killer) 物理メモリ 仮想アドレス
まとめ • mallocしただけでは物理メモリは確保されない • 戻り値チェックだけではメモリ不足を防げない • 大量にメモリを使うプログラムを書くときは気をつけましょう • 裏には複雑な仕組みが隠れていてコンピュータっておもしろい!
参考文献とか • [試して理解] Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識 ◦ 竹内 覚、2018、技術評論社 ◦ ISBN:
978-4774196077 ※今回のmallocの挙動は、glibcのmallocにおいて heapではなくpageからメモリ確保する場合のものです。 ※mallocはもっと複雑なことをやっているので、 興味のある人は小崎先生の動画を見ましょう。 https://www.youtube.com/watch?v=0-vWT-t0UHg