Está en la página 1de 23

Módulo 1

(Muy poco probable que algo de esto entre)

Computadora electrónica: máquina electrónica, analógica o digital,


que posee una memoria de gran capacidad y métodos de tratamiento
de la información, capaz de resolver problemas matemáticos y lógicos
a través de programas informáticos.

Arquitectura Von Neumann: arquitectura de programa almacenado


que se basa en cuatro componentes principales:
● CPU que cuenta con la ALU (donde se lleva a cabo la
computación).
● Memoria principal que almacena los datos y el programa.
● Uno o más dispositivos de E/S.
● Unidad de control que orquesta la interacción entre todos estos
componentes.

Primera generación de computadoras: todas las que usaban válvulas.


Segunda generación de computadoras: las que usan transistores.
Tercera generación de computadoras: con circuitos integrados.

Ley de Moore: Moore predijo que la cantidad de transistores en los


circuitos integrados iba a duplicarse cada año.

Principio de equivalencia entre HW y SW: todo lo que se puede


implementar en hardware se puede implementar en software y
viceversa.
Módulo 2
(Probablemente tampoco se tome nada de esto)

Aritmética computacional (real aproximada): 𝑔: 𝑀 × 𝑀 → 𝑀

Función para representar números máquina:


𝑔: ρ ◦ ℎ
𝑓: ℜ × ℜ → ℜ (función normal de los reales en los reales).
ℎ: 𝑓|M x M → ℜ (restricción de f sobre los números máquina).
ρ: ℜ → 𝑀

Sistemas con base: los números se representan fijando una base b y


haciendo uso del conjunto de dígitos que va de 0 a b-1.
● El aporte de cada dígito al valor representado depende de su
posición.
● Cada número tiene exactamente una única representación.

Bases:
● Precisión del sistema: cantidad de números representables, se
calcula como N = rn. Siendo ‘r’ la base y ‘n’ la cantidad de
dígitos.
● Ineficacia en el uso del espacio: cantidad de símbolos distintos
que se deben almacenar. Se calcula como D = n * r.

Determinación de la mejor base: primero se debe fijar la precisión (N


constante) para luego minimizar la ineficacia en el uso del espacio.
Cambios de base:
● Parte entera:
- Método de la multiplicación: opera usando la base destino.
Ej: (1010)2 = (0 * 20 + 1* 21 + 0 * 22 + 1 * 23) = (10)10.
- Método de la división: opera usando la base origen.
X0 = N mod (base destino) | Q0 = (N - X0) / (base destino)
X1 = Q0 mod (base destino) | Q1 = (Q0 - X1) / (base destino)
X2 = …
Ej: (10)10 = (?)2
X0 = 10 mod 2 = 0 | Q0 = (10-0) / 2 = 5
X1 = 5 mod 2 = 1 | Q1 = (5-1) / 2 = 2
X2 = 2 mod 2 = 0 | Q2 = (2-0) / 2 = 1
X3 = 1 mod 2 = 1 | Q3 = (1-1) / 2 = 0
Resultado = (1010)2.
● Parte fraccionaria:
- Método de la multiplicación: opera usando la base origen.
Ej: (0.9)10 → (0.?)2
0.9 * 2 = 1.8 → X-1 = 1
0.8 * 2 = 1.6 → X-2 = 1
0.6 * 2 = 1.2 → X-3 = 1
0.2 * 2 = 0.4 → X-4 = 0
0.4 * 2 = 0.8 → X-5 = 0

Resultado: (0.11100…)2.
- Método de la división: opera usando la base destino.
Ej: (0.1110)2 → (0.?)10
1 * 2-1 + 1 * 2-2 + 1 * 2-3 + 0 * 2-4 = (0.875)10

Módulo 3
(Es sobre C)

Módulo 4 y 5
(Importante)

Tipos de operaciones:
● Operaciones aritméticas estándares: suma, resta, multiplicación,
división; en punto fijo y en punto flotante.
● Operaciones aritméticas elementales: exponenciación, raíz
cuadrada, etc. (Implementadas en firmware o software)
● Operaciones pseudo aritméticas:
- Aritmética de direccionamiento: relacionada al cómputo
de la dirección efectiva de los datos.
- Aritmética de edición de datos: operaciones de
transformación de los datos, lógicas, load/store, etc.

