2016-08-03 7 views
-1

以下のリンクでは、Sdaz MacSkibbons氏の回答が仮想アドレスシステム上のプロセスアドレス空間の概要を示しています。仮想アドレスシステム上のアドレス空間の処理

What happens when a computer program runs?

今、すべてのプロセスが、4ギガバイトの仮想アドレス空間を取得したとします。これは、この仮想アドレス空間の先頭アドレスがスタック部分(スタックアドレスは0から始まるものとします)を取得し、下からのアドレス空間がテキスト、データ、グローバルおよびヒープに割り当てられることを意味します。ヒープのサイズが変わるので、新しいmalloc割り当ては仮想アドレス空間ページを実メモリに直接マップするか、またはヒープに割り当てる以前に割り当てられた仮想アドレスページが空き/使用可能かどうかをチェックします。そして、プロセスがそれをどのようにサポートするのかよりも、4GBを超えるような大量のヒープメモリが必要な場合はどうでしょうか?

ありがとうございます。

+0

OSによって異なります。 %pのprintfを使用してCプログラムを作成し、ローカル変数(stacK)、割り当てられた(malloc())変数、静的変数のアドレス(プログラムデータ)、関数のアドレス(関数へのポインタ) ...。仮想アドレス空間の一部は、OSに使用されます。実行中の各スレッドに関連するデータ(rand()のシード値など)もあります(FSまたはGSセグメントレジスタはこれにアクセスするために使用されるか、仮想アドレス空間にマップされる可能性があります)。 – rcgldr

答えて

1

あなたがリンクしている答えは、単に物事を行う方法を示しています。

論理的な4GBのアドレス空間があると仮定して、それらのすべてが有効な仮想アドレスである可能性があります。

論理アドレス空間の一部は、システムに使用されます。システムが使用する論理アドレス範囲全体を使用することはほとんどありません。

論理アドレス空間に有効な論理アドレスを持たない他の領域があります。

次に、メモリをヒープとスタックと記述するのは誤解を招きます。ヒープとスタックは単に読み書きメモリです。彼らにとって特別なものは何もなく、オペレーティングシステムはメモリがどのように使われているか気にしません。であるとしてプログラムセクションの

思う: - 実行可能ファイル、読み取り専用 - 読み取り専用

あなたの2番目の質問は、malloc関数についてです、いいえ実行 - ノー 読み取り/書き込みをしない、実行します。 Mallocの実装は、読み取り/書き込みメモリのプールを管理します。 Mallocはプールからメモリを返すことによってメモリ要求を処理しようとします。利用可能なメモリが十分でない場合、mallocは仮想メモリを論理アドレス空間にさらにマッピングすることによってプールのサイズを増やします。

アプリケーションが大量のメモリを割り当てる必要がある場合、通常はmallocを使用しません。代わりにオペレーティングシステムサービスです。 4GBのアドレス空間がある場合は、4GBを超えるブロックを割り当てることはできません。

関連する問題