永続的RAM

今日は、Phantom OSの重要な概念の1つについての物語です。 しかし、コンセプト自体はもちろんファントムの前に存在しました-実際、本の最後にあるタンネンバウムでは、彼が空想することを許可しています。ファントムのほぼすべての機能の概要が見えるため、一般的に、少なくともアプローチは非常に明白です一般的なシステムの将来について考えています。



永続RAMは非常にシンプルで非常に難しいものです。



一般に、すべてが単純です。RAMの内容が消えないことを想像してください。 決して。 たとえば、コンピューターの電源を切るとき。 または、たとえば...コンピュータが消えたとき。 「そして、死んだプログラムの魂は水の上を急ぎます。」



まあ、本当に-それは問題ではありません。コンピューターの状態を保存してから電源を切ることができたら、この状態を別の状態に復元できます。 同じです。 一般的に同じですか? チップまで? そして、ビデオカードが異なる場合-それはすでに不可能ですか?



コンピュータの状態全体を保存する方法ではなく、RAMのみを保存する方法について話しているため、それは可能です。 しかし、これは役に立たない、注意深い読者は言う-少なくともレジスタを保持する必要がありますか? そうしないと、メモリのみを復元しても、プログラムは何も起こらなかったかのように動作できません。



そして、タスクはそれだけです。 映画を見ているときに一時停止ボタンをクリックするような、OSの停止とプログラムのコンピューターの停止を行う環境をプログラムに提供します。 「プログラムの下」で一時停止中にコンピューターを変更することもできますが、プログラムの作業の継続が完全に透過的になる状況を何らかの形で提供する必要があります。



要件が絶対的なものである場合、これは達成できません。 ハードウェアの状態を保存して完全に復元することはできません。 しかし、しないでください。 プログラムはビデオカードを必要とせず、同じAPIと画面上の保存された画像を必要とし、これは可能です。



織機:RAMのみの状態を保存するだけでは十分ではありませんが、コンピューター全体は非現実的です。



エンジニアリングに精通しているため、プログラムには特定の環境を指定する必要があります。これは、まずプログラム自体に十分であり、次にそのような環境内で、プログラムの一貫した状態と「見る」すべてを保存できるはずです。



このような環境がオペレーティングシステムの仕様であることは容易に理解できます。 まあ-ありません。 優れたオペレーティングシステム。 アプリケーションから機器の詳細(および一般に周囲の世界の一時的状態)を十分に隠すシステム。



したがって、実際には、永続(仮想)メモリについて話す必要はありませんが、永続ランタイム=永続OSについて話す必要があります。 実際、これはPhantom OSプロジェクトですが、今日は基本的にRAMのみに限定します。そうしないと、午前中に記事を書き終えることができなくなります。



したがって、永続メモリは他の永続サービスに囲まれていることを理解しており、現時点ではそれらを脇に置きます。



戦争の目標も明確です。 明確ですか? いや?



目標は、プログラマーの生活を下品に簡素化することです。 彼にプログラムの状態をシリアル化する作業をなくします。 そして、彼が自分自身に課している制限から、プログラム内のデータの内部表現を設計し、遅かれ早かれこれらすべてをファイルであるバイトストリームのプロクラスンベッドに詰め込む必要があることに留意してください。



さて-ここに簡単な例を示します: habrahabr.ru/company/2gis/blog/198564



FSと戦う代わりに、単に悪夢としてそれを忘れることができます。 明らかに、これはデータ交換に関する多くの質問を引き起こしますが、実際には、交換はファイルではなく、REST / SOAP /何でも、そしてツリーをバイトストリームにシリアル化する形式でも行われていないことを認めていますしかし、オブジェクトのクエリまたはオブジェクトのツリーの「ブランチ」の形式で。 明らかに、これは「ファイル」セマンティクスにまったく対応していませんが、プログラム自体に便利なデータ表現に対応しています。



まあ、目標は明確です。 今の治療。 メモリをディスクに書き込む方法は?



さて、(fd、(void *)0、get_mem_size())を書きますか?



もちろん違います。 多くの理由で。 また、メモリには「穴」が存在する可能性があるため、どこにも表示されない領域へのアクセスは禁止されています。 そして、変更されていないものを書き留める必要はまったくありません。 はい、同じコード-なぜですか? そして、最も重要なのは、それが非常に高価だからです。



そして、録画中にプログラムを停止する必要があることは絶対に重要です。 しかし、これはすでにまったく役に立ちません。