● Operatoria en punto fijo: generalmente utilizado en sistemas


comerciales o estadísticos. El punto decimal está previamente
determinado dónde se va a ubicar. Dada una base r y una
precisión p (cantidad de dígitos), se tienen n dígitos para la parte
entera y k para la parte fraccionaria.
- Operación entera: el punto está en el extremo derecho.
- Operación fraccionaria: el punto está en el extremo
izquierdo.
● Operatoria en punto flotante: se usa para aplicaciones que
requieren representar magnitudes muy grandes (muy pequeñas)
o tener mucha precisión.
- Normalizada: dado que punto flotante no posee una
representación unívoca, normalizar el resultado ayuda a
que una operación siempre dé el mismo valor, evitando las
posibles alternativas.
- No normalizada: se ahorra el costo de normalizar, pero
tiene los problemas ya mencionados.

Desventajas de la NO unicidad del 0:


- Hay que pagar tiempo al comprobar si algo es igual a +0 y a -0.
- O hay que pagar hardware para implementar que la comparación
con ambas representaciones del 0 se haga en paralelo.

Representaciones:

● Signo-magnitud (SM): se usa el primer dígito para codificar el


signo (0 si es positivo, b-1 si es negativo) y el resto se usa para
codificar el número.
- Posee la codificación del +0 y -0.
𝑛−1 𝑛−1
- Rango de representación: [− (𝑏 − 1), (𝑏 − 1)]
- La operación de complementación es fácil de implementar
ya que solo cambia el dígito que representa al signo.
- Como no opera con los signos, permite ahorrar un bit en la
ALU.
𝑛 𝑛
● Complemento a la base (RC): usa 𝑋 + 𝑋 = 𝑏 → 𝑋 = 𝑏 − |𝑋|
.
- Utiliza la complementación para simplificar las
operaciones de suma de distinto signo o resta de igual
signo.
- La operación de complementación es igual a hacer (b - 1) -
d en cada dígito y luego sumar 1, siendo d el dígito a
complementar.
- Solo existe el +0.
𝑛−1 𝑛−1
- Rango de representación: [− (𝑏 ), (𝑏 − 1)]
- Si el bit de signo es 0, es un número positivo igual a signo
magnitud.
- Si el bit de signo no es 0, entonces se complementa y se le
suma 1. Ej:
(0 111 0001)2 = (113)10
(1 000 1111)2 =
-[(0 111 0000)2 + 1] =
-[(0 111 0001)2] = (-113)10

● Complemento a la base disminuída (DRC): es igual al RC, pero


no hace el +1 del final.
- Posee +0 y -0.
𝑛−1 𝑛−1
- Rango de representación: [− (𝑏 − 1), (𝑏 − 1)]
Ej:
(0 111 0000)2 = (112)10
(1 000 1111)2 =
-(0 111 0000)2 = (-112)10
Suma:
● SM:
- Si los signos son iguales: se suman las magnitudes y el
signo queda igual. Si hay acarreo al bit de signo, entonces
el resultado es inválido por overflow.
- Si los signos son distintos: se pone arriba la mayor
magnitud y luego se restan. El signo que queda es el de la
magnitud más grande.
- Es muy criticable porque en el caso de los signos distintos,
hay que usar hardware restador dos veces, una para la
comparación y otra para restarle la magnitud menor a la
mayor.
● DRC:
- Si los dos números son positivos: se suman todos los
dígitos, hay overflow si el bit de signo termina valiendo 1.
- Si los signos son distintos: se suman todos los dígitos, si el
carry out es 0, el resultado es definitivo. Si el carry out es
1, entonces se descarta, pero se le suma 1 al resultado
anterior.
- Si ambos son negativos: se suman todos los dígitos y se le
suma 1 al final. Hay overflow si el bit de signo termina
valiendo 0.
- Es criticable que, en caso de haber carry out, se debe
realizar una segunda suma.
● RC:
- Si ambos son positivos: se suman todos los dígitos, hay
overflow si el bit de signo termina valiendo 1.
- Si los signos son distintos: se suman todos los dígitos.
- Si ambos son negativos: se suman todos los dígitos, hay
overflow si el bit de signo termina valiendo 0.
El problema de FXP es que tiene un rango muy limitado, esto puede
solucionarse un poco mediante el uso de factores de escalamiento,
pero esto acarrea nuevos problemas ya que a la hora de operar, los
operandos deben tener el mismo factor lo cual puede derivar en una
gran pérdida de precisión y significancia.

