Procesos

Para poder entender bien el concepto de Proceso deberemos diferenciarlo en el lugar donde se encuentra. Un programa será un archivo cuando se encuentre en el disco rígido y será un proceso al encontrarse en memoria; de esta forma se comprenderá mejor que es un Proceso. Pero también es cierto que un proceso es mucho mas que un programa en memoria y sobre todo en la clase de SO que nos compete, con sus funciones de multiusuario y multitarea como lo son los SO Un*x.

Cada programa cuenta con un conjunto de datos que usa para hacer su trabajo y en la mayoría de los casos estos datos no forman parte del programa. Como ejemplo tomemos un programa de edición de textos. Los datos del archivos que el programa esta editando no forma parte del programa, pero si del proceso en memoria. Si alguna otra persona utilizara al mismo tiempo el mismo procesador de texto que se encuentra en ese sistema, los dos estarían utilizando el mismo programa, pero no el mismo proceso. Ambas tendrían una copia para cada uno del proceso del editor de texto. Es así que los programas podrán ser únicos para todos los usuarios, pero los procesos pertenecerán a cada usuario.

En Un*x varios usuarios podrán estar utilizando el sistema al mismo tiempo. Esto se traduce a que el sistema tendrá múltiples procesos cargados en la memoria, y cada uno de ellos requerirá de la atención de la CPU en algún momento. El sistema llevará un control de los procesos que están funcionando en ese momento, en que terminal y a que usuario pertenece además de otros datos. Todo ello estará apuntado en una tabla de procesos, en la cual el SO asignará el tiempo que tardará la CPU para atender cada proceso.

Cuando uno entra a un sistema Un*x, generalmente obtiene accesos a lo que se denomina intérprete de comandos. La gente que haya utilizado DOS sabrá que esto, ya que el C:> es el indicador de shell de su interprete de comando, el COMMAND.COM. En cambio, aquí el indicador será algo como $, # o %. Este shell es un proceso que esta corriendo y pertenece al usuario que esta corriéndolo en ese momento. En realidad es una copia del intérprete de comandos que esta corriendo en memoria.

Al cargarse un programa desde el intérprete de comando (shell), este no es reemplazado por dicho proceso, sino que queda a la espera de algún otro mandato. Mientras tanto, para correr el programa, se crea un nuevo proceso, el del programa, que será hijo del proceso del shell. Un proceso tiene un solo padre pero puede tener múltiples hijos.

Al iniciar una sesión en GNU/Linux el usuario será propietario de un único proceso, por ejemplo /bin/bash que es el intérprete de comandos mas usados y el que usaremos nosotros. Luego cada proceso que ejecute a partir del bash, se acomodará en el árbol de procesos como hijo del bash.

El bash permanecerá atento a que se le de un nuevo mandato, mientras tanto se dice que esta durmiendo. Como habíamos dicho antes, múltiples procesos podrán estar ejecutándose al mismo tiempo. Por ello se tendrá que asignar un tiempo a cada proceso para recibir la atención exclusiva la CPU. Es común que cada proceso tenga por 1/100 segundos la atención total de la CPU. Esto dará la ilusión al usuario de que es el único que tiene la atención del sistema, pero que ocurriría si el proceso se colgase. En un sistema monousuario como el Windows (no el NT) esto seguramente ocasionaría el cuelgue del sistema ya que el kernel no podría recuperarse dado que el proceso tiene control absoluto de la CPU. Esto no ocurre en GNU/Linux dado que todos los procesos responden al kernel y es el kernel quien les da permiso de usar la CPU en el momento necesario.

Supongamos que queremos guardar nuestro trabajo del editor de textos. Entonces, y con la combinación de teclas correctas, le damos la orden al proceso del editor de textos para que guarde el trabajo. Esto, para nosotros, se hace instantáneamente pero es solo otra ilusión. El proceso del editor de textos emite una petición al kernel para escritura del disco, el kernel entonces escribirá el disco en bloques, dependiendo de cuan libre este, mientras tanto guardara los datos en un espacio secundario de almacenamiento denominado "cache". Esto es beneficioso por varias razones. En caso de que los datos que estemos escribiendo en ese momento sean requeridos un momento después, estos estarían disponibles en el cache y se ahorraría un viaje al disco. También seria beneficioso por el lado de la eficiencia del sistema, ya que escribirá al disco solo cuando el procesador este ocioso, no ocasionando con el proceso de escritura que el sistema funcionara más lentamente. Suponiendo que alguna otra persona necesitara en ese momento un dato del disco, el proceso de lectura tendría que esperar su turno, entonces es puesto a dormir. El proceso tendrá que esperar a que se termine el tiempo asignado al proceso de escritura y luego se le despertara y podrá tomar su lugar para acceder al disco.

Existe también otro tipo de eventos en los que la CPU repara para poder detener a un proceso en curso, estos son las interrupciones. Se ocasionan cuándo un dispositivo, léase mouse o teclado, requiere la atención de la CPU, es asi que se genera una interrupción que la CPU atenderá, mandando a dormir al proceso en curso. Por supuesto hay mas complicaciones que las expuestas aquí, entre ellas las prioridades de los procesos que se verán cuando tomemos la parte de 6.7 de Tareas y Procesos. El tema de prioridades lo maneja el kernel de acuerdo a varios aspectos, como el dueño del proceso, si es de sistema o no, etc. Los procesos de sistemas son utilizados para la administración de memoria y la calendarización de turnos para la CPU, etc. Estos procesos se los conoce como daemon (DEMONIOS) o programas servidores. Funcionan sin la intervención del usuario y sin que este los vea y hacen su trabajo esperando su turno cuando les llega para actuar.