ここにあります。 アプリケーションプログラムが私たちを信頼し、本当に安心してファイルに書き込みを行わないようにしたい(そして、これが必要な場合)(そして、これは一般的に全体のアイデアを殺します)、私たちはそれを保証する必要があります。 たぶん、後者の状態ではまったくそうではないかもしれませんが(これはそれほど重要ではありません-計算の一部を繰り返すでしょう)、全体的なものであり、昨日ではありません。



つまり、プログラムの状態(少し後で、これは一般にすべてのプログラムの状態であることがわかります)を古い方法で保存することはできません-コンピューターの電源を切る前またはctrl-sで、これは常に行わなければなりません。 または少なくとも定期的に十分。 そしてしばしば。



ユーザーが、そしてさらにそうであることはありそうにない-コンピューター制御の技術的プロセスは、「RAMを保存しています」というメッセージを1、2分間喜んでいます。



作業プログラムのすぐ下で、バックグラウンドでゆっくりと状態を維持することを学ばなければなりません。



しかし、その後は一貫性がなくなります! プログラムの状態の左半分を保存し、右を維持し始めたとき、プログラムはすでに新しいものを取得していました。その半分は再起動時に「一緒に成長しませんでした」。 プログラムは、左半分にオブジェクトを追加し、右半分からそれにリンクを配置します。状態の「写真」では、リンクがあることがわかりますが、オブジェクトはありません。



保存された状態は、厳密に、絶対的に、一貫している必要があります。 ただし、順次実行する必要があります。



できますか



できます。



このプロセスをより安価で簡単にする多くのヒューリスティックがありますが、それは通常のCOW、コピーオンライトに基づいています。



限界まで誇張すると、状態を撮影すると、メモリ全体が瞬時に読み取り専用に切り替わることになります。これは、原子的に実行する必要がある唯一の(そして非常に安価な)操作です。 (事前にプログラムをメモリに完全に表示される状態にする必要があることを事前に予約します。プロセッサレジスタではなく、これも単純で安価です)。



実際、これが「撮影のポイント」です。



さらに、このプロセスは、特定の瞑想性を獲得し、体の自然な空洞から髪を引き抜くことなく、穏やかに、整列して実行することができます。 メモリページは、ディスクに1つずつ安全に書き込むことができます。 そして、プログラムはどうですか? もちろん、彼女は待たずに、メモリページに何かを書き込もうとします。 このようなページはいくつかに分割されます。古い不変のコピーがディスクへの書き込み用にキューに入れられ(先頭に近い)、新しいページがプログラムによって使用および変更されます。 ディスクへの記録が終了すると、古いコピーは破棄されます。



私が言ったように、これは単なるドラフトです。 たくさんの詳細があります。 (頭を吹き飛ばしたい人は、今すぐコードを覗くことができます。)



明らかな最適化は、差分のみを記録することです。 前回から、すべてが変わったわけではありません。



同様に明らかですが、より議論の余地があり、ヒューリスティックな最適化が必要なのは、写真のポイントに何かを書き留めて(そしてr / oに切り替えて)、それが変わらないことを期待することです。 その後、このメモリページに対してディスク操作を繰り返すことなく、ディスク上の完成した記録済みブロックを使用することができます。



また、スナップショットの記録中にプログラムのワーキングセット(より正確には、読み取り専用ではない)が潜在的に2倍になることも明らかです。運が悪い場合、状態を記録する間、プログラムはすべてのページを書き換え、すべてのページを選択する必要がありますRAMの2番目の物理ページ。 つまり、運が悪いと、スナップショット中にRAMコストが2倍になります。 実際には、状況は常に穏やかですが、スナップショット中のRAMの「需要」は必然的に増加します。 RAMが不足しているためにプログラムを停止せずに彼を満足させるには、スナップショットの少し前に準備し、変更されたディスクページに書き込みます。そうすれば、他の場所で緊急に必要な場合は物理メモリページから「奪う」ことができます 繰り返しますが、注意深い読者は、ディスクへの書き込みは積極的であるが、他の目的のために既に上で述べられていることを見るでしょう。



予防記録により、別のメトリックが改善されます。 スナップショットレイテンシー-「写真を撮る」からディスクに写真を記録するまでの時間。



このすべてが今日完全に実装されており、OSのカーネルで動作することに注意してください。



この時点で、セミコロンを挿入します。 しばらくしてから、前のトピック-同期プリミティブ-とこのトピックをリンクする記事を書きます。 つまり、永続メモリに同期プリミティブを実装する問題について記述します。



そして、これはすでに適切に行われていないことに関する記事になります。 つまり、かなりの程度まで、質問で構成されます。



All Articles