Tecnología de copia cero en Linux

Introduccion

Todo el mundo debe haber oído hablar del término copia cero, generalmente cuando se utiliza netty, kafka y otros marcos. Si no ha escuchado la palabra, no importa. Echemos un vistazo a esta copia cero hoy. Que es

El concepto de copia cero:

Primero echemos un vistazo al concepto de copia cero, tomado de Wikipedia:
La tecnología de copia cero (en inglés: copia cero; también traducida como copia cero) es que cuando la computadora realiza una operación, la CPU no necesita copiar primero los datos de alguna memoria a otra Área específica Esta técnica se usa generalmente para ahorrar ciclos de CPU y ancho de banda de memoria al transferir archivos a través de la red.
A partir de esta oración, podemos saber que no se necesita CPU para copiar datos, lo que mejora la eficiencia de transmisión. Por lo tanto, para mejorar la eficiencia de transmisión, hoy es más necesario cuando la red está muy desarrollada. Piense en ver nuestras películas 4G y 5G y videos cortos, etc., lo que requiere mucha transmisión de red. Cuanto mayor sea la cantidad de datos, el costo de copiar y copiar El mas alto. Por lo tanto, todavía tenemos que echar un buen vistazo a la tecnología de copia cero, después de todo, es de gran utilidad en la vida y el trabajo.
Sabemos que muchas características en cada idioma en realidad se refieren al sistema operativo, como el modelo de memoria JMM en Java, que es el modelo de memoria del sistema operativo de referencia. Entonces, antes de hablar sobre la copia cero de Java, primero aprendamos qué es la copia cero en el sistema operativo. Después de aprender, es mucho más claro aprender la copia cero de Java.

transmisión de linux

Primero introduzca un concepto: DMA (Acceso directo a la memoria, acceso directo a la memoria): es una característica importante de todas las computadoras modernas, permite que los dispositivos de hardware de diferentes velocidades se comuniquen sin la necesidad de depender de una gran cantidad de cargas de interrupción de la CPU. De lo contrario, la CPU necesita copiar cada pieza de datos desde el origen al bloc de notas y luego volver a escribirlos en el nuevo lugar. Durante este tiempo, la CPU no está disponible para otras tareas. Simplemente se puede entender que antes de que no haya DMA, necesitamos que la CPU envíe datos de un lugar a otro, y cuando la CPU está procesando, se bloquea y no se pueden procesar otras tareas. Con DMA, debido a que la CPU no es necesaria para la programación, los datos se pueden mover directamente, por lo que la CPU se puede liberar para hacer más otras cosas, y el almacenamiento y movimiento de datos se ha vuelto más conveniente y rápido.

Veamos el diagrama de flujo de transmisión tradicional de Linux:

Se puede ver que hay un total de cuatro repeticiones y cuatro cambios de contexto.

Operación de lectura (copia dos veces, cambio de contexto dos veces):
1. El proceso del usuario inicia una llamada del sistema al núcleo a través de la función read () , y el contexto cambia del espacio del usuario (espacio del núcleo) al espacio del núcleo (espacio del núcleo) 2.
CPU Utilice el controlador DMA para copiar datos desde la memoria principal o el disco duro al búfer de lectura (espacio del núcleo) del búfer de lectura (
3 ) . La CPU copia los datos en el búfer de lectura en el búfer de usuario en el espacio de usuario 4. El contexto cambia de espacio de kernel a espacio de usuario y se ejecuta la llamada de lectura. De vuelta.

Operación de escritura (copia dos veces, cambio de contexto dos veces): 1. El proceso del usuario inicia una llamada del sistema al kernel a través de la función write (), y el contexto cambia del espacio de usuario (espacio de usuario) al espacio de kernel (espacio de kernel) 2.
CPU Copie los datos en el búfer de usuario (búfer de usuario) en el espacio de red (búfer de socket) en el espacio del kernel (espacio de kernel) 3. La
CPU utiliza el controlador DMA para copiar los datos del búfer de red (buffer de zócalo) a la tarjeta de red para la transmisión de datos
4. El contexto cambia del espacio del núcleo (espacio del núcleo) al espacio del usuario (espacio del usuario), y la llamada al sistema de escritura vuelve

