Está en la página 1de 5

Universidad del Bo-Bo Ingeniera de Ejecucin en Computacin e Informtica

Facultad Ciencias Empresariales Ingeniera Civil Informtica

Sistemas Operativos ICI / IECI


PAUTA Examen Primer Semestre 2010
Profesor: Miguel Pincheira.

Nombre: ____________________________________________ Nota: _____________

I Escoja la alternativa correcta. (5 pts c/u).

1) El concepto de sistema Operativo, 4) Qu estructura de datos esta


apareci como evolucin de: asociada a los procesos en el kernel de
a) Los Sistemas Batch Linux?
b) El Monitor residente. a) proc_struct
c) Unix b) job_struct
d) Linux c) task_struct
d) Ninguno de los anteriores.
2) Qu concepto est asociado a los
sistemas Batch? 5) Cual de las siguientes alternativas
a) Work corresponde al estado de un proceso?
b) Task a) Writing
c) Job Scheduling b) Reading
d) Ningno de los anteriores c) Sleeping.
d) Threading
3) El concepto de proceso, nace junto
con: 6) Cul de las siguientes reas del
a) Los sistemas batch proceso no se comparte con sus threads?
b) La monitor residente a) Variables.
c) El tiempo compartido b) Archivos.
d) Ningno de los anteriores. c) Contador del Programa.
d) Cdigo fuente.
Universidad del Bo-Bo Ingeniera de Ejecucin en Computacin e Informtica
Facultad Ciencias Empresariales Ingeniera Civil Informtica

II Procesos pesados (35 pts)

Escriba el cdigo de la funcin main, que permita generar el siguiente diagrama de


procesos, donde P2 y P3 son hijos de P1, y su nica funcin es imprimir su pid.

P1

P2

P3

Solucin
El siguiente es el cdigo ms bsico, que permite crear el arbol de procesos.

Main () {
int p2,p3;
p2=fork()
If(p2==0) {
/*Codigo del primer hijo P2*/
printf(%i\n,getpid());
}else{
/*el Padre debe esperar que termine p2, para iniciar P3 */
waitpid(p2,null);
p3=fork();
if(p3==0){
printf(%i\n,getpid());
}
}
}

Separar el cdigo del padre y del hijo al crear P2 - 10 pts


Esperar el hijo P2 antes de lanzar P3 15 pts.
Separar el cdigo del padre y del hijo antes de crear P3 10 pts.
Universidad del Bo-Bo Ingeniera de Ejecucin en Computacin e Informtica
Facultad Ciencias Empresariales Ingeniera Civil Informtica

III Procesos Livianos (35 pts).

Un programa dentro de una fbrica, dispone de un arreglo de enteros, donde debe guardar
tres datos acerca de la temperatura de una caldera. En la primera posicin (0, 3, 6, etc) debe
guardar la temperatura mnima de la caldera, que se obtiene con la funcin threadMinimo. En la
segunda posicin (1,4,7,etc) debe guardar el mximo de la temperatura de la caldera, que se
obtiene con la funcin threadMaximo. Finalmente, en la tercera posicin, (2,5,8,etc) debe guardar
el promedio de las dos temperatura anteriores.

void threadEstadistica(void *p) {


Int valor1,valor2,promedio;
For(;;) {
valor1= Buffer[pos-1];
valor2= Buffer[pos-2];
promedio = (valor1+valor2)/2;
Buffer[pos]=promedio;
pos++;
}
}

void threadMinimo(void *p) {


int valor;
For(;;) {
valor = tempMinima();
Buffer[pos] = valor;
pos++;
}
}

void threadMaximo(void *p) {


int valor;
For(;;) {
valor = tempMaxima();
Buffer[pos] = valor;
pos++;
}
}

Tomando como base el cdigo anterior:


Modifique las tres funciones de thread (threadMaximo, threadMinimo, threadEstadistico),
de manera que funcionen concurrentemente, para lograr el objetivo planteado.
No tiene que escribir todo el programa main, solo las lneas que necesite para inicializar
variables, y para crear los threads. (Tenga cuidado en que el programa no finalize antes
que los threads).
pos es un entero y Buffer, es una arreglo de enteros de 21 posiciones. Ambas variables
fueron declaradas de manera global. Tenga cuidado con los lmites del arreglo.
Cuando el arreglo esta lleno, debe volver a empezar en la posicin 0.

Solucin
El problema se podra ver como un productor consumidor, pero agregando 2
productores, que deben trabajar uno despus del otro, sobre un buffer circular.
Universidad del Bo-Bo Ingeniera de Ejecucin en Computacin e Informtica
Facultad Ciencias Empresariales Ingeniera Civil Informtica

Lo primero que hay que hacer, es definir un mutex para trabajar con las
variables comunes. (10 pts)
Luego se puede definir un contador para trabajar en forma sincronizada, por
ejemplo, cuando el contador es 0, entonces, escribe threadMinimo, cuando el
contador es 1, entonces escribe threadMaximo, y cuanto contador es 2, se
hacen los clculo y luego se reinicia el contador. (15 pts.)
Al ser un buffer circular, cuando se llega al final del arreglo, se vuelve al
principio. (5 pts)
Finalmente, se deben crear los threads usando pthread_create() y esperarlos
en el main, con pthread_join() (5pts).

void threadEstadistica(void *p) {


int valor1,valor2,promedio;
For(;;) {
pthread_mutex_lock(&elMutex);
If(pos%3==2) { /*Con esta linea usamos pos como contador de 0 a 2. */
valor1= Buffer[pos-1];
valor2= Buffer[pos-2];
promedio = (valor1+valor2)/2;
Buffer[pos]=promedio;
pos++;
if(pos==20)
pos=0;
}
pthread_mutex_unlock(&elMutex);
}
}

void threadMinimo(void *p) {


int valor;
For(;;) {
pthread_mutex_lock(&elMutex);
If(pos%3==0) { /*Con esta linea usamos pos como contador de 0 a 2. */
valor = tempMinima();
Buffer[pos] = valor;
pos++;
}
pthread_mutex_unlock(&elMutex);

}
}

void threadMaximo(void *p) {


int valor;
For(;;) {
pthread_mutex_lock(&elMutex);
If(pos%3==1) { /*Con esta linea usamos pos como contador de 0 a 2. */
valor = tempMaxima();
Buffer[pos] = valor;
pos++;
}
pthread_mutex_unlock(&elMutex);
}
}
Universidad del Bo-Bo Ingeniera de Ejecucin en Computacin e Informtica
Facultad Ciencias Empresariales Ingeniera Civil Informtica

/*Variables Globales*/

pthread_mutex elMutex;

main () {

pthread_t thMin,thMax,thEst;

/*Crear los threads */


pthread_create(&thMin, NULL,threadMinimo, NULL);
pthread_create(&thMax, NULL,threadMaximo, NULL);
pthread_create(&thEst, NULL,threadEstadistica, NULL);

/*Esperar los threads*/


pthread_join(thMin,NULL);
pthread_join(thMax,NULL);
pthread_join(thEst,NULL);

También podría gustarte