リアルタイムシステムでのx86アーキテクチャでの鉄の使用に関する投稿の続き。 そこで、x86がリアルタイムの要件をどのように満たし、それが何を妨げるのかを簡単に説明しました。
少し叙情的な余談。 リアルタイムシステムは、コンピューターの進歩を最もよく知らないエンジンの1つです。 たとえば、彼らのおかげで最初のラップトップコンピューターが作成されました。 何らかの理由で、最初のシリアルラップトップはOsbornであったと考えられています。 実際、上の写真のデバイスは、Osbornの2年前に産業オートメーションを制御およびプログラミングする手段としてSiemensで作成されました。 このファミリーのラップトップコンピューター(Siemens Simatic)は現在生産されていますが、もちろん鉄は何度も変更されています。
しかし、ビジネスに取りかかりましょう。 このトピックでは、リアルタイムコードの実行時間の予測可能性を妨げる要因の1つについて説明します。 カットの下は長くはありませんが、退屈なテキストになります。
キャッシュの効果的な使用は、リアルタイムだけでなく、ほとんどのワークロードに役立ちます。 非常に重要な例-1つのコアで、1ミリ秒ごとに起動し、センサーをポーリングし、PLCコードを実行し、ハードウェアの一部を制御するコード実行。 同時に、GUIコードはもう1つのコアで実行されます。これにより、モニターにこれらすべてが表示され、オペレーターが介入できるようになります。 最新のGUIは非常に「厚く」、利用可能なすべてのキャッシュを使用します。これは、ちなみに、最初のコアで一般的です。 そのため、リアルタイムコードが起動すると、一般的なキャッシュでそのデータを見つけることができません。数十または数百マイクロ秒を費やして、再びメモリからドラッグする必要があります。
一般に、x86アーキテクチャは、キャッシュをプログラムで管理するための多くの機能を提供しません。 これらすべての方法をリストしますが、片方の手に十分な指があります:
1. PREFETCHx-メモリからキャッシュにラインを引く前に
2. CFLUSH、WBINV(ちなみに非常に「悪」なコマンド)-ラインまたはキャッシュ全体を「リセット」
3.非一時的COVNTDQ / MOVNTDQA / MOVNTPS、順序制御(L / S / MFENCE)-一部のデータ操作のキャッシュ可能性の制御
4.あらゆる種類の間接的な方法。 ここでは、データを保存してアクセスするためのトリッキーな方法、たとえば、より使いやすいプリフェッチャーを意味します
5. DMAを介した直接キャッシュエントリ。 このあまり一般的ではない機能は、周辺機器メーカーに関連しています。
キャッシュを完全に無効にすることもできますが、どういうわけか極端すぎます。
ご覧のとおり、これらのメソッドの中には、たとえばキャッシュロックダウンに類似したものはありません。これは、ARMにある機能、または同様のMIPS機能です。 キャッシュスライスを予約することは、たとえば上記の場合のように、リアルタイムコード開発者にとって便利です。 いつか似たようなものがx86に現れる可能性がありますが、これは透過的なメモリ操作のイデオロギーと矛盾します。 しかし今のところ、緩和剤を使用できます。
この図は、物理アドレスとキャッシュ内のアドレスが5ビット共通であることを示しています。 まあ、それは起こった-ちょうど幸運。 これにより、物理メモリをページごとに32色で「色付け」できます。 なんで? OSのカーネルは、アプリケーションのアドレススペースを作成するときに、1色のみの仮想メモリを提供できます。 キャッシュの主な消費者に異なる色のメモリが与えられている場合、それらのデータはキャッシュからお互いを絞り出すことができません。
上記の例では、両方のタスクに異なる色を割り当てると、問題が解決されることは明らかです。 GUIのキャッシュは少なくなりますが、オペレーターがブレーキに気付かない可能性が非常に高くなります。 もちろん、大きな欠点が1つあります。仮想メモリについてしか話せません。カーネル内の何かが大量のキャッシュを必要とする場合、それを止めることはできません。
同じ方法がWindowsおよびFreeBSDカーネルで使用され、連想キャッシュ内のネットワーク間でメモリをより均等に分散します。 キャッシュの結合性が低いことを考えると、これは非常に重要なので、無駄に失われることはありません。 このアプローチを使用するために、プログラマーには何も必要ありません-OSがすべてを行います。 しかし現在、これらのプロセスを分離するためにキャッシュの色付けを使用している実稼働OSはありません。非公式のパッチのみがあります。
さて、ところで、私はすべてのリアルタイムx86開発者がCステートとSpeedstepを無効にすることを忘れないことを願っています。
ちなみに、このトピックで使用した英語のロシア語の置き換えを誰かが知っている場合は、コメントでお知らせください。テキストで修正します。