1 / 46

Procesos

Procesos. ARISO 2 Escola Tècnica Superior d’Enginyeria de Telecomunicació de Barcelona ( Universitat Politècnica de Catalunya). Licencia Creative Commons.

sunee
Download Presentation

Procesos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Procesos ARISO 2 EscolaTècnica Superior d’Enginyeria de Telecomunicació de Barcelona (UniversitatPolitècnica de Catalunya)

  2. 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.

  3. 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)

  4. Procesos Introducción

  5. Que es un programa? • Estático • Fichero ejecutable: • Colección de instrucciones guardadas en disco • Cargar en memoria y ejecutar

  6. 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

  7. Características • ProcessIdentifier (PID) • User • I/O Channels • Signals / Exceptions • Priority and Scheduling • Process Control Block (PCB)

  8. 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)

  9. Imagen de un proceso Memoria • Imagen en memoria del proceso • Código • Datos • Pila

  10. Procesos Modelo de procesos

  11. Concurrencia de procesos • ¿Por que ejecutar simultáneamente varios procesos? • Aprovechar el tiempo de E/S • Varios procesadores: paralelismo • Compartir recursos entre usuarios

  12. 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

  13. 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

  14. Estados de un proceso 5 Running 3 2 1 Ready Blocked 0 4

  15. Process Control Block • 1 ProcessTable n PCBs

  16. Procesos Scheduling

  17. 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

  18. Planificación Entorno (environment)

  19. 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

  20. Planificación Batch • First Come FirstServed (FIFO) • No Apropiativo Prioridades • Shortest Job First • No Apropiativo • ShortestRemaining Time Next • Apropiativo

  21. 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

  22. Procesos Linux / UNIX

  23. 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

  24. Creación de procesos Proceso1

  25. Creación de procesos Proceso1 Proceso2

  26. Creación de procesos • intfork() • Valor de retorno: • 0 si eres el hijo • PID del hijo  si eres el padre • -1  error

  27. 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

  28. 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

  29. Estados de un proceso 2 Zombie Running Ready Blocked

  30. 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

  31. 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

  32. 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)

  33. Datos de proceso • intgetpid( ) • Devuelve el PID del proceso actual • intgetppid() • Devuelve el PID del proceso padre

  34. Procesos Ejercicios

  35. 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)); }

  36. 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); } } }

  37. 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); }

  38. 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); } } }

  39. 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); }

  40. 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);} }

  41. 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);} }

  42. 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)); } }

  43. 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"); } }

  44. 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); } } }

  45. 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); } } }

  46. 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");} } }

More Related