Windows CEの実行単位とそのスケジューリングについて

語ろう。Windows NT/2000/XPを含むNT系 Windowsでは、タスクという概念はなく、あるのはプロセスとスレッドだ。これは、UNIXLinuxと共通する概念で、今では最も一般的な考え方だろう。NT系 Windowsは、MS-DOSの歴史も含めて、UNIXのアーキティチャから来たものが多いので、当然といえば当然だろう。スレッドのことを昔のSUN-OSなどではライトウェットプロセスなど呼んでいたこともたったが概念的にはスレッドのはしりだ。
昔から、プロセスとスレッドの関係を説明する判り易い例として、えんどう豆というのがある。別に、いんげん豆でもそら豆でもいいのだが、えんどう豆をちょっと想像してみてもらいたい。さやの中に、豆がいくつか収まっている。このさやにあたる部分がプロセスで、そしてその中の豆がスレッドだ。かつてマルチスレッド登場以前はプロセスが実行の基本単位かつ実態であった。C言語でいえば、main()から始まるMS-DOSの.EXE 形式のプログラムがまさにそれである。だが、MS-DOSUNIXと違ってマルチプロセスで動作しているわけではないので、厳密にはプロセスと呼ぶのはどうかと思うが、ここではプロセスということにしておこう。さてマルチスレッドが登場すると、1つのプログラムの中に実行の実態が複数存在することになった。main()以外にも実行の実態があるわけで、そうなってくるとmain()=プロセスというわけにはいかない。そこでちょっと概念を変えて、プロセスは実行の実態ではなく、「入れ物」ということにしようという発想が生まれてくる。こう考えると非常に都合がいい。実行の実態はプロセスではなく、スレッドになる。では、main()から始まるスレッドはプロセスを代表するスレッドだから、これを代表スレッドとしましょう。ということになる。最初のスレッドを代表スレッド、あるいはプライマリースレッドと呼び、2番目のスレッドをセカンダリースレッド・・・と続けて呼ぶこことになった。
かくして、このようなモデルができあがり、UNIXの世界では、POSIXスレッドという標準になった。MS-DOSではかつてVer7.0でマルチタスクになるという噂もあったが、結局それを実現したのはWindows 95になってからだった。ところでWindows CEもこのモデルだ。補足するが、Windows CEのスケジュール基本単位はプロセスではなくスレッドだ。しかも、スレッドには親子関係がない。なので、先ほど説明した代表スレッドとそれに続くスレッドとの実質的な違いはない。.EXEを実行した時、mainを呼び出すスレッドがたまたま代表スレッドだというだけのことだ。
さて、批判もあろうかと思うが、ITRONのタスクに相当するのは、あえていうならばこのスレッドではないかと思う。とすれば、皆さんもご存知の通り、プロセスは、.EXE形式のファイルから起動し、その中にスレッドが存在するわけだから、1つの実行プログラムの中にITRONのタスク環境に似たものが実現できることは安易に想像がつくのではないだろうか。先の、のえんどう豆のさや全体がITRONのタクス環境全体で、豆が個々のタスクというわけだ。Windows CEにおいて、スレッドは CreateThreadによって生成する。勿論プライオリティを設定することもできる。ITRONではCRE_TSKによってタスクを生成し、STA_TSKやACT_TSKで起動するわけだが、これをあえてスレッドで行うならば、CreateThreadをCRETATE_SUSPENDオプションで呼び出し、その後、ResumeThreadを呼び出すとスレッドが走り出す。付け加えておくが、Windows CEは、NT系 Windowsとは異なり、組み込み用途向けにカーネルが再設計されている。Windows CEでは、優先度に基づくプリエンプティブなイベントドリブンでスレッドのスケジュールがなされる。この違いは、ある無限ループするプログラムをWindows XPで動作させた時とWindows CEで動作させた時の動きの違いではっきりと判る。Windows CEでは無限ループより低い優先度のスレッドにCPU時間が割り当てられことは原則としてない。Windows XPリアルタイムOSではないが、Windows CEリアルタイムOSなのだ。
Hiroyuki Shimizu/CodeGear,Inc.