ブロッキング操作は同期的に実行され、完了するまで唯一の JavaScript スレッドを占有します。その間、ほかには何も動けません。ノンブロッキング操作は処理を開始してすぐに戻り、結果はあとで callback、Promise、あるいはイベントを通じて届けます。そのためスレッドはほかの作業をする余裕を保てます。
なぜ Node はシングルスレッドなのにノンブロッキングなのか
あなたの JavaScript は が駆動する のスレッドで動きます。I/O(ファイル、ネットワーク、DNS)は に委譲され、libuv は内部で OS の非同期機能と小さな を使います。その処理がスレッド外で進む間、event loop はほかの callback を処理し続けます。I/O が完了すると、その callback がキューに入れられて実行されます。
