Está en la página 1de 6

S ISTEMAS O PERATIVOS Y R EDES

P RÁCTICA 5: P ROCESOS Y T HREADS


1. Conteste las siguiente preguntas:
1) ¿Cuáles son las dos características diferentes y potencialmente independientes en el concepto de proceso?
2) Enumere las razones por las que un cambio de contexto entre hilos puede ser más barato que un cambio de
contexto entre procesos (ventajas de los threads sobre los procesos).
3) ¿Cuáles son las diferencias entre hilos y procesos desde el punto de vista de la gestión de procesos?
4) ¿Qué recursos son compartidos normalmente por todos los hilos de un proceso?
5) En un sistema multithreading enumere información propias de los threads e información del proceso que es
compartida por los threads de un proceso.
6) ¿Qué son los ULT (User Level Threads) y los KLT (Kernel Level Threads)?.
7) Enumere ventajas de los ULT sobre los KLT.
8) Enumere desventajas de los ULT sobre los KLT.

2. Procesos
1) Implemente el c el siguiente código, compile y ejecute. Determine qué parte de código ejecuta el proceso
padre y qué parte del código ejecutan los procesos hijos. Dibujar con diagramas la jerarquía de procesos (pro-
ceso padre y procesos hijos). Ejecute reiterada veces. ¿Observa algún comportamiento extraño?. ¿Qué hace la
instrucción break dentro del código? ¿Quién ejecuta las iteraciones del for? ¿Cómo varía para cada proceso la
variable i?
#include <sys/types.h>
#include <stdio.h>

int main()
{
pid_t pid;
int i;
int n = 10;

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


{
pid = fork();
if (pid != 0)
break;
}

printf("El padre del proceso %d es %d \n", getpid(), getppid());


return 0;

UNRN - I NGENIERÍA E LECTRÓNICA 1 de 6


S ISTEMAS O PERATIVOS Y R EDES

2) Investigar que pasa cuando el código retornado por getppid() es 1.


3) Implemente el c el siguiente código, compile y ejecute. Determine qué parte de código ejecuta el proceso pa-
dre y qué parte del código ejecutan los procesos hijos. Dibujar con diagramas la jerarquía de procesos (proceso
padre y procesos hijos). Ejecute reiterada veces. ¿Cuál es la diferencia con el código anterior? ¿Qué modifica
en la ejecución de estos procesos la instrucción sleep(), en qué se traduce?

#include <sys/types.h>
#include <stdio.h>

int main()
{
pid_t pid;
int i;
int n = 10;

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


{
pid = fork();
if (pid != 0)
{
printf("El padre del proceso %d es %d \n", getpid(), getppid());
sleep(5);
break;
}
}

return 0;

4) Implemente el siguiente código, compile y ejecute. Determine qué parte de código ejecuta el proceso padre
y qué parte del código ejecutan los procesos hijos. Dibujar con diagramas la jerarquía de procesos (proceso
padre y procesos hijos). Ejecute reiterada veces. ¿Cuál es la diferencia con los códigos anteriores? ¿Qué hace
la instrucción break dentro del código? ¿Quién ejecuta las iteraciones del for? ¿Cómo varía para cada proceso
la variable n?
#include <sys/types.h>
#include <stdio.h>

int main()
{
pid_t pid;
int i;
int n = 10;

UNRN - I NGENIERÍA E LECTRÓNICA 2 de 6


S ISTEMAS O PERATIVOS Y R EDES

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


{
pid = fork();
if (pid == 0)
break;
}

printf("El padre del proceso %d es %d \n", getpid(), getppid());


return 0;

5) Implemente el siguiente código, compile y ejecute. Determine qué parte de código ejecuta el proceso padre
y qué parte del código ejecutan los procesos hijos. Dibujar con diagramas la jerarquía de procesos (proceso
padre y procesos hijos). Ejecute reiterada veces. ¿Cuál es la diferencia con los códigos anteriores? ¿Qué hace
la instrucción wait dentro del código? ¿Quién ejecuta las iteraciones del for? ¿Este código es secuencial?

