Download ARQUITECTURA DE COMPUTADORES
Document related concepts
no text concepts found
Transcript
ARQUITECTURA DE COMPUTADORES. 2º ING. INFORMÁTICA. PROBLEMA DE MEMORIA VIRTUAL. Enunciado. Se supone un sistema basado en microprocesador cuya jerarquía de memoria tiene los siguientes parámetros: Memoria Virtual: 16Mbytes en páginas de 512 bytes. TLB: 64 líneas en total y asociativa 32 vías. Caché: 64 Kbytes para datos. Asociativo 4 vías. Bloques de dos palabras. Memoria física o principal: 4 Mbytes. Palabras de 2 bytes. Disco: memoria secundaria o archivo de intercambio de 64 Mbytes. Especificar la tabla de páginas (TP), la TLB, la caché, la memoria principal y el fichero de intercambio. Especificar los campos de la dirección virtual, la dirección de memoria principal, la dirección en disco, y los campos de la dirección de caché. ¿De dónde se saca la dirección que sirve de entrada a la caché? Suponed un proceso de 4 páginas, y que el sistema operativo asignan los marcos 4A, 4B, 4C y 4D a las páginas virtuales de este proceso cuando se inicia el mismo. ¿Cómo se rellenan los campos de la tabla de páginas? ¿Cambiaría la TLB? ¿Y cuando el sistema operativo empezase a ejecutar ese proceso? ¿Cómo cambiarían la TP y la TLB si queremos acceder a la dirección 00023Chex? ¿Acertaría en la caché si este es el primer acceso que ejecuta este proceso? ¿Dónde tendría que estar este dato en la caché? Suponed que el sistema operativo asignará los marcos de memoria A0, A1, A2 y A3 a este proceso. ¿Qué pasaría si acto seguido se accede a la dirección 00023Ehex? ¿Acertaría en la TLB? ¿Y estaría la página en memoria principal? ¿Estaría el dato en la caché? ¿Qué pasaría si acto seguido se accede a la dirección 000240hex? ¿Acertaría en la TLB? ¿Y estaría la página en memoria principal? ¿Estaría el dato en la caché? 1 Solución: Comenzaremos por dimensionar la tabla de páginas, con todos sus campos. ¿Cuántas entradas tendremos en la tabla de páginas? Tendremos tantas como páginas virtuales. Podemos averiguar el número de páginas virtuales si sabemos cuantas páginas virtuales puede ver cada proceso: Tenemos un sistema de memoria virtual con 16 Mbytes, y páginas de 512 bytes. 24 9 16 Mbytes / 512 bytes = 2 bytes / 2 bytes = 32768 páginas virtuales. Por lo tanto la dirección virtual será: 23 9 8 número de página virtual (15 bits) 0 desplazamiento La tabla de páginas devolverá una dirección en memoria principal o una dirección de disco (marco en disco o en memoria principal). ¿Qué ancho tienen estas dos direcciones? Sabemos que tenemos 4Mbytes de memoria principal y 64Mbytes de disco, ambos divididos en páginas de 512 bytes. 22 9 4 Mbytes / 512 bytes = 2 bytes / 2 bytes = 8192 marcos en memoria principal. 26 9 64 Mbytes / 512 bytes = 2 bytes / 2 bytes = 131072 marcos en disco. Por lo tanto la dirección en memoria principal será: 21 9 8 número de marco en memoria principal (13 bits) 0 desplazamiento y la dirección en disco... 25 9 8 número de marco en disco (17 bits) 0 desplazamiento Y tendremos una tabla de páginas con la siguiente estructura. Se escoge la implementación más usual con bit de validez (V) para indicar si la página está en disco o en memoria principal y el bit de “página sucia” (D). La tabla de páginas la direccionaremos con el campo “número de página virtual” de la dirección virtual. V D Dirección página en memoria (principal ó disco) (17 bits) 0 . . . . . . 32767 . . . . . . 2 Vamos a dimensionar la TLB. Sabemos que tiene 64 líneas y es asociativa por conjuntos de 32 vías. Esto quiere decir que la TLB va a tener dos entradas de 32 líneas cada una. ¿Cuál es la dirección que se le da como entrada a la TLB? La misma que se le da como entrada a la tabla de páginas, es decir el campo “número de página virtual” de la dirección virtual, pero la TLB va a tener un modo distinto de interpretar esta dirección para saber si una entrada en la tabla de páginas está o no en la TLB. Si la TLB tiene 2 entradas/conjuntos (64 líneas y 32 líneas por conjunto), parte de la dirección de la TLB va a destinarse a seleccionar el conjunto (en concreto el bit menos significativo), y el resto se destinará a etiqueta. Por lo tanto, la dirección entrada a la TLB nos queda así: número de página virtual. 14 1 ETIQUETA 0 E Y la TLB... 0 ... 31 Conjunto/Vía cero ETIQ. V Dir. Memoria -0 -... ... ... -0 -- Conjunto/Vía uno ETIQ. V Dir. Memoria -0 -... ... ... -0 -- Ahora dimensionaremos la caché: tiene 64KB para datos, y bloques de 2 palabras, de 2 bytes cada una, y es asociativa de cuatro vías. ¿Cuántas líneas va a tener la caché? ((64Kbytes / 4 vias ) / 4 bytes por bloque) = 4096 líneas = 2 12 líneas. ¿Qué dirección se le suministrará a la caché? la dirección completa de memoria principal. ¿Cómo la interpretará? La estructura de direcciones de la caché sabiendo que es asociativa por conjuntos de 4 vías, bloques de 2 palabras de dos bytes cada una y con una memoria principal de 4 Mbytes será la siguiente: 21 14 13 2 1 ETIQUETA CONJUNTO/ENTRADA W 0 B ¿Cómo estará organizada la caché? Tendremos cuatro vías, y cada una de ellas tendrá 4096 líneas. En cada línea se guarda información de línea válida, etiqueta y bloque de dos palabras de dos bytes cada una (un bloque en cada línea de la vía). 3 ETI V BLOQUE ETI V BLOQUE ETI V BLOQUE ETI V BLOQUE LRU 0 ... ... ... ... ... ... ... ... ... ... ... ... ... 4095 (NOTA: en el anterior esquema el campo LRU presente en cada conjunto de 4 líneas es debido a que para implementar la política pseudo-LRU con cuatro elementos hacen falta tres bits.) Ya tenemos totalmente dimensionado el sistema. Ahora suponemos que se crea un proceso en nuestra máquina, y que el sistema operativo le guarda espacio en disco en los marcos 4Ahex – 4Dhex. Lo primero que haría el sistema operativo sería crear una tabla de páginas para ese proceso, y rellenarla de la siguiente manera: 0 1 2 3 V 0 0 0 0 D Dirección página en memoria (principal ó disco) (17 bits) 0 4Ahex 0 4Bhex 0 4Chex 0 4Dhex . . . . . . . . . 32767 0 (NOTA: en la figura anterior los campos con las direcciones de página se supone que ocupan 17 bits pero se omite escribir todos los ceros a la izquierda por motivos de claridad. Así por ejemplo 4A hex = 0 0000 0000 0100 1010 bin ) Esto no supondría cambio alguno en la TLB, puesto que todavía no hemos accedido a las páginas de este proceso y todavía no hemos llevado ninguna de estas a memoria. Hay que recordar que en la TLB tenemos entradas pertenecientes a páginas virtuales que han sido llevadas a memoria principal. Cuando el sistema operativo cambie de proceso y empiece a ejecutarlo, lo que hará será borrar la TLB. Al acceder a la dirección virtual 00023Chex, habría que traducir esta dirección virtual a una dirección en disco o memoria principal. Primero se mira en la TLB, que al haberse borrado no contiene ninguna línea válida. Hay que buscar en la tabla de páginas. ¿En qué entrada? La dirección virtual en binario es: 0000 0000 0000 0010 0011 1100 bin Que se interpreta como: página: 0000 0000 0000 001 bin = página 1 desplazamiento: 0 0011 1100bin = 03Chex 4 El dato que buscamos está en la página virtual nº1. Al mirar en la TP se ve que la página está en el marco 4Bhex de disco. Se trae a memoria principal, al marco A1, y se modifica la entrada de la página 1 en la TP. 0 1 2 3 . . . V 0 1 0 0 . . . D 0 0 0 0 . . . Dirección página en memoria (principal ó disco) (17 bits) 4Ahex A1hex 4Chex 4Dhex . . . 32767 0 Ahora actualizaremos la TLB. ¿Qué se guarda en la TLB? El mismo valor que se ha almacenado en la tabla de páginas, es decir, la dirección del marco de memoria principal que contiene la página virtual nº1 del proceso que se va a ejecutar. 0000 0000 0000 001 Æ dirección de la entrada/conjunto 1 en TP (La etiqueta es 0000 0000 0000 00 y el último bit sirve para indicar el conjunto/entrada 1 en la TLB) Como la TLB es una caché asociativa por conjuntos de 32 vías, el bloque se podrá guardar en cualquiera de las 32 líneas de la TLB del conjunto 1. Por comodidad se guarda el bloque en la primera línea (línea cero) del conjunto 1, puesto que está libre (hay que recordar que se vació la TLB al comenzar la ejecución del proceso). 0 ... 31 Conjunto/Vía cero ETIQ. V Dir. Memoria -0 -... ... ... -0 -- Conjunto/Vía uno ETIQ. V Dir. Memoria 0000 0000 0000 00 1 A1hex ... ... ... -0 -- Una vez actualizada la TP y la TLB, la dirección virtual 00023Chex pasaría a ser la dirección de memoria principal 01423Chex (marco en MP + desplazamiento). Marco en memoria principal: 00A1hex ( 0 0000 1010 0001bin ) Desplazamiento: 03Chex ( 0 0011 1100bin ) Con esta dirección de memoria principal (01423Chex) se accede al caché para ver si está el dato. Este dato no estará, porque es la primera vez que se accede a los datos de esa página, que han sido traídos desde disco, de manera que si el caché tenía un dato de esa dirección de memoria cuando sus datos pertenecían a otra página virtual, estos datos han sido invalidados. ¿Dónde buscará el dato en la caché? Veamos cómo ve la dirección de memoria nuestra caché: ETIQUETA 0000 0101 INDICE 0000 1000 1111 W 0 B 0 5 Buscará el dato en alguna de las vías de la línea 143 (índice = 0000 1000 1111bin = 08Fhex) y buscará la palabra 0 del bloque. Al tener un fallo de caché, se traerá a la caché un bloque entero de memoria, y lo guardará en uno de los cuatro bloques de la línea 143 de la caché. ¿Qué direcciones se traerán a la caché?: 0000 0101 0000 1000 1111 0 0bin = 01423Chex 0000 0101 0000 1000 1111 0 1 bin = 01423Dhex 0000 0101 0000 1000 1111 1 0 bin = 01423Ehex 0000 0101 0000 1000 1111 1 1 bin = 01423Fhex Realmente se traerán dos palabras de dos bytes cada una. Después de traer el bloque de memoria principal, el procesador podrá acceder al dato de la posición 01423Chex. Si la siguiente dirección virtual a la que accede el procesador es la 00023Ehex, volvería a consultar la TLB. Primero vamos a descomponer los campos de esta dirección virtual. La dirección virtual en binario es: 0000 0000 0000 0010 0011 1110 Que se interpreta como: página: 0000 0000 0000 001 bin = página 1 desplazamiento: 0 0011 1110 bin = 03Ehex = desplazamiento 62 Buscará en la TLB el conjunto/entrada 1 de un bloque válido cuya etiqueta sea: 0000 0000 0000 000 Se produce un acierto (hit) en la TLB, pues es la misma página que consultamos anteriormente. De este modo, se encontrará el bloque, y se dará como resultado que el dato está en el marco A1hex de la memoria principal. No habrá que consultar la tabla de páginas. Ahora se consulta en la caché. La dirección en memoria principal será: Número de marco en memoria principal: A1hex Desplazamiento dentro de ese marco: 3Ehex Por lo tanto la dirección en memoria principal queda como: 0000 0101 0000 1000 1111 1 0 bin De nuevo, consultaremos la caché. El caché ve la dirección de la siguiente forma: ETIQUETA 0000 0101 INDICE 0000 1000 1111 W 1 B 0 6 Es decir, busca dentro de la línea 143 (0000 1000 1111bin = 8Fhex) un bloque válido con la etiqueta 0000 0101, y dentro de ese bloque buscará la palabra 1. El dato estará en memoria, pues el bloque asociado a esta dirección de memoria lo cargamos anteriormente en la caché cuando tuvimos el primer fallo de caché ( es la dirección 01423Ehex ). Si después accedemos a la dirección virtual 000240hex estaremos accediendo a la misma página virtual (marco en MP), que estará ya en la memoria principal, y por lo tanto volveremos a tener un acierto en la TLB, que volverá a convertir nuestra dirección virtual en: Número de marco en memoria principal: A1hex Desplazamiento dentro de ese marco: 40hex Esta vez buscaremos en la caché la siguiente dirección: 0000 0101 0000 1001 0000 0 0 ETIQUETA 0000 0101 INDICE 0000 1001 0000 W 0 B 0 Buscará por primera vez un bloque válido en alguna de las cuatro vías de la línea 144 (0000 1001 0000 bin) de la caché que tenga la etiqueta 0000 0101, y buscará dentro de ese bloque la palabra 0. Este dato no está en la caché, y se producirá un fallo en caché (recordemos que todos los datos de la caché que pertenecían al marco A1hex de memoria quedaron invalidados cuando cargamos la página virtual 1 de nuestro proceso) que hará que se traiga a caché otro bloque de la memoria principal (de la misma página virtual o marco que cargamos al principio en MP) con las siguientes direcciones de memoria: 0000 0101 0000 1001 0000 0 0 = 014240hex 0000 0101 0000 1001 0000 0 1 = 014241hex 0000 0101 0000 1001 0000 1 0 = 014242hex 0000 0101 0000 1001 0000 1 1 = 014243hex 7