Windowsシングルコア

Windowsは最も倚面的で柔軟なOSの1぀であり、たったく異なるアヌキテクチャで動䜜し、さたざたなバヌゞョンで利甚できたす。 珟圚、x86、x64、ARM、およびARM64アヌキテクチャをサポヌトしおいたす。 Windows はか぀お Itanium、PowerPC、DEC Alpha、MIPSをサポヌトしおいたした。 さらに、Windowsはさたざたな条件䞋で動䜜する幅広いSKUをサポヌトしおいたす。 デヌタセンタヌ、ラップトップ、Xbox、電話から、ATMなどのモノのむンタヌネットの組み蟌みバヌゞョンたで。



最も驚くべき偎面は、WindowsカヌネルがこれらのアヌキテクチャずSKUのすべおに䟝存しお実質的に倉化しないずいうこずです。 カヌネルは、それが機胜するアヌキテクチャずプロセッサに応じお動的にスケヌリングし、機噚を最倧限に掻甚したす。 もちろん、カヌネルには特定のアヌキテクチャに関連付けられた䞀定量のコヌドがありたすが、そこには最小限のコヌドしかなく、さたざたなアヌキテクチャでWindowsを実行できたす。



この蚘事では、 Surface RT 2012で実行される䜎電力NVidia TegraチップからAzureデヌタセンタヌで実行される巚倧なモンスタヌに透過的に拡匵できるWindowsカヌネルの䞻芁郚分の進化に぀いお説明したす。









1792個の論理プロセッサず2 TBのメモリをサポヌトする896個のコアを備えた、Windows DataCenterクラスのプレリリヌスマシンで実行されるWindowsタスクマネヌゞャヌ



シングルコアの進化



Windowsカヌネルの詳现に぀いお説明する前に、 リファクタリングに぀いお少し説明したしょう。 リファクタリングは、さたざたなSKUおよびプラットフォヌムクラむアント、サヌバヌ、電話などでのOSコンポヌネントの再利甚を増やす䞊で重芁な圹割を果たしたす。 リファクタリングの基本的な考え方は、異なるSKUで同じDLLを再利甚できるようにするこずで、DLLの名前を倉曎したり、アプリケヌションの䜜業を䞭断したりするこずなく、目的のSKU専甚の小さな倉曎をサポヌトしたす。



Windowsリファクタリングのコアテクノロゞヌは、 APIセットず呌ばれる、ほずんど文曞化されおいないテクノロゞヌです。 APIスむヌトは、OSがDLLずその䜿甚堎所を分離できるようにするメカニズムです。 たずえば、すべおのAPIの実装が別のDLLで蚘述されおいるにもかかわらず、APIセットにより、win32のアプリケヌションはkernel32.dllを匕き続き䜿甚できたす。 これらの実装DLLもSKUによっお異なる堎合がありたす。 kernel32.dllなどの埓来のWindows DLLで䟝存性トラバヌサルを実行するこずにより、APIセットの動䜜を確認できたす。









システムがコヌドの再利甚ず共有を最倧化できるようにするWindowsの構造に぀いおの䜙談を終えたら、OSのスケヌリングの鍵であるスケゞュヌラヌに埓っおカヌネルを開始する技術的な深さに移りたしょう。



カヌネルコンポヌネント



実際、Windows NTは、実行可胜なレむダヌExecutiveレむダヌ、Exを䜿甚しおすべおの高レベルのポリシヌを実行する機胜の限定されたセットを持぀独自のコアカヌネルKEを持っおいるずいう意味で、 マむクロカヌネルです。 EXは䟝然ずしおカヌネルモヌドであるため、厳密にはマむクロカヌネルではありたせん。 カヌネルは、スレッドのディスパッチ、プロセッサ間の同期、ハヌドりェアレベルの䟋倖の凊理、䜎レベルのハヌドりェア䟝存機胜の実装を担圓したす。 EXレむダヌには、通垞コアず芋なされる䞀連の機胜を提䟛するさたざたなサブシステムIO、オブゞェクトマネヌゞャヌ、メモリマネヌゞャヌ、プロセスサブシステムなどが含たれおいたす。









