Способ (варианты) передачи объекта от первого процесса на второй процесс, машиночитаемый носитель (варианты) и система обработки данных
Иллюстрации
Показать всеИзобретение относится к средствам обработки данных для передачи объекта с первого процесса на второй процесс. Технический результат заключается в повышении скорости передачи программных объектов между процессами. Первый процесс имеет первое адресное пространство памяти, а второй процесс имеет второе адресное пространство памяти. Предоставляют первую копию объекта в первую смежную область первого адресного пространства памяти и предоставляют вторую копию объекта во вторую смежную область первого адресного пространства памяти. Для каждого местоположения первой и второй копии объекта в соответствующих местоположениях в рамках первой копии объекта и второй копии объекта сравниваются сохраненные соответствующие значения. Создают индекс местоположения в первой копии объекта и второй копии объекта, в которых соответствующие значения в соответствующих местоположениях не совпали. Предоставляется копия объекта и индекса местоположений для передачи на второй процесс, чтобы второй процесс мог использовать индекс местоположений для корректировки местоположений в копии объекта для второго адресного пространства памяти. 5 н. и 19 з.п. ф-лы, 4 ил.
Реферат
Область техники, к которой относится изобретение
Настоящее решение раскрывает способ предоставления промежуточных данных, созданных в течение выполнения компьютерной программы от первого процесса до второго.
Уровень техники
Существует много ситуаций, когда желательно передать промежуточные данные, инкапсулированные в программном объекте, с одного компьютера на другой. Например, может быть желательным переместить обработку данных с одного компьютера на другой, чтобы распределить нагрузку по группе или кластеру компьютеров. Альтернативно, при обработке запроса клиента по сети серверу, например, серверу баз данных может быть необходимо переместить программный объект обратно клиенту, чтобы предоставить клиенту возможность продолжать обработку программного объекта.
Программные объекты могут содержать комбинацию исполнимого кода, а также данных, и, таким образом, могут осуществлять их обработку и/или предоставлять данные другому программному объекту для обработки. Например, программный объект, такой как функция или подпроцедура, может быть инстанцирован (т.е. может быть создан экземпляр программного объекта) родительским объектом или основной программой, чтобы осуществлять определенные процессы для вызывающего родительского объекта или основной программы. Данные объекта могут включать в себя множество типов, например: элементарные типы данных, такие как целые, вещественные, булевы, символы; и структурные или абстрактные типы данных, такие как массивы или списки и типы данных, определенные пользователем, причем каждый включает в себя примеры данных или комбинаций типов данных. Программные данные могут быть сохранены напрямую в области памяти программного объекта или проиндексированы указателями, которые содержат адреса других программных объектов или данных. Передача программных объектов, включая указатели, может вызвать затруднения, в частности, при попытке переместить программный объект из программы или процесса, запущенного в одном адресном пространстве памяти в компьютере в другую программу или процесс, который потенциально использует другое адресное пространство памяти.
D.M. Dhamdhere приводит в книге "Operating Systems: A Concept-based Approach" ("Операционные системы: концептуальный подход"), ISBN: 0070611947, 2006 общий подход к распределению памяти на уровне операционной системы (ОС) компьютера. Известны решения смены абсолютной адресации данных на относительную адресацию, чтобы избежать проблем при передаче данных с первого компьютера (или процесса) на другой компьютер (или процесс). Однако такие решения могут потребовать инструментов управления памятью, которые могут анализировать содержимое и связывать его с процессом. Этот анализ может быть особенно обременительным, если нет априорного знания о природе обрабатываемого объекта.
В патенте США US8566536 (22 октября 2013), приводится описание разделения с прямым доступом физической памяти между процессами. Адресное пространство памяти связывается с каждым процессом с помощью заполнения первой записи в таблице высокоуровневых виртуальных адресов для каждого процесса. Каждое адресное пространство создается и связывается с данным процессом, главное ядро инициирует создание основного списка записи в таблице высокоуровневых виртуальных адресов каждого адресного пространства для каждого процесса. Таким образом, адресное пространство каждого процесса взаимно связано с каждым процессом с помощью заполнения одной или нескольких последовательных записей в таблице высокоуровневых виртуальных адресов первой записью в таблице высокоуровневых виртуальных адресов других процессов. Это решение, однако, зависит от функциональности, предоставленной ядром процессора.
Задачей настоящего решения является предоставления более легко применяемого механизма передачи программных объектов между процессами.
РАСКРЫТИЕ ИЗОБРЕТЕНИЯ
Первым объектом настоящего решения является способ обработки данных для передачи объекта с первого процесса на второй процесс, причем у первого процесса имеется первое адресное пространство, а у второго процесса имеется второе адресное пространство. Способ выполняется процессором компьютерного устройства, выполняющего первый процесс, способ содержит предоставление первой копии объекта в первую смежную область первого адресного пространства памяти; и предоставление второй копии объекта во вторую смежную область первого адресного пространства памяти. Для каждого местоположения первой и второй копии объекта в соответствующих местоположениях в первой копии объекта и второй копии объекта сравниваются сохраненные соответствующие значения. Создается индекс местоположения в первой копии объекта и второй копии объекта, в которых соответствующие значения в соответствующих местоположениях не совпали. Предоставляется копия объекта и индекса местоположений для передачи на второй процесс, чтобы второй процесс мог использовать индекс местоположений для корректировки местоположений в копии объекта для второго адресного пространства памяти.
В некоторых вариантах осуществления способ также содержит получение указателя указанного объекта для передачи; а также замену распределителя памяти по умолчанию на пользовательский распределитель памяти, причем пользовательский распределитель памяти выполнен с возможностью распределять память в смежной области памяти. В этом случае предоставление указанной первой копии содержит в себе указанный объект для передачи в указанную первую смежную область памяти, распределенную указанным пользовательским распределителем памяти; и предоставление указанной второй копии содержит копирование указанного объекта для передачи в указанную вторую смежную область памяти, распределенную указанным пользовательским распределителем памяти. Альтернативно способ также содержит: получение указателя указанного объекта для передачи, причем указанный объект занимает первую смежную область памяти, распределенную пользовательским распределителем памяти. В этом случает предоставление указанной второй копии содержит копирование указанного объекта для передачи в указанную вторую смежную область памяти, распределенную указанным пользовательским распределителем памяти.
В некоторых вариантах осуществления предоставление копии указанного объекта содержит копирование либо указанной первой копии указанного объекта, либо указанной второй копии указанного объекта в буфер.
В некоторых вариантах осуществления указанная скопированная первая или вторая копия указанного объекта располагается в базовом адресе в указанном первом адресном пространстве памяти, и указанный способ дополнительно содержит извлечение указанного базового адреса из значений указанной копии указанного объекта в указанный буфер в каждом местоположении в указанном индексе местоположений.
В некоторых вариантах осуществления скопированная первая или вторая копия указанного объекта располагается в базовом адресе в указанном первом адресном пространстве памяти, и способ дополнительно содержит извлечение указанного базового адреса из значений скопированной первой или второй копии объекта в каждом местоположении в указанном индексе местоположений перед копированием в указанный буфер.
Некоторые варианты осуществления содержат предоставление размера указанного объекта с указанной копией указанного объекта и указанный индекс местоположений для передачи указанному второму процессу.
Некоторые варианты осуществления выполнены с функцией сериализации, осуществляющей указанные этапы способа в ответ на вызов родительского объекта для передачи указанного объекта.
В некоторых случаях указанный первый процесс инстанцируется на первом компьютерном устройстве, а второй процесс инстанцируется на втором, ином компьютерном устройстве.
Альтернативно указанный первый процесс инстанцируется на первом компьютерном устройстве, а второй процесс инстанцируется на первом компьютерном устройстве позже. В некоторых вариантах осуществления предоставление указанной копии указанного объекта и указанного индекса местоположений для передачи содержит запись указанной копии указанного объекта и указанного индекса местоположений в персистентную память. В этом случае персистентная память может содержать в себе либо память компьютера, либо энергонезависимую память, доступную и указанному первому, и указанному второму процессу.
Альтернативно предоставление указанной копии указанного объекта и указанного индекса местоположений для передачи содержит передачу указанной копии указанного объекта и указанного индекса местоположений компьютерному устройству по сетевой линии.
В некоторых вариантах осуществления первый процесс является компилируемой программой на С, а указанный пользовательский распределитель памяти выполнен с возможностью осуществления перегруженной функции распределения памяти (malloc()). В других вариантах осуществления настоящей технологии первый процесс является компилируемой программой на С++, а указанный пользовательский распределитель памяти выполнен с возможностью осуществления перегруженной функции new().
И указанное первое, и второе адресное пространство памяти может быть виртуальным адресным пространством памяти.
Вторым объектом настоящего решения является способ обработки данных для передачи объекта с первого процесса на второй процесс, причем у первого процесса имеется первое адресное пространство, а у второго процесса имеется второе адресное пространство. Способ выполняется процессором компьютерного устройства, выполняющего второй процесс, способ содержит в себе получение копии объекта и индекса местоположения в копии объекта, указывающего на указатель местоположений в копии объекта. Объект копируется в смежную область второго адресного пространства памяти, причем область имеет базовый адрес. Значение базового адреса добавляется к значениям объекта в смежной области второго адресного пространства памяти в каждом местоположении в индексе местоположений.
Некоторые варианты осуществления дополнительно содержат в себе получение базового адреса для указанного объекта в указанном первом адресном пространстве памяти и извлечение указанного базового адреса из указанного объекта в указанном первом адресном пространстве памяти из значений указанного объекта в указанной смежной области указанного второго адресного пространства памяти в каждом местоположении в указанном индексе местоположений.
Некоторые варианты осуществления содержат в себе получение размера указанного объекта и распределение смежной области памяти по меньшей мере указанного размера в указанном втором адресном пространстве памяти.
Некоторые варианты осуществления выполнены с функцией десериализации, осуществляющей указанные этапы способа в ответ на вызов родительского объекта для получения указанного объекта.
Еще одним объектом является компьютерный программно-аппаратный продукт, включающий в себя выполняемые инструкции, которые хранятся на машиночитаемом носителе, и при выполнении которых компьютерное устройство настраивается для выполнения вышеуказанных способов.
Дополнительным объектом является система обработки данных, содержащая первое компьютерное устройство, соединенное со вторым компьютерным устройством, причем каждое настроено для выполнения вышеуказанных способов.
КРАТКОЕ ОПИСАНИЕ ЧЕРТЕЖЕЙ
Далее будут описаны различные примеры вариантов осуществления решения со ссылками на соответствующие чертежи, где:
на Фиг. 1 схематично изображена система для предоставления промежуточных данных, созданных во время осуществления решения, с первого процесса на второй процесс, причем система выполнена в соответствии с не ограничивающими вариантами осуществления настоящего решения;
На Фиг. 2 изображен способ сериализации, выполнимый в системе на Фиг. 1.
На Фиг. 3 изображен способ десериализации, выполнимый в системе на Фиг. 1.
На Фиг. 4 изображен пример сериализации и десериализации объектов, используемых в способах, проиллюстрированных на Фиг. 2 и 3.
ОСУЩЕСТВЛЕНИЕ ИЗОБРЕТЕНИЯ
На Фиг. 1 изображена схема системы 100, включающая в себя компьютерные устройство 20 и 21. Важно иметь в виду, что сервер ранжирования 100 является только одним из вариантов осуществления настоящего решения. Таким образом, все последующее описание представлено только как описание показательного примера. Это описание не предназначено для определения объема или установления границ настоящего решения. Некоторые полезные примеры модификаций системы 100 также могут быть охвачены нижеследующим описанием.
Целью этого является также исключительно помощь в понимании, а не определение объема и границ настоящего решения. Эти модификации не представляют собой исчерпывающий список, и специалистам в данной области техники будет понятно, что возможны и другие модификации. Кроме того, это не должно интерпретироваться так, что там, где это еще не было сделано, т.е. там, где не были изложены примеры модификаций, никакие модификации невозможны, и/или что то, что описано, является единственным вариантом осуществления этого элемента. Как будет понятно специалисту в данной области техники, это, скорее всего, не так. Кроме того, следует иметь в виду, что система 100 представляет собой в некоторых конкретных проявлениях достаточно простой вариант осуществления, и в подобном случае представлен здесь с целью облегчения понимания. Как будет понятно специалисту в данной области техники, многие варианты осуществления настоящего решения будут обладать гораздо большей сложностью. В первом варианте осуществления настоящего решения компьютерное устройство 20 функционально соединено с устройством 30 хранения данных, которое хранит программный код 10. Устройство 30 хранения данных может являться таким устройством памяти как жесткий диск, встроенный в компьютерное устройство 20, или устройство 30 хранения данных может быть соединено с компьютерным устройством 20 по сети (не показана) или по любому подходящему проводному или беспроводному соединению. В контексте настоящего описания, если конкретно не указано иное, "компьютерное устройство" подразумевает под собой аппаратное устройство, способное работать с программным обеспечением, подходящим к решению соответствующей задачи. Таким образом, некоторыми примерами электронных устройств (среди прочего) могут служить универсальные персональные компьютеры (настольные компьютеры, ноутбуки, нетбуки и т.п.), мобильные компьютерные устройства, смартфоны, планшеты, а также сетевое оборудование, такое как маршрутизаторы, коммутаторы и шлюзы. Следует иметь в виду, что устройство, ведущее себя как компьютерное устройство в настоящем контексте, может вести себя как сервер по отношению к другим электронным устройствам. Использование выражения «компьютерное устройство» не исключает возможности использования множества электронных устройств для получения/отправки, выполнения или инициирования выполнения любой задачи или запроса, или же последствий любой задачи или запроса, или же этапов любого вышеописанного способа.
Экземпляр 101 программы 10 загружен в адресное пространство памяти 16 компьютерного устройства 20. Память 16 может содержать в себе систему виртуальной памяти с физической памятью, отдельной от адресного пространства, но с целью упрощения память показана на Фиг. 1 как простой блок 16.
Экземпляр 101 программы конкретно выполнен, в свою очередь, для инстанцирования ряда программных объектов от 121 до 123. Как было описано выше программные объекты могут содержать в себе примеры функций, созданных в течение выполнения экземпляра 101 программы или простых или структурированных объектов данных, некоторые из которых могут содержать значения указателей, которые указывают на другие функции или данные. Программные объекты обычно расположены в иерархическом порядке, причем с родительские объекты вызывают инстанцирование одного или нескольких дочерних объектов. На Фиг. 1 изображены только два уровня дочерних объектов, причем объекты от 121 до 123 были инстанцированы экземпляром 101 программы и показаны как имеющие один или несколько инстанцированных дочерних объектов. Таким образом, программный объект 121 имеет инстанцированный объект 1211, а программный объект 122 имеет инстанцированные объекты 1221…1222, а программный объект 123 имеет инстанцированный объект 1231. Однако, будет понятно, что даже в программе средней сложности иерархия объектов может содержать множество уровней объектов.
Для родительского объекта программы 10, такого как главная программа или программный объект, может являться желательной передача дочернего объекта с данными на промежуточном этапе обработки другому экземпляру программы, где может быть осуществлена дальнейшая обработка объекта или обработка объектом. Для этого варианты настоящего решения описывают функцию сериализации и соответствующую функцию десериализации.
Функция сериализации предоставляет возможность родительскому объекту (и главной программе 10 или дочерним объектам, или дочерним объектам низших уровней в первом экземпляре 101 программы) указывать их дочерний объект, который должен быть передан функции сериализации, причем функция сериализации далее записывает информацию об объекте в буфер 60, которая затем может быть либо сохранена в постоянной памяти, такой как устройство 30 хранения данных, либо передана по сетевому соединению 40 для последующего использования другим экземпляром 102 программы. Указание, предоставленное функции сериализации, может включать вызывающий родительский объект, передающий объект для дальнейшей передачи, либо напрямую, т.е. передавая весь объект, либо посредством ссылки, т.е. используя указатель на объект. Другой экземпляр программы может быть вторым экземпляром 102 программы 10, запущенной на другом компьютерном устройстве 21; экземпляр может быть более поздним экземпляром программы 10, запущенной на том же компьютерном устройстве 20, спустя какое-то время после того, как первый экземпляр 101 программы закончил обработку; или вторым экземпляром может быть экземпляр иной программы, отличной от программы 10. На Фиг. 1 другой экземпляр 102 программы для простоты показан как отдельная программа, запущенная на втором компьютерном устройстве 21, соединенном с первым компьютерным устройством 20.
Функция десериализации дает возможность родительскому объекту, в этом примере объекту 120 во втором экземпляре 102 программы указывать сериализированный набор значений в буфере 60, либо извлеченный из устройства 30 хранения данных, либо полученный по сетевому соединению 40, и для получения из этих значений экземпляр программного объекта в частности имеет значения указателей, которые корректно связываются с адресным пространством в памяти 17, в которой инстанцирован второй экземпляр 102 программы. В любом случае, сериализованная информация, извлеченная функцией десериализации описывается как полученная из буфера 60 - это не подразумевает, что информация хранилась в энергостойкой памяти, такой как устройство 30 хранения данных, буфер может с тем же успехом содержать промежуточный принимающий буфер в сетевой принимающей стороне компьютерного устройства 21.
На Фиг. 2 изображены этапы, включающие в себя сериализацию объектов в соответствии с вариантами осуществления настоящей технологии.
На первом этапе 200, осуществляемом родительским объектом, подготавливается объект, который должен быть сериализован. Это включает в себя упомянутый программный код (машиночитаемый код) в экземпляре 101 программы, обрабатывающий данные до состояния, требуемого перед тем, как они будут отправлены другой программе для дальнейшей обработки. Так, например, когда экземпляр 101 программы является программой баз данных, это приготовление может содержать в себе ответ родительским объектом (который с большой вероятностью может оказаться дочерним объектом других объектов) на запрос от клиентской программы, осуществление запроса SQL (Structured Query Language - язык структурированных запросов) в базе данных и затем создание объекта, имеющего отношение к базе данных, включая результаты запроса, с целью передачи имеющего отношение к базе данных объекта обратно запрашивающему клиенту. В других примерах родительскому объекту может быть необходимо передать объект, содержащий комбинацию программного кода и данных другому экземпляру программы для дальнейшей обработки.
Следующий этап 202 может быть осуществлен либо родительским объектом, либо в рамках запрошенного экземпляра функции сериализации, которая должна сериализировать программный объект и которая была передана либо программному объекту (напрямую), либо указателю на программный объект (посредством ссылки), который должен быть сериализирован. На этом этапе достаточно памяти из памяти 16 распределяется для обеспечения требуемого осуществления задачи функцией сериализации. Как будет описано, экземплярам функции сериализации необходимо создать либо одну, либо две копии объекта для сериализации и, таким образом, необходимо доступное достаточное количество памяти для этого процесса.
Как будет понятно, программный объект может быть сохранен либо в динамической памяти (heap), либо в программном стеке (stack). Динамическая память - это область памяти компьютера, чье распределение не управляется автоматически операционной системой, хранящей программу. Это свободная область памяти, обычно, больше, чем стек. Для распределения памяти переменных в динамической памяти в программе на языке С, используются встроенные функции С распределения памяти malloc() или calloc(). На С++ эквивалентными являются функции new() и delete(), на других языках используются сходные функции.
Для переменных, распределенных в динамической памяти, можно использовать функцию С free() или функцию С++ delete() для перераспределения этой памяти, если эта память больше не является необходимой. Невозможность проделать это приводит к потере доступа к памяти (при выполнении программы), когда динамическая память все еще является выделенной и недоступной для иных процессов.
Из-за возможных многих распределений и перераспределений динамической памяти во время работы программы в системах виртуальной памяти переменные динамической памяти могут быть сохранены в несмежных областях виртуальной памяти, а также физической памяти.
Таким образом, если вызов родительского объекта не предусмотрел иное, функция сериализации не может заключить, что программный объект, который она передавала (либо напрямую, либо посредством ссылки) сохранился в смежной области памяти.
В вариантах осуществления настоящего решения, если это не было осуществлено вызывающей программой или родительским объектом, функция сериализации обеспечивает сохранение копий программного объекта, который надо сериализовать, в смежной области памяти. На этапе 204 это включает в себя замещение глобального распределителя памяти по умолчанию пользовательским распределителем памяти. Пользовательский распределитель памяти обеспечивает распределение копий объекта для сериализации в соответствующих смежных областях памяти, которая была выделена для функции на этапе 202.
Для программ, написанных на С или С++, управление распределением динамической памяти программы может быть достигнуто перегрузкой функций malloc(), calloc() и new() таким образом, что по мере того, как новые переменные заявляются и распределяются во время выполнения программы, они записываются в смежные области памяти вместо того, чтобы распределяться по несмежным местоположениям памяти - виртуальной или физической. Эквивалентные процедуры могут применяться для программ, написанных на других языках; или же могут применяться другие процедуры для достижения тех же самых результатов в соответствии со средой операционной системы программы.
Если функции сериализации было необходимо переместить распределитель памяти по умолчанию, то на этапах 206 и 208 функция сериализации создает две копии объекта для сериализации в пространстве памяти, выделенном на этапе 202.
В распределителе памяти распределение объектов в смежные области памяти используется по умолчанию в экземпляре 101 программы, затем копия объекта передается функции сериализации (либо напрямую, либо посредством ссылки), она может быть использована как первая копия, и таким образом функции сериализации необходимо копировать объект только один раз, чтобы предоставить две копии объекта, каждая из которых хранится в соответствующей смежной области памяти, для анализа.
В любом случае после этапов 206 и 208 две копии оригинального объекта занимают соответствующие смежные области памяти, которые доступны функции сериализации.
Так как любая форма объекта может быть передана функции сериализации, функция сериализации не делает никаких заключений о природе объекта или его структуре. Функция сериализации будет знать только размер объекта и то, что в объекте будет находиться комбинация указателей и данных.
У двух копий объекта одинаковый размер и данные. Одинаковый в контексте одинакового количества памяти и того, что информация в них одинакова. Однако, значения указателей будут отличаться, т.к. они указывают на различные экземпляры данных в соответствующих местоположениях памяти для первой и второй копий объекта. На этапе 210 функция сериализации сравнивает две копии объекта, адрес за адресом, и создает список различий между двумя экземплярами объекта, хранящегося в соответствующих смежных областях памяти. Это достигается простым путем - настройкой указателя на базовый адрес первой копии объекта и базовый адрес второй копии объекта и сравнением значений, сохраненных по каждому адресу перед продвижением каждого указателя один за другим к следующим адресам для сравнения и повторением этой процедуры для каждого адреса по всему объему объекта. Может также быть использована любая эквивалентная процедура.
В каждом случае, когда существует различие между содержимым адресов в первой копии объекта и соответствующем адресе во второй копии объекта, объем различий будет одинаков и будет иметь отношение к различию между базовым адресов первой копии объекта и базовым адресом второй копии объекта.
На Фиг. 4, после этапа 208 на Фиг. 2, первый экземпляр объекта, копия 1 данного размера хранится в смежной области памяти, начиная с базового адреса (1). Второй экземпляр, копия 2, такого же размера, хранится в смежной области памяти, начиная с базового адреса (2). Для простоты на Фиг. 4 показан единственный адрес в каждом экземпляре объекта, содержащего указатель, причем указатель указывает на часть данных, расположенную в определенном месте в пространстве памяти, занятом экземпляром объекта. В копии 1 значение указателя, расположенное по адресу базовый адрес (1) плюс смещение указателя (PtrOffset) содержит базовый адрес (1) плюс смещение данных (DataOffset), а в копии 2 значение указателя, расположенное по адресу базовый адрес (2) плюс смещение указателя (PtrOffset) содержит базовый адрес (2) плюс смещение данных (DataOffset). Таким образом, различие в значении для каждого экземпляра указателя в объекте для сериализации будет являться базовый адрес (2) минус базовый адрес (1).
Таким образом, на этапе 210 функция сериализации идентифицирует каждое местоположение указателя PtrOffset в копии объекта, а также адрес базовый адрес плюс DataOffset, хранящийся в местоположении указателя.
На этапе 212 копия объекта и информация, созданная на этапе 210, записана в буфер и либо сохранена в буфере 60, либо передана другому устройству 21 обработки по сетевому соединению 40. Либо первая копия (копия 1), либо вторая копия (копия 2) могут быть использованы как источники для предоставления копии объекта в буфер.
Один способ кодирования информации на этапе 212 содержит перемещение значений на местоположения, идентифицированные как содержащие указатели с относительными адресами, и затем простое сохранение списка смещений, PtrOffset, для каждого местоположение указателя в копии объекта для передачи. Таким образом, в примере Фиг. 4, где копия 1 используется как источник, значение базовый адрес (1) плюс DataOffset сначала сохраненное в указанном местоположении указателя, будет замещено скорректированным относительным значением указателя DataOffset в буфере 60, а адрес PtrOffset будет храниться в виде записи в списке (или массиве) PtrIndex, который записан в буфер 60 вместе со скорректированной копией объекта, включая относительный адрес указателя в каждом местоположении указателя. В завершение, указатель размера объекта также записывается в буфер 60.
Будет очевидно, что корректировка адресов указателей может быть либо осуществлена на оригинальной копии объекта перед тем, как он будет записан в буфер; или корректировка может быть осуществлена на соответствующих значениях уже в буфере.
В первом случае копия 2 может быть использована как источник, так как эта копия может быть убрана из памяти, как только завершится сериализация, что дает возможность копии 1 оставаться доступной для использования в экземпляре 101 программы. Сохранение или несохранение копии 1 экземпляром 101 программы зависит от того, будет ли впоследствии использован объект экземпляром 101 программы. Например, может быть желательно предоставить обеим экземплярам 101 и 102 программы параллельную обработку переданного программного объекта, и в этом случае оригинальный объект должен быть сохранен, и таким образом его значение местоположения указателя не должно быть скорректировано.
Теперь будет описана Фиг. 3 и функция десериализации, которая дает возможность считывать сериализованный объект памяти. Как уже было описано, десериализация может происходить на другом компьютерном устройстве 21, на которое отправляется сериализованная копия объекта, или же это может быть то же самое компьютерное устройство 20 с тем же устройством памяти или с иным устройством памяти.
Функция десериализации вызывается родительским объектом, например, объектом 120, которому нужно продолжить обработку сериализованного объекта. Вызывающий родительский объект не обязательно должен быть тем же объектом, что и родительский объект, который изначально сериализовал объект в буфере 60, а также, как описано выше, экземпляр 102 программы не должен быть тем же самим экземпляром, что и экземпляр 101 программы.
Функция десериализации может быть передана либо копии буфера, в котором был записан сериализованный объект, либо ссылке на местоположение буфера на этапе 300. Как показано на Фиг. 4, буфер 60 будет содержать копию объекта, где указатели были замещены соответствующими адресами; индекс указателя (смещается в копии объекта); PtrIndex, и, в этом примере, указание размера объекта. Знание размера объекта в буфере 60 дает возможность функции десериализации определить границу 62 между информацией объекта, хранящейся в буфере 60 и информацией PtrIndex, хранящейся в буфере 60.
На этапе 302 функция десериализации распределяет достаточное количество памяти для создания объекта из буферной информации с использованием информации о размере, полученной из буфера 60. В примере на Фиг. 4 выделенная область начинается за базовым адресом (3).
На этапе 304 функция десериализации затем создает объект с помощью копирования информации об объекте в буфере в область памяти, выделенную для объекта на этапе 302.
На этапе 306 информация о PtrIndex, сохраненная в буфере 60 после границы 62, дает возможность функции десериализации определить местоположение каждого адреса указателя в области выделенной памяти и добавить базовый адрес (3) соответствующему значению указателя, сохраненному по этому адресу, для преобразования относительного значения указателя в абсолютное значение указателя, корректно указывая на корректный адрес данных в области памяти 17.
На этапе 308 функция десериализации может возвращать десериализованный объект вызывающей функции, которая затем продолжит обработку с использованием объекта. Другой простой пример с пояснением: пусть первая копия объекта занимает смежную область памяти, а значения в каждом местоположении памяти для объекта следующие: First=4178[3]2654[5]78.
Значения, показанные в скобках, указывают адреса указателей, хотя функция сериализации никак не может отличить эти значения от значений данных, сохраненных по другим адресам для объекта в памяти. Однако в этом примере, когда вторая копия объекта копируется в смежный участок памяти, значения каждого местоположения в памяти могут выглядеть следующим образом:
Second=4178[4]2654[6]78.
Особое внимание обращается на то, что выделение значения указателей изменилось при переходе от одной копии объекта к следующей, а также на то, что разница между значениями постоянна.
Функция сериализации последовательно сравнивает две копии объекта для обнаружения адресов, представляющих различия в значении, происходящие из копии.
Как видно, начиная с индекса [0], такие различия возникают в местоположениях [4] и [9], выделенных выше. Эти смещения сохраняются, и информация в этих местоположениях корректируется.
Пусть базовый адрес первой копии объекта будет 2. В этом случае это значение извлекается из значений в местоположениях [4] и [9] в первой копии для создания относительных адресов в этих местоположениях. Значения, записанные в буфер 60 для этого объекта будут, следовательно, такими:
Buffer=4178[1]2654[3]78,[4],[9],12.
В этом случае также скобки и пунктуация предоставлены для ясности - в буфере 60 нет нужды в подобных разграничениях.
Последняя запись в буфере указывает, что информация об объекте занимает первые 12 местоположений в памяти в буфере. Значения, следующие за информацией об объекте и предшествующие информации о размере указывают, что значения в индексе [4] и [9] необходимо скорректировать для пространства 17 памяти процесса-приемника.
Будет понятно, что 12 адресов информации объекта, 2 индекса и информация о размере могут быть записаны в буфер 60 в любом подходящем порядке, что позволяет принимающей стороне определить размер программного объекта, который был сериализован и местоположения в программном объекте, которые необходимо скорректировать для пространства 17 памяти процесса-приемника.
Продолжая этот пример, если базовый адрес для объекта в пространстве 17 памяти процесса-приемника был, например, 5, это значение должно быть добавлено в местоположения [4] и [9] для создания десериализованного объекта в памяти следующим образом:
Сору: 4178[6]2654[8]78
Этот десериализованный объект может быть передан обратно любому вызывающему родительскому объекту 120 для обработки в обычном порядке, включая, например, ресериализацию объекта для дальнейшей обработки другим компьютерным устройством.
Очевидно, что возможны многие альтернативные варианты осуществления решения.
Например, значения указателя в сериализованной копии объекта в буфере 60 не обязательно должны быть скорректированы перед передачей объекта. В этом случае, базовый адрес исходной копии объекта в памяти 16 может быть записан в буфер 60. Затем исходное значение указателя, исходный базовый адрес из буфера и базовый адрес, например, базовый адрес (3) для десериализованной версии объекта в памяти 17 компьютерного устройства 21 могут быть использованы при десериализации объекта для корректировки для пространства 17 памяти процесса-приемника. Таким образом, вне зависимости от того, был ли объект скорректирован перед передачей принимающему процессу, как описано в отношении Фиг. 2-4; или базовый адрес исходного объекта передается с сериализованным объектом таким образом, что он может быть скорректирован принимающей стороной, объект передается с достаточной информацией, чтобы сделать его независимым от базового адреса для исходного объекта и таким образом предоставить возможность принимающей стороне делать корректировки для пространства 17 памяти процесса-приемника.
А также из-за того, что PtrIndex будет отличаться по длине в соответствии с числом указателей в объекте, указатель размера объекта записывается в буфер для предоставления возможности функции десериализации различать данные объекта и PtrIndex. Однако, если PtrIndex б