El soporte del Sistema Operativo

Unidad4

  • Conceptos Básicos sobre Sistemas Operativos modernos.
  • Objeto y Funciones principales de un sistema operativo.
  • Tipos de sistemas Operativos.
  • Referencias a Sistemas de uso cotidiano: Introducción a Linux.
  • Herramientas de desarrollo: El Compilador. El Linker. Su relación con el Hardware y el Sistema Operativo.
  • Introducción al desarrollo de software: Programa fuente, programa objeto, programa ejecutable.
  • Fases de compilación y vinculación de programas, en el entorno de un sistema operativo.

¿Que es un sistema operativo?

  • Un sistema operativo (SO) es una colección de programas que se encargan de administrar los recursos del computador.
  • Nos permite una forma común de acceso al hardware sencillo (sin necesidad de conocer detalles escabrosos).
  • Cuando se enciende el computador el SO toma el control del mismo.
  • Normalmente presenta un login
  • Una vez logueado se pueden utilizar aplicaciones y a través de éstas acceder a los recursos de hardware del sistema
  • Provee una colección de funciones (o Aplication Programming Interface / API) que nos permite programar para ese SO

¿Como se compone?

  • El SO tiene dos partes fundamentales:
  • El kernel (núcleo) que es el "programa" que nos abstrae del hardware y provee la API.
  • Los programas que corren para que el sistema funcione (fdisk, ifconfig, route, dhclient, etc...)
  • Una interfaz de usuario. Hay dos tipos:
    • Command Line Interface (CLI) - Donde escribiremos comandos
    • Graphical User Interface (GUI) - El entorno gráfico que es mas común ahora y sencillo de usar. Aquí el escritorio hace de shell
  • Otros programas que son necesarios para que el sistema funcione (rm, mv, cp, ls, ln, etc...)

¿Terminal / Consola?

  • Al inicio de los sistemas de cómputo la interfaz del shell era en modo texto
  • Aun hoy se sigue utilizando debido a su agilidad y a la potencia de los comandos en muchos casos.
  • Esta interfaz se conoce actualmente como modo consola, terminal, shell, etc...
  • Vamos a compilar usando la misma directamente.
  • Versiones: bash, csh, sh, etc...
    • Diferencias: Mayormente la forma de hacer scripts
    • El lenguaje de scripting para shell es de muy alto nivel, interpretado y lento. Pero da mucha flexibilidad a los administradores de sistemas.

Interfaces Gráficas

  • ¿Que hay debajo?
  • ¿Puedo elegir entre escritorios?
    • Gestor de Pantalla (o Display Manager)
      • KDM (de KDE)
      • GDM (de GNOME)
      • LXDM (de Lxde)
      • LightDM


http://en.wikipedia.org/wiki/Linux#Desktop

