Como cada periferico es distinto la forma de unificar la vision de HW es que la CPU solo dialoga con los modulos que estos si que son estandar.
Tiene dos lineas de control MEMRP (Memory Request) o AS (Address Strobe)
Caso 1 dan un codigo y preguntan porque no es eficiente: El problema es que esta rutina de tratamiento de interrupciones incluye un bucle de sincronizacion como si se tratase de una subrutina que realiza las operaciones mediante entrada/salida programada o directa. Si realiza esto ocupa el 100% de la CPU. En general hacer eso en un sistema por interrupciones no tiene sentido alguno.
Caso 2 Detalla SRI: FETCH: Si (Si INT ^ RE.MI = 0) entonces: [SP--] PC; [SP--] RE; RE.MI - 1 (Inhibir interrupciones); RE.S - 1 (Cambiar a modo privilegiado) ; PC - Direccion de la rutina de tratamiento de interrupcion; ir a fetch ; Si no ; ir a fetch.
Caso 3 Buses en DMA: BR (Bus Request): se usa para solicitar los robos de ciclo y acceder directamente a memoria. La CPU le notifica que tiene los buses mediante BA (Bus Acknowledge). MEMREQ (Memory Request): para marcar la temporizacion de los ciclos de acceso a memoria. READ y WRITE: para indicar si el acceso a memoria es para una lectura o una escritura.
Toperación (Tiempo) = Tinicio (Tiempo) + Tacceso(Tiempo) + Ttransferencia (tamaño archiv / Vtransferencia)(Tiempo) + T Ultima Interrupción (SRI + RTI + Tfin)(Tiempo)
Tcpu (tiempo de CPU se ocupa para la lectura ... ) = Tinicio (Tiempo) + Nºinterrupciones (Tamaño del bloque a transferir / tamaño de nuestro registro de datos (buffer the interrupcion) (puede estar en Bytes o bits 1B = 8bits) × T interrupciones(SRI + RTI) + Tfin (el tiempo de inicio o de fin lo pueden dar en Ins y lo tienes que pasar a unidades de tiempo)
1 MIPS(millones de instrucciones por segundo) -> 1x10^6 I en 1 S -> 1/1x10^6 = 1 us(microsegundos) una instrucción
Un error comun: es importante fijarse que en mucho apartado te piden la solucion en Instrucciones , con la formula de arriba tienes el tiempo que ocupa una Instruccion
Interrupciones:
T entre 2 interrupciones (T Int) = registros de datos (en bit o bytes) / Velocidad de transferencia (bytes/s) ( recordar tienen que estar los dos en bytes o en bits 1 byte - 8 bits) (al final el tiempo entre una Int y otra es lo que tarde en llenarse los buses de datos)
T tratamiento de una interrupcion (TInt) = SRI (Tiempo) + RTI (Tiempo)
Nº Interrupciones = (Tamaño de lo que quieres leer)(bytes o bit) / registros de datos (bytes o bit)
T interrupciones = SRI + RTI (en tiempo no en Instrucciones)(Tiempo)
mayor prioridad quien tenga menor T entre 2 interrupciones (Tiempo)
Toperación (Tiempo) = Tinicio (Tiempo) + Tacceso(Tiempo) + Ttransferencia (tamaño archiv / V Transferencia)(Tiempo) + T Ultima Interrupción (SRI + RTI + Tfin)(Tiempo)
Tcpu (tiempo de CPU se ocupa para la lectura ... ) = Tinicio (Tiempo) + Nºinterrupciones (Tamaño del bloque a transferir / tamaño de nuestro registro de datos (buffer the interrupcion) (puede estar en Bytes o bits 1B = 8bits) × T interrupciones(SRI + RTI) + Tfin (el tiempo de inicio o de fin lo pueden dar en Ins y lo tienes que pasar a unidades de tiempo)
DMA:
T ultimo robo de ciclo (Tiempo) = protocolo de concesion y liberacion de los buses + ciclo de acceso a memoria
Ttransferencia (Tiempo) = Tamaño del bloque a transferir / Velocidad de transferencia
T RTI (Tiempo) = SRI + Tfin
Nº Robos de ciclo = Tamaño del bloque / Tamaño registro de datos
Toperacion (Tiempo) = Tinicio + Ttransferencia (tamaño archivo / V Transferencia) + Tultimo robo de ciclo (Bus de datos+registro x TAcc) + T ultima interrupcion (SRI + TFin)
Tcpu (Tiempo) = Tinicio + Nº robos de ciclo (Bloque a transferir / Tamaño de mis buffer de datos "nº registros * Tam registros") × T DMA (Bus de datos+registro x TAcc) + T ultima interrupcion (SRI + TFin)
%CPU = (TCPU / Toperacion) x 100
Totales:
Cuando trate tiempos totales hay que tener en cuenta que el dominante va a ocupar un tiempo en el cual el segundo esta trabajando. Pero cuando hablamos de tiempo de CPU es diferente puesto que son tiempos indiferentes y por cada dsipositivo tendremos que tener en cuenta sus tiempos de cpu.
por ejmplo si tenemos dos componentes un disco y una tarjeta de red y subimos un archvo a drive -> T total = nº operaciones del disco x Toperacion del disco+ t la ultima operacion de la tarjeta de red. Pero si hablamos de tiempo de cpu cambia = nº operaciones del disco x T cpu del disco + Nºopdeed x t cputarjeta de red. y el %cpu libre seria = (Ttotal - Ttotal_cpu / Ttotal) x 100