BUFFER
 Es el área de almacenaje temporal, por lo general en la RAM.
El objetivo de la mayor parte del Buffer es de actuar como un área
propia, necesita el permiso de la CPU antes de la transferencia de
datos a un dispositivo. Como la lectura y la escritura de datos a un
disco son relativamente lentos, muchos programas almacenan la
información de los cambios de datos dentro de un Buffer y luego
lo copian a un disco. Por ejemplo, los procesadores de texto
emplean un buffer para almacenar los cambios de un archivo.
Entonces cuando se guarda el archivo, el procesador de texto lo
pone al día, respecto a los cambios efectuados con el contenido
del Buffer.
BUFFER
Esto es mucho más seguro que el tener acceso sobre el archivo
que hay guardado en disco originario, así podemos evitar posibles
fallos irremediables, por eso cuando hay un corte de luz, toda la
información que tengamos almacenada dentro del Buffer se pierde,
por eso muchas veces cuando hacemos un documento, es
aconsejable guardar la información cada cierto tiempo.
Otro ejemplo común de Buffer, es utilizado para la impresión de
documentos, cuando entra una orden de impresión, la información
del documento se guarda dentro del buffer, y cuando ha recogido
toda la información y después de hacer la comprobación de si se
quiere seguir con el proceso de impresión pasa toda la información
al papel a través de la impresora.
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í
Programa de desalojo:
Espera: Si P-desalojo^ .bandera-llenar=0 ir a espera
Leer registro (P-vacío .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.
Memoria CACHE (tamaño del BUFFER)
El BUFFER o CACHE es una memoria
que va incluida en la controladora
interna del disco duro, de modo que
todos los datos que se leen y
escriben a disco duro se almacenan
primeramente en el buffer. La regla de
mano aquí es 128kb-Menos de 1 Gb,
256kb-1Gb, 512kb-2Gb o mayores.
Generalmente los discos traen 128Kb
o 256Kb de cache.
Si un disco duro está bien organizado
(si no, utilizar una utilidad
desfragmentadora:
DEFRAG, NORTON SPEEDISK, etc.),
la serie de datos que se va a necesitar
a continuación de una lectura estará
situada en una posición físicamente
contigua a la última lectura, por eso
los discos duros almacenas en la
caché los datos contiguos, para
proporcionar un acceso más rápido
sin tener que buscarlos. De ahí la
conveniencia de desfragmentar el
disco duro con cierta frecuencia.
El buffer es muy útil cuando se está
grabando de un disco duro a un CDROM, pero en general, cuanto más
grande mejor, pues contribuye de
modo importante a la velocidad de
búsqueda de datos.
Intercambio (swapping)
En un sistema de procesamiento por lotes, organizar la memoria en
particiones fijas es simple y efectivo: cada trabajo se carga en la
memoria cuando le toque su turno, y se queda en memoria hasta que
termine. Si hay suficientes particiones para mantener a la CPU
siempre ocupada, no habría razones para usar nada diferente.
Pero en un sistema interactivo, de tiempo compartido, la situación es
diferente, ya que es posible que la memoria no alcance para mantener
a todos los procesos.
En este caso se usa el disco como apoyo para extender la capacidad
de la memoria: algunos procesos se pasan temporalmente a disco,
recordar (scheduler de largo plazo).
Intercambio (swapping)
El sistema operativo mantiene una tabla que indica qué
partes de la memoria están desocupadas, y cuáles en uso. Las
partes desocupadas son hoyos en la memoria; inicialmente,
toda la memoria es un solo gran hoyo. Cuando se crea un
proceso o se trae uno del disco, se busca un hoyo capaz de
contenerlo, y se pone el proceso allí.
Las particiones ya no son fijas, sino que van cambiando
dinámicamente, tanto en cantidad como en ubicación y
tamaño. Además, cuando un proceso es pasado a disco, no
hay ninguna garantía de que vuelva a quedar en la misma
posición de memoria al traerlo de vuelta, de manera que es
imprescindible el apoyo del hardware para hacer ligadura en
tiempo de ejecución.
Intercambio (swapping)
Hasta ahora hemos supuesto que los procesos son estáticos en
tamaño pero es mas realista pensar que pueden crecer, por ejemplo
vía asignación dinámica de memoria. Si es así, conviene reservar un
poco mas de memoria que la que estrictamente necesita al momento
de ponerlo en memoria. Al hacer swapping, no es necesario guardar
todo el espacio que tiene reservado, sino solo el que esta usando.
Que pasa si un proceso quiere crecer mas allá del espacio que se le
había reservado? Si hay un hoyo contiguo se puede usar. Si no, se
puede pasar el proceso a un hoyo mas grande. Si no hay ninguno, se
pasa a disco hasta que haya. También se puede, simplemente, matar
al proceso.
Otro punto que hay que tener en cuenta al usar swapping, es el I/O
que pudiera estar pendiente. Cuando se hace, por ejemplo, input, se
especifica una dirección de memoria donde se va a poner lo que se
lea desde el dispositivo. Supongamos que proceso A trata de leer del
disco hacia la dirección d, pero el dispositivo esta ocupado
Intercambio (swapping)
Si los procesos pueden crecer, conviene reservar un poco más de
memoria que la que estrictamente necesita al momento de ponerlo en
memoria. Al hacer swapping, no es necesario guardar todo el espacio
que tiene reservado, sino sólo el que está usando. ¿Qué pasa si
proceso quiere crecer más allá del espacio que se le había reservado?
Otro punto que hay que tener en cuenta al usar swappping, es el I/O
que pudiera estar pendiente. Cuando se hace, por ejemplo, input, se
especifica una dirección de memoria donde se va a poner lo que se
lea desde el dispositivo. Supongamos que proceso A trata de leer del
disco hacia la dirección d, pero el dispositivo está ocupado: su
solicitud, por lo tanto, es encolada. Entretanto, el proceso A es
intercambiado a disco, y la operación se completa cuando A no está
en memoria. En esas circunstancias, lo leído se escribe en la
dirección d, que ahora corresponde a otro proceso. Para evitar tal
desastre:no pasar a disco procesos co I/O pendiente, o bien hacer
siempre I/O desde y hacia buffers del sistema operativo.
Intercambio (swapping)
Memoria
•Se basa en tener un
único proceso en
memoria principal y el
resto en memoria
secundaria (en tiempo
compartido hay mas
tiempo que en
memoria).
Swapping out
principal
Swapping In
Memoria
secundaria
p.e. Disco duro
•Cuando el proceso
acaba, se trae otro de
la memoria auxiliar.
Particiones
La memoria mas simple para permitir multitarea es darle a cada
programa un lugar fijo en memoria para que corra. Dividimos la
memoria en particiones de tamaño fijo e instruimos al linker o al
compilador para que se le asigne una dirección fija al programa. Será
importante ver cual es el rango de direcciones de memoria
comprometido durante la ejecución de nuestro programa. Pero de esta
manera cuando queramos correrlo deberemos esperar a que ese
rango de direcciones quede libre. Recordemos que estamos hablando
de espacio de memoria plana. Cada proceso a memoria es a una única
dirección de rango 0-MAXMEM.
Debido a que cada programa debe correr en una partición debe correr
en una partición particular, el sistema operativo debe mantener una
cola de espera separada para manejar cada partición. Cuando se
libera una partición otro programa (el que sigue la cola) puede
cargarse y ejecutarse en esa partición.
Particiones
Otro aspecto en el que se consume espacio de memoria en
este sistema es que será poco frecuente que un programa
ocupe completamente su partición. Esto se conoce como
fragmentación interna (aunque en realidad se trata del
fenómeno opuesto a la fragmentación, con un mismo
resultado:el desperdicio de memoria). Algo de esta memoria
desperdiciada podría aprovecharse si permitimos que mas de
un programa se ejecute dentro de una misma partición.
• Partición fija
Descripción:
La memoria principal se divide en un conjunto de particiones fijas
durante la generación del sistema. Un proceso se puede cargar en una
partición de mayor o igual tamaño.
Ventajas:
Sencilla de implementar; poca sobrecarga del sistema operativo.
Desventajas:
Empleo ineficiente de la memoria debido a la fragmentación interna; el
numero de procesos activos es fijo.
En la mayoría de los esquemas de gestión de memoria, se puede
suponer que el esquema operativo ocupa una parte fija de la memoria
principal y que el resto de la memoria esta disponible para ser usada
por varios procesos. El esquema mas sencillo de gestión de la
memoria disponible es dividirla en regiones con limites fijos.
Proceso 4
Proceso 5
Proceso 1
Memoria con partición fija
Libre y
desperdiciada
• Partición dinámica
Descripción:
Las particiones se crean dinámicamente, de forma que cada proceso
se carga en una partición de exactamente el mismo tamaño que el
proceso.
Ventajas:
No hay fragmentación interna; poca sobrecarga del sistema operativo.
Desventajas:
Uso ineficiente del procesador debido a la necesidad de compactación
para contrarrestar la fragmentación externa.
• Partición simple
Descripción:
La memoria principal se divide en un conjunto de marcos de igual
tamaño que los marcos. Un proceso se carga situando todas sus
paginas en marcos libres pero no necesariamente contiguos.
Ventajas:
No tiene fragmentación externa
Desventajas:
Hay una pequeña cantidad de fragmentación interna.
Descargar

Diapositiva 1 - ALEXEI'S WEBPAGE