マルチタスクを信じるな!

いえ、全然信じていいわけなんですが。


WindowsMobileも、Androidも、かなり綺麗にプリエンプティブマルチタスクで動きます。これは、NTT DoCoMoの「マルチタスク機能」(ほんとにこういう商品名(^^;))や、iPhoneとはちょっと考え方が異なります。

  • シングルタスク

まず、比較対象として、DoCoMoiアプリからいきます。
iアプリは、アプリ内ではマルチスレッドで動きます。また、iアプリと他のネイティブ機能も平行して動きます。ですが、複数のiアプリは同時には動きません。これは、DoJa1.0のころのプロセスモデルをずっと引き継いでいるためです。曰く、「必要な機能にほとんどのハードウェアリソースを割く。その代わり複数の機能は同時に起動しない」という思想が裏にあるためです。
このため、iアプリはハードウェアの機能を使い潰すゲームなどには向いています。OSにプロセス時間を戻さなくてもほとんど問題なく動きますし、ネットワークや外部ストレージもほとんど排他に使えます。
OSはLinux,Symbian,ITRONなど色々ありますが、OS自体は「マルチタスク」(商品名じゃなく一般名詞)ですので、CPUパワーはうまく割り当てられます。
アプリは明確な終了を持ちますが、外部からの終了をハンドルすることができませんので、終了状態を保持することは原理的にできません。


iPhoneは、もうちょっと緩いです。
アプリは「厳密には」複数同時に動きません。アプリは1つしか同時に動かず、それをユーザーが切り替えて使います。
ただし、タスクは「終了時に状態を覚えておき、次回起動時はその状態を復帰すること」を規約的に求められます。なので、使っている側からするとあたかもマルチタスクに見えます。
まぁ、もっともこれは、プログラムを作る人がきちんと規約どおりに作らないとマルチタスクに見えないわけですが・・。あんまりみんな守ってないよね。
アプリは明確な終了を持ちません。

Symbian(Series60)は、大体マルチタスクです。
微妙な言い方なのは、厳密には「プリエンプティブマルチタスク」じゃないから。アクティブオブジェクトという考え方を使って、ノンプリエンプティブマルチタスクで動きます。が、メモリなどが不足してアプリが起動できなくなったときには、特に何もしません。
アプリは明確な終了を持ちます。

WindowsMobileは、きちんとマルチタスクです。
各タスクはきちんとプロセスとしてメモリ空間とCPU時間を持ち、きちんとプリエンプションを行います。ただし、アプリケーションの重さに対してメモリが少なめなため、立ち上がっているタスクは、かなり不定期なタイミングでOS側から「終了要求」が着ます。「終了要求」の来たアプリは
1.今メモリに保持しているものをファイルに書き込んで、メモリを解放する(この時、「最後に開いていたファイル」と「どこを見ていたか」も同時にセーブ)
2.それでもまだ終了要求がくるのなら、プロセス自体を自主的に終了
という手順を求められます。
そして、次回起動した際には「最後に開いていたファイル」と「どこを見ていたか」を元に可能な限り最終状態を再現することを規約的に求められます。
実は、PCのテキストエディタ風の複数のファイルを同時に開くだとか、ファイル名を指定して「保存しないで書き換え」とかは、WindowsMobileの規約的には反しているのです。いや、あまり気にせずにテキストエディタ作ってましたが(笑)。
アプリは明確な終了を持ちません。


Androidも、きちんとマルチタスクです。
ただ、WindowsMobileよりももっと粒度が細かく、もっと精巧にできています。
まず、アプリは画面ごとにActivityという単位で動きます。Activityはそれ単体でメモリとプロセスを持ちます。アプリは、複数のActivityを束ねて動きます。また、アプリはActivityだけではなく、他にもいくつかのコンポーネントで動いていますが、特に切り替えが効くのはActivityです。
もし、メモリが足りなくなったら、「特に使われていない」Activityが優先的に解放されます。この時、アプリ全体が落ちるのではなく、あくまで一部がメモリから解放されるという動きになります。この時、Activityは「どんな状態だったのか」を何らかの形で保持しておきます。
ただし、今最全面に出ているActivityは解放の対象にはなりません。なので、通常動いている限りは裏で動いているアプリについて意識することはありません。
例えばホームキー長押しとか、戻るキーとかでActivityを移動して別の画面を表示させようとしたとき、そのActivityが既に開放されているのであれば、再度Activityがロードして復元されます。これは、アプリ内でも、アプリをまたいでも同じ挙動を示します。
結果として、少ないメモリにもかかわらずほとんど無限のアプリが同時に動いているかのように見えます。ただし、残念ながらActivityを再ロードする際にはちょっとだけ時間がかかるので人間側から見るとバレちゃいますが。
アプリは明確な終了を持ちません。


QTe(Linux Zaurus)も、きちんとマルチタスクです。
良くも悪くも旧来のOSの文法を持ち、メモリの制限を受けます。アプリは他のアプリの機動を契機に落とされることはありません。ただし、メモリなどのリソースが不足している時にはそもそもアプリの起動はできません。
アプリは明確な終了を持ちます。


さて、長々と書いてきましたが、言いたかったのは以下に集約できます。

  • アプリの起動/終了は意識しない方がユーザーには使いやすい(と、している)
  • 今起動したいアプリのためなら、もう使ってないはずのアプリは落としても大勢に影響はない
  • たとえアプリが内部的に落ちても、最後に使ったときの状態を保持しているのならユーザーはアプリが落ちたことを意識しないで済む

これを、シングルタスクで擬似的に実装しようとしたのがiPhoneで、少ないリソースをやりくりして実現しようとしたのがWindowsMobileです。Androidは、そういう意味ではリソースも潤沢ですし、WindowsMobileよりも粒度が細かいのでタスクの切り替えを意識することは少なくできています。
Symbian(S60)やQTeは割と旧来のPC風味のプロセスという考え方をします。タスクの立ち上げと終了はユーザーに任せ、OSがまかなうレイヤーは割合薄めです。
で、これらの立場に立つと、

  • WindowsMobile/Androidでタスクをわざわざ手動で切りたい
  • WindowsMobileにディスク上に仮想メモリを持たせたい

なんてのは、OSの設計からして間違った意見だったりします。どうしてもやりたいのなら、QTeのような旧来風味のOSでやった方が効率的です。
OSにはOSなりの思想と使用想定があり、それに従わない使い方をすると色々不具合が起きるのは仕方がないことだと思います。元々OSを設計した人たちが想定していた最適な使い方(多分、その最適な使い方のときに最大のパフォーマンスが出るようにチューニングしているはず)をするのが、まずは制限環境としては順当なんじゃなかろうか、と、そんな風に思うのです。

ASF(MPEG4/G726)を何とかAndroidの見られるフォーマットにする

いい線までは行くんだけど、音声コーデックでこける。

はなっから変換しようとしてくれない。

なんと、G726でもちゃんと聞ける音声に変換してくれる。すごい。これを動かすくらいのCPU持ってるなら買ってもいいかも(はい、動かせないんです。CPUしょぼすぎて)


とりあえず、iPodと同じフォーマットならHT-03Aでも読めるみたいですね。
それにしても、AVS Video Converterの怪しい日本語はなんだろう(^^;)。「近所の隣人」って、意味がわかるまでしばらくかかりました(Nearest-Neighborね)