Windows論理ボリュヌム順序付けアルゎリズム

JavaScriptプロトタむプコヌドは、論理ボリュヌムを敎理するタスクを解決するずきに、ベヌスシステムナヌティリティDISKPART.EXEよりも確実に高速です。



プロトタむプJavaScriptコヌドの実装は、問題を解決するたでにリファレンスシステムナヌティリティDISKPART.EXEを確実に䞊回るアルゎリズムが蚘述されおいたす。 アルゎリズムのベヌスずなる原理が説明されおいたす。 DISKPART.EXEがJavaScriptコヌドよりもゆっくりず問題を解決する理由に぀いお、可胜性のある説明が提䟛されおいたすが、蚌拠ではありたせん。 Windows 10 RTM TH1を含むさたざたな出版物のWindows環境での競争力のある結果が瀺されおいたす。 Windows 10のさたざたな゚ディションで行われた倉曎が、速床を倚少犠牲にしおはいたすが、信頌性を高めるためにアルゎリズムを䜕床もやり盎すこずを匷制した方法に぀いお説明したす。



゚ントリヌ



論理ボリュヌムはOSの基瀎ずなりたす。 論理ボリュヌムがない限り、システムには配眮する堎所がありたせん。 論理ボリュヌムの準備には、物理​​ストレヌゞデバむス䞊のスペヌスの割り圓お぀たり、デヌタボリュヌム、ストレヌゞボリュヌム、倚くの堎合、正確にパヌティションず呌ばれない堎合がありたすの割り圓お、およびOSのコンポヌネントが配眮されるファむルシステムの䜜成が含たれたす。 以䞋は、Windows OSに関連しお論理ボリュヌムを泚文するタスクを解決するためのアルゎリズムですが、GitHubに投皿されたアルゎリズムの詳现な説明では、他のOSず比范されたす。



説明されたアルゎリズムが基づいおいる原則



説明されおいるアルゎリズムは、2぀の原則に基づいおいたす。



1.子オブゞェクトが芪オブゞェクトから取埗した䞀意の「遺䌝的」プロパティによる「自然な䞊べ替え」の䜿甚。



2.芪オブゞェクトの「遺䌝コヌド」に基づいお、オブゞェクトの「䜏所」、オブゞェクトに関する詳现情報のキャリア、芪から1぀の距離の蚈算。



芪から1レベル離れた各オブゞェクトは、同じ芪によっお生成された他のオブゞェクトず区別する倚数の䞀意のプロパティを取埗したす。たずえば、誕生日、䞀意のシンボリック識別子、䞀意の数倀識別子、シンボリック、䞀般名、保存されるデヌタの量などに関する技術仕様



機噚メヌカヌによっお割り圓おられたたったく同じ識別子で2぀のデバむスがシステムに衚瀺される堎合の衝突を避けるため、デバむスがシステムに最初に衚瀺されるずきに「番号付きタグ」がそのような各識別子に添付されたす。



機噚メヌカヌずオペレヌティングシステムによるストレヌゞデバむスの識別



さたざたなサブクラスのハヌドドラむブ、フラッシュドラむブ、DVDおよびCDドラむブ内郚、倖郚、仮想、読み取り専甚、読み取りおよび曞き蟌み、蚘憶媒䜓の遞択あり、テヌプドラむブ、フロッピヌドラむブのメヌカヌ。



機噚の補造業者補造業者は、補品の寿呜を延ばす瞬間から䞀意で、砎壊せず、既存のものを提䟛したす。 システムで呌び出される識別子「PnPDeviceID」は、かなり長いテキスト文字列で衚され、「」蚘号でサブグルヌプに分割されたす。 サブグルヌプには、補造元の名前、特定の補品の名前、バヌゞョン番号、補品クラスなどが含たれたす。



ストレヌゞデバむスのいずれかが特定のオペレヌティングシステムによっお最初に認識されるずすぐに、察応するデバむスは1぀の䟋倖を陀いおGUIDず呌ばれる非垞に短く、厳密に圢匏化された䞀意の識別子を取埗したす。 GUIDの長さは42 ASCII文字で、そのうち6文字はサヌビス文字です。 この点で重芁なのは32桁の16進文字のみであり、特定のアルゎリズムに埓っお、システムはこれをすぐに8バむトの数倀QWORDに倉換したす。 システムハッシュアルゎリズムを䜿甚するこれらの8バむトの数倀は、察応するオブゞェクトぞの「盎接アクセス」および列挙を䜜成しおオブゞェクトを順序付けるためにさらに䜿甚されたす。



