node.jsの仕組みを聞いて分からなかった点

重要なのは,リクエストとタスクの違いです。ここで言うタスクとはリクエストを細分化したもので,例えばリクエストの解析や,キャッシュサーバーやデータベースサーバーへの問い合わせ,レスポンスの作成といった個々の処理を指します(もしくはイベントといったほうが適切です)。Node.jsはリクエスト(コネクション)という単位に縛られることなく,細分化したタスクを順番に処理していきます。より具体的に言えば,一人目がデータベースに問い合わせている間に二人目のリクエストの処理を行い,データベースから結果が返ってきたら一人目の処理へ戻り,といった具合です。データベースやファイルI/Oに問い合わせている間に何もすることがない,といったことが起こりません。

2011年のJavaScript ─ウェブアプリ全盛の時代へ
つまりはこういうことだと思う。
3つのリクエストを処理する時、スレッドモデルはこう。

人はスレッドを表していて、処理時間はCPU数による。

node.jsはこう。

  • 分からない点1

シングルスレッドモデルは複数スレッドによるリソース消費がなく、また待ち時間を他のタスクで埋めることができるので効率がいい。しかし、待ち時間を全て埋めてしまった後は時間が伸びていくだけのはず。一つのリクエストを処理する時間の90%が待ち時間だとすると10リクエストで待ち時間が全て埋まる。これはCPUのコア数がいくらだろうと同時に処理できるのは10リクエストが限界でそれ以上はどんどん応答が遅延するということを意味していると思う。この認識は間違いなのか。

  • 分からない点2

スレッドモデルでもこの待ち時間を考慮できて、CPUが遊んでいる時は他のスレッドをCPUに割り当てるはず。そうすると待ち時間の有効活用についてのnode.jsとスレッドモデルの違いは、スレッド切り替えコストの有無だけと言うことができる。この認識は間違いなのか。