Un sistema operativo ( SO ) es un software de sistema que administra los recursos de hardware y software de la computadora y proporciona servicios comunes para los programas de la computadora .
Los sistemas operativos de tiempo compartido programan tareas para un uso eficiente del sistema y también pueden incluir software de contabilidad para la asignación de costos de tiempo de procesador , almacenamiento masivo , periféricos y otros recursos.
Para funciones de hardware como entrada y salida y asignación de memoria , el sistema operativo actúa como intermediario entre los programas y el hardware de la computadora, [1] [2] aunque el código de aplicación generalmente es ejecutado directamente por el hardware y con frecuencia realiza llamadas del sistema a una función del SO o es interrumpido por este. Los sistemas operativos se encuentran en muchos dispositivos que contienen una computadora, desde teléfonos celulares y consolas de videojuegos hasta servidores web y supercomputadoras .
En el mercado de ordenadores personales , a septiembre de 2024 [actualizar], Microsoft Windows tiene una cuota de mercado dominante de alrededor del 73%. macOS de Apple Inc. ocupa el segundo lugar (15%), Linux el tercero (5%) y ChromeOS el cuarto (2%). [3] En el sector móvil (incluidos los teléfonos inteligentes y las tabletas ), a septiembre de 2023 [actualizar], la cuota de Android es del 68,92%, seguida de iOS y iPadOS de Apple con el 30,42%, y otros sistemas operativos con el 0,66%. [4] Las distribuciones de Linux son dominantes en los sectores de servidores y supercomputación. Existen otras clases especializadas de sistemas operativos (sistemas operativos de propósito especial), [5] [6] como los sistemas integrados y en tiempo real, para muchas aplicaciones. También existen sistemas operativos centrados en la seguridad . Algunos sistemas operativos tienen requisitos de sistema bajos (por ejemplo, distribución de Linux ligera ). Otros pueden tener requisitos de sistema más elevados.
Algunos sistemas operativos requieren instalación o pueden venir preinstalados en las computadoras compradas ( instalación OEM ), mientras que otros pueden ejecutarse directamente desde un medio (es decir, Live CD ) o una memoria flash (es decir, una memoria USB ).
Un sistema operativo es difícil de definir, [7] pero se le ha llamado "la capa de software que administra los recursos de una computadora para sus usuarios y sus aplicaciones ". [8] Los sistemas operativos incluyen el software que siempre está ejecutándose, llamado núcleo , pero también pueden incluir otro software. [7] [9] Los otros dos tipos de programas que pueden ejecutarse en una computadora son los programas del sistema , que están asociados con el sistema operativo, pero pueden no ser parte del núcleo, y las aplicaciones, todo el resto del software. [9]
Hay tres propósitos principales que cumple un sistema operativo: [10]
Con multiprocesadores, varias CPU comparten memoria. Una computadora multiordenador o en clúster tiene varias CPU, cada una de las cuales tiene su propia memoria . Las multiordenadores se desarrollaron porque los multiprocesadores grandes son difíciles de diseñar y prohibitivamente caros; [18] son universales en la computación en la nube debido al tamaño de la máquina necesaria. [19] Las diferentes CPU a menudo necesitan enviar y recibir mensajes entre sí; [20] para garantizar un buen rendimiento, los sistemas operativos para estas máquinas necesitan minimizar esta copia de paquetes . [21] Los sistemas más nuevos suelen ser multicola (separando grupos de usuarios en colas separadas ) para reducir la necesidad de copiar paquetes y admitir más usuarios simultáneos. [22] Otra técnica es el acceso directo a memoria remota , que permite que cada CPU acceda a la memoria que pertenece a otras CPU. [20] Los sistemas operativos multiordenador a menudo admiten llamadas a procedimientos remotos donde una CPU puede llamar a un procedimiento en otra CPU, [23] o memoria compartida distribuida , en la que el sistema operativo usa la virtualización para generar memoria compartida que en realidad no existe. [24]
Un sistema distribuido es un grupo de computadoras distintas y conectadas en red , cada una de las cuales puede tener su propio sistema operativo y sistema de archivos. A diferencia de las multicomputadoras, pueden estar dispersas en cualquier parte del mundo. [25] El middleware , una capa de software adicional entre el sistema operativo y las aplicaciones, se utiliza a menudo para mejorar la coherencia. Aunque funciona de forma similar a un sistema operativo, no es un verdadero sistema operativo. [26]
Los sistemas operativos integrados están diseñados para usarse en sistemas informáticos integrados , ya sean objetos de Internet de las cosas o no conectados a una red. Los sistemas integrados incluyen muchos electrodomésticos. El factor distintivo es que no cargan software instalado por el usuario. En consecuencia, no necesitan protección entre diferentes aplicaciones, lo que permite diseños más simples. Los sistemas operativos muy pequeños pueden ejecutarse en menos de 10 kilobytes , [27] y los más pequeños son para tarjetas inteligentes . [28] Los ejemplos incluyen Embedded Linux , QNX , VxWorks y los sistemas extrapequeños RIOT y TinyOS . [29]
Un sistema operativo en tiempo real es un sistema operativo que garantiza procesar eventos o datos en un momento específico en el tiempo. Los sistemas de tiempo real estricto requieren una sincronización exacta y son comunes en la fabricación , la aviónica , el ejército y otros usos similares. [29] Con los sistemas de tiempo real flexible, es aceptable que se pierda un evento ocasional; esta categoría a menudo incluye sistemas de audio o multimedia, así como teléfonos inteligentes. [29] Para que los sistemas de tiempo real estricto sean lo suficientemente exactos en su sincronización, a menudo son solo una biblioteca sin protección entre aplicaciones, como eCos . [29]
Un hipervisor es un sistema operativo que ejecuta una máquina virtual . La máquina virtual no sabe que es una aplicación y funciona como si tuviera su propio hardware. [15] [30] Las máquinas virtuales se pueden pausar, guardar y reanudar, lo que las hace útiles para la investigación, el desarrollo [31] y la depuración de sistemas operativos. [32] También mejoran la portabilidad al permitir que las aplicaciones se ejecuten en una computadora incluso si no son compatibles con el sistema operativo base. [15]
Un sistema operativo de biblioteca (libOS) es aquel en el que los servicios que proporciona un sistema operativo típico, como la red, se proporcionan en forma de bibliotecas y se componen de un único código de aplicación y configuración para construir un unikernel : [33] una imagen de máquina especializada (solo las piezas de código absolutamente necesarias se extraen de las bibliotecas y se unen [34] ), con un único espacio de direcciones que se puede implementar en entornos de nube o integrados.
El código del sistema operativo y el código de la aplicación no se ejecutan en dominios de protección separados (solo hay una única aplicación ejecutándose, al menos conceptualmente, por lo que no hay necesidad de evitar interferencias entre aplicaciones) y se accede a los servicios del sistema operativo a través de simples llamadas a bibliotecas (posiblemente incorporándolas en línea según los umbrales del compilador), sin la sobrecarga habitual de los cambios de contexto , [35] de una manera similar a los sistemas operativos integrados y de tiempo real. Tenga en cuenta que esta sobrecarga no es despreciable: al costo directo del cambio de modo es necesario agregar la contaminación indirecta de estructuras importantes del procesador (como las cachés de la CPU , el flujo de instrucciones , etc.) que afecta tanto al rendimiento del modo usuario como al del modo kernel. [36]
Las primeras computadoras a finales de la década de 1940 y 1950 se programaban directamente con tableros de conexiones o con código de máquina ingresado en medios como tarjetas perforadas , sin lenguajes de programación o sistemas operativos. [37] Después de la introducción del transistor a mediados de la década de 1950, comenzaron a construirse mainframes . Estos aún necesitaban operadores profesionales [37] que hicieran manualmente lo que haría un sistema operativo moderno, como programar programas para que se ejecuten, [38] pero los mainframes aún tenían sistemas operativos rudimentarios como Fortran Monitor System (FMS) e IBSYS . [39] En la década de 1960, IBM presentó la primera serie de computadoras intercompatibles ( System/360 ). Todas ellas ejecutaban el mismo sistema operativo, OS/360 , que consistía en millones de líneas de lenguaje ensamblador que tenían miles de errores . El OS/360 también fue el primer sistema operativo popular que admitió multiprogramación , de modo que la CPU podía utilizarse en un trabajo mientras otro esperaba una entrada/salida (E/S). Mantener varios trabajos en la memoria requería particionamiento de memoria y salvaguardas para evitar que un trabajo accediera a la memoria asignada a otro diferente. [40]
En la misma época, los teletipos comenzaron a usarse como terminales para que varios usuarios pudieran acceder al ordenador simultáneamente. El sistema operativo MULTICS fue pensado para permitir que cientos de usuarios accedieran a un ordenador grande. A pesar de su adopción limitada, puede considerarse el precursor de la computación en la nube . El sistema operativo UNIX se originó como un desarrollo de MULTICS para un solo usuario. [41] Debido a que el código fuente de UNIX estaba disponible, se convirtió en la base de otros sistemas operativos incompatibles, de los cuales los más exitosos fueron System V de AT&T y Berkeley Software Distribution (BSD) de la Universidad de California . [42] Para aumentar la compatibilidad, el IEEE lanzó el estándar POSIX para interfaces de programación de aplicaciones (API) de sistemas operativos, que es compatible con la mayoría de los sistemas UNIX. MINIX fue una versión reducida de UNIX, desarrollada en 1987 para usos educativos, que inspiró el software libre comercialmente disponible Linux . Desde 2008, MINIX se usa en controladores de la mayoría de los microchips Intel , mientras que Linux está muy extendido en centros de datos y teléfonos inteligentes Android . [43]
La invención de la integración a gran escala permitió la producción de computadoras personales (inicialmente llamadas microcomputadoras ) a partir de 1980. [44] Durante unos cinco años, el CP/M (Control Program for Microcomputers) fue el sistema operativo más popular para microcomputadoras. [45] Más tarde, IBM compró el DOS (Disk Operating System) de Microsoft . Después de las modificaciones solicitadas por IBM, el sistema resultante se llamó MS-DOS (MicroSoft Disk Operating System) y fue ampliamente utilizado en las microcomputadoras de IBM. Las versiones posteriores aumentaron su sofisticación, en parte al tomar prestadas características de UNIX. [45]
El Macintosh de Apple fue el primer ordenador popular en utilizar una interfaz gráfica de usuario (GUI). La GUI resultó ser mucho más fácil de usar que la interfaz de línea de comandos de solo texto que habían utilizado los sistemas operativos anteriores. Tras el éxito de Macintosh, MS-DOS se actualizó con una superposición de GUI llamada Windows . Windows más tarde se reescribió como un sistema operativo independiente, tomando prestadas tantas características de otro ( VAX VMS ) que se pagó un gran acuerdo legal . [46] En el siglo XXI, Windows sigue siendo popular en los ordenadores personales, pero tiene una menor cuota de mercado en los servidores. Los sistemas operativos UNIX, especialmente Linux, son los más populares en los sistemas empresariales y servidores, pero también se utilizan en dispositivos móviles y muchos otros sistemas informáticos. [47]
En los dispositivos móviles, Symbian OS fue dominante al principio, siendo reemplazado por BlackBerry OS (introducido en 2002) e iOS para iPhone (a partir de 2007). Más tarde, el sistema operativo de código abierto Android (introducido en 2008), con un núcleo Linux y una biblioteca C ( Bionic ) parcialmente basada en código BSD, se hizo más popular. [48]
Los componentes de un sistema operativo están diseñados para garantizar que las distintas partes de una computadora funcionen de manera cohesiva. Todo el software del usuario debe interactuar con el sistema operativo para acceder al hardware.
El núcleo es la parte del sistema operativo que proporciona protección entre las diferentes aplicaciones y usuarios. Esta protección es clave para mejorar la fiabilidad al mantener los errores aislados en un programa, así como la seguridad al limitar el poder del software malicioso y proteger los datos privados, y garantizar que un programa no pueda monopolizar los recursos del ordenador. [49] La mayoría de los sistemas operativos tienen dos modos de funcionamiento: [50] en modo usuario , el hardware comprueba que el software sólo esté ejecutando instrucciones legales, mientras que el núcleo tiene poderes ilimitados y no está sujeto a estos controles. [51] El núcleo también gestiona la memoria para otros procesos y controla el acceso a los dispositivos de entrada/salida . [52]
El sistema operativo proporciona una interfaz entre un programa de aplicación y el hardware de la computadora, de modo que un programa de aplicación puede interactuar con el hardware solo obedeciendo reglas y procedimientos programados en el sistema operativo. El sistema operativo también es un conjunto de servicios que simplifican el desarrollo y la ejecución de programas de aplicación. La ejecución de un programa de aplicación generalmente implica la creación de un proceso por parte del núcleo del sistema operativo , que asigna espacio de memoria y otros recursos, establece una prioridad para el proceso en sistemas multitarea, carga el código binario del programa en la memoria e inicia la ejecución del programa de aplicación, que luego interactúa con el usuario y con los dispositivos de hardware. Sin embargo, en algunos sistemas una aplicación puede solicitar que el sistema operativo ejecute otra aplicación dentro del mismo proceso, ya sea como una subrutina o en un hilo separado, por ejemplo, las funciones LINK y ATTACH de OS/360 y sucesores .
Una interrupción (también conocida como aborto , excepción , fallo , señal , [53] o trampa ) [54] proporciona una forma eficiente para que la mayoría de los sistemas operativos reaccionen al entorno. Las interrupciones hacen que la unidad central de procesamiento (CPU) tenga un cambio de flujo de control que se aleje del programa que se está ejecutando actualmente a un manejador de interrupciones , también conocido como una rutina de servicio de interrupciones (ISR). [55] [56] Una rutina de servicio de interrupciones puede hacer que la unidad central de procesamiento (CPU) tenga un cambio de contexto . [57] [a] Los detalles de cómo una computadora procesa una interrupción varían de una arquitectura a otra, y los detalles de cómo se comportan las rutinas de servicio de interrupciones varían de un sistema operativo a otro. [58] Sin embargo, varias funciones de interrupción son comunes. [58] La arquitectura y el sistema operativo deben: [58]
Una interrupción de software es un mensaje a un proceso de que se ha producido un evento. [53] Esto contrasta con una interrupción de hardware , que es un mensaje a la unidad central de procesamiento (CPU) de que se ha producido un evento. [59] Las interrupciones de software son similares a las interrupciones de hardware: hay un cambio que se aleja del proceso que se está ejecutando actualmente. [60] De manera similar, tanto las interrupciones de hardware como las de software ejecutan una rutina de servicio de interrupción .
Las interrupciones de software pueden ser eventos que ocurren normalmente. Se espera que se produzca un intervalo de tiempo , por lo que el núcleo tendrá que realizar un cambio de contexto . [61] Un programa de computadora puede configurar un temporizador para que se active después de unos segundos en caso de que demasiados datos hagan que un algoritmo tarde demasiado. [62]
Las interrupciones de software pueden ser condiciones de error, como una instrucción de máquina mal formada . [62] Sin embargo, las condiciones de error más comunes son la división por cero y el acceso a una dirección de memoria no válida . [62]
Los usuarios pueden enviar mensajes al núcleo para modificar el comportamiento de un proceso que se está ejecutando actualmente. [62] Por ejemplo, en el entorno de línea de comandos , al presionar el carácter de interrupción (generalmente Control-C ) se puede finalizar el proceso que se está ejecutando actualmente. [62]
Para generar interrupciones de software para CPU x86 , está disponible la instrucción en lenguaje ensamblador INT . [63] La sintaxis es , donde es el número de desplazamiento (en formato hexadecimal ) a la tabla de vectores de interrupción .INT X
X
Para generar interrupciones de software en sistemas operativos tipo Unix , la kill(pid,signum)
llamada al sistema enviará una señal a otro proceso. [64] pid
es el identificador de proceso del proceso receptor. signum
es el número de señal (en formato mnemotécnico ) [b] que se enviará. ( kill
Se eligió el nombre abrasivo de porque las primeras implementaciones solo finalizaban el proceso). [65]
En los sistemas operativos tipo Unix, las señales informan a los procesos de la ocurrencia de eventos asincrónicos. [64] Para comunicarse asincrónicamente, se requieren interrupciones. [66] Una razón por la que un proceso necesita comunicarse asincrónicamente con otro proceso resuelve una variación del clásico problema lector/escritor . [67] El escritor recibe una tubería del shell para que su salida se envíe al flujo de entrada del lector. [68] La sintaxis de la línea de comandosalpha | bravo
es . alpha
escribirá en la tubería cuando su cálculo esté listo y luego dormirá en la cola de espera. [69] bravo
luego se moverá a la cola de listos y pronto leerá desde su flujo de entrada. [70] El núcleo generará interrupciones de software para coordinar la tubería. [70]
Las señales se pueden clasificar en siete categorías. [64] Las categorías son:
Los dispositivos de entrada/salida (E/S) son más lentos que la CPU. Por lo tanto, la computadora se volvería más lenta si la CPU tuviera que esperar a que finalice cada E/S. En cambio, una computadora puede implementar interrupciones para la finalización de la E/S, evitando la necesidad de sondeos o esperas activas. [71]
Algunas computadoras requieren una interrupción para cada carácter o palabra, lo que consume una cantidad significativa de tiempo de CPU. El acceso directo a memoria (DMA) es una característica de la arquitectura que permite a los dispositivos pasar por alto la CPU y acceder a la memoria principal directamente. [72] (Independientemente de la arquitectura, un dispositivo puede realizar acceso directo a memoria [c] hacia y desde la memoria principal, ya sea directamente o a través de un bus). [73] [d]
Cuando un usuario de computadora escribe una tecla en el teclado, normalmente el carácter aparece inmediatamente en la pantalla. De la misma manera, cuando un usuario mueve un mouse , el cursor se mueve inmediatamente por la pantalla. Cada pulsación de tecla y movimiento del mouse genera una interrupción llamada E/S impulsada por interrupciones . Una E/S impulsada por interrupciones ocurre cuando un proceso causa una interrupción por cada carácter [73] o palabra [74] transmitido.
Los dispositivos como las unidades de disco duro , las unidades de estado sólido y las unidades de cinta magnética pueden transferir datos a una velocidad lo suficientemente alta como para que interrumpir la CPU por cada byte o palabra transferida, y hacer que la CPU transfiera el byte o la palabra entre el dispositivo y la memoria, requiera demasiado tiempo de CPU. En cambio, los datos se transfieren entre el dispositivo y la memoria independientemente de la CPU mediante hardware como un canal o un controlador de acceso directo a memoria ; una interrupción se entrega solo cuando se transfieren todos los datos. [75]
Si un programa de computadora ejecuta una llamada al sistema para realizar una operación de escritura de bloque de E/S , entonces la llamada al sistema podría ejecutar las siguientes instrucciones:
Mientras se lleva a cabo la escritura, el sistema operativo cambiará de contexto a otros procesos de forma normal. Cuando el dispositivo termine de escribir, interrumpirá el proceso que se esté ejecutando actualmente mediante una solicitud de interrupción . El dispositivo también colocará un número entero en el bus de datos. [79] Al aceptar la solicitud de interrupción, el sistema operativo:
Cuando el tiempo del proceso de escritura haya expirado, el sistema operativo: [80]
Con el contador del programa ahora reiniciado, el proceso interrumpido reanudará su franja de tiempo. [58]
Entre otras cosas, el núcleo de un sistema operativo multiprograma debe ser responsable de gestionar toda la memoria del sistema que esté siendo utilizada por los programas. Esto garantiza que un programa no interfiera con la memoria que ya esté siendo utilizada por otro programa. Dado que los programas comparten el tiempo, cada programa debe tener acceso independiente a la memoria.
La gestión cooperativa de memoria, utilizada por muchos de los primeros sistemas operativos, supone que todos los programas hacen un uso voluntario del gestor de memoria del núcleo y no exceden la memoria asignada. Este sistema de gestión de memoria casi nunca se ve hoy en día, ya que los programas suelen contener errores que pueden hacer que excedan la memoria asignada. Si un programa falla, puede provocar que la memoria utilizada por uno o más programas se vea afectada o sobrescriba. Los programas maliciosos o los virus pueden alterar intencionadamente la memoria de otro programa o pueden afectar al funcionamiento del propio sistema operativo. Con la gestión cooperativa de memoria, basta con que un programa que se comporte mal para que el sistema se bloquee.
La protección de memoria permite que el núcleo limite el acceso de un proceso a la memoria del equipo. Existen varios métodos de protección de memoria, entre ellos la segmentación de memoria y la paginación . Todos los métodos requieren cierto nivel de compatibilidad de hardware (como la MMU 80286 ), que no existe en todos los equipos.
Tanto en la segmentación como en la paginación, ciertos registros de modo protegido especifican a la CPU a qué dirección de memoria debe permitir el acceso de un programa en ejecución. Los intentos de acceder a otras direcciones activan una interrupción, que hace que la CPU vuelva a entrar en modo supervisor , poniendo al núcleo a cargo. Esto se denomina violación de segmentación o Seg-V para abreviar, y dado que es difícil asignar un resultado significativo a una operación de este tipo y que suele ser un signo de un programa que se comporta mal, el núcleo generalmente recurre a terminar el programa infractor e informa del error.
Las versiones de Windows 3.1 a ME tenían cierto nivel de protección de memoria, pero los programas podían evitar fácilmente la necesidad de utilizarla. Se producía un error de protección general , lo que indicaba que se había producido una violación de la segmentación; sin embargo, el sistema solía bloquearse de todos modos.
El uso de direccionamiento de memoria virtual (como paginación o segmentación) significa que el núcleo puede elegir qué memoria puede usar cada programa en un momento dado, lo que permite que el sistema operativo utilice las mismas ubicaciones de memoria para múltiples tareas.
Si un programa intenta acceder a una memoria que no es accesible [e] , pero que, no obstante, se le ha asignado, el núcleo se interrumpe fallo de página .
. Este tipo de interrupción suele ser unCuando el núcleo detecta un error de página, generalmente ajusta el rango de memoria virtual del programa que lo activó, otorgándole acceso a la memoria solicitada. Esto le otorga al núcleo poder discrecional sobre dónde se almacena la memoria de una aplicación en particular, o incluso si ya se ha asignado o no.
En los sistemas operativos modernos, la memoria a la que se accede con menos frecuencia se puede almacenar temporalmente en un disco u otro medio para que ese espacio esté disponible para que lo utilicen otros programas. Esto se denomina intercambio , ya que un área de memoria puede ser utilizada por varios programas y lo que contiene esa área de memoria se puede intercambiar a pedido.
La memoria virtual proporciona al programador o al usuario la percepción de que hay una cantidad de RAM mucho mayor en el ordenador de la que realmente hay. [81]
La concurrencia se refiere a la capacidad del sistema operativo para realizar múltiples tareas simultáneamente. [82] Prácticamente todos los sistemas operativos modernos admiten la concurrencia. [83]
Los subprocesos permiten dividir el trabajo de un proceso en varias partes que pueden ejecutarse simultáneamente. [84] La cantidad de subprocesos no está limitada por la cantidad de procesadores disponibles. Si hay más subprocesos que procesadores, el núcleo del sistema operativo programa, suspende y reanuda los subprocesos, controlando cuándo se ejecuta cada subproceso y cuánto tiempo de CPU recibe. [85] Durante un cambio de contexto, se suspende un subproceso en ejecución, su estado se guarda en el bloque y la pila de control de subprocesos , y se carga el estado del nuevo subproceso. [86] Históricamente, en muchos sistemas un subproceso podía ejecutarse hasta que cediera el control ( multitarea cooperativa ). Debido a que este modelo puede permitir que un solo subproceso monopolice el procesador, la mayoría de los sistemas operativos ahora pueden interrumpir un subproceso ( multitarea preventiva ). [87]
Los subprocesos tienen su propio ID de subproceso, contador de programa (PC), un conjunto de registros y una pila , pero comparten código, datos del montón y otros recursos con otros subprocesos del mismo proceso. [88] [89] Por lo tanto, hay menos sobrecarga para crear un subproceso que un nuevo proceso. [90] En sistemas de una sola CPU, la concurrencia es cambiar entre procesos. Muchas computadoras tienen múltiples CPU. [91] El paralelismo con múltiples subprocesos ejecutándose en diferentes CPU puede acelerar un programa, dependiendo de cuánto de él se pueda ejecutar simultáneamente. [92]
Los dispositivos de almacenamiento permanente que se utilizan en las computadoras del siglo XXI, a diferencia de la memoria de acceso aleatorio dinámica volátil (DRAM), siguen siendo accesibles después de una falla o un corte de energía . El almacenamiento permanente ( no volátil ) es mucho más barato por byte, pero lleva varios órdenes de magnitud más tiempo acceder, leer y escribir. [93] [94] Las dos tecnologías principales son un disco duro que consta de discos magnéticos y una memoria flash (una unidad de estado sólido que almacena datos en circuitos eléctricos). Esta última es más cara, pero más rápida y duradera. [95] [96]
Los sistemas de archivos son una abstracción utilizada por el sistema operativo para simplificar el acceso al almacenamiento permanente. Proporcionan nombres de archivos legibles por humanos y otros metadatos , aumentan el rendimiento mediante la amortización de accesos, evitan que varios subprocesos accedan a la misma sección de memoria e incluyen sumas de comprobación para identificar la corrupción . [97] Los sistemas de archivos se componen de archivos (colecciones de datos con nombre, de un tamaño arbitrario) y directorios (también llamados carpetas) que enumeran nombres de archivos legibles por humanos y otros directorios. [98] Una ruta de archivo absoluta comienza en el directorio raíz y enumera subdirectorios divididos por puntuación, mientras que una ruta relativa define la ubicación de un archivo desde un directorio. [99] [100]
Las llamadas del sistema (que a veces están encapsuladas en bibliotecas) permiten a las aplicaciones crear, eliminar, abrir y cerrar archivos, así como vincularlos, leerlos y escribir en ellos. Todas estas operaciones las lleva a cabo el sistema operativo en nombre de la aplicación. [101] Los esfuerzos del sistema operativo por reducir la latencia incluyen almacenar bloques de memoria solicitados recientemente en una caché y obtener con antelación datos que la aplicación no ha solicitado, pero que podría necesitar a continuación. [102] Los controladores de dispositivos son software específico para cada dispositivo de entrada/salida (E/S) que permite que el sistema operativo funcione sin modificaciones en diferentes hardware. [103] [104]
Otro componente de los sistemas de archivos es un diccionario que asigna el nombre y los metadatos de un archivo al bloque de datos donde se almacena su contenido. [105] La mayoría de los sistemas de archivos utilizan directorios para convertir los nombres de los archivos en números de archivo. Para encontrar el número de bloque, el sistema operativo utiliza un índice (a menudo implementado como un árbol ). [106] Por separado, existe un mapa de espacio libre para rastrear los bloques libres, comúnmente implementado como un mapa de bits . [106] Aunque cualquier bloque libre se puede utilizar para almacenar un nuevo archivo, muchos sistemas operativos intentan agrupar los archivos en el mismo directorio para maximizar el rendimiento, o reorganizar periódicamente los archivos para reducir la fragmentación . [107]
Mantener la fiabilidad de los datos en caso de un fallo informático o de hardware es otra preocupación. [108] Los protocolos de escritura de archivos están diseñados con operaciones atómicas para no dejar el almacenamiento permanente en un estado parcialmente escrito e inconsistente en caso de un fallo en cualquier punto durante la escritura. [109] La corrupción de datos se aborda mediante almacenamiento redundante (por ejemplo, RAID, matriz redundante de discos económicos ) [110] [111] y sumas de comprobación para detectar cuándo se han corrompido los datos. Con múltiples capas de sumas de comprobación y copias de seguridad de un archivo, un sistema puede recuperarse de múltiples fallos de hardware. A menudo se utilizan procesos en segundo plano para detectar y recuperarse de la corrupción de datos. [111]
Seguridad significa proteger a los usuarios de otros usuarios de la misma computadora, así como de aquellos que buscan acceso remoto a ella a través de una red. [112] La seguridad de los sistemas operativos se basa en lograr la tríada CIA : confidencialidad (los usuarios no autorizados no pueden acceder a los datos), integridad (los usuarios no autorizados no pueden modificar los datos) y disponibilidad (asegurar que el sistema permanezca disponible para los usuarios autorizados, incluso en caso de un ataque de denegación de servicio ). [113] Al igual que con otros sistemas informáticos, aislar los dominios de seguridad (en el caso de los sistemas operativos, el núcleo, los procesos y las máquinas virtuales ) es clave para lograr la seguridad. [114] Otras formas de aumentar la seguridad incluyen la simplicidad para minimizar la superficie de ataque , bloquear el acceso a los recursos de forma predeterminada, verificar todas las solicitudes de autorización, el principio de mínima autoridad (otorgar el privilegio mínimo esencial para realizar una tarea), la separación de privilegios y la reducción de los datos compartidos. [115]
Algunos diseños de sistemas operativos son más seguros que otros. Los que no tienen aislamiento entre el núcleo y las aplicaciones son los menos seguros, mientras que los que tienen un núcleo monolítico , como la mayoría de los sistemas operativos de propósito general, siguen siendo vulnerables si se ve comprometida alguna parte del núcleo. Un diseño más seguro presenta micronúcleos que separan los privilegios del núcleo en muchos dominios de seguridad separados y reducen las consecuencias de una única violación del núcleo. [116] Los unikernels son otro enfoque que mejora la seguridad al minimizar el núcleo y separar la funcionalidad de otros sistemas operativos por aplicación. [116]
La mayoría de los sistemas operativos están escritos en C o C++ , lo que crea vulnerabilidades potenciales para su explotación. A pesar de los intentos de protegerse contra ellos, las vulnerabilidades son causadas por ataques de desbordamiento de búfer , que se habilitan por la falta de comprobación de límites . [117] Las vulnerabilidades de hardware, algunas de ellas causadas por optimizaciones de CPU , también se pueden utilizar para comprometer el sistema operativo. [118] Hay casos conocidos de programadores de sistemas operativos que implantan deliberadamente vulnerabilidades, como puertas traseras . [119]
La seguridad de los sistemas operativos se ve obstaculizada por su creciente complejidad y la consiguiente inevitabilidad de errores. [120] Debido a que la verificación formal de los sistemas operativos puede no ser factible, los desarrolladores utilizan el endurecimiento del sistema operativo para reducir las vulnerabilidades, [121] por ejemplo, aleatorización del diseño del espacio de direcciones , integridad del flujo de control , [122] restricciones de acceso , [123] y otras técnicas. [124] No existen restricciones sobre quién puede contribuir con código a los sistemas operativos de código abierto; dichos sistemas operativos tienen historiales de cambios transparentes y estructuras de gobernanza distribuidas. [125] Los desarrolladores de código abierto se esfuerzan por trabajar en colaboración para encontrar y eliminar vulnerabilidades de seguridad, utilizando la revisión de código y la verificación de tipos para eliminar el código malicioso. [126] [127] Andrew S. Tanenbaum aconseja publicar el código fuente de todos los sistemas operativos, argumentando que evita que los desarrolladores confíen en el secreto y, por lo tanto, dependan de la práctica poco confiable de la seguridad por oscuridad . [128]
Una interfaz de usuario (UI) es esencial para facilitar la interacción humana con una computadora. Los dos tipos de interfaz de usuario más comunes para cualquier computadora son:
En el caso de los ordenadores personales, incluidos los teléfonos inteligentes y las tabletas , y de las estaciones de trabajo , la entrada del usuario suele realizarse mediante una combinación de teclado , ratón y panel táctil o pantalla táctil , todos ellos conectados al sistema operativo con software especializado. [129] Los usuarios de ordenadores personales que no son desarrolladores de software ni codificadores suelen preferir las GUI tanto para la entrada como para la salida; la mayoría de los ordenadores personales admiten las GUI. [130] El software que admite las GUI es más complejo que una línea de comandos para la entrada y la salida de texto sin formato. Los programadores suelen preferir la salida de texto sin formato, y es fácil de admitir. [131]
Un sistema operativo de aficionado puede clasificarse como uno cuyo código no se ha derivado directamente de un sistema operativo existente y tiene pocos usuarios y desarrolladores activos. [132]
En algunos casos, el desarrollo por afición se realiza en apoyo de un dispositivo informático " casero ", por ejemplo, una simple computadora de placa única alimentada por un microprocesador 6502. O bien, el desarrollo puede estar orientado a una arquitectura que ya se utiliza ampliamente. El desarrollo de un sistema operativo puede surgir de conceptos completamente nuevos o puede comenzar con el modelado de un sistema operativo existente. En cualquier caso, el aficionado es su propio desarrollador o puede interactuar con un grupo pequeño y a veces desestructurado de individuos que tienen intereses similares.
Algunos ejemplos de sistemas operativos para aficionados son Syllable y TempleOS .
Si una aplicación está escrita para usarse en un sistema operativo específico y se traslada a otro SO, la funcionalidad requerida por esa aplicación puede ser implementada de manera diferente por ese SO (los nombres de las funciones, el significado de los argumentos, etc.), lo que requiere que la aplicación sea adaptada, modificada o mantenida de alguna otra manera .
Este costo de soportar la diversidad de sistemas operativos se puede evitar escribiendo aplicaciones para plataformas de software como Java o Qt . Estas abstracciones ya han soportado el costo de la adaptación a sistemas operativos específicos y sus bibliotecas de sistema .
Otra estrategia es que los proveedores de sistemas operativos adopten estándares. Por ejemplo, las capas de abstracción de POSIX y del sistema operativo ofrecen puntos en común que reducen los costos de portabilidad.
En el mercado de ordenadores personales , a septiembre de 2023 [actualizar], Microsoft Windows tiene la cuota de mercado más alta , alrededor del 68%. macOS de Apple Inc. está en segundo lugar (20%), y las variedades de Linux , incluido ChromeOS , están colectivamente en tercer lugar (7%). [3] En el sector móvil (incluidos los teléfonos inteligentes y las tabletas ), a septiembre de 2023 [actualizar], la cuota de Android es del 68,92%, seguido de iOS y iPadOS de Apple con el 30,42%, y otros sistemas operativos con el 0,66%. [133]
Linux es un software libre distribuido bajo la Licencia Pública General GNU (GPL), lo que significa que todos sus derivados están legalmente obligados a liberar su código fuente . [134] Linux fue diseñado por programadores para su propio uso, enfatizando así la simplicidad y la consistencia, con un pequeño número de elementos básicos que se pueden combinar de formas casi ilimitadas y evitando la redundancia. [135]
Su diseño es similar a otros sistemas UNIX que no utilizan un microkernel . [136] Está escrito en C [137] y utiliza la sintaxis UNIX System V , pero también admite la sintaxis BSD . Linux admite las características de red estándar de UNIX, así como el conjunto completo de herramientas de UNIX, al mismo tiempo que admite múltiples usuarios y emplea multitarea preventiva . Inicialmente de un diseño minimalista, Linux es un sistema flexible que puede funcionar con menos de 16 MB de RAM , pero aún se usa en grandes sistemas multiprocesador . [136] Al igual que otros sistemas UNIX, las distribuciones de Linux se componen de un kernel , bibliotecas del sistema y utilidades del sistema . [138] Linux tiene una interfaz gráfica de usuario (GUI) con un escritorio, íconos de carpetas y archivos, así como la opción de acceder al sistema operativo a través de una línea de comandos . [139]
Android es un sistema operativo parcialmente de código abierto basado estrechamente en Linux y se ha convertido en el sistema operativo más utilizado por los usuarios, debido a su popularidad en los teléfonos inteligentes y, en menor medida, en los sistemas integrados que necesitan una GUI, como " relojes inteligentes , tableros de instrumentos de automóviles , respaldos de asientos de aviones, dispositivos médicos y electrodomésticos ". [140] A diferencia de Linux, gran parte de Android está escrito en Java y utiliza un diseño orientado a objetos . [141]
Windows es un sistema operativo propietario que se usa ampliamente en computadoras de escritorio, portátiles, tabletas, teléfonos, estaciones de trabajo , servidores empresariales y consolas Xbox . [143] El sistema operativo fue diseñado para "seguridad, confiabilidad, compatibilidad, alto rendimiento, extensibilidad, portabilidad y soporte internacional"; más tarde, la eficiencia energética y el soporte para dispositivos dinámicos también se convirtieron en prioridades. [144]
Windows Executive funciona a través de objetos en modo kernel para estructuras de datos importantes como procesos, subprocesos y secciones (objetos de memoria, por ejemplo, archivos). [145] El sistema operativo admite la paginación bajo demanda de la memoria virtual , lo que acelera la E/S para muchas aplicaciones. Los controladores de dispositivos de E/S utilizan el modelo de controlador de Windows . [145] El sistema de archivos NTFS tiene una tabla maestra y cada archivo se representa como un registro con metadatos . [146] La programación incluye multitarea preventiva . [147] Windows tiene muchas características de seguridad; [148] especialmente importantes son el uso de listas de control de acceso y niveles de integridad . Cada proceso tiene un token de autenticación y a cada objeto se le asigna un descriptor de seguridad. Las versiones posteriores han agregado aún más características de seguridad. [146]
La implementación sincrónica de llamadas al sistema afecta negativamente el rendimiento de las cargas de trabajo intensivas del sistema, tanto en términos de los costos
directos
del cambio de modo como, lo que es más interesante, en términos de la contaminación
indirecta
de estructuras importantes del procesador que afecta tanto al rendimiento del modo de usuario como al del modo kernel. Un ejemplo motivador que cuantifica el impacto de la contaminación de las llamadas al sistema en el rendimiento de la aplicación se puede ver en la Figura 1. Representa las instrucciones del modo de usuario por ciclos (se ignoran los ciclos y las instrucciones del kernel) de uno de los puntos de referencia SPEC CPU 2006 (Xalan) inmediatamente antes y después de una
llamada al sistema. Hay una caída significativa en las instrucciones por ciclo (IPC) debido a la llamada al sistema, y se necesitan hasta 14.000 ciclos de ejecución antes de que el IPC de esta aplicación vuelva a su nivel anterior. Como demostraremos, esta degradación del rendimiento se debe principalmente a la interferencia causada por el núcleo en las estructuras clave del procesador.
pwrite
ha producido un evento. Las señales a veces se describen como interrupciones de software.
La familia 80x86 solo ha aumentado la confusión en torno a las interrupciones al introducir la instrucción int (interrupción de software). De hecho, diferentes fabricantes han utilizado términos como excepciones, fallas, abortos, trampas e interrupciones para describir los fenómenos que analiza este capítulo. Lamentablemente, no existe un consenso claro en cuanto al significado exacto de estos términos. Diferentes autores adoptan diferentes términos para su propio uso.
la interrupción detiene el programa en ejecución y transfiere el control a un controlador de interrupciones, que realiza alguna acción apropiada. Cuando termina, el controlador de interrupciones devuelve el control al programa interrumpido.
se produce una interrupción (o trampa), el hardware transfiere el control al sistema operativo. En primer lugar, el sistema operativo preserva el estado de la CPU almacenando registros y el contador de programa. A continuación, determina qué tipo de interrupción se ha producido. Para cada tipo de interrupción, segmentos separados de código en el sistema operativo determinan qué acción se debe tomar.
cambiar la CPU a otro proceso es necesario guardar el estado del proceso anterior y cargar el estado guardado para el nuevo proceso. Esta tarea se conoce como cambio de contexto.
puede activar una interrupción en cualquier momento enviando una señal a la CPU, generalmente a través del bus del sistema.
señales son análogas a las interrupciones de hardware en el sentido de que interrumpen el flujo normal de ejecución de un programa; en la mayoría de los casos, no es posible predecir exactamente cuándo llegará una señal.
Entre los tipos de eventos que hacen que el núcleo genere una señal para un proceso se encuentran los siguientes: Se produjo un evento de software. Por ejemplo, ... se superó el límite de tiempo de CPU del proceso[.]
{{cite journal}}
: CS1 maint: DOI inactivo a partir de junio de 2024 ( enlace )