Archivo de la categoría: Sistema operativo

Un sistema operativo es un conjunto de programas que ponen el hardware del ordenador a disposición de los usuarios de un modo seguro

Sistema operativo

Sistema operativo

Un sistema operativo es un conjunto de programas que, aportando abstracciones, ponen el hardware de la máquina a disposición de los usuarios de un modo seguro y eficaz

Objetivos de un sistema operativo:

  • Simplificar la utilización de la máquina
  • Hacer un uso eficiente de los recursos de la máquina
  • Controlar la ejecución de los programas de aplicación

Funciones del sistema operativo

El sistema operativo como interfaz de usuario:

  • Intérprete de mandatos o shell (de texto o gráficos)
  • Archivos de mandatos o shell scripts

El sistema operativo como gestor de recursos (Resuelve la competencia por los recursos):

  • Asignación y recuperación de recursos
  • Protección entre los usuarios
  • Contabilidad y monitorización

El sistema operativo como máquina virtual. Ofrece servicios a los procesos de usuario mediante un conjunto de funciones (llamadas al sistema) que constituyen su interfaz de programación de aplicaciones (API):

  • Creación de procesos/hilos para la ejecución de programas
  • Órdenes de entrada/salida (E/S)
  • Operaciones sobre archivos
  • Detección y tratamiento de errores en el propio sistema operativo

Niveles de un sistema operativo

Multiprogramación y tiempo compartido

Dependiendo del número de procesos y de usuarios que puedan ejecutar simultáneamente, un sistema operativo puede ser:

  • Monotarea o monoproceso
  • Multitarea, multiproceso o multiprogramación
    • Objetivo: maximizar la utilización del procesador
  • Monousuario
  • Multiusuario o tiempo compartido
    • Objetivo: minimizar el tiempo de respuesta

Cuando un proceso necesite esperar a una instrucción de E/S, el procesador puede cambiar a otro proceso distinto, de este modo se consigue la multiprogramación

Para que sea posible:

  • Debe existir una gestión de memoria para repartir la memoria principal entre varios procesos
    • Compartición multiplexada en espacio
  • Debe existir una planificación para repartir el tiempo de la CPU entre los procesos que están en memoria
    • Compartición multiplexada en tiempo
  • Deben existir mecanismos de protección para el uso compartido de los recursos
    • El sistema operativo asigna los dispositivos a los procesos y suministra las rutinas de E/S

Arquitectura Von Neumann

La arquitectura Von Neumann (modelo de Von Neumann o arquitectura Princeton), es una arquitectura para ordenadores basada en la descrita en 1945 por el matemático y físico John von Neumann y otros, en el primer borrador de un informe sobre el EDVAC (Electronic Discrete Variable Automatic Computer)

Describe la arquitectura para el diseño de un ordenador digital electrónico con partes que constan de una unidad de procesamiento que contiene una unidad aritmético lógica y registros del procesador, una unidad de control que contiene un registro de instrucciones y un contador de programa, una memoria para almacenar tanto datos como instrucciones, almacenamiento masivo externo, y mecanismos de entrada y salida

Arquitectura de von Neumann

Registros del procesador

Contador de programa (CP)

Alberga la dirección de memoria principal de la siguiente instrucción que tiene que cargar la unidad de control

Registro de instrucción (RI)

Contiene una copia de la instrucción actual, obtenida de la memoria principal

El proceso hardware

Secuencia de lectura-ejecución:

  • Lectura de la instrucción apuntada por el contador de programa (CP)
  • Incremento del CP
  • Ejecución de la instrucción Un computador sólo sabe repetir a gran velocidad esta secuencia

Se puede romper esta secuencia lineal modificando el valor del CP mediante:

  • Instrucciones máquina de salto
  • Interrupciones internas (interrupciones)
  • Interrupciones externas (excepciones)
  • Instrucción máquina trampa (trap)

Interrupciones externas

Conocidas comúnmente como interrupciones

Una interrupción es una señal recibida por la CPU, indicando que debe interrumpir su ejecución normal y pasar a ejecutar código específico para tratar esta situación

Es el mecanismo que utilizan los dispositivos para solicitar la atención de la CPU:

  • Interrupciones periódicas de reloj
  • Interrupciones de los dispositivos de E/S

Tratamiento de las interrupciones

Por hardware, ciclo de aceptación de interrupción:

  • Salva el contexto del proceso en ejecución
    • Contenido de algunos registros del procesador
  • Eleva el nivel de ejecución del procesador (pasándolo a modo núcleo)
    • Carga un nuevo valor en el CP (salta al sistema operativo)

Por software, el sistema operativo ejecuta una rutina tratamiento de la interrupción

Interrupciones internas

También denominadas excepciones, son sucesos inesperados internos al procesador:

  • Desbordamiento aritmético
  • División por cero
  • Dirección inválida
  • Intento de ejecutar una instrucción privilegiada

Tratamiento de las excepciones

La gestión de excepciones es similar a la de las interrupciones. Al detectarse la excepción, se transfiere el control al manejador de excepciones.La diferencia básica con las interrupciones es que las excepciones suelen tratarse en el espacio de usuario. El sistema operativo sólo las notifica

Instrucción trampa (trap)

Un proceso de usuario realiza una operación privilegiada mediante la instrucción trampa

Es una instrucción máquina de modo usuario que genera una excepción

Algunos la denominan interrupción software, o también, llamada al supervisor (SVC)

Es invocada por un proceso que está ejecutando en modo usuario y desea realizar una operación que requiere instrucciones privilegiadas

Cambia el bit de modo y bifurca hacia una posición fija del espacio del sistema

Modo dual de ejecución de la CPU

Llamamos instrucciones privilegiadas a aquellas instrucciones máquina que pueden potencialmente afectar a otros procesos:

  • Operaciones de E/S
  • Actualizar el reloj
  • Desactivar las interrupciones

Controlando la ejecución de las instrucciones privilegiadas protegemos a otros procesos y al sistema operativo

Solución: Distinguir dos modos de ejecución de la CPU

Los procesadores actuales incluyen un bit de modo que modifica el nivel de ejecución:

  • Modo usuario
    • Sólo puede ejecutar instrucciones no privilegiadas
    • El proceso sólo accede al espacio de usuario
  • Modo supervisor o núcleo
    • Se puede ejecutar cualquier instrucción máquina
    • Se denomina núcleo (o kernel) al código del sistema operativo que se ejecuta en este modo
    • Solamente el código del sistema operativo puede ejecutar en modo supervisor y tiene acceso tanto al espacio de sistema como al de usuario

Conclusión: El software de confianza del sistema operativo se ejecuta en modo supervisor y el resto del software se ejecuta en modo usuario

Llamadas al sistema

Las llamadas al sistema son procedimientos o funciones que ofrece el sistema operativo

Permiten a los procesos de usuario realizar operaciones privilegiadas

Se implementan a través de la instrucción trampa

  • La instrucción trampa necesita de un operando para referenciar a una tabla del núcleo (tabla de trap)

Para ocultar los detalles de la instrucción trampa, el diseñador del sistema operativo proporciona una biblioteca de funciones de “resguardo”

  • Los nombres de las funciones resguardo coinciden con los de las llamadas al sistema
  • Cada función de resguardo contiene una instrucción trampa a la función del sistema operativo a través de la entrada correcta de la tabla del trap del núcleo

Interfaz de llamadas al sistema

Cada sistema operativo implementa un conjunto propio de llamadas al sistema que exporta a través de un interfaz de llamadas

Este conjunto de llamadas es el interfaz del sistema operativo con los programas de aplicación o API (Aplication Program Interface)

Los programas de aplicación invocan los servicios del sistema operativo llamando a las funciones definidas en el interfaz de llamadas al sistema

Las funciones están implementadas por varias partes del sistema operativo: gestor de procesos, gestor de memoria, gestor de dispositivos y gestor de archivos

Ejemplos:

  • Estándar API POSIX en UNIX y Linux
  • API Win32 en Windows

POSIX

Interfaz estándar de sistemas operativos portables de IEEE basado en UNIX

Objetivo: portabilidad de las aplicaciones entre diferentes plataformas y sistemas operativos

No es una implementación. Sólo define una especificación

Disponible en todas las versiones de UNIX y Linux

Windows 2000 ofrece un subsistema de POSIX

Características

Nombres de funciones cortos y en minúsculas

  • fork
  • read
  • close

Las funciones normalmente devuelven 0 si se ejecutaron con éxito o -1 en caso de error

  • Variable errno

Mayoría de los recursos gestionados por el sistema operativo se referencian mediante descriptores: número entero mayor o igual que cero

Win32

No es un estándar

Es un API totalmente diferente al estándar POSIX

Define los servicios ofrecidos por los sistemas Windows 95/98, Windows NT, Windows 2000 y Windows XP

Define funciones y servicios gráficos

Características

Nombre de las funciones largos y descriptivos

  • GetFileAttributes
  • CreateNamedPipe

Dispone de tipos de datos predefinidos

  • BOOL
  • DWORD
  • TCHAR

Las funciones devuelven, en general, true si la llamada se ejecutó con éxito o false en caso contrario

Los recursos se manejan como objetos,referenciados mediante manejadores

Diseño de la estructura interna del sistema operativo

Monitor monolítico

Todo el sistema operativo se diseña como un único módulo compuesto por funciones que se pueden llamar unas a otras

Los procesos de usuario y los dispositivos de E/S se comunican a través del núcleo

Cuando se ejecuta código del monitor se deshabilitan las interrupciones

Ejemplos: MS-DOS, Windows XP, UNIX, Linux

Sistema monolítico

Micronúcleo

Algunas de las funciones del sistema operativo se implementan como procesos servidores de usuario

Las funciones del núcleo quedan reducidas al mínimo, con lo que la fiabilidad del sistema aumenta

