Vous êtes sur la page 1sur 13

UNIVERSIDAD REGIONAL AUTONOMA DE LOS ANDES

SISTEMAS OPERATIVOS MARCO CALLES TERCERO SISTEMAS

SERVICIOS POSIX PARA LA GESTION DE PROCESOS


IDENTIFICACION DE PROCESOS POSIX identifica cada proceso por medio de un entero nico denominado identificador de proceso de tipo pid_t, y estos servicios son los siguientes: Pid_t gaped(void) Identificador del proceso padre pid_t getppid(void) Programa que imprime el identificador del proceso y el identificador de su proceso padre. #include <sys/types.h> #include <stdio.h> #include <unistd.h> void main(void) { pid_t id_proceso; pid_t id_padre; id_proceso = getpid(); id_padre = getppid(); printf("Identificador de proceso: %d\n", id_proceso); printf("Identificador del proceso padre: %d\n", id_padre); }

SERVICIOS POSIX PARA LA GESTION DE PROCESOS


Cada proceso adems lleva asociado un usuario que se denomina propietario, Cada usuario en el sistema tienen un identificador nico denominado identificador de usuario de tipo uid_t. El proceso tambin tiene un identificador de usuario efectivo, que determina los privilegios que un proceso tienen cuando se encuentra ejecutando. El sistema tambin incluye grupos de usuarios, cada usuario debe ser miembro de al menos un grupo . Al igual que los usuarios cada proceso lleva asociado el identificador de grupo al que pertenece y el identificador de grupo efectivo, y los servicios que nos permite tener esta informacin son: Obtener el identificador de usuario real Uid_t getuid(void); Obtener el identificador de usuario efectivo uid_t geteuid(void); Obtener el identificador del grupo real Gid_t getgid(void); Obtener el identificador del grupo efectivo Gid_t getegid(void); Programa que imprime la informacin de identificacin de un proceso. #include <sys/types.h> #include <stdio.h> #include <unistd.h>

void main(void) { printf("Identificador de usuario: %d\n", getuid()); printf("Identificador de usuario efectivo: %d\n", geteuid()); printf("Identificador de grupo: %d\n", getgid()); printf("Identificador de grupo efetivo: %d\n", getegid()); }

SERVICIOS POSIX PARA LA GESTION DE PROCESOS ENTORNO DE UN PROCESO


El entorno de un proceso viene definido por una lista de variables que se pasan al mismo en el momento de comenzar su ejecucin, estas variables se llaman variables de entorno y son accesibls a un proceso a travs de la variable externa environ, declarada de la siguiente forma: 1 extern char ** environ; Esta variable apunta a una lista de variables de entorno. Esta lista no es mas que un vector de punteros a cadenas de caracteres de la forma nombre=valor, donde nombre hace referencia al nombre de una variable de entorno y el valor al contenido de la misma. Programa que imprime el entorno del proceso. #include <stdio.h> #include <stdlib.h> Cada aplicacin interpreta la lista de variables de entorno de forma especfica POSIX establece el significado de determinadas variables de extern char **environ; entorno. Las mas comunes son: HOME direct. Trabajo inicial del usuario void main(int argc, char **argv) LOGNAME: nombre del usuario asociado a un proceso { PATH: prefijo de directorios para encontrar ejecutables int i; TERM: tipo de terminal TZ: informacin de la zona horaria printf("Lista de variables de entorno de %s\n",argv[0]); Programa que imprime el valor de la variable HOME. for (i=0 ; environ[i] != NULL ; i++) #include <stdio.h> printf("environ[%d] = %s\n", i, environ[i]); #include <stdlib.h> }

OBTENER EL VALOR DE UNA VARIABLE DE ENTORNO


El servicio getenv permite buscar una variable de entorno su sintaxis es: char *getenv(const char *name);
Esta funcin devuelve un puntero al valor asociado a la variable de entorno de nombre name. Si la variable de entorno no se encuentra definida, la funcin devuelve NULL

void main(void) { char *home = NULL; home = getenv("HOME"); if (home == NULL) printf("$HOME no se encuentra definida\n"); else printf("El valor de $HOME es %s\n", home); }

CREACIN DE UN PROCESO
En una interfaz POSIX la forma de crear un proceso es invocando el servicio fork. El S.O trata este servicio realizando una clonacin del proceso que lo solicite, constituyendo la relacin con el nuevo proceso padre-hijo. Su prototipo es: pid_t fork();

La creacin del proceso se realiza copiando la imagen de memoria y el BCP, definiendo que el proceso hijo es una copia del proceso padre en el instante en que este solicita el servicio fork(). Significa que los datos y la pila del proceso hijo son los que tiene el proceso padre en ese instante de ejecucin. Es mas dado que al entrar el S.O a tratar el servicio, lo primero que hace es salvar los registros del BCP padre, al copiarse el BCP se copian los valores salvados de los registros , por lo que el hijo tiene los mismos valores que el padre.

TALLERES PARA GRUPOS DE TRABAJO


1. SINCRONIZACION DE PROCESOS 1. PROBLEMA DE LA SECCION CRITICA: SEMAFOROS 2. PROBLEMAS CLASICOS DE SINCRONIZACION 1. BUFFER LIMITADO 2. LECTORES Y ESCRITORES 3. FILOSOFOS COMENSALES 3. REGIONES CRITICAS 1. MONITORES 4. BLOQUEOS MUTUOS: MODELO DEL SISTEMA 1. ESTRATEGIAS COMBINADAS PARA LOS BLOQUEOS MUTUOS

