問題タブ [address-space]
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.
c - 同じプロセスで複数回ロードされた共有ライブラリのアドレス空間
まず、私の質問に答えてくれる参考文献をいくつか見つけました。 すぐに (つまり、仕事の後に) 読むつもりですが、答えが些細なものであり、補足的な知識をあまり必要としない場合に備えて、ここで尋ねています。
状況は次のとおりです。同じプロセス内で一貫した内部状態 (.c ファイルで宣言された静的変数など) を維持する必要がある共有ライブラリ (libA.so と呼びましょう) を作成しています。このライブラリは、プログラム P によって使用されます (つまり、P は でコンパイルされ-lAます)。ここまでのすべてを理解すると、P のアドレス空間は次のようになります。
現在、P は時々 を呼び出しますdlopen("libQ.so", ...)。libQ.so も libA.so を使用します (つまり、 でコンパイルされました-lA)。すべてが同じプロセス内で発生するため、呼び出しが P または Q からのものであるかどうかに関係なく、libA が何らかの方法で同じ状態を保持する必要があります。
私が知らないのは、これがメモリ内でどのように変換されるかです。次のようになりますか?
...またはこのように?
2 番目のケースでは、単一プロセスの一貫した状態を維持することは簡単です。最初のケースでは、もう少し労力が必要になります (たとえば、プロセス ID を の 2 番目の引数として使用する共有メモリ セグメントなどftok())。
もちろん、リンクとロードがどのように機能するかについての知識は限られているため、上記の図は完全に間違っている可能性があります。私の知る限り、共有ライブラリはメモリ内の固定スペースにあり、すべてのプロセスが同じデータとコードにアクセスします。動作は、A および/または P および/または Q がどのようにコンパイルされたかによっても異なります。そして、この動作はおそらくプラットフォームに依存しません。
windows - アドレス空間のプライベート領域にゼロバイトが多いのはなぜですか?
ウィンドウの下のプロセスのアドレス空間を調べています。プライベート リージョンのコンテンツを見ると、0 バイトが非常に多い (一部のリージョンでは 95% 以上) ため、疑問に思います。アプリケーションの実行中に使用されないプライベート リージョンが増える場合、それらが予約済みまたは無料ではないのはなぜですか?
ありがとうございます。
operating-system - 親プロセスとその子プロセスのアドレス空間
私がこの本を読んだときOperating system design and implementation、第 2 章でProcess creation、次のように述べられています。
子の初期アドレス空間は親のコピーですが、2 つの異なるアドレスが関係しています。
これは私には少しあいまいです。同じアドレス空間を持っていると言っているようですが、そうではないと思います。
誰かがこれの詳細を説明できますか?
c++ - 「this」パラメーターのアドレス空間修飾子ごとのメソッドのオーバーロード
clang++ を使用する C++ では、暗黙の 'this' パラメータのアドレス空間修飾子に従ってメソッドをオーバーロードできますか? もしそうなら、構文は何ですか?
このソースは、アドレス空間修飾子をパラメーター リストの後、中括弧の前に配置できることを示唆しています ( 'this' で const 修飾子を使用する場合と同様)。次のことを試しましたが、失敗しました; clang は、「this」ではなく、メソッドのアドレス空間を設定しようとしていると考えています。
私が見つけた最も近いものは、clang を使用すると、明示的な仮パラメーター ( 'this' ではない)のアドレス空間に従ってメソッドをオーバーロードできることです。たとえば、以下のコードは「1\n2\n」を出力します。
c++ - 0 に等しいランダムなアドレスでポインタを初期化できますか?
たとえば、
このポインターは、ランダムに 0 で初期化できますか?これは、オペレーティング システムによって初期化されることを意味します。この場合、このポインターの値を変更しませんか?
c++ - getcontext() から取得したコンテキストのスタックを分離する方法はありますか?
getcontext() から取得したコンテキストのスタックを分離する方法はありますか? 異なるスタックを持つ親の正確なコピーであるように。setcontext() または swapcontext() を使用すると、本質的に fork システム コールのように機能しますか?
呼び出し元の関数が戻った後も使えるようにしたい。
c - 初期化時に「初期化されていない静的変数」にメモリが割り当てられる場所は?
初期化されていない静的変数は常に BSS に割り当てられます。コンパイル時にメモリが割り当てられるため、.bss セクションは静的です。多くの本によると、実行可能ファイルでは「ゼロ以外の値に初期化された変数のみがスペースを占有します」。プログラムがメモリにロードされた後、初期化されていない静的変数は .bss のままです。
**関数がそれを初期化するとどうなりますか? ** 他のエリアに移動する予定はありますか?