注釈
Dmitry Zavalishinは、彼の最愛の頭脳の開発の現状について話しました-オリジナルのPhantomOSオペレーティングシステムで、Microsoft Singularityと概念は似ていますが、同時にオープンソースです(このオペレーティングシステムのソースコードのほとんどが公開されました)。
ファイルやプロセスのないマイクロカーネルオペレーティングシステムは、永遠のオブジェクト/スレッド/スレッドのみを持ち、コンセプトレベルでも好奇心をそそり、今では生き生きと読み込まれ、実際の集合プロジェクトに変わる準備ができています。
映像
HD品質のビデオ、フルスクリーンで見る。
ビデオをダウンロードするポッドキャスト
ポッドキャストリンク転写
ビデオのトランスクリプトはStas Fominによって記録されました。
本当に良い方法は? 今日存在するすべてのソフトウェアは、「それを何とかして、どうにかしてすべてを粉砕し、改善し、ここに移動し、ここに修正する」という原則に基づいて行われるという意味で、最終的には、今日、それはレガシーレガシーレガシーであり、ある種のジャンクが開発、開発、開発され、その結果、そのようなすべての層であり、非常に困難で困難です...
私は25年間コンピューターを使用してきました。それ以来、私が始めたコンピューターには、2つの160KBフロッピーディスクと48KBのRAMがありました。 だから、あなたが知っている、それは私が現在持っているものよりも速くロードされ、機能的には私はそれについて同じことをして、プログラムを書いて、いくつかのテキストを編集し、電子メールを読んでいます。 同時に、プロセッサとメモリが変更されました、主なる神...私は数えることさえできません... 5つの注文、6つの注文-これらはすべてどこで失敗しますか? それはまさにそこで失敗し、今日作られているすべてのソフトウェアは、歴史的発展の原理に基づいて作られています。それはとても古く、恐ろしく、悲惨なものです。
「Phantom」はその原理によって生まれました。それが何であるかを考えてみましょう。最初からやりましょう。Linuxカーネルを使用しないでください。Javaを使用することはありません。ゼロから。
このようなアイデアの根底にある考えがいくつかあります。たとえば、そのようなタスクがあります。 私たち全員が開発する最新のソフトウェアを検討しました。
開発者が直面している課題は何ですか? 簡単なことは何ですか? 一般的に言えば、これが私が自分で見つけた方法です。ソフトウェア開発の歴史は、最も古いものから始めて、コンポーネントベースで開発を行う機会をプログラマに与えることです。
つまり、サイドから可能な限り多くを取り、自分でできる限り少なくし、同時にキューブからこのすべてを何らかの形で収集できるようにします。 システム自体でさえ、オペレーティングシステムのアイデアそのものであり、これから生まれました。
OSはどのように生まれましたか? むかしむかし、人々はコンピューター全体を取り、プログラムの1つを取り始めました。 それから、各プログラムでプリンタードライバーを書くことはhemoであることが判明しました;どこかからすぐに準備する必要があります。
ライブラリが登場しました。 その後、これらのライブラリは、アプリケーションプログラムを既に実行するカーネルに変わりました。 だからすべてが徐々に、徐々にすべてが成長し始め、最終的にUnixが登場しました。 Unix、今日、それは明らかに勝ったOSであり、WindowsでさえUnixのイメージで作られており、その基盤となっているコンセプトは明らかに支配的です。
興味深いことに、Unixが登場し、この時代を思い出すのに十分な年齢になったとき、オペレーティングシステムとしてのUnixは非常に奇妙で、既存のすべてのOSに比べて非常に劣っていました。 PDP-11(SM-1600)と呼ばれるマシンがあり、ネイティブOSがあり、Unixがありました。 ネイティブOSは、Unixよりも何倍も高速に動作しました。 それにもかかわらず、彼女は今日亡くなり、Unixは存在します!
なんで? Unixが非常に正しい一歩を踏み出したからです。 それを行った人々は、テキストファイルを固定的な方法で処理する小さなプログラム、外出先で、パイプを介して、またはファイルを介してこれらのすべてのプログラムを、チェーンを問わず収集する非常に単純なアイデアを生み出しました。
プログラミングをせずに外出先でプログラミングを行うこの機会は、本当に聞こえるかもしれないことが判明しました...それは貴重です。 シェルでいくつかのスクリプトを作成し、外出先で、手で何かを収集することができます。
Perlなどの今日の管理ツールは、ほぼ同じ方向で機能することに注意してください。 そのため、外出先で何かをすばやくリベットする機能。
原則として、Phantomは90年代の地域で発生し始めたかなり平凡な考えに基づいていました。 1987年などに登場したC ++言語が登場したとき、すべてのザナタンはオブジェクトプログラミングからのものであり、「さて、何? オブジェクト言語、なぜOS OSは平面的ですか? 客観的にする必要があります。」 さらに、これは一般的に言えば、実用的な考えであり、スローイングや理想主義に由来するものではなく、オブジェクトインターフェースを持つことが非常に便利であるという事実に由来します。 現在の状況を見ると、明らかにそうです。 同じC#、同じJavaは、オペレーティングシステムをオブジェクトラッパーで完全にラップするので便利です。
いいね 次のステップ。 プログラムが通信することを望んでいることは明らかです。 そして、それは興味深いことです... JavaとC#についてのこの会話で、C#のそれについて、そして一般的にはWindowsにOLEがあります。 これは本当です...すみませんが、このツールの野starさは、残念ながらまだ良くありません。 そして、このツールは完全に意味のあるタスクを本当に解決します。
このタスクは、オブジェクトのバンドルから本当にリベットできるコンポーネント環境を構築することです。 つまり、異なる側からモジュールを組み立ててコンパイルし、それらから何かを統一して、何らかの形で稼働中のシステムを組み立てることです。 そして、これも抽象化ではなく、これは特定の状況であり、私たちが働いている分野、産業用制御および監視システムには、異なる、異なる、異なるベンダーによって販売されているシステムのドライバーがあり、それらはすべてCOMオブジェクトとして作られていると言わなければなりません。 COMは完全に勝利した技術であり、彼らに利益をもたらします。
または、別の例があります。これは機会です...ちなみに、あまり使用されることはありませんが、非常に美味しいです。たとえば、元のテーブルにWord文書を埋め込む機能、または何らかの方法でドキュメンタリーをリンクする機能です。
すごいね
私はかつて、Phantomについて最初に話したときの1つで、大きなホールがあり、約200人のプログラマーがいました-「OLEを知っているのは誰ですか?」 そして、30の手が上がりました。 私は尋ねます-「そして、それにいくつのプログラムがありますか? 本当にある種のOLEツールを作成しましたか?」 そして、このような不確実な3人がここにいて、そのうち2人がおよそHello Worldをコンパイルし、3人目が本当に何かを切り抜けてそれをしたことが
わかります[ 1 ] 。
なんで? -非常に難しい。 非常に、非常に、非常に難しい。
ただし、OLEを使用しない場合でも、他のツールのみを使用してください。同じマシンまたは異なるマシンで2つのプロセスを実行する場合、データに応じてそれらを実際に接続する機能は非常に悪いです。
そして、他に何が問題ですか? プログラムのジブルトの通常の自然な表現は、オブジェクトのグラフです。 つまり、プログラムは通常、接続されたオブジェクトのグラフで機能し、プロセス間通信で実際に機能する唯一の方法はパイプです。 つまり、バイトを貼り付けることができる穴です。 つまり、ドキュメントグラフはクロールされず、シリアル化できますが、この場合、あなたが持っていたものから離れます。つまり、その方向にのみコピーできます。 そして、本当にどこかに、共通のデータで一緒に作業できるようなツールを提供するために...まあ、OLEはそれをどうにかしてそれを可能にしますが、再びそれは非常に困難です。 しかし同時に、これが貴重な機会であることは明らかです。 なぜ難しいのですか? 何年も前に、ある賢い人が、オペレーティングシステムがプロセスを実行するコアであると言っていたからです。 これらのプロセスは、別々のアドレススペースで動作します。 そしてそれ以来、彼の後ろで、この素晴らしいアイデアが絶えず繰り返されています。 実際、JavaとC#であるマネージ言語、そして一般的に、現在行われているのはマネージ言語のみですが、...一般的に言えば、個別のアドレススペースは必要ありません。言語-メモリを適切に管理し、エスケープされたポインター、他の人のデータの破損に問題はありません。
したがって、先に進んだ場合、管理言語に一歩踏み込んで、オペレーティングシステムレベルでアドレススペースを拒否できます。 そして、思考はこのようになりました-まあ、まあ、私たちはそれを取り、書いた...(画面を見て)このPhantomはそこで働いています...
ロード中ですか?
いいえ、すでに起動しています。動作しているのは彼です。
私たちは2つのプログラムを取り、それらを立ち上げ、彼らは友達を作りました。 他の1人が何らかの種類のPointerを送信しました。共通のアドレス空間があるため、通信は非常に簡単です。 ポインタが投げられ、変更され、あなたはそれを引っ張り、何かを拾い、何かを転送することができ、他の人のデータは文字通りあなたのものになります。 非常に安いIPC。 問題は1つだけです。今、このプログラムを停止しました。Pointerはどこを見ていますか? どこにもないようです。 それらは再起動し、ポインタが古いデータを見ていても、このプログラムは再び実行され、データは別の場所にあり、接続は切断されました。 これを言うたびに、私は一つの例を挙げます。 Photoshopを起動すると、誰もがPhotoshopを起動し、そこにウィンドウが表示され、そのような行がそこから実行され始めます-ここで読み込み、ここに到達し、ここで何かを見つけます...
なんてこった! なぜ彼は一度それを見つけてポインターを思い出せないのですか? 現在存在しているオペレーティングシステムは、一度ロードされたことを何らかの形で覚えておくことができません。 アプリケーションを強制的に閉じます。アプリケーションを閉じると、すべてのメモリが失われます。 そのため、通常の方法ではそれらを接続できません。ファイルを介してのみ、動作が困難で遅い、奇妙で非常に複雑なものを介してのみ接続できます。 プログラムを停止しないようにすることは可能ですか? はい、実際にできます。 実際、プログラムはオペレーティングシステム内に存在し、オペレーティングシステムが永遠に存在するふりをするかもしれません。 再起動して再起動した場合でも、プログラムに通知することは完全にオプションです。 通常、これはLinuxでも必要ありません。
これから何を得ることができますか? これから多くを得ることができます。 この考えが浮かぶとすぐに、私はすぐに思いました-それは良いことです、あなたがこれをすれば、つまり、私は一度プログラムを始めました、そしてそれは私の人生全体で機能し、それは記憶にかかっていて、そこに住んでいます。
ファイルのタスクの重要な部分は、開始と終了の間のプログラムの状態を保存することであるため、この後、ファイルは必要ありません。 私はそれを亡くなったプログラムの魂の貯蔵と呼びます。 プログラムが殺されなければ、彼女の魂は不滅です。 この場合、ファイルは必要ありません。 つまり、おそらくそれらを使用して、そこのどこかにデータをUSBフラッシュドライブに転送し、書き込み、ネットワークに送信することができます。 または何か他のものが、最初にそれは必要ではありません、そして第二に、それは非常に異なる方法で行うことができます。
最近、ある例が思い浮かびました。ミュージシャンが使用する、シーケンサーと呼ばれるプログラムがあります。 ここでは、これらのプログラムはすべて2種類のファイルで動作します。1種類は個人用で、状態を完全に保存します。これは通常、だれにも知られない独自の形式です。 そして、2番目はある種の.midiです。 後で何かを別のプログラムに転送できるように何かを書き込むことができるファイルは、交換フォーマットです。 したがって、この場合、最初の形式はまったく実行できません。 プログラムが起動し、その状態をメモリに構築しました。 マシンがオフになったとき、マシンがオフになったとき、まるでそれがHibernateで行われたかのように、すべて保存され、オンにしました。プログラムはすべて、何も起こらなかったかのように目覚めました。 つまり、彼らは安全にこの状態を保つことができ、仕事を失うことなく、このプログラムを好きなように接続できます。この接続は非常に安価で効果的です。
さらに面白いことが出てきます。 たとえば、1つのアドレス空間でのすべてのプログラムの寿命は、オペレーティングシステムのカーネルで現在行われているコンテキスト切り替えがないため、I / Oが非常に効果的であることを意味します。 コンテキストが切り替えられ、プログラムメモリをページアウトできるため、直接実行することはできません。I/ Oを直接実行することはできません。バッファで個別に実行することができます。 まあ、要するに、いくつかの問題があります。 この場合、これは回避できます。 なぜこれがずっと前にできなかったのですか? そのようなことを行うには、非常に大きな仮想アドレス空間を持つマシンが必要であるため、32ビットではPhantomはあまり意味がありません、つまりそれはありますが、ディスク全体が収まるはずの空間が32ビットであることは明らかです、それはあまり大きくなく、わずか4ギガバイトで、それ以上収まりません。 したがって、実際には、Phantomは概して、64ビットマシンに焦点を当てています。32ビットの場合、これは明らかに電話、または単純な小さなものです。
実際、この概念はシステムの基礎であり、オペレーティングシステムを簡単にするためにアイデアが生まれました。既存のプログラムのプログラマが何らかの方法でそれを利用できるようにする必要がありました。 これには2つの方法が考えられます。
最初の方法は、ネイティブルールです。 Phantomシステムには独自のバイトコード、JavaおよびC#に類似したオブジェクトモデルを構築するインタープリターがあり、独自の言語用のコンパイラーがあり、JavaおよびC#バイトコードからのトランスレーターが書き込まれます。 つまり、理論では、JavaとC#のコード、およびJVMとCLRでコンパイルする言語で記述されたすべてのコードをPhantomにドラッグできると言われています。 さらに、彼の環境は非常に自然で自然であり、このコードはすべて、ポインターを交換するためのこのようなスキームを介して安価な方法で対話できます。
当初は計画されていなかったが、おそらく必要であるという考えが生まれた2番目の環境は、Phantom内のUNIXなど、POSIX互換の環境であり、2つのバリエーションで作成する予定です。1つのバリエーションは単純で基本的です。 PhantomでコンパイルされたUnixアプリケーションを実行するだけです。 つまり、POSIX環境、通常-通常のPOSIX環境です。
2番目はもっと面白いです、作るのが難しいのでそれが判明することを本当に願っていますが、ここには大きな魅力があります-それはPOSIX一貫性のある環境です、つまり、アプリケーションは通常のUNIXアプリケーションです、それはシステムによるスナップショットであり、また動作します永遠に、つまり、このアプリケーションを閉じることはできません。 ファイルの処理を続行します。この場所でマシンの電源を切り、電源を入れるだけで、残りの同じ場所からすべてが開始されます。
まあもちろん、それらの間の何らかの種類の交換も非常に興味深い方法で行われる予定です。 もちろん、最新のオペレーティングシステムがマイクロカーネルにならざるを得ないことは明らかです。もちろん、カーネルにすべてを取り込むことは取るに足らないことです。マイクロカーネルは、主に、カーネル、ドライバー、アプリケーションなどのコンポーネント間の通信手段です。 このための核メッセージパッシングメカニズムがあり、この問題を調査したことが判明しました...今、誰かが知っているなら、そのようなオペレーティングシステムがあり、それはBeOSと呼ばれていました。 かなり前のことですが、Appleを去ったフランス人は、非常に興味深いプラットフォームを作成し、オペレーティングシステムを作成しましたが、どこかで使用されていたものの、会社はバラバラになり、OSはオープンソースに切り替わりましたが、それ以降はうまくいきませんでしたその後、数回実装され、現在はHaikuという名前で存在しています。
この中には、メッセージを渡すという非常にまともなメカニズムが存在し、実際にそれを見て、Phantomにドラッグしました。 つまり、コンポーネントによってカーネルを拡張するためのツールと見なされます。次に、Cコードとオブジェクトコード間の相互作用のためのツールと見なされます。
こっち 画面に何も表示されません。何も表示されないと思います
[ 2 ] ...
すべてがロードされていますか?
いいえ、それがポイントです、私があなたにもたらしたもの、これがコアであり、これが開発プロセスから直接引き出されたコアであり、私はそれで特別なことは何もしなかったと説明します開発プロセスで何かが壊れていることがすぐにわかるように、チェック、プラグ、およびチェックポイント。
しかし、いくつかのことは必要以上に時間がかかります。
実際、Phantomカーネルの仕組み。 それとは異なり...簡単な方法で、Unix上でページングが何であるかを知っている場合、Phantomは一貫したページングを持つオペレーティングシステムです。つまり、仮想アドレススペースの状態が保存されるページファイルで、再起動時に失われません。そして正しい方法で、それは構造化され、再起動されると、システムはそこからすべての状態を上げます。 つまり、正常に機能している場合は、通常のページングを除き、何も記録されません。 完了すると、システムの状態を修正するスナップショットが作成され、システムの状態が修正され、そこから起動して、ほぼ完全に状態が復元されます。
2つのポイントがあります。 実際には、人々はしばしばこれがHibernateとどう違うのか、それは休止状態が明示的に行われる必要があるという点で休止状態と異なります。そうでない場合はすべてを失い、ファントムメモリ構造はスナップショットを時々、あなたに透過的にするように配置されます、痛みもありません。 そして、原則として、コンセントからプラグを抜くだけで、その後電源を入れると、古い状態で再び上昇しますが、数分前、数秒前に遅れて...多くのものに依存します。 そのため、Phantomのスナップショット時間は、そもそも、システムの最初の起動時とそれ以降の起動時では大きく異なります。
システムを最初からインストールした場合は、すべてが新しいので、スナップショットに多くを入れるだけで済みます。 システムが機能した場合...少なくとも1つのスナップショットが機能した場合、その後多くの変更は行われず、次のスナップショットは非常に迅速に発生します。 そして、すべてのチェックとアサートを削除すると、おそらく約5秒かかります。 しかし、私がお見せする現在のカーネルには、これらすべてのチェックが含まれています。次に、インストール直後に生まれたように起動されるようになりました。したがって、スナップショットが作成された後、スナップショットシステムが静かで優れていることを確認するために、一貫性を確認します。Phantomが動作する仮想マシンについて、何らかの理由で故障することを決定しました。
したがって、彼は完全に予想外にコンセントから引き抜かれたと想定します。 ここで、Windowsは非常に思慮深いものになりました。何らかの理由で、すぐにそれを殺したくないのです。 そのような構造の別の価値は何ですか? 事実、Phantomは非常に迅速に起動します...スナップショットを上げるのは何ですか? これは、カーネルが起動し、カーネルが非常に小さいことを意味します。その後、カーネルはディスク上のメモリの場所のマップを見つけ、それをメモリに持ち上げてさらに起動しました。 他のすべてのディスクアクセスは、通常のページフォールトの一部として発生します。これは、まだロードされていないメモリへのアクセスが原因です。 なぜこれが重要なのですか? 現代のコンピューターはデスクトップ型ラップトップから一部の組み込みアプリケーションに常に移行しているためです。 たとえば、私のテレビにはLinuxが搭載されています。 さらに、このLinuxは、なんらかの理由で8秒で起動します。
現代の車では、コンピューターが使用されます。Linuxであっても... Windowsの場合はもちろん災害です。非常に長い時間がかかります。 Linuxであっても、たとえ非常にコンパクトであっても、起動にはかなり時間がかかります。 実際、そのようなニーズがあります。 まず、迅速に起動し、シャットダウンの観点から主張しないシステムが必要です。 車から降りて、鍵はひよこです-イグニッションをオフにし、ポケットに入れて、去りました。 システムが終了しました。 彼らはそれをオンにしました-あなたはそれで何かをしたので、システムはそれがあった同じ場所で動作するはずです、そこの地図を見て、そのような何かが、何らかの種類の操作が行われました。 各操作は、それを残したのと同じ状態にあることが合理的です。 たとえば、ここでいくつかのサーバーシステムについて話すと、私のお気に入りの例-人工呼吸システム-掃除婦が合格し、プラグを抜き、再び電源を入れて、彼は言いました。別のことをします。」 あなたはその人を見て、そこで彼は待っていませんでした。 したがって、私たちはまだこの分野に参入しようとしていますが、これは私たちにとってかなり良い仕事だと思います。
そのため、Windowsはアプリケーションを強制終了する必要があることに同意しました。 しかし、理論的には、彼は今、彼が倒れたときと同じ状態から立ち上がるはずです。これは何によって決定されます。 数字が1つで始まらない場合、数字のある白いウィンドウが表示されます。
どの仮想マシンですか?
これはTPLです。 明らかに、これは白いウィンドウです。これはPhantomアプリケーション自体です。非常にシンプルで、3行あります。
i = i + 1
印刷する
しかし、ポイントは、彼の州によれば、どのような状態がシステムによって引き起こされたかが明確であるということです。 再起動後、状態を保存して復元することがわかります... 仮想マシン-私は答えた。
こっち プロジェクトはどのような状態ですか? 私たちはこれを約2年にわたって行ってきました。まあ、何年にもわたる審議と投棄はないと思います。その間に実験的なコードが書かれ、今日はすべて書き直されたか、別の理由でプロジェクトから捨てられました。 約2年。 概念実証の実装に約1年かかりました。ここでは、外部コードを非常に積極的に使用しました。大まかに言って、プロセッサ制御、メモリ管理、Phantomに固有ではないものなど、標準的な呼び出しからインターネットからすべてを収集しました標準を使用しました。 さらに、基本的なアイデアを実装するオペレーティングシステムが作成されました。
作成され、存在し、機能し、スナップショットが機能し、復元されることが明らかになったとき、タスクはライセンスに対応しないコードからこれらすべてをクリアすることでした。 今日、タスクはLGPLに移行することでした。他のすべてのコード、GPL、およびその他のコードを独自の奇妙なライセンスに書き換えて置き換えるのに約6か月かかりました。 そして今日、カーネルは、通常のライセンスの下で別のシステムから完全に取得されるTCP / IPスタックを除き、他のすべてのシステムはゼロから作成されます。 TCP / IPスタック自体はある程度わかりやすく、グラフィックドライバーがあり、NE2000などの10年前で最も人気のある標準ネットワークカード用の基本ドライバーや、よく知られたRTLがあります。
スナップショットテスト、カーネル開発、一般的に言えば、これらはすべて常にテストする必要があり、ほとんどすべてのビルドが実行されるテストスイートをリグレッション用に作成しました。
偶然にも、私たちの言語のコンパイラはPhantomとも呼ばれますが、現在はそのような作業が行われています。 カーネルは何らかの形でリークされていますが、一般的にはほとんど準備ができており、JavaバイトコードからPhantomへのトランスレーターで作業が進行中です。 Phantomにはなぜ独自のバイトコードがあるのか、なぜJavaを採用しなかったのか、多くの理由がありますが、その1つは言うまでもなくPhantomバイトコードが科学的に...であるということですが、Javaにはネイティブタイプがありますint、float、このようなコンテンツタイプはそのままですが、Phantomには存在しません。すべてのオブジェクトが、本当に、本当に、本当にあります。
原理的には、intを継承することが可能で、... intaインターフェイスを開発します。理由は明らかではありませんが、可能です。 これは特に、Phantom仮想マシンでは絶対的な信頼性が必要だったために行われました。 なんで? Java仮想マシンは、大体... Java、sycharpe、無原則であるため、別のプロセスで動作し、これはこの別のプロセスの個人的な問題です。
彼女が突然何か間違ったことをしたり、転倒したり、クラッシュしたり、間違いを犯したり、データを破壊したりしても、あなたのデータは同じであり、他の誰もそれに触れることはありません。 Phantom仮想マシン、すべての仮想マシン、すべてのプロセス、すべてのユーザーは、1つの共通のアドレス空間で作業します。 これにより、システムにかなり具体的な要件が課されます。
たとえば、通常の仮想マシンであるスタックは、呼び出されたすべての機能が動作する単なるスタックです。 つまり、彼らは次の関数を呼び出しました-それは同じスタックで動作します。
Phantomでは、そうではありません。Phantomでは、それぞれの別個の関数がそれ自身の別個のスタックを作成し、その中に存在します。 なんで? 別のクラスのメソッドを呼び出すことができ、それが間違っていると、スタックで何かを台無しにし、それがあなたのためにそれを台無しにします。 つまり、異なるユーザー間での台無しになります。 これを許可したくなかったので、すべてが非常に、非常に、非常にハードに区切られており、このコード自体は、仮想マシンではJavaよりも効率的ではありませんが、非常に厳格です。 さらに、この決定が正しかったかどうかはわかりませんが、多分私たちはそれを拒否するでしょう、Java仮想マシンはどのように作られたのでしょうか? 彼女には、バイトコード検証フェーズと実行フェーズがあります。 彼らはバイトコードをダウンロードし、それを見ます-「可能です、可能です、可能です...しかしそれは不可能です、彼らはそれを開始しません」。 または「できます、できます、できます、できます、すべてが順調です、私は走ります。」 プロセスでは、これはチェックされません。 Phantomでは、異なる方法で行われ、検証はまったく行われませんが、バイトコードの操作中にすべてがチェックされます。 配列の境界を越えようとする試み、スタックのサイズを越えようとする試み、すべてすべて、これはすべて外出先でチェックされます。 これは明らかにパフォーマンスに影響し、かなり顕著です。 ただし、今すぐこれを行う必要はないかもしれません。いずれにせよ、出荷を行い、現在動作中です。実行中、JITコンパイル中に行われる検証の多くは、おそらく全員に対して静的に行われることは明らかです。 , , , .
別の問題、巨大な問題、システムが大体書かれていたためにひどく苦しんだ問題であり、システムがすでに大体働いているときに問題が実現されたので、これはガベージコレクションです。最初の6か月間または1年でも、システムはガベージコレクションなしで機能し、無駄になり、無駄になり、無駄になり、その後すべてが落ちました。そして、ガベージコレクションを作成し始めたとき、不快なことに気付きました。Normal Phantomは、64ビットマシン上にある通常のPhantomです。アドレススペース、オブジェクト、ディスクのサイズで動作します。つまり、今日-テラバイト、2テラバイト、明日-約10テラバイトです。また、実行する必要があるガベージコレクションは、このすべてのテラバイトまたは10テラバイトで実行する必要があります。そして、今日はガベージコレクションが存在しないことを理解する必要があります。現在実装されているガベージコレクション全体は、「適切なオブジェクト」のアセンブリであり、残りはスローされます。なるほど?つまり、ガベージを収集するには、ディスク上のすべての必要なオブジェクトをバイパスする必要があります。そして、なんらかの方法でこの可能性はありません...既存の部分的なガベージコレクターでさえ、とにかく、それらは不完全です-誰かがそれらを拾い上げるか、この場合は車全体を地獄に止めます、すべてを削除できますが、それが問題です。これは不溶性の問題であるように見えました。テラバイトだけでなくテラバイトも、このテラバイトがすべてメモリ内にあるわけではないためです。実際、システムは本当に必要なオブジェクトのみをRAMにロードし、残りはそこにありますディスク上。このかたばし屋全体でガベージコレクションを開始する場合、一般的に言えば、その上にあるすべてのものをネジから持ち上げる必要があります。 RAM内。私たちは主にオブジェクトのヘッダーに関心があるため、完全ではありませんが、レイズするだけでなく、記録する必要があります...戦争とドイツ人!それは、具体的には、絶対に問題です。夜、彼女がそれをやるのかどうか分からないかもしれないと思い始めました...そこに静かに...完全で恐ろしい苦しみ、私は本当に何をすべきかがはっきりしていなかったので、プロジェクトを殺すかどうか疑問に思いました。 2つのことが救われました。最初に-私はAzulについて読みました。これは本当です、これらの人はテラバイトで、そしてストックでガベージコレクションを作成する方法を学びました。3つでも解決方法があります。状況の2番目の方法では、これらのアルゴリズムの一部によってすべてが悪意を持ってライセンスされていることが判明したため、まだ受け入れていません。微妙な点は何ですか?ガベージコレクションには、非常に古く、親切で簡単な方法があります。これは参照カウントと呼ばれます。オブジェクトへの参照の数を考慮し、ゼロに落とした-オブジェクトはスローされました。堅実、オーク、それは非常に簡単に機能し、生きることさえできますが、オブジェクトのサイクルがある場合、それが保存されないことを誰もが知っています。彼らはリングを作りました、すべての参照はゼロ以上です、彼らはすべて角のどこかにあります、それへの外部リンクはありません、永遠に失われたメモリは行きません。ループブレーカーと呼ばれることが判明したアルゴリズムがあります。彼らは何とか分析し、静かにシステム内のオブジェクトに沿って進み、どういうわけか、これはサイクルですか?サイクルの場合-彼らはそれをカットし、その後、通常のガベージコレクションが終了します。良いことですが、ライセンスの場合は明確ではないので、脇に置くことも決めました。そして、実際に私に起こった3番目のオプションは、ガベージコレクションのトピックに関するすべてをインターネットで検索したときに、これは非常に大きな領域であり、難しいです、著者がトピックに反映した記事を見つけました...最大の問題は何ですかガベージコレクション?すべてを停止し、静かにプログラムをオフにし、静かにすべてを回ることができれば、ガベージコレクションを作成するのは非常に簡単です。また、プログラムが引き続き動作する場合、ガベージコレクションは正しくない可能性があり、間違った方向に間違っている可能性があります。さて、彼女はゴミを見つけられないので、彼女はまだいくつかの正しいデータをゴミと考えるかもしれません、非常に単純な状況が発生する可能性があります、システムはすべてのオブジェクトをバイパスします、ここにいくつかのオブジェクトがあり、そこからのリンクがあると想像してください、システム歩いて、歩いて、歩いて、彼に届かなかった、左側で、右側に行って、そして今度は彼は連れ去られて、以前にバイパスされた左のオブジェクトに与えられました。ここで、彼女が歩いている間、彼女は彼に会わず、彼は投げられ、彼女はまったく彼を裏切らず、同時に彼は非常に正常で生きていました。一方でプログラムを停止しないようにするため、また一方で、すべてのオブジェクトを収集できるようにするために、これらは実行されます...たとえば、このようなことをするために、多くの異なるものが使用されます。仮想メモリシステムを介して、操作中にプログラムがタッチしたすべてのオブジェクトは、特別にライブとしてマークされます。これは完全に通常のスキームです。しかし、今、この問題について議論し、記事の著者は次の面白いことを言った。「プログラム全体の状態の完全なコピーがあれば」-そして「私はオペレーティングシステムを書いています。常に州全体、国のプログラム全体の完全なコピーがあります。」そして、これはこのコンピューターの自然で自然な生活であり、追加で実装する必要はありません。しかし、アイデアは非常に単純です-昨日のバージョンでゴミだったものは今日もゴミです。したがって、昨日のバージョン全体の状態がある場合、ゴミを安全に見つけることができます。ゴミはすでに立っており、どこでも実行されていません。もう変化していません。ディスク上にあります。ゆっくり、静かに、夜間、いつでも、バイパスできます。すべてのゴミを見つけて、現在のバージョンではそれを殺します。ここから明らかな解決策が生まれました。 Phantomには2つのガベージコレクターがあります。現在、1つ、2つ目が開発中です。最初のガベージコレクターはref-countsで作成され、非常に愚かであり、2つの重要なプロパティがあります。常に機能し、リンクがゼロになったことを確認するには非常に短く予測可能な時間が必要です。彼女はゼロになりました-ローカルオブジェクトを殺しました。また、これについても話しましたが、統計によると、システム内のほとんどのオブジェクトは短時間で作成され、1つのリンクがあります。したがって、refcountガベージコレクターは短命のローカルオブジェクトを非常に迅速に削除します。そのため、システム内のメインメモリの売り上げ、refcountを持つガベージコレクターは完全に処理されます。そして、一定の数のサイクルのある長生きするオブジェクトは、徐々に遅延します。つまり、オブジェクトはこのガベージコレクタによって収集されず、スナップショットに陥り、スナップショットが発生した後、長いガベージコレクタが起動します。実際にシステムの写真を実際にゆっくりと、ゆっくりと、静かにバイパスし、ゴミを見つけて、破壊します。なぜ私は実際にこれを恐れないのですか?ガベージコレクターに従事している人々にこれを説明したとき、彼らは私に尋ねました-未完成のオブジェクトがたくさんあり、それらがすべてのメモリを埋めることを恐れていませんか?いいえ、恐れていません。仮想メモリがいっぱいになるためです。まあ、最初に、私たちが持っているドライブなど、そして次に、まあ、まあ、私たちはそれにもう1メガバイト、まあ、2、まあ、100メガバイトを入れます、一般的に言えば、これは現代のドライブには完全に見えません。これは多かれ少なかれ解決された問題です。このタイプのシステムでは正確に発生する多くの問題がまだありますが、Linuxでは発生しません。たとえば、システムコールは通常のオペレーティングシステムでどのように配置されますか?プログラムは機能し、ファイルをオープンしたい、割り込みを入れ、カーネルに到達した、...悪い例です。ソケットから読み取ります。カーネルに入り、ソケットからの読み取りを開始しますが、ソケットには何もありません!何が起こっているの?
彼女はブロックしています!つまり、プログラムがシステムコールに入り、そこで眠りました。データが表示されると、データが起動し、コードに戻って先に進みましょう。これはPhantomでは実行できません。なんで?
なぜなら、ファントムの記憶はどのように配置されているのでしょうか?これはある種の複製不可能なコアであり、さらに上から、メモリのこの部分が永続的に始まり、すべてのオブジェクトがその中に存在します...コアに到達した場合、スナップショットを作成できません。なんで?
カーネルは変更される可能性があるため、次回の起動時に別のカーネルを取得してアップグレードできます。古いカーネルであっても、再起動しても、別の状態になります。そして、コードがカーネル内にあるスナップショットを作成しようとすると、ほとんどの場合爆発します。したがって、「Phantom Development」ルールでは、すべてのシステムコールをブロックすることはできません。私は行った、それを取った-戻ってくる。問題!結局のところ、すべて同じで、どういうわけかブロックする必要があります。ここで、スリープするための完全に愚かなシステムコールがあります。一部は、プロセスがスリープしたいのですが、1、2秒で、何かをする必要があります。次のように解決します。プロセスがそれをブロックできる何かをしたい場合、それは2つの呼び出しに分割されます-最初の呼び出しで、彼は離れてすぐに戻りますが、彼が戻ると、彼はすぐに通常の通常の状態で眠りに落ちます、撮影できるものに。そして、核心は、もしそれが彼にとって重要なことをして、それについて彼に知らせたいなら、彼を起こして、次のシステムコールでそれを取ります。このような難しいモデル。これは他に何ですか、重要なことですか?まあ、一般に、実際には、概して、非自明性はすべてコアの反対側にあります。プログラマーにとって、Phantomは非常に単純なものであり、他のすべてのユーザーと同じシステムであり、その中のプログラムのみが永久に存続します。また、一般的に、間違った関連付けを引き起こすため、私は間違っています。データは永遠に生き続けます!プログラムは強制終了、再起動できますが、通常のスレッドであり、動作も同じです。彼らは絶えず私に尋ねるので-もしプログラムが永遠に生きるが、それが壊れるなら、どうすればそれを殺すことができますか?まあ殺す。奪って殺す。あなたは同じ殺害で殺すか、そこにある十字架をクリックして殺す。この点で違いはありません。彼女が使用するデータだけが残りました。プロセスが停止すると、すべてが残ります。原則として、開発プロセス中に生じたこれらの多かれ少なかれ自明でない考えのうち、ネットワークを介した相互作用の観点から多少なりとも透過的にサポートしたいという要望がありました。一台。さて、私はそのようなオブジェクト環境を作成したので、ネットワーク内でそれを使って何かをしましょう-オブジェクトのリモート呼び出し、そして移行も望ましいでしょう。そこにも、非常に重要な状況が出てくるからです。別のマシン上のオブジェクトへのリンクを作成した場合、最も面白いことが起こる可能性があります。解決できますか???別の車を通してオブジェクト。各マシンの観点から見ると、外部の誰かと接続されていることは意味があるようです。要するに、このオブジェクトの集まり全体はお互いを参照しているだけで、誰もそれを必要としません。これにより、このタイプの環境では、複数のマシンでガベージを収集できる分散ガベージコレクションが必要です。そして、それは私をかなり怖がらせました-まあ、Phantomが全世界、すべてのPhantomsをどこでも打ち負かし、それらがすべて互いに接触し、世界中の車から車へのリンク、そして周りに横たわっているクレイジーな量のネットワークゴミと仮定します殺すことはできず、地球全体に散らばっています。私はそれを責めなければなりません。ネットワークガベージコレクションを実行する非常に単純なアルゴリズムが実際に存在することが判明しました。ネットワークガベージコレクションを許可するだけでなく、個別に実行できる簡単な手順で段階的に実行できることが重要です。つまり、地球全体のすべてのゴミを取り、収集する必要はありません。これは、小さな断片で、別々のマシンで、非常に簡単な方法で行うことができます。マシン上に接続されていないオブジェクトのグループがあり、それらのポインタで外向きにしか見えない場合は、それらを取り、ほとんどのリンクが移動するマシンに追い出す必要があります。これは、第一に効果的です-彼らが生きていて必要であれば、彼らはそこに場所を持っています。そして第二に、それらはそのような反復の過程にあり、最終的には同じマシンで収集され、通常のガベージコレクターによって殺されます。ご質問
多くの質問があるので、habratopikを膨らまさないために、それらをコピーしないことにしました。それらはすべてここから入手できます。同僚の皆さん、Dmitry Zavalishin が来週金曜日(4月29日)にサンクトペテルブルクのApplication Developer Daysで講演するという事実に注目します。あなたは彼と直接話をする素晴らしい機会があります。参加してください!注釈
- 速記者はその時手を挙げた人の一人で(RIT 2010で)、OLEオブジェクトとAXHostを介してVBスクリプトを実行できるOLEオブジェクトの両方を作成し、それらのスクリプトは他のOLEオブジェクトを使用しました...しかし、それは本当に昔の1997年のどこかでした。
- 見る 私たちのビデオスクリーンキャスト録画、すべてがそこに表示されます。
- 会議のウェブサイトのレポートのページ。