Slide 1

Slide 1 text

mallocしただけで メモリが確保できるって 本当ですか? KLab株式会社 牧内大輔

Slide 2

Slide 2 text

自己紹介 ● 牧内大輔 ○ 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

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 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

Slide 10

Slide 10 text

#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

Slide 11

Slide 11 text

問題:何MB確保できるでしょうか ● デモ用マシンについて ○ AWS EC2 t2.micro Ubuntu20.04 LTS ○ 物理メモリ 1GB ■ total 968MiB、free 700MiBちょっと ○ スワップ領域 0 1. 700 MB 2. 900 MB 3. 2000 MB

Slide 12

Slide 12 text

動かしてみます

Slide 13

Slide 13 text

結果 ● 2000MBまでmalloc成功 ● この段階ではメモリ使用率は増えていない ● 確保したメモリに書き込んではじめてメモリ使用率増加 ● 800MBくらいで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