Beruflich Dokumente
Kultur Dokumente
Facultad de Ingeniería
Para comenzar a estudiar esta unidad es importante tener en claro el concepto de algoritmo. Un
algoritmo es un conjunto de instrucciones o reglas bien definidas, ordenadas y finitas que permite
llevar a cabo una actividad mediante pasos sucesivos que no generen dudas a quien deba hacer
dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un
estado final y se obtiene una solución.
En la vida cotidiana, se emplean algoritmos frecuentemente para resolver problemas. Algunos
ejemplos son:
los manuales de usuario, que muestran algoritmos para usar un aparato, o
las instrucciones que recibe un trabajador por parte de su patrón.
Algunos ejemplos en matemática son el algoritmo de multiplicación, para calcular el
producto, el algoritmo de la división para calcular el cociente de dos números
Los algoritmos pueden ser expresados de muchas maneras, incluyendo el lenguaje natural,
pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. El pseudocódigo y
diagramas de flujo son formas más estructuradas para representar algoritmos; y además, se
mantienen independientes de un lenguaje de programación específico.
La descripción de un algoritmo usualmente se hace en tres niveles:
1. Descripción de alto nivel. Se establece el problema, se desglosa para poder entenderse
en detalle y se explica el algoritmo de manera verbal, posiblemente con diagramas de flujo.
2. Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que
encuentran la solución.
3. Implementación. Se muestra el algoritmo expresado en un lenguaje de programación
específico.
• Lenguajes de bajo nivel: propio de los circuitos electrónicos, expresado con ceros y unos.
Binario o de máquina.
• Lenguajes de alto nivel: cercano al lenguaje natural. Se pueden clasificar atendiendo a los
estilos de programación, en cuatro grupos.
máquina específico para cada arquitectura legible por un programador. Cada arquitectura de
procesador tiene su propio lenguaje ensamblador que usualmente es definida por el
fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de
procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y
otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de
cierta arquitectura de computador física (o virtual).
Un programa ensamblador es usado para traducir sentencias del lenguaje ensamblador al
código de máquina. El código resultante de la ejecución del programa ensamblador
generaría un código binario ejecutable.
Inconvenientes
Reducción de velocidad al ceder el trabajo de bajo nivel a la máquina.
Algunos requieren que la máquina cliente posea una determinada plataforma.
Procedural o imperativo
La programación imperativa es uno de los paradigmas de programación de
computadoras más generales, que describe la programación en términos del estado del
programa y sentencias que cambian dicho estado. Los programas imperativos son un
conjunto de instrucciones que le indican al computador cómo realizar una tarea, de la
misma manera que el modo imperativo en los lenguajes naturales humanos le dice qué
hacer al interlocutor. Las recetas de cocina y las listas de revisión de procesos, a pesar de
no ser programas de computadora, son también conceptos familiares similares en estilo a
la programación imperativa; donde cada paso es una instrucción.
Lógico
En la programación lógica, el enfoque es expresar programas de manera lógica simbólica
y utilizar un proceso de inferencia lógica para producir resultados. Los programas lógicos
son declarativos, no de procedimiento, lo que significa que sólo se expresan las
especificaciones de los resultados deseados en vez de detallar los procedimientos para
producirlos.
Funcional
El paradigma de programación funcional se basa en funciones matemáticas.
En los programas escritos en lenguaje imperativo, una de las características
fundamentales es el estado que tienen, lo que cambia a lo largo de la ejecución. Este
estado está representado por las variables del programa. El autor y todos los lectores del
programa deben entender los usos de sus variables y cómo el estado del programa
cambia a través de la ejecución. Para un programa grande, esto es una tarea
desalentadora. Este es un problema con los programas escritos en un lenguaje imperativo
que no está presente en un programa escrito en un lenguaje funcional puro, ya que no
tienen ni variables ni estado.
LISP comenzó como un lenguaje funcional puro, pero pronto adquirió cierta importancia
con características imperativas con el fin de aumentar su eficiencia en la ejecución. Es
aún el más importante de los lenguajes funcionales, al menos en el sentido de que es el
único que ha alcanzado un uso generalizado.
Domina en las áreas de la representación del conocimiento, aprendizaje de las máquinas,
los sistemas de formación inteligentes, y el modelado de habla. Common Lisp es una
combinación de varios principios de LISP de 1980.
Scheme es un pequeño dialecto de LISP. Scheme ha sido ampliamente utilizado para
enseñar programación funcional. También se utiliza en algunas universidades para dictar
cursos de introducción a la programación.
El desarrollo de los lenguajes de programación funcional con tipo, principalmente ML y
Haskell, ha dado lugar a una significativa expansión de las áreas de la computación en el
que ahora se utilizan los lenguajes funcionales. Ellos están siendo utilizados en áreas
POO
La programación orientada a objetos es, en esencia, una aplicación del principio de
abstracción para los tipos abstractos de datos. Específicamente, en la programación
orientada a objetos, las características más comunes de una colección de tipos abstractos
de datos similares son colocadas en un nuevo tipo. Los miembros de la colección heredan
estas partes comunes de ese nuevo tipo. Esta característica es la herencia, que se
encuentra como eje principal de la programación OO y de los lenguajes que la soportan.
El concepto de programación orientada a objetos tiene sus raíces en Simula 67, pero no
se desarrolló plenamente hasta 1980 con Smalltalk 80.
Un lenguaje que es orientado a objetos debe proporcionar soporte para tres
características claves:
tipos abstractos de datos
herencia
enlace dinámico.
Proceso de traducción
Cualquier programa escrito en lenguaje de alto nivel posee un programa fuente asociado, el cuál no
puede ser ejecutado directamente por la PC. Por eso mismo el programa fuente debe ser traducido
a lenguaje de máquina. Esta conversión de código la realiza el traductor de lenguaje, y el resultado
obtenido se denomina programa objeto.
Existen básicamente dos maneras de implementar un lenguaje:
Interpretación
Compilación
Los sistemas de aplicación de los primeros lenguajes de programación de alto nivel, construidos a
finales de 1950, se encontraban entre el software más complejo de la época. En la década de
1960, se realizaron intensos esfuerzos de investigación para entender y formalizar el proceso de
construcción e implementación de estos lenguajes de alto nivel. El mayor éxito de estos esfuerzos
fue en el área del análisis sintáctico.
Interpretación
Aunque algunos lenguajes simples de principios de la década de 1960 (APL, SNOBOL, y LISP)
fueron puramente intérpretes, por la década de 1980, el enfoque se utiliza muy poco en lenguajes
de alto nivel. Sin embargo, en los últimos años, la interpretación ha hecho una reaparición
significativa con algunos lenguajes de scripting web, como JavaScript y PHP, que son ahora
ampliamente utilizados.
Proceso de interpretación:
Compilación
Es el proceso que traduce un programa escrito en un lenguaje de programación de alto nivel a otro
lenguaje de programación, pero este de bajo nivel o de máquina, generando un programa
equivalente que la máquina será capaz de interpretar. Los programas traductores que pueden
realizar esta operación se llaman compiladores. Éstos, como los programas ensambladores
avanzados, pueden generar muchas líneas de código de máquina por cada proposición del
programa fuente.
La construcción de un compilador involucra la división del proceso en una serie de fases que
variará con su complejidad. Generalmente estas fases se agrupan en dos tareas: el análisis del
programa fuente y la síntesis del programa objeto.
Debido a que el compilador cada vez que precisa ejecutarse, no se vuelve a compilar, sino que lo
hace una sola vez, insume menos tiempo en ejecución.
El intérprete debe analizar, convertir y ejecutar cada instrucción cada vez que se ejecute el
programa ejecutable, por lo tanto consume mucho tiempo en ejecución.
El mapa de memoria central se vería así:
Programa Programa
Intérprete SO Memoria libre
traductor Fuente
Programa
Programa Fuente →
SO Memoria libre Traducción
traductor Programa
Compilador ejecutable
Programa
SO Ejecución
ejecutable
Híbridos
Existe también una tercera opción, que es la combinación entre la interpretación y la compilación,
estas implementaciones se denominan sistemas híbridos. Estos traducen programas en lenguaje
de alto nivel en un lenguaje intermedio diseñado para permitir una interpretación fácil. Luego este
código intermedio puede ser interpretado en distintos entornos.
Este método es más rápido que la interpretación pura porque se decodifican las instrucciones del
lenguaje fuente sólo una vez.
Sistemas Operativos
En cualquier sistema informático para que el hardware realice el trabajo para el que ha sido
construido es necesario contar con el software necesario, que posee una serie de normas y
órdenes que coordinan los distintos procesos que se desarrollan en el sistema. A través del
software, que puede estar integrado por un gran número de programas que interactúan unos con
otros, pueden ser manejados todos los recursos de un sistema informático, logrando de esta forma
resolver problemas.
Todos los programas que conforman el software pueden dividirse en dos grupos:
"Presentar al usuario una máquina ampliada o máquina virtual más fácil de programar
que el hardware implícito"
Los programadores se manejan con abstracciones; por ejemplo, podemos ver la lista de
archivos almacenados en un disco como una abstracción de la realidad física (el disco: con
sus sectores, pistas y cabezas de lectura y escritura). Al usuario le interesa poder leer,
escribir y consultar el archivo fácilmente sin tener que considerar, entre otros aspectos, en
qué posición del disco (en qué sector, en qué pista) está almacenada esa información.
El SO es un programa que actúa como intermediario, oculta la verdad del hardware, facilita
el manejo de los dispositivos de almacenamiento al programador y presenta una vista
simple y agradable de los archivos nominados, archivos identificados por el usuario a través
de un nombre.
A través del ejemplo dado, hemos podido observar que el SO presenta una interfaz simple
orientada a la manipulación de archivos de un disco y resguarda al usuario y al programador
de todos los aspectos relacionados con el manejo o acceso al hardware del disco.
Además de facilitar el acceso a discos, el SO también presenta abstracciones para el
manejo de interrupciones, de relojes, de memoria, etc. abstracciones más fáciles, sencillas y
simples de utilizar que el hardware implícito.
"Manejar los recursos del sistema informático, llevar el control de quien utiliza cual
recurso, conceder requerimientos de recursos, explicar el uso e interceder en
solicitudes conflictivas de diferentes programas y usuarios"
En una computadora con múltiples usuarios se necesita compartir los recursos costosos: el
procesador central, la memoria, los dispositivos de E/S, etc., estos elementos compartidos
deben ser racionalmente distribuidos para mejorar el rendimiento de todo el sistema y
asegurar una manipulación adecuada y segura de los mismos.
Kernel
El núcleo o kernel es un software que constituye una parte fundamental del sistema
operativo. Es el principal responsable de facilitar a los distintos programas acceso seguro al
hardware de la computadora en forma básica, es el encargado de gestionar recursos, a
través de servicios de llamada al sistema. Como hay muchos programas y el acceso al
hardware es limitado, también se encarga de decidir qué programa podrá usar un dispositivo
de hardware y durante cuánto tiempo, lo que se conoce como multiplexado. Acceder al
hardware directamente puede ser realmente complejo, por lo que los núcleos suelen
implementar una serie de abstracciones del hardware. Esto permite esconder la
complejidad, y proporcionar una interfaz limpia y uniforme al hardware subyacente, lo que
facilita su uso al programador.
En algunos sistemas operativos, no existe un núcleo como tal debido a que en ciertas
arquitecturas no hay distintos modos de ejecución.
Gestor de recursos
Como gestor de recursos, el sistema operativo administra:
La unidad central de procesamiento.
Los dispositivos de entrada y salida.
La memoria principal y memoria secundaria (discos).
Los procesos (o programas en ejecución).
Y en general todos los recursos del sistema.
Gestión de memoria
La memoria es una gran tabla de palabras o bytes a las cuales se referencia
mediante una dirección única. Este almacén de datos de rápido acceso es
compartido por la CPU y los dispositivos de E/S, es volátil y pierde su contenido ante
ausencia de energía eléctrica o por fallas del sistema. El SO es el responsable de:
Conocer qué partes de la memoria están siendo utilizadas y por quién.
Decidir qué procesos se cargarán en memoria cuando haya espacio disponible.
Asignar y reclamar espacio de memoria cuando sea necesario.
Gestión de procesos
Un proceso es un programa en ejecución que necesita recursos para realizar su
tarea: tiempo de CPU, memoria, archivos y dispositivos de E/S. El SO es el
responsable de lo siguiente:
Crear y destruir procesos.
Parar y reanudar procesos.
Ofrecer mecanismos para que los procesos puedan comunicarse y se
sincronicen.
La gestión de procesos podría ser similar al trabajo de oficina. Se puede tener una
lista de tareas a realizar y a estas fijarles prioridades alta, media, baja por ejemplo.
Debemos comenzar haciendo las tareas de prioridad alta primero y cuando se
terminen seguir con las de prioridad media y después las de baja. Una vez realizada
la tarea se tacha.
Esto puede traer un problema: que las tareas de baja prioridad puede que nunca
lleguen a ejecutarse y permanezcan en la lista para siempre. Para solucionar esto,
se puede asignar alta prioridad a las tareas más antiguas.
Gestión de E/S
Consiste en un sistema de almacenamiento temporal, una interfaz de manejadores
de dispositivos y otra para dispositivos concretos. El sistema operativo debe
gestionar el almacenamiento temporal de E/S y servir las interrupciones de los
dispositivos de E/S.
Gestión de archivos
Los archivos son colecciones de información relacionada. Estos almacenan
programas (en código fuente y objeto) y datos tales como imágenes, textos,
información de bases de datos, etc. El SO es responsable de:
Construir, eliminar archivos y directorios.
Ofrecer funciones para manipular archivos y directorios.
Establecer la correspondencia entre archivos y unidades de almacenamiento.
Realizar copias de seguridad de archivos.
Existen diferentes sistemas de archivos, es decir, existen diferentes formas de
organizar la información que se almacena en las memorias (normalmente discos) de
las computadoras. Por ejemplo, existen los sistemas de archivos FAT, FAT32, ext3,
NTFS, XFS, etc.
Shell
El shell o intérprete de órdenes o intérprete de comandos es el programa informático
que provee una interfaz de usuario para acceder a los servicios del sistema operativo.
Dependiendo del tipo de interfaz que empleen, los shells pueden ser:
De líneas texto (CLI, Command-Line Interface, interfaz de línea de comandos),
Gráficos (GUI, Graphical User Interface, interfaz gráfica de usuario),
Los shell son necesarios para invocar o ejecutar los distintos programas disponibles en la
computadora.
Los SO varían mucho en propósito y diseño. Algunos son muy simples planeados para dar servicio
a un solo usuario en una computadora personal (SO monousuario), en tanto que otros son muy
complejos, atienden a muchos usuarios a la vez y administran recursos de hardware y software de
gran complejidad (SO multiusuario).
Administración de memoria
Al procesar concurrentemente varios trabajos, el SO debe controlar la forma de usar la memoria de
la computadora y asegurar que ningún trabajo invada el territorio de otro.
Algunas computadoras almacenan sus SO de manera permanente en la ROM para que puedan
comenzar a trabajar en cuanto se encienden; pero en estos casos, para actualizar el SO debe
realizarse la sustitución de hardware. Casi todas las máquinas tienen una parte de su SO en ROM
y lo demás se carga en memoria durante el proceso de arranque.
Multiprogramación
La multiprogramación consiste en la ejecución en el mismo procesador de varios programas a la
vez. Para ello divide la memoria en partes, destinadas a diferentes trabajos, que se ejecutarán en
CPU en un solo intervalo de tiempo, mientras un trabajo espera que se complete una operación de
E/S, otro ocupa la CPU. Existen las modalidades: procesamiento por lotes (batch), tiempo
compartido (time sharing) y tiempo real (real time) en las que a través de varias políticas de
asignación, se ejecutan varios programas intercalando la ejecución de sus instrucciones en el
procesador.
Elementos de Informática 2020 Pág. 16
Universidad Nacional de la Patagonia San Juan Bosco
Facultad de Ingeniería
Procesos concurrentes
Tiempo real (Real Time): El tiempo real es la posibilidad que tienen determinados
procesos en un sistema multiprogramado de obtener respuestas del procesador en
un tiempo muy pequeño.
Esta modalidad de la multiprogramación se emplea para responder con rapidez a
señales externas como las generadas por sensores de datos, y se emplean, por
ejemplo, en computadoras que vigilan y controlan procesos críticos en cuanto al
tiempo, como la operación de un reactor nuclear o el vuelo de una nave espacial. El
objetivo de los sistemas de tiempo real es proporcionar un tiempo de respuesta
garantizado para sucesos externos críticos en tiempo.
Procesos paralelos
Para computadoras personales, los primeros sistemas operativos más difundidos fueron: MS-DOS
y UNIX. Hoy en día existe gran diversidad de SO, entre ellos:
Bibliografía