Top  Feedback (Main, Sub)  Tips  Software  My Mac  No!CCCD  Link  公開日:2010年02月13日
更新日:2010年04月29日

コラム:iPhoneを考える(第5回)
〜 マルチタスクの実現方法を考える 〜

思いついたことを、とりとめもなく書いてみるコラムです。あまり真面目に読まないでくださいね。(^^;

フィードバック・メニュー | 第1回 | 第2回 | 第3回 | 第4回 | 第5回 | 第6回 | 第7回 | 第8回 | 第9回

green第5回の目次

green マルチタスクが実装されない5つの理由

本コラムの執筆時点では、iPhone OSはバージョン3.1.2。初期の1.xと、サードパーティ製アプリを認めた2.xに続く、コピー&ペーストに対応した3.xです。このバージョンは、いわゆる「シングルタスク」で、この点で他のスマートフォンに劣るとされています。

実際のところ、iPhone OSはマルチタスクを前提として設計されています。ここでいう「シングルタスク」とは、「サードパーティ製アプリは最前面でしか動作できない」という意味でしかありません。そのため、Apple純正のSafariやiPod、そしてOSの各種サービスは、サードパーティ製アプリを含むほかのアプリが最前面で動作しているときも、マルチタスクで動作し続けています。

では、なぜサードパーティ製アプリは最前面でしか動作を許可されていないのでしょうか? これまでに様々な人たちが語ってきた理由を整理してみましょう。

理由1:メモリが足りないから

初代iPhoneおよび第2世代のiPhone 3Gでは、メインメモリが128MBと非常に限られていました。この容量では、常駐アプリ(電話、Mail、iPod、Safariなど)を動作させるだけで、メインメモリに余裕がなくなってしまいます。サードパーティ製のアプリの起動に失敗したので、iPhoneを再起動したら成功した…という経験を持つiPhone 3Gユーザーは、多いのではないでしょうか? これは再起動によって、OSが確保していたメモリが解放されたためです。

256MBのメインメモリを搭載したiPhone 3GSでは、状況は改善されています。しかし、サードパーティ製アプリのマルチタスクが可能になれば、やがてメモリ不足という状況に突き当たります。

理由2:仮想メモリが使えないから

パソコンの場合、メモリが不足しても、仮想メモリを使うことでアプリの起動を可能にします。

では、iPhone OSが仮想メモリを使わないのは何故でしょう? 一説には、HDDの代わりに搭載したフラッシュメモリの制約によるとされています。HDDと異なり、フラッシュメモリは書き込みを繰り返すと寿命が短くなる性質があります。iPhone OSの元となったMac OS Xは、仮想メモリを最大限に利用する設計です。スワップファイルを作成し、頻繁に読み書きします。iPhone OSで同じ仕様の仮想メモリを使うと、スワップファイルの領域で急速に劣化が進むおそれがあります。

制約を回避して仮想メモリを使うには、主に2つの方法があります。

  1. フラッシュメモリ側で対応する。具体的には、フラッシュメモリ側にコントローラを設け、書き込み先を自動的に分散する。
  2. OSで対応する。具体的には、仮想メモリの利用を抑え、利用するときも書き込み先を分散する。

1番の方法は簡単です。しかし、製品のコストと消費電力を共に押し上げます。そのため、iPhoneのような機器では、2番の方法が適しています。そして、現時点のiPhone OS 3.xは、これに対応できていないのです。

なお、フラッシュメモリには、ブロック単位でしかデータを消去できないという制約もあります。これについても、基本的には上記の2つの方法で対応することになります。

理由3:CPUパワーを分散させたくないから

サードパーティ製アプリにマルチタスクを許可すると、CPUパワーの奪い合いが生じます。

例えば、アプリAが背面に回ったあともCPUパワーを使い続ける設計だったとしましょう。すると、アプリBを操作するユーザーは、アプリBまたはOSの処理が遅い、動きが重いと感じるようになるはずです。背面で動き続けるアプリAの仕業とは考えません。

このような事態を避けるため、CPUパワーの限られるiPhoneでは、マルチタスクを制限したと考えられます。

理由4:タスクスイッチャの実装が難しいから

同時に複数のアプリが動作している場合、ユーザーはどうやってそれを認識し、操作するアプリを切り替えるのでしょうか?

マルチウインドウ環境の場合、アプリAのウインドウの後ろに見えるアプリBのウインドウをクリックするだけです。触ったものを使うのですから、比較的理解しやすいでしょう。しかし、iPhoneなどの携帯機器では、これを行えるほど画面が広くありません。さらに、ウインドウごとに操作系が変化するパソコンの仕組みは、ややこしく、万人向けではありません。

アプリを常に全画面モードにしている環境では、タスクバーまたはDockを利用します。これらは背面に回っているアプリを可視化する工夫のひとつです。しかし、iPhoneなどの携帯機器では、画面内にタスクバーやDockを表示し続けられるほど、画面が広くありません。さらにタスクバーやDockには、起動中のアプリが増えるにつれアプリの視認性が低下するという課題があり、この課題は画面が狭いほど顕著になります。

パソコンでは、もうひとつの方法も使われます。例えばMacでは、cmdキーとtabキーを同時に押すとタスクスイッチャが表示されます。しかし、iPhoneでこれを実装するには、次のいずれかの方法が必要となります。

いずれにしても、Apple社が好むエレガントな解決策とは云えません。

理由5:タスクマネージャが必要になるから

iPhoneで最前面のアプリがハングアップした場合、スリープボタンを押し続け「電源オフ」を表示させます。続いてホームボタンを押し続け、最前面のアプリを強制終了します。

では、背面に回したアプリがハングアップした場合、そのアプリをどうやって強制終了させれば良いでしょうか?

パソコンやほかのスマートフォンの場合、タスクマネージャを表示し、異常を起こしたアプリをユーザーが探して強制終了させます。この方法はばかげてると、初代iPhoneの発表時にスティーブ・ジョブスは語りました。確かに、Apple社の好むエレガントな解決策ではありません。

green マルチタスクを実現する5つの解決策(予想)

上述のように、iPhoneでマルチタスクを実現するには、5つの問題点がありました。しかし、それは即ち、5つの問題点を解決すれば、iPhoneでもマルチタスクを実現できることを意味します。

では、5つの問題点に対応する5つの解決策を、順に考えてみましょう。

解決策1:メモリを増やす

iPhone 3GSでは、初代iPhoneの2倍のメインメモリを搭載しました。次期iPhoneではさらに増えるでしょう。

解決策2:仮想メモリに対応する?

仮想メモリ用のスワップファイルをフラッシュメモリ全体に分散して作成し、定期的に別の場所に作成しなおす仕組みが設けられるかもしれません。もちろん、iPhone OSの改良が必要です。

ただし、仮想メモリの利用は、アプリの体感速度を低下させます。そのため、ここでは仮想メモリが今後も封印され続ける可能性を前提として論を進めることにします。残る問題点がこれだけなら、何とかなると考えるためです。

解決策3:背面のアプリの処理速度を抑える

サードパーティ製アプリを背面に回した場合、そのアプリに与えるCPU処理の優先度を極端に抑えるかもしれません。似た仕組みはパソコン用のOSにも存在しますが、iPhone OSではもっと極端な仕様が適しています。

この場合、背面に回ったアプリは「止まっていないが処理はゆっくりとしか進まない」状態になります。複雑な演算を行うアプリには向かない仕様ですが、iPhoneのような携帯機器では支障にならないでしょう。本当に処理速度が必要なら、クラウドで処理すれば良いのです。

解決策4:ホーム画面をタスクスイッチャにする

タスクスイッチャは、実行中のアプリをユーザーが識別し、選択できるようにする仕組みです。ならば、専用の画面を設計する必要などありません。すでに存在するホーム画面が、最適の回答です。

アプリを切り替える方法

ホーム画面を使えば、現在と同じ使い勝手を維持できます。

Webを見渡すとタスクスイッチャを別に設ける提案が目に付きますが、それはUIを無意味に複雑にするだけです。下記の記事は、iPadの登場前にタブレット機の未来はiPhoneの「モーダル」なUIにあると書くなど、多くの点で頷ける記事です。しかし、Exposé風タスクスイッチャをジェスチャを使って呼び出す部分だけは話になりません。

Gizmodo Japan(ギズモード・ジャパン)AppleタブレットのUIはズバリこうなる!(動画&予想図)

アプリを終了する方法

そんなものは必要ありません。現に、Apple純正のマルチタスク対応アプリであるiPodやSafariなどには、終了する手段がありません。

サードパーティ製アプリの場合、メモリが不足したときに自動的に終了することになるでしょう。ただし、勝手に終了されては困る場合があるので、この点については後述します。

実行中のアプリを識別する方法

まず、ホーム場面のアプリアイコンにバッチを付ける方法が考えられます。ですが、アプリを終了する方法を設けない場合、実行中のアプリを識別する必要はほとんどなくなります。

むしろ、ホーム画面の検索画面(Spotlight)を拡張すべきかもしれません。現在は、検索前の検索画面には何も表示されていません。動作中のアプリの一覧があらかじめ表示されていれば、実行中のアプリの識別と選択が容易にできます。

解決策5:ホーム画面をタスクマネージャにする

ここで云うタスクマネージャは、実行中のアプリの一覧からハングアップした(Windowsで云うところの応答のない)アプリをユーザーが識別し、必要に応じて強制終了できるようにする仕組みです。ならば、専用の画面を設計する必要などありません。すでに存在するホーム画面が、最適の回答です。

つまり、タスクスイッチャとタスクマネージャを区別する必要は、iPhoneにはないと考えます。

アプリを強制終了する方法

OSからの呼び出しに応答のないアプリがある場合、ホーム場面のアプリアイコンにバッチ(!アイコンなど)を付けてはどうでしょう。そのアプリアイコンをタップし続けると、アプリアイコンの移動モードに入る代わりに、強制終了するか否かを選ぶダイアログが表示されるのです。

アプリが多すぎる人のための方法

アプリをインストールしすぎ、ホーム画面の数が多くなったiPhoneの場合、ハングアップしたアプリを探すのが大変になります。そのような人のために、ホーム画面の検索画面(Spotlight)を拡張すべきかもしれません。現在は、検索前の検索画面には何も表示されていません。動作中のアプリの一覧があらかじめ表示されていれば、ハングアップしたアプリの識別と強制終了が容易になります。

これはパソコンのタスクマネージャの再来であり、Appleが好むエレガントな解決策ではありません。しかし、私には、この程度しか思いつけませんでした。アプリが少なければ頼る必要がないので、Apple社も妥協するかもしれません。

green マルチタスク対応アプリの3つの動作モード(予想)

上述のように、5つの問題点のうち4つまでを解決できれば、サードパーティ製アプリを複数起動させることができると考えます。その際、仮想メモリは今後も封印され続けると仮定しました。

アプリの自動終了による解決

仮想メモリがない場合、メインメモリが不足するとアプリを起動できなくなります。これを避けるには、使っていないアプリを自動的に終了するしくみが有効です。つまり、必要なメインメモリを確保できるまで、最も以前に背面に回したアプリから順に終了してゆくのです。これで空きメモリの容量を気にすることなく、アプリを次々に起動できます。

それどころか、アプリを終了させるユーザーインターフェースさえ不要になります。ユーザーが行うのは、使っていたアプリを背面に回す操作(ホームボタンを押すこと)だけです。アプリの終了は、アプリが自身で行うか、メモリが不足したときにOSによって自動的に行われるのです。非常にシンプルなユーザーインターフェースになります。

アプリが自動終了されては困る2つの場合

しかし、それには課題が残ります。勝手に終了されては困る場合が2つあるためです。

処理中のデータがある場合

ワープロで文書を編集中にほかのアプリを使う状況を想像してください。アプリは何らかの処理を行うものなので、ほぼすべてのアプリに、この場合があります。

そのため、次のように動作すべきでしょう。データが保存されていれば、次回の起動時にデータを読み込んで状況を再現できます。

常駐が必要な場合

待ち受けが必要なIP電話アプリのように、常に動作し続けるアプリの場合です。

この場合、ユーザーが知らないうちにアプリが終了されると困ります。そのため、ダイアログを表示してユーザの許可を得てから終了する仕組みが必要です。なお、データを保存して次回の起動時に状況を再現する機能は、こちらでも有効です。

目的と状況別の動作モード

あくまでも仮説ですが、私は、マルチタスク対応アプリには3つの動作モードが設定されると考えます。

マルチタスク対応アプリの3つの動作モード
名称 説明 メモリ不足時 メッセージ
モード3 背後に回ると、処理の優先度が低く設定される。
なるべく使わないよう、Appleのガイドラインで指示される。
アプリの設計によっては、特定の処理(データの保存など)の終了後にモード0〜2に移行する。
モード1と2のアプリがなければ、終了するアプリを選ぶダイアログが表示される。
モード2 背後に回ると、処理の優先度が最低限に設定される。
アプリの設計によっては、特定の処理(データの保存など)の終了後にモード0〜1に移行する。
モード1アプリがなければ、最も以前に使ったアプリから順に、自動的に終了させられる。
モード1 背後に回ると、処理の優先度がなくなり完全に停止する。(終了するより次の起動が速い程度) 最も以前に使ったアプリから順に、自動的に終了させられる。 不可
モード0 ホームボタンを押すと、背後に回らず終了する。その際にデータを自動保存することも可能。(既存のすべてのアプリ。マルチタスク非対応) 既に終了している。

なお、「メッセージ」欄に「可」とあるモードでは、背面にあってもダイアログを表示し、ユーザーの操作によってはホーム画面を介さずに最前面に移動できると考えています。IP電話アプリが受話を知らせるときや、リマインダーが時刻や場所を知らせるときなどです。

green iPhone OS 4.0のマルチタスク(事実)(2010/04/29)

2010年4月に発表されたiPhone OS 4.0で、所謂マルチタスクが実装されました。その実態は制限付きマルチタスクとでも呼べるもので、パソコンのマルチタスクに基づいたものではありませんでした。

アプリの動作方法

上述の予想に似ていなくもありませんでしたが、予想より優れていました。

アプリを背後に回す方法

こちらは予想どおりでした。これまでの終了操作をすると(ホームボタンを押す)、バックグラウンド動作が可能なアプリは背後に回り、その他のアプリは一時停止または終了します。

なお、タスクスイッチャーには終了したアプリも表示されるため、動作継続中・停止中・終了の区別をユーザがする必要はありません。どれも背後に回っているようにしか見えません。そして、マルチタスクの使い勝手を実現するため、終了した時点の状態を瞬時に復活させる仕組み(Fast App Switching)をOSが提供します。

タスクスイッチャ

予想通り、ホーム画面が一種のタスクスイッチャです。バックグラウンド動作中のアプリをホーム画面でタッチすれば、そのアプリに切り替わります。

これはアプリが多すぎる人にとっては面倒な方法です。そのため、タスクスイッチャがもう1つ用意されました。これも予想通りです。しかし、検索画面を拡張するという予想は外れ、Dock風のタスクスイッチャになりました。ホームボタンの2度押しで表示されます。そのため、ホームボタンの2度押しに割り当てられていた従来の機能(iPodコントロールなど)は消えました。

タスクマネージャ

バックグラウンドで動作中のアプリを終了するために、タスクマネージャが必要になります。こちらも予想どおり、タスクスイッチャと兼用になりました。タスクスイッチャでアイコンを長押しすると、アイコンにバッチ(×印)が表示され、タスクスイッチャから削除できます。

バックグラウンド動作に非対応のアプリの場合、既に終了しているので、この操作を行ってもタスクスイッチャからアイコンを削除するだけのことで、メモリ使用量やCPU負荷の低減には寄与しません。とはいえ、Dock風タスクスイッチャはアイコンが増えると使いにくくなるので、実際に行うことは多いでしょう。検索画面を拡張すれば、アイコンが増えても大丈夫だったのに…。

参考文献

AppleInsiderの解説記事が参考になりました。Androidのマルチタスクも似た方法だが、既存アプリからの拡張が容易である点と、バックグラウンド処理が無駄に増えない点で、iPhone OS 4.0のほうが優れているそうです。下記は、その和訳版です。

情報源:silvervineの定点観測所iPhone OS 4.0 の内側: マルチタスキング vs Mac OS X、Android

情報源:silvervineの定点観測所iPhone OS 4.0 の内側: マルチタスキング vs Mac OS X、Android [Page 2]

情報源:silvervineの定点観測所iPhone OS 4.0 の内側: マルチタスキング vs Mac OS X、Android [Page 3]


フィードバック・メニュー | 第1回 | 第2回 | 第3回 | 第4回 | 第5回 | 第6回 | 第7回 | 第8回 | 第9回
top
文責:野尻隆裕 (Twitter @TakaNojiri)