Ejemplos: Minix, Mach, Windows NT

Sistema micronúcleo

Android

Android

Android es un sistema operativo móvil basado en Linux y software de código abierto

Fue diseñado para dispositivos móviles con pantalla táctil, como teléfonos inteligentes, tabletas, relojes inteligentes Wear OS, automóviles a través de Android Auto o Android Automotive y televisores con Android TV

Logo Android

Tanto el nombre Android (androide en español) como Nexus One hacen alusión a la novela de Philip K. Dick ¿Sueñan los androides con ovejas eléctricas?

Novela que posteriormente fue adaptada al cine como Blade Runner (1982)

Tanto el libro como la película se centran en un grupo de androides llamados replicantes del modelo Nexus 6

El logotipo es el robot Andy

Inicialmente fue desarrollado por Android Inc. y Google lo adquirió en 2005

Android fue presentado en 2007 junto con la fundación del Open Handset Alliance (un consorcio de compañías de hardware, software y telecomunicaciones) para avanzar en los estándares abiertos de los dispositivos móviles​

La estructura del sistema operativo Android se compone de aplicaciones que se ejecutan en un framework Java de aplicaciones orientadas a objetos sobre el núcleo de las bibliotecas de Javo en una máquina virtual Dalvik con compilación en tiempo de ejecución hasta la versión 5.0, luego cambió al entorno Android Runtime (ART)

Las bibliotecas escritas en lenguaje C incluyen un administrador de interfaz gráfica (surface manager), un framework OpenCore, una base de datos relacional SQLite, una Interfaz de programación de API gráfica OpenGL ES 2.0 3D, un motor de renderizado WebKit, un motor gráfico SGL, SSL y una biblioteca estándar de C Bionic

El sistema operativo está compuesto por 12 millones de líneas de código, incluyendo 3 millones de líneas de XML, 2.9 millones de líneas de lenguaje C, 2.2 millones de líneas de Java y 1.77 millones de líneas de C++

El código fuente principal de Android (fue liberado el código fuente por Google) se conoce como Android Open Source Project (AOSP), que se licencia principalmente bajo la Licencia Apache, una licencia libre y de código abierto

Historia

En julio de 2005, la multinacional Google compra Android Inc.

El anuncio del sistema Android se realizó el 5 de noviembre de 2007 junto con la creación de la Open Handset Alliance, un conglomerado de 78 compañías de hardware, software y telecomunicaciones dedicadas al desarrollo de estándares abiertos para dispositivos móviles

El mismo día se anuncia la primera versión del sistema operativo: Android 1.0 Apple Pie

Los terminales con Android no estarían disponibles hasta el año 2008

Las unidades vendidas de teléfonos inteligentes con Android se ubican en el primer puesto en los Estados Unidos, en el segundo y tercer trimestres de 2010,​ con una cuota de mercado de 43.6 % en el tercer trimestre

A escala mundial alcanzó una cuota de mercado del 50.6 % durante el cuarto trimestre de 2011, más del doble que el segundo sistema operativo en sistemas móviles (iOS de Apple, Inc.)

A principios de 2018 se superaban ya los dos millones de aplicaciones disponibles en Google Play Store, la tienda de aplicaciones oficial de Android; a estas habría que añadir las disponibles en otras tiendas no oficiales, como Aptoide

Google Play es la tienda de aplicaciones en línea administrada por Google, aunque existe la posibilidad de obtener software externamente

La tienda F-Droid es completamente de código abierto así como sus aplicaciones, una alternativa al software privativo de Google

Los programas están escritos en el lenguaje de programación Java, pero no es un sistema operativo que se libre del malware

Normalmente las distintas tiendas son seguras (se persigue y elimina aquel que es detectado), por eso, la mayoría del malware es descargado de sitios de terceros

Adquisición por parte de Google

En julio de 2005, Google adquirió Android Inc., una pequeña compañía de Palo Alto (California), fundada en 2003

Entre los cofundadores de Android que se fueron a trabajar a Google están Andy Rubin (cofundador de Danger), Rich Miner (cofundador de Wildfire Communications, Inc.),​ Nick Sears (alguna vez VP en T-Mobile), y Chris White (quien encabezó el diseño y el desarrollo de la interfaz en WebTV)

En aquel entonces, poco se sabía de las funciones de Android Inc. fuera de que desarrollaban software para teléfonos móviles

Esto dio pie a rumores de que Google estaba planeando entrar en el mercado de los teléfonos móviles

También en ese año se creó la mascota de Android: «Andy», como un androide verde simbolizando la traducción literal de Android Inc.

La diseñadora del proyecto fue Irina Blok

Ya en Google, el equipo liderado por Andy Rubin desarrolló una plataforma para dispositivos móviles basada en el núcleo Linux que fue promocionado por fabricantes de dispositivos y operadores con la promesa de proveer un sistema flexible y actualizable​

La especulación sobre que el sistema Android de Google entraría en el mercado de la telefonía móvil se incrementó en diciembre de 2006

BBC y The Wall Street Journal señalaron que Google quería que sus servicios de búsqueda y aplicaciones funcionasen en teléfonos móviles

Medios impresos y en línea pronto reportaron que Google estaba desarrollando su propio teléfono móvil​

En septiembre de 2007, «InformationWeek» difundió un estudio de Evalueserve que reportaba que Google había solicitado diversas patentes en el área de la telefonía móvil

Open Handset Alliance

El 5 de noviembre de 2007 la Open Handset Alliance, un conglomerado de varias compañías entre las que están Texas Instruments, Broadcom Corporation, Nvidia, Qualcomm, Samsung Electronics, Sprint Nextel, Intel, LG, Marvell Technology Group, Motorola, y T-Mobile; fue creado con el fin de desarrollar estándares abiertos para dispositivos móviles

Junto con la formación de la Open Handset Alliance, la OHA estrenó su primer producto, Android, una plataforma para dispositivos móviles construida sobre el kernel 2.6 de Linux

El 9 de diciembre de 2008, se anunció que 15 nuevos miembros se unirían al proyecto Android, incluyendo PacketVideo, ARM Holdings, Atheros Communications, Asustek, Garmin, Softbank, Sony Ericsson, Huawei, Toshiba, Vodafone y ZTE

El 24 de febrero de 2014, Nokia presentó sus teléfonos inteligentes (Nokia X, X+ y XL) corriendo Android 4.1 Jelly Bean (aunque utilizaban su propia versión, tomando como la base de AOSP)

Guerra comercial entre China y Estados Unidos

El 19 de mayo de 2019 Google anunció oficialmente que dejaba de prestar servicio a los usuarios de móviles Huawei en lo que se refiere a actualizaciones del mismo y, en el futuro a permitir a los mismos la utilización de sus aplicaciones (Gmail, Google maps, etc)

Hubo un conflicto comercial entre EE. UU. y China que llevó al gobierno estadounidense a incluir a la empresa fabricante en la lista negra de colaboradores con el gobierno chino

Este hecho, que supuso un duro golpe económico-empresarial a Huawei, ha suscitó serias dudas sobre la fiabilidad del sistema Android, ya que había claras motivaciones tanto políticas como comerciales

Dada la dependencia del sistema, Google podría en un futuro, emprender acciones similares contra cualquier tipo de dispositivos que lo utilicen (vía teléfono, altavoces inteligentes, automóviles conectados, etc)

Así como generar comandos no solicitados por el usuario o incluso espiarlos a través de los equipos conectados (cámaras, micrófonos, etc.)

Reemplazo de Dalvik por ART

Android 4.4 introdujo el ART (Android Runtime) como un nuevo entorno de ejecución, que compila el Javo bytecode durante la instalación de una aplicación

Hasta la versión 4.4.3 Android se utilizaba Dalvik como máquina virtual con la compilación justo a tiempo (JIT) para ejecutar Dalvik dex-code (Dalvik ejecutable), que es una traducción de Java bytecode

Siguiendo el principio JIT, además de la interpretación de la mayoría del código de la aplicación, Dalvik realiza la compilación y ejecución nativa de segmentos de código seleccionados que se ejecutan con frecuencia (huellas) cada vez que se inicia una aplicación

A partir de la versión 5.0 se convirtió en la única opción en tiempo de ejecución

Historial de actualizaciones

Android ha visto numerosas actualizaciones desde su liberación inicial

Estas actualizaciones al sistema operativo base típicamente arreglan fallos y agregan nuevas funciones

Generalmente cada actualización del sistema operativo Android es desarrollada bajo un nombre en código de un elemento relacionado con dulces en orden alfabético

La reiterada aparición de nuevas versiones que, en muchos casos, no llegan a funcionar correctamente en el hardware diseñado para versiones previas, hacen que Android sea considerado uno de los elementos promotores de la obsolescencia programada

Android ha sido criticado muchas veces por la fragmentación que sufren sus terminales al no ser soportado con actualizaciones constantes por los distintos fabricantes

Se creyó que esta situación cambiaría tras un anuncio de Google en el que comunicó que los fabricantes se comprometerán a aplicar actualizaciones al menos 18 meses desde su salida al mercado, pero esto al final nunca se concretó y el proyecto se canceló

Google actualmente intenta enmendar el problema con su plataforma actualizable Servicios de Google Play (que funciona en Android 4.4 y posteriores), separando todas las aplicaciones posibles del sistema (como Maps, Gboard, YouTube, Drive, e incluso la propia Play Store) para poder actualizarlas de manera independiente, e incluyendo la menor cantidad posible de novedades en las nuevas versiones de Android

Las versiones de Android recibían hasta la versión 9, en inglés, el nombre de diferentes postres o dulces

En cada versión el postre o dulce elegido empieza por una letra distinta, conforme a un orden alfabético:

