13 jun 2010

Conceptos: kernel, llamadas al sistema, procesos

Como hemos dicho, el sistema operativo es la interfaz entre el hardware de un sistema y los procesos del usuario. Dentro del sistema operativo, el kernel es la componente central, que entre otras cosas:
  • Administra la memoria para los procesos en ejecución
  • Administra el tiempo de procesador que utilizan los procesos en ejecución
  • Abstrae los periféricos de nuestro ordenador de cara al usuario.

Cuando arranca una máquina UNIX, una de las primeras cosas que se hace es cargar el kernel en memoria. El kernel no deja de ser un programa ejecutable escrito en C.

En Solaris, por ejemplo, el kernel no es un fichero sino varios, por una parte el genérico /kernel/genunix y algunos dependientes de plataforma y arquitectura de máquina como /platform/(plataforma)/unix, además de una serie de módulos o piezas que proporcionan una extensibilidad del kernel que hace que los fabricantes de dispositivos proporcionen estos módulos y no haya que recompilar el kernel.

En Linux, por ejemplo, el kernel es un archivo vmlinux que se enlaza estáticamente y que suele encontrarse en la partición /boot, en Red Hat se llama vmlinuz y si metemos algún dispositivo nuevo, al no tener el sistema modular de Solaris podemos tenerlo que recompilar.

En resumen, el kernel se encarga de los recursos. Las peticiones al kernel desde los programas se realizan mediante llamadas al sistema, que son funciones (escritas en C) que proporcionan un interfaz programático.

Sin embargo, un desarrollador normal que quiera elaborar un programa, como por ejemplo, uno de los comandos del sistema operativo, no va a utilizar llamadas al sistema, sino funciones de usuario, que se proporcionan en la biblioteca de C implementa las funciones estándares de C (includes como o mas objetos binarios) .

Ejemplo: Un usuario que quiera elaborar un programa que escriba "Hello World" utiliza la función printf(), pero el sistema por debajo utiliza la llamada al sistema write()

    #include      int main(void)     { printf("hello world"); return 0; }     

Se habla de "espacio de kernel o de sistema" y "espacio de usuario" para establecer una separación lógica de las tareas a cada uno de los niveles. Típicamente, un programa utiliza una función de usuario en "el espacio de usuario", la librería de C llama a una o más llamadas al sistema, y estas llamadas al sistema se ejecutan en "el espacio del kernel" (donde el kernel tiene en cuenta que debe asignarle memoria, CPU, en general, recursos). Una vez que la llamada al sistema realiza su función, retorna, y vuelve al "espacio de usuario".

En Solaris por ejemplo, si queremos ver todas las llamadas al sistema que realiza un ejecutable, tenemos el comando truss (sólo puede ejecutarse como superusuario). En Linux, el equivalente es el comando strace.

Un proceso en UNIX es un programa en ejecución, pero también es el "objeto abstracto" que crea el sistema operativo para manejar el acceso de ese programa a los recursos del sistema (memoria, CPU, I/O). Si un programa se ejecuta varias veces produce varios procesos. UNIX es un sistema multiproceso porque el sistema operativo va asignando cuantos de tiempo (del orden de decenas de milisegundo) del procesador a los procesos.

En resumen, que en un sistema operativo existen dos cosas en ejecución: El kernel y los procesos de usuario. Nosotros no podemos gestionar lo que hace el kernel pero sí podemos solicitarle cosas a través de dichos procesos. Más adelante se entrará en detalle en la gestión de procesos.

Compilar el kernel
Una de las primeras cosas que me sorprendió cuando la gente empezó a utilizar Linux fue que siempre estaban "compilando el kernel". Esto no ocurre en sistemas operativos "cerrados", puesto que no se dispone del código fuente. Sin embargo en sistemas operativos de código abierto, puede ser necesario recompilar el kernel, tanto para incorporar nuevas características (por ejemplo una nueva versión) como, muy importante, para agregar el soporte a nuevo hardware. Por último, compilar el kernel es un proceso muy educativo para comprender nuestro sistema.

Bibliografía relacionada
http://www.monografias.com/trabajos26/estados-proceso-hilos/estados-proceso-hilos.shtml
http://foro.elhacker.net/tutoriales_documentacion/compilacion_del_kernel_paso_a_paso-t15029.0.html

11 jun 2010

Introducción II: Estándares de UNIX (POSIX, X/Open, OSF, SUS...)

