.net - ¿Qué está organizando? ¿Qué está sucediendo cuando algo está "ordenado"?
multithreading marshalling (6)
De Wikipedia''s :
Marshalling (similar a la serialización) es el proceso de transformación de la representación de memoria de un objeto a un formato de datos adecuado para su almacenamiento o transmisión. Normalmente se usa cuando los datos se deben mover entre diferentes partes de un programa de computadora o de un programa a otro.
En el caso de llamar a una función no administrada desde .NET, la clasificación se usa para convertir los datos de .NET en datos que la función no administrada puede consumir. Por ejemplo, System.String
está basado en Unicode, pero esa cadena podría necesitar convertirse en una cadena ANSI para pasarla a una función C no administrada.
Para enhebrar, la clasificación generalmente se refiere a la transferencia de propiedad de algunos datos de un hilo a otro. Por ejemplo, un programa tiene dos hilos. El primer hilo lee datos de la red, y el segundo hilo calcula esos datos. Después de que el hilo de la red lee algunos datos, transfiere (es decir, "marshals") los datos a la hebra de cálculo para procesarlos. Puede hacer esto escribiendo los datos en una cola compartida entre los dos hilos.
El mapeo en el enhebrado casi siempre implica la sincronización de los datos que se organizan.
Sé que esta pregunta ha sido formulada, al menos here .
Pero no hubo una respuesta satisfactoria, al menos no para mí. Se habla mucho sobre la coordinación en lo que respecta a la interoperación con código no administrado, pero ¿qué pasa con la clasificación de un hilo a otro, como tenemos que hacer en .NET a veces?
Esto me hace preguntar, ¿qué es organizar, realmente? Cuando se da una definición de clasificación, ¿cómo la definiría para que esté explicando el caso de interoperabilidad, así como los casos en los que se está "coordinando" entre hilos?
La forma en que entiendo el marshaling es que proporciona una forma de transferir datos de manera consistente a través de varios entornos operativos.
En el contexto de la ordenación de datos del código gestionado a no gestionado, es más o menos lo mismo.
Tengo algunos datos, por ejemplo, una matriz de enteros o cualquier tipo de datos de mi elección, y quiero que estén disponibles para su uso dentro de mi código C # después de que mi código C ++ realice algunas operaciones en él.
No puedo decir "Oye, aquí es donde está la matriz, haz lo que quieras" al código C #. Una matriz de entradas en C ++ puede no almacenarse de la misma manera que en C #. Marshaling nos permite transmitir estos datos de una manera independiente del entorno para que cada lado vea los datos de la misma manera.
Otro ejemplo sería en redes. Por lo general, no llama a estas referencias, pero si desea transmitirlas a través de la red, normalmente debe transmitirlas de tal forma que quien la reciba interprete los datos de la misma manera que usted. Su computadora podría representar datos en un orden pequeño endian, y el otro podría representarlo en orden grande endian.
tl; dr: Marshaling le proporciona una forma de representar de forma consistente los datos en varios entornos operativos
Los cálculos a menudo necesitan mover datos de un sitio a otro y no tienen memoria compartida. Entonces, un cálculo envía un mensaje que contiene los datos al otro.
¿Cómo deberían enviarse esos datos, si es arbitrariamente complicado, en un mensaje?
Marshalling es el proceso de convertir un campo de datos, o un conjunto completo de estructuras relacionadas, en una cadena serializada que se puede enviar en un mensaje. Para ordenar un número binario, uno puede convertirlo en una cadena de dígitos hexadecimales, si el formato del mensaje debe ser texto. Si el mensaje llevará datos binarios, el número binario se puede convertir en 4 bytes binarios normalizados little-endian y enviarse de esa manera. Los punteros son más difíciles; uno a menudo tiene que convertirlos en una referencia abstracta (por ejemplo, un "número de nodo") que es independiente de las ubicaciones de memoria reales.
Por supuesto, si "marshall" de datos, debe eventualmente "unmarshall", que es el proceso de lectura de la secuencia en serie y la reconstrucción de los datos transmitidos (estructura).
A menudo hay rutinas de clasificación (no) en una biblioteca que se utilizan para lograr este propósito, y algunas veces incluso hay herramientas que fabricarán todas las llamadas necesarias en las rutinas (no) de clasificación para enviar / recibir los datos.
Marshalling está tomando datos, de alguna forma, y traduciéndolos en una forma separada. Es un término muy genérico, y se usa en muchos lugares con sutiles diferencias de significado.
Por ejemplo, en .NET, la capa de interoperabilidad cuando trabajas con tipos nativos "dirige" tus datos del tipo .NET al formato apropiado para llamar al método nativo, luego "ordena" los resultados.
En cuanto a "ordenar" entre subprocesos: a menudo, necesitarás tener código para ejecutar en un subproceso diferente al actual. Por ejemplo, si usa Windows Forms, no puede cambiar un elemento UI en una cadena de subprocesos, por lo que deberá "ordenar" la devolución de la llamada al subproceso UI. Esto se hace creando un delegado y pasando el delegado a la secuencia de la interfaz de usuario a través de Control.Invoke (que usa un sistema bastante complejo para volver a publicarlo en el contexto de sincronización adecuado), que a su vez ejecuta el delegado en la interfaz de usuario hilo para ti
Por lo general, se usa en el contexto de "escrito en formato XML", pero podría organizarse en cualquier formato.
2. To arrange, place, or set in methodical order.
(from American Heritage® Dictionary of the English Language)
Por lo tanto, significa que está organizando los datos en el orden / formato metódico que desea. A menudo esto está en formato XML.
Wikipedia''s definición Wikipedia''s es bastante buena.
El concepto general de clasificación es lo mismo que "serialización:" pasar de una representación en memoria (que, en cierto modo, es como ninguna representación en absoluto - cuando algo está en la memoria simplemente "existe") a una "copia impresa" "representación, ya sea XML o tal vez un flujo binario o algo así. Sin embargo, dependiendo de lo que esté haciendo, también puede implicar algún tipo de transformación o traducción a un formato de destino.
Para la clasificación de procesos: un hilo no simplemente "llama" a otro: los datos deben empaquetarse y "enviarse" de un hilo a otro. Marshalling es el proceso de empaquetar esa información (por ejemplo, datos sobre el método que desea llamar y sus parámetros).
Si está coordinando en términos de interoperabilidad, está empaquetando una llamada de método y sus parámetros en una estructura de datos que se puede enviar a un proceso / subproceso que ejecuta el componente COM. Ese paquete debe estar en un formato que el componente COM pueda entender.