Método de copia cero:

¿Es el proceso anterior muy complicado, con muchas veces de conmutación y copia, si el espacio del usuario puede leer directamente los datos, puede mejorar la eficiencia? Ok, veamos cuáles son las formas de copia cero del sistema Linux:

E / S directa:

Para este método de transmisión de datos, las aplicaciones pueden acceder directamente al almacenamiento de hardware, y el núcleo del sistema operativo solo ayuda en la transmisión de datos: este tipo de tecnología de copia cero está dirigida a situaciones en las que el núcleo del sistema operativo no requiere procesamiento directo de datos. El búfer entre el espacio de direcciones del programa de aplicación y el disco se transfiere directamente, y el soporte de caché de página proporcionado por el núcleo del sistema operativo Linux no es necesario en absoluto.

No hay mucho que decir sobre esto. Pasa directamente al espacio del kernel. El espacio del kernel no participa en la copia de datos, y el espacio del usuario interactúa directamente con el hardware.

Reduzca el número de copias:

En el proceso de transmisión de datos, evite copiar datos entre el búfer en el espacio de direcciones del núcleo del sistema operativo y el búfer en el espacio de direcciones de la aplicación del usuario. A veces, la aplicación no necesita acceder a los datos durante el proceso de transmisión de datos. Luego, se puede evitar por completo copiar los datos de la memoria caché de la página de Linux al búfer de proceso del usuario. Los datos transmitidos se encuentran en la memoria caché de la página. Puede ser tratado En algunos casos especiales, esta tecnología de copia cero puede lograr un mejor rendimiento. Linux proporciona llamadas similares al sistema principalmente mmap (), sendfile () y splice ().

mmap ():

La diferencia con la tradicional es que la operación de lectura se convierte en mmap. Después de eso, el espacio de usuario y el modo kernel comparten el mismo buffer del kernel, y los datos leídos están en este buffer del kernel. Las palabras escritas siguen siendo las mismas que antes.

enviar archivo():

Sendfile es un paso más optimizado para mmap. Los datos se copian del búfer al socket directamente en el espacio del kernel. El espacio del usuario solo inicia la llamada de sendfile, reduciendo la sobrecarga de la copia y el cambio de contexto.

empalme():

Splice es más poderoso sobre la base de los dos predecesores anteriores. Anteriormente, sendfile solo puede copiar datos del búfer del núcleo al zócalo, y el empalme estableció directamente una tubería entre el búfer Nehe y el zócalo para intercambiar datos directamente entre sí.

Copia en escritura:

Optimice el proceso de transmisión de datos entre el caché de página de Linux y el búfer del proceso del usuario. La tecnología de copia cero se centra en el manejo flexible de las operaciones de copia de datos entre el búfer de proceso del usuario y el caché de páginas del sistema operativo. Este método continúa el método de comunicación tradicional, pero es más flexible.

Copy-on-write es una estrategia de optimización en la programación de computadoras. Su idea básica es esta: si varias aplicaciones necesitan acceder al mismo dato al mismo tiempo, a estas aplicaciones se les pueden asignar punteros a este dato. A una aplicación le parece que todos tienen una copia de los datos. Cuando una de las aplicaciones necesita modificar su propia copia de los datos, necesita copiar los datos en el espacio de direcciones de la aplicación. Es decir, la aplicación tiene una copia verdaderamente privada de los datos, esto se hace para evitar que la aplicación realice cambios en este dato para que otras aplicaciones lo vean. Este proceso es transparente para la aplicación. Si la aplicación nunca realizará ningún cambio en el dato al que se accede, nunca es necesario copiar los datos en el espacio de direcciones de la aplicación. Esta es también la principal ventaja de copiar en escritura.

Supongo que te gusta

Origin juejin.im/post/5e9c6513f265da47ef2f3bb8
Recomendado
Clasificación