Skip to content

Comment on Server-Side I/O Performance: Node vs. PHP vs. Java vs. Goparent

Comments

I'm not familiar with libuv but is there a dedicated "watcher" thread in a thread pool that the kernel wakes up when when the disk driver has completed that I/O that it was sleeping on? If so is there a dedicated "watcher" thread for each non-blocking I/O request handled by libuv?

There is no watcher: threads get parked by the kernel as "not runnable" while they perform the I/O operation.

When the operation is finished, then they become runnable again so the kernel scheduler runs them--that is, it runs the code that comes after the I/O operation.

This code (from libuv) notifies the requester that the operation is complete.

Thanks. So is the libuv package implemented as two distinct components then consisting of:

1) The main event loop thread.

2) a thread pool of "workers" which make the actual I/O request and sleep while waiting for the I/O. Then when a "worker" thread is set to runnable again by the kernel(because it's I/O request has been completed)notifies the main event loop thread via a signal?

Is that correct?

That's correct, except the notification back is probably via some queue (think of futures or Go channels) rather than signals.

I see that makes sense. Cheers.

I’m not familiar at that level.

AboutSource Built by g1lg1l

Hackerly is an independent reader for Hacker News, built on the public HN API. Not affiliated with Y Combinator.