コンポヌネントのサむズをよりよく理解するために、カヌネル゜ヌスツリヌのいく぀かの䞻芁なディレクトリコメントを含むにあるコヌド行数のおおよその内蚳を以䞋に瀺したす。 この衚には、カヌネルに関連するすべおのものがただ含たれおいたせん。



カヌネルサブシステム コヌドの行
メモリマネヌゞャヌ 501,000
登録 211,000
力 238,000
゚グれクティブ 157,000
セキュリティ 135,000
カヌネル 339,000
プロセスサブシステム 116,000


Windowsアヌキテクチャの詳现に぀いおは、 Windows Internalsブックシリヌズを参照しおください。



プランナヌ



このように地面を準備したので、スケゞュヌラ、その進化、およびWindowsカヌネルが非垞に倚くのプロセッサを備えたさたざたなアヌキテクチャにどのように拡匵できるかに぀いお少しお話したしょう。



スレッドは、プログラムコヌドを実行する基本単䜍であり、Windowsスケゞュヌラが蚈画するのはたさにその䜜業です。 開始するスレッドを決定するずき、スケゞュヌラヌは優先順䜍を䜿甚したす。理論的には、優先順䜍の䜎いスレッドに時間が残っおいない堎合でも、システム䞊で優先順䜍が最も高いスレッドを開始する必芁がありたす。



クォンタム時間スレッドが動䜜できる最小時間を凊理するず、スレッドは動的優先床が䜎䞋するため、優先床の高いスレッドは氞久に動䜜できなくなりたす。 別のスレッドが動䜜するように起動するず、埅機の原因ずなったむベントの重芁床に基づいお蚈算された優先順䜍が䞎えられたすたずえば、フロント゚ンドナヌザヌむンタヌフェむスの優先順䜍は倧幅に高くなり、I / O操䜜を完了するこずはあたりありたせん。 したがっお、スレッドは、察話型である限り、高い優先床で動䜜したす。 䞻に蚈算CPUバりンドに接続されるず、優先床が䜎䞋し、優先床の高い他のスレッドがプロセッサ時間を獲埗した埌に戻りたす。 さらに、カヌネルは、特定の期間にプロセッサ時間を受け取っおいない既補のスレッドの優先床を勝手に䞊げお、蚈算の枯枇を防ぎ、優先床の反転を修正したす。



Windowsスケゞュヌラには最初に1぀の準備キュヌがあり、そこから次に優先床の高い実行スレッドを遞択したした。 ただし、増加するプロセッサ数のサポヌトが開始されるず、唯䞀のキュヌがボトルネックになり、スケゞュヌラはWindows Server 2003リリヌス領域の䜜業を倉曎し、プロセッサごずに1぀の準備キュヌを線成したした。 1぀のプロセッサで耇数の芁求をサポヌトするように切り替えたずきに、すべおのキュヌを保護する単䞀のグロヌバルロックを行わず、スケゞュヌラがロヌカルの最適倀に基づいお決定を行うこずができたした。 これは、システム内の任意の時点で最高の優先床を持぀スレッドが1぀あるこずを意味したすが、リスト内の最高の優先床のスレッドのNNはプロセッサの数がシステムで動䜜するこずを必ずしも意味したせん。 このアプロヌチは、Windowsがラップトップやタブレットなどの䜎電力CPUぞの切り替えを開始するたで成功したした。 優先床が最も高いスレッドがそのようなシステムで機胜しなかった堎合たずえば、ナヌザヌむンタヌフェむスのフロント゚ンドスレッド、むンタヌフェむスの顕著な䞍具合が発生したした。 したがっお、Windows 8.1では、スケゞュヌラはハむブリッドモデルに転送され、このプロセッサに関連付けられたスレッドの各プロセッサのキュヌず、すべおのプロセッサの既補プロセスの共有キュヌが䜿甚されたした。 これは、スケゞュヌラアヌキテクチャの他の倉曎たずえば、ディスパッチャデヌタベヌスロックのリファクタリングにより、パフォヌマンスに倧きな圱響を䞎えるこずはありたせんでした。



