\chapter{User Level \glsxtrshort{io}} As mentionned in Section~\ref{prev:io}, User-Level \glsxtrshort{io} requires multiplexing the \glsxtrshort{io} operations of many \glspl{thrd} onto fewer \glspl{proc} using asynchronous \glsxtrshort{io} operations. Various operating systems offer various forms of asynchronous operations and as mentioned in Chapter~\ref{intro}, this work is exclusively focuesd on Linux. \section{Existing options} Since \glsxtrshort{io} operations are generally handled by the \subsection{\lstinline|epoll|, \lstinline|poll| and \lstinline|select|} \subsection{Linux's AIO} \begin{displayquote} AIO is a horrible ad-hoc design, with the main excuse being "other, less gifted people, made that design, and we are implementing it for compatibility because database people - who seldom have any shred of taste - actually use it". But AIO was always really really ugly. \begin{flushright} -- Linus Torvalds\cit{https://lwn.net/Articles/671657/} \end{flushright} \end{displayquote} Interestingly, in this e-mail answer, Linus goes on to describe ``a true \textit{asynchronous system call} interface'' that does ``[an] arbitrary system call X with arguments A, B, C, D asynchronously using a kernel thread'' in ``some kind of arbitrary \textit{queue up asynchronous system call} model''. This description is actually quite close to the interface of the interface described in the next section. \subsection{\texttt{io\_uring}} A very recent addition to Linux, @io_uring@\cit{io\_uring} is a framework that aims to solve many of the problems listed with the above mentioned solutions. \subsection{Extra Kernel Threads}\label{io:morethreads} Finally, if the operating system does not offer any satisfying forms of asynchronous \glsxtrshort{io} operations, a solution is to fake it by creating a pool of \glspl{kthrd} and delegating operations to them in order to avoid blocking \glspl{proc}. \subsection{Discussion} \section{Event-Engine} \section{Interface}