Fundamentos del Software y Sistemas Operativos
Características Esenciales del Software
El software presenta propiedades únicas que lo distinguen del hardware:
- Es intangible.
- No se deteriora ni se destruye físicamente.
- El software se desarrolla (no se fabrica).
- De cada programa existen múltiples copias; si alguna contiene un fallo, este aparecerá en todas las copias.
Clasificación del Software
Software de Sistemas
Está compuesto por aquellos programas y aplicaciones que no tienen un propósito específico para el usuario final, sino que facilitan la interacción y evitan la complejidad de manejar directamente los componentes de Hardware. Ejemplos incluyen el Sistema Operativo y los controladores de dispositivos.
Software de Aplicación
Son los programas y aplicaciones que realizan tareas específicas para los usuarios con un propósito definido. Ejemplos comunes son:
- Procesadores de texto.
- Hojas de cálculo.
- Navegadores web.
El Sistema Operativo (SO)
El Sistema Operativo es un programa de sistema fundamental que facilita la comunicación con los usuarios de la computadora y sirve de plataforma a partir de la cual se pueden ejecutar los programas de aplicación.
Tareas Principales del SO
El SO tiene las siguientes responsabilidades principales:
- Evitar que usuarios y programas manipulen directamente los componentes de hardware (HW).
- Proporcionar una interfaz que facilite al usuario la comunicación con el ordenador.
- Administrar los dispositivos de hardware en la computadora, sirviendo de intermediario entre ellos y los programas/usuarios.
- Administrar y mantener los sistemas de archivo del disco, agrupando la información en carpetas y proporcionando los mecanismos necesarios para organizar y manipular estos archivos.
- Gestionar eficientemente el procesador y la Memoria Principal.
- Permitir la administración de cuentas de usuario.
Gestión de Procesos y Multitarea
Procesos Interactivos y Uso del Procesador
En los procesos interactivos, la proporción de tiempo que se emplea en realizar las entradas y salidas (E/S) es muy grande en comparación con el tiempo que se emplea el procesador. Esto se debe a la alta velocidad del procesador. Este hecho es aprovechado por el S.O. para gestionar eficientemente el uso del procesador.
Así, un ordenador con un solo procesador (monoprocesador) puede ejecutar simultáneamente varios procesos (multiproceso).
- Un monoprocesador puede ser multiusuario (varios usuarios con sus correspondientes procesos pueden estar ejecutándose simultáneamente).
- Existen también ordenadores multiprocesador (que tienen varios procesadores), como los supercomputadores, que a su vez ejecutan varios procesos de forma simultánea en cada uno de ellos, pudiendo dar servicio a miles de usuarios de forma muy rápida.
Definición de Proceso y Monopolio de CPU
Proceso: Es una instancia de un programa en ejecución. El problema de compartir el tiempo de la CPU entre varios procesos es evitar que alguno la monopolice. Si un proceso ha cumplido su “quantum” (su turno de tiempo asignado) y no hay ningún proceso en espera, continúa utilizando la CPU otro “quantum”.
Mecanismos de Gestión de Memoria
El S.O. gestiona la ocupación de la memoria principal permitiendo así que todos los procesos puedan ejecutarse. Para ello utiliza los siguientes mecanismos (no excluyentes):
- Compactación de la Memoria Principal
- Segmentación
- Paginación
Compactación, Segmentación y Paginación
La Compactación de Memoria se utiliza para gestionar mejor el espacio de la Memoria Principal (MP). El S.O. reordena la MP para consolidar el espacio libre. La segmentación y la paginación se utilizan si la compactación no es suficiente o viable. Ambos mecanismos utilizan Memoria Virtual (MV).
Segmentación
Consiste en dividir un programa en porciones lógicas (denominadas segmentos). Cuando una porción termina, libera el espacio y se carga otra. Después de realizar varios reemplazos, puede ser necesario volver a compactar la MP. El S.O. simplemente gestiona el intercambio de segmentos en la MP. La segmentación era determinada por el programador.
Paginación
Consiste en dividir la Memoria Principal en porciones de igual tamaño (marcos de página), llevando páginas que en ese momento no tienen ninguna instrucción en ejecución a la Memoria Virtual. El tamaño de las páginas, la división de los programas y el intercambio con la MV lo realiza el SO.
El principal problema de la paginación es que siempre se asignan páginas completas, de manera que las últimas páginas de cada programa pueden no requerir todo el espacio (fragmentación interna). Esto puede suponer realizar un mayor número de intercambios con la MV, ralentizando el proceso. Para evitar las desventajas de ambos métodos y aprovechar sus ventajas, se puede optar por la combinación de ambas técnicas (Segmentación Paginada).
Lenguajes de Programación y Traducción
Concepto de Lenguaje de Programación
Un lenguaje de programación es un conjunto de símbolos y reglas sintácticas y semánticas que se utiliza para escribir instrucciones. Permite expresar acciones complejas.
El procesador solo entiende instrucciones en código máquina, expresadas mediante una secuencia de ceros y unos.
Lenguajes de Bajo Nivel
Los lenguajes de bajo nivel se acercan al funcionamiento interno de una computadora.
Código Máquina
Se expresa por ceros y unos. Pueden cometerse muchos errores y es específico de cada fabricante.
Lenguajes Ensambladores
En los lenguajes ensambladores, el código de operación es sustituido por un nemotécnico. Una instrucción en lenguaje ensamblador equivale a una instrucción en código máquina, a excepción de las macros. Una macro es un conjunto de instrucciones al que se hace referencia mediante una etiqueta. Para poder ser ejecutado, debe traducirse a lenguaje máquina. Este lenguaje reduce la ilegibilidad del código máquina, pero la probabilidad de cometer errores al programar sigue siendo alta.
Lenguajes de Alto Nivel (LAN)
Los lenguajes de programación de alto nivel se caracterizan por expresar las instrucciones en un lenguaje más próximo al lenguaje natural, lo que aumenta la legibilidad de los programas y disminuye los errores. No se trabaja directamente con registros, sino con variables, y tienen una sintaxis y un léxico rígido, no tan versátil ni flexible como el lenguaje natural.
El primer lenguaje de programación conocido es FORTRAN, que representa fórmulas complejas. A partir de este, se han desarrollado innumerables lenguajes.
A diferencia de los lenguajes de bajo nivel, la filosofía de los LAN es que los programas escritos en ellos puedan utilizarse en cualquier ordenador, sea cual sea el lenguaje máquina que utilicen. Cuentan con un traductor al código máquina, permitiendo que el programa se utilice en múltiples plataformas.
Proceso de Traducción de Código
Para que un programa en un lenguaje de alto nivel se ejecute en un ordenador, tiene que pasar por un proceso de traducción a código máquina. Todo proceso de traducción realiza las siguientes tareas:
- Análisis léxico.
- Análisis sintáctico.
- Análisis semántico.
- Traducción al código máquina.
Dependiendo de la forma en que se realiza la traducción, hay dos tipos de traductores: Intérpretes y Compiladores.
Intérpretes
Los intérpretes realizan la traducción y ejecución instrucción por instrucción:
- Realizan los procesos de análisis y traducción instrucción a instrucción.
- Tras la traducción, ejecutan la instrucción correspondiente.
- Cuando encuentran un error grave, se detienen.
- Tras la ejecución, no se guarda la versión traducida del programa.
- Cuando el programa vuelve a ejecutarse, pasa de nuevo por los procesos de análisis, traducción y ejecución.
Compiladores
Los compiladores traducen el programa completo antes de la ejecución:
- Realizan primero los procesos de análisis del código fuente completo.
- Si hay errores, muestran la lista de estos y detienen el proceso de traducción.
- Si no hay errores, traducen el programa de forma completa a código máquina, guardando una copia del resultado (código objeto).
- El compilador no ejecuta el programa, solo lo analiza y traduce.
- Para ejecutarlo, se utiliza el código máquina resultante.
- Solo es necesario traducirlo una vez, y después puede ejecutarse cuantas veces se quiera.
Intérprete Híbrido
Su objetivo es permitir que el código se ejecute en diferentes máquinas partiendo de un código “intermedio” que ha sido previamente compilado. De esta forma, el programa compilado puede estar disponible en un ordenador determinado y terminar de interpretarse en otro ordenador con un lenguaje máquina diferente. Esta es la característica del lenguaje JAVA y de su aplicación a programas en Internet.
Comparación entre Compiladores e Intérpretes
Aunque inicialmente los intérpretes eran más comunes, actualmente los compiladores son predominantes. Las diferencias clave son:
- El compilador solo traduce una vez y el programa se puede ejecutar muchas veces; en cambio, con el intérprete es necesario realizar la traducción cada vez que se ejecuta.
- La ejecución de un programa traducido por el compilador es más rápida y requiere menos memoria.
- La detección de errores y su diagnóstico es más precisa con un intérprete (al detenerse inmediatamente en la instrucción errónea).
- Los intérpretes permiten que los programas sean más independientes de la máquina en la que se van a ejecutar.
