タグ付けされた質問 「memory-management」

12
コンパイラーが割り当て解除を自動的に挿入しないのはなぜですか?
Cのような言語では、プログラマはfreeへの呼び出しを挿入することが期待されています。コンパイラがこれを自動的に行わないのはなぜですか?人間は(バグを無視して)妥当な時間内にそれを行うので、不可能ではありません。 EDIT:今後の参考のために、ここで興味深い例があり、別の議論です。

7
ガベージコレクションされた言語のオブジェクトデストラクターパラダイムがなぜ普及しないのですか?
ガベージコレクションされた言語設計に関する決定についての洞察を探しています。おそらく、言語の専門家が私を啓発できるでしょうか?私はC ++のバックグラウンドを持っているので、この領域は私を困惑させます。 Ruby、Javascript / ES6 / ES7、Actionscript、LuaなどのOOPyオブジェクトをサポートするほとんどすべてのガベージコレクション言語は、デストラクタ/ファイナライズパラダイムを完全に省略しているようです。Pythonは、そのclass __del__()メソッドを持つ唯一のものであるようです。どうしてこれなの?オブジェクトのデストラクタ/ファイナライズメソッドの効果的な実装を妨げる自動ガベージコレクションを使用する言語には、機能的/理論的な制限がありますか? これらの言語がメモリを管理する価値のある唯一のリソースと見なしていることは非常に欠けていると思います。ソケット、ファイルハンドル、アプリケーションの状態はどうですか?オブジェクトファイナライズの非メモリリソースと状態をクリーンアップするカスタムロジックを実装する機能がない場合、アプリケーションにカスタムmyObject.destroy()スタイルの呼び出しを散らかし、クリーンアップロジックを「クラス」の外に配置し、カプセル化を中断し、 gcによって自動的に処理されるのではなく、人的エラーによるリソースリークへのアプリケーション。 これらの言語がオブジェクト破棄のカスタムロジックを実行する方法を持たないことにつながる言語設計の決定は何ですか?正当な理由があると想像しなければなりません。これらの言語がオブジェクトの破壊/最終化をサポートしなくなった技術的および理論的な決定をよりよく理解したいと思います。 更新: おそらく私の質問を表現するより良い方法: なぜ言語には、カスタムインスタンス化(コンストラクター)とともにクラスまたはクラスに似た構造を持つオブジェクトインスタンスの組み込みコンセプトがありますが、完全に破棄/ファイナライズ機能を省略しますか?自動ガベージコレクションを提供する言語は、オブジェクトが使用されなくなったときに100%の確実性でわかるように、オブジェクトの破壊/最終化をサポートする主要な候補のようです。しかし、これらの言語のほとんどはサポートしていません。 私は、デストラクタが呼び出されることは決してないだろうとは思わない。それは、gcsが回避するように設計されているコアメモリリークだからだ。デストラクタ/ファイナライザは、将来の不確定な時間まで呼び出されないかもしれないが、JavaまたはPythonが機能をサポートするのを止めなかったという議論を見ることができました。 オブジェクトのファイナライズをサポートしない理由は、言語設計の中核となる理由は何ですか?


4
ガベージコレクターはどのようにスタックオーバーフローを回避しますか?
それで、ガベージコレクターがどのように機能するかを考えていて、興味深い問題を考えました。おそらく、ガベージコレクターはすべての構造を同じ方法で走査する必要があります。彼らは、リンクリストやバランスの取れたツリーなどを横断している天気を知ることができません。また、検索でメモリを使い果たすこともできません。1つの可能な方法、およびALL構造をトラバースする唯一の方法は、バイナリツリーの場合と同じようにすべて再帰的にトラバースすることです。ただし、これにより、リンクリストまたは単にバランスの悪いバイナリツリーでスタックオーバーフローが発生します。しかし、私が今まで使用したガベージコレクション言語はすべて、このようなケースに対処するのに問題がないようです。 ドラゴンブックでは、「スキャンされていない」種類のキューを使用しています。基本的に、構造を再帰的にトラバースするのではなく、キューとしてマークする必要があるものを追加し、最後にマークされていないものごとに削除します。しかし、このキューは非常に大きくなりませんか? それでは、ガベージコレクタはどのように任意の構造をトラバースしますか?このトラバーサル技術はどのようにオーバーフローを回避しますか?

