12
May
2012

Forking de procesos en Linux

La creación de procesos en Linux implica dos etapas: forking y exec -me tomo la licencia de denominarlas así por las familias de funciones implicadas en cada caso-.

En la etapa de forking se duplica el proceso que realiza la llamada de creación. Para esta duplicación se crea un nuevo process descriptor -estructura donde se guarda la información del proceso- y se agrega a la lista de process descriptors que maneja el kernel. Este nuevo process descriptor es muy similar al del proceso padre pero difiere en el process id y en los procesos hijos -el proceso recién creado no tiene hijos y el proceso padre pasó a tener un hijo más-.

En cuanto al espacio de memoria del nuevo proceso, se utiliza la técnica de copy on write para lograr una mayor optimización. Empleando esta técnica ambos procesos tienen su espacio de memoria pero esta división comienza siendo “virtual”. A medida que se realizan operaciones de escritura en la memoria, se duplican las páginas que corresponden.

La etapa de exec permite la carga en memoria y ejecución de un binario. Veremos en este artículo solo forking.

A continuación la parte más divertida:

#include <stdio .h>
#include <stdlib .h>
#include <unistd .h>
 
int main(int argc, char* argv[]){
    pid_t id_del_proceso_hijo = fork();
    pid_t proceso_actual = getpid();
    printf("Mensaje de %d: Mi hijo es %d\n", proceso_actual, id_del_proceso_hijo);
    int* status_ptr = malloc(sizeof(int));
    *status_ptr = -1;
    pid_t estado_del_hijo = waitpid(id_del_proceso_hijo, status_ptr, 0x0);
    printf("Mensaje de %d: Espere hasta que se reportó el proceso %d. Info del reporte: %d\n", proceso_actual, estado_del_hijo, *status_ptr);
    return 0;
}
</unistd></stdlib></stdio>


Leer el resto del artículo »

4
Jan
2011

Diferencias entre el kernel de Unix y Linux

Unix y Linux son sistemas operativos diferentes y no existe una derivación histórica entre ambos. Dicho de otro modo: no es trazable código de los laboratorios de AT&T en el código de Linux. Existe de todas formas una relación conceptual, funcional y de implementación del estándar POSIX. Para muchos, la historia entre el primer Unix de 1969 y el primer Linux en 1991 ya es conocida.

Voy a reseñar a continuación algunas diferencias de alto nivel entre ambos kernels:

  • si bien los dos son monolíticos, Linux soporta la carga y descarga de módulos dinámicamente (mientras está en ejecución);
  • Linux tiene soporte para multiprocesamiento simétrico (SMP), múltiples procesadores pueden acceder a una única memoria;
  • el kernel de Linux es preemtive, puede sacar a un proceso del procesador para realizar planificación -algunas versiones de Unix tienen esta característica-;
  • Linux no diferencia entre procesos y threads, los threads son tipos de procesos que comparten memoria;
  • Linux provee un modelo orientado a objetos para las clases de dispositivos, eventos hot-pluggable y dispositivos de sistemas de archivos a nivel de espacio de usuario;
  • Linux ignora algunas características de Unix que sus desarrolladores consideran pobremente diseñadas, como los STREAMS, o que no pueden ser implementadas de forma limpia;
  • Linux es libre, con una política en la que cada agregado debe solucionar un problema real, de forma clara y con una sólida implementación.

Basado en Linux Kernel Development 3ra edición (Robert Love).