● Punto flotante: los números se codifican como m x be.


- Normalizada: el objetivo es preservar en todo momento la
mayor cantidad de bits de significancia. Insume tiempo y
hardware. No se pueden representar magnitudes cercanas
al 0
- No normalizada: al ahorrarse el proceso de normalizar,
posee un mejor desempeño.
- En cuanto a la elección de la mantisa, base y exponente:
mientras más dígitos se le asignen a la mantisa, se obtiene
mayor precisión y mientras más se le asignen al exponente
se obtiene un mayor rango, con respecto a la base, usar una
base grande aumenta el rango, pero tiene un impacto
negativo en la precisión, además normalizar en base 2 te
permite hacer uso del hidden bit, entre otras ventajas.
- Desventajas: underflow, orden de magnitud cero (todo
número cuya mantisa sea 0), mucho hardware para
contemplar todos los casos especiales.

● Algoritmo de suma/resta:
- Detectar el operando con mayor exponente.
- Ajustar el exponente del número con menor exponente.
- Sumar o restar según corresponda.
- Normalizar en caso de ser necesario.

● Algoritmo de multiplicación
- Sumar los exponentes.
- Multiplicar las mantisas.
- Normalizar en caso de ser necesario.
Módulo 6
(Importante todas las definiciones de redondeos)

Esquema de redondeo: decide cuál es el número máquina que


corresponde asociar a cada número real.

Redondeos:
● Truncado: los bits que no “entran” en la representación del
número, simplemente se descartan sin hacer nada con ellos. El
máximo error es 1 LSB
● Redondeo: se fija en el bit más significativo de los que no entran
en la representación, en caso de ser 1 se suma un LSB al
resultado. Es un poco más costoso porque implica una suma,
pero es más preciso. El máximo error es ½ LSB.

Teoría de redondeo:
● Función de redondeo: es un mapeo ρ: ℜ → 𝑀 tal que
∀ 𝑎, 𝑏 ∈ ℜ, 𝑝(𝑎) ≤ 𝑝(𝑏) 𝑠𝑖 𝑎 ≤ 𝑏.
● Redondeo óptimo: una función de redondeo es óptima si no
trabaja en vano, es decir, 𝑠𝑖 ∀ 𝑎 ∈ 𝑀, ρ(𝑎) = 𝑎. Esto asegura
que, ∀ 𝑎 ∈ ℜ, con m1, m2 números máquinas consecutivos tal
que m1 < a < m2, entonces ρ(𝑎) = m1 o ρ(𝑎) = m2.
● Redondeo dirigido hacia arriba: 𝑠𝑖 ∀ 𝑎 ∈ ℜ, ρ(𝑎) ≥ 𝑎.
● Redondeo dirigido hacia abajo: 𝑠𝑖 ∀ 𝑎 ∈ ℜ, ρ(𝑎) ≤ 𝑎.
● Redondeo simétrico: 𝑠𝑖 ∀ 𝑎 ∈ ℜ, − ρ(− 𝑎) = ρ(𝑎).
● Redondeo óptimo hacia abajo (∇: ℜ → 𝑀): se define como
∇(𝑎) = 𝑚𝑎𝑥({𝑚 ∈ 𝑀 | 𝑚 ≤ 𝑎}).
● Redondeo óptimo hacia arriba (∆: ℜ → 𝑀): 𝑠𝑒 𝑑𝑒𝑓𝑖𝑛𝑒 𝑐𝑜𝑚𝑜
∆(𝑎) = 𝑚𝑖𝑛({𝑚 ∈ 𝑀 | 𝑚 ≥ 𝑎}).

