かみきと申します。

詳しくないですけど、この話、もすこし突っ込みたいので。
# linux/mm/mmap.c のリソースチェックの計算式の意味が分からんです ...。


MOCHIDA Shuji <mochid@netside.co.jp> writes:
> | Linux 2.2以降では、/proc/sys/vm/overcommit_memory に1を書き込むと
> | overcommit動作をするようになりますが、デフォルトではovercommitしません。
     ...
> 
>  overcommit なしなら malloc() の時点でエラーになるので、
> "VM: killing process" は出ないですよね?  >  詳しい方

少なくとも linux 2.4.18 では /proc/sys/vm/overcommit_memory が 0 でも
おおむね
  
  「空き実メモリ + 空きスワップ領域」 > 確保しようとする領域

をチェックしてるだけです。
# overcommit_memory が 1 だとチェックもしないので、
# そういう意味では overcommit かどうかを定めるフラグになっていますが ...

mmap or malloc しても左辺は変わらないので、これを複数回繰り返すと
「実メモリ + スワップ」以上の領域が確保できてしまいます。

つまり "VM: killing process" が出ることがありえます。
... 元々の記事はそれだからこれが出てるんでは。


mmap(2) の MAP_NORESERVE の項:

       MAP_NORESERVE
              (MAP_PRIVATE とともに使用される。) このマッピングに対するスワップ空間の
              ペ ー ジ を予約しない。スワップ空間を予約した場合は、このプライベートな
              copy-on-write (書き込み時コピー)領域の変更が必ず成功することが保証さ れ
              る。 予約を行わなかった場合は、メモリに空きがないと書き込み時に SIGSEGV
              エラーを受け取ることがある。

「copy-on-write 領域の変更が必ず成功することが保証される」というのは、
暗黙のうちに「他のプロセスを殺してでも ...」ということも含んでるんでしょうか。
「予約」してもどのリソースも減ってないように見えるんですが ...

-- 
かみきいちや