2011-07-24 9 views
2

別の初心者の質問:次のコードでスケジュールの後にスレッドを再開()

、スレッドが「set_current_state」を呼び出した後で、「スケジュールが」と呼ばれる前に横取りされた場合にどのような。コードが再度スケジュールされると、 'schedule'コールから開始され、実行キューから削除されますか?または、今度は 'schedule'コールが無視され、set_current_state(TASK_RUNNING)文から開始されますか?

{ 
... 
set_current_state(TASK_INTERRUPTIBLE); /* suppose thread is preempted just after this function call */ 
schedule(); 
set_current_state(TASK_RUNNING); 
... 
} 

答えて

6

はここだ不随意プリエンプションが最初の行の後と第二の前に発生した場合に何が起こるか(多かれ少なかれ):

  1. スケジューラが実行されます(sched.cからスケジューラ()関数) - これは、先取りされた意味であるからです。

  2. あなたのタスクが実行可能ではないとしてマークされているので、スケジューラは実行キューから削除されますし、別のタスクを選択します。外部の何かが再び実行可能としてマークされますまで、

  3. は今、あなたのタスクは、スケジュールされません。これは、タスクに送信される信号、またはタスクが待ちキューに入れられていると仮定して、起床待ち行列が発生しているイベントのために発生する可能性がありますが、外部にタスクを再度実行可能としてマークする必要があります。 。このため、待機キューのコードを見ると、最初にタスクが待機キューに置かれ、その後は自分のコードに似た何かが実行されます。あなたのタスクが実行可能としてマークされている場合

  4. は、いくつかの点で、スケジューラはそれを選ぶだろうし、コンテキストは、タスクコードに切り替わります。

  5. 次に、schedule()関数が呼び出されます。おそらく、スケジューラは、同じタスクをもう一度選択しようとしています。スケジューラは、実行に最も適格なものとして選択されただけで、変更されている可能性は低いからです。

  6. スケジューラから戻ってくる途中で、最後のset_current_stateは基本的にno opになります。このときのタスクは、このシナリオではすでに実行可能としてマークされています。

+0

どうもありがとう!これはプリエンプションをよりよく理解するのに役立ちます! :) – Albert