表示される住所はすべて実際のものではありません

表示される住所はすべて実際のものではありません

[[399815]]

この記事はWeChatの公開アカウント「Flying Veal」から転載したもので、著者はFeitian Vealです。記事を転載する場合は飛天牛肉公式アカウントまでご連絡ください。

まず最初に、長い間私を悩ませてきた次の質問、つまり仮想アドレスと論理アドレスの違いについて説明しましょう。

ほとんどのオペレーティング システムの本では、仮想アドレスまたは論理アドレスについて記述されており、混乱してしまいます。

ついに「Linuxカーネルの深い理解」という本で正確な答えを見つけました。ここでは書きません。概念の面では、確かに両者の間にはいくつかの違いがあります。ただし、オペレーティング システムを日常的に使用し理解する上で、仮想アドレスと論理アドレスを一時的に同じ意味として理解することができます。

表示される住所はすべて実際のものではありません

次の C コードは、「オペレーティング システム入門 - [US] Remz H. Apache Dussel」から抜粋したもので、メイン関数のアドレス、malloc によって割り当てられたヒープ領域の値 (Java の new 操作に類似)、およびスタック上の整数のアドレスを出力します。

次の出力が得られます。

知っておく必要があるのは、これらの印刷されたアドレスはすべて仮想的なものであるということです。これらのアドレスは実際には物理メモリ内に存在しません。最終的には、オペレーティング システムと CPU ハードウェアによって実際の物理アドレスに変換され、実際の物理的な場所からアドレスの値を取得できるようになります。

さて、上記は物理アドレスと仮想アドレスを直感的に理解するための単なる紹介です。それでは本文を始めましょう。

物理アドレス

物理アドレスの概念は理解しやすく、実際のアドレスと呼ぶことができます。 『コンピュータシステムの徹底理解 - 第 3 版』に記載されている物理アドレスの定義は次のとおりです。

コンピュータ システムのメイン メモリは、M 個の連続したバイト サイズのセルの配列として構成されます。各バイトには一意の物理アドレスがあります。

たとえば、最初のバイトの物理アドレスは 0、次のバイトのアドレスは 1、その次のバイトのアドレスは 2 というようになります。この単純な構造を考えると、CPU がメモリにアクセスする最も自然な方法は、このような物理アドレスを使用することです。この方法を物理アドレス指定と呼びます。

たとえば、プログラムがロード命令を実行する場合、命令の内容は物理アドレス 4 から 4 バイトのワードを読み取ってレジスタに転送することです。

物理アドレス指定のプロセスは次のとおりです。CPU がこの命令を実行すると、物理アドレス 4 が生成され、メモリ メイン ラインを介してメモリに渡されます。メモリは物理アドレス 4 から始まる 4 バイトのワードを取り出し、それを CPU に返します。CPU はそれを指定されたレジスタに格納します。下の写真をご覧ください:

実際、すべてのプログラムが物理メモリに直接アクセスする物理アドレス指定方法には、大きな欠陥があることに気づくのは難しくありません。

1) まず、ユーザー プログラムはメモリの任意のバイトをアドレス指定できるため、オペレーティング システムを簡単に破壊し、徐々に停止させる可能性があります。

2) また、このアドレス指定方法では、オペレーティング システムで 2 つ以上のプログラムを同時に実行することはほぼ不可能になります。

たとえば、3 つの同一のプログラム (計算機) を開き、すべてを特定のステップまで実行しました。たとえば、ユーザーはこれら 3 つのプログラムのインターフェイスにそれぞれ 10、100、1000 を入力し、対応する命令は、ユーザーが入力した数値をメモリ内の特定のアドレスに保存することです。この位置に 1 つの数字しか保存できない場合、どの数字を保存する必要がありますか?これは矛盾ではないでしょうか?

以下は、『Modern Operating Systems - 3rd Edition』からの別の例です。

プログラムが物理メモリ アドレス 1000 に値を割り当て、つまりそこに何らかのデータを保存し、別のプログラムもこのアドレスに値を割り当てると、2 番目のプログラムによって割り当てられた値によって最初のプログラムによって割り当てられた値が上書きされ、両方のプログラムが同時にクラッシュすることになります。

