Boletín 4- Procesos. Departamento de Lenguajes y Sistemas Informáticos

Documentos relacionados
Boletín 4- Procesos. Departamento de Lenguajes y Sistemas Informáticos

Prácticas de Sistemas Operativos

Práctica 1: Intérprete de mandatos. Sistemas Operativos Área de Arquitectura y Tecnología de Computadores

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

Introducción y Gestión de Procesos

Llamadas al Sistema para la Creación de Procesos

Funciones POSIX (I): Introducción

MC Hilda Castillo Zacatelco PROCESOS

Sistemas Operativos Practica 1: procesos y concurrencia.

Tema 4: Gestión de Procesos

Procesos en UNIX. LABORATORIO DE SISTEMAS DE OPERACIÓN I (ci 3825) Prof. Yudith Cardinale

Introducción y Gestión de Procesos

Redirecciones y Tuberías

Un ejemplo: UNIX PROCESOS UNIX

Prácticas de Sistemas operativos

Sistemas Operativos sesión 12: tuberías

Prácticas de Sistemas operativos

PROCESOS. Sistemas Operativos

INTRODUCCIÓN A LAS LLAMADAS AL SISTEMA OPERATIVO UNIX

Concepto de proceso. (c) 2006 Alexis Quesada / Francisco J. Santana 2

Gestión de procesos en UNIX

Sistemas Operativos Práctica 3

Concurrencia en UNIX / LINUX. Introducción: Procesos e Hilos POSIX

Bloque I: Principios de sistemas operativos

Teoría. Procesos. Escuela Politécnica Superior Universidad Autónoma de Madrid 1

TP II Procesos Pesados

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Biblioteca de sistema

Ejercicios sobre tuberías

Procesos 1 / 31. Para entender el concepto de hebra, necesitamos compreender el concepto de proceso

ASIGNATURA: SISTEMAS INFORMÁTICOS INDUSTRIALES. CURSO 4º GRUPO Octubre 2015

Llamadas al sistema básicas de control de procesos

SISTEMAS OPERATIVOS PROCESOS. Pedro de Miguel Anasagast

Clases 04 y 05: Repaso de programación de sistemas basados en UNIX

Sistemas Operativos. Grado Ingeniería Informática. TGR Procesos.

Sistemas Operativos. Tema 2

Formatos para prácticas de laboratorio

- Bajo que condiciones el algoritmo de planifiación de procesos FIFO (FCFS) resultaría en el tiempo de respuesta promedio más pequeño?

PRÁCTICA 1: PROCESOS Y COMUNICACIÓN ENTRE PROCESOS

Sistemas Operativos I Práctica 1. Técnica de procesos múltiples El intérprete de comandos. Diana Rosario Pérez Marín Febrero 2007 EPS-UAM

Procesos e Hilos en C

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Analista Universitario en Sistemas. Sistemas Operativos. Instituto Politécnico Superior PROCESOS

1. Procesos vs Hilos 2. Cuando se ejecutan los procesos 3. Fork 4. Clone 5. Cómo se ejucuta el fork? 6. do_fork() 7. copy_process 8.

Sistemas Operativos I Manual de prácticas

PRACTICA # 3 PROCESOS (CONTINUACION)

Programación de Sistemas Ricardo Sanz

Introducción a Sistemas Operativos: Ficheros

Programación de Sistemas. Programación de Sistemas con Ansi C sobre UNIX. Gestión de errores. Gestión de errores. Ficheros regulares

Tema 4: Padre e hijo

Resuelva con una orden UNIX las siguientes tareas:

Apartado TGR Puntuación. No Presentado. EXAMEN DE SISTEMAS OPERATIVOS (Grado en Ing. Informática) 20/1/2014.

SISTEMAS OPERATIVOS: INTRODUCCIÓN Y CONCEPTOS BÁSICOS. Servicios del Sistema Operativo

Apartado a.- Obtenga un listado de todos los ficheros regulares del sistema terminados en.y ó.c, con permiso de lectura para el grupo.

Introducción a Sistemas Operativos: Comunicación entre Procesos

2. Problema de Análisis y Diseño Orientado a Objetos (4 puntos - 25 minutos)

Sistemas Operativos. Prólogo

Apellidos: Nombre: Matrícula: Examen Programación para Sistemas Grado en Ingeniería Informática (2009)

Procesos e hilos y señales en C de GNU/Linux