#include <sys/types.h>
#include <stdio.h>

int main()
{
pid_t pid;
int i;
int n = 10, valor;

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


{
pid = fork();
if (pid == 0)
{
printf("Soy el proceso: %d, con padre: %d \n", getpid(), getppid());
break;

}
else
{

wait(pid);
printf("Padre:%d sincroniza con:%d \n", getpid(), pid);
}
}
return(0); //hijo

UNRN - I NGENIERÍA E LECTRÓNICA 3 de 6


S ISTEMAS O PERATIVOS Y R EDES

3. Threads
Nota: para compilar incluir la libreria pthread.h. Por ejemplo gcc uno.c -o uno -lpthread
6) a) Implemente el siguiente código, compile y ejecute. Determine qué realiza cada parte del código. Ejecute
reiteradas veces. ¿Siempre terminan todos los threads? b) Descomente la instrucción sleep(5), compile y
ejecute nuevamente. ¿Qué hace dicha instrucción? ¿qué efecto tiene en este código?

#include <pthread.h>
#include <stdio.h>
#defin MAX 10

void *funcion1(void *parametros)


{
printf("Thread %u \n", (unsigned int)pthread_self());
pthread_exit(0);
}

int main()
{
int j;
pthread_attr_t attr;
pthread_t thid[MAX];

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

for(j = 0; j < MAX; j++)


pthread_create(&thid[j], &attr, funcion1, NULL);

// sleep(5);
return 0;
}

7) Implemente el siguiente código, compile y ejecute. Determine qué realiza cada parte del código. Ejecute
reiteradas veces. ¿Siempre terminan todos los threads? Comente las lineas con las instrucciones pthread_join()
y vuelva a ejecutar reiteradas veces. Describa y justifique el comportamiento observado.

#include <pthread.h>
#include <stdio.h>

void *funcion(void *p)


{
printf("Thread: %u \n",(int)pthread_self());

pthread_exit(0);
}

int main()

UNRN - I NGENIERÍA E LECTRÓNICA 4 de 6


S ISTEMAS O PERATIVOS Y R EDES

{
pthread_t th1, th2;

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


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

printf("El thread principal continua ejecutando \n");

pthread_join(th1,NULL);
pthread_join(th2,NULL);

return 0;
}

8) Implemente el siguiente código, compile y ejecute. Determine qué realiza cada parte del código. Ejecute
reiteradas veces. ¿Siempre terminan todos los threads? Comente las lineas con las instrucciones pthread_join()
y vuelva a ejecutar reiteradas veces. Describa y justifique el comportamiento observado.

UNRN - I NGENIERÍA E LECTRÓNICA 5 de 6


S ISTEMAS O PERATIVOS Y R EDES

#include <pthread.h>
#include <stdio.h>

#define NUM 5

void *imprimir(void *n)


{
printf("Thread: %u %d \n",(int)pthread_self(),((int*) n));
pthread_exit(0);
}

int main()
{
pthread_t th[NUM];
pthread_attr_t attr;
int num;

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

int i;
for(i = 0; i < NUM; i++)
{
scanf("%d ",&num);
pthread_create(&th[i], &attr, imprimir,(void*)num);
}
printf("Termina thread del main() \n");

return 0;
}

Agregue al código anterior, al final del main(), el siguiente código. Saque conclusiones del nuevo comporta-
miento observado.

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


{
pthread_join(th[i], NULL);
}

9) Descargar y descomprimir el archivo timing_Procesos_Threads.zip del blog de la materia. Compilar-


los y ejecutarlos. Para cada uno, explicar qué hacen, explicar la jerarquía de procesos/threads y analizar los
resultados.
10) Explique los diagramas de transición de estado de threads de la presentación vista en clase teórica.

UNRN - I NGENIERÍA E LECTRÓNICA 6 de 6

También podría gustarte