Está en la página 1de 7

SISTEMAS OPERATIVOS NOMBRE: STEFANIA GUATO NIVEL: TERCERO SISTEMAS Servicios que nos ofrece POSIX para la gestin

de procesos de acuerdo a: Identificacin de procesos Entorno de un proceso Creacin de procesos Terminacin de procesos

INTRODUCCION Son una familia de estndares de llamadas al sistema operativo definidos por el IEEE y especificados formalmente en el IEEE 1003. Persiguen generalizar las interfaces de los sistemas operativos para que una misma aplicacin pueda ejecutarse en distintas plataformas. Estos estndares surgieron de un proyecto de normalizacin de las API y describen un conjunto de interfaces de aplicacin adaptables a una gran variedad de implementaciones de sistemas operativos. Especifica las interfaces de usuario y software al sistema operativo en 15 documentos diferentes. La lnea de comandos estndar y las interfaces de scripting se basaron en Korn Shell. Otros programas a nivel de usuario (userlevel), servicios y utilidades incluyen AWK, echo, ed y cientos de otras. Los servicios a nivel de programa requeridos incluyen definicin de estndares bsicos de I/O, (file, terminal, y servicios de red). Tambin especifican una API para las bibliotecas de threading, que es muy utilizada en una gran variedad de sistemas operativos. Una serie de pruebas acompaan al estndar POSIX. Son llamadas "PCTS" en alusin al acrnimo "Posix Conformance Test Suite". Desde que la IEEE empez a cobrar altos precios por la documentacin de POSIX y se ha negado a publicar los estndares, ha aumentado el uso del modelo Single Unix Specification. Este modelo es abierto, acepta entradas de todo el mundo y est libremente disponible en Internet. Fue creado por The Open Group.

DESARROLLO 1.1 Identificacin de procesos POSIX identifica cada proceso por medio de un entero nico denominado Identificador de Proceso (Process ID, PID) de tipo pid_t.

a) Obtener el identificador de un proceso: pid_t getpid(void); b) Obtener el identificador del proceso padre: pid_t getppid(void) Ejemplo:
#include <sys/types.h> #include <stdio.h> main(){ 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); }

Identificacin de Hilos As como un proceso tiene un PID (Process Identification), cada hilo tiene un identificador de hilo. Mientras los PID son enteros no negativos, el ID de un hilo es dependiente del SO y puede ser una estructura. Por esto para su comparacin se usa una funcin.

1.2 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 denominan variables de entorno y son accesibles a un proceso a travs de la variable externa environ, declarada de la siguiente forma.
extern char **environ;

Esta variable apunta a una lista de variables de entorno. Esta lista no es ms 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 valor al contenido de la misma. Ejemplo: Programa que imprime el entorno de un proceso
#include <stdio.h> #include <stdlib.h> extern char **environ; int main(int argc, char **argv) { int i; printf("Lista de variables de entorno de %s\n",argv[0]); for (i=0 ; environ[i] != NULL ; i++) printf("environ[%d] = %s\n", i, environ[i]); }

Cada aplicacin interpreta la lista de variables de entorno de forma especfica. POSIX establece el significado de determinadas variables de entorno: HOME: directorio de trabajo inicial del usuario LOGNAME: nombre del usuario asociado a un proceso PATH: prefijo de directorios para encontrar ejecutables TERM: tipo de terminal TZ: informacin de la zona horaria El servicio getenv permite buscar una determinada variable de entorno dentro de la lista de variables de entorno de un proceso.
char *getenv(const char *name);

Esta funcin devuelve un puntero al valor asociado a la variable de entorno de nombre name. Si la variable no se encuentra definida, la funcin devuelve NULL. Ejemplo: Programa que imprime el valor de la variable HOME
#include <stdio.h> #include <stdlib.h> int main(){ 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);

1.3 Creacin de procesos La nica forma es invocando la llamada al sistema fork. El SO realiza una clonacin del proceso que lo solicite. El proceso que solicita el servicio se convierte en el proceso padre del nuevo proceso.
pid_t fork()