もちろん、ほぼ不可能ではあるが、完全に不可能ではないとも言いました。物理アドレス指定方式では、複数のプログラムの同時実行を実現する方法がまだいくつかあります。

最も簡単な方法は、まず、アイドル プロセスをディスクに保存して、実行されていないときにメモリを占有しないようにすることです。次に、プログラム (またはプロセス) がすべてのメモリを占有し、短時間実行されるようにします。コンテキストスイッチが発生すると、プロセスを停止してそのステータス情報をすべてディスクに保存し、他のプロセスのステータス情報を読み込んでから、しばらく実行します...メモリ内に一度に 1 つのプログラムしか存在しない限り、上記のアドレス競合は発生しません。これにより、比較的粗い並行性が実現されます。

なぜ荒れているのでしょうか?この方法には、すべてのメモリ情報をディスクに保存すると速度が遅くなるという問題があります。特にメモリが増えると。

そこで、プロセスに対応するメモリを常に物理メモリ内に保持しておき、コンテキストスイッチが発生したときに特定の領域に切り替えることを考えます。

下の図に示すように、3 つのプロセス (A、B、C) があり、それぞれに 512 KB の物理メモリから切り出された小さなメモリ部分があります。これら 3 つのプロセスは物理メモリを共有していることがわかります。

明らかに、この方法には一定のセキュリティ上のリスクが伴います。結局のところ、プロセスがコンテンツを自由に読み書きできるとしたら、混乱が生じます。

では、各プロセスで使用されるアドレスをどのように保護すればよいのでしょうか?物理メモリ モデルを引き続き使用することは絶対に不可能であるため、オペレーティング システムは新しいメモリ抽象化を作成し、新しいメモリ モデル、つまり仮想アドレス空間を導入しました。多くの書籍では、これを直接「アドレス空間」と呼んでいます。

仮想アドレス指定

まず、仮想アドレス空間と仮想アドレスの概念を簡単に説明しましょう。本の定義を直接読むのは少し難しいかもしれません。

つまり、各プロセスのスタック、ヒープ、コード セグメントなどの実際の物理メモリ アドレスはプロセスからは見えず、誰もこの物理アドレスに直接アクセスすることはできません。

では、このプロセスにはどのようにアクセスすればよいのでしょうか?

オペレーティング システムは、各プロセスに仮想アドレス空間 (仮想アドレス) を割り当てます。各プロセスに含まれるスタック、ヒープ、およびコード セグメントには、このアドレス空間からアドレスが割り当てられます。このアドレスは仮想アドレスと呼ばれます。基礎となる命令によって書き込まれるアドレスも仮想アドレスです。

各プロセスには独自のアドレス空間があり、他のプロセスのアドレス空間からは独立しています。つまり、あるプロセス内の仮想アドレス 28 に対応する物理アドレスは、別のプロセス内の仮想アドレス 28 に対応する物理アドレスと異なるため、競合は発生しません。

物理的な住所は倉庫、仮想的な住所は番地であると理解できます。たとえば、合計で 30 個の番地がある場合、すべてのプロセスはこれら 30 個の番地を見ることができますが、表示される同じ番地が同じ倉庫を指しているわけではありません。

さて、「Modern Operating Systems - 3rd Edition」という本にあるアドレス空間の説明を見てみましょう。これは簡単に理解できるはずです。

アドレス空間は、プロセスがメモリをアドレス指定するために使用できるアドレスのセットです。各プロセスには独自のアドレス空間があり、このアドレス空間は他のプロセスのアドレス空間から独立しています (プロセスがアドレス空間を共有する必要がある特別な場合を除く)。

アドレス空間の概念は非常に一般的であり、多くのコンテキストで登場します。たとえば、米国や他の多くの国では、市内の電話番号は通常 7 桁の番号です。したがって、電話番号のアドレス空間は 0 000 000 から 9 999 999 までになります。

