過去の投稿記事 new!
・【画像】漫画でわかる外国人参政権
・東京電力のHPで停電状態が確認できたり(サービス再開!)
・戦国時代 ~ 江戸時代の徳川家康が熱かった
・vaio のバッテリは寿命が短いような気がする
・話題の Western Digital 製 WD20EARS を購入した
・C01LC をビックカメラで買ってきた
・2025年には空中都市が現実化?!
・【動画】わかりやすい「宇宙ひも理論」
・今世紀には「富士山噴火」「東海連動地震」「首都圏直下型地震」か?
・滅びた町、南浜町が Googleストリートビューで見れる

【 amazon 送料無料キャンペーン 】

バックリンクはご自由にどうぞ!     http://mfsocket.blogspot.com/feeds/posts/default?alt=rss リンク集 / ログイン

2011/09/25
Android の大半はシングルスレッド

 
唐突ですが Android の大半はシングルコア端末です。
 
デュアルコア自体 Android2.3 搭載 の Galaxy S2 などの限られた機種に
なっています。

 
さて マルチスレッドプログラミングをすれば並列に走るという認識を持っている
方が少なくありません。たしかに並列に走っているようには見えるのですが、
本当の意味で並列に走っているかは別問題です。
 
プリエンティブマルチタスク
 
ほとんどの OS は プリエンティブマルチタスクで実装されています。 
基本的な認識としてマルチタスク(wiki)から引用します。
 
1つのCPUしかないコンピュータでは、ある瞬間には1つの
処理しか実行できない。しかし、CPUの処理時間を数十ミリ秒といった短い時間で区切り、タスク間で1つのCPUをタイムシェアリングすることによって、複数のアプリケーション(タスク・プロセス)が同時に実行されているように見える。
 
アプリケーション(常駐プロセス)が増える、スレッドが増える、などを続けると、
一つのプロセスに割り当てられる時間も短くなります。
 
 
プロセスやスレッド数が多くなると…
 
0.001 秒でもタスクを実行するスレッドがある場合、そのスレッドを切り替える
オーバヘッドと、スレッド自身のタスク処理時間が関係してきます。
 
サーバPC や Windows マシンでは、ほぼ気にする必要の無いレベルですが、
携帯電話スマートフォンなどの限られた資源の中では、けっこう重要に
なっており、他プロセスやスレッドへの影響度も深刻です。
 
特にスマートフォンでは、サービスマルチタスクアプリケーション
作成できるので、ガラケーよりも気にする必要があります。
 
また安易な synchronized の多様はパフォーマンスに大きく影響を与えます。
 
「とりあえず衝突を避ける」という気持ちでコーディングした場合、メソッド
単位で synchronized を行う方も多いのですが、ゲームフレートにすると
1 ~ 2 fps 影響を与える事があります。筆者自身はドコモ 900シリーズの
アクションゲームを開発した際、安易な利用は多大な影響を与える事実を
確認しました。
 
 
マルチコアなら
 
マルチコアを搭載した CPU なら、一つの CPU がプロセス・スレッドを
実行すると同時に、別の CPU が他のプロセス・スレッドを実行する為、
スレッドが増えてもシングルコア程に影響を受けません。
 
メモリについては、今回のシングルスレッドに関係ないため無視しています。
cpu_core2_quad
 
Androidでは
 
実行環境は Dalvik(ダルビック) という仮想マシンになっており、ダルビックと
Bionic libc でスレッドの切り替え処理なども行われています。
 
◆Bionic libc とは?
Bionic libcとは、Androidの基本部となるLinux部に配置されているCライブラリのこと。Android用にカスタマイズされたライブラリであり、Cライブラリ以外にもAndroid専用のファンクションとして、Androidのシステムプロパティを取得する機能やデバッグ時のログ出力機能などが提供されている。また、Bionic Libcは
パフォーマンスやフットプリントなど、組み込み向けに配慮された形で提供されているため、GNU Libcとの互換性はない。つまり、Android環境で実行されるネイティブコードは、すべてこのBionic Libcでコンパイルする必要がある。 引用
 
仮想マシンと Bionic それぞれ Android 3.0 未満については
 
 デュアルコアの最適化が行われていません
 
なのでデュアルコアでも、ダルビックが最適化されていない影響が強く、結局は
シングルスレッドを擬似的にマルチスレッドにしているだけなのです。
 
こちらも参考になります。
 
 
結論は
 
スマートフォント(に限りませんが)ではプロセスが増えると負荷が大きくなるのは
当たり前、スレッド数が多くなるとオーバヘッドが増えるのは当たり前、
またそれにより「自プロセス、他プロセスにも影響がある」という事を改めて
認識する必要があります。
 
例えば AudioTrack という wav の同期再生処理を行う API がありますが、
こちらで半永久的なストリーミング再生を行おうとした場合、今回の事が
実感できるかもしれません。
 
「スレッドの大半は処理させていない」と言っても、処理をさせる限りは
オーバーヘッドは存在します。
 
0.01 秒でも多く特定のスレッドに処理を優先させたい等を考えてる方は、
今回のお話が参考になるかも知れません。
 
他プロセスはどうしようもなくても、自プロセスならば対策もある程度は出来ます。
 
著者: mfsocket

0 コメント:

  • コメントには <b>, <strong>, <em>, <i>, <a> など一部の HTML タグを使用できます。