35

I am trying to get a better understanding so I can scope the reliability impact from potential interoperability issues when creating an android app/service. I would like to figure out how process priority is determined. The differences in priority between services and activities and if the scheduler treats their priority differently. Basically I'm trying to get a strong understanding of how likely it is that an activity or service is starved by a rogue processes from a different application (or even the linux kernel.)

Does anyone have any good links you could recommend... My searches haven't turned up much, yet.

Thanks!

Edit: My concern is with regard to processor time slicing/scheduling, not memory resources (memory resources are well described within the android documentation.) Thanks again!

4

3 に答える 3

47

次のリストは、さまざまなタイプのプロセスを重要な順に示しています (最初のプロセスが最も重要で、最後に強制終了されます)。

  1. フォアグラウンド プロセス
  2. 目に見えるプロセス
  3. サービスの流れ
  4. バックグラウンド プロセス
  5. 空のプロセス

注: Android は、プロセスで現在アクティブなコンポーネントの重要性に基づいて、可能な限り高いレベルでプロセスをランク付けします。たとえば、プロセスがサービスと可視アクティビティをホストする場合、そのプロセスはサービス プロセスではなく、可視プロセスとしてランク付けされます。

これはここから参照されますProcesses and Threads

編集:

アプリケーションの優先度とプロセスの状態について

リソースを再利用するためにプロセスが強制終了される順序は、ホストされているアプリケーションの優先度によって決まります。アプリケーションの優先度は、最も優先度の高いコンポーネントと同じです。

2 つのアプリケーションの優先度が同じ場合、優先度の低いプロセスが最初に強制終了されます。プロセスの優先度は、プロセス間の依存関係の影響も受けます。アプリケーションが、2 番目のアプリケーションによって提供されるサービスまたはコンテンツ プロバイダーに依存している場合、2 番目のアプリケーションは、少なくともそれがサポートするアプリケーションと同じくらい高い優先度を持ちます。

システムが他のアプリケーションのためにリソースを必要とするまで、すべての Android アプリケーションは実行され、メモリ内に残ります。

アプリケーションの優先度が実行中の作業に適していることを確認するには、アプリケーションを正しく構造化することが重要です。そうしないと、重要な処理の最中にアプリケーションが強制終了される可能性があります。次のリストは、図 に示されている各アプリケーションの状態の詳細を示し、状態を構成するアプリケーション コンポーネントによって状態がどのように決定されるかを説明しています。

アクティブなプロセスアクティブな (フォアグラウンド) プロセスは、現在ユーザーと対話しているコンポーネントを持つアプリケーションをホストしているプロセスです。これらは、Android がリソースを再利用することで応答性を維持しようとしているプロセスです。通常、これらのプロセスはほとんどなく、最後の手段としてのみ強制終了されます。

ここに画像の説明を入力

アクティブなプロセスは次のとおりです。

1.「アクティブ」状態の活動。つまり、それらはフォアグラウンドにあり、ユーザー イベントに応答します。アクティビティの状態については、この章の後半で詳しく説明します。

2.現在 onReceive イベント ハンドラを実行しているアクティビティ、サービス、またはブロードキャスト レシーバ。

3. onStart、onCreate、または onDestroy イベント ハンドラを実行しているサービス。

可視プロセス可視だが非アクティブなプロセスは、「可視」アクティビティをホストするプロセスです。名前が示すように、目に見えるアクティビティは目に見えますが、フォアグラウンドにあるわけでも、ユーザー イベントに応答するわけでもありません。これは、アクティビティが部分的にのみ隠されている場合に発生します (非フルスクリーンまたは透明なアクティビティによって)。通常、目に見えるプロセスはほとんどなく、アクティブなプロセスを続行できるようにするために、極端な状況でのみ強制終了されます。

開始されたサービス プロセス 開始されたサービスをホストするプロセス。サービスは、目に見えるインターフェイスなしで続行する必要がある進行中の処理をサポートします。サービスはユーザーと直接対話しないため、表示されるアクティビティよりも優先度がわずかに低くなります。それらは引き続きフォアグラウンド プロセスと見なされ、アクティブなプロセスまたは可視のプロセスにリソースが必要でない限り、強制終了されません。

バックグラウンド プロセス表示されず、サービスが開始されていないアクティビティをホストするプロセスは、バックグラウンド プロセスと見なされます。通常、フォアグラウンド プロセスのリソースを取得するために Android が最後に検出されたものを最初に強制終了するパターンを使用して強制終了する多数のバックグラウンド プロセスがあります。

空のプロセスシステム全体のパフォーマンスを向上させるために、Android では多くの場合、アプリケーションが寿命に達した後もメモリに保持されます。Android は、アプリケーションが再起動されたときの起動時間を改善するために、このキャッシュを維持します。これらのプロセスは、必要に応じて定期的に強制終了されます。

詳細については、こちら (このブログで見つけました) Android のメモリ管理を参照してください。

編集:

I think Android is basic Linux so, whatever scheduler works for Linux is same in Android. 

Android スケジューラと Linux スケジューラの違い

スケジューラ — 5 ファイル — Android カーネルには、CPU プロセス スケジューラと時間管理アルゴリズムへのわずかな変更も含まれています。これらの変更の履歴は不明であり、ざっと調べただけでは影響は明らかではありませんでした。