アドレス空間は数値以外でも構いません。 「.com」で終わるネットワークドメイン名のセットもアドレス空間です。このアドレス空間は、2 ~ 63 文字の文字列とそれに続く「.com」で構成されます。これらの文字列を構成する文字は、文字、数字、ハイフンです。

ここまでで、アドレス空間の概念は理解できたと思います。それは非常に単純です。

仮想アドレス空間を使用すると、CPU は仮想アドレスを生成してメインメモリにアクセスできます。この仮想アドレスは、メモリに送信される前に適切な物理アドレスに変換されます。仮想アドレスを物理アドレスに変換するプロセスをアドレス変換と呼びます。

アドレス変換には、CPU ハードウェアとオペレーティング システムの緊密な連携が必要です。CPU 上のメモリ管理ユニット (MMU) は、仮想アドレスを物理アドレスに変換するために使用されますが、MMU はメモリに格納されているルックアップ テーブルを使用する必要があり、このテーブルの内容はオペレーティング システムによって管理されます。

そして、上記CPUが仮想アドレスを生成し、アドレス変換を行う処理が仮想アドレス指定です。たとえば、次の図をご覧ください。

参考文献

「オペレーティングシステム入門 - [米国] Ramz H. Apache Dussel」

現代のオペレーティングシステム - 第 3 版

「コンピュータシステムの徹底理解 - 第 3 版」

<<:  エッジコンピューティングとIoTの共生関係

>>:  [調査] クラウドネイティブ企業はセキュリティ維持に苦戦

推薦する

基礎知識はSEOの魂

SEO 担当者は、毎日「SEO」という 3 つの単語を見ると、少し美的疲労を感じるかもしれません。実...

通信事業者はクラウドコンピューティングをベースに5G事業の展開を深化

2018 年、世界のクラウド コンピューティング市場規模は 3,000 億米ドルを超え、中国のクラウ...

ウェブマスターは、誰が検索しているのか、誰が検索しているのかを理解する必要がある。

誰が検索しているのか?誰が検索しているのか?ウェブマスターはこの概念を明確に理解していますか?ウェブ...

ERP はパブリック クラウド上に存在できないと誰が言ったのでしょうか? Kingdee Cloud Serverless ERP が AWS でリリース

[51CTO.com からのオリジナル記事] パブリック クラウドは、その弾力性と拡張性により、多く...

おすすめ: lunarpages-ブラックフライデー/35%オフ

lunarpages-2018年ブラックフライデー、35%オフセール。 Lunarpages は私の...

Google AdSense がドメイン名広告サービスを停止

3月2日の早朝、Webmaster EncyclopediaはGoogleから、Google Ads...

Rfchost-US DCS コンピュータ ルーム/CN2/Xen/ネットワーク爆発/簡易テスト

今日は役に立つ情報がないのでどうやって更新するか悩んでいたので、Cyyzaid の VPS (rfc...

中小企業がソフト商品の販促効果を拡大するには?

ソフト記事マーケティングは、中小企業にとって最も一般的に使用されているマーケティングおよびプロモーシ...

ビットコインの第三者決済チャネルが閉鎖:中国市場から撤退する可能性

中国ビジネスネットワークの記者、習大偉氏とインターン記者、熊月佳氏中央銀行はビットコイン規制を強化す...

データをクラウドに移行する際に企業にとって最も重要なことは何ですか?

ほぼすべての IT リーダーが恐れる操作が 1 つあるとすれば、それはデータベースの移行です。 CI...

テンセントクラウドは、開発者がワンストップ開発を実現できるよう支援するクラウド開発ツール「Cloud Studio」をリリースした。

クラウドコンピューティングのさらなる発展により、「クラウド開発」は新たなパラダイムへと進化しています...

入札最適化の方向性を導くデータ分析プロセス

「ビッグデータ」という言葉は、昨今非常によく耳にするようになりました。しかし、私たちはビッグデータが...

屋台経済における富のコード

ここ2日間、 「屋台経済」という言葉が、意図せずしてWeiboのホット検索のトップに押し上げられた。...