Что такое сортировка? Что происходит, когда что-то "сортируется"?

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

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

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

+60
08 апр. '11 в 21:06
источник поделиться
6 ответов

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

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

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

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

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

+71
08 апр. '11 в 21:19
источник

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

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

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

+24
08 апр. '11 в 21:23
источник

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

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

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

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

+11
08 апр. '11 в 21:23
источник

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

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

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

Я не могу просто сказать: "Эй, вот где массив, делай, что хочешь" для кода С#. Массив ints в С++ может не храниться так же, как в С#. Маршалинг позволяет передавать эти данные независимым от среды образом, чтобы обе стороны видели данные одинаково точно.

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

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

+4
08 апр. '11 в 21:21
источник

Из Википедия - Маршаллинг (информатика):

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

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

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

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

+3
08 апр. '11 в 21:33
источник

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

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

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

+1
08 апр. '11 в 21:16
источник

Посмотрите другие вопросы по меткам или Задайте вопрос