Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
mallocしただけで メモリが確保できるって 本当ですか? KLab株式会社 牧内大輔
Slide 2
Slide 2 text
自己紹介 ● 牧内大輔 ○ Twitter: @makki_d ○ Github: makiuchi-d ● KLab株式会社 ○ エンジニアリングマネージャー ○ スマホ向けオンラインゲームの会社 ● 特徴 ○ Linux使い(Kubuntu + Compiz) ○ 仕事:オンライン対戦のネットワーク基盤とか ○ 趣味:バーコード/QRコードライブラリをGoに移植
Slide 3
Slide 3 text
今日はmallocの話をします
Slide 4
Slide 4 text
C言語触ったことある人
Slide 5
Slide 5 text
mallocが何か知っている人
Slide 6
Slide 6 text
mallocについて ● C標準ライブラリの関数 ● メモリの動的割り当て #include void *malloc(size_t size);
Slide 7
Slide 7 text
mallocの使い方 ● こんなコードを見たことがあると思います void *p = malloc(1000); if(p == NULL){ // メモリ確保失敗の処理 ... }
Slide 8
Slide 8 text
このプログラムを 見てください
Slide 9
Slide 9 text
#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
Slide 10
Slide 10 text
#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
Slide 11
Slide 11 text
問題:何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
Slide 12
Slide 12 text
動かしてみます
Slide 13
Slide 13 text
結果 ● 20GBまでmalloc成功 ● この段階ではメモリ使用率は増えていない ● 確保したメモリに書き込んではじめてメモリ使用率増加 ● 16GBに到達する前にOOM-Killerによって強制終了
Slide 14
Slide 14 text
なぜこうなったのか
Slide 15
Slide 15 text
仮想アドレス空間 ● プロセスから見えるメモリアドレス空間 ○ ひと塊の大きなメモリに見える ○ 物理メモリの大きさとは無関係 ● プロセス毎に独立 ○ 他プロセスのメモリにアクセスできない ● 物理メモリとのマッピングはOSが管理 ○ CPUの機能(MMU)を利用 物理メモリ 仮想アドレス
Slide 16
Slide 16 text
mallocしたとき ● 仮想アドレス空間を予約 ○ このアドレスが戻り値 ● 物理メモリへのマッピングはまだしない ○ メモリ使用量は増えない 物理メモリ 仮想アドレス ?
Slide 17
Slide 17 text
書き込みしたとき ● このとき初めて物理メモリにマッピング ○ メモリ使用量増加 最終的に物理メモリが足りなくなり メモリを開放するために プロセスが殺されました(OOM-Killer) 物理メモリ 仮想アドレス
Slide 18
Slide 18 text
まとめ ● mallocしただけでは物理メモリは確保されない ● 戻り値チェックだけではメモリ不足を防げない ● 大量にメモリを使うプログラムを書くときは気をつけましょう ● 裏には複雑な仕組みが隠れていてコンピュータっておもしろい!
Slide 19
Slide 19 text
参考文献とか ● [試して理解] Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識 ○ 竹内 覚、2018、技術評論社 ○ ISBN: 978-4774196077 ※今回のmallocの挙動は、glibcのmallocにおいて heapではなくpageからメモリ確保する場合のものです。 ※mallocはもっと複雑なことをやっているので、 興味のある人は小崎先生の動画を見ましょう。 https://www.youtube.com/watch?v=0-vWT-t0UHg
Slide 20
Slide 20 text
No content