7
RAMを搭載していないが、ディスクを搭載したコンピューターはRAMを搭載したコンピューターと同等ですか?
私が理解するように、メモリは多くのことに使用されます。ディスクキャッシュとして機能し、プログラムの命令とそのスタックとヒープが含まれています。これが思考実験です。コンピューターがクランチを実行するのにかかる速度や時間を気にしない場合、非常に大きなディスクがあると仮定して、最低限必要なメモリー量はどれくらいですか?メモリを廃止し、ディスクを用意することは可能ですか? ディスクキャッシュは明らかに不要です。ディスクにスワップスペースを設定すると、プログラムスタックとヒープもメモリを必要としません。メモリの存在を必要とするものはありますか?

2
「メモリ合体」とは何ですか?
グラフィック処理ユニットには、メモリ合体と呼ばれるものがあることを知りました。それを読んで、私はこのトピックについて明確ではありませんでした。これは、メモリレベル並列処理に関連する何らかの方法ですか? Googleで検索しましたが、満足のいく答えを得ることができませんでした。 誰かがより包括的で理解しやすい説明をしてくれると助かります。

1
仮想アドレス空間が物理アドレス空間よりも大きい場合、アドレスマッピングはどのようにメモリに保存されますか?
40の物理アドレスビットを持つシステムで作業しているとしましょう。合計物理アドレス空間(バイトアドレス可能なメモリを想定)はバイト、または1 TiBです。また、仮想アドレスの長さが48ビットの場合、物理メモリ内の場所よりも多くのアドレスが仮想メモリで使用できることを意味します。2402402^{40} 「過剰な」アドレスはハードディスクの場所も参照する可能性があるため、これは理にかなっています。しかし、私が理解していないのは、仮想アドレスと物理アドレス間の変換がどのように行われるかです。VASの場所を物理的な場所にリンクするマッピングがどこかに格納されていると思います。物理的な場所よりも多くの仮想アドレスの場所がある場合、これらすべてのマッピングをメモリに保存するにはどうすればよいですか?少なくとも、各仮想アドレスを格納するために48ビットが必要であり、次に、マップ先の物理的な場所を格納するためにさらに40ビットが必要です。すべての場所をマッピングすると、物理メモリ自体よりも多くのメモリが必要になるため、明らかに、各仮想アドレスの対応する物理アドレスへの1:1マッピングを保存することはできません。 ここで正確に何が欠けていますか?

1
OSのメモリバルーニング
一部のハイパーバイザーは、バルーニングと呼ばれる方法を使用してメモリ使用量を最適化します(少なくともKVMが呼ぶ方法です)。この方法は、VM間のメモリを重複排除し、共通ページをコピーオンライトで読み取り専用に設定します。 これは、fork呼び出しの反対です。 プロセスに対してOSレベルで実装することは可能ですか(同じサイトで複数のタブを持つChromiumでブラウジングするとき、主にメモリの重複を考えていました)、すでに実装されていますか?

2
ページングを考慮したガベージコレクターはありますか?
ガベージコレクションは、再生可能なメモリを見つけるために、生きているすべてのオブジェクトを訪問する必要があります。(多くの世代がこれを少し遅らせることで) すべてが同じであるため、他のブロックをページインしてからページアウトする前に、すでにRAMにページングされているオブジェクトを最初に訪問することをお勧めします。 もう1つの可能性は、OSがプロセスからラムのページを取り去ろうとするとき、ページアウトする必要なく放棄できるページがあるかどうか、GCが最初に尋ねられることです。GCはほとんどの場合、ページからオブジェクトを移動することで実行されるため、OSがページを必要とする時間制限内にそのページをクリアできます。 それでも、GCが機能する順序を決定するOSページングシステムと統合されているガベージコレクターは思い出せません。

