Está en la página 1de 18

TALLER DE PREGUNTAS Y RESPUESTAS - LLAMADAS A SISTEMA PARA EL

CONTROL DE PROCESOS EN LINUX

Instrucciones
Cada equipo de laboratorio deberá responder solo una pregunta de las que se plantean en
el documento. De ser posible, el uso de dibujos y gráficos es altamente recomendado.

Referencias
Una buena parte de la información que aquí se pide puede ser consultada de los siguientes
enlaces:
1. Laboratorio 3-1: Procesos​.
2. Diapositivas clase 2 - Procesos​.
3. google

Este taller está pensado en mejorar muchos de los vacíos que se encuentran en el
documento asociado al enlace 1. Se recomienda una lectura juiciosa ya que de esto
depende el rápido avance del laboratorio el cual va a ser evaluado en la misma clase.

Parte 1. Preguntas teóricas.

Equipo responsable:
● Sebastian Gallego Pulgarin
● Manuel Calle Garcés

1. ¿Que es la ​process table​? Apoyese de un gráfico para hacer más clara la


explicación.

R/: La tabla de procesos es una estructura de datos en el kernel de Linux, que


almacena información sobre todos los procesos actuales, contiene una entrada por
cada proceso presente en el sistema. La tabla de procesos contiene los
identificadores de proceso, el uso de memoria del proceso, qué es el descriptor de
archivo utilizado en el proceso, etc.
Otra respuesta​:
● Paola Andrea Cardona Salcedo.
● Jonathan Payares Acevedo.
La tabla de procesos es una estructura de datos mantenida por el sistema operativo (en la RAM)
para facilitar el cambio de contexto y la programación (scheduling), entre otras actividades. Si
enlazamos todos los ‘bloques de control de procesos’ (PCBs), mediante un array o bien una lista
enlazada, obtenemos la ‘tabla de procesos’. Esta, toma información de cada uno de los
procesos. Cada proceso consta de un identificador (PID, Identificador de Procesos) para un
correcto uso y control.

Equipo responsable:
● Andrés Mauricio Álvarez.
● Andrés Felipe Vásquez.

2. ¿Que es el ​process control block (PCB)​? ¿Qué elementos contiene este?,


explique en lo que consiste cada uno. Apóyese en un dibujo para llevar a cabo la
explicación.

El PCB es una estructura de datos que hace parte de la lista de procesos o de la lista de
tareas del sistema operativo, sirve para rastrear el estado de los procesos en ejecución y
contiene la información necesaria de cada uno de ellos. Esta estructura la podemos hallar
en el kernel del sistema en memoria principal. Cada sistema operativo puede manejar de
forma diferente el PCB ya que no existe un estándar, pero a si manejan una estructura
básica mostrada en la siguiente imagen.

Process ID:​ Identificador único del proceso normalmente conocido como PID.
Process State:​ El estado actual del proceso, ya sea alguno de los estados básicos,
teniendo en cuenta que cada OS puede manejar estos estados de forma independiente.

Pointer​: Puntero a un proceso padre, si se tiene.


Priority​: Es la prioridad que tiene el proceso para ser ejecutado.
Program Counter:​ Apuntador a la siguiente instrucción que se ejecutará en el proceso..
CPU Registers:​ Los registros de CPU que necesita el proceso para su ejecución
IO Status Information:​ Esto incluye una lista de dispositivos de I/O asignados al proceso.
Accounting Information: ​Esto incluye la cantidad de CPU utilizada para la ejecución del
proceso, límites de tiempo, ID de ejecución, etc.
----- Estructura variable del PCB ----

Process Privileges:​ Si el proceso requiere privilegios o no.


CPU Scheduling Information: ​Información de la prioridad para el uso de la CPU
Memory Management Information: ​Esto incluye la información de la tabla de páginas, los
límites de memoria y la tabla de segmentos, dependiendo de la memoria utilizada por el
sistema operativo.

Equipo responsable:
● Arcangel Marin .
● Juan Carlos Londoño.

3. ¿Que es un proceso zombie?, ¿Como puede visualizarse en la terminal?


El proceso zombie se presenta cuando se requiere que las estructuras de datos del sistema
operativo asociadas a un proceso continúen existiendo a pesar de que el proceso haya
finalizado.

Para visualizar cómo se comporta el proceso Zombie se puede ejecutar el siguiente código:

nombre del ejecutable ​make-zombie​:

1  #include <stdlib.h> 
2  #include <sys/types.h> 
3  #include <unistd.h> 
4  int​ ​main​ () { 
5  ​pid_t​ child_pid; 
6  ​/* Creacion del proceso hijo. */ 
7   
8  child_pid = fork (); 
9  ​if​ (child_pid > ​0​) { 
10  ​/*Este es el proceso padre el cual duerme por 20 segundos.*/ 
11  sleep (​20​); 
12  } 
13  ​else​ { 
14  ​/* Este es el proceso hijo el cual culmina inmediatamente.*/ 
15  exit (​0​); 
16  } 
17  return​ ​0​; 

Código 12.​ make-zombie.c 

Ejecute el programa anterior y una vez hecho esto, ejecuta en otra pestaña el comando ps
–o pid,ppid,stat,cmd​.​ se Notará una salida algo similar como la de la siguiente figura:
 

​Salida en pantalla de ps 


 
Observe además del proceso ​make-zombie la existencia de otro proceso (el hijo zombie:
[make-zombie] <defunct>) cuyo código de estado es Z indicando que es zombie.

Otra respuesta​:
● Alejandro Castañeda Villa
● Gilberto Rendon

En sistemas operativos basados en UNIX, un proceso zombie (también llamado proceso


difunto), es un proceso que ha completado su ejecución, pero que todavía tiene una entrada
en la tabla de procesos.

Esta entrada todavía se necesita para permitir al proceso que inició el proceso (ahora
zombie) pueda leer su estado de salida. El comando kill no tiene efecto sobre un proceso
zombie.

Cuando un proceso finaliza, toda la memoria y recursos asociados con este son
desasignados para que puedan ser usados por otros procesos. De todas maneras, la
entrada del proceso permanece en la tabla de procesos. El proceso padre puede leer el
estado de salida del proceso hijo ejecutando la llamada del sistema wait. Luego el estado de
zombie es eliminado.

Después de que el zombie es eliminado, el ID del proceso y la entrada en la tabla de


procesos pueden ser reusados. De todas maneras, si un proceso padre falla en llamar un
wait, el zombie permanecerá en la tabla de procesos (en ciertas situaciones esto puede ser
deseable, por ejemplo, en el caso de que el padre cree otro hijo para asegurar que no será
localizado en el mismo ID de proceso).

Un proceso zombie no es lo mismo que un proceso huérfano. Este último es un proceso que
permanece en ejecución, pero su padre ha muerto.

Los procesos zombies son identificados en la salida del comando "ps" con la presencia la la
letra Z en la columna STAT.
Parte 2. Llamadas a sistema para control de procesos.

La siguiente tabla muestra algunas de las principales llamadas a sistema para el control de
procesos.

Clasificación Funciones

Identificación de procesos pid_t getpid(void)

pid_t getppid(void)

uid_t getuid(void)

uid_t geteuid(void)

gid_t getgid(void)

gid_t getegid(void)

Gestión de procesos pid_t fork(void)

int execl (char *path, char *arg, …)

void exit (int status)

kill

pid_t wait (int *status


int sleep (unsigned int seconds)

El objetivo de cada equipo será describir cada una de las llamadas mostradas en la tabla
anterior. Siga el formato mostrado a continuación con el fin de que la descripción sea
estándar a lo largo del documento:

Equipo responsable:
● Integrante 1.
● Integrante 2.

Funcion getpid

Sintaxis

pid_t​ getpid​(​void)

Librerías ​ sys/types.h>
#include​ <
#include​ <​ unistd.h>
necesarias

Descripción Llamada de sistema que retorna el ID del proceso (PID) del proceso
que la invoca.

Parámetros de ● No tiene
entrada

Valor retornado Retorna un valor con el PID (pid_t) del proceso que invoca la función.

Equipo responsable:
● Arcangel marin.
● Juan Carlos Londoño.

Funcion getppid

Sintaxis

pid_t​ getppid​(​void)

Librerías #include​ ​<sys/types.h>


necesarias #include​ ​<unistd.h>

Descripción La función getppid () devolverá el ID de proceso padre de la llamada


del proceso.

Parámetros de ● No tiene
entrada

Valor retornado Siempre tendrá éxito y no se reservará ningún valor de retorno para
indicar un error.

Equipo responsable:
● Lina María Uribe.
● Santiago Bedoya.

Funcion fork

Sintaxis
pid_t​ fork​(​void)

Librerías #include​ ​<unistd.h> 


necesarias

Descripción Es una función para la Gestión de Procesos.


La función ”fork()” crea un nuevo proceso hijo como duplicado del
proceso que la invoca (padre).

Parámetros de No tiene.
entrada

Valor retornado Cuando la ejecución de la función es exitosa se retorna un valor


diferente para el padre y para el hijo:
*Al padre se le retorna el PID del hijo.
*Al hijo se le retorna 0.
El valor retornado será -1 en caso de que la llamada falle y no se
pueda crear un proceso hijo.

Equipo responsable:
● Luis Ernesto Monsalve
● Yennifer Serna Carvajal
Funcion getuid

Sintaxis

uid_t​ getuid(​void​)

Librerías ​ sys/types.h>
#include​ <
#include​ <​ unistd.h>
necesarias

Descripción La función getuid() devuelve el ID del usuario real del proceso actual.
El identificador real corresponde con el del proceso invocador.

Parámetros de No tiene.
entrada

Valor retornado Retorna el identificador del usuario real del proceso de llamada.

Equipo responsable:
● Yeison Ballesteros
● Integrante 2.

Funcion getgid

Sintaxis

gid_t​ getgid(​void​)

Librerías ​ sys/types.h>
#include​ <
necesarias #include​ <​ unistd.h>

Descripción Función que devuelve el ID(identificador) real del grupo del proceso
actual.

Parámetros de Ninguno
entrada

Valor retornado Retorna valor con el ID del grupo del proceso llamante. Esta función
no tiene error.

Equipo responsable:
● Daniel Fernando Areiza Agudelo
● Integrante 2.

Funcion exit

Sintaxis

void​ ​exit​(​int​ status);

Librerías #include <stdlib.h> 


necesarias  

Descripción Esta función causa la terminación normal de un proceso. La variable


entera status es empleada para transmitir al proceso padre la forma
en que el proceso hijo ha terminado. Por convención este valor suele
ser 0 si el programa termina de manera exitosa u otro valor cuando la
terminación de este es anormal.

Parámetros de ● void exit(0)


entrada

Valor retornado Ninguno

Equipo responsable:
● Juan pablo Jaramillo Tobon
● Hector mauricio Guerra

Funcion geteuid

Sintaxis

uid_t​ geteuid​(​void)
Librerías ​ sys/types.h>
#include​ <
#include​ <​ unistd.h>
necesarias

Descripción Retorna el identificador de usuario efectivo. Si el programa tiene


el bit setuid fijado, el programa puede correr con los permisos
del "owner" independientemente

Parámetros de ● No tiene
entrada

Valor retornado entero ID de el usuario efectivo (usuario en el cual se está ejecutando


el proceso, no confundir con el usuario que lanzó el proceso)

Equipo responsable:
● Raúl Andrés Arcila Rodríguez

Funcion Sleep()

Sintaxis sleep(int second)

Librerías ​ sys/types.h>
#include​ <
#include​ <​ unistd.h>
necesarias

Descripción Sleep() hace que el hilo de llamada esté inactivo hasta que hayan
transcurrido ciertos segundos o hasta que llegue una señal que no se
ignore.

Parámetros de ● número de segundos que se quiere esperar.


entrada

Valor retornado Retorna cero si el tiempo solicitado a transcurrido, o el número de


segundos que quedan para “dormir”, si la llamada fue interrumpida por
un “signal handler”

Equipo responsable:
● Juan José Márquez Villacís
● Andrés Felipe Isaza

Funcion kill

Sintaxis

int ​kill​(pid_t ​pid​, int ​sig​)


Librerías #include ​<​signal.h​>
necesarias

Descripción Envía una señal a un proceso o a un grupo de procesos. Un proceso


puede enviar señales a otro proceso que tenga el mismo ID real o
efecto o siempre y cuando tenga los permisos para hacerlo. Un
programa puede hacer un llamada kill() a sí mismo.

Parámetros de ● pid_t pid: ​Especifica el proceso al cual se le quiere enviar la


entrada señal.
○ Si pid > 0, se enviará una señal al proceso cuyo ID sea
igual a pid.
○ Si pid = 0, se enviará una señal a todos los procesos
cuyos ID de grupo sea igual al del proceso que envía la
señal (excepto de los que no posee permisos para
hacerlo).
○ Si pid < -1, se envía la señal a todos los procesos cuyo
ID de grupo sea igual al valor absoluto de pid.
● int sig: ​Especifica la señal que debe ser enviada al proceso.
Las lista de señales se puede consultar en la siguiente ​enlace​,
en la sección ​signals.​

Valor retornado La función retorna 0 si el proceso tiene permiso para enviar la señal.
Si el envío de la señal falla, retorna -1.

Equipo responsable:
● Julian Angel Gallego.
● David Andres Quiroga.

Funcion execl

Sintaxis
int execl(const char *path, const char *arg, ..., NULL);

Librerías #include​ ​<unistd.h>


necesarias

Descripción La familia de funciones exec reemplaza el proceso actual en ejecución


con un nuevo proceso.
Parámetros El primer argumento de esta función es el camino de un fichero que va a
de entrada ser ejecutado.

Los argumentos ​char *arg, ..., NULL​ describe una lista de uno o más
punteros a cadenas terminadas en nulo que representan la lista de
argumentos disponible para el programa ejecutado.

Valor Si ocurre algún error, entonces execl () devuelve -1. De lo contrario, no


retornado devuelve nada.
Equipo responsable:
● Juan Camilo Rojas

Funcion getegid

Sintaxis
git_t​ getegid​(​void)

Librerías ​ unistd.h>
#include​ <
#include​ <​ sys/types.h>
necesarias

Descripción Devuelve el identificador “Efectivo” del grupo del proceso actual.

Parámetros Ninguno
de entrada

Valor Retorna el valor con el ID efectivo corresponde al bit ID establecido en


retornado el fichero que se está ejecutando. Esta función no tiene error.

Equipo responsable:
● Jhonatan Alejandro Torres Vasco
● Juan Fernando Mosquera

Funcion execl

Sintaxis
int execl(const char *​path​, const char *​arg​, ...);

Librerías #include​ ​<unistd.h>


necesarias

Descripción Reemplaza la imagen del proceso en curso con una nueva.

Parámetros El primer argumento (path), por convenio, debe apuntar al nombre del
de entrada fichero asociado con el fichero que se esté ejecutando, seguido de
n cantidad de argumentos que son una lista de apuntadores a cadenas
de caracteres terminadas en cero, los cuales representan la lista de
argumentos disponibles para el programa ejecutado, y su último
argumento debe ser un puntero NULL.

Valor Si cualquiera de las funciones ​exec​ regresa, es que ha ocurrido un


retornado error. El valor de retorno es -1, y en la variable global errno se pondrá el
código de error adecuado.

Parte 3​. Interpretación de gráficas.

Equipo responsable:
● Integrante 1.Edison Bedoya García
● Integrante 2.Deyber Sepulveda Tuberquia

Dado el siguiente diagrama de tiempo (timing diagram). ¿Cuál cree que sea el contenido del
archivo thefile.txt?
El contenido será:
This is the Parent
hi it’s me. i’m back
Child write
ya que el diagrama de tiempo así indica el orden en que se escriben los datos, pero al estar
el waitpid al final del hijo, cualquier de los dos procesos se puede ejecutar, y la otra posible
salida es:
This is the Parent
Child write
hi it’s me. i’m back
Equipo responsable:
● Santiago López
● Juan Pablo Posada

Dado el siguiente diagrama de tiempo (timing diagram). ¿Cuál cree que sea el contenido del
archivo thefile.txt?, ¿En que cambia respecto al anterior?

RTA/= El contenido de thefile.txt será:


This is the parent
Hi it ´s me. I´m back
Child write

Sucede lo mismo que en el ejemplo anterior, no se tiene certeza de cual proceso se


terminará de ejecutar primero, por lo tanto no se tendrá certeza de si primero se escribirá el
“Hi it ´s me. I´m back” o el “Child write”
Equipo responsable:
● Juan Esteban Rodas
● Integrante 2.

Funcion waitCódigo 12. make-zombie.c

Sintaxis

pid_t​ wait​(​int ​*status​)

Librerías ​ sys/types.h>
#include​ <
#include​ <​ sys/wait.h>
necesarias

Descripción Esta función suspende la ejecución del proceso padre hasta que su
hijo termine.

Parámetros de status es el puntero a la dirección donde la llamada al sistema debe


entrada almacenar el estado de finalización, o valor de retorno del proceso hijo
Valor retornado Retorna un entero que contiene el PID del proceso hijo que finalizó o
-1 si no se crearon hijos o si ya no hay hijos por los cuales esperar.

También podría gustarte