マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

  • スタック・オーバーフローはなぜ起きるのか?
    と言えば、OSが確保したスレッドのスタックが、
    再帰呼出し等によって、領域超過を起こすため。
  • スレッドのスタックには、
  • 各関数のスタック・フレームが
    • 引数、戻り値、ローカル変数
    • 戻り先の呼出し元へのポインタ
  • 各関数の呼出し履歴分

積まれることになる。

詳細

基礎

基本的に1スレッド1MBのメモリ(アドレス空間)を消費する。

スレッドのスタックのメモリ予約・確保については、

  • OSがスレッド作成時にスタックを予約する(基本1MB)。
  • OSが関数呼び出しの際にスタックを積む(コミット)。

という動作になる。ユーザによる制御は不要。

スタックの最上位のページは既にコミットされており、
スタックに最上位まで積まれ二重にコミットしようとした
場合にスタックオーバーフローという例外が発生する。

スタックの成長はメモリの成長とは(アドレス空間から)逆方向になる。

  • メモリの成長 : 0 ---> 4GB(16TB) の方向
  • スタックの成長 : 4GB(16TB)---> 0 の方向

※ 関数の呼び出し規則によって積まれ方の詳細は若干は違う。

スタック・サイズの変更

  • /STACKのリンカ・オプションで予約サイズなどを変更可能。

IIS上でのスタック・サイズ

IIS上ではスタック・サイズが小さいらしい。


Tags: :Windows, :メモリ管理, :障害対応, :性能, :デバッグ


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-07-19 (金) 15:49:18 (93d)