2010年1月23日土曜日

モバイルOSのプリエンプション

最近iPod touchを買いましたが、やはりすごく良いですね。

何が良いのか。やはり何といってもサクサクとした動作。私は他にも某社のモバイル端末を使っていますが、はっきり言って雲泥の差という感じ。

何がこの違いの原因なのか。それは恐らくOSの造りが根本的に違うからでしょう。iPod、iPhoneのOSは所謂ノンプリエンプティブマルチタスク、つまり同時に複数のタスクが実行されません。一方、Windows Mobileを含むWindows OS、Linux等は所謂プリエンプティブ、つまり複数のタスクを同時に実行します。(昔のWindowsはノンプリエンプティブでしたが…)

明かにプリエンプティブの方が優れているように思えますが、どうでしょう。

OS君の立場で考えると、プリエンプティブを実現するのはかなり大変。何ミリ秒単位でタスク切り替え処理が実行され、物凄いオーバヘッド。タスクを切り替えられるかどうかを制御するのも大変です。

そもそもプリエンプティブって、まだコンピュータがデカくて高価だった時代に、「皆で仲良く使いましょうね」という考えを実現するためにできた概念だと私は理解してます。それがいつの間に「パーソナル」コンピュータ (パソコン) 用のOSに使われるようになり、更にはモバイル端末にも広がりました。

一方プログラマの立場からすると、プリエンプティブを実現するのはかなり楽しいし、プリエンプティブでないOSなんてダサい。個人的には、エンジニアのこういうこだわりが、プリエンプティブなOSが半ば当たり前な現在の状況を作り出したんじゃないかと思ってます。

そもそも使う人間が一人である以上、頑張ってきちんとしたマルチタスクを実現する必要がどれ程あるのか。既存のOSを使い回したりプロセッサの進化を期待するのも良いですが、使う側が本当に必要なものは何かを見落とさないようにすることが大事ですね。

8 件のコメント:

まなか さんのコメント...

一言でいうと設計の違い。汎用OSとして設計されているか、ケータイというある種特化されたOSとして設計されているかの違いです。
某社の重いモバイルOSはもともと組込み市場をターゲットに汎用性を高く設計されてます。よって様々な拡張性を持たせた設計になっています。

なんか言い訳のようなコメントになってしまうので、続きはオフラインで。(^ ^;

ちなみに、ケータイでもマルチタスクは今時必須でしょう。ケータイを通話だけに使う人も最近は少ないようだし。

Unknown さんのコメント...

書き方がわかり辛くてすみません。私が言いたいのはマルチタスクが不要ということではなく、「プリエンプティブ」が不要なのではないかということです。

ケータイでもマルチタスクは必要でしょう。ただ、厳密な意味でプロセスが並行動作する必要があるのか?というのが私の疑問です。バックグラウンドでサーバープログラムを沢山走らせる必要なんてあまりないでしょうし。(まぁもしかするとそういうこともあり得ると想定されているのかもしれませんが…^ ^;;)

まなか さんのコメント...

なるほど、プリエンプティブはある程度リアルタイム性処理を行うための割り込み処理を考えると、やっぱり必要なのでは?

Unknown さんのコメント...

割込みには、イベント毎に発生するものと、プリエンプションを実現するために一定時間毎(数ミリ秒毎とか)に発生するものがあり、前者にきちんと対応できれば、リアルタイム性の問題はないのではないかと思います。プリエンプションは、例えばバックグラウンドでメールサーバを動かすといった「厳密な」並行動作までサポートします。

ただ、昨今のOSはいろいろな「サービス」がバックグラウンドで動いていたりするので、話しはもっと複雑だと思います。

hassy さんのコメント...

チャットしながらメールが見れればそれでいいです。iPhoneはできないんじゃなかったっけ?

Unknown さんのコメント...

チャットとメールは、必ずユーザーの操作等のイベントで切り替わると思いますので、ノンプリエンプティブでも実現できると思います。

「プリエンプションが不要なのでは?」という疑問は、「バックグラウンドでプロセスを動作させるような設計は不要なのでは?」とも言い換えられるかもしれません。

匿名 さんのコメント...

面白い見方ですね。タイムスライスが必要なOSというのは、とくにバックグラウンドのためではなく(計算ががんがん動くような汎用機ではタイムスライスすら止めてしまっています)OSがたまに動いて、システムを正常に保つために必要な動作だと思っています。iPhone のプロセスがひとつでそのなかで動作させていく作りだとすれば、それは割り込み動作その他、そのなかで動くとしてOSみたいなつくりと言えるかもしれません。携帯は、いまやLinuxのオープンソースで積み上げられていて、複数のプロセスを渡り歩きながら動いているのが普通かと。もし、OSがたまに正常かチェックしてあげないと暴走し続けるやつが出るかもしれないなんて心配があったりしないですかね。昔のノンプリエンティブなOSも知っていますが、OSですら、プリエンティブに作らえれているのは意味があるからだと思います。あまり最近のOSは知りませんが。

Unknown さんのコメント...

コメントありがとうございます。

はい、私も昔通信事業者向けにリアルタイムOSのスケジューラ周りの開発に携わっていたことがあるのでわかりますが、割り込み禁止等を駆使してリアルタイム性を担保していました。

システムを正常に動かすためにタイムスライスに分けるという考え方は、個人的にはちょっと危険に感じます。究極的にはタイムスライスに分けても正常に動くかどうかなんて保障できない訳ですし、タイムスライスに分ける方がソフトウェア的には複雑になるので、必ずしもより正常に動くとは言えないからです。(例えばデバイスドライバ等では、割り込み禁止等をきちんと実装していないと、突然処理が別のプロセスに切り替わって、多くの場合OSがクラッシュします。)

多くの携帯のOSがLinuxを採用し始めているという点も、私は危機感を覚えています。まぁ恐らくカーネルをそのまま使っている訳では無く、携帯独特のリアルタイム性を担保するために手を入れているとは思いますが…。(ちなみに、Linuxにはリアルタイム性を追求したディストリビューションが存在したりします)

「OSに作らえれているのは意味があるから」とのことですが、そもそも今のOSの基礎はUNIXから始まっていて、当初からプリエンティブでした。それは、マルチタスク・マルチユーザーを実現することを重視した結果できたものです。当時はもちろん今のような携帯電話に"OS"が搭載されるなんて、誰も考えていなかったでしょう。