Historial de versiones
Nombre de código Número de versión Fecha de lanzamiento Nivel de API
Apple Pie 1.0 23 de septiembre de 2008 1
Banana Bread 1.1 9 de febrero de 2009 2
Cupcake 1.5 25 de abril de 2009 3
Donut 1.6 15 de septiembre de 2009 4
Eclair 2.0 – 2.1 26 de octubre de 2009 5 – 7
Froyo 2.2 – 2.2.3 20 de mayo de 2010 8
Gingerbread 2.3 – 2.3.7 6 de diciembre de 2010 9 – 10
Gingerbread 2.3 – 2.3.7 6 de diciembre de 2010 9 – 10
Honeycomb 3.0 – 3.2.6 22 de febrero de 2011 11 – 13
Ice Cream Sandwich 4.0 – 4.0.5 18 de octubre de 2011 14 – 15
Jelly Bean 4.1 – 4.3.1 9 de julio de 2012 16 – 18
KitKat 4.4 – 4.4.4 31 de octubre de 2013 19 – 20
Lollipop 5.0 – 5.1.1 12 de noviembre de 2014 21 – 22
Marshmallow 6.0 – 6.0.1 5 de octubre de 2015 23
Nougat 7.0 – 7.1.2 15 de junio de 2016 24 – 25
Oreo 8.0 – 8.1 21 de agosto de 2017 26 – 27
Pie 9.0 6 de agosto de 2018 28
10 10.0 3 de septiembre de 2019 29
11 11.0 8 de septiembre de 2020 30
12 12.0 – 12L 4 de octubre de 2021 31 – 32
13 13.0 15 de agosto de 2022 33
14 14.0 4 de octubre de 2023 34

Android TV

Android TV

Android TV es un sistema operativo de televisión inteligente basado en Android y desarrollado por Google para televisores, reproductores multimedia digitales, decodificadores y barras de sonido

Sucesor de Google TV, cuenta con una interfaz de usuario diseñada en torno al descubrimiento de contenidos y la búsqueda por voz, la agregación de contenidos de varias aplicaciones y servicios multimedia y la integración con otras tecnologías recientes de Google, como Assistant, Cast y Knowledge Graph

La plataforma se presentó por primera vez en junio de 2014, y estuvo disponible por primera vez en el Nexus Player ese noviembre

La plataforma ha sido adoptada como middleware de televisión inteligente por empresas como Sony y Sharp, mientras que los productos de Android TV también han sido adoptados como decodificadores por varios proveedores de televisión IPTV

Historia

Android TV se anunció por primera vez en el Google I/O de junio de 2014, como sucesor del comercialmente fallido Google TV

The Verge lo caracterizó como más en línea con otras plataformas de reproducción de medios digitales, pero aprovechando el proyecto Knowledge Graph de Google; la compatibilidad con Chromecast; un mayor énfasis en la búsqueda; vínculos más estrechos con el ecosistema de Android (incluyendo Google Play Store y la integración con otras familias de Android, como Android Wear); y soporte nativo para videojuegos, gamepads Bluetooth y el framework Google Play Games

Algunos asistentes recibieron el kit de desarrollo de la plataforma, el ADT-1; The Information informó de que el ADT-1 estaba basado en un dispositivo de lanzamiento «Nexus TV» desechado que estaba siendo desarrollado internamente por Google

Google presentó el primer dispositivo Android TV, el Nexus Player desarrollado por Asus, en un evento de hardware en octubre de 2014

El dispositivo del kit de desarrollo ADT-2 salió a la venta antes del lanzamiento de Android TV 9.0

Android TV 10 se lanzó el 10 de diciembre de 2019, junto con el kit de desarrollo ADT-3

Android TV 11 se lanzó para el ADT-3 el 22 de septiembre de 2020, mientras que los despliegues estaban previstos para los socios fabricantes de equipos originales en los meses siguiente

Características

La plataforma Android TV es una adaptación del sistema operativo Android para descodificadores y como software integrado en el hardware de los televisores inteligentes

Su pantalla de inicio utiliza una interfaz basada en filas de desplazamiento vertical, que incluye un área de «descubrimiento de contenidos» poblada por contenidos sugeridos, seguida de filas de «Ver ahora» que muestran los contenidos multimedia de las aplicaciones instaladas. Android TV admite la introducción de comandos por voz y la búsqueda universal en múltiples servicios; algunos dispositivos también son compatibles con Google Assistant

Todos los dispositivos Android TV son compatibles con Google Cast, lo que permite reproducir en ellos contenido multimedia desde aplicaciones compatibles en otros dispositivos de forma idéntica a Chromecast

Android TV es compatible con el software de Play Store, incluidas las aplicaciones multimedia y los juegos (aunque no todas las aplicaciones de Google Play son compatibles con Android TV)

Algunos dispositivos de Android TV, como la Nvidia Shield y la Razer Forge TV, también se comercializan como microconsolas e incluyen un gamepad inalámbrico Bluetooth

Interfaz de Google TV

Una interfaz de usuario modificada de Android TV, con la marca «Google TV» (sin relación con la plataforma de televisión inteligente de la compañía que ya no tiene el mismo nombre), debutó en el dispositivo de streaming Chromecast with Google TV, que se lanzó el 30 de septiembre de 2020, coincidiendo con el cambio de marca del servicio de vídeo bajo demanda (VOD) de Google Play Movies & TV a Google TV en dispositivos Android

La interfaz de Google TV hace hincapié en las recomendaciones de contenido y el descubrimiento de diferentes servicios y aplicaciones instaladas, en comparación con la interfaz de Android TV, que se centra más en la navegación entre las aplicaciones individuales instaladas

Google TV es compatible con más de 6.500 aplicaciones creadas para Android TV

La interfaz de Google TV sustituyó a la interfaz de Android TV a finales de 2022, y comenzaron a utilizarse en decodificadores, dongles y televisores inteligentes en 2021

Servicios de streaming en España
Servicio Operador
A&E A+E Networks
Agile TV MásMóvil, Yoigo, Guuk, Euskaltel, Pepephone, Guuk, Embou, Populoos
Atresplayer Atresmedia
Amazon Prime Video Amazon.com, Inc
AMC American Movie Classics
Apple TV+ Apple Inc.
Comedy Central Paramount International Media Networks España
Crunchyroll Sony Group Corporation
Discovery+ Warner Bros. Discovery
Disney+ Disney Streaming
FuboTV FuboTV Inc.
EiTB Android TV Euskal Irrati Telebista
Historia A&E Networks
Mitele Mediaset España
Movistar Plus+ Movistar España
Pluto TV Paramount Global
Orange TV Orange España
SkyShowtime Comcast, Paramount Global
RTVE Play RTVE
Vodafone TV Vodafone España
Virgin telco Virgin telco

Dispositivos

Televisores

Durante el Google I/O 2014, Google anunció que Sony, Sharp y TP Vision/Philips lanzarían televisores inteligentes con Android TV integrado en 2015

Se señaló que el soporte para el manejo de las funciones específicas del televisor, como el cambio de entrada y la sintonización, estaban integrados de forma nativa en la plataforma Android

Sony presentó una gama de televisores inteligentes Bravia con Android TV en el CES 2015

Sharp lanzó dos modelos de televisores el 10 de junio de 2015

Philips anunció que el 80% de sus televisores de 2015 ejecutarán Android TV, cuyos dos primeros modelos salieron a la venta en junio de 2015

Google anunció otros socios de hardware para televisores en enero de 2016, como Arcelik, Bang & Olufsen, Hisense, TCL Corporation y Vestel

OnePlus también ha lanzado varios televisores que funcionan con la plataforma Android TV; todos los televisores de OnePlus funcionan con Android TV 9, excepto el recién lanzado OnePlus TV U1S, que ejecuta Android TV 10​

La empresa hermana de OnePlus, Realme, también ha lanzado varios televisores que funcionan con la plataforma Android TV

TCL Corporation anunció una gama de televisores inteligentes con Android 11 (y Google TV) en el CES 2021

Otras marcas como Mystic, Hisense, Motorola, y Xiaomi han lanzado sus respectivas líneas de televisores con este sistema operativo

TV Box y TV Stick

Además de los televisores, también se han lanzado aparatos externos como los TV Boxes y TV Sticks que también tienen el sistema operativo Android TV, entre ellos la empresa NVIDIA, que lanzó en 2015 la Nvidia Shield TV

Otras marcas como Mecool y Youin han lanzado dispositivos como el Mecool KM2 (la cual cuenta con certificación de Netflix) y el Youin You-Box

Descodificadores

Varios proveedores de televisión de pago han lanzado servicios de IPTV utilizando hardware basado en Android TV en lugar de un descodificador propio, como el Unifi Plus Box de Telekom Malaysia,​ el U+ tvG Woofer y el U+ tvG 4K UHD de LG Uplus, el Freebox Mini 4K del ISP francés y el BBox Miami de Bouygues Telecom

Dish Network lanzó en 2017 un dispositivo Android TV conocido como AirTV Player, comercializado como compañero de su servicio Sling TV, y que admite un adaptador opcional para conectar una antena y recibir televisión por aire

Verizon Wireless, Tivo y T-Mobile USA ofrecen cada uno un dongle de streaming de Android TV de la marca de la empresa llamado Verizon Stream, TiVo Stream 4K y T-Vision Hub, respectivamente

En 2020, AT&T lanzó AT&T TV como su nuevo servicio estrella de televisión de pago, que se basa en un descodificador Android TV y en la infraestructura de su servicio OTT DirecTV Now

Ericsson añadió soporte para Android TV a su plataforma IPTV MediaFirst, que se utiliza como base para servicios canadienses como Telus Pik TV y SaskTel MaxTV Stream

Vodafone Australia vende actualmente un sintonizador de TV y un dispositivo de streaming multimedia con Android TV, pero desde 2020 está descatalogado

El sistema GNU / Linux

El sistema de archivos GNU / Linux