Entrada y Salida de Archivos

Procesos e hilos. Pablo San Segundo (C-206)

Boletín 3- Archivos. Departamento de Lenguajes y Sistemas Informáticos

Sistemas Operativos Primer Recuperatorio Parcial 1

Funciones POSIX III Funciones POSIX III. No Nombrados Nombrados. sem_open sem_open. sem_close sem_close. sem_unlink sem_unlink

Procesos e hilos: el downloader

Procesos. Fernando R. Rannou Departamento de Ingenieria Informatica Universidad de Santiago de Chile. October 10, 2013

TEMA 7. Programación en UNIX. Contenido

TEMA 7. Programación en UNIX. Contenido

El tiempo de búsqueda es de 3 + 0,04 x ms, siendo x el número de cilindros a recorrer.

Apellidos: Nombre: DNI: Parte Sistema Ficheros (Se deben contestar correctamente todas las cuestiones de cada pregunta para puntuar la misma).

Programación I Funciones

Llamadas a Sistema para procesos

Sistemas Operativos Grado Ingeniera Informática UDC. Enero 2016 Sólo puede usar lápiz, bolígrafo y calculadora. Tiempo máximo para todo el examen: 3h

Bloque I: Principios de sistemas operativos

El lenguaje de Programación C. Fernando J. Pereda

Examen Final de SO Grau

Procesos y API. Rodolfo Baader. Departamento de Computación, FCEyN, Universidad de Buenos Aires, Buenos Aires, Argentina

Sistemas Operativos. Pedro Cabalar TEMA III. PROCESOS. Depto. de Computación Universidade da Coruña

Sistemas Operativos. Procesos

Examen de Laboratorio de Sistemas Operativos. Primera Convocatoria. 2007/2008. Tercero Ingeniería Informática. Apellidos: 18 de Junio de 2008

Sistemas Operativos Primer Parcial Tema2

Sistemas Operativos. Iván Bernal, Ph.D. 4. Escuela Politécnica Nacional I.

PRÁCTICAS DE SS.OO. Universidad de Murcia. I.I./I.T.I. Sistemas/I.T.I. Gestión

Archivos & Cadenas CURSO DE PROGRAMACIÓN EN C. Centro de Investigación y de Estudios Avanzados del IPN. CINVESTAV - Tamaulipas.

Administración de Redes

Prueba de Laboratorio Modelo B01 Semáforos y Memoria Compartida

Sistemas operativos: una visión aplicada. Capítulo 5 Comunicación y sincronización de procesos

Llamadas al sistema (2) Dr. Alonso Ramírez Manzanares 1-Sep-2009

Función monitoreo descriptor archivo #include <sys/types.h> #include<unistd.h> #include<errno.h> extern void procesamiento_datos(char *, int); void pr

Fundamentos de los Sistemas Operativos. Tema 2. Procesos José Miguel Santos Alexis Quesada Francisco Santana

Tema 2. Administración de procesos

Ejercicios de la sesión 4 de C resueltos

SISTEMAS OPERATIVOS: PROCESOS. Introducción a la gestión de Procesos

Sistemas Operativos Primer Examen Parcial 13/07/15

DESCRIPCIÓN open intenta abrir un fichero y devolver un descriptor de fichero (un entero pequeño, no negativo, de uso en read, write, etc.).

Segundo control de teoría Q1

Prácticas de Sistemas operativos

Para C un chero no es más que una porción de almacenamiento

Transcripción:

Boletín 4- Procesos Departamento de Lenguajes y Sistemas

Indice 1. Introducción n (Procesos) 2. Identificadores de usuarios y procesos 3. La llamada fork() 4. Las llamadas wait() y exit() 5. La llamada exec() 6. La terminación n de procesos 7. Comunicación n entre procesos con tuberías 2

Introducción (Procesos) -Definición: Proceso en UNIX. Proceso: es un programa en ejecución. Cada proceso dentro de su información tiene el código del programa, el área de datos, el program counter, registros e información adicional. El sistema operativo debe poder crear un proceso, destruirlo, suspenderlo, retomarlo, debe tener un mecanismo para retomar un proceso y para sincronizalos, y mecanismos de concurrencia. Los procesos tienen una estructura jerárquica tipo árbol. 3

Introducción (Procesos) El contexto de un proceso Es el conjunto de las informaciones dinámicas que representan el estado de ejecución de un proceso (en qué punto de su ejecución se encuentra el proceso). 4

