⚡️ Linux умеет передавать страницы памяти ядру почти без копирования
Есть малоизвестный системный вызов vmsplice().
Он позволяет отобразить пользовательские страницы памяти прямо в pipe:
struct iovec iov = {
.iov_base = buf,
.iov_len = len
};
vmsplice(pipefd[1], &iov, 1, SPLICE_F_GIFT);
Самая интересная часть — SPLICE_F_GIFT.
Этим флагом userspace фактически говорит ядру: эти страницы памяти можно считать переданными тебе.
Это используется в zero-copy/low-copy сценариях, где хочется минимизировать лишние копирования между userspace и kernel space.
Но есть нюанс: после такой передачи нельзя относиться к этим страницам как к обычной памяти и спокойно менять их содержимое.
Очень низкоуровневая штука, но отличный пример того, насколько далеко Linux позволяет зайти в оптимизации I/O.
Есть малоизвестный системный вызов vmsplice().
Он позволяет отобразить пользовательские страницы памяти прямо в pipe:
struct iovec iov = {
.iov_base = buf,
.iov_len = len
};
vmsplice(pipefd[1], &iov, 1, SPLICE_F_GIFT);
Самая интересная часть — SPLICE_F_GIFT.
Этим флагом userspace фактически говорит ядру: эти страницы памяти можно считать переданными тебе.
Это используется в zero-copy/low-copy сценариях, где хочется минимизировать лишние копирования между userspace и kernel space.
Но есть нюанс: после такой передачи нельзя относиться к этим страницам как к обычной памяти и спокойно менять их содержимое.
Очень низкоуровневая штука, но отличный пример того, насколько далеко Linux позволяет зайти в оптимизации I/O.