質問

あなたがタイトなループのポーリングに何かの状態を持っている場合は、私がCPUを使用したい他のプロセスの方法で取得せずにポーリングを行う方法はかなりわかりません。例えば、これをやってます:

while (state == BUSY) state = check_state();

リソースの無駄のように思えます。私はこれを行うための最善の方法は、と思うだろう。

while (state == BUSY) {
    sched_yield();
    state = check_state();
}

私はトップが、それがこれをやっている間、CPUの100%を消費した場合でも、睡眠のようなプロセスを一覧表示することを期待したいです。このように、プロセスは「きれい」投票を(私は願っています)です。しかし、それは何が起こるかではありません。現時点では私が持っている

while (state == BUSY) {
    sleep(1);
    state = check_state();
}

これは完全に受け入れているが、それはこれよりも良い行うことができるように私は感じます。これを行うための標準的な方法はありますか?

役に立ちましたか?

解決

それはパフォーマンスの観点からも相互運用時に

()はsched_yield上でスピンしないでください、それは非常に悪いとさえスケジューラの優先度の検出をmucks難破船のバッテリ寿命と消費電力の測定基準のようなものを行います。アプリケーションはレイテンシを許容できる場合は、まだ理想的ではない場合は、タイムアウト(10Hzのようにも短いもの)とのポーリングは、非常に望ましいます。

正しい答えは()が実際に行うために必要なものcheck_stateに依存します。あなたの状態変化はあなたがブロックすることができ、カーネル見えるのイベントになるように、あなたは物事を手配することができない絶対か?

他のヒント

私はこれを想定していないが、あなたが使うことができるものです。<のhref =「http://www.kernel.org/doc/man-pages/online/pages/man2/poll.2.html」のrel =」 ">世論調査のか、 noreferrer nofollowを上のepoll で?

残念ながら、良心的なポーリングのようなものはありません。短いポーリング期間、より良い反応時間が、より高いリソース消費:ポーリングは常にトレードオフ反応時間とリソースの消費量との間にあります。ポーリング期間より長く、あなたが救うより多くのエネルギーが、反応性の低いアプリケーションがなります。

ポーリングは関係なく、あなたがそれを見てどのように、常に醜いではありません。あなたは、物事に正しい方法をしようとしている場合は、より良いメカニズム、すなわち通知を使用する必要があります。  何それが意味することは、それが唯一の状態をポーリングすることができますので、あなたのcheck_state()APIは、悪いものであるということです。あなたは時に状態変化を通知するように設計機能を必要としています。ときの状態が変化しますが、同期または非同期のfdのイベントを待ち、そして、このようなイベントが発生した場合にのみ目を覚ますことができるように一般的に、そのような機能は、いくつかのFDが読みやすくなります。

私はあなたが libevent に使用できると思いますか<のhref = "のhttp:/ /software.schmorp.de/pkg/libev.html」のrel = "nofollowをnoreferrer"> libevはを。

の両方がこのようなものを処理するための機能を提供します。

私のリアルタイムの仕事で、私は一般的に(10USなどの)適切なタイムアウトを選択し、条件とRDTSC(タイムスタンプカウンタ)上でスピン。

あなたは(10msのより長いような)時間の本当に長い期間のためにスピンしたい場合は、他のものは実行するために、いくつかの機会を得るように、

、私はそこに小さな睡眠文を置くことをお勧めしたい。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top