En el diseño del sistema IO de alto rendimiento, hay varios conceptos de sustantivos que a menudo nos confunde. Los detalles son los siguientes:
1 ¿Qué es la sincronización?
2 ¿Qué es asíncrono?
3 ¿Qué está bloqueando?
4 ¿Qué no es bloqueo?
5 ¿Qué es el bloqueo sincrónico?
6 ¿Qué es sincrónico sin bloqueo?
7 ¿Qué es el bloqueo asíncrono?
8 ¿Qué es el no bloqueo asíncrono?
Déjame darte un ejemplo en la vida:
Si quieres un tazón de arroz de dice de pollo kung pao:
Bloqueo sincrónico: vas a un restaurante para pedir comida, luego esperar allí y gritar: ¿Ok?
No bloqueo sincrónico: después de ordenar en un restaurante, fui a pasear al perro. Pero después de caminar por un tiempo, volvió al restaurante y gritó: ¿OK?
Bloqueo asíncrono: al pasear al perro, recibí una llamada del restaurante diciendo que la comida estaba lista y le pedí que la consiguiera en persona.
Sin bloqueo asíncrono: el restaurante llamó y dijo: "Conocemos su ubicación, y se la enviaré más tarde, para que pueda pasear al perro con tranquilidad".
Antes de descubrir los problemas anteriores, primero debemos comprender qué sincronización, asíncrono, bloqueo y no bloqueo son. Solo cuando estos conceptos individuales se entiendan claramente, y luego, cuando se combinan, será relativamente más fácil.
1. La sincronización y la asincrónica son para la interacción entre la aplicación y el núcleo.
2. Bloqueo y no bloqueo son métodos diferentes adoptados por el proceso al acceder a los datos de acuerdo con el estado listo de la operación IO. Para decirlo sin rodeos, es un método de implementación para leer o escribir funciones de operación. Según el método de bloqueo, la función de lectura o escritura esperará, en lugar de la función de lectura o escritura inmediatamente devolverá un valor de estado.
De la descripción anterior, básicamente podemos resumir una oración corta: la sincronización y la asíncrona son el propósito, y el bloqueo y el no bloqueo son los métodos de implementación.
1. Sincronización: se refiere al proceso del usuario que desencadena una operación de IO y esperando o encuestando para verificar si la operación de IO está lista. Salí a comprar ropa en la calle e hice esto yo mismo, y no pude hacer nada más.
2. Asíncrono: Asíncrono significa que después de que el proceso del usuario desencadena la operación IO, comienza a hacer sus propias cosas. Cuando se haya completado la operación IO, se le notificará de la finalización del IO (la característica de la notificación asíncrona). Dígale a su amigo que se adapte al tamaño, el tamaño y el color de la ropa, y deje que su amigo lo confíe para vender, y luego puede hacer otras cosas. (Cuando se usa IO asíncrono, Java delega IO leyendo y escribiendo al sistema operativo, y necesita pasar la dirección y el tamaño del búfer de datos al sistema operativo)
3. Bloqueo: el llamado método de bloqueo significa que al intentar leer y escribir el descriptor del archivo, si no hay nada que leer o no es temporalmente nocturno, el programa ingresará a un estado de espera hasta algo para leer o escribir, e ir a la parada de autobús para recargar. En este momento, el recargente no está allí (tal vez fue al baño), y luego esperamos aquí hasta que regrese la recargadora. (Por supuesto, este no es el caso en la sociedad real, pero de hecho es el caso en las computadoras).
4. Sin bloqueo: en el estado no bloqueado, si no hay nada que leer o no se puede escribir, la función de lectura y escritura volverá inmediatamente sin esperar. Cuando el banco retire dinero para manejar los negocios, recibiremos un pequeño recibo. Después de recibirlo, podemos jugar con nuestros teléfonos móviles o chatear con otros. Cuando giramos, el orador del banco nos notificará, y podemos ir.
Una operación IO en realidad se divide en dos pasos: iniciar una solicitud IO y una operación IO real.
La diferencia entre IO sincrónico y IO asíncrono es si el segundo paso está bloqueado. Si el IO Real lee y escribe el bloque de solicitud, entonces es síncrono IO.
La diferencia entre el bloqueo de IO y el IO sin bloqueo está en el primer paso, si la solicitud de IO será bloqueada. Si está bloqueado hasta que se complete, es el bloqueo tradicional IO. Si no está bloqueado, es el IO sin bloqueo.
La sincronización y la asincrónica están dirigidas a la interacción entre la aplicación y el núcleo. La sincronización se refiere al proceso del usuario que desencadena las operaciones de IO y la espera o las encuestas para ver si la operación IO está lista. Asíncrono significa que el proceso del usuario comienza a hacer sus propias cosas después de activar la operación de IO, y cuando se haya completado la operación IO, se notificará que la finalización de IO se completará.
El bloqueo y el no bloqueo son métodos diferentes adoptados por el proceso al acceder a los datos de acuerdo con el estado listo de la operación IO. Para decirlo sin rodeos, es un método de implementación para leer o escribir funciones de operación. Según el método de bloqueo, la función de lectura o escritura esperará, en lugar de la función de lectura o escritura inmediatamente devolverá un valor de estado.
Por lo tanto, las operaciones de IO se pueden dividir en tres categorías: bloqueo sincrónico (es decir, operaciones biografía tempranas), sin bloqueo síncrono (NIO) y no bloqueo asincrónico (AIO).
Bloqueo sincrónico (bio):
De esta manera, después de que el proceso del usuario inicia una operación IO, debe esperar a que la operación IO se complete. Solo después de que la operación IO se complete realmente se puede ejecutar el proceso del usuario. El modelo IO tradicional de Java pertenece a este método.
Sin cita sincrónica (NIO):
De esta manera, el proceso del usuario puede volver a hacer otras cosas después de iniciar una operación IO, pero el proceso del usuario debe preguntar si la operación IO está lista de vez en cuando, lo que requiere que el proceso del usuario solicite constantemente, introduciendo así un desperdicio innecesario de recursos de CPU. Entre ellos, actualmente Java's NIO es IO sincrónico sin bloqueo.
No bloqueo asíncrono (AIO):
De esta manera, después de que la aplicación inicia una operación IO, no espera que la operación IO del núcleo se complete, y notificará a la aplicación después de que el kernel complete la operación IO.
Bloqueo sincrónico IO (Java Bio):
Sincronizar y bloquear, el modo de implementación del servidor es conectarse a un hilo, es decir, cuando el cliente tiene una solicitud de conexión, el servidor debe iniciar un hilo para el procesamiento. Si esta conexión no hace nada, causará una sobrecarga innecesaria y, por supuesto, se puede mejorar a través del mecanismo de la piscina de hilos.
IO sincrónico sin bloqueo (Java Nio):
No bloqueo sincrónico, el modo de implementación del servidor es solicitar un hilo, es decir, las solicitudes de conexión enviadas por el cliente se registrarán con el multiplexor. El multiplexor encuesta la conexión a la solicitud de E/S e inicia un hilo para procesar. El proceso del usuario también debe preguntar si la operación IO está lista de vez en cuando, lo que requiere que el proceso del usuario solicite constantemente.
Bloqueo asíncrono IO (Java Nio):
De esta manera, después de que la aplicación inicia una operación IO, no espera que la operación IO del núcleo se complete, y notificará a la aplicación después de que el kernel complete la operación IO. Esta es en realidad la diferencia más crítica entre sincronización y asincrónica. La sincronización debe esperar o preguntar activamente si el IO está completado. Entonces, ¿por qué está bloqueado? Debido a que se realiza mediante llamadas de sistema seleccionadas en este momento, y la implementación de la función SELECT en sí misma está bloqueando, y una ventaja de usar la función SELECT es que puede escuchar múltiples manijas de archivos al mismo tiempo (si desde la perspectiva del UNP, Select es una operación sincrónica. ¡Porque después de SELECT, el proceso también necesita leer y escribir datos), lo que mejora la concurrencia del sistema!
(Java AIO (NIO.2)) IO sin bloqueo asíncrono:
En este modo, el proceso del usuario solo necesita iniciar una operación IO y regresar de inmediato. Una vez que se complete la operación IO, la solicitud se notificará a que se complete la operación IO. En este momento, el proceso del usuario solo necesita procesar los datos y no necesita realizar operaciones reales de lectura y escritura de IO, porque las operaciones reales de lectura o escritura IO han sido completadas por el núcleo.
Análisis de escenarios aplicables para Bio, NIO y AIO:
El método bio es adecuado para arquitecturas con conexiones relativamente pequeñas y conexiones fijas. Este método requiere altos recursos del servidor y la concurrencia se limita a las aplicaciones. Es la única opción antes de JDK1.4, pero el programa es intuitivo, simple y fácil de entender.
El método NIO es adecuado para arquitecturas con una gran cantidad de conexiones y conexiones relativamente cortas (operación de luz), como los servidores de chat. La concurrencia se limita a aplicaciones y tiene una programación relativamente compleja. JDK1.4 ha comenzado a apoyarlo.
El método AIO se utiliza para arquitecturas con una gran cantidad de conexiones y una conexión relativamente larga (reoperación), como los servidores de álbumes, que llaman completamente al sistema operativo para participar en operaciones concurrentes, y la programación es relativamente complicada. JDK7 ha comenzado a apoyarlo.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.