It basically misses the vblank of the display (16.67ms for 60Hz display), so it waits for the next interval.
30fps is already a missed interval for a 60Hz display. So let's say, you render a frame under 16.67ms, and that's your first unique frame. That is ready for display, so that's what you see. If the engine takes longer than 16.67ms it waits for the next refresh @ 33.33ms, so the 1st frame is essentially sitting on-screen for two intervals or 1/2*60Hz -> "30fps". If it missed the next interval, then you wait for the next vblank, i.e. 50ms (3/60), which means you're at "20fps" as the frame has now been sitting on-screen for a 3rd interval.
So basically, the frame rates you see will be an integer divide of the display's Hz. e.g. 60, 30, 20, 15, 12, etc. corresponding to the number of intervals the last frame has been sitting on screen.
With triple-buffering you add a second back buffer to the swap chain for the display to grab frames from, so at least one of those should have a completed frame by the time the display needs it, though you get into frame pacing issues for obvious (various?
) reasons.
edit: Please excuse any brain farts in the explanation.