Como hemos visto, el sistema operativo UNIX empieza en un tronco común pero acaba siendo un árbol con múltiples ramas. Esto, para desarrollar aplicaciones portables, complicaba mucho las cosas. Surgió en los años 90 una iniciativa de estandarización para que las distintas variantes de UNIX fueran compatibles entre sí a la hora de desarrollar programas sobre ellas.

De esa época surgen varias siglas como POSIX vs SPEC1170, SVIDIII, X/Open, etc.

De todos los estándares, uno de los más conocidos es POSIX (Portable Operating System Interface) abanderado por el organismo internacional IEEE. POSIX responde a cuestiones como la creación de procesos, la gestión del espacio virtual de direcciones, threads, señales. Es decir, una serie de conocimientos que afectan a quienes trabajan "a bajo nivel" con el sistema operativo.

El esfuerzo de estandarización actual de UNIX está centralizado por el consorcio The Open Group, propietario de la marca "UNIX ®", con una iniciativa llamada "Single UNIX Specification". que intenta estandarizar llamadas al sistema, comandos, etc.

Las especificaciones de UNIX tienen las siguientes versiones:
  • UNIX 95
  • UNIX 98
  • SUS 3 (UNIX 03)
El grado de cumplimiento con esas especificaciones de los sistemas operativos más conocidos:
  • AIX
AIX 5L V5.3 + AIX 6.1 -> UNIX 03
AIX 5L V5.2 FCS -> UNIX 98
  • Solaris
Solaris 10 -> UNIX 03 compliant on 32-bit and 64-bit x86 and SPARC systems.
Solaris 8 and 9 -> UNIX 98 on 32-bit
  • HP/UX
HP-UX 11i V3 Release B.11.31 -> UNIX 03
Anteriores -> UNIX 95.

Los entornos de tipo Linux, BSD no están certificados en esta especificación, porque la certificación cuesta dinero.

Incluimos una tabla del tipo de detalles que estandariza POSIX.

POSIX.1
Servicios (incluido Standard ANSI C)
POSIX.1b
Real-time extensions
POSIX.1c
Threads extensions
  • Control y creación de procesos
  • Señales
  • Excepciones de coma flotante
  • Violaciones de segmentación
  • Instrucciones ilegales.
  • Errores de Bus
  • Temporizadores
  • Operaciones en ficheros y directorios
  • "Pipes"
  • Librería C (Standard C)
  • Interfaz de puertos I/O
  • Scheduling de prioridades
  • Señales de tiempo real
  • Timers
  • Semáforos
  • Colas de mensajes
  • Memoria compartida
  • I/O síncrono y asíncrono
  • Bloqueos de memoria
  • Creación, control y limpieza de threads
  • Scheduling de threads
  • Sincronización de threads
  • Manejo de señales

10 jun 2010

Introducción I: definiciones, historia de UNIX, variedades

Empecemos este curso por algunas definiciones:
  • ¿Qué es UNIX? UNIX es un sistema operativo multitarea y multiusuario que puede ser instalado en varios tipos de plataforma.
  • ¿Qué es un sistema operativo? Es un software que sirve como interfaz entre el hardware y los procesos de usuario.
  • ¿Cómo surgió UNIX? Surgió hace 40 años como un proyecto de investigación y acabó convirtiéndose en el sistema operativo por excelencia en entornos académicos, empresariales y públicos. Con la llegada de Linux (un clon de UNIX de código abierto), también se hizo su sitio en el entorno doméstico.
La historia nos dice que UNIX comenzó su andadura a finales de los sesenta, en los Laboratorios Bell de AT&T en Murray Hill, New Jersey (AT&T era en Estados Unidos lo que Telefónica en España: la empresa que monopolizaba el servicio telefónico hasta 1982). Tres investigadores, Thompson, Kernighan y Ritchie, en poco tiempo idearon un sistema operativo y un lenguaje de programación que después se haría muy popular (el C).

El sistema operativo fue evolucionando, y como la empresa que financiaba el proyecto (AT&T) no tenia legalmente la capacidad de "vender" el producto (al ser monopolio telefónico tenía prohibido comercializar productos informáticos), los investigadores comenzaron a "regalar" licencias que incluían el código fuente, así que fueron surgiendo distintas ramificaciones.


Durante los años setenta y ochenta, fueron apareciendo distintas variedades de UNIX:

- BSD: Se licenció Unix a la Universidad de California en Berkeley. Entre otras cosas, aportaron los sockets, el hoy ubicuo TCP/IP o el soporte a DNS.
- SunOS: Un desarrollador de Berkeley se fue a Sun Microsystem y desarrolló el sistema operativo SunOS.
- System V: Cuando por fin AT&T pudo vender productos informáticos, comercializó UNIX con este nombre. Hubo varias versiones, entre las cuales la más popular recibió el nombre de System V Release 4 (SVR4).
- Xenix: Se licenció Unix a Microsoft. Esta conocida empresa desarrolló su propia variante hasta que perdió su interés en este sistema operativo, primero por OS/2, después por Windows NT, hasta la fecha.

A finales de los ochenta y en los noventa, la "lucha por el negocio UNIX" dio lugar a una sucesión de eventos conocido como "las guerras de UNIX" (UNIX wars), con disputas legales, y preocupación para los usuarios, que veían a las empresas implicadas preocupadas solamente por llevarse "el gato al agua". En esa época se fueron realizando esfuerzos de estandarización (OSF, X/Open, POSIX) para evitar que la divergencia de variantes terminara generando sistemas operativos radicalmente incompatibles.

En la actualidad, los tres sistemas operativos comerciales derivados de UNIX que más éxito han alcanzado son Solaris, AIX y HP-UX (en este orden).

- Solaris: En 1991, Sun anunció que sustituiría SunOS (derivado de BSD) por un sistema reescrito basándose en SVR4. A éste, Sun añadió su entorno de ventanas (OpenWindows), su arquitectura de RPC (aplicado en subsistemas como NFS, NIS) y otras innovaciones (/proc, truss, los comandos p*). Se comercializa versión para plataformas SPARC, y para plataformas x86. En 2009, Oracle compró Sun, así que Solaris se ha acabado convirtiendo en Oracle Solaris (version actual, Solaris 2.10 o Solaris 10).

- AIX: El spin-off de UNIX hecho por IBM data de mediados de los 80, más temprano que por ejemplo, Solaris (las versiones "tempranas" eran muy distintas a Solaris o HP-UX). AIX era el sistema operativo elegido para las máquinas de procesador RISC RS/6000 (ahora se llaman Power*). Sus elementos diferenciadores son el smit, el LVM, el JFS. En los últimos años IBM ha hecho un esfuerzo "unificador" y AIX se parece más a Solaris, incorpora herramientas hechas populares en entornos Linux, etc (versión actual, AIX 6.1, próximamente AIX 7).

- HP-UX: Hewlett Packard lanzó en 1983 su versión de UNIX, con soporte a chips PA-RISC (en sus úlitmas versiones Intel 64 bits). A pesar de estar basada en SystemV incorpora código BSD. Se caracteriza por la herramienta de administración SAM, integrar el LVM, etc (versión actual HP-UX 11i) y se especializó en su momento en entornos de telecomunicación, siendo una de sus funciones más conocidas el ejecutar la herramienta de monitorización HP Openview.

Mención aparte merecen otros sistemas operativos de código abierto, que "parecen UNIX" pero técnicamente no lo son:

- Minix: Para su libro de sistemas operativos, Andrew Tannenbaum escribió su propio sistema operativo inspirado en UNIX, con fines educativos.

- Linux: Un señor con mucha barba llamado Richard Stallman, estaba inmerso en un proyecto para crear un sistema operativo compatible con UNIX pero totalmente gratuito. El proyecto se llamaba GNU y consiguió ultimar un editor (el emacs) y un compilador (el gcc) pero les faltaba lo importante, el núcleo del sistema operativo. En 1991 un estudiante finlandés llamado Linus Torvalds escribió, inspirándose en Minix, el núcleo de un sistema operativo, que se adaptó tan perfectamente al proyecto GNU, que le acabó quitando el nombre al proyecto (para disgusto de Stallman). En cuanto a la pregunta ¿qué Linux es más Linux? La respuesta es que todos lo son, pero en el camino de la popularidad los más renombrados puede que sean:
  • Red Hat Enterprise Linux (RHEL), Fedora
  • SuSE Linux Enterprise, openSuSE
  • Debian, Ubuntu
  • Mandriva
  • Slackware

- MacOS X: Cuando en 1985 Apple echó a Steve Jobs, éste fundó NeXT. Después de unos cuantos años, Apple compró NeXT. Finalmente, el sistema operativo MacOS, que no tenía línea de comando en absoluto, cayó en vía muerta, siendo reemplazado por un sistema operativo UNIX que se llama Mac OS X, basado en el UNIX de NeXT. Variantes de este sistema operativo corren en los principales productos de Sun,  incluidos el iPhone o el iPad, cuya ubicuidad en este momento es insoslayable.

