Diferencia entre revisiones de «Procesos»

De CURE - Informática
Ir a la navegación Ir a la búsqueda
 
(No se muestran 53 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
=== 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.
+
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 múltiples programas ejecutándose, 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==
+
===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 sistema:''' son aquellos asociados al funcionamiento local de la máquina, kernel, o procesos (daemons) asociados a diferentes servicios (locales o de red).
Línea 10: Línea 10:
  
 
'''Procesos del usuario del sistema:''' asociados a la ejecución de sus aplicaciones.
 
'''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 identificador único. Este número 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 máximo, se vuelve a comenzar desde cero, salteando los procesos que aun estén 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 algún 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==
 
==Objetivos==
Línea 18: Línea 44:
 
*Modificar prioridad de procesos ejecutandose.
 
*Modificar prioridad de procesos ejecutandose.
  
==Comandos==
+
==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
  
El comando ''top'' muestra a tiempo real un listado de los procesos que se estan ejecutando en el sistema
+
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.
 +
 
 +
=== Comando nice ===
 +
 
 +
Este comando puntualmente a mi me pareció el mas interesante de todos los anteriores debido a que nunca me imagine que se le pudieran dar prioridad a los procesos que se están corriendo en el sistema. Cuando hay más de un proceso en el listado de 'listo para ejecutar', el kernel le asigna el uso de la CPU al de mayor prioridad en ese momento. En todas las distribuciones de Unix se utilizan diferentes algoritmos de planificación del uso de la CPU, pero en todas estas se cumplen:
  
ps
+
*procuran ser justos con los diferentes procesos.
 +
*procuran dar buena respuesta a programas interactivos.
  
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.
+
Para poder hacer esto lo que se considera es cuanto uso de CPU ha hecho el proceso recientemente. El dueño de un proceso puede influir en el algoritmo de scheduling a través del comando '''nice''', un poco resumido, este numero que se le asigna a cada proceso indica que tan 'nice'(agradable) es para los demás procesos, el valor que el comando da es de -20 a 20, siendo por defecto el 0.
  
kill
+
=== Comando renice ===
  
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.
+
Este comando es muy similar al '''nice''' la única diferencia es que este realiza el cambio de prioridad mientras el proceso esta en ejecución.
  
  nice
+
  nice -n -10 top  (se ejecuta el comando '''top''' con prioridad -10)
  
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.
+
En otra terminal se ejecuta el comando:
  
  renice
+
  '''ps -el''' (para ver prioridad del proceso que dejamos corriendo).
 +
F S  UID  PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
 +
4 S    0  2493  2492  0  70 -10 -  4838 poll_s pts/1    00:00:00 top
  
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.
+
Ahora iremos a probar el comando '''renice''', lo que vamos a hacer es cambiar de prioridad, cambiamos de -10 a 20. Luego de esto verificamos si esto funcioná.
  
  strace
+
  renice 20 2493
  
==Procedimientos==
+
ps -el
==Verificación==
+
F S  UID  PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
 +
4 S    0  2493  2492  0  99  19 -  4838 poll_s pts/1    00:00:02 top
 +
 
 +
=== Comando vmstat ===
 +
 
 +
Este comando lo que hace es reportarle estadísticas que mantiene el kernel sobre los procesos, la memoria y otros recursos del sistema. Algunos de los campos que muestra este comando:
 +
 
 +
*Cantidad de procesos en distintos estados.
 +
*Muestra valores asignadados a procesos  y libre.
 +
*Operaciones de disco.
 +
*También muestra el uso CPU clasificado en inactivo.
 +
 
 +
Esta es la salida de este comando:
 +
 
 +
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 +
r  b  swpd  free  buff  cache  si  so    bi    bo  in  cs us sy id wa
 +
0  0      0 2249308 278760 604764    0    0    46    27  229  606  5  2 93  0
 +
 
 +
=== Comando pstree ===
 +
 
 +
Este comando  da una lista de los procesos y sus descendientes en forma de árbol.
  
== Comandos útiles: ==
+
pstree
  
 +
init─┬─NetworkManager─┬─pppd
 +
      │                └─2*[{NetworkManager}]
 +
      ├─VBoxSVC───10*[{VBoxSVC}]
 +
      ├─VBoxXPCOMIPCD
 +
      ├─VirtualBox───4*[{VirtualBox}]
 +
      ├─acpid
 +
      ├─applet.py
 +
      ├─atd
 +
      ├─avahi-daemon───avahi-daemon
 +
      ├─console-kit-dae───64*[{console-kit-da}]
 +
      ├─cron
 +
      ├─cupsd
 +
      ├─2*[dbus-daemon]
 +
      ├─dbus-launch
 +
      ├─firefox-bin─┬─plugin-containe─┬─npviewer.bin───12*[{npviewer.bin}]
 +
      │            │                └─{plugin-contain}
 +
      │            └─19*[{firefox-bin}]
 +
      ├─gconfd-2
 +
      ├─gdm-binary─┬─gdm-simple-slav─┬─Xorg
 +
      │            │                ├─gdm-session-wor─┬─sh─┬─ssh-agent
 +
      │            │                │                │    ├─xfce4-session─┬─Th+
 +
      │            │                │                │    │              ├─xf+
 +
      │            │                │                │    │              ├─xf+
 +
      │            │                │                │    │              ├─xf+
 +
      │            │                │                │    │              └─{x+
 +
      │            │                │                │    └─xscreensaver
 +
      │            │                │                └─{gdm-session-wo}
 +
      │            │                └─{gdm-simple-sla}
 +
      │            └─{gdm-binary}
 +
      ├─6*[getty]
 +
      ├─gnome-keyring-d───2*[{gnome-keyring-}]
 +
      ├─gnome-settings-
 +
      ├─gvfs-afc-volume───{gvfs-afc-volum}
 +
      ├─gvfs-fuse-daemo───3*[{gvfs-fuse-daem}]
 +
      ├─gvfs-gdu-volume
 +
      ├─gvfs-gphoto2-vo
 +
      ├─gvfsd
 +
      ├─gvfsd-trash
 +
      ├─indicator-appli───{indicator-appl}
 +
      ├─indicator-messa───{indicator-mess}
 +
      ├─indicator-sound───{indicator-soun}
 +
      ├─irqbalance
 +
      ├─modem-manager
 +
      ├─mount.ntfs
 +
      ├─nm-applet───{nm-applet}
 +
      ├─ntpd
 +
      ├─polkit-gnome-au───{polkit-gnome-a}
 +
      ├─polkitd───{polkitd}
 +
      ├─pulseaudio───2*[{pulseaudio}]
 +
      ├─rsyslogd───3*[{rsyslogd}]
 +
      ├─rtkit-daemon───2*[{rtkit-daemon}]
 +
      ├─udevd───2*[udevd]
 +
      ├─udisks-daemon─┬─udisks-daemon
 +
      │              └─2*[{udisks-daemon}]
 +
      ├─update-notifier───{update-notifie}
 +
      ├─upowerd───{upowerd}
 +
      ├─upstart-socket-
 +
      ├─upstart-udev-br
 +
      ├─wpa_supplicant
 +
      ├─xfce4-notifyd
 +
      ├─xfce4-power-man
 +
      ├─xfce4-settings-
 +
      ├─xfce4-terminal─┬─bash───pstree
 +
      │                ├─bash───sudo───top
 +
      │                ├─bash
 +
      │                ├─gnome-pty-helpe
 +
      │                └─{xfce4-terminal}
 +
      ├─xfce4-volumed───4*[{xfce4-volumed}]
 +
      ├─xfconfd
 +
      ├─xfrun4
 +
      └─xfsettingsd
  
* 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).
+
==== Observaciones ====
* 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.
 
  
 +
Hay que tener en cuenta que todas las salidas mostradas anteriormente son un ejemplo, otra cosa es que tal vez que a la hora de ejecutar alguno de estos comando les pida tener privilegios de administradores. Se recomienda en caso de dudas las paginas '''man''' de comando.
  
 
 
== Referencias ==
 
== Referencias ==
  
http://ocw.uoc.edu/informatica-tecnologia-y-multimedia/administracion-avanzada-del-sistema-operativo-gnu-linux/materiales/
+
http://iie.fing.edu.uy/ense/asign/admunix/procesos.htm
 
 
http://www.vik.mx/blog/?p=20
 
  
http://en.wikipedia.org/wiki/Nice_(Unix)
+
[[Category:Descontinuadas]]

Revisión actual - 16:30 14 ene 2022

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 múltiples programas ejecutándose, 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 identificador único. Este número 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 máximo, se vuelve a comenzar desde cero, salteando los procesos que aun estén 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 algún 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.

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.

Comando nice

Este comando puntualmente a mi me pareció el mas interesante de todos los anteriores debido a que nunca me imagine que se le pudieran dar prioridad a los procesos que se están corriendo en el sistema. Cuando hay más de un proceso en el listado de 'listo para ejecutar', el kernel le asigna el uso de la CPU al de mayor prioridad en ese momento. En todas las distribuciones de Unix se utilizan diferentes algoritmos de planificación del uso de la CPU, pero en todas estas se cumplen:

  • procuran ser justos con los diferentes procesos.
  • procuran dar buena respuesta a programas interactivos.

Para poder hacer esto lo que se considera es cuanto uso de CPU ha hecho el proceso recientemente. El dueño de un proceso puede influir en el algoritmo de scheduling a través del comando nice, un poco resumido, este numero que se le asigna a cada proceso indica que tan 'nice'(agradable) es para los demás procesos, el valor que el comando da es de -20 a 20, siendo por defecto el 0.

Comando renice

Este comando es muy similar al nice la única diferencia es que este realiza el cambio de prioridad mientras el proceso esta en ejecución.

nice -n -10 top   (se ejecuta el comando top con prioridad -10)

En otra terminal se ejecuta el comando:

ps -el (para ver prioridad del proceso que dejamos corriendo).
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  2493  2492  0  70 -10 -  4838 poll_s pts/1    00:00:00 top

Ahora iremos a probar el comando renice, lo que vamos a hacer es cambiar de prioridad, cambiamos de -10 a 20. Luego de esto verificamos si esto funcioná.

renice 20 2493 
ps -el
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  2493  2492  0  99  19 -  4838 poll_s pts/1    00:00:02 top

Comando vmstat

Este comando lo que hace es reportarle estadísticas que mantiene el kernel sobre los procesos, la memoria y otros recursos del sistema. Algunos de los campos que muestra este comando:

  • Cantidad de procesos en distintos estados.
  • Muestra valores asignadados a procesos y libre.
  • Operaciones de disco.
  • También muestra el uso CPU clasificado en inactivo.

Esta es la salida de este comando:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
0  0      0 2249308 278760 604764    0    0    46    27  229  606  5  2 93  0

Comando pstree

Este comando da una lista de los procesos y sus descendientes en forma de árbol.

pstree
init─┬─NetworkManager─┬─pppd
     │                └─2*[{NetworkManager}]
     ├─VBoxSVC───10*[{VBoxSVC}]
     ├─VBoxXPCOMIPCD
     ├─VirtualBox───4*[{VirtualBox}]
     ├─acpid
     ├─applet.py
     ├─atd
     ├─avahi-daemon───avahi-daemon
     ├─console-kit-dae───64*[{console-kit-da}]
     ├─cron
     ├─cupsd
     ├─2*[dbus-daemon]
     ├─dbus-launch
     ├─firefox-bin─┬─plugin-containe─┬─npviewer.bin───12*[{npviewer.bin}]
     │             │                 └─{plugin-contain}
     │             └─19*[{firefox-bin}]
     ├─gconfd-2
     ├─gdm-binary─┬─gdm-simple-slav─┬─Xorg
     │            │                 ├─gdm-session-wor─┬─sh─┬─ssh-agent
     │            │                 │                 │    ├─xfce4-session─┬─Th+
     │            │                 │                 │    │               ├─xf+
     │            │                 │                 │    │               ├─xf+
     │            │                 │                 │    │               ├─xf+
     │            │                 │                 │    │               └─{x+
     │            │                 │                 │    └─xscreensaver
     │            │                 │                 └─{gdm-session-wo}
     │            │                 └─{gdm-simple-sla}
     │            └─{gdm-binary}
     ├─6*[getty]
     ├─gnome-keyring-d───2*[{gnome-keyring-}]
     ├─gnome-settings-
     ├─gvfs-afc-volume───{gvfs-afc-volum}
     ├─gvfs-fuse-daemo───3*[{gvfs-fuse-daem}]
     ├─gvfs-gdu-volume
     ├─gvfs-gphoto2-vo
     ├─gvfsd
     ├─gvfsd-trash
     ├─indicator-appli───{indicator-appl}
     ├─indicator-messa───{indicator-mess}
     ├─indicator-sound───{indicator-soun}
     ├─irqbalance
     ├─modem-manager
     ├─mount.ntfs
     ├─nm-applet───{nm-applet}
     ├─ntpd
     ├─polkit-gnome-au───{polkit-gnome-a}
     ├─polkitd───{polkitd}
     ├─pulseaudio───2*[{pulseaudio}]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─rtkit-daemon───2*[{rtkit-daemon}]
     ├─udevd───2*[udevd]
     ├─udisks-daemon─┬─udisks-daemon
     │               └─2*[{udisks-daemon}]
     ├─update-notifier───{update-notifie}
     ├─upowerd───{upowerd}
     ├─upstart-socket-
     ├─upstart-udev-br
     ├─wpa_supplicant
     ├─xfce4-notifyd
     ├─xfce4-power-man
     ├─xfce4-settings-
     ├─xfce4-terminal─┬─bash───pstree
     │                ├─bash───sudo───top
     │                ├─bash
     │                ├─gnome-pty-helpe
     │                └─{xfce4-terminal}
     ├─xfce4-volumed───4*[{xfce4-volumed}]
     ├─xfconfd
     ├─xfrun4
     └─xfsettingsd

Observaciones

Hay que tener en cuenta que todas las salidas mostradas anteriormente son un ejemplo, otra cosa es que tal vez que a la hora de ejecutar alguno de estos comando les pida tener privilegios de administradores. Se recomienda en caso de dudas las paginas man de comando.

Referencias

http://iie.fing.edu.uy/ense/asign/admunix/procesos.htm