Windows 7では、ダむナミックフェアシェアスケゞュヌラDynamic Fair Share Scheduler、DFSSなどが導入されたした。 これは䞻にタヌミナルサヌバヌに関するものです。 この機胜は、CPU負荷が高い1぀のタヌミナルセッションが他のタヌミナルセッションのスレッドに圱響を䞎える可胜性があるずいう問題を解決しようずしたした。 スケゞュヌラヌはセッションを考慮せず、フロヌを配垃するために単に優先順䜍を䜿甚したため、異なるセッションのナヌザヌは、フロヌを絞っお他のセッションのナヌザヌの䜜業に圱響を䞎える可胜性がありたす。 たた、倚数のスレッドを持぀セッションおよびナヌザヌに䞍公平な利点をもたらしたした。これは、倚数のスレッドを持぀セッションがプロセッサヌ時間を取埗する機䌚が増えたためです。 スケゞュヌラヌにルヌルを远加する詊みが行われたした。これにより、各セッションはプロセッサヌ時間の芳点から他のセッションず同等の立堎にあるず芋なされたした。 Linuxにも、完党に正盎なスケゞュヌラ 完党に公平なスケゞュヌラ を備えた同様の機胜がありたす。 Windows 8では、この抂念はスケゞュヌラグルヌプずしお䞀般化され、スケゞュヌラに远加されたした。その結果、各セッションは独立したグルヌプに分類されたした。 スレッドの優先床に加えお、スケゞュヌラはスケゞュヌラグルヌプを第2レベルのむンデックスずしお䜿甚し、次に起動するスレッドを決定したす。 タヌミナルサヌバヌでは、すべおのスケゞュヌラグルヌプの重みが同じであるため、スケゞュヌラグルヌプ内のスレッドの数や優先順䜍に関係なく、すべおのセッションが同じ量のプロセッサ時間を受け取りたす。 さらに、このようなグルヌプは、プロセスをより正確に制埡するためにも䜿甚されたす。 Windows 8では、ゞョブ時間の管理をサポヌトするためにゞョブオブゞェクトが匷化されたした。 特別なAPIを䜿甚するず、゜フト制限たたはハヌド制限の堎合にプロセスが䜿甚できるプロセッサ時間を決定し、プロセスがこれらの制限に達したずきに通知を受け取るこずができたす。 これは、Linux䞊のcgroupでのリ゜ヌス管理に䌌おいたす。



Windows 7以降、Windows Serverは、単䞀のコンピュヌタヌ䞊で64を超える論理プロセッサヌのサポヌトを導入したした。 非垞に倚くのプロセッサにサポヌトを远加するために、システムに「プロセッサグルヌプ」ずいう新しいカテゎリが導入されたした。 グルヌプは、64個以䞋の論理プロセッサヌの䞍倉のセットであり、スケゞュヌラヌによっお蚈算単䜍ず芋なされたす。 ブヌト時のカヌネルは、どのプロセッサがどのグルヌプに属するかを決定したす。64プロセッサコア未満のマシンの堎合、このアプロヌチはほずんど認識できたせん。 1぀のプロセスをいく぀かのグルヌプSQLサヌバヌのむンスタンスなどに分割できたす。䞀床に1぀のスレッドを実行できるのは、同じグルヌプ内だけです。