プロセス プリエンプション:

前述のとおり、Linux オペレーティング システムはプリエンプティブです。プロセスが TASK_RUNNING 状態に入ると、カーネルはその優先度が現在実行中のプロセスの優先度よりも高いかどうかを確認します。そうである場合、スケジューラーが呼び出されて、実行する新しいプロセスが選択されます (おそらく、実行可能になったばかりのプロセス)。さらに、プロセスのタイムスライスがゼロに達すると、そのプロセスは横取りされ、スケジューラが呼び出されて新しいプロセスが選択されます。

実際のスケジューリング ポリシー

テキスト エディターとビデオ エンコーダーの 2 つの実行可能なタスクを持つシステムを考えてみましょう。テキスト エディタは、ほぼすべての時間をユーザー キーの押下の待機に費やしているため、I/O バウンドです (ユーザーがどれだけ速く入力しても、それほど速くはありません)。それにもかかわらず、キーが押された場合、ユーザーはエディターがすぐに応答することを期待しています。逆に、ビデオ エンコーダーはプロセッサ バウンドです。エンコーダーは、ディスクから生データ ストリームを読み取り、後で結果のビデオを書き込む以外に、ビデオ コーデックを生データに適用することにすべての時間を費やします。いつ実行するかについて、厳密な時間制限はありません。今すぐ実行を開始したのか、0.5 秒後に実行を開始したのかは、ユーザーにはわかりません。もちろん、早ければ早いほど良いです。

このシステムでは、テキスト エディターは対話型であるため、スケジューラーはビデオ エンコーダーよりも高い優先度と大きなタイムスライスをテキスト エディターに与えます。テキスト エディタには、利用可能なタイムスライスがたくさんあります。さらに、テキスト エディターの優先度が高いため、必要に応じてビデオ エンコーダーをプリエンプトすることができます。これにより、テキスト エディターがユーザー キーの押下に即座に応答できるようになります。これはビデオ エンコーダーにとって不利益ですが、テキスト エディターは断続的にしか実行されないため、ビデオ エンコーダーが残りの時間を独占する可能性があります。これにより、両方のアプリケーションのパフォーマンスが最適化されます。

于 2011-10-28T15:09:31.020 に答える
36

この点で、Android は通常の Linux システムとは少し異なります。スケジューリングに影響を与えるために Android が使用するものは 2 つあります。プロセス/スレッドの "nice" レベルと cgroups です。

プロセスの "nice" レベルは、Linux の通常の "fair" スケジューリング ポリシーに影響します。niceness が高いスレッドは、niceness が低いスレッドよりも実行頻度が低くなります。「デフォルト」優先度 ( で定義Process.THREAD_PRIORITY_DEFAULT) のスレッドが 1 つある状況では、バックグラウンド優先度 (または ) のスレッドよりもはるかに頻繁に実行されるようになりますProcess.THREAD_PRIORITY_BACKGROUND

理論的には、これにより、フォアグラウンド/UI スレッドがバックグラウンド作業によって大きな影響を受けないようにすることができますが、実際には十分ではありません。10 個のバックグラウンド スレッドをすべて実行したいが、1 つのフォアグラウンド スレッドが UI を駆動している場合を考えてみましょう。これは、フォアグラウンド スレッドの動作に顕著な影響を与える可能性があります。

これに対処するために、Android は Linux cgroup を簡単な方法で使用して、より厳密なフォアグラウンドとバックグラウンドのスケジューリングを作成します。フォアグラウンド/デフォルトの cgroup では、通常どおりスレッドのスケジューリングが可能です。ただし、バックグラウンドの cgroup は、その cgroup 内のすべてのスレッドが使用できる合計 CPU 時間のわずかな割合のみという制限を適用します。したがって、そのパーセンテージが 5% で、10 個のバックグラウンド スレッドがすべて実行され、1 つのフォアグラウンド スレッドがある場合、10 個のバックグラウンド スレッドを合わせると、フォアグラウンドから使用可能な CPU サイクルの最大 5% しか使用できません。(もちろん、実行するフォアグラウンド スレッドがない場合は、バックグラウンド スレッドが利用可能なすべての CPU サイクルを使用できます。)

パブリック API を使用してスレッドの優先度を設定すると、Android はデフォルト cgroup とバックグラウンド cgroup の間で暗黙的にスレッドを移動します。したがって、スレッドの優先度をProcess.THREAD_PRIORITY_BACKGROUND以上に設定すると、そのスレッドもバックグラウンド cgroup に配置されます。に設定するProcess.THREAD_PRIORITY_DEFAULTと、デフォルトの cgroup になります。

このため、バックグラウンド ワーカー スレッドをバックグラウンドの優先度に設定する通常の規則に従うことで、フォアグラウンド UI スレッドが中断されないようにすることができます。

さらに、Android はプロセス内のすべてのスレッドを、ユーザーにとって重要ではないことがわかっているプロセスのバックグラウンド cgroup に移動します。バックグラウンド プロセスまたはサービス プロセスは、個々のスレッドがフォアグラウンド スケジューリングの優先度を要求したかどうかに関係なく、そのスレッドをバックグラウンド cgroup に配置します。

于 2011-11-09T04:39:49.847 に答える