Operaciones asincronicas y no bloqueantes

Operaciones asincronicas y no bloqueantes

de Agustin Berriel Alcalde -
Número de respuestas: 2

Tengo una consulta respecto a una pregunta de examen, en la que se pregunta en que caso conviene utilizar operaciones asincronicas o operaciones  no bloqueantes. Entiendo como funcionan cada una de ellas pero no tengo del todo claro cual seria la respuesta a cuando se debe utilizar cada una de ellas. Se me ocurrio por poner un ejemplo que las no bloqueantes sirven para operaciones de lectura en las que sirve obtener los datos que haya disponibles en el buffer para ir trabajando con ellos y las asincronicas para operaciones de escritura en las que sirve mandar a escribir algo en el buffer y "desentenderse" mientras el programa sigue haciendo otras cosas y en algun momento recibir un aviso de que la escritura fue completada (o hubo un error). ¿Esta podria ser una respuesta valida?

En respuesta a Agustin Berriel Alcalde

Re: Operaciones asincronicas y no bloqueantes

de Santiago Iturriaga -

Hola:

Si, esa respuesta es válida. Supongan que tienen 3 versiones de la system call "read()" para leer desde el disco duro.

1) bloqueante: bool read_blq(int block, byte[] buff, int size);
Lee "size" bytes desde el bloque "block" y los almacena en "buff". Retorna true si pudo leer todos los bytes.

2) no bloqueante: int read_nonblq(int block, byte[] buff, int size, int offset);
Intenta leer "size" bytes a partir del byte "offset" desde el bloque "block" y almacena lo que pudo leer en "buff". Retorna cuantos bytes efectivamente leyó y guardó en "buff".

3) asíncrona: int read_async(int block, byte[] buff, int size, IORequest *request);
Lee "size" bytes desde el bloque "block" y los almacena en "buff". No bloquea al proceso que la invoca y retorna una referencia al pedido de lectura ("request") con la que se puede consultar cuando se termina de cargar los datos a "buff".

Claramente si se requiere siempre la información completa para procesar y no hay otra tarea para hacer, entonces la syscall que me resulta más cómoda de invocar es la 1). Si en cambio pudiera procesar el resultado parcial, entonces seguramente sea más conveniente la syscall 2). Si tuviera otra tarea para realizar mientras espero por el resultado pedido, entonces la opción 3) sería la más adecuada.

Saludos,
Santiago.