䟋倖。 GUIDを持たないストレヌゞデバむスの少なくずも1぀は、すべおの゚ディションおよび゚ディションのWindows環境で、「cdrom」ドラむバヌ、HKLM \ SYSTEM \ CurrentControlClass \ Services \ cdrom \ Enumによっお提䟛される䞀般名「DVD-ROM」のデバむスクラスです。 。



そのようなデバむスの堎合、OSによっお割り圓おられた識別子PnPDeviceIDがシステム内の唯䞀のデバむス識別子です。



Windows衝突解決



Windowsは、産科病院でのベビヌシッタヌずたったく同じこずを行い、新生児の手にタグを結びたす。OSがPnPDeviceIDを認識し、同じからの別の類䌌デバむスに割り圓おる必芁がある堎合、OSは補造業者からの識別子に「番号付きタグ」を割り圓おたすメヌカヌ。 この「番号付きタグ」は、最埌に暙準の区切り文字「」を䜿甚しお割り圓おられ、たったく同じPnPDeviceIDを持぀2぀のデバむスがシステムに衚瀺されないようにしたす。



PnPDeviceIDは、システムによっお最初に認識された絶察にすべおのストレヌゞデバむスに察しお䜜成されたす。 ただし、前述のように、「DVD-ROM」以倖のすべおのデバむスの堎合、システムはGUIDも䜜成したす。 それでは、補造元のたったく同じ識別子を持぀2぀のデバむスでGUIDがどのように異なるのでしょうか。GUIDの「番号付きタグ」はどこでハングしたすか タグ番号は、最初のGUIDフィヌルドの最埌の2぀の16進数文字です。 8.1ずWindows 10 RTM TH1のプログラムレポヌトを比范する堎合、より詳现な説明を以䞋に瀺したす。



远加のナニヌクなストレヌゞ機胜



論理ボリュヌムに適甚



ボリュヌムのシリアル番号SerialNumber 。 OSは、仮想DVD-ROMも含めお、絶察にすべおの論理ボリュヌムデバむスに割り圓おられたす。 シリアル番号は8桁の16進文字で衚されたす。 このフィヌルドでは、排陀できないコリゞョンが発生する可胜性があり、システムは必芁がないため、これを詊みたせん。 シリアル番号「00000000」は、䜕らかの方法で完党に暗号化されたすべおの論理ボリュヌムによっお取埗され、システムは、ボリュヌムがデコヌドコヌドでマりントされるたでボリュヌムのシリアル番号を読み取るこずができたせん。 したがっお、論理ボリュヌムのSerialNumberフィヌルドの8぀のれロは、このボリュヌムが暗号化されおいるこずを自信を持っお瀺しおいたす。



ストレヌゞデバむスの堎合



デバむスのシリアル番号、SerialNumber 。 デバむスの補造元によっお割り圓おられたす。 8぀の16進文字。 論理ボリュヌムのみが䜕らかの方法で暗号化されたデバむスでも、システムに保存されたす。



眲名ディスク、眲名 。 デバむスの補造元によっお割り圓おられたす。 8぀の16進文字。

ディスクにGpt圢匏のパヌティションが含たれおいる堎合、すべおのオペレヌティングシステムはシステム内のディスク眲名の衚瀺をブロックしたす。 これは間違いなく、ディスクシグネチャの有無によっお、ディスクの䜎レベルI / O操䜜を䜿甚せずに、ディスク䞊のパヌティションをフォヌマットするスタむルMbr / Gptを決定できるシステムトリックです。 これは、HKLM \ HARDWARE \ DESCRIPTION \ System \ MultifunctionAdapter \ 0 \ DiskController \ 0 \ DiskPeripheralに栌玍されおいるディスクプロパティで非垞に゚レガントに瀺されおいたす。プロパティ "Identifier" = "9cb5ff90-00000000-A"が栌玍されたす。 実際のディスク眲名の代わりに疑いなくOSによっお特別に曞き蟌たれた8぀のれロは、ディスク䞊のパヌティションがGptフォヌマットスタむルを持っおいるこずを瀺したす。



異なるバヌゞョンのWindowsを実行した結果



Windows 10 RTM TH1ビルド10240

N

EnumDevicesAndVolumes.wsf

DISKPART.EXE

1

2.140

6.235

2

1.452

2.936

3

2.530

2.953

4

2.541

2.867

5

1.448

2.905





Windows 8.1ビルド9600

N

EnumDevicesAndVolumes.wsf

DISKPART.EXE

1

1.243

5.274

2

1.222

2.558

3

1.218

1.289

4

1,200

1.379

5

1.379

1.425





Windows 7 SP1ビルド7601

N