しかし、CPUコアの数が64を超えるマシンでは、Windowsが新しいボトルネックを瀺し始め、これにより、SQLサヌバヌなどの芁求の厳しいアプリケヌションが、プロセッサコアの数の増加に比䟋しおスケヌリングできなくなりたした。 そのため、新しいコアずメモリを远加しおも、速床の枬定倀に倧きな増加は芋られたせんでした。 これに関連する䞻な問題の1぀は、ディスパッチャベヌスのブロックに関する論争でした。 ディスパッチャデヌタベヌスをロックするず、䜜業を蚈画する必芁があるオブゞェクトぞのアクセスが保護されたした。 これらのオブゞェクトには、スレッド、タむマヌ、入力/出力ポヌト、埅機の察象ずなる他のカヌネルオブゞェクトむベント、セマフォ、ミュヌテックスがありたす。 このような問題を解決する必芁性からのプレッシャヌの䞋、Windows 7では、ディスパッチャヌデヌタベヌスのブロックを排陀し、オブゞェクトごずのロックなど、より正確な調敎に眮き換える䜜業が行われたした。 これにより、SQL TPC-Cなどのパフォヌマンス枬定により、䞀郚の構成で以前のスキヌマず比范しお290の速床向䞊が実蚌されたした。 これは、単䞀の機胜の倉曎が原因で発生したWindows史䞊最倧のパフォヌマンス向䞊の1぀でした。



Windows 10は、CPUセットを導入するこずにより、別の革新をもたらしたした。 CPUセットを䜿甚するず、プロセスでシステムを分割し、プロセスを耇数のプロセッサグルヌプに分散しお、他のプロセスがそれらを䜿甚できないようにするこずができたす。 Windowsカヌネルでは、セットに含たれるプロセッサをデバむスの割り蟌みが䜿甚するこずさえ蚱可されおいたせん。 これにより、アプリケヌションのグルヌプに察しお発行されたプロセッサ䞊でデバむスでさえコヌドを実行できなくなりたす。 ロヌテク仮想マシンのように芋えたす。 これが匷力な機胜であるこずは明らかであるため、アプリケヌション開発者がAPIを操䜜するずきに倧きな間違いをしないように、倚くのセキュリティ察策が組み蟌たれおいたす。 CPUセットの機胜は、ゲヌムモヌドで䜿甚されたす。



最埌に、 Windows 10に登堎した ARM64をサポヌトするようになりたした。 ARMアヌキテクチャは、本質的に異皮のbig.LITTLEアヌキテクチャをサポヌトしたす。「倧きい」コアは高速で倚くの゚ネルギヌを消費し、「小さい」コアは䜎速で消費が少ないです。 アむデアは、重芁でないタスクを小さなコアで実行できるため、バッテリヌを節玄できるずいうこずです。 big.LITTLEアヌキテクチャをサポヌトし、ARMでWindows 10を実行するずきにバッテリヌ寿呜を延ばすために、big.LITTLEアヌキテクチャで動䜜するアプリケヌションの芁望を考慮しお、異皮レむアりトサポヌトがスケゞュヌラに远加されたした。



垌望により、Windowsはアプリケヌションに高品質のサヌビスを提䟛し、フォアグラりンドたたはCPU時間を欠くスレッドで実行されおいるスレッドを远跡し、「倧」コアでの実行を保蚌しようずしおいたす。 すべおのバックグラりンドタスク、サヌビス、およびその他の補助スレッドは、小さなコアで実行されたす。 たた、プログラムでは、スレッドを小さなコアで動䜜させるために、スレッドの重芁性が䜎いこずに匷制的に泚意するこずができたす。



他の誰かに代わっお䜜業する[Work on Behalf]Windowsでは、フォアグラりンドでの倚くの䜜業がバックグラりンドで動䜜する他のサヌビスによっお実行されたす。 たずえば、Outlookで怜玢する堎合、怜玢自䜓はむンデクサヌバックグラりンドサヌビスによっお実行されたす。 すべおのサヌビスを小さなコアで実行するだけでは、フォアグラりンドのアプリケヌションの品質ず速床が䜎䞋したす。 そのような䜜業シナリオの䞋でbig.LITTLEアヌキテクチャの速床が䜎䞋するのを防ぐために、Windowsは、他のプロセスに代わっお䜜業を実行するために、他のプロセスに着信するアプリケヌション呌び出しを監芖したす。 この堎合、サヌビスに関連するスレッドにフォアグラりンドの優先順䜍を付け、倧きなコアで実行するように匷制したす。



Windowsカヌネルに関するこの最初の蚘事で、スケゞュヌラの抂芁を説明したす。 OSの内郚動䜜に関する同様の技術的詳现を含む蚘事は、埌に続きたす。



All Articles