GNU / Linux está basado en el sistema de ficheros de UNIX, el cual tiene estructura de árbol. El punto de origen se llama root (raíz) y se representa con el símbolo /

Un sistema GNU / Linux puede ser instalado en una "única partición" o en múltiples particiones. Existiendo la partición especial para el intercambio con la memoria, la partición swap. Esta partición permite al sistema usar el disco cuando agota la memoria

Debajo de la raíz (/), cuelgan todos los directorios del sistema. Realmente de la raíz cuelga la partición raíz del sistema que contiene los ficheros básicos para el arranque y el manejo del sistema. Las demás particiones que podemos establecer cuelgan de directorios

Es posible tener en diferentes particiones los ficheros de usuario, las aplicaciones de usuario, ficheros de longitud variable, los ficheros temporales. El crear múltiples particiones nos permitirá administrar mejor el sistema

Podremos crear copias de seguridad de las partes que nos interese o limitar el uso de determinadas partes a un usuario concreto. De esta forma evitamos que el disco se llene completamente, ya que el único que tiene permiso de escritura en la partición raíz es el usuario administrador

El tipo de partición más utilizada en los sistemas GNU / Linux es ext2 o ext3. La unidades no fijas, como cd-rom, blu-disk, zip, pendrive, etc, cuelgan de distintos directorios con un nombre descriptivo que hace referencia a ellos, dentro del directorio /mnt

La descripción de las propiedades de cada partición se hace en el fichero /etc/fstab

Nombre de ficheros

Un nombre de fichero válido para el núcleo de Linux puede contener cualquier carácter salvo los caracteres ‘/’ (barra) o ‘\0’ (nulo)

