You are on page 1of 3

UNPSJB - 2006

Sistemas Operativos ao 2006. 1) Dado el siguiente Shellscript: #!/bin/bash # shellscriptA if [ $# -lt 2 ]; then echo "uso: $0 file1 file2 [...]" exit 1 fi OF="$0.txt" echo "# $0 - `date`" > $OF for i in $@ do shift for j in $@ do cmp -s $i $j && ( echo "$i - $j" >> $OF ) done done Explique qu hace. Nota: El comando cmp compara por contenido dos archivos. La opcin s indica no imprimir nada en la salida estndar. Si los archivos son coincidentes, la proposicin a la izquierda del doble ampersand se considera VERDADERA. 2) Dado el siguiente programa: /* progA.c */ int main( void ) { pid_t pid; char var[16]; sprintf( var, "%d", getpid() ); if( (pid = fork()) == 0 ) execlp( "./hijo", "./hijo", var, NULL ); sprintf( var, "%d", pid ); execlp( "./hijo", "./hijo", var, NULL ); } /* hijo.c */ int main( int argc, char *argv[] ) { pid_t var; sscanf( argv[1], "%d", &var ); kill( var, SIGKILL ); printf( "Proceso Nro: %d\n", getpid() ); } Explique qu ocurre al ejecutar ./progA. Suponga que los pids se asignan a partir de 4. NOTA: sprintf copia el valor del tercer argumento en el primero, transformando el tipo de numrico a string, y sscanf copia el valor del primer argumento en el tercero transformando el tipo de string a numrico. 3) Dados los siguientes programas: /* progB.c */ int main( void ) { int fd[2]; pipe( &fd[0] ); if( fork() == 0 ) { close( 1 ); dup( fd[1] ); execlp( "./progB1", "./progB1", NULL ); } 1 parcial

Pgina 1 de 3

UNPSJB - 2006
else { close( 0 ); dup( fd[0] ); execlp( "./progB2", "./progB2", NULL ); } } /* progB1.c */ int main( void ) { char var; while( read( 0, &var, 1 ) > 0 ) if( var == '#' ) while( read( 0, &var, 1 ) > 0 && var != '\n' ) ; else do { write( 1, &var, 1 ); } while( var != '\n' && read( 0, &var, 1 ) > 0 ); } /* progB2.c */ int main( void ) { char var1, var2[8]; int var3 = 1; while( read( 0, &var1, 1 ) > 0 ) { sprintf( var2, "%d ", var3 ); ++var3; write( 1, var2, strlen( var2 ) ); do { write( 1, &var1, 1 ); } while( var1 != '\n' && read( 0, &var1, 1 ) > 0 ); } } a) Explique qu ocurre si se ejecuta: cat shellscriptA | ./progB > salida.txt b) Explique qu ocurre si se modifica en progB.c la lnea: execlp( "./progB1", "./progB1", NULL ); por execlp( "./progB2", "./progB2", NULL ); se compila y se vuelve a ejecutar la sentencia indicada en el punto a). 4) Los siguientes programas compilan pero al ejecutar ./progC no funcionan correctamente. /* progC.c */ #define TRUE 1 int i = 0; void manejador( int s ) { printf( "Padre: i = %d\n", i ); exit( 0 ); } int main( void ) { signal( SIGINT, manejador ); if( fork() == 0 ) { if( execlp( "./hijo", "./hijo", NULL ) == -1 ) exit( 1 ); kill( getppid(), SIGINT ); } while( TRUE ) ++i;

Pgina 2 de 3

UNPSJB - 2006
} /* hijo.c */ int main( void ) { int i = 0; while( i < 65535 ) ++i; printf( "Hijo: i = %d\n", i ); } El funcionamiento esperado es el siguiente: Al ejecutar ./progC, este debe crear un hijo y ambos procesos incrementan una variable propia. Cuando el proceso hijo termina imprime un mensaje. Luego el hijo enva una seal SIGINT al padre. Este recibe la seal, imprime el valor de su variable y termina. a) Por qu no funciona correctamente el cdigo presentado? b) Modifique el cdigo donde sea necesario (en uno o en ambos programas) para que funcione correctamente. 5) Escribir un programa que cree un hijo y luego ambos procesos se comporten de la siguiente manera: El padre debe imprimir continuamente su pid en pantalla durante 3 segundos. Cuando se cumplen los tres segundos debe enviar la seal SIGINT al hijo y quedarse a la espera de recibir la misma seal. Mientras espera recibir la seal, no debe imprimir nada en pantalla. Cuando recibe la seal vuelve a imprimir durante 3 segundos y as sucesivamente. El hijo debe comportarse de manera similar aunque comienza esperando la seal SIGINT del padre. 6) Rescriba el programa progA de forma de obtener exactamente el mismo resultado pero sin utilizar la llamada al Sistema exec. El programa debe verse notoriamente reducido ya que el padre y el hijo se fusionan en un mismo programa C. Adems no deberan ser necesarias las funciones sprintf y sscanf, ni la variable var. 7) Describa semejanzas y diferencias entre multiprogramacin y multiprocesamiento 8) Defina la diferencia entre planificacin apropiativa y no apropiativa. Diga por qu es poco probable que la planificacin estricta no apropiativa se utilice en un centro de cmputo. 9) Estructura de sistema operativo Cliente Servidor. a. Describa las funciones del microkernel. b. Qu decisiones de diseo involucra respecto a las operaciones de E/S.

10) Un programa tiene 16 pginas de 4K byte cada una.


a. Cul es el tamao de la memoria lgica del programa. b. Cuantos bits corresponden a la direccin lgica. Indique cuantos corresponden al nro de pgina y cuantos al offset. c. Si la memoria fsica posee 8 marcos, que poltica de administracin de memoria propones. d. En el caso c cuantos bits tendra la direccin fsica.

1 2 3 4 5 6 7 8 9 10

a b a b

a b a b c d

1 1 0.5 0.5 0.5 0.5 1 1 1 1 0.5 0.5 0.25 0.25 0.25 0.25

Pgina 3 de 3

You might also like