Escritorios (Desktop)

  • KDE (QT library)
  • GNOME (GTK+ library)
  • Unity (Ubuntu) -- Discontinuado!
  • Xfce (librerias muy livianas)
    • apt-get install xfce4
  • Lxde (librerias livianas
    • apt-get install lxde
  • Sugar (MIT OLPC)
  • MATE (GNOME2 fork)
  • Maui-Project (usa QT)


Para leer mas sobre escritorios: El Linux Desktop

Ejemplos...

(LXDE, MATE/GNOME2 & KDE)

¿Que son las distribuciones?

  • Conjunto de software (SO, software de base y software de oficina o servidor)
  • Compilación: El software libre se distribuye como código fuente. Por lo tanto hay que compilarlo para luego poder distribuir los binarios
  • Pre-configuraciones: Si distribuimos binarios estos inicialmente no tendran configuración alguna y no podran trabajar en conjunto. Entonces la distribución nos ahorrará un montón de trabajo.
  • Manejo de paquetes: Las distintas distribuciones tienen distintos motores de manejo de paquetes

Distribuciones

Ubuntu

  • Debian es el padre, pero tiene ciertas complejidades que no lo hacen ideal para ser tu primer distribución.
  • Hace rato ya Ubuntu se ganó un nombre propio y tiene MUCHAS distribuciones hijas.

  • Ubuntu y sus variedades:

Mint

  • Este es el que recomendamos para Informática I
  • Puede ser basado en Ubuntu (generalmente) o en Debian (una versión)
  • Cuando Ubuntu cambió a Unity (cambiado también el desktop) Mint comenzó a tomar fuerza.
  • El desktop que inspira la distribución es Cinnamon que es un Shell para GNOME3 inspirado en Windows.
  • Descarga última versión: Linux Mint 18.3 Sylvia

  • Sus desktop/variedades (32 y 64bits):
      • Basadas en Ubuntu: Cinnamon, MATE, Xfce y KDE.
      • Basadas en Debian: Cinnamon y MATE.

¿Como lo instalo?

  • Directo en la máquina
  • VirtualBox
  • ¿Tiene Windows10? ¡Entonces puede bajar Ubuntu!



Nota: Windows usa Windows Subsystem for Linux que permite correr Linux sobre Windows como lo hace WINE en Linux (Linux Journal : WLinux Distro).

Manejo de paquetes

  • Repositorio
    • Versiones (de la distribución)
      • Arquitectura (i386, amd64, etc...)
        • Paquetes (geany, lxde, etc...)


De los repositorios se guarda el indice de los paquetes disponibles y su información


  • Ejemplos:
    • apt-cache search gnome | grep shell | less -S
    • apt-cache search geany
    • (sudo) apt-get install geany

Un poquito de historia...

Un poquito de historia (1)

Primero fue Unix

  • En 1970 Ken Thompson y Dennis Ritchie lograron comenzar con Unix: Desarrollaron un sistema de archivos
  • El sistema operativo era multitarea y multiusuario
  • Tenía un intérprete de comandos
  • En 1972 se tomó la decisión de escribir nuevamente UNIX en C.
  • En 1975 Berkeley desarrolló y publicó su propio sucedáneo de UNIX: Berkeley Software Distribution (BSD)‏

Un poquito de historia (2)

Primero fue Unix

  • Luego de esto sucede una gran proliferación de sistemas UNIX con distintas orientaciones. AT&T decidé combinar varias versiones desarrolladas en distintas universidades y empresas, dando origen en 1983 al Unix System V (Incluía pipes, el editor Vi y la biblioteca curses)‏
  • En 1991 Linus Torvalds empezó a trabajar en un reemplazo no comercial para MINIX. Esto terminó en un núcleo (kernel) para computadoras con arquitectura de procesador Intel 80386 que mimetizaba muchas de las funcionalidades de UNIX y lo lanzó en forma de código abierto bajo el nombre de Linux.

Un poquito de historia (3)

Primero fue Unix


Fuente: Articulo del IEEE sobre 25 años de Linux

Free Software Foundation = GNU

  • GNU es un sistema operativo similar a Unix que es software libre y respeta su libertad. Puede instalar versiones de GNU basadas en Linux que son completamente software libre.
  • El software que se publica debe ser software libre. Para que sea libre hay que publicarlo bajo una licencia de software libre. Generalmente utilizamos la Licencia Pública General de GNU (GPL de GNU)
  • ¿Otras licencias? Free-BSD
    • Mayormente servidores también Unix
    • Núcleo del sistema operativo MacOSX

Linux y GNU

  • GNU no es Linux, originalmente Free Software Foundation planeo hacer un sistema completo GNU.
  • El proyecto GNU nace en 1984 y Linux se une y logra el primer sistema operativo (junto a las herramientas ya desarrolladas por el proyecto GNU como el GCC) sacar el primer sistema operativo 100% libre en 1992.


www.gnu.org & www.freebsd.org

Llega Linux

  • La historia del núcleo de Linux está fuertemente vinculada a la del proyecto GNU.
    • El proyecto GNU, iniciado en 1983 por Richard Stallman, tiene como objetivo el desarrollo de un sistema operativo Unix completo compuesto enteramente de software libre.
    • Cuando la primera versión del núcleo de Linux fue liberada en 1991, el proyecto GNU ya había producido varios de los componentes del sistema operativo, incluyendo un intérprete de comandos, una biblioteca C y un compilador, pero aún no contaba con el núcleo que permitiera completar el sistema operativo.

Llega Linux

  • Entonces, el núcleo creado por Linus Torvalds, quien se encontraba por entonces estudiando en la Universidad de Helsinki, llenó el "espacio" final que el sistema operativo de GNU necesitaba.
  • En 1992, el núcleo Linux fue combinado con los programas desarrollados por el Proyecto GNU, dando como resultado el Sistema Operativo GNU/Linux.
  • GNU/Linux fue desarrollado bajo licencia GPL.



Linea de tiempo año a año...

¿Linux de Microsoft?

Microsoft creó un núcleo configurado/modificado por ellos

¿Otros OS?


    Otros:

    • Windows
    • OS X (Unix)
    • Android (Linux)


RTOS:

El kernel

Introducción a Linux: El kernel

Propósito del Kernel

  • El kernel presenta una interfaz común a todos los procesos. Permitiendo una abstracción del hardware.
  • Los procesos son escritos sin ninguna necesidad de conocer el hardware o arquitectura de la computadora en que se están ejecutando.
  • Linux además provee un ambiente de multitarea en forma transparente al usuario:
    • De esta manera cada proceso puede trabajar como si fuera el único proceso en la computadora
    • El Kernel se ocupa de mantener esta abstracción y la seguridad entre procesos.

El kernel: Caracteristicas (I)

  • Pensado para ser portable
  • Soporte para sistemas multi-procesador
  • Soporte para diversos sistemas de archivo:
    • raiserFS, ext2, ext3, ntfs, fat16, fat32, NFS, SMB, etc…
  • Apunta a ser compatible con POSIX y la especificación estándar de Unix (www.unix.org).
  • Amplio soporte de Hardware

El kernel: Caracteristicas (II)

  • Escrito en lenguaje C (GCC), junto a unas pequeñas secciones de código escritas con el lenguaje Ensamblador.
  • Núcleo monolítico híbrido: Utiliza módulos dinámicos.
  • Primer plataforma 32-bit x86-based PCs (386 o superior), otras arquitecturas:
    • AMD x86-64, ARM, Intel IA-64, Alpha, Sun SPARC, PowerPC, MIPS, IBM/390, HP PA-RISC, Atmel AVR32, etc...

El kernel: Estadisticas


    Linux Kernel 2.6.38-2

    • 95.2% : C
    • 2.8% : ASM
    • 1.8% : C++
    • 0.4% : XML
    • 0.3% : Make
    • 0.1% : Perl
    • 0.1% : Shell script


Fuente del análisis del kernel 2.6.38

Subsistemas

El kernel: Subsistemas

  • SCI: Provee la conexión entre el espacio de usuario y el kernel.
  • PM (scheduler): Permite la ejecución multitarea en forma transparente.
  • MM: Maneja la memoria virtual (cache vs. física)‏
  • VFS: Provee una interfaz común a todos los distintos sistemas de archivo soportados por Linux.
  • NS: Se encarga de proveer una abstracción de la red.
  • DD: Aquí se encuentra la mayoría del código. Estos permiten una abstracción del hardware haciendolo usable.
  • Arch: Código dependiente de la arquitectura.

El kernel:

Bajando a un ejemplo desde C

Por ejemplo mis scanf()/printf() como van pasando por las capas de software hasta llegar al hardware?


  • Pasamos por:
    1. Mi aplicación
    2. Llamado al SO: Kernel
    3. Drivers
    4. Finalmente accede el SO al hardware

El kernel: Versiones (1)

  • Hasta el kernel 2.6 las versiones con segundo número impar eran de desarrollo. Pero a partir del núcleo 2.6 se dejó esta costumbre y se utiliza una sola versión.
  • Para reflejar cambios se introdujo una numeración de 4 digitos donde el tercero implica mejoras y el cuarto bug fixes.
  • Ultimas versiones
    • stable: 4.17.2
    • longterm: 4.14.51
    • longterm: 3.16.57

El kernel: Versiones (2)

Página del equipo del Kernel & mas sobre versiones


Fuente: Articulo del IEEE sobre 25 años de Linux (ellos usaron el repo del kernel)

El kernel:

Soporte a microControladores

  • Si se tiene un procesador con manejador de memoria paginado (PMMU) y está portado GCC para esa plataforma se puede portar Linux.
  • Los µC no tienen manejador de memoria. Por eso hay una rama de Linux que no necesita MMU.
  • www.uclinux.org

¿Y nosotros para que lo vamos a usar?

Compiladores

Compiladores

  • Traducen nuestro código fuente en código de máquina (o sea dependiente de la arquitectura del procesador).
  • El código generado es reubicable en memoria y se puede enlazar con otros códigos.
  • Esto facilita y reduce el tiempo de compilación, solo se compila lo que cambió y luego se arma el ejecutable.

Linker

Linker

  • Es un programa que toma los objetos generados en los primeros pasos del proceso de compilación (compilador) y la información de todos los recursos necesarios (bibliotecas)
  • Quita aquellos recursos que no necesita (p/ej tabla de símbolos), y enlaza el código objeto con su(s) biblioteca(s)
  • Finalmente produce un archivo ejecutable (o una biblioteca)

Entornos de compilación (I)

(Integrated Development Enviroment o IDE)

  • GPL / Open Source
    • Geany (GCC, muy pequeño y liviano)
    • Eclipse (Inicialmente JAVA. Muy grande y pensado como un Framework. Mucho otros IDE. Un ejemplo es el compilador de Code Red Tech usado en informática 2 con Kit ARM)
      • apt-get install eclipse-cdt
    • QT Creator (GCC + librerias QT, también usado en informática 2 para desarrollos en entornos gráficos)
      • apt-get install cmake qtcreator

Entornos de compilación (II)

  • GPL / Open Source
    • CodeBlocks (GCC + Entorno de desarrollo Win/Lin/Mac cross-platform usando librerías wxWidget)
    • wxDev-C++ (GCC + Entorno de desarrollo para Windows -solamente- usando librerías del proyecto wxWidgets)
  • MS Visual Studio Code: code.visualstudio.com (c/ MinGW)
  • Propietarios/Pagos:
    • Microsoft Visual Studio (actualmente .NET)
    • CodeWarrior (entorno de desarrollo motorola)
    • XCode (de Apple)

El GCC


  • GNU Compiler Collection (GCC): gcc.gnu.org
  • Lenguajes:
    • C, C++ & Objective-C
    • Fortran & Java
    • Ada & Go
  • Ampliamente usado y muchas plataformas:
    • Alpha, amd64, arm, x86, , x86_64, ia64, m68k, mips, powerPC, sparc, mas...



Nota: Otros compiladores nuevos pero
ni remotamente tan populares son LLVM y EGCS

Compilando con GCC (I)

  • compilo directamente a binario:
    gcc -o hola hola.c
  • Compilador para mostrar errores:
    gcc -Wall -o hola hola.c
    gcc -Wall -std=c89 -pedantic-errors -o hola hola.c
  • Para agregar información de debugging:
    gcc -Wall -g -o hola hola.c
  • Solo compilo (no linkeo):
    gcc -c -o hola.o hola.c
  • Compilo con información adicional:
    gcc -c -g -o hola.o hola.c
  • Para ver el código assembler:
    gcc -S hola.c -o -

Archivo ejemplo: hola.c

Compilando con GCC (II)

  • Utilidades
    • file hola.o - información sobre el programa objeto
    • objdump -htr hola.o - información detallada
  • Enlace o linkeo
    • ld -o hola hola.o -lc - enlace de un objeto (ERROR...)
    • gcc -g -o hola hola.o -v - información adicional sobre las librerías usadas
  • Debugging
    • gdb -tui - GNU debugger
      
      file hola
      break main
      run
      				


Tutorial GCC y GDB & GCC intro & Opciones de debug & Otros debuggers

Usando Linux

Comandos mas importante : man


man <seccion> intro

  • 1 - Introduction to user commands
  • 2 - introduction to system calls
  • 3 - introduction to library functions
  • 8 - introduction to administration and privileged commands

Listamos todos las intros: man -a intro

Vemos todas las entradas de una sección:

man -k . -s <seccion> | less -S


Usando man online: linux.die.net y un ejemplo de man 3 printf.

Script en bash para convertir el man a HTML: man2html.sh


Nota: Los comandos como "cd" son parte del bash y su ayuda se invoca con: help cd

Comandos mas comunes (I)

  • bash: Interprete de comandos
    • TAB / Shift + PageUp / Shift + PageDown
    • "|, >, >>, <, <<" : pipes
    • Scripting
  • man - Manual de los distintos programas
  • ls (dir) - Nos lista los contenidos de los directorios.
    • Algunas opciones útiles: ls -l, ls -a y ls -la
  • cd (cd) - Cambia de directorio. Ej: cd /home
  • cp (copy) - Copia un archivo de un directorio a otro
  • mkdir (md) - crea un nuevo subdirectorio
  • rm (del) - Borra un archivo o directorio

Comandos mas comunes (II)

  • mv (ren/move) - Con mv se pueden hacer dos cosas: Renombrar o mover un archivo.
  • rmdir (deltree) - Remueve un directorio
  • pwd - indica el directorio en el que estás parado
  • clear (cls) - Borra la pantalla
  • find - Busca un archivo de acuerdo a un patrón.
    • Ej: find / -name squid
      • busca el archivo squid en todo el sistema
  • locate - Parecido al find pero trabaja con una base
    • Para actualizar esta base se utiliza updatedb (como root)
  • date - Muestra la hora y el día

Comandos mas comunes (III)

  • df - Muestra cuánto espacio ocupado y libre hay en las particiones
  • du - Muestra cuánto espacio ocupan los archivos de un determinado directorio
  • free - Muestra recursos libres de sistema
  • ps - process status: provee información acerca de los jobs/procesos que están corriendo
  • cat, more (type) - Vuelca el contenido de un archivo por consola
  • less (more) - Permite mostrar el contenido de un archivo y recorrerlo
  • grep - Busca texto en un archivo
  • tail,head - Muestra las últimas/primeras 10 filas de un archivo

Manejo de usuarios


El usuario root...


¿Por que usar Ubuntu nos facilita sudo?

Manejo de usuarios:


Agregar permisos de sudo a un usuario:


adduser ignacio sudo

Cambiar de usuario:


ignacio@thinkpadE490:~$ sudo su - root
root@thinkpadE490:~# su - ignacio
ignacio@thinkpadE490:~$

Salir de una consola (logout):

  • Tipear: exit
  • Tecla Ctrl + D

El sistema de archivos


  • "Everything is a file" es una de los principales conceptos que hacen a Unix lo que es.
  • Todos los recursos del sistema (archivos, pantalla, discos, teclado, comunicaciones, procesos, etc...) son simples flujos de bits expuestos a través del sistema de archivos​.
  • Entre otras cosas hacerlo así permite utilizar el mismo conjunto de utilidades y APIs para recursos con naturalezas diferentes.



Mas sobre este concepto

La estructura del sistema de archivos (I)

Filesystem Hierarchy Standard (FHS)

Directorio.

Descripción

/bin

Programas binarios esenciales (como son cp, mv, ls, rm, mkdir, etc.),

/boot

Archivos utilizados durante el inicio del sistema (núcleo y discos RAM),

/dev

Dispositivos esenciales,

/etc

Archivos de configuración utilizados en todo el sistema y que son específicos del anfitrión.

/lib y
/lib64

Bibliotecas compartidas esenciales para los binarios de /bin, /sbin y el núcleo del sistema. /lib64 corresponde al directorio utilizado por sistemas de 64-bit.

La estructura del sistema de archivos (II)

Filesystem Hierarchy Standard (FHS)

Directorio.

Descripción

/home

Directorios de inicio de los usuarios locales.

/mnt

Sistemas de archivos montados temporalmente.

/media

Puntos de montaje para dispositivos de medios, como son las unidades lectoras de discos compactos.

/opt

Paquetes de aplicaciones de terceros.

/proc

Sistema de archivos virtual que documenta sucesos y estados del núcleo. Contiene, principalmente, archivos de texto.

La estructura del sistema de archivos (II)

Filesystem Hierarchy Standard (FHS)

Directorio.

Descripción

/root

Directorio de inicio del usuario root (super-usuario).

/sbin

Binarios de administración de sistema.

/tmp

Archivos temporales

/usr

Jerarquía secundaria para datos compartidos de solo lectura (Unix system resources).

/usr/src

Códigos fuente. Normalmente aquí se instala el código fuente del Kernel de Linux cuando lo instalamos.

/usr/bin

Programas binarios (que no son del sistema). Programas particulares del usuario (no el sistema) se instalan aquí.

La estructura del sistema de archivos (III)

Filesystem Hierarchy Standard (FHS)

Directorio.

Descripción

/var

Archivos variables, como son bitácoras, bases de datos, directorio raíz de servidores HTTP y FTP, colas de correo, archivos temporales, etc.

/var/log

Archivos y directorios, utilizados para almacenar las bitácoras de eventos del sistema.

/var/mail

Directorio para almacenar los buzones de correo de usuarios.

/var/tmp

Archivos temporales que prevalecen después de un reinicio.

/var/lib

Información de estado variable. Algunos servidores como MySQL almacenan sus bases de datos dentro de este directorio.

Mas sobre sobre FHS, articulo MIT (esp) y FHS en wikipedia

Permisos en Linux

Permisos en Linux

Linux, tanto como Unix, es un sistema multiusuario


Los permisos de cualquier archivo cuenta con tres partes:

  • Permisos de propietario
    • Permisos de grupo
      • Permisos de resto


Por lo tanto un archivo pertenece a un propietario y a un determinado grupo y, según los permisos que tenga asociados el archivo, se podrá acceder a él o no.

Permisos en Linux


[ignacio@thinkpad /]$ ls -l
total 173
drwx--x--x    2 root     root         4096 Jun 10  2002 bin
drwx--x--x    3 root     root         1024 Jun 17 11:59 boot
drwx--x--x   14 root     root        81920 Jun 24 03:30 dev
drwx--x--x   66 root     root         8192 Jun 23 14:57 etc
drwxr-xr-x    3 root     root         8192 Jun 10  2002 faqs
drwx--xr-x   23 root     root         4096 Jun 22 04:07 home
drwx--x--x    7 root     root         4096 Jun 10  2002 lib
drwx--x--x    8 root     root         4096 Jun 10  2002 mnt
drwx--x--x    3 root     root         4096 Jun  6 10:03 opt
dr-xr-xr-x  148 root     root            0 Jun 17 08:56 proc
drwxr-x---   10 root     root         4096 Jun 23 13:16 root
drwx--x--x    2 root     root         4096 Jun 10  2002 sbin
drwx------    2 root     root         4096 Jun 18 21:20 scripts

Permisos en Linux

  • chown: Cambia el propietario de un archivo o varios
  • chmod: Cambia los permisos de acceso de un archivo
    • Para ambos podemos agregar el modificador -R (recursivo)‏


Por Ejemplo:

En este ejemplo damos el permiso 421, esto es permiso de lectura al propietario/usuario, escritura al grupo y ejecución a cualquier otro.

Permisos en Linux

Existe también la posibilidad de hacerlo más humano:

  • chmod u+X <archivo>
    • Este ejemplo hace ejecutable por el usuario al directorio archivo.
  • chmod g-x <archivo>
    • Este ejemplo hace no ejecutable por el grupo a los archivos
      y/o directorios de la ruta actual.


Usando chown: Se le pasa el nombre de usuario y grupo

  • chown [usuario]:[grupo] <archivo>
    • Este ejemplo hace ejecutable por el usuario al directorio archivo.

Permisos en Linux

Sintaxis de letras


  • u : Usuario
  • g : Grupo
  • o : Otros


  • + : Agregar
  • - : Sacar


  • r : Leer
  • w : Escribir
  • x : Ejecutable

Procesos

¿Así que Linux es multitarea?

¿Y como funciona eso?

Tipos de Procesos



  • En primer plano (de terminal o gráficos)
  • En segundo plano (sin conexión a una terminal)

¿Como identificamos un proceso?



  • Todos los procesos tienen un
    identificador único de proceso (PID)
  • Los procesos pueden ser:
    • padres
    • hijos
  • Dentro de Linux el proceso padre ahora es systemd
    (antes era init).
  • Todos los otros procesos serán hijos de systemd
    y podrán ser padres de otros procesos.

Procesos



ps aux | head


USER   PID %CPU %MEM    VSZ   RSS TTY   STAT START   TIME COMMAND
root     1  0.0  0.0  27176  2960 ?     Ss   Sep20   0:02 /sbin/init
root     2  0.0  0.0      0     0 ?     S    Sep20   0:00 [kthreadd]
root     3  0.0  0.0      0     0 ?     S    Sep20  13:05 [ksoftirqd/0]
root     5  0.0  0.0      0     0 ?     S<   Sep20   0:00 [kworker/0:0H]
root     7  0.0  0.0      0     0 ?     S<   Sep20   0:00 [kworker/u:0H]

STAT


man ps   -> PROCESS STATE CODES


D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced.
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent.

For BSD formats additional characters may be displayed:
	<    high-priority (not nice to other users)
	N    low-priority (nice to other users)
	L    has pages locked into memory (for real-time and custom IO)
	s    is a session leader
	l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
	+    is in the foreground process group.

Árbol de procesos




$ pstree -p
systemd(1)─┬─ModemManager(535)─┬─{ModemManager}(557)
           │                   └─{ModemManager}(593)
           ├─NetworkManager(550)─┬─dhclient(9199)
           │                     ├─{NetworkManager}(567)
           │                     └─{NetworkManager}(592)
           ├─agetty(711)
           ├─alsactl(545)
           ├─cron(541)
           ├─dbus-daemon(23939)
           ├─dbus-daemon(532)
           ├─dbus-launch(23938)
           ├─lightdm(716)─┬─Xorg(735)─┬─{Xorg}(739)
           ...
           ├─plasmashell(1362)─┬─chromium(8153)─┬─chrome-sandbox(8168)───chromium(8169)───chromium(8171)─┬─chromium(8817)─┬─{chromium}(8820)
           ...
           ├─dropbox(8446)─┬─{dropbox}(8467)
           │               ├─{dropbox}(8468)
           │               ├─{dropbox}(8469)
           ...

Estado de los procesos (I)


Estado de los procesos (II)


  • Running: Cuando el proceso se esta ejecutando.
  • Waiting: Cuando el proceso esta esperando que se cumpla algún otro evento.
  • Ready: Cuando el proceso esta pronto para ejecutar, esperando por la CPU.
  • Terminated: Cuando el proceso ha terminado.
  • Zombie: Cuando termina (o muere) un hijo y el padre no se ha enterado (y por lo tanto tiene una entrada en la tabla de procesos).

htop

Una mejor forma de ver que está corriendo.



lsb_release -a      # Version y Distro de Linux
apt install htop    # Instalamos htop

Priorizando procesos


Exite el comando nice que nos permite definir la prioridad de un proceso a correr.

nice <priority> <proceso> &


nice -n -20 ls -lR &
		

Donde -20 es la más alta prioridad y 19 es la más baja.


También existe ionice que nos permite definir la prioridad de Entrada/Salida que utilizará el proceso.


ionice -c 3 du -sk * | sort -n -k1,1
		

Donde la -c (class) son 3. 1 es mayor la de mayor prioridad (real-time),
2 la normal (best-effort) y 3 la más baja (idle).

Dos formas de crear procesos...


Fork

Nos da un nuevo proceso que es una copia del actual. Tiene una "copia" de la memoria original. A medida que los nuevos procesos avanzan los valores de cada uno en memoria cambian, pero el ejecutable es el mismo. Los procesos/tareas no comparten memoria, la única forma de compartir algo es usar IPCs.



Threads: De una forma muy sencilla un thread es un proceso más liviano. Vamos a ver más sobre ellos en el siguiente capítulo.



Se puede leer más sobre procesos en Linux Documentation Project.

Ejemplos de código:

(a mover a otra sección)