> И вот ещё. Поверх нового sendfile построен SSL_sendfile(), позволяющий ядру слать данные
> из файла в SSL сокет. Само собой и чтение с диска
> и шифрование тоже выполняются в фоне.Вообще существует ли теоретическое обоснование перевода работ именно в ядро, в смысле, какая разница втом, будет ли работой заниматься поток юзера, переключившийся с ядро, или юзерспайсовый делегирует всё работу специализированому потоку в пространстве ядра, а сам будет ждать уведомлений через поллинг дескрипторов? В солярисе имеется общий принцип: "на каждый чих создаём поток ядра". Это оправдано, так как ОС ориентирована на исполнение на машинах с сотнями CPU. Но непонятно зачем размножение потоков нужно в freebsb которая работает на тазиках с 4-8 CPU. Ну нахватает поток юзерспайсового сервиса запросов не отдачу контента, нагрузит работой по сетевому и блочному IO некоторое количество потоков в ядре, и те точно так же встанут в взаимных локах и зависнут в конкуренции на доступ к разделяемому ресурсу, как заблокировался бы юзерспайcовый поток, на ожидании наполнения кеша address_space в линуксе?
> P.S. Спасибо Валентину, что расставил икспердов и мне надо объяснять про разницу
> блокирования на сокете и на диске.
В линуксе бликировка на диске в sendfile происходит только на время ожидания поступления данных с диска при запуске __blk_run_queue, так как заполнение beffer_head данным осуществляется в потоке, сделавшем sendfile. Остальное время поток, сделавший sendfile, не блокируется, а заполняет данными address_space файла, и мапит их в буфера pipe-а и исполняет калбек splice_write дескриптора выходного сокета. Какая разница, какой поток будет блокироваться на время операции чтения данных с диска, поток юзерспайсового сервиса, делающего sendfile, или спецализированного, которому поток юзерпайсового сервиса делегирует эту работу?