Что такое сортировка? Что происходит, когда что-то «маршалируется»? - PullRequest
67 голосов
/ 09 апреля 2011

Я знаю, что этот вопрос был задан, по крайней мере здесь .

Но не было удовлетворительного ответа, по крайней мере, не для меня.Существует много разговоров о маршаллинге в отношении взаимодействия с неуправляемым кодом, но как насчет маршаллинга из одного потока в другой, как нам иногда приходится делать в .NET.

Это заставляет меня спросить, что такое маршаллинг,действительно?Когда вы даете определение маршаллинга, как бы вы определили его так, чтобы оно объясняло случай взаимодействия, а также случаи, когда вы «маршалинг» между потоками?

Ответы [ 6 ]

82 голосов
/ 09 апреля 2011

При вычислениях часто требуется перемещать данные с одного сайта на другой, и у них нет общей памяти. Таким образом, одно вычисление отправляет сообщение, содержащее данные, другому.

Как эти данные, если они произвольно сложны, должны быть отправлены в сообщении?

Маршаллинг - это процесс преобразования поля данных или всего набора связанных структур в сериализованную строку, которую можно отправить в сообщении. Маршалл двоичный число, можно преобразовать его в шестнадцатеричную цифровую строку, если формат сообщения должен быть текстовым. Если сообщение будет содержать двоичные данные, двоичное число может быть преобразовано в 4 нормализованных двоичных байта с прямым порядком байтов и отправлено таким образом. Указатели сложнее; часто приходится преобразовывать их в абстрактную ссылку (например, «номер узла»), которая не зависит от фактических областей памяти.

Конечно, если вы «маршалируете» данные, вы должны в конечном итоге «разобрать», что является процессом чтения последовательного потока и восстановления переданных данных (структуры).

Часто в библиотеке используются (не) процедуры сортировки, которые используются для достижения этой цели, а иногда даже существуют инструменты, которые производят все вызовы, необходимые для (не) процедур сортировки для отправки / получения данных.

29 голосов
/ 09 апреля 2011

Маршаллинг берет данные какой-то формы и переводит их в отдельную форму. Это очень общий термин, используемый во многих местах с небольшими различиями в значении.

Например, в .NET уровень взаимодействия, когда вы работаете с нативными типами, «маршалирует» ваши данные из .NET-типа в соответствующую форму для вызова нативного метода, а затем «маршализирует» результаты обратно.

Что касается "сортировки" между потоками - часто вам нужно иметь код для запуска в потоке, отличном от текущего. Например, если вы используете Windows Forms, вы не можете изменить элемент пользовательского интерфейса в потоке потоков, поэтому вам нужно «перенаправить» вызов обратно в поток пользовательского интерфейса. Это делается путем создания делегата и передачи делегата обратно в поток пользовательского интерфейса через Control.Invoke (который использует довольно сложную систему для отправки обратно в соответствующий контекст синхронизации), который, в свою очередь, запускает делегат в пользовательском интерфейсе. нить для вас.

12 голосов
/ 09 апреля 2011

Определение в Википедии на самом деле довольно хорошее.

Общая концепция сортировки аналогична "сериализации": переходу из представления в памяти (что, в некотором смысле, являетсякак никакое представление вообще - когда что-то находится в памяти, оно просто «существует») в представление «в твердой копии», будь то XML, или, возможно, двоичный поток или что-то еще.Однако, в зависимости от того, что вы делаете, это также может подразумевать какое-то преобразование или перевод в целевой формат.

Для процесса маршаллинга: один поток не просто «вызывает» другой - данные должны бытьупакованы и «отправлены» из одного потока в другой.Маршаллинг - это процесс упаковки этих данных (например, данных о методе, который вы хотите вызвать, и его параметрах).

Если вы выполняете маршаллинг с точки зрения взаимодействия, вы упаковываете вызов метода иего параметры в структуру данных, которая может быть отправлена ​​процессу / потоку, выполняющему компонент COM.Этот пакет должен быть в формате, понятном компоненту COM.

5 голосов
/ 09 апреля 2011

С Википедия - Marshalling (информатика) :

Маршаллинг (аналог сериализации) - это процесс преобразования представления объекта в памяти в формат данных, подходящий для хранения или передачи. Обычно он используется, когда данные должны перемещаться между различными частями компьютерной программы или из одной программы в другую.

В случае вызова неуправляемой функции из .NET маршаллинг используется для преобразования данных .NET в данные, которые может использовать неуправляемая функция. Например, System.String основан на Unicode, но эту строку, возможно, придется преобразовать в строку ANSI для передачи в неуправляемую функцию C.

Для многопоточности маршаллинг обычно относится к передаче права собственности на некоторые данные из одного потока в другой поток. Например, программа имеет два потока. Первый поток читает данные из сети, а второй поток вычисляет эти данные. После того, как сетевой поток считывает некоторые данные, он передает (например, «маршалы») данные в вычислительный поток для обработки. Это может быть сделано путем записи данных в очередь, совместно используемую двумя потоками.

Маршаллинг в многопоточности почти всегда включает синхронизацию маршалируемых данных.

4 голосов
/ 09 апреля 2011

Я понимаю, что маршалинг заключается в том, что он позволяет вам согласованно передавать данные в различных операционных средах.

В контексте маршалинга данных из управляемого в неуправляемый код это более или менее одинаково.

У меня есть некоторые данные, скажем, массив целых чисел или любой другой тип данных по моему выбору, и я хочу сделать их доступными для использования в моем коде C # после того, как мой код C ++ выполнит некоторые операции с ним.

Я не могу просто сказать «Эй, вот где находится массив, делай, что хочешь» для кода C #. Массив int в C ++ не может храниться так же, как в C #. Маршалинг позволяет нам передавать эти данные независимо от среды, чтобы любая из сторон видела данные одинаково точно.

Еще один пример - сеть. Обычно вы не называете это маршалингом, но если вы хотите передать его по сети, вы обычно должны передавать его таким образом, чтобы тот, кто его получает, интерпретировал данные так же, как вы. Ваш компьютер может представлять данные в порядке с прямым порядком байтов, а другой может представлять их в порядке с прямым порядком байтов.

tl; dr: Marshaling предоставляет вам способ для последовательного представления данных в различных операционных средах

1 голос
/ 09 апреля 2011

Обычно используется в контексте «написано в формате XML», но может быть преобразовано в любой формат.

2.  To arrange, place, or set in methodical order.
   (from American Heritage® Dictionary of the English Language)

Таким образом, это означает, что вы упорядочиваете данные в нужном вам методическом порядке / формате. Часто это в формате XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...