1

時間駆動型のイベントを調べていますが、CPU を常に過剰に使用することなくこれを行う方法がわかりません。

array events;
events[1] = [id:1,time:1440589943,event:happend];
While(running)
{
    loop over events
        if(currentTime >= eventTime)
             fireEvent()
}

これは私が思いつく最も基本的なイベント ハンドラーのように思えますが、実際には何もせずに大量の CPU を常に消費すると思います。

したがって、基本的な質問は次のとおりです。他の言語の時間駆動型イベントは、時間駆動型イベントをどのように処理しますか? 彼らは、解雇される準備ができているかどうかを常に確認していますか? 彼らは巧妙なスケジューリングメカニズムを使用していますか?

前もって感謝します。

4

1 に答える 1

1

スケジューリング メカニズムを処理する一般的な方法は、時間イベントを、通常はheap として実装される優先キューに配置することです。これにより、次のイベントがいつ来るかを知り、適切な時間スリープすることができます。そうすれば、次のイベントを継続的に探す必要がなくなり、プロセッサは、次のスケジュールされたイベントを処理するために制御が戻されるまで、他の意味のある作業を実行できます。

新しいイベントが登録されるたびに、優先キューにプッシュされます。プライオリティ キューは、イベントの順序を維持し、繰り返しイベントの繰り返しスケジュール情報を格納できます。このようにして、イベントを処理し、スケジュールの動作に応じて、後でキューに戻すことができます。

典型的な UNIX/Linux システムでの cron の設計は、この原則に従います。cronに関するウィキペディアの記事には、その実装の簡単な概要が含まれています。

于 2015-08-27T00:43:29.387 に答える