miércoles, 28 de septiembre de 2011

INVESTIGACIÓN SOBRE POSIX

POSIX
Es el acrónimo de Portable Operating System Interface; la X viene de UNIX como seña de identidad de la API.
El término fue sugerido por Richard Stallman en respuesta a la demanda de la IEEE, que buscaba un nombre fácil de recordar. Una traducción aproximada del acrónimo podría ser "Interfaz de sistema operativo portable".
Partes
  • POSIX.1, CoreServices (implementa las llamadas del ANSI C estándar). Incluye:
    • Creación y control de procesos.
    • Señales.
    • Excepciones de punto flotante.
    • Excepciones por violación de segmento.
    • Excepciones por instrucción ilegal.
    • Errores del bus.
    • Temporizadores.
    • Operaciones de ficheros y directorios (sobre cualquier fs montado).
    • Tuberías (Pipes).
    • BibliotecaC (Standard C).
    • Instrucciones de entrada/salida y de control de dispositivo (ioctl).
  • POSIX.1b, extensiones para tiempo real:
    • Planificación (scheduling) con prioridad.
    • Señales de tiempo real.
    • Temporizadores.
    • Semáforos.
    • Intercambio de mensajes (messagepassing).
    • Memoria compartida.
    • Entrada/salida síncrona y asíncrona.
    • Bloqueos de memoria.
  • POSIX.1c, extensiones para hilos (threads):
    • Creación, control y limpieza de hilos.
    • Planificación (scheduling).
    • Sincronización.
    • Manejo de señales.
  • POSIX.2, Shell y Utilidades (IEEE Std 1003.2-1992)
    • Intérprete de Comandos
    • Programas de Utilidad
  • POSIX: 2001 o IEEE Std 1003.1-2001 equivale a la versión 3 de Single UNIX Specification.
    • Las base de definiciones, Tema 6.
    • Las interfaces y encabezamientos del sistema, Tema 6.
    • Los comandos y utilidades, Tema 6.
  • POSIX: 2004 o IEEE Std 1003.1-2004 implica una pequeña actualización de POSIX: 2001. Tiene dos correcciones técnicas de errores.
A partir de 2009 POSIX: 2008 o IEEE Std 1003.1-2008 representa la versión actual.
    • La base de definiciones, Tema 7,
    • Las interfaces encabezamientos del sistema, Tema 7.
    • Los comandos y utilidades, Tema 7.

La librería de pthreads es una librería que cumple los estándares POSIX y que nos permite trabajar con distintos hilos de ejecución (threads) al mismo tiempo.
La diferencia entre un thread y un proceso es que los procesos no comparten memoria entre sí, a no ser que se haya declarado explícitamente usando alguno de los mecanismos de IPC (Inter Process Communication) de Unix, mientras que los threads sí que comparten totalmente la memoria entre ellos. Además, para crear threads se usan las funciones de la librería pthread o de cualquier otra que soporte threads mientras que para crear procesos usaremos la llamada al sistema fork (), que se encuentra en todos los sistemas unix.

Ya que pthreads es una librería POSIX, se podrán portar los programas hechos con ella a cualquier sistema operativo POSIX que soporte threads. Ejemplos de ello son IRIX, los unix’ es de BSD, Digital Unix OSF/1, etc.




PROGRAMA UTILIZANDO (threads)
 
pthread_exit(&(p->id));
}
int main(void)
{
int i, *res;
// creamos los threads
printf("Creando threads...\n");
for (i=0; i<MAX_THREADS; i++) {
param[i].cadena = strdup("Hola, soy el thread");
param[i].id = i;
pthread_create(&tabla_thr[i], NULL, (void *)&funcion_thr,
(void *)&param[i]);
}
// esperamos que terminen los threads
printf("Threads creados. Esperando que terminen...\n");
for (i=0; i<MAX_THREADS; i++) {
pthread_join(tabla_thr[i], (void *)&res);
printf("El thread %d devolvio el valor %d\n", i, *res);
}
// sacamos el mensajito y salimos del programa
printf("Todos los threads finalizados. Adios!\n");
return 0;
}
/*** <CORTAR AQUI> ***/
 

/*** <CORTAR AQUI > ***/
/*** Fichero ej1.c *****/
/* Creamos MAX_THREAD threads que sacan por pantalla una cadena y su
identificador. Una vez terminan su ejecucion devuelven como resultado su
identificador */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_THREADS 10
// tabla con los identificadores de los threads
pthread_t tabla_thr[MAX_THREADS];
// tipo de datos y tabla con los parametros
typedef struct {
int id;
char *cadena;
} thr_param_t;
thr_param_t param[MAX_THREADS];
// tenemos que crear una tabla para los parametros porque los pasamos por
// referencia. Asi, si solo tuvieramos una variable para los parametros
// al modificar esta modificariamos todas las que habiamos pasado anteriormente
// porque los threads no se quedan con el valor sino con la direccion
void *funcion_thr(thr_param_t *p)
{
// Esta es la funcion que ejecutan los threads
// como veis, no tiene mucho secreto...
printf("%s %d\n", p->cadena, p->id);
// una vez terminamos, devolvemos el valor

No hay comentarios:

Publicar un comentario