460 likes | 630 Views
Procesos. ARISO 2 Escola Tècnica Superior d’Enginyeria de Telecomunicació de Barcelona ( Universitat Politècnica de Catalunya). Licencia Creative Commons.
E N D
Procesos ARISO 2 EscolaTècnica Superior d’Enginyeria de Telecomunicació de Barcelona (UniversitatPolitècnica de Catalunya)
Licencia CreativeCommons Esta obra está bajo una licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 2.5 España de CreativeCommons. Para ver una copia de esta licencia, visite: http://creativecommons.org/licenses/by-nc-sa/2.5/es/ o envíe una carta a: CreativeCommons, 559 NathanAbbottWay, Stanford, California 94305, USA.
Licencia CreativeCommons Eres libre de: • copiar, distribuir y comunicar públicamente la obra • hacer obras derivadas Bajo las condiciones siguientes: • Atribución. Debes reconocer la autoría de la obra en los términos especificados por el propio autor o licenciante. • No comercial. No puedes utilizar esta obra para fines comerciales. • Licenciamiento Recíproco. Si alteras, transformas o creas una obra a partir de esta obra, solo podrás distribuir la obra resultante bajo una licencia igual a ésta. • Al reutilizar o distribuir la obra, tienes que dejar bien claro los términos de la licencia de esta obra. • Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor Advertencia: • Los derechos derivados de usos legítimos u otras limitaciones reconocidas por ley no se ven • afectados por lo anterior. • Esto es un resumen legible por humanos del texto legal (la licencia completa)
Procesos Introducción
Que es un programa? • Estático • Fichero ejecutable: • Colección de instrucciones guardadas en disco • Cargar en memoria y ejecutar
Que es un proceso? • Unidad de asignación de recursos que proporciona el SO (memoria, flujos, canales) • La cantidad de recursos de un proceso es dinámica (se asignan/se liberan) • Los procesos se gestionan mediante llamadas a sistema • Crear/destruir/modificar/consultar
Características • ProcessIdentifier (PID) • User • I/O Channels • Signals / Exceptions • Priority and Scheduling • Process Control Block (PCB)
Características • Se identifican mediante un PID (ProcessIDentifier) • Único en el sistema • Constante durante toda la vida del proceso • Están asociados a un usuario • Tendrá acceso a los recursos en función del usuario • Se puede cambiar de usuario • Dispone de canales para realizar la E/S • Gestión de excepciones y eventos • Tienen prioridades, usadas para planificar • Esta información se almacena en el PCB (Process Control Block)
Imagen de un proceso Memoria • Imagen en memoria del proceso • Código • Datos • Pila
Procesos Modelo de procesos
Concurrencia de procesos • ¿Por que ejecutar simultáneamente varios procesos? • Aprovechar el tiempo de E/S • Varios procesadores: paralelismo • Compartir recursos entre usuarios
Concurrencia y paralelismo • Paralelismo • Concurrencia • Combinados Proc1 CPU1 Proc2 CPU2 Proc3 CPU3 t Proc1 Proc2 Proc3 CPU t Proc1 Proc2 CPU1 Proc3 Proc4 CPU2 Proc5 Proc6 CPU3 t
Estados de un proceso • Creación de un proceso • Inicialización del sistema • Llamada a sistema: creación de proceso • “Mutación” de un proceso • Finalización de un proceso • Voluntario • Normal exit • Error exit • Involuntario • Fatal error • Killed
Estados de un proceso 5 Running 3 2 1 Ready Blocked 0 4
Process Control Block • 1 ProcessTable n PCBs
Procesos Scheduling
Planificación • El planificador (scheduler) • Decide cuando cambiar de proceso • Decide que proceso ejecutar • Algoritmos de planificación • Dependen del entorno del sistema Proc1 Proc2 Proc3 CPU t
Planificación Entorno (environment)
Planificación • Planificacor no apropiativo (nonpreemptive) • El SO no expulsa nunca al proceso de la CPU • El proceso abandona voluntariamente la CPU • Planificador apropiativo (preemptive) • El SO puede decidir expulsar a un proceso de la CPU
Planificación Batch • First Come FirstServed (FIFO) • No Apropiativo Prioridades • Shortest Job First • No Apropiativo • ShortestRemaining Time Next • Apropiativo
Planificación Interactivos • Round-RobinScheduling (quantum) • PriorityScheduling (estática vs dinámica) • MultilevelQueues • LotteryScheduling Prioridad 4 P1 P2 P3 Prioridad 3 P4 P5 P6 P7 Prioridad 2 P8 Prioridad 1
Procesos Linux / UNIX
Creación de procesos • fork() • Crea un nuevo proceso idéntico • Copia código • Copia datos • Copia pila • PCB nuevo en la ProcessTable • Nuevo PID • Nuevo ParentProcess
Creación de procesos Proceso1
Creación de procesos Proceso1 Proceso2
Creación de procesos • intfork() • Valor de retorno: • 0 si eres el hijo • PID del hijo si eres el padre • -1 error
Finalización de procesos • exit(int status) • Finaliza un proceso • Devuelve status al proceso padre • Que hace el SO: • Liberar memoria (código, pila, datos) • Cerrar y destruir la tabla de canales • Decrementar # links de la TFA
Sincronización de procesos • intwait(int *status) • Espera a la finalización de un HIJO cualquiera • Devuelve: • PID del hijo que finaliza • -1 en caso de error • Status contendrá el valor del exit del hijo
Estados de un proceso 2 Zombie Running Ready Blocked
Sincronización de procesos • intwait(int *status) • ∃ hijo zombie • Devuelve PID, status • Finaliza el proceso hijo • ∄ hijo zombie • ∃ hijo(s) vivo(s) • Bloqueo hasta que un hijo acabe • ∄ hijo(s) vivo(s) • Retorna -1
Sincronización de procesos • intwaitpid (intpid, int *stat, intflags) • Espera a la finalización de un HIJO en concreto • Devuelve: • PID del hijo que finaliza • -1 en caso de error • Status contendrá el valor del exit del hijo • Flags modifican el comportamiento de la función
Mutación de procesos • intexecl(char*path, char*arg0,…, null ) • intexecv(char*path, char*arg[] ) • Ejecuta un programa nuevo • Sustituye: • Código, Datos y Pila • Path ruta al fichero a ejecutar (“/bin/ls”) • Arg lista de argumentos, comienzan por el ejecutable execl (“/bin/ls”, “ls”, “-la”,null)
Datos de proceso • intgetpid( ) • Devuelve el PID del proceso actual • intgetppid() • Devuelve el PID del proceso padre
Procesos Ejercicios
Ejercicio: Factorial int factorial(intnum) { inttmp=1; while (num>1) { tmp = tmp * num; num--; } return(tmp); } void hijo(int inicio) { for (; inicio < 13; inicio +=2) printf("Factorial de %d es %d\n", inicio, factorial(inicio)); }
Ejercicio: Factorial Solucion 1 intmain( void ) { int pid1,pid2; pid1=fork(); if (pid1==0) // Estoy en el hijo1 { hijo(0); exit(0); } else { // Estoy en el padre pid2=fork(); if (pid2==0) // Estoy en el hijo2 {hijo(1); exit(1); } else { wait(NULL); wait(NULL); } } }
Ejercicio: Factorial Solucion 2 intmain( void ) { switch(fork()) { case -1: { printf("Error al crear hijo"); exit(0); break;} case 0: { hijo(0); exit(0); break;} } switch(fork()) { case -1: { printf("Error al crear hijo"); exit(0); break;} case 0: { hijo(1); exit(1); break;} } wait(NULL); wait(NULL); }
Ejercicio: Factorial Solucion 3 intmain( void ) { int pid1,pid2; pid1=fork(); if (pid1==0) // Estoy en el hijo1 { hijo(0); /*exit(0);*/ } else { // Estoy en el padre pid2=fork(); if (pid2==0) // Estoy en el hijo2 {hijo(1); /*exit(0);*/ } else { wait(NULL); wait(NULL); } } }
Ejercicio: Factorial Solucion 4 intmain( void ) { int pid1,pid2; int val1,val2; pid1=fork(); if (pid1==0) // Estoy en el hijo1 { hijo(0); exit(1); } else { // Estoy en el padre pid2=fork(); if (pid2==0) // Estoy en el hijo2 {hijo(1); exit(2); } } waitpid(pid1,&val1,0); waitpid(pid2,&val2,0); printf("Pid:%d Val:%d\nPid:%d Val:%d\n", pid1,val1>>8,pid2,val2>>8); }
Ejercicio: Factorial Solucion 5 intmain( void ) { int pid1,val1; pid1=fork(); if (pid1==0) { pid1=fork(); if (pid1==0) {hijo(1); exit(2); } hijo(0); waitpid(pid1,&val1,0); } else {waitpid(pid1,&val1,0);} }
Ejercicio: Factorial Solucion 6 intmain( void ) { int pid1,val1; pid1=fork(); if (pid1==0) { pid1=fork(); if (pid1==0) {hijo(1); exit(2); } waitpid(pid1,&val1,0); hijo(0); } else {waitpid(pid1,&val1,0);} }
Ejercicio: MaxProcs1 intmain( void ) { int pid1,v1,fin=0,cuantos=0; while(fin==0) { pid1=fork(); switch(pid1) { case -1: fin=1; break; case 0: for(cuantos=0;cuantos<1000;cuantos++) {fin=cuantos*(cuantos+cuantos)*(cuantos*cuantos);} printf("H Fin: %d\n",getpid()); exit(1); break; default: printf("P New: %d\n",pid1); cuantos++; break; } } for(fin=0;fin<cuantos;fin++) { printf("P Fin PID=%d\n",wait(NULL)); } }
Ejercicio: MaxProcs2 main( void ) { inti,j,vpid; vpid=fork(); if (vpid==0) { for(i=1;i<20;i++) { for(j=0;j<35000;j++) {vpid=(j*vpid)/i;} printf("Padre:%d\n",getppid()); } } else { for(i=1;i<5;i++) { for(j=0;j<35000;j++) {vpid=(j*vpid)/i;} } printf("Fin padre\n"); } }
Ejercicio: Exec 1 intmain( void ) { int pid1,pid2,v1,v2; pid1=fork(); if (pid1==0) { execl("/bin/ls","ls","-la",NULL); } else { pid2=fork(); if (pid2==0) { execl("/bin/cat","cat","/etc/passwd",NULL); } else {wait(NULL); wait(NULL); } } }
Ejercicio: Exec 2 intmain( intargc, char **argv ) { int pid1,pid2,v1,v2; if (argc != 3) {printf("Error de parametros\n"); exit(1);} pid1=fork(); if (pid1==0) { execl("/bin/grep","grep",argv[1] ,"/etc/passwd",NULL); } else { pid2=fork(); if (pid2==0) { execl("/bin/grep","grep",argv[2],"/etc/passwd",NULL); } else { waitpid(pid1,&v1,0); waitpid(pid2,&v2,0); printf("Hijo 1: %d\n",v1>>8); printf("hijo 2: %d\n",v2>>8); } } }
Ejercicio: Exec 3 intmain( void ) { int pid1,pid2,v1,v2; pid1=fork(); if (pid1==0) { execl("/bin/ls","ls","-la",NULL); } else { wait(NULL); pid2=fork(); if (pid2==0) { execl("/bin/cat","cat","/etc/passwd",NULL); } else {wait(NULL); printf("Padre acaba\n");} } }