- 1.4 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:
-
- Ciclo: 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:
-
- Espera : 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:
-
- Espera: 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.
-