<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Linuxのトピックreturn value of malloc()</title>
    <link>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178324#M71</link>
    <description>man malloc(3)に、&lt;BR /&gt;&lt;BR /&gt;---&lt;BR /&gt;&lt;BR /&gt;       Linux  は楽観的メモリ配置戦略を用いている。これは、 malloc() が NULL でない値を返したとき、メモリが実際に利用可能であることが保証されないことを意味している。システムがメモリ不足状態になったとき、悪名高いメモリ不足解決器 (OOM　killer) によって一つまたは複数のプロセスが削除される。&lt;BR /&gt;&lt;BR /&gt;----&lt;BR /&gt;&lt;BR /&gt;  と書いてありました。そうか、ようやく最初のプログラムの動作が理解できたような気がします。&lt;BR /&gt;&lt;BR /&gt;　プログラムを実行すると、malloc()でメモリを割り付けて行きます。&lt;BR /&gt;&lt;BR /&gt;　物理メモリ + swapが不足し始めます。&lt;BR /&gt;&lt;BR /&gt;　それでも、malloc()はメモリが利用可能でないかも知れないけれど、楽観的にnon-NULL のアドレスを返すのでプログラムはwhile loopを続けてしまう。&lt;BR /&gt;&lt;BR /&gt;　カーネルはメモリ不足を検出して、このプロセスをkill して、フリーメモリを確保しようとした。これが　"強制終了" ですね。&lt;BR /&gt;&lt;BR /&gt;うーん。皆さん困らないのだろうか。</description>
    <pubDate>Sat, 09 Apr 2005 03:53:40 GMT</pubDate>
    <dc:creator>nadachi</dc:creator>
    <dc:date>2005-04-09T03:53:40Z</dc:date>
    <item>
      <title>return value of malloc()</title>
      <link>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178320#M67</link>
      <description>Linux初心者です。お知恵と経験をを拝借したく。malloc()の戻り値に関してです。&lt;BR /&gt;&lt;BR /&gt;$ uname -a&lt;BR /&gt;&lt;BR /&gt;Linux jrs02 2.4.21-27.EL #1 SMP Wed Dec 1 21:53:39 EST 2004 x86_64 x86_64 x86&lt;BR /&gt;&lt;BR /&gt;_64 GNU/Linux&lt;BR /&gt;&lt;BR /&gt;の環境で、malloc()がどれくらい出来るか、を知るために、以下のようなプログラムを試みました。&lt;BR /&gt;&lt;BR /&gt;#include &lt;STDIO.H&gt;&lt;BR /&gt;&lt;BR /&gt;#include &lt;STDLIB.H&gt;&lt;BR /&gt;&lt;BR /&gt;main()&lt;BR /&gt;&lt;BR /&gt;{ &lt;BR /&gt;&lt;BR /&gt;  unsigned char *ptr;&lt;BR /&gt;&lt;BR /&gt;  long i;&lt;BR /&gt;&lt;BR /&gt;  i = 0;&lt;BR /&gt;&lt;BR /&gt;  while (1) {&lt;BR /&gt;&lt;BR /&gt;    ptr = (unsigned char *)malloc(4096);&lt;BR /&gt;&lt;BR /&gt;    if (ptr == (unsigned char *)NULL) break;&lt;BR /&gt;&lt;BR /&gt;    ++i;&lt;BR /&gt;&lt;BR /&gt;  }&lt;BR /&gt;&lt;BR /&gt;  printf("%d pages allocated.\n", i);&lt;BR /&gt;&lt;BR /&gt;  exit(0);&lt;BR /&gt;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;$ cc m.c &lt;BR /&gt;&lt;BR /&gt;でコンパイルして、実行すると、しばらくして、&lt;BR /&gt;&lt;BR /&gt;$ ./a.out&lt;BR /&gt;&lt;BR /&gt;強制終了&lt;BR /&gt;&lt;BR /&gt;　となりました。　man mallocによると、メモリ割付が失敗するとmalloc()には NULL が返るから、それをifで捕まえられるはず。そこで i の値を見れば、何ページ割り付けられたか分かるはず、と考えたのですが、Linuxでは何か、さらに細工がいるのでしょうか?  &lt;BR /&gt;&lt;BR /&gt;  login shell は /bin/bashです。これも何か関係ありますか?&lt;/STDLIB.H&gt;&lt;/STDIO.H&gt;</description>
      <pubDate>Fri, 08 Apr 2005 22:11:53 GMT</pubDate>
      <guid>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178320#M67</guid>
      <dc:creator>nadachi</dc:creator>
      <dc:date>2005-04-08T22:11:53Z</dc:date>
    </item>
    <item>
      <title>return value of malloc()</title>
      <link>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178321#M68</link>
      <description>同じ結果になりました。&lt;BR /&gt;&lt;BR /&gt;# uname -a&lt;BR /&gt;&lt;BR /&gt;Linux xxxx 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown&lt;BR /&gt;&lt;BR /&gt;Linux のカーネルの作りこみになると思います。&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://www.python.jp/pipermail/python-ml-jp/2003-July/002432.html" target="_blank" rel="nofollow"&gt;http://www.python.jp/pipermail/python-ml-jp/2003-July/002432.html&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;Linuxでは物理メモリ+swapが足りなくなると、ランダムにプロセスを&lt;BR /&gt;&lt;BR /&gt;killしてメモリを確保するので、Xなどがkillされた場合は、&lt;BR /&gt;&lt;BR /&gt;画面モードを戻す終了処理などもできないため&lt;BR /&gt;&lt;BR /&gt;見た目には止まってしまったように見えることもあります。&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Fri, 08 Apr 2005 23:05:53 GMT</pubDate>
      <guid>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178321#M68</guid>
      <dc:creator>テレコム担当者</dc:creator>
      <dc:date>2005-04-08T23:05:53Z</dc:date>
    </item>
    <item>
      <title>return value of malloc()</title>
      <link>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178322#M69</link>
      <description>テレコム担当者様、&lt;BR /&gt;&lt;BR /&gt;  追試ありがとうございます。&lt;BR /&gt;&lt;BR /&gt;"Linuxでは物理メモリ + swapが足りなくなると、ランダムにプロセスをkill してメモリを確保するので..." というのは、個人的にはかなり無茶な処理のように思います。&lt;BR /&gt;&lt;BR /&gt;　せっかく、アプリケーションで使うメモリリソースを見積もっても、メモリの突発的な使用で”どうなるか分からない" というのはとってもこわいです。</description>
      <pubDate>Sat, 09 Apr 2005 03:11:37 GMT</pubDate>
      <guid>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178322#M69</guid>
      <dc:creator>nadachi</dc:creator>
      <dc:date>2005-04-09T03:11:37Z</dc:date>
    </item>
    <item>
      <title>return value of malloc()</title>
      <link>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178323#M70</link>
      <description>Linux の生い立ちが商用を意識したものでないことだと&lt;BR /&gt;&lt;BR /&gt;思います。&lt;BR /&gt;&lt;BR /&gt;&amp;gt;"Linuxでは物理メモリ + swapが足りなくなると、ランダムにプロセスをkill して&lt;BR /&gt;&lt;BR /&gt;&amp;gt;メモリを確保するので..." というのは、個人的にはかなり無茶な処理のように思います。&lt;BR /&gt;&lt;BR /&gt;同感です。&lt;BR /&gt;&lt;BR /&gt;実メモリの少ない環境にさまざまな Linux Dest(RedHat, Fedra Core, Turbo,&lt;BR /&gt;&lt;BR /&gt;Vine) をインストールしたことがありますが、Linux カーネルは少ない&lt;BR /&gt;&lt;BR /&gt;実メモリの場合、それなりのメモリハンドリングで動こうとします。&lt;BR /&gt;&lt;BR /&gt;これはスワップアウトしまくる Windows と比較して優秀だと思いますが、&lt;BR /&gt;&lt;BR /&gt;この仕様（カーネルがユーザプロセスを kill する）は頂けませんね。&lt;BR /&gt;&lt;BR /&gt;クリティカルな運用では致命的かも知れません。&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Sat, 09 Apr 2005 03:29:43 GMT</pubDate>
      <guid>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178323#M70</guid>
      <dc:creator>テレコム担当者</dc:creator>
      <dc:date>2005-04-09T03:29:43Z</dc:date>
    </item>
    <item>
      <title>return value of malloc()</title>
      <link>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178324#M71</link>
      <description>man malloc(3)に、&lt;BR /&gt;&lt;BR /&gt;---&lt;BR /&gt;&lt;BR /&gt;       Linux  は楽観的メモリ配置戦略を用いている。これは、 malloc() が NULL でない値を返したとき、メモリが実際に利用可能であることが保証されないことを意味している。システムがメモリ不足状態になったとき、悪名高いメモリ不足解決器 (OOM　killer) によって一つまたは複数のプロセスが削除される。&lt;BR /&gt;&lt;BR /&gt;----&lt;BR /&gt;&lt;BR /&gt;  と書いてありました。そうか、ようやく最初のプログラムの動作が理解できたような気がします。&lt;BR /&gt;&lt;BR /&gt;　プログラムを実行すると、malloc()でメモリを割り付けて行きます。&lt;BR /&gt;&lt;BR /&gt;　物理メモリ + swapが不足し始めます。&lt;BR /&gt;&lt;BR /&gt;　それでも、malloc()はメモリが利用可能でないかも知れないけれど、楽観的にnon-NULL のアドレスを返すのでプログラムはwhile loopを続けてしまう。&lt;BR /&gt;&lt;BR /&gt;　カーネルはメモリ不足を検出して、このプロセスをkill して、フリーメモリを確保しようとした。これが　"強制終了" ですね。&lt;BR /&gt;&lt;BR /&gt;うーん。皆さん困らないのだろうか。</description>
      <pubDate>Sat, 09 Apr 2005 03:53:40 GMT</pubDate>
      <guid>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178324#M71</guid>
      <dc:creator>nadachi</dc:creator>
      <dc:date>2005-04-09T03:53:40Z</dc:date>
    </item>
    <item>
      <title>return value of malloc()</title>
      <link>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178325#M72</link>
      <description>自己follow upです。&lt;BR /&gt;&lt;BR /&gt;　OOM Killer自身は disableする、とかは出来ないようなのですが、malloc()側の"楽観的"挙動を変えるのは出来そうです。Linuxのバージョンによっては、&lt;BR /&gt;&lt;BR /&gt;# echo 2 &amp;gt; /proc/sys/vm/overcommit_memory&lt;BR /&gt;&lt;BR /&gt;と設定するんだそうです。("2" が何の意味か、はわかりませんが。)&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Mon, 11 Apr 2005 03:50:17 GMT</pubDate>
      <guid>https://community.hpe.com/t5/linux/return-value-of-malloc/m-p/1178325#M72</guid>
      <dc:creator>nadachi</dc:creator>
      <dc:date>2005-04-11T03:50:17Z</dc:date>
    </item>
  </channel>
</rss>