1
純粋なデマンドページング中のスワップスペース管理
以下は、OSのホーム割り当てを行っているときに出くわした疑いです。しかし、それは単純なコーディングの質問よりも概念ベースのように思われるので、私は宿題タグがこれに適しているとは思いません。 一定量のRAMとスワップメモリ​​を指定して、同時に実行されている複数のプロセスの純粋なデマンドページングスキームで、スワップスペースに対して次の2つのケースで何が起こるか プロセスでページフォールトが発生し、RAMに使用可能な空きフレームがないため、プロセスのカーネルフレームのチャンクのページの1つをスワップに書き出す必要があります(簡単にするため、コピーは考慮していません) -on-write case)。明示的に、スワップスペースのどこにこのフレームが書き込まれ、そのためにどのデータ構造を更新する必要がありますか? プロセスが特定のページをページインする必要がある場合、それはスワップメモリ​​のどこにあり、その特定のページがスワップに存在するかどうかをどのようにして知るのでしょうか? ご想像のとおり、純粋な需要管理スキーム中にスワップスペースをどのように管理するか、およびどのデータ構造が不可欠であるかを理解することが困難です。回答のリンクを参照していただければ幸いです(「オペレーティングシステムの概念-Silberschatzによる第8版で検索しましたが、質問に対する明確な回答が見つかりませんでした)。

3
「マップ」とはどういう意味ですか?
私はさまざまなCS教育資料でこの用語に何度も遭遇しました。 L2 CS162(UCバークレー): メモリマップI / O L4 CS162(UCバークレー): メモリマップファイル L24 CS61(UCバークレー): 「メモリマップI / O」:CPUアドレス空間にマップされたデバイス制御/データレジスタ 「マッピング」をグーグルで行った後でも、記事Map_(higher-order_function)を入手しましたが、 あまりわかりませんでした。 さらに、ウィキペディアの記事をbitmap読んで、コンテキストの意味を理解しようとしました: ビット配列は、あるドメイン(ほとんどの場合、整数の範囲)からセット{0、1}の値へのマッピングです わかりませんが、上記のコンテキストでは、データ変換について聞こえます。 CSブックを読んだ後、この段落だけが見つかりましたが、「マッピング」の意味がわかりませんでした。 メモリマッピングLinuxは(他の形式のUnixと共に)、仮想メモリ領域の内容をディスク上のオブジェクトに関連付けることにより、メモリマッピングと呼ばれるプロセスを初期化します。 検索結果としてMapReduceも取得しました。ここで、mapは「単純な操作がシーケンスのすべての要素に適用される可能性がある並列計算のイディオム」と説明されています。 私はまだこの用語について混乱しています。私が言及したコンテキストで「マップ」が何を意味するのかを誰かが説明できますか?

1
MMUを使用しないプロセッサ用のマルチタスクオペレーティングシステムの作成
一部のARMプロセッサ用の趣味のオペレーティングシステムを書くことを考えています。ARM MPUを搭載した人気のあるシングルボードコンピューターはたくさんあるので、そのうちの1つを購入したかっただけです(より多くのオープンドキュメントがあるコンピューターを選択)。本当に十分なメモリを備えたボードでさえ、メモリ管理ユニットを備えたMPUを持っていないことに気づいたとき、私は驚きました。 私は常にi386 +プロセッサで作業しており、それ以外は何もしていないため(一部のMicrochip PICを除く)、私は混乱しており、書かれたOSと比較すると機能が制限されない機能するオペレーティングシステムを書くことができるかどうかわかりませんMMUを備えたMPU用。 MMUを「置換」または「シミュレーション」するためのいくつかの解決策を考えることができ、いくつか質問があります。 16ビットモードと32ビットモードのIntelプロセッサでは、セグメントとセグメントセレクターを使用して、異なるタスクで異なるメモリブロックを使用する方法があります。これは、x86でタスクスイッチを実行するときに、セグメントレジスタの内容を変更することでメモリ空間を変更できることを意味します。ARMアーキテクチャで使用できるメモリセグメンテーションの一般的な概念はありますか? 実行可能ファイルの代わりにリンクされたオブジェクトファイルをロードすることで、ページング構造を使用してメモリをマップした場合と同じ方法で、再配置(修正)または位置独立コードを使用してメモリの一部にタスクをポイントできます。これで十分でしょうか? ARMプロセッサのメモリ保護ユニットについても読んだことがあります。これらは役に立ちますか? MMUのないシステムでタスクを管理する「通常の」方法はありますか?

