This is the first description of io_uring Vs select() that I’ve read that has clearly explained the conceptual differences between the APIs, which is nice!
It sounds a lot like Windows completion ports.
A few years ago I was investigating various event systems around Unix and Windows, and I came to a realization: Unix is ask first, then do, while Windows is do first (or queue up), then ask.
NT got it from VMS.
I had the same reaction reading this article: “Oh, this is IOCP from VMS and NT!” It also made me a little sad because I posted a proof-of-concept patch of IOCP to the Linux kernel mailing list in 1998, but I don’t think they could get over their Windows disgust to see the advantages of the model.