スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

メモリについて

プログラムしているのにメモリについてあんまり分かっていなかったので調べてみた。
C言語でメモリを理解するにはざっくりと
・コード(code)
・データ(data)
・ヒープ(heap)
・スタック(stack)

の4つに分けて考える。

コード (code) 
プログラム自体が配置される部分。
データ(data) 
グローバル変数やローカル変数など自動変数以外のものが配置される部分。
ヒープ(heap) 
mallocによって割り当てられるための領域。(処理系によっては存在しない)
スタック(stack) 
なんぞこれ。


詳しく調べてみた。

データの一時待避に利用される。
機構的にはFIFO(First-In Last-Out)と呼ばれるもので構成されている。
イメージ的には細長い入れ物?で、重ねて物をしまうと先にしまったものは後から入れたものを全部出さないと取り出せない。
C言語はスタックを自動変数のメモリ領域として利用している。
実際の例
・関数開始時にその関数内で使う自動変数の分だけダミーのデータをスタックに押し込む。
・その時スタック上に取られたメモリを自動変数用として利用。
・関数終了時にこれらを取り除く。

通常スタックはあまり大きくないため、自動変数に大きな配列などを確保したり、再帰関数の終了条件の設定を間違えたりするとスタックオバーフローを起こす。
とのこと。


昔作ったサーバーシステムで実際にこれが起きた。だめじゃん。
自動変数に大きな構造体を持たせたためにエラーが起きたのを記憶している。
対策は簡単
上の4つの区切りでいうところのデータ(data)かヒープ(heap)に移動させてやればよい。
具体的には
・static を付ける。
・グローバル変数にする。
・mallocで確保。


上記の方法以外で膨大なスタックを管理したい時の方法(調べたけど私は使ってなかったりする)
実行側で管理する
・Linuxの場合は実行ファイル(/etc/init.d/~)の中にulimit -s サイズ(KB)と記載することでスタックサイズを変えられる
(デフォルト以下を設定することはできない)
またこのプログラムで作成したスレッドはすべてスタックサイズを継承するみたい


プログラム側で管理する
推奨された方法かは疑問だけれどスレッドオプションにてサイズ変更ができるそうだ
・pthread_attr_setstacksize(attrアドレス,サイズ);を利用する。
pthread_attr_getstacksizeで確認もできる



少しだけ賢くなった。    気がする

ねよっと。

コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。