ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Lo mas buscado de internet


Enviado por   •  8 de Agosto de 2015  •  Informe  •  2.456 Palabras (10 Páginas)  •  384 Visitas

Página 1 de 10

PROBLEMA 1 (2,5 puntos)

Se dispone de una aplicación llamada filtro que lee datos por la entrada estándar y escribe resultados por la salida estándar. Se pide que escribáis un programa, que utilice las llamadas a sistema de Unix y que ejecute el programa filtro con su entrada estándar redireccionada al fichero entrada.dat y su salida estándar redireccionada al fichero salida.dat. El programa lo podéis escribir en lenguaje C o en pseudo código.

PROBLEMA 2 (2,5 puntos)

Una máquina utiliza un sistema de gestión de memoria basado en segmentación pura. Las direcciones lógicas se dividen en campo segmento (6 bits) y campo desplazamiento (26 bits). La memoria física direccionable en esta máquina es de 16 Gbytes (234 bytes). Responded justificadamente las siguientes preguntas:

  1. Indicad las dimensiones (número de entradas y tamaño en bytes de cada entrada) de las tablas de segmentos necesarias para este sistema de gestión de memoria.

  1. ¿Cuál es el número máximo de segmentos que puede tener un proceso? ¿Por qué motivo puede resultar útil disponer de este número de segmentos? 
  1.  Queremos cargar un fichero ejecutable con tres segmentos: un segmento de código de 100 MB, un segmento de datos de 40 MB y un segmento de pila de 30 MB. Indicad cuál será el contenido de la tabla de segmentos del proceso correspondiente.
  1.  Indicad dos ventajas y dos inconvenientes de la segmentación pura respecto la paginación pura.

PROBLEMA 3 (2,5 puntos)

El siguiente código implementa una aplicación con dos threads: uno imprime por pantalla los números pares y otro imprime por pantalla los números impares.

#include

#include

int dato_compartido = 0;

void pares(void)

{  int i;

   for(i=0; i < 100; i++ )

       printf("Thread1 = %d \n", dato_compartido++);

}

void impares(void)

{  int i;

   for(i=0; i < 100; i++ )

       printf("Thread2 = %d \n", dato_compartido++);

}

int main(void)

{

    pthread_t th1, th2;

    pthread_create(&th1, NULL, pares, NULL);

    pthread_create(&th2, NULL, impares, NULL);

    pthread_join(th1, NULL);

    pthread_join(th2, NULL);

            }

Se desea que la ejecución proporcione por pantalla la siguiente salida:

[pic 1]

Se ha realizado una primera ejecución del código y aparece lo siguiente:

[pic 2]

Se pide resolver los siguientes apartados:

  1. Indicar que problemas genera el utilizar una variable compartida para enviar el dato a imprimir desde el thread pares al thread impares.

  1. Implementar una versión del programa anterior que resuelva los problemas anteriores utilizando alguna de las técnicas de gestión de la memoria compartida.

PROBLEMA 4 (2,5 puntos)

En la siguiente tabla se muestra esquemáticamente el contenido de un sistema de ficheros tipo UNIX. Algunos de los  i-nodos se muestran en la primera fila, y algunos de los bloques de datos en la fila de abajo:

       0                     1                  2                  3                  4                   …..

drwxr-xr-x

linkcount=4

bloque1=0

bloque2=

drw-r--r—

linkcount=2

bloque1=1

bloque2=

-rw-r—r--

linkcount=2

bloque1=2

bloque2=

drw-r--r—

linkcount=2

bloque1=3

bloque2=

lrw-r--r—

linkcount=1

bloque1=4

bloque2=

i-nodos

.              0

..             0

hola       1

adios      3

.                1

..               0

hola1.txt   2

hola2.txt   2

.                  3

..                 0

adios1.txt   4

/hola/hola2.txt

Datos

El i-nodo correspondiente al directorio raíz es el 0.

