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