Унифицированный доступ к совместно используемой и управляемой памяти
Иллюстрации
Показать всеИзобретение относится к области управления памятью. Технический результат заключается в повышении надежности вычислительного процесса. Предложен способ выполнения сборки мусора, содержащий действие просмотра конкретной части управляемой памяти, действие обнаружения множества объектов при просмотре этой конкретной части управляемой памяти, включая ссылку на неизменяемый буфер. При обнаружении упомянутой ссылки, определение того, что данная ссылка соответствует элементу вне управляемой памяти, и в случае, если ссылка не соответствует, отказ от выполнения сборки мусора в отношении данного элемента, соответствующего ссылке. 2 н. и 8 з.п. ф-лы, 14 ил.
Реферат
УРОВЕНЬ ТЕХНИКИ
[0001] Производительность компьютерной операционной системы часто характеризуется максимальной скоростью операций ввода/вывода (I/O) (также называемой "I/O-производительностью"), которую операционная система может поддерживать в течение некоторого заданного интервала времени. В результате операционные системы задействуют множество различных широко известных механизмов для повышения I/O-производительности.
[0002] Операционные системы традиционно пишутся с использованием неуправляемых языков (таких как язык ассемблера, C, C++), которые обеспечивают программистам системы очень точное управление тем, как осуществляются манипуляции с памятью. Использование непроверяемых указателей может быть использовано с целью минимизировать служебное сигнализирование операционной системы и обеспечить возможность увеличенной пропускной способности или уменьшенной задержки. Недостаток использования этих непроверяемых указателей состоит в том, что их сложно создавать и обуславливать, что приводит к ненадежным программным средствам и к уязвимостям безопасности.
[0003] Написание программных средств на управляемом языке программирования обеспечивает существенные преимущества в точности и эффективность по времени разработки. Эти управляемые языки предотвращают то, что программисты создают множество видов программных дефектов, что приводит к улучшенному качеству программных средств и уменьшенному времени разработки. Точность операционной системы является важной составляющей для обеспечения надежного и безопасного вычислительного процесса. Таким образом, использование управляемых языков для создания операционных систем является привлекательным предложением, поскольку может быть улучшена надежность операционной системы и могут быть уменьшены издержки разработки.
[0004] Для достижения этих преимуществ управляемые языки программирования добавляют уровень абстракции между исходным кодом, составленным программистом, и необработанными машинными ресурсами физической компьютерной системы. Этот уровень абстракции в общем случае служит для ограничения того, что программисты имеют возможность писать, и, таким образом, для устранения целых категорий потенциальных дефектов. К сожалению, этот уровень абстракции создает служебное сигнализирование, которое может повредить выполнению создаваемых программных средств. В результате, общераспространенное мнение состоит в том, что управляемые языки заменяют дефекты точности дефектами производительности. Таким образом, программные средства, написанные на управляемых языках, часто считаются по существу медленнее, чем программные средства, написанные на неуправляемых языках.
[0005] Конкретной проблемой, которая влияет на операционные системы управляемого кода, является свойственная им необходимость копировать данные между слоями, когда данные перемещаются через систему. Это вызвано тем фактом, что отдельные компоненты системы существуют в различных контекстах изоляции и не существует четкого механизма для ухода от этих контекстов изоляции.
СУЩНОСТЬ ИЗОБРЕТЕНИЯ
[0006] В соответствии с по меньшей мере одним вариантом осуществления, описанным здесь, система имеет управляемую память, в которой каждая из множества вычислительных сущностей имеет соответствующую специализированную для сущности часть управляемой памяти, которая подвергается сборке мусора. Неизменяемый буфер расположен вне управляемой памяти. Для некоторой заданной вычислительной сущности соответствующая часть управляемой памяти содержит один или несколько специализированных для сущности объектов, к которым может осуществляться доступ конкретной вычислительной сущностью, но не множеством других вычислительных сущностей, которые имеют свои собственные специализированные для сущности части управляемой памяти.
[0007] Для одной или нескольких из специализированных для сущности частей управляемой памяти часть также включает в себя ссылку на совместно используемую (разделяемую) память. В одном варианте осуществления эта совместно используемая память может быть неизменяемым буфером. Ссылка структурирована так, чтобы ее игнорировала программа сборки мусора, хотя ссылка может иметь вид просто обычного объекта в части управляемой памяти. Например, возможно, что ссылка является элементом массива. Программа сборки мусора, однако, может отличать ссылку от других объектов. В качестве примера, программа сборки мусора может искать адрес в массиве, и если этот адрес является местоположением вне управляемой памяти, программа сборки мусора не выполняет сборку мусора в отношении ссылки.
[0008] Таким образом, обеспечивается возможность унифицированной модели доступа к памяти, в которой способы для того, чтобы вычислительная сущность осуществляла доступ к обычному объекту в управляемой памяти, подобны тому, как вычислительная сущность осуществляет доступ к совместно используемой памяти. Это краткое описание сущности изобретения не предназначено ни для определения ключевых признаков или существенных признаков заявляемого изобретения, ни для использования в качестве помощи в определении объема заявляемого изобретения.
КРАТКОЕ ОПИСАНИЕ ЧЕРТЕЖЕЙ
[0009] С целью описания того, как вышеперечисленные и другие преимущества и признаки могут быть получены, более конкретное описание различных вариантов осуществления будет обеспечено путем ссылки на приложенные чертежи. С пониманием, что эти чертежи изображают только примерные варианты осуществления и, таким образом, не должны расцениваться как ограничивающие объем изобретения, варианты осуществления будут описаны и объяснены с дополнительной конкретностью и подробностями посредством использования сопроводительных чертежей, на которых:
[0010] фиг. 1 абстрактно изображает вычислительную систему, в которой некоторые варианты осуществления, описанные здесь, могут быть задействованы;
[0011] фиг. 2 изображает блок-схему способа для обеспечения неизменяемого буфера;
[0012] фиг. 3A изображает среду, в которой происходит процесс заполнения буфера;
[0013] фиг. 3B изображает среду, в которой заполненный буфер делается неизменяемым;
[0014] фиг. 4 изображает блок-схему способа для использования неизменяемого буфера;
[0015] фиг. 5 изображает среду, в которой различные вычислительные сущности имеют различные представления для неизменяемого буфера;
[0016] фиг. 6 изображает блок-схему способа для передачи неизменяемых данных от одной вычислительной сущности к следующей;
[0017] фиг. 7 изображает потоковую среду, в которой поток данных обеспечен из источника потока буферу потока и затем обеспечен из буфера потребителю потока;
[0018] фиг. 8 изображает среду, в которой вторая вычислительная сущность получает кэш посредством кэша первой вычислительной сущности;
[0019] фиг. 9 изображает блок-схему способа, которым вторая вычислительная сущность сначала осуществляет считывание из кэша, поддерживаемого первой вычислительной сущностью;
[0020] фиг. 10 изображает блок-схему способа, которым вторая вычислительная сущность после этого осуществляет считывание из кэша, поддерживаемого первой вычислительной сущностью;
[0021] фиг. 11 изображает блок-схему способа, которым первая вычислительная сущность (или резервный кэш) выполняет высвобождение;
[0022] фиг. 12 изображает примерную систему управляемого кода; и
[0023] фиг. 13 изображает обычный управляемый массив байтов, который имеет два отдельных интервала, указывающих на него и обеспечивающих возможность приложению просматривать части массива в качестве различных типов.
ПОДРОБНОЕ ОПИСАНИЕ
[0024] В соответствии с вариантами осуществления, описанными здесь, описаны механизмы, которые продвигают семантику ввода/вывода (I/O) с нулевым копированием в управляемых операционных системах. Некоторые из таких механизмов могут быть использованы в операционных системах неуправляемого кода, а также в операционных системах управляемого кода. Механизмы не являются взаимно-исключающими, поскольку один, некоторые или даже все из механизмов могут быть скомбинированы, чтобы еще лучше способствовать I/O-семантике нулевого копирования.
[0025] "Нулевое копирование" означает архитектуру, спроектированную для обеспечения возможности данным входить в систему путем записи в память и распространения через множество уровней абстракции без необходимости копировать данные. Архитектура нулевого копирования не гарантирует, что никакого копирования данных не происходит. В действительности, она всего лишь устанавливает механизм для обеспечения того, что большинство I/O-операций может быть осуществлено без копирования. В этом описании и в формуле изобретения "память" определена как любая оперативная память, которая обычно является энергозависимой памятью, но может также включать в себя энергонезависимые части или, возможно, может целиком являться энергонезависимой. В этом описании и в формуле "память" определена как первичный носитель данных вычислительной системы, состоящей из отдельных местоположений с возможностью адресации, доступных микропроцессорам вычислительной системы и доступных аппаратным устройствам, таким как графические средства управления или средства управления сетевыми интерфейсами посредством механизмов DMA (непосредственного доступа к памяти).
[0026] Во-первых, будут описаны механизмы неизменяемых коллективных данных с возможностью совместного использования нулевого копирования, которые используют неизменяемый буфер совместно используемых данных. Такие механизмы обеспечивают возможность переноса больших буферов данных по всей вычислительной системе без копирования. Механизмы будут дополнительно расширены на совместное использование потоков данных внутри вычислительной системы с полным управлением потоков для обеспечения возможности эффективного использования ресурсов, при этом поддерживая полную семантику нулевого копирования. В то время как текущий тип безопасности систем управляемого кода обеспечивает возможность более непосредственного осуществления этих механизмов, использование этих механизмов внутри систем неуправляемого кода также может быть задействовано.
[0027] Во-вторых, будет описан механизм для кэширования с нулевым копированием. Такое кэширование с нулевым копированием может быть задействовано как в системах неуправляемого кода, так и в системах управляемого кода. Кэширование с нулевым копированием обеспечивает возможность создания универсальной архитектуры кэширования, которая представляет семантику нулевого копирования для данных, входящих в кэш, а также данных, возвращаемых из кэша.
[0028] В-третьих, будет описано несколько механизмов, которые дополнительно улучшают производительность систем управляемого кода независимо от того, применяют эти системы неизменяемый буфер или совместно используемые данные. Такие механизмы управляемого кода включают в себя унифицированный доступ к памяти и безопасное по типам приведение типов. Унифицированный доступ к памяти обеспечивает возможность управляемому коду унифицированным образом осуществлять доступ как к управляемой памяти, так и к неуправляемой памяти (используемой для I/O-буферов) с использованием стабильного и компонуемого подхода. Безопасное по типам приведение типов обеспечивает возможность управляемому коду выполнять приведение указателей для обеспечения возможности того, чтобы некоторая заданная область памяти рассматривалась как обособленные типы, при этом сохраняя полную безопасность по типам.
[0029] Некоторое вступительное рассмотрение вычислительной системы будет описано в отношении фиг. 1. Затем вышеперечисленные механизмы будут описаны в порядке, обеспеченном выше, в отношении фиг. 2-13.
[0030] Сейчас вычислительные системы все чаще принимают широкое множество различных форм. Вычислительные системы могут, например, быть карманными устройствами, приборами, компьютерами-ноутбуками, настольными компьютерами, мейнфреймами, распределенными вычислительными системами или даже устройствами, которые стандартно не рассматривались как вычислительная система. В этом описании и в формуле изобретения термин "вычислительная система" определен широко, как включающий в себя любое устройство или систему (или их комбинацию), которые включают в себя по меньшей мере один физический и материальный процессор, и физическую и материальную память с возможностью иметь машиноисполняемые инструкции, которые могут исполняться процессором. Память может принимать любую форму и может зависеть от природы и формы вычислительной системы. Вычислительная система может быть распределенной по сетевой среде и может включать в себя множество составляющих вычислительных систем.
[0031] Как изображено на фиг. 1, в ее самой базовой конфигурации вычислительная система 100 включает в себя по меньшей мере один обрабатывающий блок 102 и машиночитаемые носители 104. Машиночитаемые носители 104 концептуально могут рассматриваться как включающие в себя физическую системную память, которая может быть энергозависимой, энергонезависимой или некоторой комбинацией этих двух типов. Машиночитаемые носители 104 также концептуально включают в себя энергонезависимое массовое хранилище. Если вычислительная система является распределенной, возможность обработки, памяти и/или хранения также может быть распределенной.
[0032] Используемый здесь термин "исполняемый модуль" или "исполняемый компонент" может обозначать программные объекты, маршрутизации или способы, которые могут исполняться на вычислительной системе. Различные компоненты, модули, подсистемы и службы, описанные здесь, могут осуществляться как объекты или процессы, которые исполняются на вычислительной системе (например, в качестве отдельных потоков). Такие исполняемые модули могут быть управляемым кодом в случае исполнения в управляемой среде, в которой внедряется безопасность по типам и в которой процессам выделяются их собственные отдельные объекты памяти. Такие исполняемые модули могут также быть неуправляемым кодом в случае, когда исполняемые модули разрабатываются на внутреннем коде, таком как C или C++.
[0033] В описании, которое следует далее, варианты осуществления описаны со ссылками на действия, которые выполняются одной или несколькими вычислительными системами. Если такие действия осуществляются в программных средствах, один или несколько процессоров ассоциированной вычислительной системы, которая выполняет действие, управляют операцией вычислительной системы в ответ на исполнение машиноисполняемых инструкций. Например, такие машиноисполняемые инструкции могут осуществляться на одном или нескольких машиночитаемых носителях, которые формируют компьютерный программный продукт. Пример такой операции включает в себя манипуляцию данными. Машиноисполняемые инструкции (и манипулируемые данные) могут сохраняться в памяти 104 вычислительной системы 100. Вычислительная система 100 может также содержать каналы 108 связи, которые обеспечивают возможность вычислительной системе 100 осуществлять связь с другими процессорами через, например, сеть 110.
[0034] Варианты осуществления, описанные здесь, могут содержать или задействовать специализированный или универсальный компьютер, включающий в себя компьютерные аппаратные средства, такие как, например, один или несколько процессоров и системная память, как рассмотрено более подробно ниже. Варианты осуществления, описанные здесь, также включают в себя физические и другие машиночитаемые носители для переноса или хранения машиноисполняемых инструкций и/или структур данных. Такие машиночитаемые носители могут быть любыми доступными носителями, к которым может осуществляться доступ универсальной или специализированной компьютерной системой. Машиночитаемые носители, которые хранят машиноисполняемые инструкции, являются физическими носителями памяти. Машиночитаемые носители, которые переносят машиноисполняемые инструкции, являются носителями передачи. Таким образом, в качестве примера и не ограничения, варианты осуществления изобретения могут содержать по меньшей мере два раздельных различных вида машиночитаемых носителей: компьютерные носители памяти и носители передачи.
[0035] Компьютерные носители памяти включают в себя RAM, ROM, EEPROM, CD-ROM или другой накопитель на оптических дисках, накопитель на магнитных дисках или другие магнитные устройства хранения, или любой другой материальный носитель данных, который может быть использован для хранения желаемых средств программного кода в форме машиноисполняемых инструкций или структур данных и к которому может осуществлять доступ универсальный или специализированный компьютер.
[0036] "Сеть" определяется как одна или несколько линий передачи данных, которые обеспечивают возможность переноса электронных данных между компьютерными системами, и/или модулями, и/или другими электронными устройствами. Когда информация переносится или обеспечивается по сети или другому соединению связи (либо жестко замонтированному, либо беспроводному, либо комбинации жестко замонтированного или беспроводного) компьютеру, компьютер надлежащим образом рассматривает соединение как носитель передачи. Носители передачи могут включать в себя сеть и/или линии передачи данных, которые могут быть использованы для переноса желаемых средств программного кода в форме машиноисполняемых инструкций или структур данных и к которым может осуществлять доступ универсальный или специализированный компьютер. Комбинации вышеописанного должны также включаться в объем машиночитаемых носителей.
[0037] Кроме того, при достижении различных компонентов компьютерной системы средства программного кода в форме машиноисполняемых инструкций или структур данных могут быть перенесены автоматически с носителей передачи на компьютерные носители памяти (или наоборот). Например, машиноисполняемые инструкции или структуры данных, принимаемые по сети или линии передачи данных, могут буферизоваться в RAM внутри средства управления сетевого интерфейса (например, "NIC") и затем в какой-то момент переноситься в RAM компьютерной системы и/или в менее энергозависимую компьютерную среду хранения в компьютерной системе. Таким образом, следует понимать, что компьютерные носители памяти могут быть включены в компоненты компьютерной системы, которые также (или даже в первую очередь) задействуют носители передачи.
[0038] Машиноисполняемые инструкции содержат, например, инструкции и данные, которые при исполнении в процессоре побуждают универсальный компьютер, специализированный компьютер или специализированное обрабатывающее устройство выполнять некоторую функцию или группу функций. Машиноисполняемыми инструкциями могут быть, например, двоичные файлы, инструкции промежуточного формата, такого как язык ассемблера, или даже исходный код. Хотя изобретение было описано на языке, характерном для структурных признаков и/или методологических действий, следует понимать, что изобретение, определенное в прилагаемой формуле изобретения, не обязательно ограничивается описанными признаками или действиями, описанными выше. В действительности, описанные признаки и действия раскрываются в качестве примерных форм осуществления формулы.
[0039] Специалисты в данной области техники поймут, что изобретение может осуществляться на практике в сетевых вычислительных средах с множеством типов конфигураций компьютерной системы, включающих в себя персональные компьютеры, настольные компьютеры, компьютеры-ноутбуки, процессоры сообщений, портативные устройства, многопроцессорные системы, основанную на микропроцессоре или программируемую бытовую электронику, сетевые PC, миникомпьютеры, компьютеры-мейнфреймы, мобильные телефоны, PDA, пейджеры, маршрутизаторы, переключатели и т.п. Изобретение может также осуществляться на практике в распределенных системных средах, где локальные и удаленные компьютерные системы, которые связываются (либо посредством жестко замонтированных линий передачи данных, либо посредством беспроводных линий передачи данных, либо посредством комбинации жестко замонтированных и беспроводных линий передачи данных) через сеть, вместе выполняют задачи. В распределенной системной среде программные модули могут быть расположены как в локальных, так и в удаленных устройствах хранения памяти.
Неизменяемые коллективные данные нулевого копирования с возможностью совместного использования
[0040] Большой сложностью для поддержки нулевого копирования были I/O-интерфейсы в традиционных системах, которые определяются как операции копирования между различными слоями в системе. Интерфейс прикладных программ (API) считывания принимает буфер приложения в качестве входных данных и заполняет его данными из некоторого источника данных. Подобным образом API записи берет буфер приложения и записывает его содержимое в некоторую цель данных. Семантика API считывания/записи обеспечивает приложению полную свободу для выравнивания буфера, пространства выделения и удерживания. Эта простая модель имеет несколько характерных ограничений, заключающихся в том, что модель не имеет возможности выразить несмежные буферы или уменьшить количество операций копирования данных.
[0041] Множество операционных систем поддерживают файлы, отображаемые в память, как механизм для совместного использования страниц в буферном кэше файловой системы с приложениями и избегания операций копирования, ассоциированных с интерфейсом считывания/записи. Специальные API были добавлены к сетевому интерфейсу, чтобы непосредственно посылать данные от буферного кэша файловой системы с использованием отображения в памяти файлов для ускорения сетевого трафика.
[0042] Абстракции файлов, отображаемых в память, не достает поддержки для скрывания базового выравнивания и разреженного формата буферов и требуется, чтобы приложения обрабатывали и управляли виртуальными отображениями и представлениями логических данных непосредственно. Например, приложению, осуществляющему доступ к файлу на смещении 10, необходимо применить арифметику указателей на виртуальном адресе базы отображения для выведения верного адреса. Расширение файла, когда он отображается, требует, чтобы приложение управляло дополнительными представлениями, которые не обязательно являются смежными в адресном пространстве, и доступы между представлениями должны обрабатываться приложением.
[0043] Избегание копий данных посредством файлов, отображаемых в память, имеет другие недостатки. Обеспечение семантической непротиворечивости между файлами, отображаемыми в память, и операциями считывания/записи требует сложной координации между I/O, памятью и файловыми системами. I/O, отображаемый в память, вносит служебное сигнализирование синхронного завершения, поскольку пропуск ошибки страницы на виртуальном адресе, который отображается в файловую область, задерживает поток, пока страница не будет доступна в физической памяти.
[0044] Методики виртуальной памяти копирования при записи также использовались для скрывания издержек от операций копирования. Эти методики копирования при записи назначают псевдоним приложению и страницам буферного кэша на основе предположения, что является редкостью то, что приложения модифицируют входные буферы на месте. Это дает файловой системе возможность кэшировать одни и те же физические страницы без копирования. Для некоторых рабочих загрузок эта оптимизация может избегать операции копирования ценой существенной сложности, в особенности, когда приложение и стеки памяти находятся в различных областях защиты. Другие методики, такие как повторное отображение страницы виртуальной памяти, были полезны для сетевых путей приема при определенных условиях, когда буферы приложения надлежащим образом выровнены.
[0045] Фиг. 2 изображает блок-схему способа 200 для обеспечения неизменяемого буфера. Фиг. 3A изображает среду 300A, в которой происходит процесс заполнения буфера. Фиг. 3B изображает среду 300B, в которой заполненный буфер становится неизменяемым. Соответственно способ 200 с фиг. 2 далее будет описан с частыми ссылками на фиг. 3A и 3B. Среды 300A и 300B могут возникать внутри вычислительной системы 100 с фиг. 1, хотя не обязательно. Среды 300A и 300B могут быть распределенными или находящимися в одной вычислительной системе.
[0046] К исходным данным, которые должны быть использованы для заполнения буфера, сначала осуществляется доступ получающей вычислительной сущностью (действие 210). Исходные данные могут быть любыми данными, но в одном варианте осуществления исходные данные включают в себя большое количество коллективных данных, которые требуют существенных вычислительных ресурсов для генерирования. В этом описании и в формуле изобретения "вычислительной сущностью" является любой компонент, модуль, метод, функция, процесс, процессор или любая их комбинация, которые имеют возможность обрабатывать данные в вычислительной системе. Такая вычислительная сущность может быть распределенной или располагаться на одном компьютере.
[0047] Получающая вычислительная сущность может генерировать все или некоторые из исходных данных (действие 211). В качестве альтернативы или дополнения, получающая вычислительная сущность может получать все или некоторые из исходных данных из источника данных (действие 212). Например, со ссылкой на фиг. 3A, получающая вычислительная сущность 320 получает (как представлено стрелкой 301) исходные данные 311 из источника 310 данных. Источником данных может быть, например, сеть или энергонезависимое устройство хранения, такое как диск.
[0048] Получающая вычислительная сущность также получает буфер (действие 220). Это получение буфера (220) показано параллельно с получением исходных данных (действие 210), поскольку самый широкий аспект принципов, описанных здесь, не требует того, чтобы какое-либо из действий происходило первым. Однако в некоторых системах одно может требоваться перед другим и/или эти действия могут по меньшей мере частично происходить параллельно. Со ссылкой на фиг. 3A, получающая вычислительная сущность 320 получает буфер 330 в той степени, что получающая вычислительная сущность может затем заполнять буфер 330 данными.
[0049] Независимо от того, генерирует ли получающая вычислительная сущность исходные данные или же принимает исходные данные из источника данных, или и то, и другое, получающая вычислительная сущность заполняет буфер данными (действие 230). Со ссылкой на фиг. 3A, например, получающая вычислительная сущность 320 заполняет (как представлено стрелкой 302) данными 311 буфер 330.
[0050] Буфер затем классифицируется как неизменяемый (действие 240). Фиг. 3B изображает среду 300B, которая подобна среде 300A с фиг. 3A за исключением того, что данные 311 изображены защищенными внутри буфера 330, который изображен как имеющий заштрихованную границу 331, абстрактно представляющую, что буфер 330 теперь неизменяемый. Эта классификация защищает данные (например, данные 311), заполняющие неизменяемый буфер (например, буфер 330 на фиг. 3B), от изменения в течение времени существования неизменяемого буфера и также защищает неизменяемый буфер от изменения его физического адреса в течение времени существования неизменяемого буфера. Ввиду этой неизменяемой характеристики, доступ к неизменяемым данным может быть предоставлен произвольному количеству вычислительных сущностей без риска конфликта, поскольку каждая из этих вычислительных сущностей может только просматривать данные.
[0051] В среде собственного языка (такого как C или C++) эта неизменяемость может достигаться путем записи в блок управления памяти (MMU) процессора для ограничения процессора в записи в конкретные диапазоны памяти. Это может быть довольно затратно, и ограничение на доступы к памяти не очень детализировано, будучи часто достигаемым на относительно большом страничном уровне. Кроме того, это может быть затратной операцией и не избегает ситуаций, в которых копирование выполняется для того, чтобы скрыть данные от других уровней со степенью детализации, меньшей чем страничный уровень.
[0052] В управляемой среде (среде, которая включает в себя управляемое время выполнения) программные средства используются для объявления памяти неизменяемой и для введения неизменяемости. Кроме того, время существования буфера памяти может обслуживаться посредством счетчика использования, который увеличивает значение, когда сущности предоставляется новый указатель на память, и уменьшает значение, когда указатель на память больше не используется сущностью. Когда счетчик использования возвращается на ноль, буфер недоступен и может быть возвращен средством управления памятью. В одном варианте осуществления ядро предоставляет права различным сущностям для осуществления доступа к памяти и обслуживает счетчик использования, в то время как управляемое время выполнения обеспечивает представления неизменяемой памяти, вводит неизменяемость и обеспечивает ограничения для данных. Дополнительные подробности, касающиеся управляемых сред, описаны ниже в отношении фиг. 12.
[0053] Фиг. 4 изображает блок-схему способа для использования неизменяемого буфера. Прежде всего компонент представления предлагает гибкие представления для неизменяемого буфера (действие 401) и затем обеспечивает представления надлежащим образом различным потребителям неизменяемого буфера (действие 402). Вычислительная сущность затем может осуществлять доступ к неизменяемому буферу только через его соответственное представление (действие 403). Например, со ссылкой на среду 500 с фиг. 5, первая вычислительная сущность 501 осуществляет доступ к (что представлено стрелкой 521) неизменяемому буферу 330 через первое представление 511, и вторая вычислительная сущность 502 осуществляет доступ к (что представлено стрелкой 522) неизменяемому буферу 330 через второе представление 512. Эллипсы 513 показывают, что это может быть продолжено для большего количества, чем только эти две вычислительные сущности 501 и 502. Представления 511 и 512 могут быть различными представлениями, но могут также быть одним и тем же представлением. Так или иначе, компонент 520 представления имеет возможность обеспечения различных представлений базового неизменяемого буфера 330. В этом описании термины "первый" и "второй" используются исключительно для отличия одного элемента от другого и не подразумевают какой-либо последовательности, приоритета, позиции или важности.
[0054] В некоторых вариантах осуществления вычислительные сущности, которые потребляют данные из неизменяемого буфера, находятся с различных сторон границы защиты или процесса. Например, фиг. 5 изображает, что вычислительные сущности 501 и 502, которые потребляют данные через их соответственные представления 511 и 512, в действительности разделены границей 530. Например, вычислительные сущности 501 и 502 могут быть раздельными процессами, в случае чего граница 530 представляет границу между процессами. Граница 530 может также быть границей защиты, в случае чего можно не обеспечивать данные непосредственно другому без копирования. Например, вычислительная сущность 501 может быть компонентом ядра внутри операционной системы, в то время как вычислительная сущность 502 может быть компонентом пользовательского режима, таким как компонент приложения.
[0055] Обычно данные не используются совместно между процессами и границами защиты, если только данные не копируются. Такое копирование может тратить существенное количество вычислительных ресурсов, в особенности если количество копируемых данных очень большое или если различные части данных должны часто совместно использоваться между такими границами. Принципы, описанные здесь, обеспечивают удобный и гибкий механизм для совместного использования данных между процессами и границами защиты без копирования. Таким образом, это улучшает производительность операционной системы.
[0056] Представления, обеспечиваемые средством 520 обеспечения представления, могут быть мелкоструктурными. Например, предположим, что неизменяемые данные, которые должны быть считаны из неизменяемого буфера, являются сетевыми данными. Каждый из различных слоев пакета протоколов может быть заинтересован в различных частях этих сетевых данных. Компоненты сетевого уровня (такие как компонент протокола Интернета) могут быть заинтересованы в заголовках сетевого уровня, в то время как компонент уровня приложений может быть попросту заинтересован в необработанной полезной нагрузке. Между этими двумя слоями существуют различные компоненты, которые заинтересованы в различных частях сетевых данных.
[0057] Принципы, описанные здесь, могут быть эффективно применены к обработке этих сетевых данных без необходимости копирования сетевых данных. Например, самый нижний уровень пакета протоколов может иметь возможность просматривать весь сетевой пакет. Этот самый нижний уровень может обрабатывать самый внешний заголовок этого пакета и возвращать определение представления следующему компоненту более высокого уровня в стеке протоколов. Определение представления определяет весь объем сетевого пакета, кроме самого внешнего пакета. Этот второй компонент обеспечивает определение представления средству 520 обеспечения представления, которое обеспечивает это представление второму компоненту. Таким образом, самый нижний компонент видит весь пакет, в то время как следующий компонент видит тот же самый пакет без самого внешнего заголовка. Это было осуществлено без какого-либо копирования данных. Вместо этого данные остались внутри неизменяемого буфера. Это может повторяться до тех пор, пока самому верхнему слою приложения не будет обеспечено определение представления, которое определяет только полезную информацию пакета.
[0058] Фиг. 6 изображает блок-схему способа 600 для передачи неизменяемых данных от одной вычислительной сущности к следующей. Первая вычислительная сущность осуществляет доступ к определению представления (действие 601) и обеспечивает это определение представления средству обеспечения представления (действие 602). Средство обеспечения представления затем обеспечивает представление к первой вычислительной сущности (действие 603). После того как первая вычислительная сущность выполняет свою логическую операцию (действие 604), она может затем обеспечивать другое определение представления к следующей вычислительной сущности (действие 605), которое предназначено для обработки данных от неизменяемого буфера. Следующая вычислительная сущность может затем повторять этот способ 600, и, таким образом, процесс может продолжаться для множества слоев системы.
[0059] Несмотря на то, что выше описано потребление буферов/потоков способом нулевого копирования, принципы, описанные выше, могут также применяться к созданию буферов и потоков средством создания данных. В случае средства создания данных также существует гибкость для приложения, чтобы посылать его собственные буферы (назначаются отдельно) или запрашивать у средства создания данных обеспечить представления с возможностью записи (интервалы) в его собственном внутреннем буфере. Это потенциально не только устраняет копирование, но также улучшает использование буфера путем устранения необходимости посылать полузаполненные буферы.
Потоковая передача данных с нулевым копированием
[0060] Коллективное перемещение данных через операционную систему часто моделируется с использованием потоковой архитектуры. Поток представляет логический модуль обмена между источником данных и потребителем данных, обеспечивая возможность данным, создаваемым источником, быть доставленными по назначению. Потоки обычно осуществляют буферизацию для того, чтобы предусмотреть несоответствие пропускной способности между создателем и потребителем.
[0061] Например, фиг. 7 изображает потоковую среду 700, в которой поток 711 данных обеспечивается (как представлено стрелкой 701) из источника 710 потока в буфер 720 потока и затем обеспечивается (как представлено стрелкой 702) из буфера 720 потребителю 730 потока. Среда 700 также включает в себя средство 740 управления (диспетчер) потоко