Buffer
Es un área de memoria principal reservada para contener los datos leídos de un archivo mientras se utilizan. Cuando esta área temporal queda llena, el programa puede empezar a utilizar estos datos.
Manejar un buffer implica trabajar con grandes grupos de datos de memoria Ram para que el número de accesos al almacenamiento se reduzca.
El sistema operativo es quien maneja realmente los buffer del sistema. La entrada buffer del CONFIG.SYS permite especificar el numero de almacenamientos intermedios (o accesos) de discos que ha de usar del DOS, esto dependerá del tipo de configuración de cada sistema y se mide en términos de tiempos que consume el desplazamiento, el retraso por rotación y el tiempo de transferencia. Cada sector objeto de lectura anticipada consume un equivalente de memoria de 512 bytes.
En esta ocasión se revisaran diversas formas de administrar el buffer para tratar de reducir lo mas posible los costosos accesos a dispositivos que son muy lentos respecto al CPU.
Almacenamiento temporal único por demanda.
Es utilizado cuando existe un registro por bloque y un almacenamiento por archivo. En este caso el buffer es llenado por demanda del programa del usuario. El buffer contiene un apuntador al programa y un área de datos. El programa de canal es similar a este:
- Esperar que se pida una lectura.
- Mandar una orden de E/S a la unidad de control.
- Esperar a que se llene el buffer.
- Generar una interrupción para que se utilice el buffer.
En esta espera el CPU y el programa del usuario están ociosos.
Almacenamiento temporal por anticipación.
Se utiliza para evitar esos tiempos ociosos, o sea que se pretende anticipar a la solicitud de lectura del programa manteniendo el buffer lleno. La estructura de este tipo de buffer esta formado por un apuntador al programa, una bandera de estado (0 vacío, 1 lleno) y el área de datos.
El canal esta revisando continuamente la bandera y si el buffer utiliza la bandera cambia su estado para que el buffer sea llenado de nuevo.
Programa de canal para llenar el buffer:
Ciclo: Si bandera=1 ir a ciclo
Emite un comando de inicio E/S a la Unidad de Control
Esperar mientras el buffer se llena
Bandera = 1
Ir a ciclo.
Programa de canal para desalojar el buffer:
Espera: Si bandera =0 ir a espera
Lee el contenido del buffer en el área de trabajo del registro
Bandera = 0
Ir a espera.
Almacenamiento temporal con bloques.
Este caso se utiliza para cuando en el bloque leído existen n registros. La estructura del buffer incluye un contador (respecto a la estructura anterior) para indicar el registro (registro del buffer) próximo a leer.
Programa de canal para llenar el buffer:
Si bandera = 1 ir a ciclo
Emite un comando de E/S a la unidad de control
Esperar mientras el buffer se llena
Contador = 1
Bandera = 1
Ir a ciclo.
Programa de canal para desalojar el buffer:
Si bandera = 0 ir a espera.
Lee el registro (contador) dentro del área de trabajo.
contador = contador +1
Si contador > n
Bandera = 0
Vete a espera
La rutina de desalojo esta en espera de las lecturas, pero el programa puede ejecutar otras instrucciones en ese tiempo y mientras se desaloja no puede ser llenado.
Doble almacenamiento temporal.
Es utilizado para n registros por bloque, en este caso existen dos buffers, uno se llena mientras el otro desaloja, esto reduce la espera.
Lógicamente la estructura del buffer cambia, incluye un apuntador al otro buffer. Existen dos apuntadores para utilizar la anticipación de llenado y desalojo, estos son:
P-llenar: Apunta al buffer que se esta llenando o debe llenarse.
P_desalojo: Apunta al buffer que se esta desalojando o debe desalojarse.
Se llena el buffer apuntado por P-llenar
Programa de llenado:
Ciclo: Si P-llenar^ .bandera = 1 ir a ciclo
Emite comando de E/S a la U. de C.
Esperar mientras P-llenar^ .buffer está llenándose
P-llenar^ .contador = 1
P-llenar^ .bandera = 1
P-llenar = P-llenar^ .siguiente
Ir a ciclo.
El programa se cicla cuando un buffer está lleno y el otro no está totalmente vacío.
Programa de desalojo:
Si P-desalojo^ .bandera-llenar=0 ir a espera
Leer registro (P-vacio^ .contador) dentro del área de trabajo del registro
P-desalojo^ .contador = P-desalojo^ .contador + 1
Si P-desalojo^ .contador > n
P-desalojo^ .bandera – llenar = 0
P-desalojo = P-desalojo^ .siguiente
Ir a espera.
Esta rutina esta en ciclo solo cuando un buffer ya desalojó y el otro está vacío o empieza a llenarse. Si el buffer es llenado con más rapidez que desalojado, el programa permanecerá en ciclo, pero esto es preferible a tener ocioso al CPU. Existe una forma de atenuar este problema y es encadenar mas buffers.
Triple almacenamiento temporal.
En esta situación se pretende que el buffer 1 este lleno, el buffer 2 se este llenando y el buffer 3 este desalojando.
Si persiste el problema de que el llenado es más rápido que el desalojo, la rutina de desalojo tendrá que esperar. El tener varios buffers en actividad es que los periodos ociosos se reducen, pero a su vez aumenta la complejidad, el tiempo de ejecución de las rutinas de llenado y desalojo y lo que se requiere de memoria principal.