Redondeos simétricos:

● Truncado: redondea positivos y negativos siempre hacia el 0.


{∇(𝑎), 𝑎 ≥ 0
T(a) = {
{∆(𝑎), 𝑎 < 0

● Aumentación: redondea siempre alejándose del 0.


{∆(𝑎), 𝑎 ≥ 0
A(a) = {
{∇(𝑎), 𝑎 < 0

● Proximidad biased: redondea siempre hacia el número máquina


más próximo, eligiendo el de mayor magnitud en el caso límite
(equidistar entre dos números máquina consecutivos).
{∇(𝑎), ∇(𝑎) ≤ 𝑎 < 𝑢𝑚𝑏𝑟𝑎𝑙
{∆(𝑎), 𝑢𝑚𝑏𝑟𝑎𝑙 < 𝑎 ≤ ∆(𝑎)
∆(𝑎)+∇(𝑎)
P(a) = { 𝑢𝑚𝑏𝑟𝑎𝑙 = 2
{∇(𝑎), 𝑎 = 𝑢𝑚𝑏𝑟𝑎𝑙, 𝑎 < 0
{∆(𝑎), 𝑎 = 𝑢𝑚𝑏𝑟𝑎𝑙, 𝑎 ≥ 0

● Proximidad unbiased: prefiere los pares.


{∇(𝑎), ∇(𝑎) ≤ 𝑎 < 𝑢𝑚𝑏𝑟𝑎𝑙
{∆(𝑎), 𝑢𝑚𝑏𝑟𝑎𝑙 < 𝑎 ≤ ∆(𝑎)
{∆(𝑎), 𝑎 = 𝑢𝑚𝑏𝑟𝑎𝑙, 𝑎 < 0 𝑦 p0 = 0
P(a) = {
{∇(𝑎), 𝑎 = 𝑢𝑚𝑏𝑟𝑎𝑙, 𝑎 < 0 𝑦 p0 = 1
{∇(𝑎), 𝑎 = 𝑢𝑚𝑏𝑟𝑎𝑙, 𝑎 ≥ 0 𝑦 p0 = 0
{∆(𝑎), 𝑎 = 𝑢𝑚𝑏𝑟𝑎𝑙, 𝑎 ≥ 0 𝑦 p0 = 1
Siendo p0 el LSB de los bits conservados.

Módulo 7
(Importante definiciones de peso, distancia, mínima distancia,
códigos detectores y correctores, capacidad de detección y
corrección. Hamming)

Alternativas para contrarrestar el efecto de los errores:


● Aceptar que se produzcan: A veces, la información transmitida
sigue siendo relevante incluso con errores.
● Impedir que se produzcan: tomar todas las medidas necesarias
para asegurar que nunca se produzca un error.
● Contemplar que se produzcan: incorporar mecanismos que
reduzcan el impacto de los errores.

- Código detector de errores: incorpora información adicional


junto con los datos transmitidos de manera que se pueda
determinar si se produjo o no un error durante la transmisión.
- Código corrector de errores: incorpora más información que
uno detector, ya que, además de identificar si se produjo un
error, también identifica en qué posición para poder corregirlo
sin tener que retransmitirlo.

Tipos de error:
● A nivel de bit: el error afecta a n bits del dato transmitido.
● En ráfaga: el error afecta a m bits consecutivos, estando en error
el primero y el último, los demás pueden o no estarlo también.
● Código: conjunto finito de patrones de bits.
● Peso: sea p un patrón de bits, w(p) es la cantidad de 1’s en p.
● Distancia: sean p y q dos patrones de bits, d(p, q) es la cantidad
de posiciones en las que p y q difieren.
● Mínima distancia: dado un código C, la mínima distancia es la
menor distancia que se verifique entre cualesquiera dos patrones
no idénticos pertenecientes a C.

Para una mínima distancia M, es posible detectar con certeza


hasta 𝑑 = 𝑀 − 1 errores. En caso de que se desee corregir, la
fórmula es: 𝑑 + 𝑐 = 𝑀 − 1, 𝑐 ≤ 𝑑.

Código detector de paridad: es mínima distancia 2, por lo tanto,


detecta todos los errores simples.

● Código de paridad par: se le agrega un bit extra al patrón


original de manera tal que el peso del dato sumado al bit de
paridad sea una cantidad par.

● Código de paridad impar: se le agrega un bit extra al patrón


original de manera tal que el peso del dato sumado al bit de
paridad sea una cantidad impar.
● VRC: añade un bit de paridad por cada paquete de datos.
Permite detectar todos los errores simples en cada paquete.

● LRC: permite detectar errores en ráfaga de hasta tamaño k


(siendo k la longitud de la palabra).

● CRC: detecta errores en ráfaga que no sean divisibles por el


polinomio de error E(x). Siempre detecta los de longitud ≤ al
grado del polinomio generador, pero tiene una alta probabilidad
de detectar también los de longitud > al grado.
Determina los bits de redundancia que se deben agregar y
además permite verificar si el mensaje contiene errores.
Dado un mensaje M(x) y un polinomio generador G(x), se le
añade a M(x) tantos ceros como el grado de G(x) y luego se le
suma el resto de dividir M’(x) por G(x) para así obtener un
polinomio divisible por G(x).

Módulo 8
(Pendiente, pero no tiene nada importante)
Módulo 9
(Importante los modos de direccionamiento hasta el
base-indexado)

Tipos de instrucciones:
● De procesamiento: instrucciones aritméticas y lógicas.
● De acceso a memoria: para transferir información desde y hacia
memoria.
● De transferencia de datos: para enviar y recibir información de
los dispositivos de E/S.
● De control: instrucciones que trabajan sobre el PC.

Composición de una instrucción máquina:


● Campo opcode: de tamaño fijo o variable que codifica de qué
instrucción se trata.
● Campos argumento: cero o más, dependiendo del tipo de
instrucción codificada por el opcode. Describen cómo y dónde
encontrar a los argumentos.
● Modos de direccionamiento: indican cómo interpretar los
campos argumento.

Tamaño fijo vs. tamaño variable.


● Tamaño fijo:
- Ventajas: simplifica la etapa de decodificación.
- Desventajas: el tamaño debe ser lo suficientemente grande
como para codificar todas las instrucciones, lo cual requiere un
amplio ancho de banda a memoria.
● Tamaño variable:
- Ventajas: cada instrucción ocupa el menor tamaño posible.
- Desventajas: se complica y ralentiza la decodificación y la
etapa de fetch.
Expansión del opcode: la cantidad de bits asignadas al opcode varía
en función de la instrucción codificada. Se tiene fija la cantidad de
bits de la instrucción, pero la cantidad de bits del opcode varía.

Modos de direccionamiento:

● Inmediato: el contenido del campo argumento es el operando.


- Campo argumento: | #operando |
- No requiere accesos adicionales a la memoria.
- El rango está acotado a la cantidad de bits disponibles en el
formato de instrucción.
- Se lo utiliza para operar con valores constantes.

● Absoluto directo: el contenido del campo argumento es la


ubicación en memoria del operando (la dirección efectiva).
- Campo argumento: | A002 (dirección de memoria) |
- Tiene un acceso adicional a memoria.
- El espacio de direcciones está acotado por la cantidad de bits
disponibles en el formato de instrucción
- Se lo usa para trabajar con variables.

● Absoluto Indirecto: el contenido del campo argumento es la


dirección en memoria de la dirección efectiva.
- Campo argumento: | A002 (dir. en memoria de la dir. efectiva)
|
- Tiene dos accesos adicionales a memoria, uno para buscar la
dirección efectiva y otro para buscar el operando.
- Es muy flexible y permite recorrer cualquier estructura de
datos, pero está en desuso porque es muy costoso en tiempo de
ejecución.
● Registro directo: el contenido del campo argumento es la
ubicación del operando dentro del banco de registros.
- Campo argumento: | R0 (referencia al registro que tiene el op) |
- No requiere accesos adicionales a memoria.
- Permite simular otros modos de direccionamiento y hacer más
eficientes los programas.
● Registro indirecto: el contenido del campo argumento es la
ubicación dentro del banco de registros de la dirección efectiva
del operando.
- Campo argumento: | R0 (referencia al registro que tiene la dir)
|
- Requiere un acceso adicional a memoria.
- Es muy flexible, permite recorrer estructuras de datos
complejas.
● Indexado: el campo argumento contiene una dirección de base
fija y un desplazamiento variable que sumados dan la ubicación
en memoria del operando.
- Campo argumento: | A000 (dir) | R3 (desp) |
- Requiere un acceso adicional a memoria.
- Sirve para recorrer múltiples elementos de una única estructura
de datos.
● Base: el campo argumento un desplazamiento fijo y una
dirección base variable que sumados dan la ubicación en
memoria del operando.
- Campo argumento: | R3 (registro con dir) | 02 (desp) |
- Requiere un acceso adicional a memoria.
- Sirve para acceder a un único elemento de múltiples
estructuras de datos.
● Base-Indexado: el campo argumento contiene una dirección de
base y un desplazamiento, ambos variables, que sumados dan la
ubicación en memoria del operando.
- Campo argumento: | R3 (r con dir) | R2 (r con desp) |
- Requiere un acceso adicional a memoria.
- Permite recorrer múltiples elementos de múltiples estructuras
de datos.
● PC Relativo: el campo argumento contiene un desplazamiento
fijo el cual debe ser sumado al contenido del registro PC para
obtener la dirección referida.
- Campo argumento | FE (desplazamiento) |
- Requiere un único acceso adicional a memoria.
- Se lo usa para calcular la dirección destino de un salto
condicional.
● Auto-decrement: el campo argumento contiene una referencia a
un registro el cual primero es decrementado y luego es usado
como la dirección en memoria del operando.
- Campo argumento: | R1 (registro con la dir a ser
decrementada) |
- Requiere un acceso adicional a memoria.
- Permite gestionar con facilidad una pila y en especial la
operación push.
● Auto-increment: el campo argumento contiene una referencia a
un registro que es usado como la dirección en memoria del
operando y luego es incrementado.
- Campo argumento: | R1 (registro con la dir) |
- Requiere solo un acceso adicional a memoria.
- Permite gestionar con facilidad una pila y en especial la
operación pop.

Código independiente de la posición: no usa direccionamientos


absolutos, por lo tanto funciona de la misma forma en cualquier
dirección de memoria.
- Estático: el código inicialmente puede ser cargado en cualquier
locación de memoria, pero una vez cargado deja de ser
relocable.
- Dinámico: inicialmente puede ser cargado en cualquier locación
de memoria y además, de ser necesario, puede ser relocado a
cualquier en cualquier momento.

Tipos de arquitecturas:

● 0-direcciones (tipo pila):


- Es origen y destino implícito de las operaciones.
- Las instrucciones push y pop permiten indicar una dirección de
memoria.
Ej: Res = A+B
push(A)
push(B)
add
pop(Res)

● 1-dirección (acumulador):
- Permite especificar hasta una dirección de memoria a donde ir
a buscar o escribir un operando.
- Posee un registro acumulador que opera con destino y origen
implícito.
Ej: Res = A+B
load(A)
add(B)
store(Res)

● 1-dirección + registro:
- Permite especificar hasta una dirección de memoria.
- En las operaciones con dos operandos, el registro especificado
en la instrucción es el destino implícito del resultado.
- Cuenta con la instrucción mov para mover información entre
registros y memoria.
Ej: Res = A+B
mov R0, [A]
add R0, B
mov [Res], R0

● Registro a Registro:
- Solo operan sobre registros.
- Posee las instrucciones lda (para cargar una dirección de
memoria), load y store que acceden a memoria.
Ej: Res = A+B
lda R0, A
lda R1, B
lda R2, Res
load R0, 0(R0)
load R1, 0(R1)
add R0, R0, R1
store 0(R2), R0

Módulo 10
(Mayormente práctica)
Módulo 11
(Importante los tipos de E/S y sus diferencias)

● E/S Programada: se llama así porque el procesador ejecuta un


programa que controla directamente al módulo de E/S.
- Desventaja: el CPU parece quedar atado en todo momento
al dispositivo de E/S y, al éste tener una velocidad inferior
a la del procesador, se desperdicia capacidad de cómputo
mientras se espera, sin hacer nada, a que el dispositivo
termine de resolver la última solicitud. Busy waiting
(monitoreo periódico del CPU sobre los bits de estado del
módulo de E/S)
- Ventaja: requiere poco hardware, posee un gran
desempeño y alta tasa de transferencia.
- Tareas del procesador:
1. Sensa el estado del módulo.
2. Envía los comandos de lectura/escritura.
3. Transfiere desde/hacia el módulo los datos.
- Se usa en un escenario en el que haya solo una tarea para
hacer y que se puede aprovechar el alto rendimiento o el
poco costo de hardware, generalmente dispositivos
embebidos.

● E/S con interrupciones: el CPU envía un comando de E/S y se


va a atender otros asuntos, luego, cuando el comando de E/S
finaliza su ejecución, el módulo de E/S interrumpe al CPU para
avisarle.
- Desventaja: pobre desempeño y elevado costo de hardware
(todo lo necesario para poder interrumpir al procesador). Las
interrupciones son por cada palabra.
- Ventaja: se deshace del busy waiting.

● E/S con DMA: agrega un módulo DMA que gestiona la E/S. El


CPU le informa al módulo DMA lo que tiene que hacer, lo
programa, luego el CPU trabaja en otra cosa, finalmente el
módulo DMA interrumpe al CPU.
- Desventajas: alto costo de hardware, robo de ciclos.
- Ventajas: evita el busy waiting, las interrupciones son por
bloques de palabras.

Direccionamiento de dispositivos:
● E/S mapeada en memoria principal: los dispositivos y la
memoria comparten el mismo espacio de direccionamiento.
- La E/S es indistinguible de un acceso a memoria.
- No hace falta contar con instrucciones especiales para E/S.
- Se pierden locaciones de memoria.
● Aislar el espacio de direccionamiento para E/S: el espacio de
direccionamiento para memoria es independiente al de E/S.
- Se ganan locaciones de memoria.
- Implica contar con más pines en el CPU.
- Hace falta contar con instrucciones específicas para E/S.

Interrupción: mecanismo que permite indicarle al procesador que se


produjo un evento que requiere atención inmediata. Tipos:
● Sincrónicas vs. asincrónicas.
● Solicitadas por el usuario vs. forzadas.
● Enmascarables vs. no enmascarables.
● Entre-instrucciones vs. intra-instrucciones.
● Recuperable vs. insalvable.
Atención de una interrupción:
- Cierto dispositivo señaliza una interrupción.
- El procesador finaliza la ejecución de la instrucción en curso.
- Antes de ejecutar la próxima instrucción revisa si hubo alguna
interrupción, al detectarla le manda una señal de reconocimiento
al dispositivo.
- El procesador guarda los datos de la próxima instrucción a ser
ejecutada.
- Se determina la dirección de comienzo de la rutina que manejará
la interrupción.
- El manejador realiza todas las acciones requeridas para la
atención de la interrupción.
- Continúa la ejecución del programa inicialmente interrumpido.

Para saber quién interrumpió:


- Se puede hacer uso de múltiples señales de interrupción, pero
esto requiere de más pines en el CPU, los cuales son acotados.
- Polling: el CPU empieza a consultar los módulos de E/S hasta
dar con el que interrumpió, produce cierta latencia o demora.
- Daisy chain: los dispositivos comparten una línea en común
para realizar las interrupciones. La línea de reconocimiento se
conecta encadenando los dispositivos. El dispositivo que
interrumpió señala que fue él y luego el CPU utiliza esa señal
para identificarlo. Es complicado de entender y tiene latencia
elevada.
- Bus master: el módulo que desea interrumpir, primero debe
reclamar como suyo el bus, por lo tanto, no hay dudas de quién
interrumpió.

Interrupciones simultáneas:
- Se solucionan mediante prioridades de hw o sw.
- O se impide que se produzcan.

También podría gustarte