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

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

[[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の共生関係

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

推薦する

テンセントクラウド、ビデオ会議中に契約書に署名できる「クラウド契約署名」ソリューションを発表

度重なる感染拡大により、多くのビジネス活動に不確実性が増し、多くの調印式が中止を余儀なくされている。...

海外のクラウドサーバーレンタル業者が推奨、価格が安く、スピードが速く、アフターサービスも充実

自分に合った海外クラウドサーバーを選ぶには?海外のクラウドサーバーベンダーは数多く存在し、その品質も...

ハードクラウド - 1.5g メモリ KVM/40g ハードディスク/G ポート/Win 互換/月額 6.95 ドル

hardcloud は設立されてまだ数ヶ月です。低価格、G ポート、Windows サポートなどの特...

cloudpowerall: 香港 cn2 gia vps、年間 24.99 ドル、512M メモリ/1 コア/20gSSD/5M 帯域幅無制限トラフィック

cloudpowerall はマレーシアに登録された会社です。ホストキャットは 3 月上旬に米国ロサ...

天一クラウドは、技術革新を通じて、セキュリティ、信頼性、ユビキタス性、包括性に向けたクラウド開発を推進しています。

5月17日は世界電気通信デーです。中国電信天一クラウドは「赤い雲天一、安全で包括的」をテーマに、オン...

IaaS 向け初のクエリ言語「ZStack クエリ言語 (ZQL)」を発表

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますUI 作業...

外国貿易模倣ブランド VPS/著作権フリー VPS-hostsolutions、ルーマニア VPS、月額支払い 2 ユーロ

外国貿易ウェブサイトを運営している友人の中には、著作権紛争に遭遇する人もいるかもしれません。もちろん...

経営者は適切なプロモーションチャネルをどのように選択すべきでしょうか。

より良い発展を達成したいのであれば、資源の選択方法を学ばなければなりません。今日は、さまざまな段階に...

chicagovps シンプルレビュー/1.5g メモリ KVM VPS

数日前、私は「[推奨] chicagovps - 512M メモリ Kvm/年額 25 ドル - W...

Kubernetes ベースの Nacos 高可用性クラスターを実行する方法

Nacos (Namings and Configuration Management) は、Ali...

伝統的な業界ネットワークブランドマーケティング思考の事例分析

思考の観点から共有する、Quanlai - 伝統的な業界におけるインターネットブランドマーケティング...

SEO実践体験:ウェブサイトがKになる問題を解決する方法

1. ブロックされたウェブサイトとは何ですか?ウェブサイトがブロックされると、ウェブマスターはそれを...

ウェブサイトのキーワードランキングに影響を与える間接的な要因を無視する

インターネット上のランキングに影響を与える肯定的な要因、つまり直接的な要因がよく見られます。しかし、...

3分レビュー! 2021年8月のクラウドコンピューティング分野の重要な動向を簡単に紹介します

[[419910]] 2020年以降、クラウドコンピューティングがトレンドになりました。ますます多く...