問題タブ [sbrk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
259 参照

c++ - Void* を size_t に変換する方法は?

私は次の機能を持っています:

そして、次のように使用したい:

しかし、私はエラーが発生しています:

void*ポインタを数値に変換するにはどうすればよいですか? それは合法的なものですか?

0 投票する
4 に答える
900 参照

c - malloc() はどこにメモリを割り当てますか? プロセスの仮想アドレス空間のデータ セクションですか、それともヒープ セクションですか。

を紹介されて以来、動的メモリ割り当てはファミリ内の関数を使用して行わCれると言われてきました。また、使用して動的に割り当てられたメモリは、プロセスのヒープ セクションに割り当てられることもわかりました。Cmallocmalloc

ここに画像の説明を入力

さまざまな OS の教科書でmallocは、ヒープ上の構造体をプロセスに割り当てるためのシステム コール (常にではありませんが、時々) が必要であると書かれています。ヒープに割り当てられたバイトのチャンクへのポインターを返すと仮定するとmalloc、なぜシステムコールが必要になるのでしょうか。関数のアクティベーション レコードはプロセスのスタック セクションに配置されます。「スタック セクション」はすでにプロセスの仮想アドレス空間の一部であるため、アクティベーション レコードのプッシュとポップ、スタック ポインターの操作は、仮想アドレス空間の可能な最大アドレス。システムコールすら必要ありません。

「ヒープセクション」もプロセスの仮想アドレス空間の一部であるため、同じ理由で、このセクションにバイトのチャンクを割り当てるためにシステムコールが必要なのはなぜですか。次のようなルーチンmallocは、「空き」リストと「割り当て済み」リストを独自に処理できます。知る必要があるのは、「データセクション」の終わりだけです。特定のテキストでは、「動的メモリ割り当てのためにメモリをプロセスにアタッチする」ためにシステムコールが必要であると書かれていますが、malloc「ヒープセクション」にメモリを割り当てる場合、プロセス中にメモリをアタッチする必要があるのはなぜmallocですか? すでにプロセスの一部である部分から簡単に取得できます。

Kernighan と Ritchie によるテキスト「The C Programming Language」[2e] を読んでいるときに、関数の実装に出くわしましたmalloc[セクション 8.7 の 185-189 ページ]。著者は次のように述べています。

mallocオペレーティング システムに、必要に応じてより多くのメモリを取得するように要求します。

これはOSのテキストが言っていることですが、上記の私の考えには直感的ではありません(mallocヒープにスペースを割り当てる場合)。

システムにメモリを要求するのは比較的高価な操作であるため、作成者は を呼び出すたびにそれを行うわけではなく、少なくともユニットを要求mallocする関数を作成します。この大きなブロックは、必要に応じて切り刻みます。また、基本的なフリー リストの管理は によって行われます。morecoreNALLOCfree

しかし問題は、作成sbrk()者がオペレーティング システムにメモリを要求するために使用することmorecoreです。現在、ウィキペディアは次のように述べています。

brkおよびsbrkUnix および Unix ライクなオペレーティング システムで使用される基本的なメモリ管理システム コールで、プロセスのデータ セグメントに割り当てられるメモリの量を制御します。

どこ

データ セグメント (多くの場合、.data と示される) は、オブジェクト ファイルの一部、または初期化された静的変数 (つまり、グローバル変数と静的ローカル変数)を含むプログラムの対応するアドレス空間です。

私が推測するのは「ヒープセクション」ではありません。[データ セクションは上の図の下から 2 番目のセクションであり、ヒープは下から 3 番目のセクションです。]


私は完全に混乱しています。実際に何が起こっているのか、そして両方の概念がどのように正しいのか知りたいですか? 散らばったピースをつなぎ合わせてコンセプトを理解するのを手伝ってください...