Beruflich Dokumente
Kultur Dokumente
Se utiliza cuando los datos de entrada llegan a una mayor velocidad de la que podemos procesarlos
o cuando llegan de manera tan irregular y esporádica que no resulta conveniente dedicar tiempo y
recursos a esperarlos. Algunos ejemplos de buffers son los sistemas de entrada del teclado que
almacenan las teclas presionadas, los buffers de video en los que se prepara el siguiente cuadro de
animación para presentarlo en pantalla y otros tantos mas que como usuarios no creo que sean muy
conscientes de lo que son o que hacen. Otra definición de buffer es la de una región de memoria
reparto y entregas. Desde la época de los vaqueros y los inicios de la aviación los encargados de
los sistemas de reparto y entregas descubrieron que podían ahorrarse mucho tiempo si en lugar de
hacer que los mensajeros se detuvieran para entregar la mercancía colocaban uno de esos grandes
colchones donde podían dejar caer los paquetes sin detenerse. De ese modo no era necesario dejar
a alguien en la puerta esperando al mensajero y los empleados podían ir con toda calma y a una
hora predeterminada a revisar estos buffers para ver si había llegado algún paquete. Un sistema
muy parecido se utilizó en algunas fábricas y bodegas de muchos pisos en los que dejaban caer los
productos por una especie de pozo vertical en cuyo fondo había un cojín y una pequeña puerta por
la que se podían entregar los productos. En la actualidad las máquinas expendedoras automáticas
usan buffers en los que dejan caer tanto el cambio en monedas como la mercancía de modo que el
cliente no tenga que poner la mano y esperar a que estos caigan. Otro ejemplo mas sencillo es el
viejo buzón de correos en el que el cartero puede dejar documentos y los habitantes pueden ir a
Los buffers son muy importantes y nos pueden ayudar a resolver una enorme cantidad de
problemas que me llevaría toda la nota explicarles. Existen muchos tipos diferentes de buffers, hay
algunos que funcionan como stacks y que sirven para recorrer estructuras de datos como grafos y
árboles, otras trabajan como colas de procesamiento y nos dejan leer datos antes de que se
pierdan, otros buffers mezclan datos de muchas fuentes y los combinan e incluso los buffers se
relacionan con la recursión. Para hacer un buffer lo mínimo que necesitamos son 4 cosas. La
primera obviamente es un espacio en memoria que vamos a usar como buffer. La segunda es un
puntero o variable que almacene la dirección de memoria donde se encuenta, la tercera es un valor
que indique la longitud máxima del buffer y la última es un índice o conjunto de índices que nos
indiquen en qué localidad del buffer escribir los datos de entrada y leer los datos de salida. La
combinación de la longitud máxima y los índices nos dirán si el buffer está lleno o vacio. Y aunque la
administración de esta información suena muy complicada ya verán que existen muchas técnicas
datos en el buffer y los nuevos datos que llegan al no poder ser almacenados se pierden. El
Underflow es lo contrario, cuando queremos obtener datos y el buffer está vacío. El Underflow es
mas peligroso de lo que suena en ciertas aplicaciones como por ejemplo la grabación de datos en
medios físicos como los discos. Si ocurre un buffer underflow la pieza puede quedar arruinada o en
el caso de audio y video en tiempo real la comunicación puede presentar cortes. Es por eso que
cada que se va a tener acceso al buffer ya sea para leer o escribir datos en él es necesario verificar
que no van a ocurrir ninguna de estas dos condiciones. Pues si no se hace esta prueba no solo
puede haber pérdidas de datos entrantes o cortes en el flujo de información sino que en casos de
buffers muy mal diseñados puede haber problemas de sobreescritura que acaben por
afectar otros datos importantes del programa y en casos muy dramáticos causar un fallo
de protección de memoria o una caida completa del sistema. Les aconsejo que si consideran
que el buffer puede ser peligroso lo coloquen en una región de la memoria alejado de los datos mas
críticos.
Por suerte existe una técnica que nos puede evitar al mismo tiempo el problema del overflow,
underflow y la sobreescritura. Esta técnica involucra máscaras de bit. El primer consejo es hacer que
los buffers siempre tengan una longitud igual a una potencia de 2. Pueden ser 2,4,8,16,32,64,…
Para el ejemplo vamos a tomar un buffer de 8 elementos. A partir de su dirección inicial, las
siguientes 8 localidades se pueden numerar como 0,1,2,3,4,5,6 y 7 y los índices tanto de lectura
como de escritura nunca deben de ser mayores que 7 ni menores que cero. Lo que cualquier
programador que no sabe de ASM haría (y los que manejan leguajitos de ‘objetos y métodos’ ni
siquiera harían esto) sería comprobar que ambos índices estuvieran dentro de ese rango antes de
acceder al buffer y mandar un mensaje de error si esto no se cumple. Pues bien, como nosotros
programamos en ensamblador nos basta con comprobar el estado de los bits que estén por encima
de los 3 menos significativos. O lo que es lo mismo hacer una máscara AND con 0FCh (para índices
de 8 bits). Si el resultado de esta operación es diferente de cero significa que los apuntadores están
fuera del rango de cero a 8. Recuerden que los valores negativos tienen el bit mas significativo
activado. De este modo si queremos detectar esta condición y encender una bandera que indique
que hay un error basta hacer un AND seguido de un SETNZ. Si quisiéramos forzar a que los índices
siempre se mantengan dentro del rango de 0 a 7 podemos hacerles un AND con un 3. Esto es
especialmente importante para los buffers en forma de cola o los interesantísimos buffers circulares.
Voy a dejar el tema de los buffers circulares y de los buffers que funcionan como stacks y queues
para otro dia porque son temas muy complicados para solo mencionarlos. De momento solo
mencionaré que los buffers de Stack tienen un mismo índice que se usa tanto para leer como para
escribir datos y que se incrementa o decrementa dependiendo de la operación que se haga. En los
buffers de queue en los que los primeros datos en salir son los que mas tiempo llevan dentro del
sistema el asunto es manejar dos índices uno para cada operación. Cuando ambos índices son
iguales significa que el buffer está vacio y cuando la distancia entre ellos es igual a la longitud
Para hacer buffers queue es necesario entender lo que es un buffer circular. Un buffer circular
puede aceptar una cantidad infinita de datos pero solo puede recordar tantos datos como lo indique
su longitud máxima. Los datos mas viejos se pierden por sobreescritura. Para hacer un buffer
circular primero se define una extensión de memoria cuya longitud sea una potencia de dos y luego
el puntero de entrada se mantiene dentro de ese rango por la fuerza por medio de máscaras AND.
De ese modo no importa cuantas veces lo incrementemos ni durante cuanto tiempo el índice
permanecerá dando vueltas en esa extensión de memoria sin salirse. Este tipo de buffers son muy
en realidad es un buffer circular que tiene un segundo puntero que va ‘persiguiendo’ al puntero de
entrada de datos. Y es importante que un buffer queue sea en esencia un buffer circular
porque he visto a muchos estudiantes que crean buffers capaces de caminar a todo lo
largo de la memoria del sistema y aplastar por sobreescritura el resto de las variables
cual si se tratara de las orugas de un tanque. Si el buffer queue se hace de manera circular se
va a mantener en su lugar sin peligro de sobreescribir otras estructuras. Y esto es porque en los
Por hoy no me voy a poner a trollear. Solo voy a comentar que voy a estar al pendiente de un juego
que me dijeron que iba a salir publicado en este último cuarto del 2012. Espero que quienes lo están
haciendo puedan terminarlo y recuperen su inversión, porque si siguen como hasta ahorra puede