Introducción (Procesos) Información de los procesos desde la línea de comando murillo:/export/home/prof/lensis#>ps ef UID PID PPID C STIME TTY TIME CMD root 0 0 0 Aug 19? 0:01 sched root 1 0 0 Aug 19? 0:50 /etc/init - root 2 0 0 Aug 19? 0:00 pageout root 3 0 1 Aug 19? 2110:11 fsflush root 442 1 0 Aug 19? 0:00 /usr/lib/saf/sac -t 3 root 523 507 0 Aug 19 pts/3 0:19 /usr/dt/bin/dtsession root 189 1 0 Aug 19? 0:02 /usr/sbin/rpcbind root 79 1 0 Aug 19? 0:00 /usr/lib/sysevent root 98 1 0 Aug 19? 0:01 /usr/lib/picl/picld root 237 1 0 Aug 19? 0:01 /usr/sbin/cron root 224 1 0 Aug 19? 0:02 /usr/lib/automountd root 236 1 0 Aug 19? 2:53 /usr/sbin/syslogd -m 6 5

Introducción (Procesos) murillo:/export/home/prof/lensis#>ps ef UID PID PPID C STIME TTY TIME CMD root 0 0 0 Aug 19? 0:01 sched root 1 0 0 Aug 19? 0:50 /etc/init - root 2 0 0 Aug 19? 0:00 pageout Campo UID PID PPID C STIME TTY TIME CMD Significado ID del usuario propietario del proceso (entero) ID del proceso (entero) ID del padre del proceso Utilización del preprocesador de C para la administración de procesos (desuso) Hora de comienzo terminal de control Tiempo acumulado de CPU Nombre del comando 6

Identificar usuarios y procesos #include <sys/types.h> #include <unistd.h> pid_t getpid(void); pid_t getppid(void); uid_t getuid(void); Devuelve pid_t es un entero largo con el ID del proceso llamante (getpid) o del padre del proceso llamante (getppid) uid_t es un entero con el ID del usuario propietario del proceso llamante. En caso se error se devuelve -1. 7

Creación de procesos: fork() Todo proceso en UNIX ha sido creado por una instrucción fork(). El nuevo proceso que se crea recibe una copia del contexto de proceso del padre. Los dos procesos continúan su ejecución en la instrucción siguiente al fork(). #include <sys/types.h> #include <unistd.h> pid_t fork(void); Devuelve Devuelve 0 al proceso hijo y el PID del hijo al padre. En caso se error se devuelve -1. 8

Creación de procesos: fork() PROCESO PADRE #include <stdio.h> #include <sys/types.h> #include <unistd.h> < int main (void) if (fork()( == 0) printf( "Este es el proceso hijo con padre %ld\n", (long)getppid()); else printf("este es el proceso padre con ID %ld\n", %ld\n", (long)getpid());( ()); return 0; ENTORNO DE EJECUCIÓN DEL PADRE PROCESO HIJO #include <stdio.h> #include <sys/types.h> #include <unistd.h> < int main (void) if (fork()( == 0) printf( printf( "Este es el proceso hijo con padre %ld\n", %ld\n", (long)getppid());( ()); else printf("este es el proceso padre con ID %ld\n", %ld\n", (long)getpid());( ()); return 0; ENTORNO DE EJECUCIÓN DEL HIJO 9

Las llamadas wait() y exit() exit() termina la ejecución de un proceso #include <stdlib.h> void exit(int status); Parámetros Status: entero que se devuelve al padre COMPORTAMIENTO: Si el proceso padre espera al hijo con un wait(), se le notifica la terminación n y se le manda el valor de status. Si el proceso padre no espera, el hijo se convertirá en un proceso huérfano rfano. 10

Las llamadas wait() y exit() COMPORTAMIENTO: Proceso Zombi: : se produce cuando un proceso se queda parado a la espera de que acabe su hijo y el hijo ya ha acabado. Se produce cuando el proceso padre no recoge el código c de salida del hijo. Proceso Huérfano rfano: : proceso en ejecución n cuando su padre ha finalizado. El nuevo identificador del padre (ppid)) coincide con el identificador del proceso init (1). 11

Las llamadas wait() y exit() wait() y waitpid() suspende la ejecución del proceso actual hasta que un proceso hijo ha terminado, o hasta que se produce una señal. #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat_loc); pid_t waitpid(pid_t pid, int *stat_loc, int options); Parámetros stat_loc: puntero a entero con el valor del status devuelto por el hijo pid: proceso a esperar. options: opciones de terminación 12

