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
February 21, 2019
Technology
840
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
mallocしただけでメモリが確保できるって本当ですか?
updated at 2019/Jun/29
MakKi
February 21, 2019
More Decks by MakKi
See All by MakKi
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
50
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
63
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
Recap: An Operating System in Go
makki_d
2
180
XSLTで作るBrainfuck処理系
makki_d
0
410
眼鏡と視力についての誤解を解く
makki_d
0
230
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
780
range over funcのエラー処理
makki_d
1
1.8k
GoとテストとインプロセスDB
makki_d
3
700
Other Decks in Technology
See All in Technology
実装だけじゃない! CCA-F取得エンジニアが教えるClaude Code開発プロセス活用術
diggymo
2
430
AIで政治は変わるのか? — 中高生と考えたAI時代の民主主義(東海高校サタデープログラム)
eitarosuda
0
400
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
0
1.9k
地域 SRE コミュニティ最前線 / SRE NEXT 2026 Discussion Night Track C
muziyoshiz
0
150
最適な自走を最小限の支援で — M&Aで拡大する組織で少人数SREが挑んだ1年 / SRE NEXT 2026
genda
0
140
AI Driven AI Governance
pict3
0
210
デジタル・デザイン構想 by Sayaka Ishizuka
y150saya
0
200
クラウド上のデータ復旧で見落としがちな制約: 医療系 SaaS の BCP 設計から得た教訓
kakehashi
PRO
0
2.3k
Compose 新機能総まとめ / What's New in Jetpack Compose
yanzm
0
150
Claude Codeとハーネスについて考えてみる
oikon48
18
8.7k
Docker Desktop不要の時代が来る? WSL標準の「wslc」で Linuxコンテナを動かしてみた.
ueponx
0
790
AI時代における最適なQA組織の作り方
ymty
3
460
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
190
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
We Have a Design System, Now What?
morganepeng
55
8.2k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Visualization
eitanlees
152
17k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
870
Odyssey Design
rkendrick25
PRO
2
730
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Chasing Engaging Ingredients in Design
codingconduct
0
230
Transcript
mallocしただけで メモリが確保できるって 本当ですか? KLab株式会社 牧内大輔
自己紹介 • 牧内大輔 ◦ Twitter: @makki_d ◦ Github: makiuchi-d •
KLab株式会社 ◦ エンジニアリングマネージャー ◦ スマホ向けオンラインゲームの会社 • 特徴 ◦ Linux使い(Kubuntu + Compiz) ◦ 仕事:オンライン対戦のネットワーク基盤とか ◦ 趣味:バーコード/QRコードライブラリをGoに移植
今日はmallocの話をします
C言語触ったことある人
mallocが何か知っている人
mallocについて • C標準ライブラリの関数 • メモリの動的割り当て #include <stdlib.h> void *malloc(size_t size);
mallocの使い方 • こんなコードを見たことがあると思います void *p = malloc(1000); if(p == NULL){
// メモリ確保失敗の処理 ... }
このプログラムを 見てください
#define TARGET_GB 20 #define PAGE_SIZE 4096 #define ONE_GB (1 *
1024 * 1024 * 1024) int main() { char *ptrs[TARGET_GB] = {NULL}; int total_gb = 0; int i; printf("start. pid=%d", getpid()); getchar(); for(i=0; i<TARGET_GB; ++i){ ptrs[i] = (char *) malloc(ONE_GB); if(ptrs[i] == NULL){ printf("malloc returns NULL\n"); break; } total_gb++; printf("malloc: p[%d] = %p", i, ptrs[i]); getchar(); } printf("total %d GB allocated", total_gb); getchar(); for(i=0; i<total_gb; ++i){ int t; for(t=0; t<ONE_GB; t += PAGE_SIZE){ ptrs[i][t] = 0; } printf("touch %d GB", i+1); getchar(); } for(i=0; i<total_gb; ++i){ free(ptrs[i]); } return 0; }
#define TARGET_GB 20 #define PAGE_SIZE 4096 #define ONE_GB (1 *
1024 * 1024 * 1024) int main() { char *ptrs[TARGET_GB] = {NULL}; int total_gb = 0; int i; printf("start. pid=%d", getpid()); getchar(); for(i=0; i<TARGET_GB; ++i){ ptrs[i] = (char *) malloc(ONE_GB); if(ptrs[i] == NULL){ printf("malloc returns NULL\n"); break; } total_gb++; printf("malloc: p[%d] = %p", i, ptrs[i]); getchar(); } printf("total %d GB allocated", total_gb); getchar(); for(i=0; i<total_gb; ++i){ int t; for(t=0; t<ONE_GB; t += PAGE_SIZE){ ptrs[i][t] = 0; } printf("touch %d GB", i+1); getchar(); } for(i=0; i<total_gb; ++i){ free(ptrs[i]); } return 0; } 1GBずつ20回malloc 失敗したらbreak 確保できたらアドレスを表示 確保した合計を表示 確保した領域に書き込み 書き込んだ領域のサイズ表示 メモリ解放
問題:何GB確保できるでしょうか • このPCについて ◦ Kubuntu 18.04 64bit (Linux version 4.15.0-54-generic)
◦ 物理メモリ 16GB ▪ ただし、VRAM領域もあるので実質約15.5GB ◦ スワップ領域 2GB 1. 15 GB 2. 17 GB 3. 20 GB
動かしてみます
結果 • 20GBまでmalloc成功 • この段階ではメモリ使用率は増えていない • 確保したメモリに書き込んではじめてメモリ使用率増加 • 16GBに到達する前に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
None