Windowsベースの組み込み機器開発に役立つ「ソフトリアルタイム機能」とは:Windows 11時代に突入するIoT機器向けWindows(3)(1/2 ページ)
2021年10月に正式リリースされたWindows 11。組み込み機器向けあらためIoT機器向けのWindowsは、このWindows 11の登場によってどうなるのだろうか。本連載では、何が変わるのか、そして何が変わらないのかを中心に最新情報を紹介する。第3回は、Windows 10 IoT Enterprise 2021 LTSCで追加された「ソフトリアルタイム機能」について解説する。
今回は本連載の最終回として、Windows 10 IoT Enterprise 2021 LTSCで追加された「ソフトリアルタイム機能」について解説します。
本連載は、Windows10/11 IoT Enterpriseを「IoT(モノのインターネット)機器向け」としていますが、いわゆる組み込み機器でも利用可能なOSであることに変わりはありません。特に、今回取り上げるソフトリアルタイム機能は、IoT機器というよりも組み込み機器としての開発に役立つ機能になります。
⇒連載「Windows 11時代に突入するIoT機器向けWindows」バックナンバー
ハードリアルタイムとソフトリアルタイム
ハードリアルタイムは指定されたタスク(作業)が即座に開始され期限内に完了しなければならない時間的な制約の厳守が求められます。簡単な例としては、自動車のエアバックが該当します。センサーからの衝突信号とほぼ同時に動作しなければなりません。それに対してソフトリアルタイムは期間内に作業が終了しなくても致命的な問題にならないシステムと定義されています。
Windows 10とマルチタスク
Windowsは複数のスレッドに対してそれぞれ一定の実行時間を割り当てます。一定時間実行されたスレッドは時間経過後に停止され、Windowsは別のスレッドに再度実行時間を割り当てます。これをタイムスライスと呼び1つのCPUコア上で複数のスレッドを実行させています。このタイムスライスと実行の順番を決定するのが「スレッド優先度」です。優先度の高い順に割り当てられる実行時間が多くなり、これを管理しているのがスケジューラということになります。
Windows 10 IoT Enterpriseとソフトリアルタイム
先にも書いたように、Windowsはプリエンティブな(preemptive:先買の、先取権のある)マルチタスクOSとして、スケジューラの下で多くのプロセス、スレッドを同時に動作させています。スケジューラがさまざまなスレッドの実行順を決定しているためスレッドは自身の順番が回ってくるまで待つしかありません。
今回提供されたソフトリアルタイム機能は、名前の通り「応答時間を保証」するものではありません。しかしソフトリアルタイム機能を有効にすることで、開発者は指定されたCPUコアでの処理を自身で制御しやすくなります。
Windows 10 IoT Enterpriseのソフトリアルタイム機能は、リアルタイム処理向けCPUコアの予約を可能とします。通常のOS上では、スレッドはOSによってスケジュールされるため開発者は自身のスレッドの動作を予測することができませんでした。ソフトリアルタイム機能では開発者がCPUコアの予約を行えるようになります。予約することで他のドライバやサービス、アプリケーションの動作を指定CPUコア以外に追い出すことが可能となります。
アプリケーションは、予約したCPUコアに自身のスレッドの動作を割り当てることで他のスレッドに邪魔されることなく自身のスレッドを動作させることが可能となります。下記の図1は、4コアの機器上で4コア目をソフトリアルタイム処理用として予約したときのCPUの利用状況です。0、1、2のコアは通常のWindowsの処理が実行されていますが、3コアについてはCPUが利用されていないのが分かります。
ソフトリアルタイムの設定
マイクロソフトが提供するドキュメントの手順に従うことでWindows10 IoT Enterpriseにソフトリアルタイム用の設定を行うことができます。大まかな手順としては下記のようになります。
- CPUのIdle状態に対する設定の変更
- プリフェッチ、診断サービス、オーディオサービス、Windows Updateの無効化
- ソフトリアルタイム用のコアの指定
- ネットワークデバイスがRSSに対応している場合にはRSSの設定変更
- 電源プランの設定変更
- システムのプロパティ(sysdm.cpl)のプロセッサのスケジュールの設定
ドライバ/アプリケーションでソフトリアルタイム用に予約したコアを利用する
ソフトリアルタイム用に予約されたコアはOSが他の処理を割り当てません。このためドライバやアプリケーションは意図しないタイミングで自身が停止することなく処理を続けることができます。
ドライバやアプリケーションは、生成したスレッドをどのコアで動作させるか指定することができます。代表的なAPIは下記のようになります。このAPIを利用してソフトリアルタイム用に予約したコア上で自身のプロセス、スレッドを動作させることができます。
SetProcessAffinityMask
SetThreadAffinityMask
Copyright © ITmedia, Inc. All Rights Reserved.