La clonacin se realiza copiando la imagen de memoria y la PCB. El proceso hijo es una copia del proceso padre en el instante en que ste solicita al servicio fork. Esto significa que los datos y la pila del proceso hijo son los que tiene el padre en ese instante de ejecucin. Es ms, dado que, al entrar el sistema operativo a tratar el servicio, lo primero que hace es salva los registro en la PCB del padre, al copiarse la PCB se copian los valores salvado de los registro, por lo que el hijo tiene los mismos valores que el padre.

Esto significa que el contador de programa de los dos procesos tiene el mismo valor, por lo que van a ejecutar la misma instruccin mquina. No hay que caer en el error de pensar que el proceso hijo empieza la ejecucin del cdigo en su punto de inicio, sino que el proceso hijo comienza a ejecutar, al igual que el padre, la sentencia que se encuentra despus de fork(). Las diferencias que existen entre el proceso hijo y el padre son: El proceso hijo tiene su propio identificador (PID). El proceso hijo tiene una nueva descripcin de la memoria. Aunque el hijo tenga los segmentos con el mismo contenido, no tienen porque est en la misma zona de memoria.

El tiempo de ejecucin del proceso hijo es igual a cero. Todas la alarmas pendientes se desactiva en el proceso hijo. El conjunto de seales pendientes se pone en cero. El valor que retorna el sistema operativo como resultado de fork() e distinto en el hijo que el padre (el hijo recibe un 0 y el padre el PID del hijo).

Este valor de retorno se puede utilizar mediante una clusula de condicin para que le padre y el hijo sigan flujos de ejecucin distintos.

Las modificaciones que realice el proceso padre sobre sus registros e imagen de memoria despus de fork no afectan al hijo y, viceversa. Sin embargo, el proceso hijo tiene su propia copia de los descriptores del proceso padre. Esto hace que el hijo tenga acceso a los archivos abiertos por el proceso padre. El padre y el hijo comparte el puntero de posicin de los archivos abiertos en el padre. Ejemplo: Programa que crea un proceso
#include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main(){ pid_t pid; pid = fork(); if(pid==-1) /* error del fork() */ printf(Error\n); else if(pid==0) printf("Soy el HIJO, Proceso %d; padre = %d \n", getpid(), getppid()); else printf("Soy el PADRE, Proceso %d\n", getpid()); } // Ejemplo: Programa que crea una cadena de procesos // En cada ejecucin del bucle crea un proceso. El proceso padre obtiene el // Identificador del hijo, que ser distinto de cero y saldr del bucle utilizando // la sentencia break. El proceso hijo Continuar la ejecucin, repitindose // Este proceso hasta que se llegue al final del bucle #include <sys/types.h> #include <stdio.h> #include <unistd.h> int main() { 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.4 Terminacin de procesos El servicio exec de POSIX tiene por objetivo cambiar el programa (el cdigo) que se est ejecutado. Se puede considerar que el servicio tiene dos fases. En la primera se vaca el proceso de casi todo su contenido, mientras en la segunda se carga un nuevo programa. exec no genera ningn proceso nuevo, simplemente cambia el programa que ejecuta el proceso que lo invoc. En el proceso de vaciado de la imagen de memoria se conservan algunos datos como ser: Entorno del proceso que el SO lo incluye en la nueva pila. Ciertos datos de la PCB (PID, PPID, identificador de usuario y descriptores de archivos abiertos).

Fase de carga: Asignar al proceso un nuevo espacio de memoria. Cargar el texto y los datos iniciales en los segmentos correspondientes. Crear la pila inicial del proceso con el entorno y los parmetros que se pasa al programa. Llenar la PCB con los valores iniciales de los registro y la descripcin de los nuevo segmentos de memoria.

BIBLIOGRAFIA
http://www.dachary.edu.ar/materias/SOII/docs/Programacion_en_Linux.pdf http://profesores.elo.utfsm.cl/~agv/elo330/2s08/lectures/POSIX_Threads.html http://es.wikipedia.org/wiki/POSIX