Motivación


Lo primero es presentarme. Mis inicios con el sistema operativo datan de principios de los 90, cuando era estudiante de Ciencias Físicas. Me senté por primera vez ante una máquina con dicho sistema operativo en el año 1993, en la que escribía correo electrónico con un programita llamado "pine" (nada que ver con los vistosos correos web actuales). Las máquinas de la Universidad eran unas estaciones "Solbourne" (clónicas de las SPARC) con un sistema operativo clónico del SunOS.

Un par de años más tarde, mi primer trabajo consistió en trabajar en el proceso de iniciar el rodaje de un nuevo centro de cálculo para los investigadores de la facultad de Ciencias de la Universidad Autónoma. El trabajo era 90% administración de las máquinas Digital UNIX en un entorno de "producción" (aunque la "producción" no era, para nada, crítica). Aprendí a programar en shell, a instalar servidores web, y un poquito de Perl y C para hacer unos programitas que hicieran la web del centro un poco más "interactiva", utilizando la tremenda tecnología de CGIs.

Tras este periodo de aprendizaje, entré en mi actual empresa como administrador de sistemas UNIX, para poner en funcionamiento el entorno de desarrollo en un conjunto de máquinas heterogéneo (Solaris, AIX, HP-UX...). El entorno consistía especialmente en compiladores de C/C++, JDKs y el software que se utilizaba para el desarrollo web. Después de que todo aquello estuviera estable, fui picada por el gusanillo de la programación y abandoné el "rol" de técnico de sistemas por el de desarrollador web en lenguaje Java.

En aquella época tuve varias distribuciones de Linux en casa, pero aunque en la actualidad mi vida casera es incompatible con el cacharreo (tengo dos niños pequeños), sigo encontrando fascinante la filosofía de UNIX como sistema operativo y la profesión de administrador de sistemas UNIX.

Me piden en mi empresa dar un curso de UNIX orientado al usuario aunque con alguna noción de administración. Del temario original de un proveedor de Madrid me sugieren que imparta esto:

INTRODUCCION A UNIX.
· Tipos de UNIX existentes.
· Estándares y revisiones de UNIX.
· Concepto de proceso en UNIX.
· Que es un administrador UNIX.
· Kernel.

ENTORNOS GRÁFICOS HABITUALES Y ACTUALES, PARA USUARIOS Y ADMINISTRADORES.

· GUI y X Windows
· Terminales X
· Open Windows(Solaris)
· CDE (Common Desktop Environment)
· Ventanas Motif.

GESTIÓN DE FICHEROS Y USUARIOS.

· Arbol de directorios del sistema UNIX
· Altas/bajas y perfiles de usuario.
· Propiedad de ficheros.y directorios
· Atributos de ficheros
· Sistemas de password
· Grupos de un sistema

GESTIÓN DE IMPRESORAS.

· Configuración de impresora.
· Impresoras remotas.
· Detener, cancelar o desviar procesos de impresión.

ADMINISTRACIÓN DE TAREAS/PROCESOS.

· Diagnósticos de arranque.
· Carga del Kernel
· Montaje y desmontaje de discos.
· Parada del sistema.
· Procesos Batch.
· Programación SHELLScripts y AWK.
· Automatizar y programar procesos en el tiempo para los usuarios.
· Visualizar procesos.
· Cancelar procesos.
· Cambio de prioridades de procesos.
· Ejecución de tareas/procesos en background.

La sugerencia es dejar aquí la administración, y terminar con detalles especificos que interesan.

CONFIGURACION

· Configuración partes cliente BBDD
· Ficheros de configuración más relevantes del sistema operativo
· Ficheros de log


Aunque el curso original llevaba estas adiciones:

GESTIÓN DE DISCOS.

· Montar y desmontar sistemas de archivos en disco.
· Limitación de espacio a usuarios.

COMANDOS PARA EL ALMACENAMIENTO DE INFORMACIÓN Y ARCHIVOS DEL SISTEMA

· Copias de seguridad.
· Restaurar archivos de usuario.
· Restaurar y reconfigurar Kernel.


COMUNICACIÓN CON OTROS SISTEMAS UNIX.

· Dispositivos serie. Configuración y conexión.
· Conexión con otra máquina UNIX.
· Conexión a otros sistemas UNIX en Internet.
· Transferencia de ficheros.
· Acceso a UNIX mediante TELNET.