В Java или С# или некоторых других языках существуют неблокирующие объекты ввода-вывода, например, для сокетов.
Поэтому я могу передать свои функции обратного вызова неблокирующему IO, и как только неблокирующий IO получит что-либо, он вызовет мои обратные вызовы.
Мне интересно, как они реализованы. Если я создаю неблокирующий IO, за сценой, Java или С# просто создают фоновые потоки для них? или ОС, лежащая в основе, имеет встроенную поддержку для них?