Se pide:

  1. Suponiendo que el disco estaba inicialmente formateado y al final de las operaciones realizadas durante el día aparece con la información mostrada en la figura, indicar cuales han sido las llamadas al sistema que se han realizado. (1 punto)
  2. Suponiendo que el i-nodo 0 está cargado en memoria, así como el bloque 0, y que nos encontramos situados en el directorio raiz, indicar todos los accesos a disco necesarios para cargar en memoria /adios/adios1.txt. (0,5 puntos)
  3. Realizar las siguientes operaciones sobre este sistema de ficheros e indicar qué parámetros se modifican y qué consecuencias hay sobre dicho sistema.
  1. rm /hola/hola2.txt        (0.5 puntos)
  2. cat /adios/adios1.txt        (0.5 puntos)

SOLUCION PROBLEMA 1

int pid;

int status;

int retorn;

if ((pid=fork())==0)

{

close(0);

if (open(“entrada.dat”, O_RDONLY) < 0)

exit(1);

close(1);

if (open(“salida.dat”, O_WRONLY) < 0)

exit(1);

execlp("filtro","filtro",0);

exit(1); /* error de ejecución */

}

/* pare */

retorn=wait(&status)

SOLUCION PROBLEMA 2

  1. La tabla de segmentos tendrá 2^6 entradas = 64 entradas. Cada entrada contendrá la dirección física de inicio del segmento y su tamaño. Para determinar la dirección de inicio será necesario utilizar 34 bits para poder direccionar cualquier dirección física (2^34 bytes). El tamaño del segmento puede llegar hasta 2^26 bits ya que las direcciones lógicas tienen un campo desplazamiento de 26 bits. Además dispondremos de algunos bits de protección (lectura, escritura, ejecución) Por lo tanto, cada entrada de la tabla tendrá un total de 34 + 26 + 3 = 63 bits. Si redondeamos a múltiples de bytes tendremos que cada entrada ocupa 8 bytes. Las dimensiones finales de la tabla de segmentos de cada proceso será de: 64 * 8 = 512 bytes.

  1. El numero máximo son 64 ya que el campo segmento de la dirección lógica tiene 6 bits. Puede resultar útil para agrupar información que comparte unas mismas características de protección y de uso.
  1. Dirección inicio segmento (34 bits) tamaño segmento (26 bits) R E W

dirección inicio segmento código

100 Mbytes

0

1

0

dirección inicio segmento datos

40 Mbytes

1

0

1

dirección inicio segmento pila

30 Mbytes

1

0

1

  1. Ventajas:
  1. las estructuras de la segmentación ocupan menos espacio que las estructuras de paginación
  2. la segmentación permite agrupar la información en segmentos que comparte unas mismas características de protección y de uso.
  3. la segmentación no produce fragmentación interna

Inconvenientes:

  1. la segmentación produce fragmentación externa
  2. la segmentación no es tan eficiente con memoria virtual

SOLUCION PROBLEMA 3

1.-        

Problemas de carrera: Ocurre cuando dos procesos acceden a  unas variables compartidas (simultáneamente o en un orden incorrecto) de forma que el valor de las variables deja de ser coherente con la lógica del programa. En este ejemplo tanto el Thread pares como el Thread impares solo disponen de una variable compartida a la que acceden cada uno en una sola línea (el Thread pares imprime la variable y el Thread impares también).  Si cada una de estas línea fuera atómica  (una vez pasado a código máquina) y solo hay una CPU, entonces no habría peligro de carrera (primero se imprimiría una y se incrementaría la variable dato_compartido y luego se imprimiría la otra), en caso contrario, es decir, en el mostrado en el ejemplo podría ocurrir que se repitiera por pantalla un valor de la variable:

...

Descargar como (para miembros actualizados) txt (13 Kb) pdf (245 Kb) docx (356 Kb)
Leer 9 páginas más »
Disponible sólo en Clubensayos.com