Svchost.exe ( Service HostまたはSvcHost ) は、Windows NTファミリのオペレーティング システムで1 つ以上のWindows サービスをホストできるシステムプロセスです。[1] Svchost は共有サービス プロセスの実装に不可欠です。共有サービス プロセスでは、リソースの消費量を削減するために、複数のサービスが 1 つのプロセスを共有できます。複数のサービスを 1 つのプロセスにグループ化すると、コンピューティング リソースが節約されます。Windows プロセスの作成には、他のオペレーティング システム ( Unixファミリなど) よりも時間がかかり、多くのメモリを消費するため、この点は NT 設計者にとって特に重要な考慮事項でした。[2]ただし、サービスの 1 つが未処理の例外を引き起こすと、プロセス全体がクラッシュする可能性があります。また、コンポーネント サービスの識別は、エンド ユーザーにとってより困難になる可能性があります。さまざまなホスト サービス、特にWindows Updateに関する問題[3] [4]が、svchost に関連するものとしてユーザーから報告されています (また、マスコミの見出しにもなっています)。
svchostプロセスはWindows 2000で導入されましたが[5]、共有サービスプロセスの基盤となるサポートはWindows NT 3.1から存在していました[2]。
実装
実行可能イメージ%SystemRoot% \System32\Svchost.exeまたは%SystemRoot% \SysWOW64\Svchost.exe (64 ビット システムで実行される 32 ビット サービスの場合) は複数のインスタンスで実行され、それぞれが 1 つ以上のサービスをホストします。
SvcHost で実行されるサービスは、動的リンク ライブラリ(DLL)として実装されます。各サービスのレジストリ キーには、 Parametersサブキーの下に、それぞれのサービスの DLL ファイルを指すServiceDllという値が必要です。それらのImagePath定義は、 ; (つまり、netsvcs )の形式です。同じ SvcHost プロセスを共有するサービスは、同じパラメーターを指定し、SCMのデータベースに 1 つのエントリを持ちます。SvcHost プロセスが特定のパラメーターで初めて起動されると、HKLM \SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchostキーの下で同じ名前の値を検索します。これは、サービス名のリストとして解釈されます。次に、ホストするすべてのサービスを SCM に通知します。SCM は、受信したサービスに対して 2 番目の SvcHost プロセスを起動しません。代わりに、コンテキスト内で起動する必要があり、SvcHost がロードするそれぞれの DLL を含むサービスの名前を含む「開始」コマンドをそれぞれの SvcHost プロセスに送信するだけです。
%SystemRoot%\System32\svchost.exe -k %service group%
2003年のマイクロソフトのプレゼンテーションによると、共有サービスの最小ワーキングセットはスタンドアロンプロセスの800KBではなく約150KBです。[6]
Windows 10 のサービス ホストのグループ化の変更
Windows 10 バージョン 1703 以降、Microsoft はサービスをホスト プロセスにグループ化する方法を変更しました。3.5 GB を超えるメモリを搭載したクライアント コンピュータ システムでは、サービスは共有ホスト プロセスにグループ化されなくなりました。代わりに、各サービスは独自のプロセスで実行されます。これにより、サービスの分離が向上し、コンピュータ システムのサービス障害や脆弱性に対する耐性が高まり、デバッグが容易になります。ただし、メモリのオーバーヘッドがいくらか追加されます。[7]
サービスタグ
Windows Vista 以降、共有プロセス (svchost を含む) 内のサービスの内部識別は、いわゆるサービス タグによって実現されます。各スレッドのサービス タグは、そのスレッド環境ブロック(TEB) の SubProcessTag に格納されます。このタグは、Windowsスレッド プールAPIによって間接的に作成されたスレッドを除き、メイン サービス スレッドがその後開始するすべてのスレッドに伝播されます。[8]
サービスタグ管理ルーチンのセットは、現在文書化されていないAPIですが、 netstatなどの一部のWindowsユーティリティでは、各サービスに関連付けられたTCP接続を表示するために使用されています。ScTagQueryなどのサードパーティツールもこのAPIを使用しています。[8]
ホストされたサービスの識別と管理
Windows XP以降のエディションでは、このコマンドはtasklist /svc、リストされている各プロセス (つまり、実行中の svchost.exe の各インスタンス) によって実行されているサービスの一覧を表示します。svchost プロセスの各個別のインスタンスは、一意のプロセス ID 番号 (PID) によって識別されます。
Windows VistaおよびWindows 7では、 Windows タスク マネージャーの [サービス] タブにサービスの一覧が表示され、そのグループとプロセス ID (PID) が表示されます。タスク マネージャーの [プロセス] タブで svchost インスタンスを右クリックし、[サービスへ移動] を選択すると、そのサービスの一覧に切り替わり、対応する svchost インスタンスで実行されているサービスが選択されます。
Windows 8では、タスク マネージャー インターフェイスが合理化され、各 svchost エントリを 1 回のクリックで展開して、その中で実行されているサービスのサブリストを表示できるようになりました。
Sysinternals Process Explorer (Microsoft から無料でダウンロード可能) は、ユーザーが Process Explorer で svchost インスタンスの上にマウスを移動すると、svchost.exe プロセスで実行されているサービスに関する追加情報を提供し ます 。
上記のいずれの方法でも、ユーザーは svchost インスタンス内で実行されている複数のサービスのうち、プロセッサ、ディスク、ネットワーク、メモリなどの特定のリソースにアクセスするサービスを特定できません。Windows リソースモニターは、プロセス レベルでそれらのリソース (のほとんど) のみをカウントします。ただし、サービス レベルでは、"CPU" タブにプロセッサの使用状況が表示されます。[9]サービス対応の TCP 接続と開いている UDP ポートのリストは、コマンドを使用して取得できますnetstat -b。[10]
svchost インスタンス内で実行されているサービスに関するその他の種類の問題をトラブルシューティングするには、問題の原因と疑われるサービス (すべて) を再構成して、各サービスが独自の svchost インスタンス内で実行されるようにする必要があります。たとえば、sc config foo type= ownは「foo」という名前のサービスを再構成して、独自の svchost インスタンス内で実行されるようにします。タイプを共有に戻すには、同様のコマンドを使用します。このような構成変更を有効にするには、サービスを再起動する必要があります。ただし、このデバッグ プロセスは万能ではありません。場合によっては、ハイゼンバグが発生し、サービスが個別に実行されると問題が解消されることがあります。[11]
より複雑なトラブルシューティング方法は、分離されたサービスグループを作成することです。[12]
Windows 10では、リリース1703以降、svchostはMicrosoftによって再設計され、利用可能なシステムメモリに応じて、プロセスごとに1つのサービスのみをホストするようになりました。[13]デフォルトの設定では、システムに少なくとも3.5 GBの RAM。
参照
参考文献
- ^ ルシノビッチ、ソロモン、イオネスク (2009:302)
- ^ ab “Shared Services”。2014年10月6日時点のオリジナルよりアーカイブ。2014年10月1日閲覧。
- ^ Woody Leonhard (2013 年 12 月 16 日)。「Microsoft は Windows XP の SVCHOST レッドラインの問題を「できるだけ早く」修正することを約束」。InfoWorld。2014年10 月 1 日閲覧。
- ^ 「Svchost.exe は修正される前に悪化する - シリーズ - Windows Secrets」 。2014年10 月 1 日閲覧。
- ^ 「サービス ホスト (svchost.exe) 関連の問題をトラブルシューティングする方法」 。2014年10 月 1 日閲覧。
- ^ David B. Probert、「Windows サービス プロセス」
- ^ 「Windows 10 でのサービス ホストのグループ化の変更」。Microsoft。2021 年 8 月 27 日。2021 年 1 月 10 日閲覧。
- ^ ab ルシノビッチ、ソロモン、イオネスク (2012:335)
- ^ 「Windows 7 で複雑なツールを使わずに SVCHOST.EXE の CPU 使用率が 100% になる理由を理解する - Scott Hanselman」 。2014年10 月 1 日閲覧。
- ^ これが役に立つかどうかは疑わしいですが、通常は実行中の Web ブラウザーのサービス名のみが表示されます (たとえば、インターネット接続や使用中のポートに関連するさまざまな情報項目が一覧表示されますが、それらはすべて単に「firefox.exe」としてログに記録されます)。
- ^ 「svchost.exe とは何ですか? また、なぜこれほど多くのインスタンスが存在するのですか?」 。 2014 年10 月 1 日閲覧。
- ^ 「SVCHOST.EXE トラブルシューティングの開始」 。2014年10 月 1 日に閲覧。
- ^ 「Windows 10 でのサービス ホストのグループ化の変更」。Microsoft。2018年4 月 30 日閲覧。
さらに読む
- マーク・ルシノビッチ;ソロモン、デイビッド。 Alex Ionescu (2009)、Windows® Internals (第 5 版)、Microsoft Press、ISBN 978-0-7356-2530-3
- Russinovich, Mark ; Solomon, David; Ionescu, Alex (2012)、『Windows Internals. Part 1 (第 6 版)』、Microsoft Press、ISBN 978-0-7356-4873-9
外部リンク
- svchost.exe 終了
- Scタグクエリ