Las llamadas wait() y exit() wait() y waitpid() stat_loc: puntero a entero con el valor del status devuelto por el hijo El estado puede ser evaluado con las siguientes macros WIFEXITED(status) es distinto de cero si el hijo terminó normalmente. WEXITSTATUS(status) evalúa los ocho bits menos significativos del código de retorno del hijo que terminó, que podrían estar activados como el argumento de una llamada a exit() o como el argumento de un return en el programa principal. Esta macro solamente puede ser tenida en cuenta si WIFEXITED devuelve un valor distinto de cero. WIFSIGNALED(status) devuelve true si el proceso hijo terminó a causa de una señal no capturada. WTERMSIG(status) devuelve el número de la señal que provocó la muerte del proceso hijo. Esta macro sólo puede ser evaluada si WIFSIGNALED devolvió un valor distinto de cero. WIFSTOPPED(status) devuelve true si el proceso hijo que provocó el retorno está actualmente parado; esto solamente es posible si la llamada se hizo usando WUNTRACED. WSTOPSIG(status) 13 devuelve el número de la señal que provocó la parada del hijo. Esta macro solamente puede ser evaluada si WIFSTOPPED devolvió un valor distinto de cero.

Las llamadas exec() #include <unistd.h> Se usa cuando se sabe los parámetros de los int execl(const char *path, const procesoschar *arg0,..., const char *argn, char * /*NULL*/); int execv(const char *path, char *const argv[]); int execlp(const char *file, const char *arg0,..., const char *argn, char * /*NULL*/); int execvp(const char *file, procesos char *const argv[]); int execle (const char *path, const char *arg0,..., const char *argn, char * /*NULL*/, char *const envp[]); int execve (const char *path, char *const argv[], char *const envp[]); Devuelve execl usa una lista indeterminada de parámetros. execv usa una un array de punteros a char. Se usa cuando NO se sabe los parámetros de los Si cualquiera de las funciones exec regresa, es que ha ocurrido un error. El valor de retorno es -1, y en la variable global errno se pondrá el código de error adecuado. 14

Las llamadas exec() l : Los argumentos para el programa (cadenas de texto) se incluyen uno a uno en los argumentos de la función, indicando el último mediante el puntero 0. v : Los argumentos para el programa se pasan mediante un array de punteros a las cadenas de texto que son los argumentos. El último elemento del array debe ser el puntero 0. e : Permite pasar las variables globales de entorno que deben definirse para la ejecución del nuevo programa. p : La búsqueda del programa se hará en todos los directorios contenidos en la variable de entorno PATH. 15

Las llamadas exec() La familia de funciones exec reemplaza la imagen del proceso en curso con una nueva. PROCESO PADRE PID=228 #include <stdio.h> #include <sys/types.h> #include <unistd.h> < int main (void) if ( execl ("/bin/ps", ", "ps", " ", "-fu"," getenv ("USER"), 0) < 0) fprintf(stderr,, "Error en exec %d\n", %d\n", errno); exit(1); exit(1); else else printf("este es el proceso padre con ID %ld\n", %ld\n", (long)getpid()); ( ()); return 0; PROCESO HIJO PID=228 /bin/ps -fu ENTORNO DE EJECUCIÓN DEL PADRE ENTORNO DE EJECUCIÓN DEL HIJO 16

El esquema fork()-exec() PROCESO PADRE PID=34 #include <stdio.h> #include <sys/types.h> #include <unistd.h> < int main (void) if (fork()( fork() == 0) execl( /bin/ls, ls, -la ); else printf("este es el proceso padre con ID %ld\n", (long)getpid());( ()); return 0; ENTORNO DE EJECUCIÓN DEL PADRE /bin/ls -la PROCESO HIJO PID=35 #include <stdio.h> #include <sys/types.h> #include <unistd.h> < int main (void) if (fork()( == 0) execl( /bin/ls, ls, -la ); else printf("este es el proceso padre con ID %ld\n", (long)getpid());( ()); return 0; ENTORNO DE EJECUCIÓN DEL HIJO 17

