A strong answer
A strong candidate frames Describe the reactor pattern for event-driven servers. around the exact memory layout, compiler semantics, and hardware execution model covered in Event-Driven Server Architectures: Reactor Patterns and Production Event Loops. Explain demultiplexing ready events, dispatching to registered handlers, and single-threaded concurrency.
Throughout this module, we examined the foundational pieces of low-level networking:
- Non-blocking socket descriptors (
O_NONBLOCK). - Asynchronous kernel demultiplexing (
epoll). - Socket configuration flags (
SO_REUSEADDR,TCP_NODELAY). - Zero-copy transfer primitives (
sendfile,writev).
However, real-world servers do not read from a socket and immediately write a response. Production network software must coordinate complex, concurrent workflows:
- Partial Reads and Writes: A client sends a 4 KB request in three fragmented TCP packets. The server cannot parse the command until the entire frame arrives, but it cannot block waiting for the remaining bytes.
- Outbound Backpressure: When transmitting a 10 MB payload, the socket send buffer fills after 64 KB. The server must buffer the remaining bytes in application memory, register for write readiness, and flush data incrementally without starving other clients.
- Idle Timeouts and Heartbeats: Clients that disconnect ungracefully or halt midway through a transaction must be reaped before they exhaust file descriptors.
- Signal Coordination: The server must reload configuration on
SIGHUPand shut down gracefully onSIGTERMwithout interrupting active transactions.
In a production interview, always connect the specification rule to its concrete runtime consequence: state what lives on the stack versus the heap or static storage segment, how the compiler or operating system validates alignments, lifetimes, and error codes, and what happens under adversarial or boundary inputs (such as zero-length buffers, integer overflow, concurrent mutation, or partial I/O). Backing your explanation with a small trace of register/memory state transitions immediately separates senior systems engineers from candidates who only memorized syntax.
What the interviewer is listening for
- Mastery of core invariant: Construct a single-threaded Reactor pattern comprising an Event Demultiplexer, Dispatcher, and Event Handlers.
- Mastery of core invariant: Manage connection lifecycles via non-blocking state machines with dedicated input and output ring buffers.
- Mastery of core invariant: Handle partial writes and output backpressure by dynamically arming and disarming EPOLLOUT.
- Hardware and ABI awareness: Explaining how sizes, alignments, calling conventions, or kernel boundaries behave on real 64-bit targets rather than relying on implementation-defined assumptions.
- Defensive engineering: Naming the exact compiler flags (
-Wall -Wextra -Werror), static analyzers, or runtime sanitizers (-fsanitize=address,undefined,thread) that verify correctness in CI.
Common mistakes
- Explaining only surface syntax without tracing the underlying memory addresses, ownership lifetime, or kernel/user-space state transitions.
- Assuming undefined behavior (such as signed overflow, uninitialized reads, strict-aliasing violations, or dangling pointers) will "just work" because it passed an unoptimized
-O0debug build. - Ignoring return codes, partial reads/writes, alignment padding, or cleanup paths when an allocation or syscall fails midway through a function.