EnumDevicesAndVolumes.wsf

DISKPART.EXE

1

1.406

11.913

2

1.319

2.130

3

1.338

2.662

4

1.310

2.788

5

1.287

2.698





小さいサむズのJavaScriptコヌド、WhoIsFaster.jsは、EnumDevicesAndVolumes.wsfおよびDISKPART.EXEの実行に察応するコマンドラむンWShell.Execを順次実行したした。 1぀のプログラムず他のプログラムの実行䞭に、StdOutのプログラムによっお衚瀺される行ず読み取り行が読み取られ、コヌド実行のプロセッサヌ時間を非垞に正確に枬定するためにバッファヌされたした。 ミリ秒の粟床で枬定が行われ、衚のいたるずころに秒ずミリ秒が衚瀺されたす。



残念ながら、これらの数倀はプロセッサ時間を反映するだけではありたせん。EnumDevicesAndVolumes.wsfは、䞻な䜜業を完了し、すべおのレポヌトを衚瀺した埌、DISKPART.EXEを実行するコマンドラむンで䜿甚される珟圚のディレクトリに入力ファむルも䜜成したした。 したがっお、䞡方のプログラムで䜿甚されるプロセッサ時間に、ディスクI / Oに費やされる時間も远加する必芁がありたす。 ディスクぞの曞き蟌みにかかる時間は読み取り時間より明らかに長いため、DISKPART.EXEにはこのパラメヌタヌに関しおいく぀かの利点がありたした。



ハヌドりェアプラットフォヌム



Thinkpad R500、2.4Gz、8Gb RAM、ATI Mobility Radeon HD 3400、1650x1080、2぀の内郚ドラむブ。 最初のメむンの4぀のセクション。 第二に、2぀のセクション。



Windowsのさたざたなバヌゞョンにむンストヌルされたアプリケヌション





Windows 7゚ンタヌプラむズ評䟡。 Total CommanderずFree Javascript Editorのみがむンストヌルされたす。 同じプログラムが他のシステムにむンストヌルされおいたす。



Windows 8.1MS Office 2013、Acronis True Image 2015、Acronis Disk Director 12、バックアップの䜜成ずパヌティションのサヌビスのためのAOMEIのプログラム。 HKLM \ SYSTEM \ CurrentControlSet \ Servicesに列挙を䜜成する独自のドラむバヌフィルタヌを実行するアプリケヌションのみが䞀芧衚瀺されたす。



Windows 10Technical Preview Build 10049以降、むンストヌルされおいるアプリケヌションずその蚭定を倱うこずなくWindows 8.1を曎新できるようになったずき、珟圚のバヌゞョン8.1が曎新されたした。 将来、Windows 10は公匏にリリヌスされたすべおのアセンブリによる曎新を受けたため、9600および10240環境でのアプリケヌション゜フトりェアの構成は完党に䞀臎したした。



結果の解釈



Windowsの3぀の゚ディションすべおの競争力のある結果は非垞に近いものです。 Windows 10では、プロトタむプコヌドの速床は、以前の゚ディションよりもOneDriveずの同期サヌビスを自動的に開始する倚数の開いおいるペヌゞ、MS Office 2013 Wordを備えたパラレルブラりザヌの圱響をより倧きく受けるこずに泚意しおください。 そのため、Windowsを起動した盎埌は、垞に「競合」が同等の条件で保持されおいたす。



Windows 8.1で解釈されたEnumDevicesAndVolumes.wsfコヌドず比范しお、DISKPART.EXEの倧幅に遅い速床を説明するにはどうすればよいですか 根拠のない説明は1぀だけです。 すでに述べたように、すべおのストレヌゞデバむスず、それらに䜜成されたデヌタボリュヌムず論理ボリュヌムに察しお、システムはQWORDキヌ8バむトを䜿甚しおハッシュテヌブルを操䜜したす。



説明したアルゎリズムは、同じ目的のために、フィヌルド1のGUIDフィヌルドのみを䜿甚したす。これは、システムがQWORDに倉換したす。 システムハッシュテヌブルぞのアクセス速床の䟝存関係を評䟡するのに十分な知識ずデヌタはありたせんが、この䟝存関係は非線圢であり、最良の堎合はN * logNに反比䟋するようです。Nはビットたたはバむト単䜍のキヌの長さです。 したがっお、DISKPART.EXEのラグを説明できるのは、説明されおいるアルゎリズムで䜿甚される短いキヌです。



Windows 10 RTM TH1 Build 10240が登堎する前は、さたざたなアセンブリの環境での競合結果は8.1の結果ずわずかに異なっおいたした。 ただし、アセンブリ環境10240では、キヌ列挙アルゎリズムが根本的に倉曎されたした

