, доступно для не подписчиков через 7-14 дней.
гиналеvmsplice()
реализация,было предложено что если бы у вас был пользовательский буфер, в два раза превышающий максимальное количество страниц, которое могло бы поместиться в конвейере, успешное выполнение vmsplice () во второй половине буфера гарантировало бы, что ядро было выполнено с использованием первой половины буфера.
Но в конце концов это было не так, и особенно для TCP, страницы ядра сохранялись до получения ACK с другой стороны. Исправление было оставлено в качестве будущей работы, и поэтому для TCP ядру все равно пришлось бы копировать страницы из конвейера.
vmsplice()
имеетSPLICE_F_GIFT
Эта опция имеет дело с этим, но проблема в том, что это выставляет две другие проблемы - как эффективно получать свежие страницы из ядра и как уменьшить кэш-память. Первая проблема заключается в том, что mmap требует, чтобы ядро очистило страницы, а вторая проблема заключается в том, что, хотя mmap может использовать причудливыйkscrubd функция в ядре, которая увеличивает рабочий набор процесса (очистка кеша).
Исходя из этого, у меня есть следующие вопросы:
Каково текущее состояние для уведомления пользователей о безопасном повторном использовании страниц? Меня особенно интересуют страницы splice () d на сокете (TCP). Что-нибудь случилось за последние 5 лет?Являетсяmmap
/ vmsplice
/ splice
/ munmap
текущая лучшая практика для нулевого копирования на TCP-сервере или у нас есть лучшие варианты сегодня?