GRUPO No 3 GRUPO No 2

GRUPO No 1 GRUPO No 4

CREACIN DE UN PROCESO
Todo esto significa que el contador de programa de los 2 procesos tienen el mismo valor, por lo que van a ejecutar la misma instruccin de mquina, No conceptualizar que el proceso hijo empieza la ejecucin del cdigo en su punto de inicio, repetimos que el hijo empieza a ejecutar al igual que el padre en la sentencia que est despus del fork() El proceso hijo no es totalmente idntico al padre, algunos valores de su BCP han de ser distintos y estos son: 1. El Ph tiene su propio identificador de proceso 2. El Ph tiene una nueva descripcin de memoria, aunque tenga los mismos segmentos con el mismo contenido, no tienen porque estar en la misma zona de memoria (especialmente en sistemas con memoria virtual) 3. El tiempo de ejecucin del proceso hijo es igual a 0 4. El valor que retorna el S.O como resultado del fork es distinto en el hijo y el padre (hijo recibo 0 y el padre recibe el identificador del proceso hijo) 5. Todas las alarmas pendientes se desactivan en el proceso hijo.

CREACIN DE UN PROCESO
Programa que crea un proceso.
#include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> void main(void) { pid_t pid; pid = fork(); switch(pid) { case -1: /* error del fork() */ perror("fork"); break; case 0: /* proceso hijo */ printf("Proceso %d; padre = %d \n", getpid(), getppid()); break; default: /* padre */ printf("Proceso %d; padre = %d \n", getpid(), getppid()); } }

CREACIN DE UN PROCESO

Programa que crea la cadena de procesos


#include <sys/types.h> #include <stdio.h> #include <unistd.h> void main(void) { 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()); }

1
2

Encada ejecucin del bucle se crea un proceso. El proceso padre obtiene el identificador del proceso hijo, que ser distinto de 0 y saldr del bucle utilizando break. El proceso hijo continuar la ejecucin, repitindose este proceso hasta que llegue al final del bucle.

CREACIN DE UN PROCESO
PROGRAMA 03-07 Programa que crea la estructura de procesos. #include <stdio.h> #include <sys/types.h> #include <unistd.h> void main(void) { 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()); }

En este programa, es el proceso hijo el que finaliza la ejecucin del bucle ejecutando la sentencia break, siendo el padre encargado de crear todos los procesos

SERVICIOS POSIX EXEC


Este servicio tiene como objetivo cambiar el programa que est ejecutando un proceso. Y se puede decir que tiene 2 fases: En la primera se vaca el proceso de casi todo su contenido, En la segunda se carga en nuevo programa

Recuerde que el servicio fork crea un nuevo proceso que ejecuta el mismo programa que el proceso padre y el servicio exec no crea un nuevo proceso sino que permite que un proceso pase a ejecutar un programa distinto

En la fase de vaciado se conservan algunas informaciones como: Entorno del proceso Que el S.O incluye en la nueva pila del proceso. Algunas informaciones del BCP como Identificador del proceso, del proceso padre, del usuario y descriptores de archivos abiertos En la fase de carga hay que realizar las siguientes operaciones: Asignar el proceso un nuevo espacio de memoria. Cargar el texto y datos iniciales en los segmentos correspondientes Crear la pila inicial del proceso con el entorno y los parmetros que se pasan Rellenar el BCP con los valores iniciales de los registros y la descripcin de los nuevos segmentos de memoria

SERVICIOS POSIX EXEC


La familia de funciones exec remplaza la imagen del proceso actual por una nueva imagen. Esta nueva imagen se construye a partir de un archivo ejecutable. Si la llamada se ejecuta con xito, sta no devolver ningn valor puesto que la imagen del proceso habr sido remplazada, caso contrario devuelve 1. La funcin main() del nuevo programa tendr la forma: int main(int argc, char **argv) // Ejemplo: Programa que ejecuta el comando ls l mediante execvp #include <sys/types.h> #include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { pid_t pid; char *argumentos[3]; argumentos[0] = "ls"; argumentos[1] = "-l"; argumentos[2] = NULL; pid = fork(); switch(pid) { case -1: /* error del fork() */ exit(-1); case 0: /* proceso hijo */ execvp(argumentos[0], argumentos); perror("exec"); break; default: /* padre */ printf("Proceso padre\n"); } }

// Ejemplo: Programa que ejecuta el comando ls l #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <unistd.h> int main() { pid_t pid; int status; pid = fork(); switch(pid) { case -1: /* error del fork() */ exit(-1); case 0: /* proceso hijo */ execlp("ls","ls","-l",NULL); perror("exec"); break; default: /* padre */ printf("Proceso padre\n"); while(pid != wait(&status)); } }

BIBLIOGRAFIA
- SILBERSCHATZ,A.(2003).FUNDAMENTOS DE SISTEMAS.MADRID.FANTASTICA - TENENBAUM,A.(1999). DISEO E IMPLEMTACION.SEGUNDA EDICION.PEARSON. - WILLIAN, S.(1998). SISTEMAS OPERATIVOS. SEGUNDA EDICION. PRENTICE HALL

Vous aimerez peut-être aussi