Terminación de procesos: atexit() Atexit() La función atexit sirve para instalar un manejador de terminación de usuario. Se puede registrar más de una función. Las funciones así registradas se llaman en orden inverso al de su registro; no se puede pasar ningún argumento. #include <stdlib.h> #include <sys/wait.h> int atexit(void (*MiFuncion) (void)); Parámetros *MiFuncion: puntero a una función que se ejecute cuando se llame a exit. Devuelve 0 si todo ha ido correcto y -1 en caso de error, y en la variable global errno se pondrá el código de error adecuado. 18

Tuberías Son el mecanismo más antiguo de IPC y lo proveen todos los sistemas Unix Proveen canal unidireccional para flujo de datos entre dos procesos Sólo puede ser usado entre procesos con un antecesor común que crea la pipe (heredando descriptores comunes). /bin/ls -la sort -r 19

Tuberías #include <unistd.h> int pipe (int fildes[2]); Parámetros fildes es una tabla con dos descriptores de ficheros: fildes[0] (descriptor de lectura) y fildes[1] (descriptor de escritura). Devuelve Devuelve 0 en caso de éxito y -1 en caso de error, almacenando en errno el código del mismo. Buffering se realiza en el kernel Normalmente el proceso que llama pipe luego llama a fork Dependiendo de dirección de flujo cada proceso cierra uno de los descriptores usando close Podrían existir múltiples lectores y escritores 20

Tuberías TABLA DE DESCRIPTORES DE FICHEROS 0 1 2 PROGRAMA/PROCESO int main (void) int n, fd[2]; pid_t pid; char linea[maxlinea]; pipe(fd) 22 23 fd[0] fd[1] 21

Tuberías int main (void) int n, fd[2]; pid_t pid; char linea[maxlinea]; if (pipe(fd) < 0) error_sys( error en creación de pipe ); if ( (pid =fork()) < 0) error_sys( error en el fork ); else if (pid > 0) // soy el papa close (fd[0]); // papa no lee, sólo escribe write(fd[1], Hola mundo\n ); else // soy el hijo close (fd[1]); // hijo sólo leerá n = read(fd[0], linea, MAXLINEA); write(stdout_fileno, linea, n); exit(0); PADRE HIJO 22

Tuberías PADRE PADRE PADRE HIJO HIJO HIJO HIJO PADRE PADRE HIJO HIJO HIJO HIJO HIJO 23

Tuberías: dup() y dup2() #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); Descripción Duplica un descriptor de fichero. dup duplica el descriptor oldfd sobre la primera entrada de la tabla de descriptores del proceso que esté vacía. dup2 duplica del descriptor oldfd sobre el descriptor newfd. En el caso en que éste ya hiciera referencia a un fichero, lo cierra antes de duplicar. Devuelve Ambas rutinas devuelven el valor del nuevo descriptor de fichero y 1 en caso de error. 24

Tuberías: dup() y dup2() 0 1 2 22 25 TABLA DE DESCRIPTORES DE FICHEROS df df2 Salida.txt #include <stdlib.h> #include <unistd.h> #include <fcntl.h> int main (int argc, char *argv[]) int df, df2; if (argc < 3) PROGRAMA/PROCESO printf ("Formato: %s argv[0]); exit (1); [opciones].\n", printf ("Ejemplo de redirección.\n"); df = open ( salida.txt, O_CREAT); if (desc_fich==-1) exit(-1); df2=dup(df); close (df);... exit (1); 25

Tuberías: dup() y dup2() #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); Descripción Duplica un descriptor de fichero. dup duplica el descriptor oldfd sobre la primera entrada de la tabla de descriptores del proceso que esté vacía. dup2 duplica del descriptor oldfd sobre el descriptor newfd. En el caso en que éste ya hiciera referencia a un fichero, lo cierra antes de duplicar. Devuelve Ambas rutinas devuelven el valor del nuevo descriptor de fichero y 1 en caso de error. 26

Tuberías: pipe(), dup2() y descriptores de ficheros 0 1 2 22 df Salida.txt TABLA DE DESCRIPTORES DE FICHEROS #include <stdlib.h> #include <unistd.h> #include <fcntl.h> int main (int argc, char *argv[]) int df; if (argc < 3) PROGRAMA/PROCESO printf ("Formato: %s argv[0]); exit (1); [opciones].\n", printf ("Ejemplo de redirección.\n"); df = open ( salida.txt, O_CREAT); if (desc_fich==-1) exit(-1); dup2 (df, STDOUT_FILENO); close (df); execvp (argv[2], &argv[2]); exit (1); 27