Системный вызов Splice, что передается в канал? Данные или информация о местонахождении?

Я знаю, что со сплайсингом мы все можем остаться в ядре. Но я не уверен, что это данные или информация о местонахождении, которые передаются в канал.

РЕДАКТИРОВАТЬ 1: Спасибо @vinayak, теперь я знаю, что на самом деле происходит копирование данных в буфер канала и из него. Но тогда мне просто интересно, почему мы не можем просто передать информацию о местонахождении и длине в канал?

  • В пределах одного процесса адресное пространство одинаково
  • Между разностными процессами это также работает, если буфер канала имеет линейное отображение. Если нет, мы можем использовать адрес DMA.

person sliter    schedule 24.06.2013    source источник


Ответы (1)


см. здесь

splice() — это механизм системного вызова для выполнения ввода-вывода из одного файла в другой файл в пространстве ядра без копирования из/в пространство пользователя. Это способ повысить производительность ввода-вывода. Системный вызов splice позволяет избежать копирования всех данных из пространства пользователя в пространство ядра и наоборот. Он читает по указанному смещению из входного файла и записывает в канал в пространстве ядра. Нет копирования данных в пространство пользователя. Затем его можно вызвать для записи данных из канала в выходной файл с указанным/текущим смещением.

splice() работает, используя механизм конвейерного буфера, чтобы открыть дескриптор файла для источника данных и другой для приемника данных, а затем с помощью splice() он может объединить их вместе. Другими словами, splice() работает с буфером ядра, которым управляет пользователь, и перемещает данные в/из буфера из/в произвольный файловый дескриптор. Указание смещения с помощью трубы, как обычно, является ошибкой. Если смещение не указано с дескриптором входного/выходного файла, то текущее смещение будет считаться указанным смещением. В настоящее время один из файловых дескрипторов должен быть каналом, иначе это ошибка.

person vinayak jadi    schedule 24.06.2013