СПОСОБ И СИСТЕМА ДЛЯ ПЕРЕДАЧИ ПОТОКОВЫХ МУЛЬТИМЕДИЙНЫХ ДАННЫХ С НУЛЕВЫМ КОПИРОВАНИЕМ
METHOD AND SYSTEM FOR TRANSMITTING FLOW MULTIMEDIA DATA WITH ZERO COPYING

Область техники
Изобретение относится к способу и системе для сети связи в области компьютерных приложений, в частности к способу и системе для осуществления передачи потоковых мультимедийных данных с нулевым копированием на базе стека сетевых протоколов Linux.
Предпосылки создания изобретения
На существующем уровне техники в приложениях сервера потоковых мультимедийных данных на базе операционной системы Linux необходимо передавать большой объем потоковых мультимедийных данных с диска в сеть. Когда потоковые мультимедийные данные передаются с диска в сеть, они должны передаваться несколько раз в различных системных пространствах.
Процесс передачи в основном включает три части: (1) считывание потоковых мультимедийных данных с дискового пространства и их запись в буфер данных пользователя; (2) упаковку потоковых мультимедийных данных, сохраненных в буфере данных пользователя, в пакеты RTP (Real-time Transport Protocol, транспортный протокол реального времени) и сохранение их в буфере передачи пользователя; (3) передачу пакетов RTP, сохраненных в буфере передачи пользователя, через сетевой сокет UDP (User Datagram Protocol, протокол передачи дейтаграмм пользователя).
В операционной системе Linux пользовательский процесс может считывать данные с диска через прямой системный вызов интерфейса ввода/вывода I/O, и системный вызов может записывать данные с диска прямо в буфер пользователя посредством механизма DMA (Direct Memory Access, прямой доступ к памяти); при использовании интерфейса системного вызова, связанного с сетевым сокетом UDP, можно рассылать пакеты RTP, причем системный вызов копирует пакеты RTP из пространства пользователя в пространство ядра и соответственно производит инкапсуляцию этих пакетов, затем передает эти пакеты в буфер передачи сетевого адаптера (сетевой карты) посредством механизма DMA, и, наконец, сетевой адаптер рассылает пакеты RTP.
В способе существующего уровня техники пользовательский процесс может считывать потоковые данные с диска без копирования (zero copy, "с нулевым копированием"), но копия данных требуется, когда потоковые мультимедийные данные упаковывают в пакеты RTP, кроме того, данные должны быть скопированы из пространства пользователя в пространство ядра при рассылке пакетов RTP.
Помимо этого, каждый раз, когда пользовательский процесс посылает пакет, требуется один раз использовать системный вызов, и каждый раз системный вызов должен осуществлять переключение от состояния пользователя на состояние ядра, а также после возвращения системного вызова он осуществляет переключение от состояния ядра на состояние пользователя. В условиях, когда сервер потоковых мультимедийных данных сильно загружен, происходит копирование больших объемов данных и переключение контекста, что потребляет значительные ресурсы процессора системы и снижает обрабатывающие способности системы.
Непроизводительные издержки при передаче пакетов потоковых мультимедийных данных главным образом возникают при формировании данных, копировании данных и передаче данных на различных уровнях, таких как пользовательский процесс, операционная система и управление сетевым адаптером. Поэтому очень важно эффективно снизить количество операций копирования данных и системных вызовов, снизить загрузку на процессор и увеличить обрабатывающую способность системы для улучшения производительности сервера потоковых мультимедийных данных.
Следовательно, требуется развить и усовершенствовать существующий уровень техники.
Сущность изобретения
Целью настоящего изобретения является создание способа и системы для осуществления передачи потоковых мультимедийных данных с нулевым копированием, причем настоящие способ и система основаны на стеке сетевых протоколов Linux, и притом что оригинальный стек сетевых протоколов системы Linux не затронут, настоящие способ и система максимально возможно снижают загрузку процессора, возникающую из-за копирования данных и системных вызовов, что улучшает обрабатывающую способность системы.
Для достижения указанной выше цели техническое решение настоящего изобретения включает:
способ осуществления передачи потоковых мультимедийных данных с нулевым копированием, причем данный способ основан на стеке сетевых протоколов Linux, при этом данный способ включает следующие шаги:
A) при приеме сервером потоковых мультимедийных данных запроса данных от оборудования пользователя, выполнение сервером потоковых мультимедийных данных системного вызова передачи данных, считывание потоковых мультимедийных данных с дискового пространства и их запись в буфер данных пользователя;
B) упаковку потоковых мультимедийных данных, сохраненных в буфере данных пользователя, в пакеты транспортного протокола реального времени;
и передачу этих пакетов данных транспортного протокола реального времени в форме пакетов потоковых мультимедийных данных, в которых заголовок и нагрузка разделены.
Помимо этого, шаг В настоящего способа также включает:
В1) выделение структуры буфера ядра в пространстве ядра для каждого подлежащего передаче пакета транспортного протокола реального времени, при этом данная структура включает две части: одной частью является временно выделенный буфер ядра, включающий заголовок упомянутого пакета транспортного протокола реального времени; а другой частью является временно отображенный буфер пользователя, включающий нагрузку упомянутого пакета транспортного протокола реального времени;
В2) использование функции сборки/распределения и функции прямого доступа к памяти сетевого адаптера, отображение буферов двух частей структуры буфера ядра на буфер передачи сетевого адаптера и вызов функции передачи драйвера сетевого адаптера для осуществления передачи потоковых мультимедийных данных с нулевым копированием.
Помимо этого, когда службе потоковых мультимедийных данных требуется обработать запросы от множества пользователей, передача одного пакета потоковых мультимедийных данных каждому пользователю требует одного системного вызова.
Помимо этого, в настоящем способе стек сетевых протоколов обеспечивает следующие интерфейсы программирования сокетов: "socket", который используется для создания сокета, "close", который используется для закрытия сокета, и "sendmsg", который используется для осуществления передачи потоковых мультимедийных данных с нулевым копированием.
Система для осуществления передачи потоковых мультимедийных данных с нулевым копированием включает сервер потоковых мультимедийных данных, при этом сервер потоковых мультимедийных данных конфигурируют для осуществления передачи потоковых мультимедийных данных с нулевым копированием на базе стека сетевых протоколов Linux. Указанный сервер потоковых мультимедийных данных конфигурирует пространство ядра между аппаратным устройством и пользовательским процессом, а также конфигурирует стек сетевых протоколов над программой драйвера сетевого адаптера в пространстве ядра; при этом пространство ядра выделяет для пакетов транспортного протокола реального времени, сформированных посредством упаковки потоковых мультимедийных данных, подлежащих передаче, следующие буферы:
временно выделенный буфер ядра для помещения заголовка пакетов транспортного протокола реального времени,
временно отображенный буфер пользователя для помещения нагрузки пакетов транспортного протокола реального времени.
Стек сетевых протоколов обеспечивает интерфейсы программирования сокетов для пользовательского процесса, при этом интерфейсы программирования сокетов включают: "socket", который используется для создания сокета, "close", который используется для закрытия сокета, и "sendmsg", который используется для осуществления передачи потоковых мультимедийных данных с нулевым копированием; при этом указанный стек сетевых протоколов используется для передачи пакетов транспортного протокола реального времени в форме пакетов потоковых мультимедийных данных, в которых заголовок и нагрузка разделены.
Помимо этого, в данной системе сервер потоковых мультимедийных данных применяет технологию групповой (butch) передачи для отправки множества пакетов в одном системном вызове "sendmsg".
По сравнению со стеком сетевых протоколов ядра Linux на существующем уровне техники, способ и система для осуществления передачи потоковых мультимедийных данных с нулевым копированием, раскрываемые в настоящем изобретении, обеспечивают передачу потоковых мультимедийных данных с нулевым копированием посредством использования функций DMA и SG (Scatter/Gather, распределение/сборка) сетевого адаптера и обеспечивают передачу пакетов потоковых мультимедийных данных, в которых заголовок и нагрузка разделены, что сокращает одну операцию копирования данных в процессе упаковки потоковых мультимедийных данных в пакеты RTP.
Краткое описание чертежей
На фиг.1 представлен процесс использования стека сетевых протоколов, реализованный в настоящем изобретении, для осуществления передачи потоковых мультимедийных данных с нулевым копированием.
На фиг.2 представлена структура системы в соответствии с настоящим изобретением.
Предпочтительные варианты осуществления настоящего изобретения
Далее предпочтительные варианты осуществления настоящего изобретения описываются более подробно со ссылками на чертежи.
В способе осуществления передачи потоковых мультимедийных данных с нулевым копированием на базе стека сетевых протоколов Linux в соответствии с настоящим изобретением используется оригинальный стек сетевых протоколов Linux, который реализуется посредством механизма модуля ядра, при этом загрузка и выгрузка модуля ядра не влияют на оригинальный стек сетевых протоколов ядра Linux. Система для осуществления передачи потоковых мультимедийных данных с нулевым копированием в настоящем изобретении включает сервер потоковых мультимедийных данных, как показано на фиг.2, при этом сервер потоковых мультимедийных данных конфигурируется сетевым адаптером для осуществления связи с оборудованием пользователя. Указанный сетевой адаптер (сетевая карта) поддерживает функции DMA (прямой доступ к памяти) и SG (распределение/сборка).
В способе и системе в соответствии с настоящим изобретением, аппаратные устройства указанного сервера потоковых мультимедийных данных включают сетевой адаптер и диск, как показано на фиг.1, при этом пространство ядра Linux располагается между аппаратным устройством и пользовательским процессом, стек сетевых протоколов конфигурируется над программой драйвера сетевого адаптера в пространстве ядра и указанный стек сетевых протоколов обеспечивает интерфейсы программирования сокетов для пользовательского процесса, причем указанные интерфейсы программирования сокетов включают в основном системные вызовы, такие как "socket", "close" и "sendmsg", где "socket" используется для создания сокета, "close" используется для закрытия сокета и "sendmsg" используется для осуществления передачи потоковых мультимедийных данных с нулевым копированием.
Аппаратная среда способа и системы в соответствии с настоящим изобретением требует наличия в сетевом адаптере функций DMA и SG, а программная среда представляет собой ядро Linux, имеющее соответствующие сетевые функции. Для реализации функции передачи потоковых мультимедийных данных с нулевым копированием, способ и система настоящего изобретения создают стек сетевых протоколов DATALINK, основанный на сокете типа AF_DATALINK на базе оригинального ядра Linux. Указанный стек протоколов обеспечивает для пользовательского процесса интерфейсы программирования сокетов типа AF_DATALINK, которые включают системные вызовы, такие как "socket", "close" и "sendmsg". При этом системный вызов "socket" используется для создания сокета, системный вызов "close" используется для закрытия сокета и системный вызов "sendmsg" используется для передачи потоковых мультимедийных данных в форме инкапсуляции в пакеты RTP с нулевым копированием.
Стандартная семантика вызова "sendmsg" на существующем уровне техники не способна реализовать функцию настоящего изобретения, поэтому "sendmsg" требуется определить заново. Далее описывается и поясняется "sendmsg" в соответствии со способом и системой настоящего изобретения:
ssize_t sendmsg(int socket, const struct msghdr *msg, int flags).
Функция:
передача потоковых мультимедийных данных с нулевым копированием реализуется с помощью сокета.
Входные и выходные параметры:
socket, сокет типа AF_DATALINK, создаваемый посредством системного вызова "socket";
msg→msg_name: временно не используется;
msg→msg_namelen: временно не используется;
msg→msg_iov: входной параметр, указатель, который указывает массив из struct iovec. Каждая структура struct iovec включает размер и адрес буфера данных, подлежащих передаче;
msg→msg_iovlen: входной параметр для хранения размера массива из struct iovec, на который указывает msg_iov;
msg→msg_control: параметр ввода-вывода для хранения управляющей информации, включающей IP адрес, UDP порт и тип нагрузки RTP каждого пакета потоковых мультимедийных данных во время ввода; а также для возвращения индекса и кода ошибки для пакетов, переданных с ошибками;
msg→msg_controllen: входной параметр, используемый для хранения общей длины сообщения msg_control;
msg→msg_flags: временно не используется;
flags: временно не используется.
Возвращаемое значение:
если пакеты были переданы с ошибками, возвращается -1 и код ошибки errno.
Если все или некоторые пакеты переданы успешно, возвращается число успешно переданных пакетов, индекс пакетов, которые переданы с ошибками и соответствующий код ошибки через выходной параметр.
Информация, из которой состоят пакеты RTP, хранится в параметре msg, а параметр msg_iov хранит информацию о нагрузке пакетов RTP, подлежащих передаче, включающую адрес и размер буфера данных пользователя, в качестве данных RTP пакетов; msg_control хранит информацию о заголовке пакетов RTP, подлежащих передаче, включающую IP адрес, номер порта и тип нагрузки RTP, используемые для формирования заголовка пакетов RTP.
Как показано на фиг.1, в соответствии со способом настоящего изобретения структура буфера ядра sk_buffer выделяется для каждого пакета RTP, подлежащего передаче, в пространстве ядра во время системного вызова "sendmsg", причем данные этой структуры состоят их двух частей: одной частью является временно выделенный буфер ядра, включающий заголовок RTP пакета потоковых мультимедийных данных, который генерируется в соответствии с информацией о заголовке, включаемой в msg_control; второй частью является временно отображенный буфер пользователя, включающий нагрузку пакета RTP, которая получается в соответствии с информацией о нагрузке, включенной в msg_iov. Посредством функций сетевого адаптера SG и DMA эти два буфера отображаются на буфер передачи сетевого адаптера, и вызывается функция передачи драйвера сетевого адаптера для осуществления передачи потоковых мультимедийных данных с нулевым копированием. Упомянутый выше процесс отображения (mapping) известен в данной области техники и не рассматривается в данном описании.
Когда сервер потоковых мультимедийных данных в соответствии со способом и системой настоящего изобретения обрабатывает запрос одного пользователя, передача потоковых мультимедийных данных с нулевым копированием может быть реализована через сокет AF_DATALINK и один системный вызов "sendmsg".
Когда серверу потоковых мультимедийных данных требуется обработать множество пользовательских запросов, помимо использования передачи потоковых мультимедийных данных с нулевым копированием, аналогично случаю с запросом одного пользователя, производительность системы может быть еще больше оптимизирована путем уменьшения числа системных вызовов: это в основном означает переопределение параметра msg, используемого для системного вызова "sendmsg", его элемент msg→msg_iov указывает группу буферов пакетов, а элемент msg→iovlen показывает число буферов пакетов. Один системный вызов может передать группу пакетов потоковых мультимедийных данных, и в практических применениях один пакет потоковых мультимедийных данных посылается каждому пользователю в одном вызове "sendmsg" с целью снижения числа системных вызовов "sendmsg", что приводит к оптимизации производительности системы.
В способе и системе настоящего изобретения используются функции DMA и SG сетевого адаптера для осуществления передачи потоковых мультимедийных данных с нулевым копированием. По сравнению со стандартным стеком сетевых протоколов ядра Linux, способ и система в соответствии с настоящим изобретением используют функцию SG сетевого адаптера для осуществления передачи пакетов потоковых мультимедийных данных, в которых заголовок и нагрузка разделены, что устраняет одну операцию копирования данных, необходимую в процессе упаковки потоковых мультимедийных данных в пакеты RTP.
При этом, посредством функции DMA сетевого адаптера, драйвер сетевого адаптера непосредственно использует буфер пользователя для передачи пакетов, что устраняет одну операцию копирования данных, необходимую в процессе копирования потоковых мультимедийных данных из пространства пользователя в пространство ядра.
В способе и системе настоящего изобретения применяется технология групповой передачи для осуществления функции передачи группы пакетов посредством одного системного вызова, и в результате устраняется ситуация, когда требуется один системный вызов для передачи одного пакета, и уменьшаются непроизводительные издержки на системные вызовы при передаче потоковых мультимедийных данных множеству пользователей. Реализация указанной технологии групповой передачи известна специалистам в данной области техники и не рассматривается в данном описании.
Необходимо отметить, что указанный стек сетевых протоколов реализуется посредством программного обеспечения, а для осуществления системных вызовов существует программное обеспечение, конкретная процедура которого известна специалистам в данной области техники и подробно не рассматривается в данном описании.
При этом необходимо отметить, что хотя предпочтительные варианты осуществления настоящего изобретения были описаны в подробностях, они не должны рассматриваться как ограничивающие объем правовой охраны настоящего изобретения, который определяется прилагаемой формулой изобретения.
Промышленная применимость
В способе и системе согласно настоящему изобретению полностью используются функции DMA и SG сетевого адаптера для осуществления передачи потоковых мультимедийных данных с нулевым копированием. По сравнению со стандартным стеком сетевых протоколов ядра Linux, в способе и системе настоящего изобретения используется функция SG сетевого адаптера для осуществления передачи пакетов потоковых мультимедийных данных, в которых заголовок и нагрузка разделены, что устраняет операцию копирования данных, необходимую во время процесса упаковки потоковых мультимедийных данных в пакеты RTP.