Sin embargo no es prudente usar caracteres especiales usados por la shell (la línea de comandos) tales como ($, ", ‘, &, #, (, ), *, [, ], {, }, …). Tampoco debe empezar por el carácter ‘-‘ que puede ser confundido con una opción

Cuando un usuario es creado, la shell define por defecto que usará el directorio de entrada llamado igual que el nombre de usuario. El valor de este directorio de entrada se puede encontrar en la variable de sistema $HOME

En cada directorio hay al menos dos entradas accesibles, que son ‘.’ (referencia al directorio actual) y ‘..’ (referencia al directorio padre). En la variable $PATH se guarda la referencia al subdirectorio actual. Si queremos ejecutar comandos contenidos en el directorio actual, usaremos el comando

El carácter ‘/’ se utiliza para separar los diferentes niveles de directorios dentro del nombre del fichero

Cuando el nombre del fichero empieza ‘/’ entonces estamos indicando el nombre del camino completo o el nombre del camino absoluto. Si por el contrario empieza por ‘./’ o por ‘../’, entonces estamos indicando un nombre del camino relativo, porque estamos utilizando el subdirectorio actual donde nos encontremos. La última parte del nombre después del último carácter ‘/’ es el nombre nombre base

Los ficheros que empiezan por ‘.’ no son considerados y por tanto se consideran ocultos al sistema, salvo que ciertos comandos se lo indiquen. Por ejemplo, para listar un directorio se utiliza el comando ls, pero al empezar por ‘.’ no los listará a pesar de ser ficheros iguales al resto

El sistema identifica internamente los ficheros con un número, que se denomina número de i-nodo. En el i-nodo se guardan diferentes propiedades del fichero tales como:

  • tipo de archivo
  • identificador del propietario
  • identificador del grupo del propietario
  • número de enlaces
  • su tamaño
  • fecha del último acceso
  • fecha de la última modificación
  • fecha de cambio del número de i-nodo
  • un array con los bloques de datos que ocupa el fichero

Tipos de ficheros

  • Regular: meros almacenes de información. Algunos contienen código ejecutable
  • Directorios: tabla que contiene los números de i-nodos y los nombres de todos los ficheros contenidos en el dentro del directorio
  • Ficheros especiales: pueden ser dispositivo de tipo carácter o dispositivo de bloques. El manejo de estos ficheros depende del dispositivo en particular
  • Enlaces simbólicos (symbolic links): ficheros que contienen un puntero a otro fichero que podría estar almacenado en un sistema de ficheros distinto
  • Enlaces rígidos (hard links): fichero que puede ser visto con distintos nombres dentro del sistema de ficheros (similar a un álias). Es decir, podemos listarlos como si fueran ficheros idénticos pero que comparten el mismo i-nodo. La información reside en un mismo lugar y los cambios realizados en un fichero también ocurren en los otros equivalentes. Los enlaces de este tipo no trabajan con sistemas de fichero distintos, han de ser del mismo tipo. No todos los sistemas de ficheros soportan los enlaces rígidos, ya que es un concepto muy ligado a los sistemas operativos de tipo UNIX

El árbol de directorios

Los directorios y ficheros de los sistemas GNU / Linux se estandarizan en un documento llamado FSSTND. Entre las distintas distribuciones de Linux podemos encontrar algunas diferencias

Vamos a describir los principales directorios definidos por el estándar y qué contiene:

  • /bin: comandos básicos del sistema operativo
  • /boot: ficheros de arranque, incluido el fichero del núcleo que tiene el formato vmlinuz-x.x.x
  • /dev: ficheros de dispositivos
  • /etc: ficheros de configuración del sistema
  • /etc/X11: ficheros de configuración de las X Windows (librerías para la gestión del entorno gráfico, similar a Windows)
  • /home: directorios de los usuarios. Por defecto se llaman igual que el nombre de usuario
  • /initrd: directorio para el proceso de arranque
  • /lib: bibliotecas necesarias para la ejecución de los programas residentes en los directorios /bin y /sbin
  • /mnt: para montar los dispositivos extraíbles (Cd-Rom, Blu-Disk, Zip, Pendrive, …)
  • /proc: alberga ficheros especiales que, o recogen información del núcleo, o se la proporcionan. Los ficheros generan la información al visualizarlos
  • /root: directorio home del superusuario administrador (tiene todos los permisos sobre el sistema)
  • /sbin: contiene ficheros ejecutables que sólo puede ejecutar el superusuario root
  • /tmp: se guardan ficheros temporales
  • /usr: ficheros que se pueden compartir por todo el sistema. Es el lugar en el que se suelen instalar las aplicaciones de usuario. Contiene directorios como /usr/bin, /usr/sbin, /usr/lib, /usr/man, /usr/X11R6, …
  • /usr/local: es de uso exclusivo superusuario root, para la instalación de software particular de la máquina, los controladores de periféricos
  • /var: ficheros de longitud variable. Esto incluye los directorios y ficheros de "spool", datos de administración y registro, así como ficheros transitorios y temporales que no se guarden en el directorio /tmp

Para movernos en la ruta de directorios usaremos el comando cd. Por ejemplo, si queremos acceder al directorio man, escribiremos en la línea de comandos cd /usr/man

Permisos de ficheros

Los ficheros tienen muchos atributos además de su nombre. Para ver los más significativos ejecutaremos el ls -l

Notación numérica para permisos

Los permisos de los ficheros son almacenados en formato binario y se puede referenciar numéricamente. Para ello se da el valor 4 al permiso de lectura, el valor 2 al permiso de escritura y 1 al permiso de ejecución. A continuación se suman los valores por usuario propietario, grupo y usuario cualquiera, obteniendo un número de tres cifras. Veamos un ejemplo:

Otros permisos

Existen también los permisos SUIG y SGID, que permiten identificar cuando un programa es ejecutado por el propietario del fichero o el grupo del fichero en vez del usuario que lo ha lanzado. En general se utiliza cuando el superusuario root quiere dar permiso de ejecución de uno de sus programas a otro usuario

Otro permiso es el de bit pegajoso o adosado (bit sticky), sirve para que el proceso permanezca en memoria RAM mientras se ejecuta. Se usa poco

Los valores numéricos para el SUIG son 4, para el SGID es 2 y para el bit sticky es 1, añadidos delante de los otros 3 valores de permisos. Así, podríamos darle a nuestro programa, el permiso 4751

Comando para los permisos

El comando para modificar permisos es chmod y admite formato numérico o formato de carácter. En el formato de carácter se usa u (usuario), g (grupo), o (otros) y a (todos) para indicar a quién afectan. Los símbolos + (para añadir permisos), – (para quitar permisos), = (para establecer un permiso). Por último, r (lectura), w (escritura), x (ejecución) s y t (bit sticky)

Permisos para los directorios

Para entender cómo funcionan los permisos aplicados a un directorio hay que imaginar que un directorio es un fichero normal que solo contiene una tabla en la que se relacionan los ficheros presentes en ese directorio. En todos los directorios existen siempre un par de entradas que son ‘.’ (para el directorio actual) y ‘..’ para el directorio padre. El permiso de ejecución se entiende como acceso

Si un directorio no tiene permiso de lectura, resultara imposible para cualquier comando, incluido ls, leer su contenido

Si un directorio no tiene permiso de ejecución, no se podrá hacer cd a ese directorio, ni a ninguno de los subdirectorios que cuelgan de él. Esto imposibilita todas las operaciones que utilicen ese directorio como parte del camino

Si no tiene permiso de escritura no se podrán dar altas, bajas o modificaciones en la tabla, es decir, no se pueden borrar ficheros ni crear otros nuevos, ni renombrarlos

Por último, en un directorio, el bit sticky se entiende como que está protegido ante la creación de un mismo fichero por parte de usuarios diferentes, aunque tengan permisos suficientes. Suele aplicarse al directorio /tmp

Otros comandos relacionados

  • umask: establece los permisos por defecto para la creación de ficheros
  • chown: permite cambiar el usuario propietario de un fichero o de varios ficheros
  • chgrp: permite cambiar el grupo propietario de un fichero o de varios ficheros

Cómo funcionan los comandos UNIX

Los comandos UNIX siguen la siguiente estructura:

cuadro_unix

La entrada estándar normalmente es un fichero o el teclado. La salida estándar suele ser la pantalla y la salida de errores estándar es también la pantalla

El formato de los comandos sigue la estructura:

  • orden: el nombre del comando
  • -: el signo menos indica que es una opción
  • opciones: una o más caracteres de opciones
  • argumentos: son literales tomados como parámetros de entrada para el comando

Redireccionamiento y conexiones

Tanto las salidas como la entrada estándar la podemos redirigir a un fichero o dispositivo (recordemos que desde el punto de vista del sistema todo son ficheros)

También podemos pasar la salida estándar de un comando a la entrada estándar de otro, utilizando la conexión

Para estas operaciones se utilizan los siguientes metacaracteres de la shell:

> comando >fichero dirige la salida estándar hacia el fichero
>> comando >>fichero agrega la salida estándar hacia fichero
< comando <fichero extrae de fichero la entrada estándar
<<str sigue la entrada estándar hasta la siguiente str en el renglón
p1¦p2 conecta la salida estándar de p1 a la entrada estándar de p2

Las conexiones dan una gran potencia al sistema, ya que aunque un comando por sí solo haga una tarea trivial, al combinarse con otros se convierten en herramientas generales y útiles. Esto nos permite de forma sencilla crear nuevos comandos y que el crecimiento del sistema solo está limitado por nuestra habilidad de creación

Otros metacaracteres de la shell

* concuerda cualquier cadena de cero o más caracteres en los archivos
? concuerda cualquier carácter individual en los archivos
[ccc] concuerda cualquier carácter individual de ccc en archivos, son válidos los rangos 0-9 o a-z
; p1;p2 cuando termina el comando p1 se ejecuta el comando p2
& como ; pero no espera que termine p1
`…` correr comando en …; la salida sustituye a `…`
(…) correr comando en … en una subshell
$1, $2, … se reemplazan los argumentos en un archivo de la shell
$var valor de la variable var de la shell
${var} valor de la variable de shell var, evita confusión cuando se concatena con un texto
\ \c se toma literalmente el carácter c
‘…’ se toma … literalmente
"…" se toma … literalmente después de interpretar $, ‘…’ y \
var=valor se asigna el valor a la variable var
p1&&p2 p1&&p2 ejecutar p1si se logra, ejecutar p2
p1¦¦p2 p1¦¦p2 ejecutar p1 si no se logra, ejecutar p2

Comandos UNIX

No vamos a exponer aquí una relación de comandos UNIX, explicando su funcionalidad.

En primer lugar porque existen múltiples páginas dedicadas a ello, y en segundo lugar por el propio sistema nos proporciona múltiples ayudas sobre ellos

Con el comando man podemos obtener ayuda de cualquier programa o fichero de configuración, si queremos saber cómo funciona, se puede llamar a sí mismo de la siguiente forma: man man

Cuando no conocemos el nombre de un comando podemos utilizar el comando apropos e indicar algo relacionado con él

Otro comando de ayuda es el comando info. Este comando suele completar la ayuda de man

Muchos comandos dan ayuda entre sus opciones ejecutando el comando

Otra fuente de ayuda son los COMOs (HOWTOs). Son tutoriales sobre cómo realizar ciertas operaciones en el sistema. Están publicados por TLDP (The Linux Documentation Project, El proyecto de documentación de Linux) y disponibles en muchos idiomas. En español, el proyecto se conoce con el nombre de LuCAS

Algunos paquetes incluyen documentación propia en un subdirectorio de /usr/share/doc que tiene el mismo nombre que el paquete. Cabe destacar que, mayormente, esta documentación está en inglés y todavía no está traducida al castellano

Nota: no olvidar que con la tecla de tabulación la shell completa los nombres de fichero, lo cual ayuda a localizar los comandos y los ficheros aunque no nos acordemos de su nombre completo. Además evita muchos errores al teclear

La shell de Linux

La shell de Linux

Un shell o intérprete de comandos es un programa interfaz que permite a un usuario escribir instrucciones para el sistema operativo. En el entorno Linux existen tres grandes familias de shells: sh, csh y ksh. El shell bash (Bourne Again Shell) pertenece a la familia sh

Una de las principales características de un intérprete de comandos es que puede programarse usando ficheros de texto que contienen los comandos que se interpretarán en la ejecución de los mismos

Estos ficheros de texto se denominan ficheros de mandatos o guiones (también scripts, shell scripts o guiones shell). Por tanto, un fichero de mandatos es un fichero de texto ejecutable que contiene órdenes interpretables por el shell

Caracteristicas

La primera línea del fichero indica el tipo de shell con el que se debe interpretar, en nuestro caso bash:

Cada línea del fichero contiene un comando que será ejecutado por el intérprete

Si se quieren ejecutar varios comandos en la misma línea deben ir separados por ‘;’

Para continuar un mandato en la siguiente línea debe terminar por ‘\’

El carácter ‘#’ al comienzo de una línea indica que es un comentario y por tanto el intérprete no lo ejecutará

Para visualizar texto o variables por pantalla, usaremos el comando echo

Variables

Cada shell tiene asociadas unas variables, que el usuario puede utilizar. Hay dos tipos de variables:

  • Variables locales: No son heredadas por los procesos hijos del shell cuando se realiza un fork
  • Variables de entorno: Son heredadas por los procesos hijos cuando se realiza un fork

Todas las variables van precedidas por ‘$’

Uso de las variables

Para definir una nueva variable o dar valor a una variable usamos el operador =

Como hemos mencionado antes, para visualizar por pantalla el valor de la variable usaremos el comando echo

Para convertir una variable local en una variable de entorno usaremos el comando export

Para eliminar una variable y su valor de memoria usaremos el comando unset

Para mostrar por pantalla todas las variables (tanto locales como de entorno), usaremos el comando set

Para mostrar sólo las variables de entorno usaremos el comando env

Podemos usar las siguientes variables de entorno predefinidas dentro de la shell

$HOME Directorio de origen del usuario
$PWD Directorio de trabajo del usuario
$PATH Camino absoluto de los directorios de búsqueda de ejecutables. El directorio de trabajo del usuario no está incluido por defecto
$PS1 Prompt principal del shell
$PS2 Prompt secundario
$IFS Separador Interno de Campo. Utilizado por la orden interna read

Argumentos

Como cualquier programa, un guión puede recibir valores mediante argumentos o parámetros, en la línea de comandos. Los argumentos recibidos se almacenan en una serie de variables que el guión puede utilizar

$1 Primer argumento
$2 Segundo argumento
$3 Tercer argumento
$4 Cuarto argumento
$5 Quinto argumento
$6 Sexto argumento
$7 Séptimo argumento
$8 Octavo argumento
$9 Noveno argumento
$C Nombre del guión
$* Cadena que contiene todos los argumentos
$# Número de argumentos que ha recibido el guión
shift Mover todos los argumentos a la posición izquierda. Es decir, el valor $1 desaparece y es reemplazado por el $2 y así sucesivamente

Comillas

Simples ‘ ‘

Cadena de caracteres que el shell toma literalmente

Inversas ` `

Deben encerrar un comando completo (con su nombre y sus argumentos) Se produce una ejecución en tres fases:

  1. Evaluación de variables
  2. Sustitución del comando por una cadena de caracteres que contiene la salida estándar del comando
  3. Ejecución del resultado

Dobles " "

Permiten la evaluación de variables y la sustitución de comandos

Comandos de control de flujo

Sentencia if

Expresión puede ser una expresión de comparación o un comando. Su valor será el que devuelva la expresión o la ejecución de un comando

Para entrar por la rama que sigue a then, expresión ha debido de devolver un 0 (verdadero) y para entrar en una rama elif o en una rama else, expresión ha debido devolver un valor distinto de 0 (falso)

Expresiones

Si queremos comparar dos valores debemos utilizar el comando test

test evalúa la expresión. Si ésta es verdadera devuelve el código 0 y si esta es falsa un código distinto de 0

Las expresiones más frecuentes son:

-r fichero verdadera si el fichero existe y tiene permiso de lectura
-w fichero verdadera si el fichero existe y tiene permiso de escritura
-x fichero verdadera si el fichero existe y tiene permiso de ejecución
-f fichero verdadera si el fichero existe y es un fichero
-d fichero verdadera si el fichero existe y es un directorio
-s fichero verdadera si el fichero existe y su tamaño es mayor que 0
-z cadena verdadera si el fichero existe y su tamaño es 0
-n cadena verdadera si el fichero existe y su tamaño es distinto de 0
cadena1 == cadena2 verdadera si cadena1 es igual que cadena2
cadena1 != cadena2 verdadera si cadena1 es distinta que cadena2
cadena verdadera si cadena no es la cadena nula
n1 -eq n2 verdadera si n1 es igual que n2
n1 -ne n2 verdadera si n1 es distinto que n2
n1 -gt n2 verdadera si n1 es mayor que n2
n1 -ge n2 verdadera si n1 es mayor o igual que n2
n1 -lt n2 verdadera si n1 es menor que n2
n1 -le n2 verdadera si n1 es menor o igual que n2

Estas expresiones elementales se pueden combinar utilizando paréntesis y los operadores siguientes:

! niega la expresión
-a equivale al operador AND
-o equivale al operador OR

Sentencia case

Compara la cadena con los patrones, ejecutándose la lista_de_comandos correspondiente al primer patrón con el que concuerda, tras lo cual la ejecución de la sentencia case termina. Un patrón puede incluir cualquiera de los metacaracteres del shell

* es el patrón por defecto y se ejecuta cuando no lo ha hecho ninguno de los demás

Sentencia for

La lista de comandos se ejecuta tantas veces como elementos haya en la lista. Antes de cada iteración se asigna a variable el siguiente valor de la lista, empezando la primera iteración por el primer valor

Es muy útil si queremos recorrer todos los argumentos

Sentencia While

lista_ de_comandos se ejecuta tantas veces como sea verdadera expresión

Sentencia until

lista_de_comandos se ejecuta tantas veces como sea falsa expresión

Operador OR

Se ejecuta comando1; si éste devuelve un código de error distinto de 0 entonces se ejecuta el comando2, y el código que éste devuelve es el código devuelto por el comando completo; si el comando1 tiene éxito (código 0) entonces no se ejecuta el comando2 y toda la expresión tiene éxito

En el ejemplo anterior se comprueba si el fichero fich1 existe. Si existe, no se hace nada, en caso contrario se muestra un mensaje por el canal de error estándar

Operador AND

Se ejecuta comando1; si éste devuelve un código de error igual a 0 entonces se ejecuta el comando2

En el ejemplo se comprueba si existe un directorio llamado dir1. Si existe, se muestra el contenido, en caso contrario no se hace nada

Nota: no existe un operador que niege comandos

Comando read

lista_de_variables son variables separadas por un espacio

La ejecución del comando read lee de su entrada estándar una línea de texto que divide en palabras (es decir, cadenas separadas por espacios en blanco o tabuladores)

Asigna la primera palabra a la primera variable, la segunda a la segunda variable, así sucesivamente hasta completar la lista_de_variables

Si no se introducen suficientes palabras, a las variables sobrantes se les asignará la cadena nula

Si en la línea hay más palabras que variables entonces se asigna a la última variable una cadena formada por todas las palabras sobrantes

Ejemplo de recorrido linea a linea de un fichero

Comando exit

Todo comando devuelve un código para notificar al finalizar si su ejecución ha sido correcta o si ha aparecido algún error. Si la ejecución ha sido correcta se devuelve el código de error 0, y si ha habido algún problema se devuelve como código algún número positivo

Los ficheros de comandos devuelven al finalizar un código de error; exactamente el código de error devuelto por el último comando del fichero que se ejecuta. Para modificar esta situación por defecto, debemos utilizar el comando exit

Donde el argumento opcional n será un entero mayor o igual que 0. Si no se indica argumento equivale a exit 0

Cuando se ejecuta el comando exit, termina inmediatamente la ejecución del fichero de comandos y se devuelve como código de error el entero n

Usuario Linux

Usuarios Linux

Cada usuario Linux se identifica ante el sistema con un nombre de usuario ya que es un sistema multiusuario

A este nombre el sistema asocia un número identificativo (UID), una contraseña, su nombre completo, un directorio de arranque (el home de usuario) y una shell de conexión (existen diferentes programas de shell, y se elige entre uno u otro según las características del usuario o el tipo de shell que prefiramos)

Todos estos datos los guarda el sistema en los ficheros /etc/passwd y /etc/shadow. El fichero /etc/shadow contiene la contraseña cifrada y datos sobre la misma (como el tiempo de validez, los días con que hay que avisar antes de que expire, cada cuanto tiempo hay que obligar a su cambio, etc). La creación de este fichero vino por una cuestión de seguridad ya que el fichero passwd debe ser accesible a todos los usuarios

Estructura

La estructura del fichero passwd es la siguiente:

usuario No se admiten números al comienzo de un nombre de usuario
x Una “x” indica que el password está almacenado en /etc/shadow, en el caso de ser una “!” es que el usuario está bloqueado. “!!” indica que no tiene password
uid Cada usuario tiene asignado un número identificador (uid) entre 0 (root) y 65535. Se reservan algunos para usuarios especiales, como root (que siempre es el cero) y para usuarios de servicios del sistema. En sistemas Red hat y derivados entre 1 y 499. En sistemas Debian y derivados entre 1 y 999
gid Cada usuario tiene asignado un número identificador de grupo principal (gid), es decir, siempre pertenece al menos a un grupo, pero puede pertenecer a más de un grupo
nombre completo Esta opción está pensada para que el usuario escriba su nombre completo, aunque también puede usarse para escribir una descripción de qué hace ese usuario o cual es su utilidad, en el caso de ser un servicio del sistema
directorio home Es la carpeta de inicio que el usuario usará por defecto al iniciar su sesión
comando shell Los usuarios asociados a un servicio del sistema o los usuarios con permisos limitados no deben tener un comando de shell, es decir, capacidad de iniciar sesión en modo consola, normalmente este campo se rellena como /usr/bin/nologin o /bin/false

Algunos de los usuarios más comunes pueden encontrarse en la siguiente tabla:

Usuario UID GID Directorio de inicio Terminal
root 0 0 /root /bin/bash
bin 1 1 /bin /sbin/nologin
daemon 2 2 /sbin /sbin/nologin
adm 3 4 /var/adm /sbin/nologin
lp 4 7 /var/spool/lpd /sbin/nologin
sync 5 0 /sbin /bin/sync
shutdown 6 0 /sbin /sbin/shutdown
halt 7 0 /sbin /sbin/halt
mail 8 12 /var/spool/mail /sbin/nologin
news 9 13 /var/spool/news
uucp 10 14 /var/spool/uucp /sbin/nologin
operator 11 0 /root /sbin/nologin
games 12 100 /usr/games /sbin/nologin
gopher 13 30 /usr/lib/gopher-data /sbin/nologin
ftp 14 50 /var/ftp /sbin/nologin
nobody 99 99 / /sbin/nologin
vcsa 69 69 /dev /sbin/nologin
rpm 37 37 /var/lib/rpm /bin/bash
wnn 49 49 /var/lib/wnn /bin/bash
ntp 38 38 /etc/ntp /sbin/nologin
nscd 28 28 / /bin/false
apache 48 48 /var/www /bin/false
mysql 27 27 /var/mysql /bin/bash
mailnull 47 47 /var/spool/mqueue /sbin/nologin
smmsp 51 51 /var/spool/mqueue /sbin/nologin
rpc 32 32 / /sbin/nologin
xfs 43 43 /etc/X11/fs /sbin/nologin
gdm 42 42 /var/gdm /sbin/nologin
rpcuser 29 29 /var/libs/nfs /sbin/nologin
nsfnobody 65534 65534 /var/libs/nfs /sbin/nologin
ident 98 98 / /sbin/nologin
radvd 75 75 / /sbin/nologin
sshd 74 74 /var/empty/sshd /sbin/login
postgres 26 26 /var/lib/pgsql /bin/bash
squid 23 23 /var/spool/quid /dev/null
named 25 25 /var/named /bin/false
pcap 77 77 /var/arpwatch /sbin/bash
amanda 33 6 /var/lib/amanda /bin/bash
mailman 41 41 /var/mailman /bin/false
netdump 34 34 /var/crash /bin/bash
ldap 55 55 /var/lib/ldap /bin/false
postfix 89 89 /var/spool/postfix /bin/true
privoxy 100 101 /etc/privoxy
Pvm 24 24 /usr/share/pvm3 /bin/bash

Añadir

El comando para añadir usuarios es useradd

En el ejemplo hemos creado al usuario patxi que pertenece al grupo users y ftp, tiene como shell /bin/shell, asignamos la clave password y su carpeta home será /home/patxi

Este comando admite los siguientes parámetros:

-d Directorio home del usuario
-s Shell del usuario
-p Password
-g Grupo primario al que asignamos el usuario
-G Grupos a los que también pertenece el usuario
-m Forzamos la creación del directorio en su home

En el fichero /etc/default/useradd se guardan parámetros por defecto para el comando useradd y en el directorio /etc/skel están los ficheros y directorios que por defecto se pondrán en el home del usuario al crearlo

Modificar

El comando para modificar usuarios es usermod

En el ejemplo hemos modificado al usuario patxi que pertenecía al grupo users y ftp, ahora su grupo principal es server, aunque sigue perteneciendo a los grupos users y ftp

Este comando admite los siguientes parámetros:

-d Modificar directorio home del usuario
-s Modificar shell del usuario
-p Modificar Password
-g Modificar grupo primario al que asignamos el usuario
-G Modificar grupos a los que también pertenece el usuario

Borrar

El comando para borrar usuarios es userdel

En el ejemplo borrado al usuario patxi y adicionalmente le hemos forzado a borrar el contenido de su home al usar el parámetro -r, si no lo hubiéramos usado, seguiría existiendo

Cambiar la clave

El comando para cambiar la clave de un usuario es passwd. Hay que tener en cuenta que hay que tener permisos suficientes para poder realizar el cambio, ya sea porque quien ejecuta el comando es el propio usuario o el superusuario root

Si lo que queremos es cambiar la clave del usuario root y tenemos permisos suficientes, puede hacerse dejando el parámetro usuario vacío

shadow

La estructura del fichero shadow es la siguiente:

usuario Nombre del usuario
contraseña encriptada La contraseña con un cifrado seguro
1 Días transcurridos desde 1-1-1970 donde el password fue cambiado por última vez
2 El mínimo número de días entre cambios de contraseña
3 Días máximos de validez de la cuenta
4 Días que avisa antes de caducar la contraseña
5 Días después de que un password caduque para deshabilitar la cuenta
6 Fecha de caducidad. días desde 1-1-1970, donde la cuenta es deshabilatada y el usuario no podrá iniciar sesión

Grupos Linux

Los usuarios se agrupan en grupos. Los grupos también se identifican por un nombre y el sistema les asocia un número identificativo (GID). Todo usuario tiene un grupo principal, pero puede pertenecer a varios grupos, con lo cual hereda sus privilegios. Los grupos permiten dar derechos y restringir opciones de forma global a múltiples usuarios

La relación de los grupos se guarda en el fichero /etc/group. Existe también el fichero /etc/gshadow para contraseñas cifradas de grupo, aunque no es muy utilizado

Estructura

La estructura del fichero group es la siguiente:

grupo El nombre del grupo (es recomendable que no tenga más de 8 caracteres)
x Una “x” indica que el password está almacenado en /etc/gshadow
gid Cada grupo tiene asignado un número identificador (gid) entre 0 (root) y 65535 (los gid 0 a 499 están reservados por el sistema), por lo que empezarán a numerar a partir del 500
lista miembros Lista de los miembros del grupo, separados por comas (sin espacios)

Algunos de los grupos más comunes pueden encontrarse en la siguiente tabla:

Grupo GID Miembros
root 0 root
bin 1 root, bin, daemon
daemon 2 root, bin, daemon
sys 3 root, bin, adm
adm 4 root, adm, daemon
tty 5
disk 6 root
lp 7
mem 8
kmem 9
wheel 10 root
mail 12 mail
news 13 news
uucp 14 uucp
man 15
games 20
gopher 30
dip 40
ftp 50
lock 54
nobody 99
users 100
slocate 21
floppy 19
vcsa 69
rpm 37 rpm
utmp 22
wnn 49
ntp 38
nscd 28
apache 48
mysql 27
mailnull 47
smmsp 51
rpc 32
xfs 43
gdm 42
rpcuser 29
nfsnobody 65534
ident 98
radvd 75
sshd 74
postgres 26
squid 23
named 25
pcap 77
wine 66
Mailman 41
netdump 34
ldap 55
postdrop 90
postfix 89
privoxy 101
pvm 24

Añadir

El comando para añadir grupos es groupadd

En el ejemplo hemos creado el grupo server con un gid 500, en caso de no poner nada usaría el mayor de 500 no usado por otro grupo. Se pude usar el parámetro -g para fijar el gid de forma manual

Si queremos añadir usuarios existentes al grupo recién creado usaremos el comando gpasswd

En el ejemplo hemos añadido el usuario patxi con el parámetro -a al grupo server

Modificar

El comando para modificar grupos es groupmod

En el ejemplo hemos modificado el gid a 501 del grupo server

Este comando admite los siguientes parámetros:

-g Modificar gid del grupo
-n Modificar nombre del grupo

Este comando únicamente realiza cambios en el archivo /etc/group, por lo tanto el resto de
modificaciones implicadas en el cambio del gid de un grupo, se han de hacer manualmente en los archivos /etc/passwd y /etc/gshadow

Borrar

El comando para borrar un grupo es groupdel

En el ejemplo borrado el grupo server

No se puede eliminar un grupo que sea grupo inicial de algún usuario, sin eliminar primero el usuario

El comando no recorre el sistema de ficheros en busca de archivos propiedad del grupo. Si
deseamos eliminarlos, hemos manualmente o con comandos de borrado de archivos

Si queremos eliminar usuarios existentes al grupo recién creado usaremos el comando gpasswd

En el ejemplo hemos eliminado el usuario patxi con el parámetro -d del grupo server. Pero no se borrará el directorio de home del grupo

Proceso del sistema operativo

Proceso

Un proceso es una unidad de procesamiento gestionada por el sistema operativo (es un programa en ejecución)

El sistema operativo implementa una colección de máquinas abstractas

Cada máquina es una simulación del hardware de von Neumann subyacente

El gestor de procesos crea el entorno en el que coexisten varios procesos. Cada uno se ejecuta en su propia máquina abstracta como multitarea

Un recurso es cualquier elemento de la máquina abstracta que puede ser solicitado por un proceso

Un proceso solicita un recurso realizando una llamada al sistema, lo que puede producir que se bloquee si no está disponible

La reserva del recurso produce que el recurso forme parte de la configuración de la máquina abstracta del proceso

Ejemplos de recursos: procesador, memoria principal, dispositivos E/S, archivos

Tablas del sistema operativo

El sistema operativo mantiene tablas que describen a los procesos y a los recursos del sistema:

  • Tablas de procesos: tablas de BCPs
  • Tablas de memoria: información sobre el uso de la memoria
  • Tablas de E/S: información asociada a los periféricos y a las operaciones de E/S
  • Tablas de archivos: información sobre los ficheros abiertos

Tablas del sistema operativo

Imagen de memoria del proceso

Un espacio de direcciones del proceso es el conjunto de direcciones lógicas que puede direccionar

En ordenadores de 32 bits el máximo es de 4 GB

En ordenadores de 64 bits el máximo es de 128 GB, sin embargo, en la actualidad no hay placas que admitan memorias tan grandes

La imagen de memoria del proceso es el bloque de memoria física asignada al proceso

El espacio de direcciones del proceso se encuentra limitado al bloque de direcciones físicas correspondientes

El espacio de direcciones es importante para la protección de los recursos frente a los accesos no autorizados

Estado del procesador

Cuando está ejecutándose, el estado del procesador reside en los registros del procesador:

  • Registros generales
  • Contador de programa (PC)
  • Puntero de pila (SP)
  • Registros de estado
  • Registros especiales

Cuando no ejecuta, su estado del procesador reside en el BCP

Cambio de contexto

Cuando se produce una interrupción:

  • Se salva el estado del procesador en el correspondiente BCP
  • Se pasa a ejecutar la rutina de tratamiento de interrupción del sistema operativo

Planificador o scheduler:

  • Módulo del sistema operativo que selecciona el siguiente proceso a ejecutar

Activador o dispatcher:

  • Módulo del sistema operativo que pone en ejecución el proceso seleccionado

Bloque de control de proceso (BCP)

Información de identificación de proceso

  • ID del proceso y del padre (pid, ppid)
  • ID del usuario real y efectivo (uid, euid)
  • ID del grupo real y efectivo (gid, egid)

Información del estado del procesador

Información de control del proceso

  • Información de planificación y de estado
  • Descripción del espacio de direcciones
  • Recursos asignados (ficheros abiertos, puertos, …)
  • Comunicación entre procesos
  • Punteros para estructurar los procesos en listas o colas

Control de procesos

Control de procesos

El control de procesos nos permite hablar de ejecución, hebras o subprocesos, que son una secuencia de tareas encadenadas tan pequeñas que pueden ser ejecutadas por un sistema operativo

Modelo de proceso con dos estados

Un proceso puede estar en uno de estos dos estados básicos:

  • Ejecución
  • No Ejecución

Proceso de dos estados

Procesos en no ejecución

Con una sola cola de procesos en no ejecución, el planificador tendría que recorrerla para buscar un proceso que no está bloqueado. No sirve la estrategia FIFO (First-in, First-out)

Dos tipos de procesos en no ejecución:

  • Listos para ejecutarse
  • Bloqueados: Esperan a que termine una operación de E/S

Modelo de cinco estados

  • Ejecución
  • Listo
  • Bloqueado
  • Nuevo
  • Terminado

Proceso de cinco estados

Procesos suspendidos

El sistema operativo puede decidir “desalojar” un proceso de memoria principal y transferirlo a disco

Dos nuevos estados:

  • Bloqueado / Suspendido: El proceso está en memoria secundaria esperando un suceso
  • Listo / Suspendido: El proceso está en memoria secundaria disponible para su ejecución

Proceso de dos estados en suspensión

Señales y excepciones

Las señales y las excepciones son mecanismos que utiliza un sistema operativo para notificar a un proceso la ocurrencia de un determinado evento

Las señales son utilizadas en POSIX y las excepciones son utilizadas en Windows

Señales

Una señal es la interrupción de un proceso

Recepción de la señal:

  • El proceso detiene su ejecución
  • Bifurca a ejecutar una rutina de tratamiento de la señal (el código debe formar parte del propio proceso)
  • Una vez ejecutada la rutina de tratamiento, sigue la ejecución del proceso

Envío de la señal:

  • El origen puede ser el sistema operativo o un proceso
  • En POSIX, se realiza mediante el servicio kill

Excepciones

Evento que ocurre durante la ejecución de un programa y que requiere la ejecución de un fragmento de código fuera del flujo normal de ejecución

Pueden ser generadas por el hardware o el software

El manejo de excepciones necesita el soporte del lenguaje de programación. Por ejemplo, en Java:

Hilos (thread)

Un gestor de procesos moderno separa la ejecución dinámica de los aspectos estáticos del entorno computacional del proceso:

  • Proceso moderno: Unidad de propiedad de los recursos
  • Hilo (o proceso ligero): Unidad o motor de ejecución

Un proceso puede contener un solo hilo base o varios hilos de ejecución

Estados de un hilo

Estados:

  • Ejecución
  • Listo
  • Bloqueado

El estado suspensión pertenece al concepto de proceso

Operaciones básicas relacionadas con el cambio de estado en hilos:

  • Creación / destrucción de un hilo
    • Cuando se crea un proceso, también se crea un hilo
    • Un hilo de un proceso puede crear otros hilos dentro del mismo proceso
  • Bloqueo / Desbloqueo
    • Reserva de recursos específicos del hilo

Procesos en un entorno multihilo

Información propia de cada hilo:

  • Registros del procesador: contador, pila, de estado, etc
  • Estado del hilo: Ejecución, Listo o Bloqueado

Información compartida por todos los hilos de un mismo proceso:

  • Espacio de direcciones: código y datos
  • Variables globales
  • Archivos abiertos
  • Otros recursos compartidos

Beneficios de los hilos

Facilita la modularidad permitiendo encapsular cada tarea en un hilo independiente

Aumenta la velocidad de ejecución del trabajo:

  • Se tarda menos tiempo en crear / terminar un nuevo hilo que un proceso
  • Se tarda menos tiempo en cambiar de contexto entre dos hilos de un mismo proceso
  • Puesto que los hilos de un mismo proceso comparten memoria y archivos, pueden comunicarse entre sí sin invocar al núcleo

Permite la programación concurrente

Proceso servidor

Un servidor es un proceso que está pendiente de recibir órdenes de trabajo que provienen de otros procesos (clientes)

Una vez recibida la orden, la ejecuta y responde al cliente con el resultado

La comunicación entre el proceso cliente y el servidor, se realiza mediante los puertos

Proceso demonio (daemon)

Se arrancan al iniciar el sistema. Están siempre activos y no mueren

Se ejecutan en segundo plano y no están asociados a un terminal o proceso login

Están normalmente a la espera de un evento o realizan una tarea de forma periódica

No hacen directamente el trabajo: lanzan otros procesos (o hilos) para que realicen su tarea

Ejemplos: servidor de FTP, servidor web, …

POSIX para la gestión de procesos

POSIX para la gestión de procesos

Identificación de procesos

POSIX identifica cada proceso por medio de un entero único denominado identificador de proceso de tipo pid_t

La función para obtener el identificador del proceso que realiza la llamada es

La función para obtener el identificador del proceso padre es

La función para obtener el identificador de usuario real es

La función para obtener el identificador de grupo real es

Entorno de un proceso

El entorno de un proceso consta de la lista de variables que se pasan al proceso en el momento de empezar su ejecución

Son accesibles a través una variable externa que apunta a una lista de variables de entorno:

Algunas variable de entorno:

  • HOME: directorio de trabajo inicial del usuario
  • LOGNAME: nombre del usuario asociado al proceso

La función para obtener el valor de una variable de entorno es char

Creación de procesos

La función para crear un proceso es

Devuelve el identificador del proceso hijo al proceso padre y 0 al proceso hijo, devolverá -1 en caso de error

Crea un proceso hijo que ejecuta el mismo programa que el padre. Hereda los ficheros abiertos (se copian los descriptores)

Las funciones para ejecutar un programa (código) distinto son:

Como argumentos se utilizan path, file del nombre del archivo ejecutable y arg como argumentos del ejecutable

Devuelve -1 en caso de error. Si tiene éxito no devolverá ningún valor

Cambia la imagen de memoria del proceso. El mismo proceso ejecuta otro programa pero mantiene los ficheros abiertos

Terminación de procesos

La función para terminar un proceso es

Como argumento se utiliza estado, que es el código de retorno al proceso padre

Finaliza la ejecución del proceso

Se cierran todos los descriptores de ficheros abiertos

Se liberan todos los recursos del proceso

Espera la terminaciçon de un proceso

Las funciones para esperar por la finalización de un proceso hijo son:

Como argumentos se utilizan estado, el identificador de terminación del proceso hijo, pid, identificador del proceso, opciones, identificador de opciones

Devuelve el identificador del proceso hijo ó -1 en caso de error

Permite a un proceso padre esperar hasta que termine la ejecución de un proceso hijo

Programa de ejemplo

Planificación

Planificación

Se necesita realizar una planificación para determinar cuáles serán los programas admitidos en el sistema

Tipos de planificación

  • Planificación a largo plazo: Decisión de añadir procesos al conjunto de procesos a ejecutar
  • Planificación a medio plazo: Decisión de añadir procesos al conjunto de procesos que se encuentran parcial o completamente en la memoria
  • Planificación a corto plazo: Decisión sobre qué proceso / hilo disponible será ejecutado en el procesador

Planificación a largo plazo

Determina cuáles son los programas admitidos en el sistema. Debe tomar dos decisiones:

  • Cuándo puede crear un nuevo proceso
  • Cuál va a ser el siguiente proceso a admitir. Combinar procesos con mayor carga de procesador y procesos con mayor carga de E/S

Controla el grado de multiprogramación. Cuantos más procesos se crean, menor es el porcentaje de tiempo en el que cada proceso se puede ejecutar

Planificación a medio plazo

Forma parte de la función de intercambio

Se basa en la necesidad de controlar el grado de multiprogramación

Si no se emplea memoria virtual, deberá tener en cuenta las necesidades de memoria del proceso

Planificación a corto plazo

Planificación del uso de la CPU: Gestionar la compartición de la CPU entre los procesos / hilos listos para ejecutarse

El objetivo del planificador (scheduler) es repartir el tiempo del procesador entre los procesos / hilos que pueden ejecutar

Debe tener en cuenta factores como:

  • Equidad: repartir el uso de la CPU
  • Eficiencia: evitar tiempos ociosos de la CPU
  • Rendimiento: maximizar el número de peticiones

Mecanismos de planificación

El planificador está compuesto por tres componentes lógicos:

  • Encolador: Cuando un proceso cambia al estado Listos, el encolador lo coloca en una estructura de datos de tipo cola
  • Conmutador de contexto: Cuando un proceso va a ser desalojado de la CPU, el conmutador de contexto guarda el contenido de los registros de la CPU en el BCP del proceso
  • Distribuidor: El distribuidor selecciona uno de los procesos de la cola de Listos y le asigna la CPU

Diagrama de colas de planificación

Criterios de la planificación

Criterios para comparar el rendimiento de los diversos algoritmos de planificación:

  • Tiempo de servicio (T_s) Tiempo estimado de ejecución
  • Tiempo de retorno (T_r) Tiempo transcurrido desde que llega al sistema hasta que termina
  • Tiempo de espera (T_w) Suma de tiempos que el proceso está en no ejecución
  • Tiempo de retorno normalizado (\frac{T_r}{T_s}) Tiempo de retorno dividido por el tiempo de servicio

Uso de prioridades

El planificador seleccionará siempre a un proceso de mayor prioridad antes que a los de menor prioridad

Utiliza múltiples colas de Listos para representar cada nivel de prioridad

Los procesos de prioridad más baja pueden sufrir inanición (no son elegidos núnca)

Una solución ante la inanición consiste en permitir que un proceso cambie su prioridad en función de su antigüedad o su historial de ejecución

Políticas de planificación

Se basan en una función de selección para determinar qué proceso, de entre los Listos, se elige para ejecutar

La función puede estar basada en prioridades, necesidades de recursos o en las características de ejecución de los procesos

Hay dos clases de algoritmos según el modo de decisión (instante en que se aplica la función de selección):

  • Sin expulsión (no apropiativos o no preferentes): Una vez que el proceso pasa al estado de Ejecución, continúa ejecutando hasta que termina o se bloquea en espera de una E/S (ráfaga)
  • Con expulsión (apropiativos o preferentes): El proceso que se está ejecutando actualmente puede ser interrumpido y pasado al estado de Listos por el sistema operativo. Permiten dar un mejor servicio ya que evitan que un proceso pueda monopolizar el procesador durante mucho tiempo

Algoritmos de planificación

Algoritmos sin expulsión:

  • FIFO (First-come First-served): Primero en llegar, primero en ser servido
    • Se selecciona para ejecutar el proceso más antiguo de la cola de Listos
    • Sencillo de implementar
    • Tiempo medio de espera muy alto
    • Penaliza a los procesos cortos sobre los procesos largos
    • Favorece a los procesos con carga de CPU sobre los procesos con carga de E/S
    • Suele utilizarse combinado con prioridades
  • SPN (Shortest Process Next): Primero el proceso más corto
    • Se selecciona el proceso con menor tiempo de servicio
    • Dificultad en estimar el tiempo esperado de ejecución para cada proceso
    • Minimiza el tiempo medio de espera
    • Penaliza a los procesos largo sobre los procesos cortos
    • Posibilidad de inanición para los procesos largos

Algoritmos con expulsión:

  • Turno rotatorio (RR, Round Robin)
    • Utiliza un cuanto de tiempo que es una fracción de tiempo que permite a cada proceso utilizar la CPU
    • Se expulsa el proceso que ha consumido su cuanto de tiempo y pasa a ocupar el último lugar de la cola de Listos
    • Hay dificultades para elegir el tamaño del cuanto (inferior al 80% de las ráfagas de CPU)
    • Favorece a los procesos con carga de CPU sobre los procesos con carga de E/S
    • El tiempo de espera grande, pero garantiza un reparto de la CPU con buenos tiempos de respuesta
  • FB (Feedback): Realimentación multinivel
    • Divide la cola de Listos en una jerarquía de colas: RQ_0, \cdots, RQ_n, cada una con un nivel de prioridad
    • Utiliza un cuanto de tiempo y un mecanismo dinámico de prioridades
    • Los procesos entran por RQ_0 y en cada ráfaga de ejecución descienden a la siguiente cola
    • En cada cola se utiliza FIFO, excepto en la de menor prioridad que se trata con turno rotatorio
    • Favorece a los procesos cortos frente a los procesos más viejos y largos
      • Los procesos cortos terminarán rápidamente, sin descender demasiado en la jerarquía de colas
      • Los procesos largos serán gradualmente llevados hacia abajo
    • Existe un gran número de variaciones de este esquema
    • Para evitar la inanición de los procesos largos se puede variar el cuanto en función de cada cola

    Planificación en POSIX

    Cada política de planificación lleva asociada un rango de, al menos, 32 niveles de prioridad

    El planificador seleccionará el proceso con la prioridad más alta

    Cuando un proceso es expulsado por otro de mayor prioridad, el proceso pasa a ser el primero de la cola asociada a su prioridad

    En el planificador conviven tres políticas de planificación:

    • SCHED_FIFO: Es una política de planificación expulsora basada en prioridades estáticas, en la que los procesos con la misma prioridad se atienden en el orden de llegada (cola FIFO). Esta política tendrá al menos 32 niveles de prioridad
    • SCHED_RR: Esta política es muy similar a SCHED_FIFO, pero emplea un método round-robin para planificar procesos de la misma prioridad. También tiene 32 niveles de prioridad como mínimo
    • SCHED_OTHER: Es una política de planificación definida por la implementación

    Servicios POSIX para la planificación de procesos

    Las tres políticas de planificación están definidas en el archivo de cabecera

    Modificar los parámetros de planificación de un proceso:

    Obtener los parámetros de planificación de un proceso: