Componentes y Funcionamiento de Computadoras
Componentes y Funcionamiento de Computadoras
Una Computadora es una máquina digital programable y sincrónica, con cierta capacidad de
cálculo numérico y lógico, controlada por un programa almacenado y con posibilidad de
comunicación con el mundo exterior.
Es DIGITAL porque dentro de la computadora las señales eléctricas que se manejan y la
información que se procesa se representa en forma discreta, por medio de dos valores (0 y 1).
Es SINCRÓNICA porque realiza las operaciones coordinada por un reloj central que envía señales
de sincronismo a todos los elementos que componen la computadora.
Internamente posee una capacidad de cálculo numérico y lógico, en un subsistema denominado
Unidad Aritmético-Lógica o ALU.
Está CONTROLADA POR PROGRAMA (a diferencia a una calculadora), significa que
internamente se tienen órdenes o instrucciones almacenadas, que la computadora podrá
obtener, interpretar y ejecutar.
Además, está COMUNICADA con el mundo exterior. Esto significa que podrá realizar
operaciones de ingreso o egreso de valores desde y hacia el mundo real, utilizando dispositivos
periféricos.
Funcionamiento básico
1. Buscar la próxima instrucción a ejecutar en la memoria de instrucciones Mi
2. Interpretar qué hacer en la Unidad de Control (UC).
3. Ejecutar las operaciones interpretadas por UC, utilizando la ALU de ser necesario. Estas
operaciones pueden comprender lectura/escritura de la memoria de datos o entrada/salida
por los periféricos.
4. Esto representa una secuencia infinita de pasos.
Algunos conceptos
El HARDWARE se refiere a las componentes físicas de la computadora.
El SOFTWARE comprende los programas que se ejecutan sobre la computadora.
Un BIT (dígito binario) es la unidad de información más pequeña. Solo puede tener uno de dos
valores: encendido o apagado (0 o 1, sí o no, etc.).
La Unidad Central de Procesamiento CPU es la encargada de interpretar y llevar a cabo las
instrucciones de los programas.
PROCESADOR MEMORIA
Solo realiza un conjunto pequeño de El procesador debe depender de una
operaciones básicas, que memoria en donde el programa es
combinadas resuelven problemas almacenado, y un mecanismo para
más grandes. leer y escribir esa memoria.
Antes existía lo que se conoce como programación en Hardware, y cuando cambiaban las tareas
debíamos cambiar el hardware. Luego, con la operación en Software en cada paso se efectúa
alguna operación sobre los datos. Para cada paso se necesita un nuevo conjunto de señales de
control, proporcionadas por las instrucciones. De este modo aparece un nuevo concepto de
programación puesto que ya no es necesario cambiar el hardware cada vez que quiera realizar
una tarea distinta.
Software
La producción de sistemas de software, constituye el puente útil entre el usuario y la
computadora. Hay un modelo por capas desde la máquina hasta el usuario:
1. HARDWARE: es la primera capa, puede ser un artefacto muy elaborado desde el punto de
vista tecnológico, pero totalmente inútil si no se lo “carga” con software.
2. SISTEMA OPERATIVO: es la segunda capa, nos permite comunicarnos con la computadora
y utilizar eficientemente sus recursos. Se subdivide en tres niveles: el primer nivel del
sistema operativo es el que nos permite que al encender la máquina haya funciones “vitales”
incorporadas al hardware, estas vienen incorporadas con el hardware y se denomina
Sistema Operativo residente o BIOS; el segundo nivel del sistema operativo trata de ser
“portable”, es decir agregar funciones que sean útiles al usuario del sistema operativo sobre
cualquier máquina, y normalmente se "cargan” desde disco al ser solicitadas; el tercer nivel
del sistema operativo se refiere esencialmente a las funciones de administración de
recursos de la o las máquinas que controla el usuario: administrar la memoria principal, los
dispositivos de almacenamiento, etc.
3. UTILITARIOS BÁSICOS: es la tercera capa y se refiere a los programas que nos acercan
soluciones a problemas muy básicos del mundo real como procesadores de texto, planillas
de cálculo, etc. En general, estas aplicaciones de software se construyen alrededor de
metáforas visuales del mundo real, extendiendo de algún modo las habilidades naturales
del usuario (por ejemplo, tener un procesador de textos con corrector ortográfico).
4. LENGUAJES DE PROGRAMACIÓN DE APLICACIONES: en la cuarta capa tenemos los
lenguajes de programación de aplicaciones (tales como Pascal, C, Java, C++, ADA, Basic,
Fortran, Delphi, etc.).
5. LEGUAJES ORIENTADOS A LA APLICACIÓN: en la quinta capa se trata de acercar aún más la
forma de expresar los problemas y su solución al mundo del usuario. Estos lenguajes
permiten resolver en forma sencilla alguna clase de problemas, no exigiendo una
preparación especial del usuario.
6. SISTEMA DE SOFTWARE DE PROPÓSITO GENERAL: en la sexta capa tenemos estos sistemas,
tales como los sistemas contables, de liquidación de sueldos, de facturación, etc.
7. SISTEMA DE SOFTWARE DEDICADOS: en la séptima capa se trata de desarrollar un producto
“a medida” para una determinada organización, empresa o máquina. Por ejemplo, los
controladores de un robot, de una máquina fotográfica o de un lavarropas.
8. USUARIO DEL MUNDO REAL.
Componentes de la computadora
Las computadoras en realidad solo hacen cuatro cosas: recibir entradas (aceptan información
desde el mundo exterior), producir salidas (dan información al mundo exterior), procesar
información (llevan a cabo operaciones aritméticas o lógicas con la información) y almacenar
información (mueven y almacenan información en la memoria).
Virtualmente todos los diseños de computadoras contemporáneas están basados en los
conceptos desarrollados por John Von Neumann. Tal diseño es conocido como la Arquitectura
Von Neumann, y se basa en tres conceptos claves:
Los datos e instrucciones están almacenados en una única memoria de lectura-escritura
constituida por celdas de igual tamaño.
Los contenidos de las celdas de la memoria son identificables por posición, sin importar el
tipo de los datos guardados en ese lugar.
La ejecución ocurre de manera secuencial (a menos que se modifique explícitamente) de
una instrucción a la siguiente.
El modelo de Von Newmann consta de 5 elementos principales:
Unidad de Entrada: provee las instrucciones y los datos.
Unidad de Memoria: en donde se almacenan los datos e instrucciones.
Unidad Aritmético-Lógica: es la que procesa lo datos.
Unidad de Control: es la que dirige la operación.
Unidad de Salida: donde se envían los resultados.
LA MEMORIA
la CPU sólo puede manejar una instrucción y unos cuantos datos a la vez. La computadora tiene
que “recordar” el resto del programa y los datos hasta que el procesador esté listo para usarlos.
La CPU está conectada con el resto de los componentes del sistema a través de tres buses
distintos. Se tiene entonces, un medio para identificar: el bus de direcciones, un medio para
transportar el dato propiamente dicho: el bus de datos, y un medio para controlar el intercambio
de información: el bus de control.
La CPU saca información de la misma instrucción que debe ejecutar, así sabe, por ejemplo, en
qué sentido deberían viajar los datos (lectura o escritura) y envía en consecuencia las señales
adecuadas por el bus de control. La CPU deberá también conocer cuando enviar esas señales
para trabajar en forma conjunta y ordenada. Se denomina tiempo de acceso al tiempo que tarda
un elemento de memoria en cumplir efectivamente una orden de lectura o escritura.
El denominado ‘tamaño del bus de direcciones’, determina cuántos bits tienen las direcciones
que identifican cada celda de memoria identificada con una dirección de memoria.
En general para identificar N diferentes posiciones de memoria, se necesitará que n (el número
de bits del bus de direcciones) sea tal que se cumpla: N ≤ 2n
Ejemplo 1 ¿Cuántos bits deberán tener las direcciones para identificar 250 posiciones de
memoria diferentes?
N = 250 ≤ 2n si n = 8, 28 = 256 y se cumple la desigualdad. Respuesta: 8 bits.
Ejemplo 2 Escriba en binario la dirección más pequeña y la más grande para el bus de direcciones
del ej. anterior. ¿Puede determinar su valor en decimal?
Dirección más pequeña = 00000000 | Dirección más grande = 11111111
Identificamos cada posición de memoria con un número binario llamado dirección. La cantidad
de bits almacenados en ella (llamado dato) se conoce como “unidad mínima direccionable”. Si
la posición de memoria puede contener 8 bits (1 byte) de información decimos que la unidad
mínima direccionable es el byte.
RAM Y ROM
La RAM (Random Access Memory o Memoria de Acceso Aleatorio) es el tipo más común de
almacenamiento primario o memoria de la computadora. Los chips RAM contienen circuitos que
sirven para almacenar temporalmente instrucciones de programas y datos. Un chip de RAM está
dividido en posiciones o celdas de igual tamaño, identificadas por una dirección única, de
manera que el procesador puede distinguirlas y ordenar que se guarde o recupere información
de ella. La RAM es una memoria volátil: si se interrumpe la energía eléctrica, la computadora
olvida inmediatamente todo lo que estaba recordando en la RAM.
La memoria no volátil se denomina ROM (Read-Only Memory o Memoria Sólo de Lectura), la
computadora puede leer información de ella, pero no escribir nueva información. Todas las
computadoras modernas cuentan con dispositivos de ROM que contienen las instrucciones de
arranque y otra información crítica. La información en la ROM se graba permanentemente
cuando nace la computadora, de modo que siempre está disponible cuando ésta opera, pero no
puede cambiarse a menos que se reemplace el chip de ROM.
En RAM y ROM el tiempo de acceso es constante sin importar la ubicación relativa de las celdas.
Adicionalmente, existen otros medios donde almacenar información y que constituyen una
forma de memoria externa, como por ejemplo los discos rígidos.
Hay una relación entre las tres características clave de la memoria (costo, capacidad y tiempo
de acceso): a menor tiempo de acceso, mayor costo por bit; a mayor capacidad, menor costo
por bit; a mayor capacidad, mayor tiempo de acceso.
El ciclo de instrucción
La función básica realizada por una computadora es la ejecución de programas. Hay que
entender el proceso de ejecución: el punto de vista más simple es considerar el procesamiento
de una instrucción como consistente de dos pasos: la CPU lee (búsqueda) las instrucciones desde
la memoria una a la vez, y las completa (ejecución).
La corrida de un programa consiste en la repetición de los pasos de búsqueda y ejecución. La
‘búsqueda’ de instrucción es una operación común para cada instrucción, y consiste en leer
información de, al menos, una posición de memoria. La ‘ejecución’ puede involucrar varias
operaciones y depende de la naturaleza de la instrucción.
El procesamiento requerido para una sola instrucción es llamado ciclo de instrucción. Usando la
descripción simplificada, los dos pasos son el ciclo de búsqueda y el ciclo de ejecución. El ciclo
se detiene sólo si la máquina es apagada, si ocurre algún error irrecuperable, o se encuentra una
instrucción de programa que detenga la computadora.
En el comienzo de cada ciclo de instrucción, la CPU busca una instrucción desde la memoria. En
una CPU típica, se usa un registro llamado contador de programa para conocer la ubicación
desde la cual la próxima instrucción debe ser buscada. A menos que se diga otra cosa, la CPU
siempre incrementa el contador de programa después de cada búsqueda de instrucción, de
modo de quedar listo para buscar la próxima en secuencia (es decir, la instrucción ubicada en la
siguiente posición de memoria). Esta secuencia podrá ser alterada y deberemos indicarla en
modo especial.
La instrucción buscada es cargada en un registro de la CPU conocido como Registro de
Instrucción. La instrucción está en la forma de un código binario que especifica qué acción debe
tomar la CPU; ésta interpreta la instrucción y realiza la acción requerida. En general, estas
acciones caen en 4 categorías:
CPU - Memoria: los datos pueden ser transferidos desde la UCP a la memoria o desde la
memoria a la CPU.
CPU - E/S: los datos pueden ser transferidos hacia o desde el mundo exterior por una
transferencia entre la CPU y el módulo de E/S.
Procesamiento de datos: la CPU puede realizar alguna operación aritmética o lógica sobre
los datos.
Control: una instrucción puede especificar que la secuencia de ejecución sea alterada (por
ejemplo, con una operación de salto o jump). Por ejemplo, si la CPU busca una instrucción
de la posición 149 que especifica que la próxima instrucción sea buscada en la posición 182,
la CPU recordará esto poniendo el 182 en el contador de programa. Así, en el próximo ciclo
de búsqueda, la instrucción será buscada en la posición 182 en vez de la 150 como sería en
la secuencia sin alterar.
La ejecución de una instrucción puede involucrar una combinación de estas acciones.
Además, todas las computadoras proveen un mecanismo por el cual otros módulos, de E/S o
memoria, pueden interrumpir el procesamiento normal de la CPU. Las interrupciones se
proveen principalmente como una manera de mejorar la eficiencia de procesamiento.
Representación numérica
Los datos e informaciones que se manejan internamente en un sistema informático se pueden
representar, según sus características, en:
CÓDIGOS ALFANUMÉRICOS (ASCII): en general cada carácter se maneja internamente en una
computadora por medio de un conjunto de 8 bits (1 byte) mediante un sistema de codificación
binario que denominaremos código de caracteres.
REPRESENTACIONES NUMÉRICAS: un sistema de numeración se caracteriza fundamentalmente
por su base, que es el número de símbolos distintos que utiliza, y un coeficiente que determina
cuál es el valor de cada símbolo dependiendo de la posición que ocupe.
PRÁCTICA PERIFÉRICOS
Pantalla alfanumérica: sólo pueden mostrar caracteres alfanuméricos y para esto se
dividen en filas y columnas. En cada celda se almacena un carácter codificado en binario.
Para esto se utiliza la tabla ASCII que asigna 8 bits a cada carácter. Puede suceder que
se especifique un color para cada carácter, entonces necesito bits adicionales. Como
sólo se puede elegir un color por vez y por carácter serán log2(cantidad colores). Si se
agregan atributos por cada carácter (subrayado, negrita, etc.) se necesitará 1 bit
adicional para cada atributo (puedo tener más de uno a la vez).
Pantalla gráfica: este tipo de pantalla se divide en pixeles. La cantidad de pixeles estará
dada por la resolución (ancho x alto, por ejemplo, 1024x768). Cada punto puede ser de
un color, e indicando el color de cada pixel en toda la pantalla se formará la imagen.
Existen diferentes profundidades de color, por ejemplo: monocromo (blanco o negro, 1
bit); escala de grises (256 tonos de gris, 1 byte por pixel); True Color (24 bits por pixel).
Ejemplo: calcular el tamaño de memoria para un disco duro de 2 platos con 300 pistas por cara
y 1000 sectores por pista.
2 platos x 2 caras / plato x 300 pistas / cara x 1000 sectores / pista x 512 bytes / sector = 614,4MB
Cosas a tener en cuenta:
1. La velocidad de rotación es una característica importante del disco porque afecta al desempeño
general.
2. Si debemos hacer cálculos que impliquen a la velocidad de rotación diremos que en cada vuelta
se puede leer una pista completa.
3. Si el valor que conocemos es el radio o diámetro de una pista y la densidad de sectores en ese
extremo hay que usar la fórmula de la circunferencia.
Ejemplo: calcular cantidad de sectores por pista, si tengo 10 sectores por centímetro y una pista
de radio de 2 centímetros.
10 sectores / cm x (2𝜋 x radio) cm = 10 x 2𝜋 x 2 sectores = 40𝜋 sectores ≈ 125 sectores
SISTEMAS DE REPRESENTACIÓN EN PUNTO FIJO
BSS – Binario sin signo
Con n bits represento 2n números.
Rango de representación: 0 ≤ x ≤ 2n-1
Números negativos o fraccionarios no pueden ser representados en este sistema.
Ejemplo BSS restringido a 3 bits
Represento 23=8 números / Rango de representación: 0 ≤ x ≤ 7
0=000 | 1=001 | 2=010 | 3=011 | 4=100 | 5=101 | 6=110 | 7=111
REPRESENTACIÓN Y ERROR
Al convertir un número decimal a binario tenemos dos casos:
Sin restricción: en la cantidad de bits a usar, la representación no tendrá errores.
Con restricción de bits: la representación puede tener un error dado por e = |x - n|,
donde x es el número que quiero representar y n es el número más cercano a x que
puedo representar. Además, emax = resolución/2
Entonces para la representación de la parte fraccionaria se toman los valores enteros de los
resultados parciales, en el orden calculado: 0.2 = .0011 0011 … 0011 (periódico).
SISTEMA BCD Y BCD EMPAQUETADO (Sistema Decimal codificado en Binario)
En este sistema, los dígitos decimales se convierten uno a uno en binario. Para representar un
dígito decimal necesito 4 bits, y se asocia cada dígito con su valor en binario puro.
0=0000 | 1=0001 | 2=0010 | 3=0011 | 4=0100 | 5=0101 | 6=0110 | 7=0111 | 8=1000 | 9=1001
BCD Desempaquetado: se aplican en E/S y periféricos, los números se codifican usando
un byte por dígito. Pueden ser SIN SIGNO (4 bytes para el binario puro y los otros 4 se
completan con 1111, ejemplo: 5 = 1111 0101 = F5); o CON SIGNO (los 4 bits que
acompañan al ÚLTIMO dígito son reemplazados por C=1100 + | D=1101 –, por ejemplo:
4 = 1100 0100 = C4| -23 = 1111 0010 1101 0011 = F2D3)
BCD Empaquetado: se aplica en cálculo, se reservan 4 bits por dígito. NUNCA cortar los
bits, siempre escribir de a pares, si la cantidad de dígitos del número a representar es
impar, completo con 0000. Por ejemplo: 125 = 0000 0001 0010 0101 = 0125. El BCD
Empaquetado también puede ser CON SIGNO, en este caso agrego el signo al final. Por
ejemplo: -25 = 0000 0010 0101 1101 = 025D| +8 = 1000 1100 = 8C
Para sumar en BCD tenemos dos casos: RES ≤ 9 No hay problema | RES > 9 SUMO 6 a ese
digito (genero “acarreo” porque hay seis combinaciones no usadas).
Por ejemplo: +1
26 0010 0110
+ +
15 0001 0101
41 1011
+
0110
0100 0001
En la suma En la resta
1
0 0 1 1 0 1 1 0
+ + + + – – – –
0 1 0 1 0 1 0 1
0 1 1 10 0 0 1 0
CAMBIO DE BASES
FLAGS
Las FLAGS son bits de condición que el procesador establece de modo automático acorde al
resultado de cada operación realizada. Sus valores permitirán tomar decisiones como: realizar
o no una transferencia de control o determinar relaciones entre números.
Z (cero) N (negativo) C (carry) O (overflow)
1 todos los bits = 0 1 número negativo 1 acarreo / borrow 1 desborde en BCS
0 algún bit es 1 0 número positivo 0 otro caso 0 otro caso
REPRESENTACIÓN ALFANUMÉRICA
Se pueden representar: letras (mayúsculas y minúsculas), dígitos decimales (0…9), signos de
puntuación, caracteres especiales, caracteres u órdenes de control. Algunos códigos son:
FIELDATA: 26 letras mayúsculas + 10 dígitos + 28 caracteres especiales. Como hay 64
combinaciones en total Código de 6 bits.
ASCII: FIELDATA + minúsculas + control. Como hay en total 127 combinaciones Código
de 7 bits.
ASCII extendido: ASCII + multinacional + semigráficos + matemática Código de 8 bits.
EBCDIC [Extended BCD Interchange Code]: es parecido al ASCII, pero de IBM. Código
de 8 bits.
SISTEMA EN PUNTO FLOTANTE
Este sistema nos permite tener un rango mayor de números, es decir, podemos representar
números de “más pequeños” a “más grandes”, con la misma cantidad de bits, lo cual era una
limitación para el sistema en Punto Fijo.
La base [B] es implícita y no necesita almacenarse, puesto que es la misma para todos los
números. La ventaja que tiene este sistema es que necesito menos bits para almacenar la
mantisa y el exponente, que para almacenar el número completo. Tanto la M como el E, están
representados en algún sistema Punto Fijo ya conocido (BSS, BCS, Ca1, Ca2, Ex2).
Tener en cuenta que cuando la mantisa fraccionaria tiene muchos dígitos, para buscar máximos
número de mantisa [M] con n dígitos hacemos M = ± (1-2-n). Por ejemplo, para una mantisa
fraccionaria 6 dígitos BCS y un bit de signo, el número máximo que puedo representar con la
mantisa es M = ± (1-2-6). (Después tengo que ver el exponente)
Bits totales 32 64
Exponente en exceso 127 1023
Rango de exponente -126 | +127 -1022 | +1023
Rango de números 2-126 | ~2128 2-1022 | ~21024
[DEL STALLING] El Estándar IEEE 754 se desarrolló para facilitar la portabilidad de los programas
de un procesador a otro y así poder alentar el desarrollo de programas numéricos sofisticados.
Dichos formatos reducen la posibilidad de que el resultado final se vea deteriorado por un error
de redondeo.
LÓGICA DIGITAL
Un circuito digital es en el que están presentes dos valores lógicos. Y las compuertas son
dispositivos electrónicos que pueden realizar distintas funciones con estos dos valores lógicos.
Las compuertas constituyen la base de hardware sobre la que se construyen todas las
computadoras digitales. Para describir los circuitos que pueden construirse combinando
compuertas, se requiere un nuevo tipo de álgebra, en donde las variables solo pueden ser 0 o 1:
esta es el álgebra booleana.
Puesto que una función booleana de n variables tiene 2n combinaciones de los valores de
entrada, la función puede describirse totalmente con una tabla de 2n renglones, donde cada uno
indica un valor de la función para cada combinación distinta de las entradas. Dicha tabla se la
conoce como tabla de verdad.
Identidades del álgebra booleana
Identidad 1 .A = A 0+A=A
Nula 0 .A = 0 1+A=1
Idempotencia A .A = A A+A =A
Inversa A .A̅=0 A+A ̅=1
Conmutativa A .B = B .A A+B =B+A
Asociativa (A . B). C = A . (B . C) (A + B) + C = A + (B + C)
Distributiva A + (B . C) = (A + B) . (A + C) A . (B + C) = (A . B) + (A . C)
Absorción A . (A + B) = A A + (A . B) = A
De Morgan ̅̅̅̅̅̅
A.B = A ̅+B ̅ ̅̅̅̅̅̅̅
A+B = A ̅ .B
̅
Funciones lógicas
Toda función lógica puede representarse mediante una tabla de verdad y un diagrama de
compuertas lógicas. Si quiero escribir la función lógica a partir de una tabla de A B|F
verdad, debo tener en cuenta que deben haber tantos términos como unos en los 0 0 0
0 1 1
resultados de la tabla, y las variables que valen 0 en la tabla aparecen negadas. 1 0 1
̅ B + AB
Por ejemplo para la siguiente tabla de verdad tenemos la función F = A ̅ 1 1 0
Circuitos integrados
Las compuertas no se fabrican ni se venden individualmente, sino en unidades llamadas circuitos
integrados, también conocidos como IC o chips. Un IC es un trozo cuadrado de silicio de unos
5mm en el que se han depositado algunas compuertas. Estos suelen montarse en paquetes de
plástico o cerámica rectangulares, cuyos lados largos cuentan con dos filas paralelas de
terminales conectadas a la entrada o salida de alguna compuerta del chip, a la alimentación
eléctrica o a tierra.
Tabla de verdad: Para cada una de las posibles combinaciones de las n señales de
entrada, se enumera el valor binario de cada una de las m señales de salida.
Símbolo gráfico: Describe la organización de las interconexiones entre puertas.
Ecuaciones booleanas: Cada señal de salida se expresa como una función booleana de
las señales de entrada (suma de productos).
Los circuitos combinacionales implementan las funciones esenciales de una computadora digital.
Sin embargo, ellos no proporcionan memoria, que es un elemento también esencial para el
funcionamiento. Para estos fines, se utilizan circuitos lógicos digitales más complejos
denominados circuitos secuenciales.
Los circuitos combinacionales cuentan con una o varias entradas y salidas. Los mismos
responden a los valores lógicos en las entradas, y la o las salidas están determinadas
exclusivamente por los valores de entrada en ese instante. Entonces, si cambia la entrada,
cambia la salida. Además, los valores pasados de las entradas, no influyen en los valores de la
salida. Por ejemplo, algunos circuitos combinacionales de uso frecuente son:
Multiplexores: circuito con 2n entradas de datos, 1 salida
de datos y n entradas de control que seleccionan una de
las entradas de datos. Estos pueden usarse para
seleccionar una de varias entradas o para implementar una
tabla de verdad. También como convertidor de datos
paralelos a seriales.
Decodificadores: estos son circuitos que aceptan un
número de n bits como entrada y lo utiliza para seleccionar
(poner en 1) una y sólo una de las dos líneas de salida. Por
ejemplo, imagínate una memoria que consiste en 8 chips;
un decodificador 3 a 8, tiene 3 entradas A, B, C para
seleccionar uno de los 8 chips, puesto que, gracias a la
combinación, sólo una línea de salida se pone en uno, sólo
se podrá habilitar un chip a la vez.
Comparadores: estos comparan dos palabras de entrada.
En el ejemplo, el comparador acepta dos entradas cada
una de 4 bits y produce 1 si son iguales y 0 si no.
Circuitos secuenciales
Los circuitos lógicos secuenciales se asocian al estudio de dispositivos de almacenamiento en
general, en donde una de sus características principales es que sus salidas dependen de las
entradas actuales, de entradas en tiempos anteriores y de una señal externa de reloj.
Las salidas dependen tanto de las entradas como del estado interno del circuito. Estos circuitos
tienen la característica de almacenar valores lógicos internamente, y los mismos se almacenan,
aunque las entradas lógicas no estén.
Registro de almacenamiento
D [D0,D1,D2,D3]
es el dato a
escribir.
Q [Q0,Q1,Q2,Q3]
es el dato leído.
Diagrama de estados
Este diagrama muestra los
distintos estados por los que
pasa la CPU durante la
ejecución de un ciclo de
instrucción. No todos los ciclos
de instrucción involucran
todos los estados, algunos estados pueden no darse y otros pueden llegar a repetirse.
Cada uno de estos círculos representan un estado dentro de un ciclo de instrucción, y las flechas
nos marcan el flujo de los estados. Los estados por encima de la raya horizontal (2, 5 y 8) son
estados que involucran manejo de los buses, es decir acceso de la CPU a la memoria o a E/S para
leer o escribir información; y los estados que están por debajo de la raya horizontal (1, 3, 4, 6,
7) son operaciones internas de la CPU, es decir que no involucran el uso de los buses (sólo los
buses internos de la CPU).
ESTADO 1: cálculo de la dirección de la instrucción. Esto involucra utilizar el PC,
incrementarlo para que apunte a la próxima instrucción a ejecutar y así poder acceder
a ella. Una vez que tenemos la dirección de la instrucción pasamos al siguiente estado.
ESTADO 2: búsqueda de la instrucción. Se hace un acceso al Bus de Direcciones con la
dirección de la instrucción que se generó en el E1, se hace el acceso a la memoria para
ir a buscar la instrucción. Esta instrucción se va a colocar en el IR (es decir la instrucción
viaja de la memoria a la CPU y se guarda en el IR, mediante el Bus de Datos).
ESTADO 3: decodificación de la instrucción. Se analiza la instrucción para determinar
qué tipo de operación hay que hacer, que operandos y cuantos operandos se van a
utilizar. Esto dependerá de que instrucción se trate. [ESTOS TRES ESTADOS SON
COMUNES A TODAS LAS INSTRUCCIONES].
ESTADO 4: cálculo de la dirección del operando. Si la instrucción implica la referencia
de un operando en la memoria de E/S es acá donde se determina la dirección. Puede
ser que la instrucción nos indique directamente donde está el operando, o puede que
tengamos que realizar una cuenta antes para saber en dónde se encuentra dicho
operando. Este estado está asociado con los Modos de Direccionamiento. Además, si no
necesitamos operando esta parte no sería necesaria.
ESTADO 5: búsqueda del operando. Se realiza el ciclo de acceso a Memoria o a E/S para
acceder a la información. Como involucra a la Memoria o E/S este estado está por
encima de la línea horizontal, es decir, está involucrando el manejo de los buses. [Los
estados 4 y 5 se pueden repetir, por ejemplo, si necesito buscar un segundo operando].
ESTADO 6: operación sobre los datos. El o los operandos necesarios ya están en la CPU
y ahora hay que realizar la operación sobre esos datos (suma, resta, multiplicación, etc.).
ESTADO 7: cálculo de la dirección del resultado. Ya hicimos el cálculo en la CPU y ahora
hay que calcular la dirección en la cual voy a guardar este resultado. La instrucción nos
tiene que haber dado la información, de donde debo guardar el resultado. Una vez que
tengo dicha dirección paso al último estado.
ESTADO 8: almacenamiento del resultado. Se hace la operación de almacenar la
información. En este estado vuelve a ser necesario el uso de los buses, pues debo enviar
el resultado ya sea en Memoria o en E/S.
En algunas máquinas hay instrucciones que procesan arreglos de operandos (vectores).
Entonces, luego de almacenar una componente del vector resultado [Estado 8] se procesa el
siguiente componente del vector [Estado 4]. En este caso, la instrucción sólo se decodifica una
vez y luego repite los estados del 4 al 8 para operar cada componente del vector.
EJEMPLO: supongamos que tenemos la siguiente instrucción ADD A,B en donde ADD es el
código de operación; A es la referencia al primer operando, y referencia a un registro; y B es la
dirección a la que hay que ir a buscar el segundo operando, que es una dirección de memoria.
Esta instrucción tiene una determinada cantidad de bits, algunos van a estar asociados con el
código de operación, otros bits para la referencia al registro, nos va a decir con cuál de los
registros internos posibles vamos a trabajar, y otros bits estarán asociados a la dirección del
segundo operando. El objetivo de esta instrucción es sumar esos dos operandos y guardar el
resultado. Dado que acá no hay un tercer campo en el cuál se guardará el resultado, vamos a
considerar implícita dicha información, entonces el resultado se guardará en la referencia al
primer operando (es decir, se guardará en A).
Primero vamos a buscar la instrucción en Memoria, para esto incrementamos el PC. La
CPU busca la instrucción en memoria. Para esto copia el valor del PC al MAR y de ahí al
Bus de Direcciones. La UC envía las señales necesarias para una operación de lectura. Se
pueden leer uno o más bytes. A través del Bus de Datos se trae la información que pasa
por el MBR y llega al IR.
Luego de buscar la instrucción, la CPU debe incrementar el PC para apuntar a lo que
sigue, que puede ser un dato, una dirección (en el caso de que la instrucción actual
involucre varias palabras) o la siguiente instrucción. (Puede que primero accedemos a
memoria y luego incrementamos el PC para la próxima instrucción o al revés, primero
incrementamos el PC y luego vamos a buscar la instrucción en la dirección de Memoria
que nos indica el PC).
Decodificamos la instrucción, para saber qué tipo de operación vamos a hacer (suma,
resta, etc). En este momento la CPU no sólo se entera de la operación, sino también
donde se encuentran los datos sobre los cuales operar. La instrucción es
AUTOCONTENIDA, en ella está toda la información que se necesita. (que es lo que hay
que hacer, con que operandos, donde están, donde colocar el resultado y donde está la
próxima instrucción).
Si es necesario buscar una constante en una dirección de memoria (en el caso de que se
requiera voy a buscar una palabra, incremento el PC y luego voy a buscar otra palabra,
es decir, debería apuntar más allá de la constante si esta se guarda en dos direcciones
contiguas de memoria).
Si es necesario, hay que calcular la dirección del operando. En el paso anterior la CPU ya
determinó si tiene que ir a buscar un operando o constante a memoria, y si esta ocupa
una celda o más bytes en memoria. Si hemos leído más palabras en la instrucción la CPU
debe incrementar el PC en el valor adecuado de celdas.
Buscar uno de los operandos desde memoria o registro.
Buscar el otro operando desde registro.
Realizar la suma
Almacenar el resultado en A, que es la información implícita en esta instrucción.
FORMATO DE INSTRUCCIONES Y MODOS DE DIRECCIONAMIENTO
¿Cómo es el formato de una instrucción? ¿Cómo esta guardada una instrucción en memoria?
¿Qué campos la componen? ¿Cómo se distribuyen los bits? Sabemos que todas las instrucciones
son AUTOCONTENIDAS, esto significa que la instrucción da toda la información necesaria para
realizar todas las acciones que se necesiten para llevar a cabo la instrucción, y para el
encadenamiento con la próxima instrucción también.
Los elementos de una instrucción de máquina son:
El código de operación, que es un código binario que el fabricante asigna para cada
operación que se pueda llevar a cabo, y nos especifica la operación a realizar.
La referencia del operando fuente, es una determinada cantidad de bits que nos van a
permitir encontrar donde está el operando fuente. La mayoría de las operaciones
aritméticas o lógicas involucran dos operandos, entonces vamos a tener que poder
especificar en la instrucción donde está el operando 1 y el operando 2 (si existiese).
La referencia del operando resultado, nos indica donde colocar el resultado.
La referencia a la próxima instrucción, para saber dónde está la próxima instrucción. Lo
natural es tener un Contador de Programa [PC] que nos indique la dirección de la
próxima instrucción a ejecutar, puesto es que lo normal es que una instrucción este a
continuación de la otra en posiciones consecutivas de memoria (en modo secuencial).
Pero esto no siempre es así, puesto que por ejemplo en el caso de haber instrucciones
de control condicionales esto no se cumpla.
Los operando fuente y resultado pueden estar en tres lugares: pueden estar en Memoria, en
una Registro de la CPU, o dentro de los circuitos de E/S.
Cada instrucción dentro de la CPU está representada por un cierto número de bits que nos van
a indicar todo lo necesario referente a la instrucción (¿Qué hacer? ¿Con qué? ¿Dónde va el
resultado? ¿Dónde está la próxima instrucción?). Este conjunto de bits que codifican la
instrucción lo podemos considerar dividido en campos, donde cada campo nos da la información
necesaria para cada una de esas cuestiones que tenemos que especificar. El esquema que nos
dice como están distribuidos esos campos es lo que se conoce como FORMATO DE
INSTRUCCIÓN. Vamos a tener formatos de instrucción distintos, con más o menos campos y hay
que analizar cuantos bits se asignarán para cada campo. La totalidad de los bits de cada campo
nos darán el largo de la instrucción.
En programación es muy incómodo estar trabajando en lenguaje de bits, entonces lo que se
hace es usar una representación simbólica, por ejemplo, ADD para la suma, MUL para la
multiplicación, etc. Estos se llaman Nemónicos. Del mismo modo, los operandos también
conviene representarlos con una representación simbólica, por ejemplo, MOV Reg1, Mem1 es
una instrucción que copia lo contenido en la dirección de memoria Mem1 a un registro Reg1.
Obviamente tiene que estar previamente definido que se entiende por Mem1 y Reg1. En este
ejemplo tenemos bits asignados al código de operación, otros al operando fuente y otros para
el operando resultado. ¿Qué se va a codificar en la memoria? La secuencia de n bits que forman
dicha instrucción.
Ejemplo en lenguaje de alto nivel: X := X + Y Esta instrucción suma los valores almacenados
en las posiciones de memoria X e Y, para luego guarda el resultado en X. Esto puede implicar
cargar registros, sumarlos y luego almacenar el resultado en memoria. Hay que tener en cuenta
que una instrucción en alto nivel puede requerir varias instrucciones de máquina.
La diferencia entre el lenguaje de alto nivel y el lenguaje de máquina (bajo nivel) es que el
lenguaje de alto nivel expresa operaciones en forma concisa usando variables, mientras que el
lenguaje de máquina expresa las operaciones de forma básica involucrando movimiento de
datos y uso de registros. Además, cualquier programa escrito en lenguaje de alto nivel se debe
convertir en lenguaje de máquina para ser ejecutado, pues este lenguaje es cómodo para el
programador, pero el procesador no puede ejecutar eso directamente, lo que puede ejecutar el
procesador son las instrucciones de máquina utilizando los registros internos de la CPU. El
conjunto de instrucciones de máquina debe ser capaz de expresar cualquiera de las
instrucciones de un lenguaje de alto nivel.
Podemos categorizar las instrucciones de máquina en:
Procesamiento de datos: instrucciones relacionadas con operaciones aritméticas y
lógicas.
Almacenamiento de datos: instrucciones relacionadas con transferencias dentro del
sistema, entre la memoria y el CPU.
Instrucciones de E/S: en algunos casos, la arquitectura requiere una salida específica
para la transferencia de datos entre la computadora y los mecanismos externos.
Instrucciones de control: manejan el flujo del programa, por ejemplo, instrucciones de
salto o ramificación. También hay instrucciones de control que modifican registros
especiales que afectan el comportamiento de la CPU, y esas instrucciones también
entran dentro de esta categoría.
¿Qué número de direcciones necesito en una instrucción de máquina? En principio las
direcciones que se necesitan son cuatro: dos direcciones para hacer referencia a los operandos
fuente, una que hace referencia al operando resultado y la dirección de la próxima instrucción
(y además necesitamos bits para indicar el Código de Operación, pero esto no es una dirección).
Este sería el caso de una máquina de 4 direcciones, aquí no hay Contador de Programa, la
dirección de la próxima instrucción está contenido en la instrucción actual. Tenemos direcciones
explicitas para operandos fuentes y operando resultado, y para la próxima instrucción. Estas son
muy raras puesto que cada campo de dirección necesita tener bits para acomodar una dirección
completa. Entonces, por ejemplo, si cada dirección ocupa 24 bits, necesito 24 x 4 = 96 bits por
instrucción para indicar las direcciones.
Cód. Operación Dir. Resultado Dir. Op1 Dir. Op2 Dir. PróxInstr
El conjunto de instrucciones es el medio que tiene el programador para poder controlar la CPU.
El fabricante tuvo que tener determinadas consideraciones:
Que tipos de operaciones se pueden manejar, cuáles [si por ejemplo quiero multiplicar
y no tengo una operación para eso, deberé implementar otro modo de hacerlo como
por ejemplo sumas sucesivas] y cuántas [si yo tengo muchas operaciones voy a necesitar
más bits para codificarlas]. Tenemos distintos tipos de operaciones posibles:
o Instrucciones de transferencia de datos: MOV, LOAD, STORE
o Instrucciones aritméticas: ADD, SUB, MUL, INC, DEC
o Instrucciones lógicas: AND, NOT, XOR, OR
o Instrucciones de conversión: por ejemplo, de binario a decimal.
o Instrucciones para manejo de Entrada y Salida de datos: son para transferir
datos entre la E/S y la CPU. Por ejemplo, IN, OUT
o Instrucciones de transferencia de control: por ejemplo, las de bifurcación
(condicionales) o los saltos.
o Instrucciones de control de sistema: estas son las que maneja el SO
Que tipos de datos vamos a trabajar, puesto que las instrucciones tienen que dar
soporte a distintos tipos de datos. Los tipos de datos más importantes son direcciones,
números (entero, punto fijo, etc), caracteres (ASCII, BCD) y datos lógicos.
Cuál va a ser el formato de las instrucciones en esta arquitectura [longitud (cantidad de
bits), número de direcciones, tamaños de cada campo].
Uso de registros, cantidad que se pueden referenciar mediante las instrucciones y uso
específico o general de los mismos.
Modos de direccionamiento, esto es la manera que tenemos de especificar la dirección
de un operando o de una instrucción.
Modos de direccionamiento
Como ya vimos, en una instrucción se necesitan bits para expresar el Código de Operación, que
indica la operación que vamos a hacer y otra cantidad de bits para especificar de donde
provienen los datos que vamos a utilizar en esta instrucción. ¿Cómo se puede reducir el tamaño
de estas especificaciones? Hay dos métodos generales:
1. Si un operando va a usarse varias veces, puede colocarse en un registro dentro de la
CPU, esto tiene como ventaja que el acceso será más rápido, puesto que todo lo que
está colocado en registro del CPU se accede más rápidamente; y además voy a necesitar
menos bits pues por ejemplo si tengo 32 registros dentro del CPU me alcanzan 5 bits
para referenciar al operando contenido en el registro del CPU, pues 25 = 32. De este
modo reduzco el tamaño de las instrucciones.
2. Puedo especificar uno o más operandos en forma implícita, por ejemplo, en el caso de
las máquinas de una dirección con el registro acumulador lo que hago es ahorrarme bits
en la instrucción que me referencien las instrucciones de uno de los operando fuentes
y el operando resultado.
Por lo general los modos de direccionamiento tienen como objetivo: disminuir la cantidad de
bits dentro de la instrucción; lograr que existan direcciones que no precisan conocerse hasta la
ejecución del programa (por ejemplo, no necesito saber la dirección del operando para escribir
un programa, sólo con usar la representación simbólica del operando puedo escribir mi
programa y después la CPU se encargará de decodificar las instrucciones); poder manejar los
datos de manera más eficiente, por ejemplo, en las estructuras de datos de tipo arreglos.
Modo de Direccionamiento Inmediato [MOV AL , 4]: en este modo de direccionamiento
el operando esta codificado en la instrucción, es decir, se obtiene automáticamente de
la memoria al mismo tiempo que la instrucción. En este caso no hay que ir a hacer una
referencia posterior a memoria, cuando nos llevamos la instrucción a la CPU, llevamos
codificado dentro de la instrucción el operando. Este modo de direccionamiento se
utiliza para definir constantes y también para inicializar variables, por ejemplo. La
desventaja es que el tamaño del operando va a estar limitado al tamaño de ese campo
de direccionamiento, entonces, si por ejemplo el campo de direccionamiento para ese
operando es de 16 bits, tengo que tener en cuenta
que el operando no puede ocupar más de 16 bits.
Modo de Direccionamiento Directo [ADD BX , NUM]: en este caso se nos da dentro de
la instrucción en el campo de dirección, directamente la dirección del operando,
entonces usamos esa dirección para ir a
buscar el operando a la Memoria. Por
ejemplo, si el operando dice que es
11FFH entonces el CPU va a ir a buscar el
operando (o la dirección a donde colocar
el resultado) a la dirección de memoria
11FFH. Es un modo simple, pero de nuevo estaremos limitados por la cantidad de bits
del campo de dirección de esta instrucción. Este modo de direccionamiento se usa para
acceder a variables globales cuya dirección se conoce al momento de la compilación. En
estos casos por lo general se va a utilizar una representación simbólica que indique a
que dirección ir a buscar el operando fuente o resultado (es decir, el nombre de la
constante o variable).
Modo de Direccionamiento por Registro [ADD AL , BL]: en el campo de dirección
tenemos una referencia a un registro
interno del CPU. Con esa referencia
vamos a buscar el dato, sólo que esta vez
no tenemos que acceder a Memoria, sino
a los registros de la CPU. Como los
registros del CPU son pocos comparados
con la Memoria, entonces este campo de dirección referenciando a un registro va a
ocupar menos bits. Conceptualmente es igual al Modo de Direccionamiento Directo,
sólo que se especifica un registro interno de la CPU en lugar de una posición de memoria.
La referencia a registro ocupa menos bits que la especificación de la dirección y no
requiere acceso a memoria de datos. La desventaja es que los registros no son muchos,
entonces es un recurso limitado, por lo tanto, hay que analizar bien como usarlos.
Modo de Direccionamiento Indirecto por Memoria: en este caso no vamos
directamente a la dirección de memoria que necesitamos, sino que tenemos que dar un
paso intermedio antes. Es decir, en el
campo de la instrucción, ya no nos dan la
dirección efectiva del operando, sino que
nos dan una dirección que tiene guardada
la dirección efectiva del operando.
Entonces se lee la dirección y se accede a
Memoria, y ahí se hace un segundo acceso a Memoria para acceder al operando. ¿De
qué nos sirve que en la instrucción este la dirección de la dirección del operando? Es
para tratar de solucionar el problema del Modo de Direccionamiento Directo, y así, con
una dirección de menos bits en la instrucción, se apunta a una dirección de más bits. La
ventaja es que tendremos un espacio de direccionamiento mayor, pues el sitio en
memoria al que esta apuntando el campo de mi instrucción puede tener más bits. Pero
la desventaja es que voy a tener más accesos a memoria, entonces, este modo de
direccionamiento será más lento que el modo de direccionamiento Directo. Otra ventaja
es que no necesito conocer la dirección efectiva del operando en el momento en el que
escribo mi programa.
Modo de Direccionamiento Indirecto vía Registro [ADD AL , [BX]]: en este caso, a través
de un registro accedemos a una dirección de memoria. Es decir, el campo de la
instrucción tiene la dirección a un registro de la CPU que guarda una dirección de
memoria, en la cual tenemos guardada el operando que queremos usar, esta es la
dirección efectiva del operando. La ventaja es que son muy pocos bits para especificar
el registro. Tenemos un espacio de
direccionamiento grande y se accede una
sola vez a memoria, para ir a buscar el
operando, ya que el paso indirecto se da
adentro de la CPU entonces es más rápido.
En este caso el registro sería un registro
puntero pues apunta a la dirección efectiva del operando.
Modo de Direccionamiento por Desplazamiento: este modo implica especificar dos
cosas, un registro involucrado y una cantidad que hay que sumársela al contenido del
registro para encontrar la dirección efectiva del operando. Entonces la dirección efectiva
de aquello que queremos referenciar se calcula con el contenido de un registro más una
cantidad binaria que se le suma. El registro puede estar implícito o no, dependiendo de
que instrucción sea y del procesador. Si bien se están dimensionando dos conjuntos de
bits, uno que nos referencia la dirección de
un registro y otro que nos indica una
cantidad que sería el desplazamiento,
estamos especificando sólo una dirección.
Este modo de direccionamiento combina
las capacidades de los modos de
direccionamiento indirecto y directo. Hay distintos Modos de Direccionamiento por
Desplazamiento, los más comunes son:
o MDD por Desplazamiento Relativo: el registro que está involucrado en el
direccionamiento está implícito y es el Contador de Programa. Entonces la
dirección de la instrucción actual se suma al campo de dirección (que sería el
desplazamiento) para producir la dirección efectiva. Este campo de dirección
está dado en Ca2. Entonces nos permite referenciar posiciones relativas a donde
estamos parados en el programa. Esto tiene mucha utilidad, por ejemplo,
cuando estamos manejando instrucciones de salto, por lo general no saltamos
a lugares muy alejados del que nos encontramos, entonces este campo que nos
indica que tanto tenemos que saltar puede ser de pocos bits. Además, al ser el
PC el registro implícito, esto nos permite construir código que se llama
reubicable, es decir el Contador de Programa yo lo corro más arriba o más abajo
en memoria, y toda la secuencia de instrucciones que conforman el programa,
al cambiarse el PC no importa si es más arriba o más hacia abajo, se va a
mantener y va a seguir referenciando la misma dirección.
o MDD por Desplazamiento de Registro Base: el registro referenciado contiene
una dirección de memoria y el campo de dirección tiene un desplazamiento.
Esto es muy útil para trabajar por ejemplo con la estructura arreglo.
Supongamos que yo quiero trabajar siempre con un dato que está en la posición
4 de un arreglo, y yo quiero trabajar con distintos arreglos, pero siempre con el
dato de la posición 4, entonces puedo ir cambiando la dirección del registro,
pero el desplazamiento siempre será el mismo.
o MDD por Desplazamiento Indexado: acá también se direcciona la memoria con
un registro más un desplazamiento. En esencia es igual desplazamiento por
Registro Base, lo que cambia es que se interpreta por desplazamiento y por
dirección base. Acá el desplazamiento estaría dado por el contenido del registro,
y la dirección base está dada por el campo A. Entonces la dirección base (desde
donde comienzo) va a estar fija, y el desplazamiento que se lleve a cabo va a
depender del contenido del registro. Este registro lo puedo ir variando por
ejemplo en un lazo (iteración) y entonces así voy accediendo a distintos lugares
de memoria en base a los distintos desplazamientos que se van dando. En el
caso de un arreglo, en el campo de la instrucción especificamos la dirección del
comienzo del arreglo y en el registro (que vamos a llamar registro índice) vamos
a tener la información que nos indique como nos vamos a desplazar dentro de
ese arreglo. Por esto mismo es que podemos decir que la Indexación
proporciona un mecanismo eficiente para realizar operaciones iterativas.
Algunas máquinas pueden realizar una auto-indexación, es decir, puede
incrementar o decrementar este registro como parte de la instrucción.
Modo de Direccionamiento del Stack: el Stack es un área de memoria que está
administrada como una estructura de tipo Pila, en donde el último en entrar es el
primero en salir, es decir, la información dentro de la estructura se va apilando.
Entonces vamos a tener un registro puntero de Pila que apunta a una dirección. Cada
vez que meto algo en la pila, al puntero se le cambia el valor para que apunte a la
dirección en donde está guardada la última información ingresada. Este registro llamado
Puntero de Pila [Stack Pointer] está implícito y se incrementa/decrementa
automáticamente. Este puntero siempre va a apuntar al tope de la pila.
REGISTROS
Dentro de la CPU tenemos disponibles registros que son visibles para el usuario, es decir, para
el programador, y otros que son registros de control y estado, que son utilizados por la UC para
controlar las operaciones de la CPU y no son visibles por el programador.
¿A qué le llamamos registros visibles? Estos son los que pueden ser afectados por el
programador directamente a través de las instrucciones. Si yo tengo una instrucción de suma
sobre un registro AX con un operando inmediato, se puede decir que el registro AX es visible
para mí porque yo puedo afectarlo mediante una instrucción. Ahora un registro temporario que
este en la entrada de la ALU que es necesario para alojar temporalmente un dato hasta que se
haga la operación, este registro yo puedo suponer que existe (ya que lo vi en la clase de
Organización de computadoras) pero no tengo modo de que pueda manejarlo. Por ejemplo, el
Registro de Instrucciones [IR] es un registro de control y estado porque no puedo controlar lo
que está dentro de ese registro, aunque sepa para que sirve y sepa que existe.
Registros visibles para el usuario: tenemos varios tipos
Registros de propósito general: tienen múltiples funciones, en principio pueden ser
usados para cualquier operando y ese operando puede utilizarse para cualquier código
de operación. A veces pueden existir restricciones (por ejemplo, registros sólo usados
para operandos en Punto Flotante). También se pueden utilizar para direccionamiento
(por ejemplo, Direccionamiento Indirecto vía Registro).
Registros exclusivos para trabajar con datos.
Registros para alojar direcciones: estos pueden ser asignados para un Modo de
Direccionamiento con Desplazamiento, por ejemplo, el registro índice para el MDD
auto-indexado.
Registros de estado en donde están almacenados los códigos de condición.
¿Conviene tener todos los registros para propósito general o conviene especializar su uso? La
primera respuesta que tenemos es que, si todos los registros son de propósito general, esto va
a afectar el tamaño de las instrucciones. Ahora si tengo registros especializados, puede ahorrar
bits para los casos especializados en el que necesite menos bits, pero se limita la flexibilidad del
programador.
La cantidad de registros que tenga en la CPU es importante pues:
Afecta el tamaño de la instrucción (pues necesito más bits para el campo de dirección
para el registro).
Si tengo una mayor cantidad de registros, voy a precisar un mayor número de bits para
poder codificarlos.
Si tenemos pocos registros, significa que no voy a poder tener muchos datos dentro de
la CPU; entonces voy a tener que ir permanentemente a Memoria a buscar mis datos.
El número óptimo de registros suele ser entre 8 y 32 registros (direcciones de 3 y 5 bits).
En cuanto a la longitud de los registros:
Los registros de direcciones deben ser capaces de almacenar la dirección más grande
que podamos trabajar. Si, por ejemplo, las direcciones con las que va a trabajar nuestro
procesador son de 32 bits, nuestros registros tienen que tener espacio suficiente para
guardar estas direcciones de 32 bits.
Si los registros guardan datos, la idea es que puedan guardar la mayoría de tipos de
datos que trabaje ese procesador. En algunas máquinas se permite que un par de
registros puedan estar almacenando partes de un mismo dato, es decir que estos
registros estén de manera contigua y actúen como un solo registro, para poder trabajar
un dato de doble longitud.
El CPU también cuenta con bits de condición [Flags]:
Estos son establecidos por la CPU como resultado de operaciones.
Pueden ser utilizados por las instrucciones de bifurcación condicional, por ejemplo,
saltar si hubo Overflow.
Generalmente no son alterados por el programador, sólo son utilizados para sus
instrucciones condicionales. Igualmente hay instrucciones para alterar estos bits pero
no es una práctica tan común.
Respecto a los registros de control y estado:
Hay algunos de estos registros que son básicos para el funcionamiento de la CPU, como
el Registro Contador de Programa [PC], el Registro de Instrucción [IR], el Registro Buffer
de Memoria [MBR] que vincula la CPU con el Bus de Datos o el Registro de Dirección de
Memoria [MAR] que vincula la CPU con el Bus de Direcciones. Estos 4 registros son
esenciales puesto que se emplean para el movimiento de datos entre la CPU y la
Memoria.
Instrucciones del Intel 8086 más a detalle: mayormente las instrucciones aritméticas y lógicas
precisan dos operando (no todas). Estos son los
Cód. Instr. Op. destino Op. fuente
operandos destino y fuente. Entonces
estaríamos trabajando con instrucciones de dos direcciones, en donde para cada uno de los
operandos está especificado por los Modos de Direccionamiento vistos. Llamando:
[mem] especificación a una dirección de memoria.
[reg] registro de la CPU
[inm] dato inmediato
Las instrucciones de memoria pueden tener las siguientes formas:
1. Codigo de instrucción mem,reg [MOV DATO,AX]
2. Codigo de instrucción reg,mem [MOV AX,DATO]
3. Codigo de instrucción reg,reg [MOV CX,AX]
4. Codigo de instrucción reg,inm [ADD AX,4]
5. Codigo de instrucción mem,inm [SUB DATO,2]
Hablamos de operando destino y operando fuente, con el operando destino siempre a la
izquierda, porque si hay un movimiento de datos, siempre será de derecha a izquierda. Además
si por ejemplo tenemos una suma, el resultado entre los dos operandos también se guarda en
el operando destino.
En los casos de modos de direccionamiento por registro, cuando el procesador trabaja con esta
instrucción, no hay que ir a buscar operandos a memoria pues ambos operandos están dentro
de la CPU, lo mismo para guardar el resultado, se guarda en un registro de la CPU. Por eso, esta
instrucción es de ejecución rápida. Ejemplo [MOV CX,AX]
En los modos de direccionamiento inmediato via registro, Ejemplo [ADD CX,4] en este caso,
al operando fuente se le suma el contenido del operando destino que es un dato inmediato. El
direccionamiento inmediato sucede sólo en el operando fuente, puesto que el operando destino
usa el direccionamiento via registro.
En los modos de direccionamiento directo, el operando fuente es una dirección de memoria en
la cual se encuentra el dato con el que quiero realizar la operación. Ejemplo [ADD CX,[2003h]],
entonces yo quiero sumarle al contenido de CX, el contenido que esta en la dirección de
memoria 2003h. Como en este caso el registro CX es de 16 bits, y la dirección de memoria 2003h
guarda un dato de 8 bits, se toma el dato guardado en la memoria 2003h más el dato guardado
en la memoria que le continúa que es 2004h. Ahora si tengo Ejemplo [ADD CL,DIR], siendo
DIR una variable declarada en una determinada dirección, (2003h DIR=4) en este caso, al ser un
registro de 8 bits y la dirección guardar un dato en memoria de 8 bits también, lo único que
sumo al registro CL es el dato contenido en la dirección de memoria que llamo con la variable
DIR (que sería al 2003h).
En los modos de direccionamiento indirecto vía registro, le sumo (o la operación que indique
la instrucción) al operando destino, el contenido que se encuentra en la dirección de memoria
a la que apunta la variable BX. Ejemplo [ADD AL,[BX]], supongamos que en BX tengo
guardada la dirección de memoria 1002h, entonces al registro AL le voy a sumar el dato que
tengo guardado en la dirección de memoria 1002h. En este caso entonces hago un acceso a
memoria para ir a buscar el operando fuente (accedo a la memoria 1002h). Si el operando
destino, en lugar de ser de 8 bits fuera de 16 bits, entonces accedo a memoria 2 veces (a la
dirección 1002h y a la dirección 1003h).
Luego esta el modo de direccionamiento base + índice, en donde tenemos dos registros índice
que podemos usar: el SI y el DI, y como registro base podemos usar BX o BP, pudiendo hacer
cualquiera de las cuatro combinaciones [BX+SI ; BX+DI ; BP+SI ; BP+DI]. Ejemplo [MOV
CX,[BX+SI]], muevo al registro CX, el dato que esta en la dirección de memoria dada por la suma
entre la base y el indice (BX+SI); y si Ejemplo [MOV [BX+SI],CX] entonces muevo a la direccion
de memoria (BX+SI) el dato que se encuentra en CX.
En el modo de direccionamiento relativo por registro, en la instrucción codificamos con que
registro base queremos trabajar, y con que desplazamiento, Ejemplo [MOV AL,[BX+2]],
queremos buscar el operando que esta apuntado por BX+2 y mover el dato contenido en esa
dirección de memoria al registro AL Ejemplo [MOV [BX+2aH],AX], y en este caso, muevo el
contenido del registro AX a la dirección de memoria dada por BX+2aH (y a la direccion siguiente
puesto que la dirección guarda sólo 8 bits y el registro AX guarda un dato de 16 bits).
Por último esta el modo de direccionamiento relativo base+índice, en donde combino un
registro base, un índice y además un desplazamiento. Ejemplo [MOV [BX+DI+2aH],AX],
enviamos a memoria el contenido de AX, y la dirección efectiva en memoria me la van a dar la
suma del registro base BX más el registro indice DI más el desplazamiento 2aH, que va a estar
también codificado en la instrucción (y el dato lo guardaré en esta posición y en la siguiente por
ser AX un registro de 16 bits).
en conclusión, ¿Conviene que las instrucciones sean cortas o largas? Si los registros son de uso
especial me permite acortar un poco los campos de especificación, y si todos los registros son
de propósito general necesito más bits, entonces tener más flexibilidad a la hora de programar
quizá me impacte al tener instrucciones más largas, y esto en cuanto a su codificación implica
que la memoria va a estar organizada en palabras que quiza sean de un ancho mucho más corto
que la instrucción, pués voy a necesitar varias palabras para codificar el formato dado de dicha
instrcción. Entonces, cada vez que voy a buscar una instrucción a memoria, quizá requiera si la
palabra es muy larga muchos accesos, y esto implica que la CPU tenga que esperar por estos
datos más tiempo, puesto que la memoria es muy lenta comparada con la velocidad de trabajo
del CPU. Entonces, esta flexibilidad me impacta pués termino trabajando con instrucciones de
muchos más bits, entonces la flexibilidad se contrapone con el tiempo que requiero para ir a
buscar esas instrucciones a memoria (ancho de banda: cantidad de datos que puedo sacar de la
memoria por segundo). Entonces es una negociación, si las instrucciones son más cortas el
proceso de ejecución de una instrucción es más rápido, pero por ahí requiero más instrucciones,
pues las instrucciones que son más complejas y largas, suelen permitir hacer más cosas por
instrucción.
SUBSISTEMA DE MEMORIA
Hay distintos niveles de memoria en un sistema de cómputo que establecen una jerarquía, en
donde los distintos niveles utilizan distintas tecnologías para ser construidos pues tienen
distintos tamaños, velocidad de trabajo, etc. Además, hay distintas características que permiten
definir la memoria.
Desde el comienzo de los microprocesadores se viene cumpliendo una especie de regla, que
dice que la velocidad del procesador se duplica cada 18 meses (sin variar el precio), esto significa
que, para un determinado momento tecnológico y un determinado precio, los procesadores
ejecutan una determinada cantidad de instrucciones por segundo, y lo esperable es que para
dentro de un año y medio, los procesadores ejecuten el doble de instrucciones por un mismo
precio. Y la otra regla es que por el mismo precio que pagamos una memoria de un tamaño
determinado, en cuatro años vamos a tener una memoria de un tamaño cuatro veces mayor,
mientras que la velocidad de memoria aumenta a razón de un 10% anual.
Como ya vimos anteriormente, cuando la CPU tiene que hacer un acceso a memoria, este es un
proceso más lento de lo que es trabajar dentro del CPU. A medida que aumenta la brecha entre
las velocidades del procesador y de la memoria, las distintas arquitecturas buscan tender un
puente sobre esta brecha. Una computadora típica suele tener distintos tipos de memoria,
desde una rápida y cara (en término de costo por bit) como el caso de los registros de la CPU,
hasta una barata y lenta como el caso de los discos. Esto no quiere decir que un disco sea barato,
sino que el costo por bit almacenado dentro de un disco es mucho más barato que el costo por
bit almacenado dentro de un registro.
La idea es que la interacción entre los distintos niveles de memoria sea tal que se logre un
funcionamiento equivalente a tener una computadora con una gran memoria y muy rápida, pero
sin tener que pagar el costo de esto, sino pagar un costo más reducido, distribuyendo distintos
niveles de memoria que funcionen con distintas velocidades y distinto costo por bit, pero
trabajando en forma coordinada.
Jerarquía de memoria: es la forma en la que están organizados estos distintos niveles de
memoria. En el tope de la jerarquía de memoria, están los registros de la CPU (memoria más
rápida) mientras que en la base están las memorias
secundarias como los discos magnéticos o los
dispositivos de almacenamiento removibles como
CD o DVD (memorias más lentas).
Mientras más rápida es la memoria, más caro el
costo por bit, y mientras más barato sea el costo por
bit, más lenta es a su vez la memoria.
Entre la Memoria Principal y la CPU hay otro tipo de memoria para salvar la brecha, esta es la
Memoria Cache, hay distintos tipos y niveles de Cache (nivel 1, nivel 2 e incluso nivel 3).
A medida que ascendemos tenemos mayor rendimiento y más costo por bit. Además, cuando
ascendemos, también aumenta la frecuencia de accesos a este tipo de memoria. Esto quiere
decir que en la cima de la pirámide los registros están siendo continuamente utilizados, la Cache,
es reiteradamente usada, con mucha más frecuencia que la Memoria Principal, pero no tanto
como los registros, y así siguiendo, es decir: los datos que están más cercanos a la CPU, son los
que van a ser accedidos más frecuentemente.
La memoria del computador va a estar distribuida en distintos niveles, y como el objetivo, en
cuanto a performance, costo y tamaño, van a ser diferentes en los distintos niveles, las
tecnologías utilizadas para su construcción e incluso los fundamentos físicos van a ser distintos.
Lo mismo pasa con la ubicación dentro del sistema, por ejemplo, los discos magnéticos no están
accedidos a través de buses sino a través de
dispositivos de E/S. el objetivo entonces será tener
una buena capacidad de almacenamiento con un
tiempo de acceso reducido.
Para que todo esto funcione, los mecanismos de
pasaje de información de los distintos niveles tienen que funcionar correctamente, para que,
desde de un punto de vista macro, todo funcione a una alta velocidad como si tuviera una
memoria muy rápida, pero al costo por bit de una memoria lenta.
Organización del CHIP: cada chip contiene un arreglo de celdas de memoria, y en las memorias
de semiconductor se utilizan dos enfoques organizacionales diferentes, el 2D y el 2½D.
Organización 2D: el arreglo está
organizado en 2W palabras de B
bits cada una. Cada línea
horizontal (una de 2W) se
conecta a cada posición de
memoria, seleccionando un
renglón. Las líneas verticales
conectan cada bit a la salida. El decodificador que está en el chip tiene 2W salidas para
W entradas (bit del bus de direcciones).
La idea general es que cuando se hace referencia a una palabra, ella y alguna de las vecinas se
traen de la memoria grande y lenta a la Memoria Cache, para que sea muy probable que, en el
siguiente acceso, la palabra buscada ya se encuentre en la Cache.
La transferencia entre la CPU y la Cache será por
palabra, ahora el acceso y transferencia entre la Cache
y la Memoria Principal va a ser por bloques, ya que acá
no sólo preciso transferir la palabra que voy a necesitar,
sino también el bloque que lo secunda. Los tamaños de
los bloques que transfiero entre la Memoria Principal y la Cache son variables (8, 16, 64 palabras
[2n]).
Mapeo de la Memoria
El dibujo de abajo trata de representar una
Memoria Principal dividida en bloques, con una
cierta cantidad de palabras cada bloque. La
Memoria Cache, es una memoria más chica,
dividida en la misma cantidad de bloques que la
Memoria principal. La idea es que, cada vez que necesitemos una palabra de la Memoria
Principal, ese bloque lo copiemos en la Cache para tenerlo disponible para futuros accesos. Hay
distintos tipos de mapeo:
Mapeo asociativo: en una Cache funcionando con mapeo asociativo, cualquier bloque
de la Memoria Principal puede llegar a copiarse en cualquiera de los bloques de la
Memoria Cache. Entonces, basta con que tenga un lugar libre en la Cache para copiar el
bloque y lo voy a tener ahí hasta que ya no lo precise o tenga que reemplazarlo por otro.
¿Cómo es el proceso de búsqueda de las direcciones? La CPU en el próximo acceso busca
una palabra y lo que tendría que hacer el hardware asociado con esta Memoria Cache
es verificar si esa palabra la tiene copiada ya en la Cache, y si es así el acceso se hace
rápido (a velocidad de la Cache). Si la palabra no está copiada, ahí tendremos que ir a
buscar un nuevo bloque a Memoria Principal. ¿Cómo hace el hardware para darse
cuenta si tiene o no copiada la palabra? Cuando la CPU emite la dirección (que es una
dirección de Memoria Principal) permitiría con esa dirección ubicar cualquier palabra de
cualquier bloque. Podemos suponer que la dirección está dividida en unos bits que están
referenciando al número de bloque y una dirección dentro del bloque. Para cada bloque
de la Memoria Cache vamos a tener una etiqueta asociada (registro) en el cual está
anotado a qué número de bloque de la Memoria Principal corresponde el bloque de
Cache en cuestión.
Mapeo directo: en este caso, cada bloque de la Memoria Principal, sólo puede estar
mapeado por un solo lugar de la Cache y la forma de asignar es dividir el número de
bloque de la Memoria Principal por la cantidad de bloques de la Cache, y el lugar para
guardar en la Cache me lo dará el resto de hacer esa división en módulo. Luego si por
ejemplo tenemos 8 bloques de Cache y 32 bloques de Memoria Principal, y quiero saber
en qué lugar de la Cache voy a guardar el bloque 10 de Memoria Principal, hago la
cuenta: 10/8 = 1 * 8 + 2 Cómo 2 es el resto,
X/Y=C*Y+R
guardaré el bloque 10 de Memoria Principal en X = N° de bloque de Memoria
Principal (el que quiero guardar).
el bloque 2 de Cache. Entonces el circuito de
Y = cantidad de bloques en Cache.
verificación para saber si tenemos o no copiado R = N° de bloque en cache en
donde guardo X
el bloque en la Cache, es mucho más simple. El
mapeo directo tiene una dificultad, que ocurre cuando las direcciones que está pidiendo
el CPU pertenecen a dos bloques distintos que deberían estar mapeados en el mismo
bloque de Cache. Supongamos que estamos accediendo al bloque 0 y al bloque 8 de la
Memoria Principal (siguiendo el ejemplo), ahí tendríamos un conflicto porque ambos
bloques se deberían estar mapeando en el bloque 0 de la Cache, entonces en sucesivos
accesos tendríamos que estar conmutando de bloques.
Mapeo asociativo por grupo: este tipo de mapeo es una mezcla de los dos mapeos
anteriores. En este caso, lo que tenemos son múltiples alternativas para el acceso
directo, por ejemplo, en el caso de la filmina estamos suponiendo que tenemos dos
espacios en Cache para guardar un bloque de Memoria. En este caso estamos dividiendo
la memoria Principal en módulo de la cantidad de grupos que tenemos en Cache. En el
ejemplo, son 4 grupos de 2 bloques, entonces sí quiero saber en dónde puede ser
guardado mi bloque de Memoria Principal, debo trabajar en módulo 4 y mirar el resto.
Entonces siguiendo el ejemplo de la filmina, el bloque 12 de Memoria Principal irá en
12/4 = 3*4 + 0 grupo 0 bloques 0 y 1 de la Memoria Cache. Entonces, si la CPU
pretende acceder a este bloque, y quiere verificar si esta copiado en Cache, sólo debe
verificar el bloque 0 y 1 de Cache, si no está ahí lo tiene que traer de Memoria Principal.
Estructura de un disco
Puede haber múltiples platos en una unidad de disco rígido en donde tenemos una cabeza por
cada cara, y todas las cabezas se mueven en forma solidaria, es decir, todas están apuntado al
mismo número de Track al mismo momento (pero Tracks de distintas caras). Las pistas alineadas
en cada plato forman cilindros y el hecho de que los datos sean almacenados por estos cilindros
hace que se reduzca el movimiento de las cabezas y aumente la velocidad de respuesta.
El conjunto de las distintas
pistas homólogas de cada
disco conforma lo que se llama
un cilindro. Entonces hablo de
Cilindro 0 cuando todos los
cabezales están posicionados
en las pistas 0, por eso es que
decimos que los datos están
almacenados por cilindros.
Esto es, se guarda información en una pista, y si se me termina esa pista, en lugar de pasar a la
pista que sigue dentro de la misma cara, cambio de cara o de disco, pero continuo en el mismo
número de pista guardando datos (almacenamiento de datos por cilindro). De esa manera no
tengo que estar moviendo las cabezas tan a menudo, ya que agoto toda la capacidad del cilindro
en el cual estoy posicionado antes de pasar al cilindro que sigue.
Velocidad angular constante Grabación en zonas ocupan más espacio que los
cercanos al centro, pero el
material de los sectores de afuera podría estar aprovechándolo para codificar más bits.
Grabación por zonas: en cada zona tengo una velocidad angular constante, pero esa velocidad
no es la misma para todas las zonas. Los sectores ocupan la misma cantidad de espacio en todas
las zonas. Se aprovecha mejor la superficie magnetizable de todo el disco y aumento su
capacidad. Pistas externas con más sectores que las pistas internas.
Formato del disco
Para lograr colocar información en el disco y administrarla es necesario realizar el formato del
disco, esto es: generar los encabezados de los sectores, los campos de corrección de errores, y
así, de esa manera se puede ubicar un sector y se puede guardar o leer información del mismo.
Normalmente, ese formato es un formato por software, porque se está grabando la información,
no hay necesidad de marcas físicas en el disco (aunque también existe el formato por hardware
que implementa justamente esto).
PERIFÉRICOS
RAID: significa “Arreglo Redundante de Discos Independientes”, la finalidad de los RAID es tener
un conjunto de discos físicos que son vistos por parte del SO como si fuera una sola unidad lógica.
La información del disco lógico va a estar distribuida en los distintos discos físicos trabajando en
paralelo, con lo cual vamos a tener mayor capacidad de almacenamiento que si tuviéramos un
solo disco físico, y también mejores prestaciones en cuanto a velocidad de acceso y protección
de datos frente a roturas de discos. Hay distintas formas de organizar un conjunto RAID, estas
formas se llaman niveles, aunque no indican una jerarquía entre ellas.
RAID 0: mínimamente necesitamos dos discos para
un RAID 0, pero pueden ser más. La finalidad es
aumentar la capacidad de almacenamiento. Pero no
es necesariamente sumar la capacidad total de los
discos, sino tener en cuenta el disco con menor
capacidad. Por ejemplo, si tenemos 4 discos de 40Gb
la capacidad será de 4x40Gb=160Gb; ahora si
tenemos 4 discos, 1 de 40Gb y los otros 3 de 60Gb, la capacidad también será de 160Gb,
pues de los discos de 60Gb yo en realidad sólo podría aprovechar 40 Gb, puesto que la
información se tiene que ir distribuyendo de manera igual en los 4 discos. Bloques
consecutivos van en discos diferentes: la información se distribuye de esta manera
puesto que, si el SO necesita leer varios bloques de manera consecutiva, se pueden
hacer ambas lecturas en simultáneo, y esto se traduce como más velocidad, porque
entonces no se suman los tiempos de acceso si no están corriendo en paralelo. En este
tipo de RAID no estamos protegiendo datos, no tenemos más protección de datos de la
que tenemos con un disco simple. De hecho, si tengo varios discos, mientras más tengo,
la probabilidad de que alguno me falle es más alta. ¿En que caso se aplica este uso de
RAID? En los casos en los cuales no importa el tema de la confiabilidad en cuanto a
roturas, y se requieren grandes prestaciones en cuanto a velocidad de acceso.
RAID 1: con este tipo de RAID no se busca
aumentar la capacidad de almacenamiento, de
hecho no se aumenta, lo que se busca es aumentar
la confiabilidad. En este caso tenemos como
mínimo dos discos que trabajan en espejo, es decir,
uno es una copia del otro. Entonces acá la
confiabilidad aumenta mucho, pues, aunque sigue
siendo igual de probable que alguno de los dos discos se rompa, es muy baja la
probabilidad de que se rompan los dos discos al mismo tiempo. Entonces si se me rompe
un disco el otro aún conserva la información, así que no pierdo datos, sólo debo reponer
el que se rompió y volver a clonar la información que tenía. En cuanto a la capacidad no
aumenta: si tengo 2 discos de 40Gb, la capacidad será de 40Gb, si tengo un disco de
40Gb y otro de 60Gb, la capacidad va a ser de 40Gb pues me guio por el disco más chico.
En cuando a la performance, para la escritura no ganamos nada, pues cada vez que
tenemos que actualizar un bloque hay que hacerlo en los dos discos a la vez, ahora en
la lectura si se pueden hacer lecturas por separado, trabajando en paralelo.
RAID 4: aquí se agrega un disco para
almacenar paridad, entonces mínimamente
necesitamos tres discos: en disco 1 y disco 2
se distribuye la información como si fuera un
RAID 0, en forma alternada, y el disco 3 se
utiliza para almacenar paridad de otros
discos (si tuviéramos 4 disco el disco 4 sería el que tiene la paridad de los primeros tres
discos). La paridad es un NOR exclusivo de los bits y nos permite detectar si hay errores
simples en alguna palabra que se hubiese leído en alguno de los otros discos. Y esto nos
permite reconstruir la información en el caso de errores. En cuanto a las prestaciones,
para la lectura es como un RAID 0, podemos hacer lecturas en varios discos
simultáneamente sin ningún problema, con las escrituras se complica un poco porque
tenemos un solo disco que almacena la paridad, entonces si por ejemplo tenemos que
escribir en el disco 1, hay que modificar no sólo dentro del disco 1 sino también en el
disco en el cual almacenamos la paridad. En cuanto a almacenamiento, tengo que tener
en cuenta que uno de mis discos está destinado a la paridad, entonces si tenemos 3
discos de 80Gb, de almacenamiento voy a tener 2x80Gb=160Gb (pues el tercer disco no
es para almacenamiento de datos, sino destinado a paridad).
RAID 5: es similar al RAID 4 en cuanto a lo que
se busca que es aumentar capacidad, y
seguridad a los datos, pero distribuye la
paridad a lo largo de los distintos discos, es
decir, no hay un disco exclusivo para paridad.
En el arreglo se gasta el equivalente a uno de
los discos para paridad, pero al estar la
paridad distribuida mejora la performance. En ese sentido es mejor que el RAID 4, pero
se vuelve más complicado de resolver cuando uno de los discos se rompe, puesto que
es más complicado reconstruir el disco que se rompió teniendo la paridad distribuida. El
RAID 5 es uno de los esquemas más usados.
RAID 6: en este caso hay dos discos
destinados a paridad distribuida, entonces
aumenta la confiabilidad puesto que en este
tipo de arreglo pueden llegar a romperse dos
discos y aun así es recuperable la información
del arreglo, en cuanto a capacidad, si tuviera
4 discos de 80Gb en realidad tengo destinado
a capacidad 160Gb, ya que los otros dos discos están destinados a paridad.
RAID 0-1: es una mezcla del RAID 0 y el RAID 1,
necesitamos mínimamente 4 discos, en este
esquema tenemos dos esquemas de nivel 0
espejados. En el ejemplo tenemos arriba disco 1 y
disco 2 que están funcionando como un RAID 0,
alternando la información en bloques, y hacia
abajo tenemos espejado el mismo esquema.
Entonces si tuviésemos 4 discos, en tamaño de
almacenamiento tendríamos dos, puesto que la información está duplicada. Este
esquema tiene altas prestaciones (las de las RAID 0 y 1), y mucha confiabilidad porque
tenemos el esquema espejado, pero también tenemos mucho desperdicio porque la
mitad del espacio la estamos gastando para el espejado.
Otros tipos de discos ópticos son el CD-Recordable o Grabable, que se compone de un disco de
material plástico, que como no tiene nada grabado no tenemos la espiral moldeada, es de
policarbonato, pero en la cara de arriba se deposita una capa de un material químico
transparente y por encima de ese material una capa de aluminio reflectiva. La información es
este CD se graba con el mismo láser de lectura, pero funcionando a una potencia mayor que
quema el compuesto químico y el mismo se vuelve opaco, así se genera un patrón que se
interpreta como 0 y 1.
Luego está el CD-RW o Re-Grabable, que es un poco más complejo. Está hecho con un
compuesto de cambio de fase que puede estar en dos estados: cristalino o amorfo. En el estado
cristalino ese compuesto es transparente, y en el estado amorfo es opaco. Entonces en un
estado deja pasar la luz y en el otro no, y para lograr un estado u otro lo que se hace es controlar
el calentamiento del material. Para esto se necesitan dos potencias de láser distintas, más otra
potencia más baja para la lectura del CD.
Con la llegada de DVD, y cuando se empiezan a utilizar estos para distribución de datos, ya
estaba muy establecido como formato de distribución para el entretenimiento, es decir que ya
se producía en grandes cantidades. El DVD fue concebido como una extensión del concepto de
CD, en el sentido de que también es un disco de policarbonato donde también se graba una
espiral por relieve, y también está grabada la información por formato de PITS. Como se trabaja
en una escala de nanómetros, todas las distancias respecto al CD-ROM (que trabajaba en
micrones) se achica. Para poder detectar estas dimensiones más pequeñas es necesario cambiar
la luz del láser. Si bien se sigue utilizando la misma sigla, el DVD pensado para la industria del
entretenimiento se llamaba “Digital Video Disk” y sólo se utilizaba para films, mientras que el
DVD como dispositivo para computadoras es “Digital Versatile Disk”, y puede leer disco de
computadoras o disco de videos.
El corte en un disco DVD es bastante distinto al del CD. Si bien tiene la misma altura que un CD,
en realidad son dos discos pegados al medio, y habían de distintos tipos:
Simple lado – Simple capa: con una sola capa de datos, esto es en relieve moldeado el
disco de abajo, sobre eso se le coloca la placa de aluminio, y sobre eso otra placa de
policarbonato del mismo espesor, pero sin relieve. Se lo lee del lado de abajo sólo que
la capa que se lee está más cerca del láser respecto a lo que eran los CD. Guardan 4,7Gb.
Simple lado – Doble capa: en el DVD se puede
generar una segunda capa en la cual se hace
una capa semi-reflectiva (que no llega a
almacenar lo mismo que la capa reflectiva),
entonces, controlando el enfoque del láser se
puede hacer que este cense la capa intermedia
o la capa final que es la que tiene el aluminio.
Doble lado – Doble capa: en este caso, si bien
el alto es el mismo, se genera una segunda
capa semi-reflectiva, pero además el DVD se puede leer de ambos lados del disco.
Luego del DVD aparece el Blu-Ray, que es un disco también de 12 cm de policarbonato, donde
también se graba en forma de espiral, pero en una escala menor al DVD, y para medir esas
longitudes más chicas, es necesario volver a cambiar la longitud de onda del láser con el cual se
puede leer la secuencia de 1 y 0 grabadas en el disco. En este caso se pasa a un láser de luz azul
(por eso el nombre). En el caso del Blu-Ray, en el caso de un disco simple lado – simple capa,
tiene una capacidad de 25Gb (frente al DVD de las mismas características que tenía una
capacidad de 4,7Gb). Además, en el Blu-Ray está más cerca la capa de relieve respecto del borde
en donde está el láser, puesto que hay que enfocarlo desde menos distancia. Este disco también
se pensó para la industria del entretenimiento, pero en este caso guardaba videos con una
definición ya mayor que con el formato DVD.
CINTAS MAGNÉTICAS: este es otro modo de almacenamiento para memoria externa, también
fuera de línea. En cuanto al principio físico, la forma de grabar en las cintas magnéticas es como
el de los discos magnéticos: se tiene un material base, sobre el cual se deposita un material que
es magnetizable y magnetizando las sucesivas porciones. Entonces de una línea de material se
puede recuperar la información, mirando las variaciones de magnetización.
Básicamente, lo mismo que teníamos en un Track de un disco magnético, en una circunferencia,
acá lo vamos a tener en forma lineal a lo largo de una cinta magnética, tendremos un Track lineal
que va desde una punta hasta la otra.
La cinta magnética es un medio lento, esto se debe a que, para leer algo que tengo en la cinta,
tengo que arrancar desde el principio de la cinta hasta llegar al dato que quiero. Es muy
económica, tiene el menor costo por byte en almacenamiento, pero las unidades de lectura para
las cintas magnéticas son caras. ¿Para qué se las usa? Para BackUp y archivo.
Respecto a cómo se guarda la información en las cintas magnéticas, la información se guarda en
Tracks paralelos en toda la cinta, es decir, la cinta no es un solo Track, sino que son varios Tracks
que van de una punta hasta la otra de la cinta. Esta se encuentra enrollada en un carretel y para
poder reproducirse o leerse, es necesario ir enrollando esa cinta en otro carretel.
Para trabajar con varios Tracks, paralelos a lo largo de la cinta hay varias cabezas de lectura o
escritura que trabajan cada una leyendo o escribiendo sobre un Track, de tal manera que
mientras se recorre la cinta, se pueden estar leyendo o escribiendo varios Tracks a la vez. Para
aprovechar toda la cinta lo que se hace es
trabajar en forma de serpentina: se graba o lee
un Track por cada cabeza y cuando se llega al
otro extremo de la cinta se vuelve leyendo o
escribiendo sobre otros Tracks en sentido
contrario. Para trabajar con esos distintos Tracks, al llegar a cada uno de los extremos, el
conjunto de cabezas va descendiendo para pasar a otro conjunto de Tracks.
A lo largo del tiempo se han desarrollado, por distintos fabricantes, varias tecnologías y familias
de productos diferentes de cada cinta magnética (cada uno con su tipo de cartucho, formato de
grabación, tamaño de cinta, etc). En el ambiente de la tecnología, lo que pasa es que muchas
tecnologías van cayendo en desuso puesto que aparecen nuevas tecnologías que las mejoran en
gran medida.
Una de las tecnologías más difundidas actualmente es la llamada LTO (Linear Tape Open) que
fue definida a partir de un estándar abierto por parte de IBM, HP y Seagate a fines de los 90.
Estas tres compañías propusieron un estándar para construcción de cintas magnéticas que es el
LTO, y es estándar abierto puesto que las especificaciones están completamente disponibles
para que otros fabricantes puedan fabricarlas siempre y cuando cumplan todo el estándar.
En el LTO los Tracks que también se ubican a lo largo de la cinta, están agrupados en 4 bandas,
es decir que hay 4 zonas en esa cinta en donde se desarrollan los Tracks. La información se irá
grabando por banda: primero se graban
todos los Tracks de la banda 0, luego la
banda 1 y así siguiendo. Para pasar de
banda a banda lo que hay que hacer es
mover el conjunto de cabezas de
escritura lateralmente (un movimiento
mayor que el necesario dentro de la
banda para realizar la serpentina de Tracks).
Además de unidades individuales para grabar las cintas, en estos sistemas hay equipos llamados
librerías, que son capaces de tener varias cintas disponibles dentro de la unidad, como una
estantería automática, en donde hay un mecanismo selector que lo que hace es, dependiendo
de la cinta que se necesita leer, la toma y la coloca en la unidad de lectura. Entonces uno puede
tener muchas unidades de cinta en el mismo equipo y una sola unidad de lectura que esta siendo
alimentada del cartucho de cinta que se necesita leer.
En cuanto a los tiempos de acceso: desde que el cartucho se inserta en la unidad de lectura
hasta que la cinta es alimentada dentro de la unidad de lectura y esta lista como para empezar
a funcionar, pasan unos 15 segundos aproximadamente, y para llegar a la mitad de la cinta se
tarda más o menos un minuto, esto es mucho tiempo comparado a los tiempos de acceso a un
disco, pero como las cintas estan pensadas para BackUp y archivo, no nos importa, además es
lento para acceder a un punto pero la velocidad de transferencia es alta, transfiere datos a la
velocidad de un disco rígido (300Mb/seg).
Podemos mandar varios bits por cada baudio. En los ejemplos anteriores tenemos una
frecuencia para el cero y otra para el 1, ¿Qué pasa si tenemos más cantidad de frecuencias
diferentes? Por ejemplo, si tengo 4 frecuencias, cada una de esas frecuencias codifica 2 bits, es
decir, cada una de estas frecuencias me van a representar 00, 01, 10, 11. ¿Cuántas veces por
segundo puedo cambiar de frecuencia o de amplitud? 2400 veces por segundo.
Notemos que los límites del sistema telefónico se dan en dos aspectos: las frecuencias que
pueden pasar, que van de 50 a 3500 Hz, y la cantidad de veces que puedo cambiar la frecuencia
o amplitud por segundo, que es 2400 veces como máximo. Si tuviese 8 niveles, transmito 3 bits
por cada baudio y así siguiendo. Entonces se cumple que tasa bps = tasa baudio x log2(n).
Además de la capacidad de modular y demodular, los MODEMS tienen la capacidad de hacer
otro tipo de funciones, como, por ejemplo, la del discado (comunicarse con otro MODEM
generando señales o recibir la señal de un MODEM que lo está llamando). La computadora tiene
que poder controlar el discado, esto lo hace a través de un comando que le da al MODEM para
que este disque. Una vez que se comunicó con el otro MODEM, se establece entre ambos una
tasa de bit [bit rate] a la cual van a hacer la comunicación. Estos son los “Smart MODEMS” o
también llamados “Hayes Compatible”. El máximo bit rate que han logrado esta línea de
MODEMS por línea telefónica es de 57600 bps (56K).
Luego salieron otros llamados MODEMS de banda ancha, que esos utilizan otra tecnología, y
necesitan otra línea, tienen que ser líneas digitalizables.
Respecto a la comunicación que hay entre la computadora y el MODEM, esta es una
comunicación de 0 y 1, tenemos un cable para transmitir datos y un cable para recibir datos.
Para que esta comunicación se pueda dar, es necesario tener ajustado el reloj puesto que tienen
que saber cuándo empieza y cuando termina cada bit. Entonces además de transmitir los datos
por una línea de datos, debo transmitir una línea de reloj, eso implicaría hacer una comunicación
sincrónica. Pero se utiliza una comunicación asincrónica, entonces ¿Cómo sabe el MODEM
cuando empieza un 0 y cuando empieza un 1 que le está transmitiendo la computadora? Para
eso se utiliza un protocolo de comunicación asincrónica que establece lo siguiente: la línea
siempre está en estado de reposo enviando un 1, cuando está por enviar un byte, pasa por un
tiempo de bit esperado a 0, esto se llama marca de arranque. Luego se mandan los bits de datos
(aproximadamente un byte), luego un bit de paridad y luego el bit de stop, para volver a
comenzar el ciclo con otro bit de arranque. Esto se hace para evitar diferencias muy grandes
entre los tiempos del MODEM y la computadora, hay que ir re-sincronizando cada
aproximadamente un byte de envío de datos.
Monitores alfanuméricos: en este caso, en la memoria sólo vamos a almacenar los códigos de
carácter. Vamos a suponer la pantalla dividida en tantas filas por tantas columnas de caracteres.
Ahora cada carácter va a implicar varios pixeles, pero eso lo va a definir la misma lógica del
circuito de video, pero sólo le tuvimos que indicar que carácter ASCII es el que queremos mostrar.
Entonces los códigos de carácter se convierten en pixeles gracias a una ROM de caracteres. Por
cada carácter que nosotros escribamos se va a generar la información
de los distintos pixeles, esto es, pixeles sucesivos en varias líneas
sucesivas.
A la derecha se ve un ejemplo de una pantalla alfanumérica con un
texto determinado puesto en pantalla. En la memoria se van a
almacenar sólo los códigos de carácter, vemos el detalle de lo que es
la memoria de visualización, esta es una serie de bytes en donde con
cada byte estoy definiendo cual es la serie ASCII que quiero
representar. Voy a tener una secuencia de bytes que van a
representar todos los caracteres de la fila 0, otros para la fila 1 y así
siguiendo hasta la última fila. Si por ejemplo tenemos 80 columnas por 64 filas de caracteres,
para cada fila n van a ser 80 bytes. El circuito de video lo que va a hacer es ir leyendo esta
visualización y generando los pixeles, para eso vamos a usar una ROM de caracteres. Esta es una
memoria de sólo lectura que ya fue grabada por el fabricante, que en distintas posiciones tiene
una palabra binaria almacenada. Lo que vamos a tener en sucesivas posiciones de memoria es
la codificación de los pixeles de cada línea de carácter.
Monitores gráficos (bit mapped): en este caso, cada pixel es representado por bits en memoria.
En el caso de los visualizadores blanco y negro se puede usar un bit por pixel, mientras que en
la gama de grises o en color se necesitarán varios bits por pixel.
IMPRESORAS
Las impresoras son periféricos que escriben la información de salida sobre papel. Su
comportamiento inicialmente era muy similar al de las máquinas de escribir, pero hoy día son
mucho más sofisticadas.
Las impresoras son, junto a las pantallas, los dispositivos más utilizados para poder ver en forma
directamente inteligible para el hombre los resultados de un programa de computadora. Las
impresoras tienen dos partes diferenciadas: la parte mecánica y la parte electrónica. Aquí la
parte mecánica, además de encargarse de seleccionar el carácter a partir del código de E/S
correspondiente, debe dedicarse a la alimentación y arrastre del papel.
Las impresoras tradicionalmente utilizaban papel continuo, en cuyos márgenes existen unos
orificios. En este caso, el arrastre se efectúa por un tractor que dispone de unos dientes
metálicos que encajan en los orificios laterales del papel. En la actualidad existen también
impresoras que no necesitan papel continuo, efectuándose el arrastre por fricción o presión,
como en el caso de las máquinas de escribir o en las fotocopiadoras convencionales.
Impresoras de impacto: son aquellas en las cuales hay un elemento físico que se mueve y golpea
una cinta entintada que se apoya sobre el papel y con eso transfiere la información. Una de estas
impresoras de impacto son las que se llaman de Carácter Formado, que tiene un sello o relieve
con cada carácter entonces al golpear sobre el papel transfiere la imagen de ese carácter. Estas
impresoras ya no se usan, pero hubo un formato de las mismas muy famosos conocido como
formato Margarita, llamada así porque había una especie de rueda con rayos o pétalos que rota,
donde en cada extremo de esos pétalos hay un carácter en relieve. Si queríamos cambiar el tipo
de letra teníamos que cambiar la margarita, por eso se llama de carácter formado. Otro formato
es el formato de cinta, en donde los caracteres en relieve están en una cinta metálica que se usa
junto con una serie de martillos que van golpeando los caracteres y transfiriéndolos al papel.
Otro tipo de impresora de impacto es la Impresora
de Matriz de Puntos, en este caso no tenemos Impresora de Matriz de puntos
Impresoras Láser: está orientada a página completa. Esta impresora recibe la información en
forma gráfica, con una definición a nivel de pixeles de lo que se quiere imprimir. Tienen una alta
definición, (hablamos de puntos por pulgada como la cantidad de puntos que la impresora
puede hacer en una pulgada). La impresora láser hace un uso recurrente de la electricidad
estática. Tenemos un tambor recubierto en un material fotosensible, mientras este tambor va
rotando hay un electrodo que lo carga con carga eléctrica, y así se genera una carga eléctrica
sobre todo ese tambor a medida que va rotando. Este tambor, al ser fotosensible, se vuelve
conductor en las zonas en las cuales recibe luz. El tambor es iluminado con un láser que va
generando puntos en los cuales lo vuelve conductor, y la carga eléctrica de ese lugar se pierde.
Entonces, el tambor, luego de pasar por el láser, tiene zonas cargadas con carga eléctrica, y
zonas que no (que son las que tocó el láser). El tambor sigue girando, ya con puntos cargados y
puntos descargados, y pasa frente a un rodillo que tiene depositado tóner, un material plástico
con un pigmento muy finito que se adhiere a las zonas cargadas. El tambor sigue girando hasta
que llega a frente al papel, y debajo del papel hay un rodillo que está girando con una carga
eléctrica más fuerte que la que tiene el tambor, por lo tanto, atrae las partículas de tóner contra
el papel. De esa manera, los puntos que estaban cargados con tóner en el tambor se transfieren
al papel, y de este modo, la imagen que se desarrolló en el tambor, se transfiere al papel. Todo
sigue girando, y el papel se sigue desplazando con el tóner suelto en el lugar en el que tiene que
ir. Para que el pigmento se adhiera, el papel pasa por unos rodillos llamados fusores que
calientan el papel y el tóner para fundirlo. De esta manera el pigmento queda adherido al papel
y el papel queda impreso.
Respecto al láser, este hace un recorrido de izquierda a derecha, descargando algunas zonas,
para decidir a qué zonas se le va a adherir el tóner y a cuáles no. Para hacer ese barrido bastaría
con tener un emisor láser y un espejo que se mueva de izquierda a derecha para reflejar el haz
del láser. Además de esto, lo que se hace es modular el láser, prendiendo y apagándolo.
¿Cómo se logra tener una sensación de niveles de grises? Variando la cantidad de puntos del
tóner negro en una determinada zona.
Impresoras Ink-Jet (Chorro de tinta): en este caso tenemos un cabezal que es una columna de
puntos (similar a una impresora de matriz de puntos), pero acá no hay impacto, sino que hay
gotas de tinta muy pequeñas, que del cabezal son descargadas en el papel. Entonces, mientras
la cabeza de impresión se mueve sobre el papel lo que se hace es lanzar “chorros” de tinta (estas
pequeñas gotas) desde un montón de boquillas (300 aprox.). La impresora controla gota a gota
si se va o no a lanzar en el papel, cada boquilla recibe la orden de enviar o no la gota, mientras
se va desplazando lateralmente la línea de impresión. En este caso, las impresoras pueden
imprimir en negro o en color. Para generar distintos colores en la impresión (vale también para
las láser, sólo que estas no son tan comunes en color porque son muy caras), se usa una paleta
de colores llamada sustractiva, en donde mientras más colores mezclo, más negra queda la tinta,
y si no pongo ningún color, me queda el papel blanco (al revés que el RGB en los monitores). Los
colores básicos en la impresión son Cian, Magenta y Amarillo (CMYK).
Las impresoras Ink-Jet son más económicas que las láser, pero son más caras a nivel insumos
entonces a la larga, si tenemos que imprimir mucho, nos terminan conviniendo las láser porque
son más baratas por copia. Ahora las Ink-Jet a color son mucho más económicas que las
impresoras láser a color, por eso las impresoras láser a color no se ven mucho en el mercado.
En cuanto a tecnologías Ink-Jet hay dos: una que se llama de Burbuja Térmica, las HP y las Canon
utilizan esta tecnología, y la otra forma es la Piezoeléctrica, que utiliza Epson. En ambos casos
tenemos un cabezal con una columna de boquillas donde cada una de ellas tiene un transductor
que genera la gotita. Además, en ambos sistemas se controla gota a gota si se va a inyectar o no
sobre el papel.
En el primer caso, tenemos en cada boquilla un calefactor microscópico que se calienta y calienta
la tinta, generando una burbuja en la tinta que genera presión y hace que una gota de tinta salga
de la boquilla. Una vez que sucedió eso el calefactor ya se enfrió. Se enfría la tinta de nuevo, y
como se perdió una burbuja de tinta se genera una presión negativa en el receptáculo que lo
que hace es que chupe una gota de tinta del depósito de tinta para reponer la tinta que perdió
y así estar llena nuevamente.
En el segundo caso, formando parte de cada boquilla hay un cristal especial que se llama
piezoeléctrico que cuando recibe una tensión eléctrica se deforma generando una presión en el
receptáculo de tinta de esa boquilla, y gracias a esto se logra que se inyecte una gota de tinta
hacia el papel. Luego se quita la tensión que generaba la deformación del piezoeléctrico y como
falta una gota, se genera una presión negativa que hace subir una reposición de gota del
depósito de tinta.
Ambas tecnologías compiten y son buenas, y hay toda una gama de calidades en torno a ellos.