PROCESOS Sistemas Distribuidos Alvaro Ospina Sanjuan Universidad Pontificia Bolivariana Medellín 2010 Proceso Abstracción de un programa en ejecución Consiste en los siguientes elementos: Contexto del programa (status del programa) Directorio de trabajo Archivos y directorios derecho el programa Credenciales o derechos de acceso del programa Cantidad de memoria y otros recursos del sistema asignados sobre los cuales tiene Proceso Abstracción de un programa en ejecución Entidad activa Actividad de la CPU Sistemas procesamiento por lotes Sistemas tiempo compartido Sistemas monousuario Conformado por: Código del programa Pila Datos jobs tasks program Estados de un Proceso 1 EN EJECUCI ÓN BLOQUEA DO 4 3 2 1. Se bloquea en espera de datos 2. Los datos están disponibles 3. Se asigna a la CPU por el fijador del kernel 4. Se le quita la CPU LISTO Implantación Tabla de procesos: Observarla en linux con “??” Demonios: Procesos creados por el SO para ejecución permanente. En linux terminan en “d” Atributos de un proceso: • Todos los procesos tiene un PID o Process ID, porque? • El PID es único • Todo los procesos tiene un proceso padre que es el proceso que lo inició – Excepto el proceso 0 el cual es iniciado por el kernel – Init es el proceso 1 , PPID es 0 – Pid y ppid son numeros mayores e iguales a 0. Llamadas para Procesos en C (linux) pid_t fork(void): Crea un proceso, donde el hijo es copia exacta del padre. La función retorna al proceso hijo “0” y al proceso padre el pid del hijo. int execv(const char *path, char * argv[]): Reemplaza la imagen de un proceso. pid_t wait( int * stat_loc): Suspende al padre hasta que llegue el hijo o una señal. void _exit( int *status): Termina el proceso y lo envía donde el padre. Ejercicios de procesos Ejercicio 1 Ejercicio 2 Ejercicio 3 Ejercicio 4 Ejercicio 1 #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void){ printf("\nSoy el proceso: %d\n", getpid()); printf("Mi proceso padre es: %d\n", getppid()); printf("Y mi propietario es: %d\n\n", getuid()); _exit(0); } Ejercicio 2 #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> int main (void){ pid_t childpid; int status; childpid = fork(); if (childpid == -1) { perror("Ha fallado el fork"); _exit(1); } else if (childpid == 0) fprintf(stderr,"Soy el hijo con pid = %d y mi papa es %d\n", getpid(),getppid()); else if (wait(&status) != childpid) fprintf(stderr, "Algo sacó al padre del wait\n"); else fprintf(stderr, "Soy el padre con pid = %d y el pid del hijo es = %d\n",getpid(), childpid); _exit(0); } Ejercicio 3 #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(void) { pid_t childpid; int status; if ((childpid = fork()) == -1) { perror("Error en el fork"); _exit(1); } else if (childpid == 0) { /* código del hijo */ if (execl("/bin/ls", "ls", NULL) < 0) { perror("Ha fallado la ejecución de ls"); _exit(1); } } else wait(&status); /* código del padre */ _exit(0); } Ejercicio 4 #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> int main (void){ pid_t childpid; int status; if ((childpid = fork()) == -1) { perror("Ha fallado fork"); _exit(1); } else if (childpid == 0){ fprintf(stderr, "Soy el hijo con pid = %d\n", getpid()); sleep(5); } else{ sleep(3); fprintf(stderr, "Soy el padre con pid = %d y mi hijo tiene el pid = %d\n",getpid(), childpid); wait(&status); } _exit(0); }