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