# SOA: Ejercicios UD1 ## Lista de números mágicos de ficheros https://en.wikipedia.org/wiki/List_of_file_signatures ## Mapa de memoria ![](https://i.imgur.com/oDoSZ8z.png) [Text section](https://en.wikipedia.org/wiki/Code_segment) [Data section](https://en.wikipedia.org/wiki/Data_segment) [BSS section](https://en.wikipedia.org/wiki/.bss) ## Memory management and allocation [Memory allocation schemes](https://www.geeksforgeeks.org/memory-management-in-operating-system/?ref=lbp) ## Ejercicio 3 ### Tabla de un nivel ![](https://i.imgur.com/kYEHCHb.png) ### Tabla de dos niveles ![](https://i.imgur.com/bvDFEJc.png) ## Ejercicio 4 ![](https://i.imgur.com/BuC6pgU.png) ## Ejercicio 5 ![](https://i.imgur.com/4aZHn4F.png) ## Ejercicio EXAMEN Enero 2023 Sea un procesador Intel® IA-64 que proporciona un esquema de gestión de memoria que soporta paginación, con direccionamiento a nivel de byte y las siguientes características: ![](https://hackmd.io/_uploads/r1vOoyolT.png) * Paginación con dos niveles de indirección. * LEVEL-2 (Tabla de punteros de directorio (PDPT) en terminología IA64) * LEVEL-1 (PML4: Page Map Level 4 en terminología IA64) * El rango de direccionamiento de la memoria virtual es de 48 bits y de 52 para la memoria física. * Cada entrada de las diferentes tablas LEVEL-2(PDPTE) y LEVEL-1(PML4E) ocupa 64 bits. Entre otros, cada entrada contiene, además del marco del siguiente nivel, 4 bits de estado, los bits P, R, D, W. Cuando están activos, señalizan que la página está presente ( P ), ha sido referenciada ( R ), ha sido escrita (Dirty) y si está permitida la escritura (Write). Con todo ello, se pide: ( a ) ¿Tamaño de la página? ( b ) ¿Cuántas páginas diferentes se pueden direccionar? ( c ) ¿Cuántos marcos de página se pueden direccionar? ( d ) ¿Tamaño en bytes del directorio de tablas de página? ( e ) Dada la dirección virtual 0x000056789ABC, indique los valores dedicados a selección de página y desplazamiento dentro de la página. :::spoiler ¿Tamaño de la página? Hay 30 bits de offset: 1Gb ¿Cuántas páginas diferentes se pueden direccionar? Hay 9+9 bits dedicados a la selección de página: 2^18^ => 256K páginas ¿Cuántos marcos de página se pueden direccionar? Hay 22 bits dedicados a la selección de marcos: 2^22^ => 4MB marcos ¿Tamaño en bytes del directorio de tablas de página? Hay 2^9^ entradas, cada entrada ocupa 2^3^ octetos. La tabla ocupa 2^12^ bytes. Dada la dirección virtual 0x000056789ABC, indique los valore dedicados a selección de página y desplazamiento dentro de la página. El desplazamiento son los 30 bits más bajos. 5~(0101b)~ 6789ABC Página: 1 Desplazamiento: 16789ABC ::: ## Ejercicio EXAMEN Junio 2025 ![imagen](https://hackmd.io/_uploads/By3c1mt2ll.png) Paginación con tres niveles de indirección: * Tabla de directorios (PDE). * Tabla de punteros de directorio (PDPTE). * PML4E: Page Map Level 4. * El rango de direccionamiento de la memoria física es de 52 bits y la virtual es de 48 bits. * Cada entrada de las diferentes tablas (PDE, PDPTE, PML4E) ocupa 64 bits. Entre otros, cada entrada contiene, además del marco del siguiente nivel, 4 bits de estado, los bits P, R, D, W. Cuando están activos, señalan que la página está presente \(P), ha sido referenciada \(R), ha sido escrita (D) y si está permitida la escritura (W). Con todo ello, se pide: 1. ¿Tamaño de la página? 2. ¿Cuántas entradas tiene la tabla de directorios (PDE)? 3. ¿Qué tamaño en bytes tienen las tablas de directorios (PDE)? 4. Dada la dirección virtual 0x000000245678, indique los valores dedicados a selección de página y desplazamiento dentro de la página. 5. Genere una dirección virtual de acuerdo a los siguientes parámetros: * Página: 1 * Desplazamiento: 0x45678 <!-- ## Ejercicio EXAMEN Junio 2022 Ejercicio 1 (20 puntos / 45 minutos) Un sistema operativo dispone de memoria virtual paginada con las características siguientes: * Un único espacio de memoria virtual de 4GB a compartir por todos los procesos que se creen * Una memoria principal de 2GB * Páginas de 4KB * Tabla de páginas de dos niveles con descriptores de página de 4 Bytes. Cada entrada de la tabla de páginas contiene, además del marco de página, 4 bits de estado, los bits P, R, D, W. Cuando están activos, señalizan que la página está presente (P), ha sido referenciada (R), ha sido escrita (Dirty) y si está permitida la escritura (Write). 1. ¿Que representan los valores A, B, C y D en el siguiente código?, ¿A qué secciones de memoria pertenecen? (3 puntos) ```c= #include <stdio.h> #include <stdlib.h> int y=1; int main(int argc, char *argv[]) { int x = 100 * y; printf("Dirección A : %p\n", (void *) &y); printf("Dirección B : %p\n", (void *) main); printf("Dirección C : %p\n", (void *) &x); printf("Dirección D : %p\n", (void *) malloc(1)); return x; } ``` :::spoiler * A: localización de la variable “y”, sección de datos inicializados(DATA). * B: comienzo de la función main, sección de código (TEXT). * C: localización de la variable “x”, sección de pila (STACK). * D: solicitud de memoria dinámica, sección “heap” (HEAP). ::: --- Suponga ahora que se está ejecutando como único proceso el siguiente código: ```c= #include <stdio.h> #include <stdint.h> #define TAM_VECTOR 4096 #define TAM_FILAS 1024 #define NUM_FILAS 4 float X[TAM_VECTOR]; // array con 4096 elementos float A[NUM_FILAS][TAM_FILAS]; // array bidimensional, 1024 elementos // por fila, 4 filas uint32_t n, x, y; void main() { for(n = 0; n < TAM_VECTOR; n++) { X[n] = (float)n; } for( y = 0; y < NUM_FILAS; y++) { for( x = 0; x < TAM_FILAS; x++) { A[y][x] = X[(y * TAM_FILAS) + x]; } } } ``` Suponga también que el código cabe de forma completa en una única página virtual, por ejemplo, la ```0x0000``` que tiene asignado el marco ```0x3000``` y que los datos se ubican a partir de la página virtual ```0x1000``` en el orden en el que están declarados. Los elementos de los arrays ```X``` y ```A``` se almacenan de forma consecutiva. En el caso de ```A``` se almacenan por filas y en orden creciente del número de fila. Los números enteros (```uint32_t```) y en coma flotante (```float```) ocupan 4 bytes. Con todo ello se pide responder, de forma razonada, a las cuestiones siguientes: 1. Indique las páginas y direcciones virtuales de comienzo de los arrays ```A```, ```X``` y la variable ```y```. Indique también las direcciones virtuales de los siguientes datos: ```A[0,2]```, ```A[2,0]``` y ```X[128]``` (5 puntos) Comienzo ```A```: Comienzo ```X```: Localización ```y```: ```A[0,2]```: ```A[2,0]```: ```X[128]```: :::spoiler * Comienzo ```A```: ```0x00005000``` -> página 5, el vector X ocupa las 4 primeras páginas (1, 2, 3 y 4) * Comienzo ```X```: ```0x00001000``` -> página 1 * Localización variable ```y```: ```0x00009008``` -> página 9, desplazamiento 8, “n” y “x” ocupan los 8 primeros * ```A[0,2]```: ```0x00005008``` -> Estamos en el tercer elemento de la primera fila, cada uno ocupa 4 octetos * ```A[2,0]```: ```0x00007000``` -> Cada fila ocupa una página, estamos en la tercera * ```X[128]```: ```0x00001200``` -> Elemento 128 decimal en la primera página, cada elemento ocupa 4 posiciones ::: --- 2. En el supuesto de que haya marcos libres suficientes para todas las páginas de datos referenciadas y que se asignan en orden creciente según se han declarado comenzando desde el marco ```0x4000```. Indique cuál será la serie de carga de páginas y los marcos asociados en memoria principal debido a la ejecución de dicho programa. Indique la cantidad de memoria no asignada debido a fragmentación interna. (5 puntos) <br> <br> :::spoiler El vector ```X``` ocupa las páginas 1,2,3 y 4, el array bidimensional ```A``` ocupa otras 4 páginas, 5, 6 ,7 y 8. Las variables ```n```, ```x``` e ```y``` estarían en la página 9 <br> * Vector ```X```: Página 1 -> Marco 0x4000, Página 2 -> Marco 0x5000, Página 3 -> Marco 0x6000, Página 4 -> Marco 0x7000 * Array ```A```: Página 5 -> Marco 0x8000, Página 6 -> Marco 0x9000, Página 7 -> Marco 0xA000, Página 8 -> Marco 0xB000 * Variables ```n```, ```x``` e ```y```: Página 9 -> Marco 0xC000 Las variables ```n```, ```x``` e ```y``` ocupan 4 octetos cada una, 12 en total. Una página tiene una capacidad de 4096 octetos por lo que se pierden por fragmentación interna 4096 - 12 = 4084 octetos. ::: --- 3. En este caso, ¿Cuál sería la dirección real de comienzo de ```A[0,2]```, ```A[2,0]```, ```X[128]```. (2 puntos) ```A[0,2]```: ```A[2,0]```: ```X[128]```: :::spoiler * ```A[0,2]```: 0x00008008 -> Estamos en el tercer elemento de la primera fila, cada uno ocupa 4 octetos * ```A[2,0]```: 0x0000A000 -> Cada fila ocupa una página, estamos en la tercera * ```X[128]```: 0x00004200 -> Elemento 128 decimal en la primera página, cada elemento ocupa 4 posiciones ::: <br> <br> 4. Suponga ahora que NO haya marcos libres suficientes para todas las páginas referenciadas y solo se han asignado 4 marcos de página para la ejecución de este programa y se utilizase el algoritmo de sustitución ÓPTIMO. ¿Cuáles serían las primeras 4 páginas asignadas al inicio del programa? ¿Cuál sería la cadena de referencia en los accesos a memoria por parte del programa? ¿Cuál sería la secuencia de reemplazo que se seguiría por parte del SO para asignar los marcos disponibles? (5 puntos) <table> <tr> <th>Cadena de referencia</th> <th>Inicio</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> </tr> <tr> <td>Marco 0</td> <td></td> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> </tr> <tr> <td>Marco 1</td> <td></td> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> </tr> <tr> <td>Marco 2</td> <td></td> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> </tr> <tr> <td>Marco 3</td> <td></td> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> </tr> <tr> <td>Page out</td> <td></td> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> <th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th> </tr> </table> :::spoiler El programa copia el contenido del vector X en A, distribuyéndolo en 4 filas de 1024 elementos. X y A ocupan ambas 4 páginas. Para hacer la copia necesitamos las páginas de código, la página de datos origen, la página de datos destino y la página de las variables de control. Inicialmente serían las páginas: 0, 1, 5 y 9. <table> <tr> <th></th> <th>Página</th> <th>Estado</th> </tr> <tr> <td>Código</td> <td>0</td> <th>Presente</th> </tr> <tr> <td>X</td> <td>1</td> <th>Presente</th> </tr> <tr> <td>X</td> <td>2</td> <th></th> </tr> <tr> <td>X</td> <td>3</td> <th></th> </tr> <tr> <td>X</td> <td>4</td> <th></th> </tr> <tr> <td>A</td> <td>5</td> <th>Presente</th> </tr> <tr> <td>A</td> <td>6</td> <th></th> </tr> <tr> <td>A</td> <td>7</td> <th></th> </tr> <tr> <td>A</td> <td>8</td> <th></th> </tr> <tr> <td>Variables de control</td> <td>9</td> <th>Presente</th> </tr> </table> Al finalizar la copia de la primera página de X, se accederá a la segunda página de X que deberá copiarse en la página 6 de A. La página 2 no está presente. Viendo el código y aplicando un reemplazo optimo sabemos que ya no se accederá a la página 1 de X por lo que podríamos marcarla como no presente y reusar el marco asignado. Otra alternativa sería reemplazar la página 5, ya que tampoco se usará más. Ahora se copiarían datos a la página 6, para ello procedemos al reemplazo con la 5 ( o la 1 si en el caso anterior hubiéramos usado la 5). El estado de la tabla sería: <table> <tr> <th></th> <th>Página</th> <th>Estado</th> </tr> <tr> <td>Código</td> <td>0</td> <th>Presente</th> </tr> <tr> <td>X</td> <td>1</td> <th></th> </tr> <tr> <td>X</td> <td>2</td> <th>Presente</th> </tr> <tr> <td>X</td> <td>3</td> <th></th> </tr> <tr> <td>X</td> <td>4</td> <th></th> </tr> <tr> <td>A</td> <td>5</td> <th></th> </tr> <tr> <td>A</td> <td>6</td> <th>Presente</th> </tr> <tr> <td>A</td> <td>7</td> <th></th> </tr> <tr> <td>A</td> <td>8</td> <th></th> </tr> <tr> <td>Variables de control</td> <td>9</td> <th>Presente</th> </tr> </table> Este proceso se repite para las cuatro páginas que ocupan X y A Una posible secuencia sería: <table> <tr> <th>Cadena de referencia</th> <th>Inicio</th> <th>Página 2</th> <th>Página 6</th> <th>Página 3</th> <th>Página 7</th> <th>Página 4</th> <th>Página 8</th> <th>Final</th> </tr> <tr> <td>Marco 0</td> <td>0</td> <th>0</th> <th>0</th> <td>0</td> <th>0</th> <th>0</th> <th>0</th> <th>0</th> </tr> <tr> <td>Marco 1</td> <td>1</td> <th>2 *</th> <th>2</th> <td>3 *</td> <th>3</th> <th>4 *</th> <th>4</th> <th>4</th> </tr> <tr> <td>Marco 2</td> <td>9</td> <th>9</th> <th>9</th> <td>9</td> <th>9</th> <th>9</th> <th>9</th> <th>9</th> </tr> <tr> <td>Marco 3</td> <td>5</td> <th>5</th> <th>6 *</th> <td>6</td> <th>7 *</th> <th>7</th> <th>8 *</th> <th>8</th> </tr> <tr> <td>Page out</td> <td></td> <th>1</th> <th>5</th> <td>2</td> <th>6</th> <th>3</th> <th>7</th> <th></th> </tr> </table> ::: -->