4

libuv とオペレーティング システムは、Node.js で setTimeout や setInterval などのタイマーを実際にどのようにスケジュールしますか? タイマーが起動するまで、ノード プロセスによって CPU が使用されていないことがわかります。これは、OS がタイマーをスケジュールし、タイマーが起動したときに Node プロセスを起動するということですか? もしそうなら、OSはどのようにタイマーをスケジュールし、ハードウェアはそれをどのように正確に実行しますか?

4

2 に答える 2

3

Node は下で libuv を使用してこれを処理します。setTimeout には独自の内部管理機能がありますが、最終的には libuv が提供する uv_timer_t 機能を使用します。

イベントループが行っているのはタイマーだけだと仮定しましょう。libuv はポーリング タイムアウトを計算します。これは実際にはタイマーの期限になります (この例では)。次に、適切なシステムコール (epoll_wait、kevent など) を使用して、イベント ループが i/o をブロックします。その時点で、何をすべきかを決定するのはカーネル次第ですが、現在の実行スレッドは、カーネルが再びウェイクアップするまでブロックされます。そのため、何も起こっていないため、ここでは使用済みの CPU はありません。

タイムアウトが切れると、前述の syscall が返され、libuv が期限切れのタイマーと i/o を処理します。

于 2014-11-19T07:54:27.570 に答える