2
ページサイズは常にフレームサイズと同じですか?
ページングについて学習しています。私の本では、CPUによって生成される論理アドレスは|p|d|(ページ番号、ページオフセット)という形式であり、物理アドレスは|f|d|(フレーム番号、フレームオフセット)という形式であるとしています。また、具体的にはd、オフセットが直接コピーされて、論理アドレスから物理アドレスが生成されることも述べられています。 常識では、オフセットが直接コピーされる場合、ページサイズはフレームサイズと等しくなるはずです(そうでない場合、オフセットは対応しません)。しかし、残念ながら私の本はそれについて何も述べていません。 では、ページサイズは常にフレームサイズと同じですか?

4
ワードまたはバイトでアドレス指定できますか?正しい用語
どうやら、バイトはそれ自体が8ビットであると確立しました(それは正しいですか?)。RAMとNORフラッシュは通常、かなり細かいレベルでアクセスできますが、アドレス可能な最小単位が8ビット、16ビット、またはその他の2ビットの累乗であるかどうかを判断するのはシステムアーキテクチャ次第です。正しい用語は、これをワードアドレス指定可能と呼ぶことでしょうか?または別の言い方をすれば、単語はアドレス可能な最小単位のサイズですか?または、これを説明する他の用語はありますか? mabye nibble、byte、word、double wordはすべてビット長が可変で、アーキテクチャーによってのみ定義されますか?したがって、1バイトが常に8ビットであるのは単なる偶然でしょうか。たとえば、誰かがいくつかの新しいCPUとメモリタイプを設計し、彼女のバイトを16ビットに定義できますか? 主な質問:最小のアドレス可能なメモリブロックの正確な用語は何ですか? 副問:私が探しているこの単語の反意語は何ですか(たとえば、NANDフラッシュで使用されます)?ページアドレス可能、ブロックアドレス可能?どちらも正しいですか、それとも不正確ですか?

2
正確なGCがライブラリとして実装可能な言語はどのようなものでしょうか。
手動のメモリ管理を備えたプログラミング言語があるとします。正確なガベージコレクションを、基本的な言語構成要素としてではなく、ライブラリとして実装できるようにするために、この言語にはどのような機能が必要ですか? 正確なGCとは、ヒープへのポインタのみがトラバースされ、どの変数が有効であるかどうかを確認することを意味します。 その他の考慮事項: CとC ++にはBoehmガベージコレクターがありますが、正確なGCではないため、これはカウントしません。Boehmコレクターは、スタック上でポインターである可能性のあるものはすべて、純粋にメモリー調整要件に基づいているものをポインターであると想定しています。たとえば、ポインタは4バイト境界で整列する必要があるため、ポインタのようにビットレベルkで(k % 4) == 0見える整数。 カササギは、正確なガベージコレクターを使用するように既存のCコードを変換します。生成されたCコードには、ガベージコレクション用の多くのスタブがあります。つまり、コレクターを使用してスタックポインターをヒープに登録するためのものです。誰もそのようにコードを書くことは期待できないので、私はこれを数えません。これは、他の言語のコンパイルターゲットの詳細です。 そのような言語には次のものが必要だと思います。 マクロまたは何らかの形のメタプログラミング。GCルートの登録などを行うために必要なすべての追加コードをカプセル化します。 構造体または共用体を検査できる反射メカニズム。どのメンバーがポインターであるかを判別する必要があります。 スタックフレームのレイアウトを確認できる反射メカニズム。これは2よりもはるかに難しいようです。 これが漠然としたり、意見に基づくものではないことを願っていますが、しばらくの間、それについて疑問に思っていました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.