Procesos
Procesos
Se le llama proceso a un programa en ejecución y al objeto abstracto que crea el sistema operativo para manejar el acceso de ese programa a los recursos del sistema (memoria,CPU, dispositivos de E/S). En el sistema puede coexistir varias instancias de un mismo programa ejecutándose a la misma vez, cada uno de estos se toman como un proceso diferente. Unix es un sistema multiproceso por tiempo compartido, se dice así debido a que a los ojos de un usuario en un momento dado hay multiples programas ejecutandose, sin embargo en una maquina con un solo procesador hay en cada instante un proceso ejecutando. El encargado de hacer que parezca que se están ejecutando todos simultáneamente es el procesador, este va rotando el uso del procesador a intervalos breves entre los procesos definidos en el sistema.
Tipos
Procesos del sistema: son aquellos asociados al funcionamiento local de la máquina, kernel, o procesos (daemons) asociados a diferentes servicios (locales o de red).
Procesos del usuario administrador: en caso de actuar como tal, nuestros procesos aparecerán asociados al usuario root.
Procesos del usuario del sistema: asociados a la ejecución de sus aplicaciones.
Información almacenada por el kernel
Para cada proceso definido en el sistema, el kernel del sistema operativo almacena y mantiene al día varios tipos de información sobre el proceso. Esta información podemos ordenarla de la siguiente forma:
- Información general. Identificadores de proceso, usuario y grupo
- Ambiente (variables, directorio actual, etc.)
- Información de E/S
- Información de Estado
- Espacio de direcciones del proceso.
Identificadores
Cuando se crea un proceso se le asigna un === Información almacenada por el kernel ===
Para cada proceso definido en el sistema, el kernel del sistema operativo almacena y mantiene al día varios tipos de información sobre el proceso. Esta información podemos ordenarla de la siguiente forma:
- Información general. Identificadores de proceso, usuario y grupo
- Ambiente (variables, directorio actual, etc.)
- Información de E/S
- Información de Estado
- Espacio de direcciones del proceso.
Identificadores
Cuando se crea un proceso se le asigna un identificador unico. Este numero debe utilizarse por el administrador para referirse a un proceso dado al ejecutar un comando.
- Process ID (PID): este es asignado por el sistema a cada nuevo proceso en orden creciente empezando desde cero. Si antes de reiniciar el sistema se llega al numero maximo, se vuelve a comenzar desde cero, salteando los procesos que aun esten activos.
- Parent Process ID (PPID): la creación de nuevos procesos en Unix se realiza por la vía de duplicar un proceso existente invocando al comando fork(). Al proceso original se le llama "padre" y al nuevo proceso "hijo". El PPID de un proceso es el PID de su proceso padre. El mecanismo de creación de nuevos procesos en Unix con el comando fork().
- UID y EUID:el User ID (UID) del proceso identifica al creador del proceso, esto es a la persona que lo lanzó a correr. Este usuario y root son los únicos que pueden modificar al proceso. El UID se utiliza con fines de tarificación o accounting. El sistema de accounting carga a la cuenta del usuario identificado por el UID del proceso por los recursos del sistema que el proceso utilice (tiempo de CPU, impresoras, terminales, etc.). El Effective User ID es cambio se utiliza para determinar si el proceso tiene permiso para acceder a archivos y otros recursos del sistema.
- GID y EGID: El GID se hereda del proceso padre, el EGID puede utilizarse igual que el EUID para controlar el acceso del proceso a archivos.
Estado de un proceso
- asleep (durmiendo): En general a la espera de algun recurso compartido.
- runnable (listo para ejecutar): A la espera que le toque el turno en el uso de la CPU.
- running (ejecutando): ejecutado en modo kernel o en modo usuario.
- stopped (detenido): el estado stopped es el estado en que queda un proceso lanzado a correr desde un interprete de comandos (shell) cuando se presiona <Control-Z> o la tecla configurada como "suspend" en el terminal que estemos utilizando.
- zombie : un proceso en este estado está en proceso de terminación.
Objetivos
- Manejar y listar procesos
- Detener procesos por linea de comando
- Cambiar prioridad de procesos
- Modificar prioridad de procesos ejecutandose.
Software
Comandos
El comando top muestra a tiempo real un listado de los procesos que se estan ejecutando en el sistema.
top
El comando ps muestra un listado de los procesos que se están ejecutando en el sistema. Si solamente presionamos ps mostrara los procesos del usuarios el cual este logueado.
ps
Este comando se utiliza para enviar mensajes sencillos a los procesos ejecutándose en el sistema. El mensaje por defecto que envía es el de terminación.
kill
Este comando modifica la prioridad de procesos, la prioridad que se emplea con este comando varia desde -20 a +20, siendo -20 la prioridad máxima, esto significa que va a utilizar mas recursos del sistema, en comparación con los otros procesos en ejecución.
nice
Altera la prioridad de uno o mas procesos en ejecución. Aplicar este comando a un grupo de procesos, provoca que todos los procesos del grupo de procesos vean alterada su prioridad.
renice
Es una utilidad para la comprobación de errores de comandos. Cada vez que strace es ejecutado, puede registrar todos los archivos utilizados y el comando usado en un stack, el cual puede ser utilizado en un archivo de salida, este es una herramienta muy potente. Su uso mas frecuente consiste en arrancarlo junto a un programa al que se le va a efectuar el trazado, este imprime una lista de llamadas al sistema que dicho programa ejecuta.
strace
En algunos sistemas está disponible el comando pstree, que lista los procesos y sus descendientes en forma de árbol. Esto permite visualizar rápidamente los procesos que están corriendo en el sistema.
pstree
Procedimientos
Los objetivos de esta sección son mostrar un podo de manera resumida la salida de dichos comandos, para luego poder realizar algún experimento respecto a ellos.
Comando ps
En esta sección vamos a mostrar como poder usar el comando ps, algo muy importante que el estudiante debe realizar siempre antes de ejecutar una comando es buscar en las paginas man o --help.
ps --help
********* simple selection ********* ********* selection by list ********* -A all processes -C by command name -N negate selection -G by real group ID (supports names) -a all w/ tty except session leaders -U by real user ID (supports names) -d all except session leaders -g by session OR by effective group name -e all processes -p by process ID T all processes on this terminal -s processes in the sessions given a all w/ tty, including other users -t by tty g OBSOLETE -- DO NOT USE -u by effective user ID (supports names) r only running processes U processes for specified users x processes w/o controlling ttys t by tty *********** output format ********** *********** long options *********** -o,o user-defined -f full --Group --User --pid --cols --ppid -j,j job control s signal --group --user --sid --rows --info -O,O preloaded -o v virtual memory --cumulative --format --deselect -l,l long u user-oriented --sort --tty --forest --version -F extra full X registers --heading --no-heading --context ********* misc options ********* -V,V show version L list format codes f ASCII art forest -m,m,-L,-T,H threads S children in sum -y change -l format -M,Z security data c true command name -c scheduling class -w,w wide output n numeric WCHAN,UID -H process hierarchy
A continuación algunos cuantos ejemplos de ps con la salida recortada.
- La opción -e muestra todos los procesos:
ps -e
PID TTY TIME CMD 1 ? 00:00:01 init 2 ? 00:00:00 kthreadd 3 ? 00:00:00 migration/0 4 ? 00:00:00 ksoftirqd/0
- La opción-f muestra opciones completas:
ps -ef
UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:12 ? 00:00:01 init [5] root 2 0 0 10:12 ? 00:00:00 [kthreadd] ... root 6130 5662 0 10:24 pts/0 00:00:00 su - root 6134 6130 0 10:24 pts/0 00:00:00 -bash maximili 6343 5604 0 10:28 ? 00:00:00 kio_file [kdeinit] file /home/sergon/tmp/ksocket-sergon/kl root 6475 6134 0 10:38 pts/0 00:00:00 ps -ef
- La opcion -F muestra opciones completas extra:
ps -eF UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 1 0 0 412 556 1 16:59 ? 00:00:01 init [5] root 2 0 0 0 0 1 16:59 ? 00:00:00 [kthreadd] maximili 8326 8321 0 902 1272 0 17:07 ? 00:00:00 /bin/sh /usr/lib/firefox-2.0.0.8/run-mozilla.sh /usr/lib/f maximili 8331 8326 4 53856 62604 0 17:07 ? 00:00:50 /usr/lib/firefox-2.0.0.8/mozilla-firefox-bin maximili 8570 7726 2 15211 37948 0 17:17 ? 00:00:10 quanta
- El siguiente comando muestra el formato BSD sin guión, a muestra todos, x sin mostrar tty:
ps ax (formato BSD sin guión, a muestra todos, x sin mostrar tty) PID TTY STAT TIME COMMAND 1 ? Ss 0:01 init [5] 2 ? S< 0:00 [kthreadd] 3 ? S< 0:00 [migration/0] 4 ? S< 0:00 [ksoftirqd/0]
- EL siguiente comando muestra formato BSD sin guión, u muestra usuarios y demás columnas:
ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1648 556 ? Ss 16:59 0:01 init [5] root 2 0.0 0.0 0 0 ? S< 16:59 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S< 16:59 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S< 16:59 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 16:59 0:00 [migration/1]
- Otros comandos útiles:
ps -eH (muestra árbol de procesos) ps axf (lo mismo en formato BSD) ps -ec (el comando que se esta ejecutando, sin la ruta, solo el nombre real) ps -el (muestra formato largo de varias columnas, muy práctico) ps L (No muestra procesos, lista todos los códigos de formatos)
Comando top
Este comando es muy usado para poder monitorear procesos en tiempo real y de otras variantes del sistema, este por defecto se actualiza cada 3 segundos, esto obviamente se puede modificar.
top
top - 00:43:58 up 57 min, 2 users, load average: 1.19, 1.08, 1.06 Tasks: 149 total, 1 running, 148 sleeping, 0 stopped, 0 zombie Cpu(s): 2.7%us, 0.9%sy, 0.0%ni, 96.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 3853108k total, 1429160k used, 2423948k free, 108328k buffers Swap: 2480124k total, 0k used, 2480124k free, 575100k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1663 maximili 20 0 980m 417m 36m S 7 11.1 9:04.81 firefox-bin 2267 maximili 20 0 264m 15m 10m S 6 0.4 2:50.65 xfce4-taskmanag 2320 maximili 20 0 108m 28m 13m S 2 0.8 1:10.71 npviewer.bin 950 root 20 0 192m 28m 12m S 2 0.7 2:35.60 Xorg 2305 maximili 20 0 232m 18m 14m S 1 0.5 0:29.15 plugin-containe 3058 root 20 0 0 0 0 S 0 0.0 0:03.76 kworker/0:1 4332 root 20 0 0 0 0 S 0 0.0 0:01.08 kworker/0:3 4994 root 20 0 0 0 0 S 0 0.0 0:01.18 kworker/3:2 5508 maximili 20 0 19352 1336 964 R 0 0.0 0:00.05 top 1 root 20 0 24136 2192 1332 S 0 0.1 0:01.19 init 2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0 0.0 0:00.42 ksoftirqd/0 6 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/0 7 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/1 9 root 20 0 0 0 0 S 0 0.0 0:00.39 ksoftirqd/1 11 root RT 0 0 0 0 S 0 0.0 0:00.00 migration/2 13 root 20 0 0 0 0 S 0 0.0 0:00.05 ksoftirqd/2
Comando kill
El comando kill como describe su nombre es matar (un comando un poco violento), este sirve no solo para matar procesos sino para enviar senales a los procesos. La senal que este comando envía por defecto es matar el proceso.
SYNTAXIS:
kill [signal] PID
Para ver la lista de senales disponibles presionamos el comando:
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
Las señales más comunes son la 19 y 20 que detienen momentáneamente la ejecución de un proceso o programa, 18 la continua, 1 que es la señal de hang up que obliga al proceso a releer sus archivos de configuración estando en ejecución y 9 que termina rotundamente un proceso.
Verificación
Comandos útiles:
- ps: lista los procesos con los datos de usuario, tiempo, identificador de proceso y terminal usado. Una de las opciones más utilizadas es ps -axu (ver página man).
- top: da una lista actualizada de los procesos, monitorizando dinámicamente los cambios. Además da información de CPU, memoria y swap. Útil en situaciones de saturación de uso de recursos.
- kill: permite eliminar procesos del sistema mediante el envío de señales al proceso. Útil en programas con comportamiento inestable o programas interactivos que por alguna razón dejan de responder (ver man 7 signal).
- nice: modifica la prioridad de un proceso, esta es un número n entre -20 y 20, la máxima prioridad es -20. Si no se define se corre el proceso con prioridad 0.
- renice: igual que nice pero utiliza el número de proceso (PID).
- strace: utilitario para hacer un "debug" a un comando particular, muestra todos los pedidos que se le hace al sistema.