6

私はマイクロコントローラ用の C プログラムをたくさん書いてきましたが、Linux のような OS 上で動作するものは一度もありませんでした。Linux はアプリケーションに与える処理時間をどのように決定しますか? 他のプロセスも実行する時間を確保できるように、OSに何か他のことをして後で戻ってくるように指示するアイドル時間があるときに、何かする必要がありますか? それとも、OSが自動的にそれを行うだけですか?

編集: 詳細の追加 私の c プログラムにはタスク スケジューラがあります。100 ミリ秒ごとに実行されるタスクもあれば、50 ミリ秒ごとに実行されるタスクもあります。私のメイン プログラム ループでは、ProcessTasks を呼び出して、タスクを実行する準備ができているかどうかを確認します。準備ができていない場合は、アイドル関数を呼び出します。アイドル機能は何もしませんが、GPIO ピンを切り替えて、O'scope でアイドル時間を監視できるようにするために、または必要に応じて何かを行うことができます。では、このアイドル関数で sched_yield() を呼び出す必要があるのではないでしょうか?

4

3 に答える 3

6

Linuxは、アプリケーションに与える処理時間をどのように決定しますか

各スケジューラーは独自の決定を下します。シェアを使い果たしていないことに対して報酬を与える人もいれば、何をするかを予測しようとするロールダイスなどもあります。私の意見では、それは魔法だと考えることができます。ループに入った後、スケジューラーは魔法のように時間切れなどを決定します

OSに何か他のことをするように指示するためにアイドル時間があるときに私がしなければならないことがありますか

と呼ぶかもしれませんsched_yield。私はそれを呼んだことはなく、また、そうする理由を知りません。マニュアルには、パフォーマンスが向上する可能性があると書かれています。

または、OSはそれを自動的に実行しますか

それは間違いなくそうです。それが彼らがそれを「プリエンプティブ」マルチタスクと呼ぶ理由です。

于 2012-08-16T16:41:03.583 に答える
5

それは、「アイドル時間」がある理由と方法によって異なります。ブロッキング I/O 関数への呼び出し、mutex での待機、またはスリープは、スレッドのスケジュールを自動的に解除し、OS が別の処理を実行できるようにします。問題になるのはビジー ループのようなものだけですが、いずれにせよ設計に現れるべきではありません。

あなたのプログラムは、中心的な「無限ループ」を 1 つだけ持つべきです。ループ本体が「機能しなくなる」可能性がある場合は、すべてのナイスネスを自動的に表示する上記のシステム関数のいずれかをループに実行させることができれば最適です。たとえば、中央ループが でありepoll_wait、すべての I/O、タイマー、およびシグナルが epoll によって処理される場合、タイムアウトを指定して関数を呼び出し、-1何もすることがなければスリープ状態にします。(対照的に、タイムアウトで呼び出すと、0ビジー ループになります – 悪い!)。

于 2012-08-16T16:43:36.007 に答える