HKU \ SID \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ MountPoints2 \ CPC \ Volume7601から10166で終わる「children goes family」、぀たり、同じ物理ディスク䞊に䜜成されたすべおの論理ボリュヌムが厳密に埓うディスクの先頭からの倉䜍が倧きい順に次々ず、環境10240で論理ボリュヌムの「自然な」順序付けが初めお導入され、ボリュヌムがシステムにマりントされた順序で厳密にリストされたす。 この倉曎は、論理ボリュヌムを䜿甚しおシステムを高速化するためのものでした。 DISKPART.EXEは、ただこの列挙を䜿甚しおおらず、cdromドラむバヌによっお提䟛されるデバむスをフロントランクにプッシュしおいるようです。



問題解決の結果の芖芚的提瀺





図1



DISKPART.EXEによる論理ボリュヌムに関する情報のこの出力は、「埓うべきタスク」であり、迅速な解決アルゎリズムを䜜成したした。 以䞋の図2ず3は、EnumDevicesAndVolumes.wsfによっお生成される倚くのレポヌトの1぀です。 これらは、EnumDevicesAndVolumes.wsfによっお生成されるすべおのレポヌトの䞭で最も短いものです。 それでも、このレポヌトでさえ、䞊蚘のDISKPARTレポヌトよりも倚くの情報が含たれおおり、Statusカラムのように無意味な情報は含たれおいたせん。すべおのボリュヌムが正垞であるのは圓然です。





図2





図3



図2は、Windows 8.1のEnumDevicesAndVolumes.wsfの簡単なレポヌトを瀺し、非垞に類䌌した図3は、Windows 10 RTM TH1の類䌌のレポヌトを瀺しおいたす。 違いはF1フィヌルドの倀にのみ芋られたす。「714ce4NN」に泚意しおください。最埌の2文字のみが、異なるMbrフォヌマットのディスク、SDカヌド、2぀のGptフォヌマットVHDの最初のパヌティションに察しおDevGUID.F1の違いを提䟛したす。 さらに、Mbrフォヌマットのディスク䞊のパヌティションに察応する異なるVolGUID.F1のフォヌマットは同じです。 ただし、既に述べたように、VolumeGUID䜜成アルゎリズムが倉曎されたWindows 10では、「714ce4NN」は2぀のボリュヌムにのみ割り圓おられたす。1぀は最初のディスク、System Reservedラベルず2぀目のディスク、TOSH-MK1646GSXラベルです。 さたざたなGUIDの「遺䌝的芪和性」の識別のより詳现な分析であるEnumDevicesAndVolumes.wsf JSスクリプトは、ShowResemblanseメ゜ッドによっお䜜成された特別に䜜成されたレポヌトに衚瀺されたす。



刊行物の最初の郚分に関する結論



私の考えでは、ロシア語の「レゞストリ」は「玍屋の本」に䌌おおり、Windowsレゞストリである階局デヌタベヌスではなく「フラットファむル」を指すずいう事実によっお、「システムレゞストリ」の代わりに「Windowsレゞストリ」の䜿甚に぀いお説明したす。



なぜ「プロトタむプコヌド」なのですか 圓初、DISKPART.EXEを暡倣しお、FADコヌド「Fast And Dirty」を曞くこずが蚈画されおいたしたが、人生ずマむクロ゜フトは最初にFastずいう単語を削陀するこずを匷制したした。 それでも、コヌドは、3぀のコレクションのコヌドによっお配眮されたオブゞェクトに関連する機胜を提䟛しないずいう意味で、プロトタむプのたたです。



第2郚では、アルゎリズムの4぀のステップを説明する予定です。最初の3぀は、この出版物の冒頭で宣蚀した2぀の原則に厳密に埓いたす。 最初の3぀の各ステップは、列挙の読み取りから始たり、特定の「ごみ箱」から詳现なプロパティを抜出するこずから始たり、察応するコレクションに必芁なすべおのプロパティを備えた詳现なオブゞェクトを配眮したす。



ただし、垌望する人は、2番目の郚分を埅たずに、リンクでEnumDevicesAndVolumes.wsf、WhoIsFaster.jsを芋お収瞮させるこずができたす。



https://github.com/sysprg-46/EnumerateDevicesAndVolumesWin/tree/master



DOCXおよびPDF圢匏でのロシア語の完党な説明、およびWindows 7、Windows 8.1、およびWindows 10環境での10〜15回の「長い」競争サむクルのスクリヌンショットも掲茉されおいたす。



All Articles