Tema 1
Introducción a los lenguajes de programación
1.1. Historia y evolución
Los lenguajes de programación han evolucionado significativamente desde los primeros días de la computación. Comenzando con el lenguaje de máquina, que consiste en instrucciones binarias entendidas directamente por el hardware, la evolución ha llevado a lenguajes de alto nivel que son más intuitivos para los humanos. A lo largo de los años, se han desarrollado diferentes generaciones de lenguajes:
- Lenguajes de primera generación (1GL): Código de máquina.
- Lenguajes de segunda generación (2GL): Ensamblador.
- Lenguajes de tercera generación (3GL): Lenguajes de alto nivel como FORTRAN, COBOL, C.
- Lenguajes de cuarta generación (4GL): Lenguajes orientados a problemas específicos como SQL.
- Lenguajes de quinta generación (5GL): Lenguajes basados en restricciones y lógica como Prolog.
1.2. Clasificación de los lenguajes
Los lenguajes de programación pueden clasificarse de diversas maneras, como:
- Por nivel de abstracción:
- Bajo nivel (ensamblador)
- Alto nivel (Python, Java)
- Por paradigma:
- Imperativo (C, Python)
- Declarativo (SQL)
- Funcional (Haskell)
- Orientado a objetos (Java, C++)
1.3. Paradigmas de programación
Los paradigmas de programación son enfoques o estilos de programación que utilizan diferentes lenguajes. Los principales son:
- Imperativo: Basado en instrucciones secuenciales (C, Python).
- Declarativo: Define el qué se quiere lograr sin especificar el cómo (SQL).
- Funcional: Basado en funciones matemáticas sin estado (Haskell).
- Orientado a objetos: Organiza el código en objetos que combinan datos y métodos (Java, C++).
Representación de tipos de datos
2.1. Tipos de datos primitivos
Son los tipos de datos básicos que un lenguaje de programación ofrece:
- Enteros: Números sin decimales.
- Flotantes: Números con decimales.
- Caracteres: Letras y símbolos.
- Booleanos: Valores lógicos (true/false).
2.2. Tipos de datos compuestos
Son tipos de datos que combinan varios valores de tipos primitivos:
- Arrays: Colecciones de elementos del mismo tipo.
- Estructuras: Combinaciones de diferentes tipos de datos.
- Clases: Definen objetos con atributos y métodos.
2.3. Sistemas de tipos
Define cómo un lenguaje de programación maneja y verifica los tipos de datos:
- Estático: Los tipos se verifican en tiempo de compilación (Java, C++).
- Dinámico: Los tipos se verifican en tiempo de ejecución (Python, JavaScript).
2.4. Conversión de tipos
La transformación de un tipo de datos a otro:
- Implícita: Realizada automáticamente por el lenguaje.
- Explícita: Requiere la intervención del programador (casting).
Operadores
3.1. Operadores aritméticos
Realizan operaciones matemáticas:
- Suma (+): Añade dos operandos.
- Resta (-): Resta el segundo operando del primero.
- Multiplicación (*): Multiplica dos operandos.
- División (/): Divide el primer operando por el segundo.
- Módulo (%): Resto de la división de dos operandos.
3.2. Operadores de comparación
Comparan dos valores y devuelven un valor booleano:
- Igual a (==)
- Distinto de (!=)
- Mayor que (>)
- Menor que (<)
- Mayor o igual que (>=)
- Menor o igual que (<=)
3.3. Operadores lógicos
Usados para combinar expresiones booleanas:
- AND (&&)
- OR (||)
- NOT (!)
3.4. Operadores de asignación
Asignan valores a las variables:
- Asignación simple (=)
- *Asignación con operación (+=, -=, =, /=, %=)
3.5. Operadores a nivel de bits
Operan a nivel binario:
- AND (&)
- OR (|)
- XOR (^)
- NOT (~)
- Desplazamiento a la izquierda (<<)
- Desplazamiento a la derecha (>>)
3.6. Precedencia y asociatividad
Define el orden en que los operadores se evalúan:
- Precedencia: Prioridad de operadores.
- Asociatividad: Dirección de evaluación (izquierda a derecha, derecha a izquierda).
Instrucciones condicionales
4.1. Estructura if-else
Permite la ejecución de código basado en condiciones:
python
Copiar código
if (condición) {
// código si la condición es verdadera
} else {
// código si la condición es falsa
}
4.2. Estructura switch-case
Selecciona entre múltiples alternativas:
python
Copiar código
switch (variable) {
case valor1:
// código
break;
case valor2:
// código
break;
default:
// código
}
4.3. Operador ternario
Una forma concisa de una estructura if-else:
python
Copiar código
resultado = (condición) ? valor_si_verdadero : valor_si_falso;
4.4. Expresiones condicionales
Permiten ejecutar código basado en condiciones dentro de expresiones.
Bucles y recursividad
5.1. Bucle for
Itera un número fijo de veces:
python
Copiar código
for (inicialización; condición; incremento) {
// código
}
5.2. Bucle while
Itera mientras una condición es verdadera:
python
Copiar código
while (condición) {
// código
}
5.3. Bucle do-while
Igual que while pero se ejecuta al menos una vez:
python
Copiar código
do {
// código
} while (condición);
5.4. Instrucciones break y continue
- break: Sale del bucle.
- continue: Salta a la siguiente iteración del bucle.
5.5. Recursividad
Método donde una función se llama a sí misma.
5.5.1. Definición y conceptos
Proceso de una función que se llama a sí misma.
5.5.2. Casos base y recursivos
- Caso base: Condición de terminación.
- Caso recursivo: Llamada recursiva con un subproblema.
5.5.3. Ventajas y desventajas
- Ventajas: Código más limpio y legible.
- Desventajas: Mayor uso de memoria y posibles problemas de stack overflow.
5.5.4. Optimización de cola
Eliminación de llamadas recursivas innecesarias para ahorrar memoria.
Procedimientos, funciones y parámetros
6.1. Definición de funciones
Bloques de código reutilizables con un nombre específico.
6.2. Parámetros y argumentos
- Parámetros: Variables en la definición de la función.
- Argumentos: Valores pasados a la función.
6.3. Paso por valor y por referencia
- Por valor: Se pasa una copia del valor.
- Por referencia: Se pasa una referencia al valor original.
6.4. Funciones con retorno de valores
Funciones que devuelven un valor después de la ejecución.
6.5. Sobrecarga de funciones
Definir múltiples funciones con el mismo nombre pero diferentes parámetros.
6.6. Funciones recursivas
Funciones que se llaman a sí mismas.
6.7. Funciones anónimas y lambdas
Funciones sin nombre usadas principalmente para tareas pequeñas.
Vectores y registros
7.1. Vectores (arrays)
Colecciones de elementos del mismo tipo.
7.1.1. Declaración e inicialización
python
Copiar código
int array[10];
7.1.2. Acceso a elementos
python
Copiar código
array[0] = 1;
7.1.3. Arrays multidimensionales
python
Copiar código
int matrix[3][3];
7.2. Registros (estructuras)
Combinan datos de diferentes tipos bajo un mismo nombre.
7.2.1. Definición y declaración
python
Copiar código
struct Persona {
char nombre[50];
int edad;
};
7.2.2. Acceso a miembros
python
Copiar código
Persona p;
p.edad = 30;
7.2.3. Anidamiento de estructuras
python
Copiar código
struct Empresa {
Persona empleado;
};
Estructura de un programa
8.1. Módulos y bibliotecas
- Módulos: Unidades de código que pueden ser reutilizadas.
- Bibliotecas: Colecciones de módulos.
8.2. Ámbito y visibilidad
Define dónde y cómo pueden ser accedidas las variables y funciones.
8.3. Directivas del preprocesador
Instrucciones para el compilador antes de la compilación (C/C++).
8.4. Manejo de errores y excepciones
Métodos para gestionar errores durante la ejecución del programa.
8.5. Gestión de memoria
Métodos para manejar la asignación y liberación de memoria.
Abstracción de un procesador
9.1. Arquitectura básica de un procesador
Componentes fundamentales de un procesador: ALU, registros, unidad de control.
9.2. Conjunto de instrucciones
Las operaciones básicas que un procesador puede ejecutar.
9.3. Registros y memoria
Pequeñas unidades de almacenamiento rápido dentro del procesador.
9.4. Ciclo de ejecución de instrucciones
Fases: Fetch, Decode, Execute.
9.5. Pipeline y paralelismo a nivel de instrucción
Métodos para mejorar la eficiencia de la ejecución de instrucciones.
Programación orientada a objetos
10.1. Clases y objetos
- Clases: Plantillas para crear objetos.
- Objetos: Instancias de clases.
10.2. Herencia
Mecanismo para crear nuevas clases basadas en clases existentes.
10.3. Polimorfismo
Permite que una función se comporte de diferentes maneras según el objeto que la llame.
10.4. Encapsulamiento
Oculta los detalles internos de las clases y muestra solo lo necesario.
10.5. Interfaces y clases abstractas
- Interfaces: Definen métodos que deben implementarse.
- Clases abstractas: Clases que no pueden instanciarse directamente.
Estructuras de datos avanzadas
11.1. Listas enlazadas
Colecciones de elementos donde cada elemento apunta al siguiente.
11.2. Pilas y colas
- Pilas: LIFO (Last In, First Out).
- Colas: FIFO (First In, First Out).
Las pilas (stacks) y las colas (queues) son estructuras de datos fundamentales en la informática, y tienen variantes avanzadas que ofrecen funcionalidades adicionales. A continuación, se describen tanto las estructuras básicas como algunas de sus versiones avanzadas.
Pila (Stack)
Una pila es una estructura de datos que sigue el principio LIFO (Last In, First Out), lo que significa que el último elemento en entrar es el primero en salir. Las operaciones básicas son:
- Push: Añadir un elemento al tope de la pila.
- Pop: Eliminar y devolver el elemento del tope de la pila.
- Peek (o Top): Devolver el elemento del tope sin eliminarlo.
- isEmpty: Comprobar si la pila está vacía.
Pila Avanzada
- Pilas con Capacidad Fija (Bounded Stack):
- Limita la cantidad de elementos que puede contener la pila.
- Utilizada cuando se desea limitar el uso de memoria o se conoce de antemano la capacidad necesaria.
- Pilas Doble (Double-Ended Stack o Deque):
- Permite realizar operaciones de push y pop en ambos extremos.
- Es útil en algoritmos que requieren acceso tanto al inicio como al final de la pila.
- Pilas Persistentes (Persistent Stack):
- Permite guardar versiones anteriores de la pila de manera que se pueda acceder a estados anteriores sin modificar el estado actual.
- Es útil en programación funcional y aplicaciones que requieren historiales de estados.
Cola (Queue)
Una cola es una estructura de datos que sigue el principio FIFO (First In, First Out), es decir, el primer elemento en entrar es el primero en salir. Las operaciones básicas son:
- Enqueue: Añadir un elemento al final de la cola.
- Dequeue: Eliminar y devolver el primer elemento de la cola.
- Front (o Peek): Devolver el primer elemento sin eliminarlo.
- isEmpty: Comprobar si la cola está vacía.
Cola Avanzada
- Cola de Prioridad (Priority Queue):
- Cada elemento tiene una prioridad asociada.
- Los elementos con alta prioridad se procesan antes que los de baja prioridad, independientemente del orden de llegada.
- Se utiliza en algoritmos de planificación y en la implementación de algoritmos como A*.
- Cola Circular (Circular Queue):
- Los extremos de la cola están conectados, formando un ciclo.
- Es eficiente en términos de uso de memoria y se utiliza en sistemas embebidos y manejo de buffers.
- Deque (Double-Ended Queue):
- Permite inserciones y eliminaciones en ambos extremos (inicio y fin) de la cola.
- Es útil en aplicaciones que requieren acceso flexible a ambos extremos de la cola, como en el algoritmo de búsqueda de doble extremo.
- Cola Persistente (Persistent Queue):
- Similar a la pila persistente, permite acceder a versiones anteriores de la cola.
- Utilizada en programación funcional y en situaciones donde se requiere un historial de estados.
- Cola de Prioridad con Múltiples Niveles (Multi-Level Priority Queue):
- Divide las prioridades en varios niveles, con cada nivel funcionando como una cola de prioridad.
- Es útil en sistemas operativos para manejar tareas con diferentes niveles de prioridad.
Implementaciones y Usos
Las pilas y colas avanzadas se implementan de diferentes maneras dependiendo del lenguaje de programación y de los requisitos específicos de la aplicación. Las implementaciones comunes incluyen listas enlazadas, arreglos dinámicos y estructuras más complejas como montículos (heaps) para colas de prioridad.
Usos Comunes
- Pilas:
- Manejo de expresiones aritméticas (notación polaca inversa).
- Control de recursión y llamadas a funciones.
- Algoritmos de backtracking (por ejemplo, resolución de laberintos).
- Colas:
- Gestión de tareas en sistemas operativos.
- Simulaciones de colas de espera.
- Implementación de algoritmos de búsqueda en anchura (BFS).
11.3. Árboles
Estructuras jerárquicas con nodos.
Conceptos Básicos
- Árbol: Un árbol es una estructura de datos jerárquica que consiste en nodos conectados por aristas (o enlaces). Cada nodo contiene un valor y puede tener nodos hijos.
- Raíz: El nodo superior de un árbol, sin ningún nodo padre.
- Hoja: Un nodo sin nodos hijos.
- Nodo Interno: Un nodo que tiene al menos un nodo hijo.
- Subárbol: Cualquier nodo y todos sus descendientes forman un subárbol.
Tipos de Recorridos de Árboles
- Pre-order (preorden):
- En este recorrido, se visita primero el nodo raíz, luego se recorre el subárbol izquierdo y finalmente el subárbol derecho.
- Orden de visita: raíz → subárbol izquierdo → subárbol derecho.
- Pseudocódigo:
plaintext
Copiar código
PreOrder(nodo)
1. Si nodo == NULL, entonces retornar.
2. Procesar el nodo.
3. PreOrder(nodo.izquierdo)
4. PreOrder(nodo.derecho)
- In-order (inorden):
- En este recorrido, se visita primero el subárbol izquierdo, luego el nodo raíz y finalmente el subárbol derecho.
- Orden de visita: subárbol izquierdo → raíz → subárbol derecho.
- Este recorrido da los nodos en orden ascendente para un árbol binario de búsqueda.
- Pseudocódigo:
plaintext
Copiar código
InOrder(nodo)
1. Si nodo == NULL, entonces retornar.
2. InOrder(nodo.izquierdo)
3. Procesar el nodo.
4. InOrder(nodo.derecho)
- Post-order (postorden):
- En este recorrido, se visita primero el subárbol izquierdo, luego el subárbol derecho y finalmente el nodo raíz.
- Orden de visita: subárbol izquierdo → subárbol derecho → raíz.
- Pseudocódigo:
plaintext
Copiar código
PostOrder(nodo)
1. Si nodo == NULL, entonces retornar.
2. PostOrder(nodo.izquierdo)
3. PostOrder(nodo.derecho)
4. Procesar el nodo.
Árboles Binarios y Árboles Binarios de Búsqueda (BST)
- Árbol Binario: Un árbol en el que cada nodo tiene a lo sumo dos hijos, denominados hijo izquierdo y hijo derecho.
- Árbol Binario de Búsqueda (BST): Un árbol binario en el que cada nodo cumple con la propiedad BST:
- Los valores de todos los nodos en el subárbol izquierdo son menores que el valor del nodo.
- Los valores de todos los nodos en el subárbol derecho son mayores que el valor del nodo.
Árboles Balanceados
Para evitar que un árbol binario de búsqueda se degrade en una lista enlazada (lo que sucedería si se insertan nodos en orden ascendente o descendente), se utilizan árboles balanceados, que mantienen la altura del árbol lo más baja posible.
- Árbol AVL: Un árbol binario de búsqueda auto-balanceado en el que la diferencia de alturas entre los subárboles izquierdo y derecho de cualquier nodo no es mayor que uno.
- Árbol Red-Black (Rojo-Negro): Un tipo de árbol binario de búsqueda auto-balanceado donde cada nodo tiene un color (rojo o negro) y se mantienen ciertas propiedades que aseguran que el árbol esté balanceado.
Aplicaciones de los Árboles
- Sistemas de archivos: Los directorios y archivos en un sistema de archivos están organizados jerárquicamente como un árbol.
- Bases de datos: Las estructuras de índice como B-Trees y B+ Trees son usadas para acelerar las consultas.
- Compiladores: Los compiladores utilizan árboles de sintaxis abstracta para representar la estructura del código fuente.
11.4. Grafos
Conjunto de nodos conectados por aristas.
11.5. Tablas hash
Estructuras que asocian claves con valores mediante una función hash.
Algoritmos y complejidad
12.1. Análisis de algoritmos
Estudio del rendimiento de los algoritmos.
12.2. Notación Big O
Mide la eficiencia en términos de tiempo y espacio.
12.3. Algoritmos de ordenación
Métodos para organizar datos (quicksort, mergesort).
Los algoritmos de ordenación son métodos usados para organizar una lista de elementos en un cierto orden, típicamente ascendente o descendente. Los algoritmos de ordenación pueden ser categorizados de diversas maneras, incluyendo su estabilidad, eficiencia y complejidad temporal y espacial. Aquí hay una descripción general de algunos algoritmos de ordenación comunes, junto con su estabilidad:
Algoritmos de Ordenación Comunes
- Bubble Sort (Ordenación Burbuja):
- Descripción: Compara y cambia pares adyacentes de elementos si están en el orden incorrecto.
- Complejidad Temporal: O(n2)O(n^2)O(n2)
- Estabilidad: Estable
- Selection Sort (Ordenación por Selección):
- Descripción: Selecciona el elemento mínimo (o máximo) y lo coloca en su posición correcta en cada iteración.
- Complejidad Temporal: O(n2)O(n^2)O(n2)
- Estabilidad: Inestable
- Insertion Sort (Ordenación por Inserción):
- Descripción: Inserta cada elemento en su posición correcta en una lista ordenada.
- Complejidad Temporal: O(n2)O(n^2)O(n2) en el peor caso, O(n)O(n)O(n) en el mejor caso (cuando la lista está casi ordenada)
- Estabilidad: Estable
- Merge Sort (Ordenación por Mezcla):
- Descripción: Divide la lista en mitades, ordena cada mitad y luego las mezcla.
- Complejidad Temporal: O(nlogn)O(n \log n)O(nlogn)
- Estabilidad: Estable
- Quick Sort (Ordenación Rápida):
- Descripción: Selecciona un pivote y particiona la lista en elementos menores y mayores que el pivote, ordenando recursivamente.
- Complejidad Temporal: O(nlogn)O(n \log n)O(nlogn) en promedio, O(n2)O(n^2)O(n2) en el peor caso
- Estabilidad: Inestable
- Heap Sort (Ordenación por Montículo):
- Descripción: Convierte la lista en un heap (montículo) y extrae el máximo repetidamente.
- Complejidad Temporal: O(nlogn)O(n \log n)O(nlogn)
- Estabilidad: Inestable
- Counting Sort (Ordenación por Conteo):
- Descripción: Cuenta el número de ocurrencias de cada elemento y usa esta información para ordenar la lista.
- Complejidad Temporal: O(n+k)O(n + k)O(n+k), donde kkk es el rango de los elementos
- Estabilidad: Estable
- Radix Sort (Ordenación Radix):
- Descripción: Ordena los elementos basándose en sus dígitos individuales, usando una ordenación estable en cada paso.
- Complejidad Temporal: O(n⋅k)O(n \cdot k)O(n⋅k), donde kkk es el número de dígitos en los elementos
- Estabilidad: Estable
Estabilidad de los Algoritmos
Un algoritmo de ordenación es estable si preserva el orden relativo de los elementos iguales en la lista de entrada. En otras palabras, si dos elementos aaa y bbb son iguales y aaa aparece antes que bbb en la lista original, un algoritmo de ordenación estable garantizará que aaa aparezca antes que bbb en la lista ordenada.
Algoritmos Estables:
- Bubble Sort
- Insertion Sort
- Merge Sort
- Counting Sort
- Radix Sort
Algoritmos Inestables:
- Selection Sort
- Quick Sort
- Heap Sort
12.4. Algoritmos de búsqueda
Métodos para encontrar elementos en colecciones (búsqueda binaria).
12.5. Técnicas de diseño de algoritmos
Estrategias como divide y vencerás, programación dinámica.
1. Dividir y Conquistar (Divide and Conquer)
Esta técnica implica dividir el problema en subproblemas más pequeños, resolver cada subproblema de manera independiente y luego combinar las soluciones de los subproblemas para obtener la solución final. Es ampliamente utilizada en algoritmos como Merge Sort y Quick Sort.
2. Algoritmos Greedy (Avariciosos)
Los algoritmos avariciosos hacen la elección óptima en cada paso con la esperanza de encontrar la solución global óptima. Se utilizan en problemas como el de la mochila (Knapsack Problem) y el de la ruta más corta (Shortest Path Problem).
3. Programación Dinámica
La programación dinámica es una técnica que se utiliza para resolver problemas que pueden descomponerse en subproblemas superpuestos. Se almacena el resultado de los subproblemas ya resueltos para evitar el trabajo redundante. Ejemplos clásicos incluyen el algoritmo de Fibonacci y el algoritmo de la mochila (Knapsack Problem).
4. Algoritmos de Retroceso (Backtracking)
El backtracking es una técnica para encontrar todas las soluciones posibles mediante la construcción de una solución de forma incremental y eliminando aquellas soluciones que no cumplen con las restricciones del problema. Se usa en problemas como el de las N reinas y el Sudoku.
5. Búsqueda y Ordenamiento
Estos algoritmos se utilizan para buscar elementos dentro de una estructura de datos y para ordenar una secuencia de elementos. Ejemplos incluyen la búsqueda binaria y los algoritmos de ordenamiento como Bubble Sort, Merge Sort, y Quick Sort.
6. Algoritmos de Grafos
Estos algoritmos están diseñados para resolver problemas relacionados con grafos, tales como encontrar la ruta más corta (algoritmo de Dijkstra), encontrar el árbol de expansión mínima (algoritmo de Prim), y buscar en profundidad y amplitud (DFS y BFS).
7. Técnicas Heurísticas
Las técnicas heurísticas son métodos aproximados que buscan una solución buena (aunque no necesariamente óptima) para problemas complejos en un tiempo razonable. Ejemplos incluyen el algoritmo de búsqueda A* y los algoritmos genéticos.
8. Algoritmos de Ordenamiento y Búsqueda
Estos algoritmos se utilizan para organizar datos en un orden específico o para buscar elementos dentro de una estructura de datos. Ejemplos incluyen:
- Ordenamiento por Burbuja (Bubble Sort): Un algoritmo de ordenamiento sencillo que compara elementos adyacentes y los intercambia si están en el orden incorrecto.
- Ordenamiento por Inserción (Insertion Sort): Un algoritmo de ordenamiento que construye la lista ordenada elemento a elemento, insertando cada nuevo elemento en su posición correcta.
- Búsqueda Binaria: Un algoritmo eficiente para encontrar un elemento en una lista ordenada dividiendo repetidamente el rango de búsqueda a la mitad.
9. Recursión
La recursión es una técnica donde una función se llama a sí misma para resolver subproblemas. Es útil para problemas que pueden descomponerse en problemas más pequeños de la misma forma. Ejemplos clásicos incluyen la torre de Hanói y el cálculo de factoriales.
10. Algoritmos Probabilísticos
Estos algoritmos utilizan elementos de aleatoriedad para tomar decisiones dentro del proceso de solución del problema. Ejemplos son el algoritmo de Monte Carlo y los algoritmos de Las Vegas.
11. Algoritmos Paralelos y Distribuidos
Estos algoritmos dividen el problema en partes que pueden ser ejecutadas simultáneamente en diferentes procesadores o computadoras. Ejemplos incluyen MapReduce y los algoritmos de computación en paralelo.
Programación concurrente y paralela
13.1. Procesos e hilos
Unidades de ejecución independiente.
13.2. Sincronización
Métodos para coordinar la ejecución de procesos/hilos.
13.3. Comunicación entre procesos
Intercambio de datos entre procesos.
13.4. Problemas clásicos de concurrencia
Problemas como productores y consumidores, lectores y escritores.
Desarrollo de software
14.1. Metodologías de desarrollo
Enfoques para gestionar proyectos de software (ágil, cascada).
14.2. Control de versiones
Sistemas para gestionar cambios en el código fuente (Git).
14.3. Pruebas y depuración
Métodos para asegurar la calidad del software.
14.4. Documentación de código
Prácticas para escribir documentación clara y útil.
Lenguajes específicos y paradigmas avanzados
15.1. Lenguajes de scripting
Lenguajes para escribir scripts (Python, Bash).
15.2. Programación funcional
Paradigma basado en funciones puras (Haskell).
15.3. Programación lógica
Paradigma basado en lógica formal (Prolog).
15.4. Lenguajes de dominio específico (DSL)
Lenguajes diseñados para tareas específicas (HTML, SQL).
Tema 2
Periféricos: Conceptos Básicos
Los periféricos son dispositivos externos que se conectan a una computadora para añadir funcionalidad o mejorar las capacidades del sistema. Estos se dividen en tres categorías principales: entrada, salida y almacenamiento.
1. Conectividad
La conectividad se refiere a los métodos y tecnologías utilizadas para conectar los periféricos a la computadora. Existen varias interfaces de conexión:
- USB (Universal Serial Bus): Es la interfaz más común para conectar dispositivos como teclados, ratones, impresoras, discos duros externos y más. Tiene varias versiones (USB 1.0, 2.0, 3.0, 3.1, 3.2, y USB4), cada una con diferentes velocidades de transferencia.
- Bluetooth: Utilizado principalmente para dispositivos inalámbricos como teclados, ratones, audífonos y altavoces. Permite la conexión sin cables a una corta distancia.
- Wi-Fi: Usado para dispositivos que requieren mayor ancho de banda y pueden estar a mayor distancia, como impresoras, cámaras de seguridad y otros dispositivos IoT (Internet de las cosas).
- Thunderbolt: Ofrece altas velocidades de transferencia y puede soportar múltiples tipos de periféricos, incluyendo monitores y dispositivos de almacenamiento.
- HDMI (High-Definition Multimedia Interface): Comúnmente utilizado para conectar dispositivos de visualización como monitores y televisores.
- DisplayPort: Similar a HDMI, pero con características adicionales como soporte para resoluciones más altas y frecuencias de actualización mayores.
- VGA (Video Graphics Array): Un estándar más antiguo para conectar monitores, actualmente en desuso pero aún presente en algunos equipos.
- Ethernet: Utilizado principalmente para la conexión a redes, pero también puede ser usado para conectar ciertos periféricos como impresoras de red.
2. Administración de Periféricos
La administración de periféricos implica la instalación, configuración y mantenimiento de los dispositivos conectados a una computadora. Los sistemas operativos modernos facilitan este proceso a través de:
- Drivers o Controladores: Programas que permiten la comunicación entre el sistema operativo y los dispositivos periféricos. La instalación correcta de estos es crucial para el funcionamiento adecuado de los periféricos.
- Gestores de Dispositivos: Herramientas del sistema operativo (como el Administrador de dispositivos en Windows o la Utilidad de Discos en macOS) que permiten ver y gestionar todos los periféricos conectados, actualizar controladores y solucionar problemas.
- Plug and Play (PnP): Tecnología que permite que los dispositivos sean reconocidos y configurados automáticamente por el sistema operativo al ser conectados.
Elementos de Almacenamiento
Los dispositivos de almacenamiento son periféricos que permiten guardar y recuperar datos. Pueden ser internos o externos.
- Discos Duros (HDD): Utilizan discos magnéticos giratorios para almacenar datos. Son más económicos pero más lentos comparados con los SSD.
- Unidades de Estado Sólido (SSD): Almacenan datos en memoria flash, ofreciendo velocidades de lectura y escritura mucho más rápidas que los HDD. Son más caras pero están ganando popularidad debido a su rendimiento superior.
- Unidades de Disco Óptico (CD/DVD/Blu-ray): Utilizadas principalmente para almacenar medios y software. Su uso ha disminuido con la popularidad de las descargas digitales y el almacenamiento en la nube.
- Memorias USB: Dispositivos portátiles que utilizan memoria flash para almacenar datos. Son muy comunes debido a su conveniencia y portabilidad.
- Tarjetas de Memoria: Utilizadas principalmente en cámaras, teléfonos y otros dispositivos portátiles.
- Almacenamiento en Red (NAS): Dispositivos que permiten el almacenamiento y acceso a datos a través de una red, proporcionando soluciones centralizadas de almacenamiento y copias de seguridad.
Elementos de Visualización y Digitalización
Los dispositivos de visualización y digitalización incluyen aquellos que permiten mostrar información visual y convertir información física en formato digital.
Dispositivos de Visualización:
- Monitores: Pantallas que muestran la salida visual de una computadora. Vienen en diversas tecnologías (LCD, LED, OLED) y resoluciones (HD, Full HD, 4K, 8K).
- Proyectores: Dispositivos que proyectan la salida de una computadora en una superficie grande, como una pantalla o una pared. Utilizados en presentaciones y entornos educativos.
- Televisores: A veces utilizados como monitores debido a sus grandes tamaños y alta resolución.
Dispositivos de Digitalización:
- Escáneres: Dispositivos que convierten documentos físicos y fotos en formatos digitales. Pueden ser planos, de alimentación automática o portátiles.
- Cámaras Digitales: Utilizadas para capturar imágenes y videos digitales. Incluyen cámaras fotográficas, cámaras web y cámaras de seguridad.
- Tabletas Digitalizadoras: Utilizadas principalmente por artistas y diseñadores para crear ilustraciones digitales mediante un lápiz óptico.
- Sistemas de Digitalización 3D: Capturan la forma de objetos físicos y los convierten en modelos digitales tridimensionales. Utilizados en ingeniería, diseño y manufactura.
Chipset
El chipset es un conjunto de circuitos integrados en la placa base que gestionan la comunicación entre el procesador, la memoria, los dispositivos de almacenamiento y los periféricos. El chipset determina qué características y capacidades tendrá la placa base, y se compone principalmente de dos componentes:
- Northbridge: Tradicionalmente, este componente gestionaba la comunicación entre el procesador, la memoria RAM y la tarjeta gráfica. En sistemas modernos, sus funciones han sido integradas en el procesador, reduciendo la complejidad de la placa base y mejorando el rendimiento.
- Southbridge: Este componente gestiona la comunicación entre el procesador y los periféricos de menor velocidad, como dispositivos de almacenamiento (a través de interfaces SATA), puertos USB, audio y otras interfaces de entrada/salida. Aún sigue presente en las placas base modernas, aunque también ha visto algunas de sus funciones integradas en el procesador.
SATA (Serial ATA)
Serial ATA (SATA) es una interfaz utilizada para conectar dispositivos de almacenamiento como discos duros y unidades de estado sólido (SSD) a la placa base. Ha evolucionado a lo largo de los años para mejorar el rendimiento y la capacidad.
- SATA I (1.5 Gbps): La primera generación de SATA, con una velocidad de transferencia de datos de hasta 1.5 gigabits por segundo (Gbps).
- SATA II (3 Gbps): Duplica la velocidad de transferencia a 3 Gbps.
- SATA III (6 Gbps): La versión más común en la actualidad, con una velocidad de transferencia de hasta 6 Gbps.
Además de estas versiones, SATA también incluye otras tecnologías importantes:
- AHCI (Advanced Host Controller Interface): Un estándar técnico definido por Intel que permite el uso de características avanzadas de los discos duros SATA, como el NCQ (Native Command Queuing), que mejora el rendimiento de las unidades al optimizar el orden de las operaciones de lectura/escritura.
- eSATA (external SATA): Una variante de SATA diseñada para conectar dispositivos de almacenamiento externos, ofreciendo las mismas velocidades de transferencia que las conexiones internas SATA.
Elementos de Almacenamiento
Profundicemos más en los dispositivos de almacenamiento:
Discos Duros (HDD)
Los discos duros son dispositivos de almacenamiento que utilizan discos magnéticos giratorios para almacenar datos. Los componentes principales incluyen:
- Platos: Discos recubiertos con material magnético donde se almacenan los datos.
- Cabezas de lectura/escritura: Brazos que se desplazan sobre los platos para leer o escribir datos.
- Motor: Gira los platos a una velocidad constante (por ejemplo, 5400 RPM, 7200 RPM, o más en discos de alto rendimiento).
Los HDD tienen una capacidad de almacenamiento alta a un costo relativamente bajo, pero son más lentos y menos duraderos que los SSD debido a sus componentes mecánicos.
Unidades de Estado Sólido (SSD)
Las unidades de estado sólido utilizan memoria flash para almacenar datos, lo que las hace mucho más rápidas y duraderas que los discos duros. No tienen partes móviles, lo que reduce el riesgo de fallos mecánicos. Se conectan a la placa base a través de interfaces como SATA o NVMe (Non-Volatile Memory Express).
- NVMe: Una interfaz de almacenamiento que utiliza el bus PCIe (Peripheral Component Interconnect Express) para ofrecer velocidades de transferencia mucho más rápidas que SATA. Es especialmente beneficiosa para las SSD, que pueden aprovechar al máximo estas altas velocidades.
Elementos de Visualización y Digitalización
Profundicemos en los dispositivos de visualización y digitalización:
Monitores
- Tecnologías de Pantalla:
- LCD (Liquid Crystal Display): Utiliza cristales líquidos y retroiluminación LED. Es la tecnología más común debido a su eficiencia energética y calidad de imagen.
- OLED (Organic Light-Emitting Diode): Utiliza diodos orgánicos que emiten luz cuando se les aplica corriente. Ofrece colores más vivos y negros más profundos en comparación con LCD.
- QLED (Quantum Dot LED): Utiliza puntos cuánticos para mejorar el brillo y la gama de colores. Es una mejora sobre las pantallas LCD tradicionales.
- Resolución: Define la claridad y detalle de la imagen. Las resoluciones comunes incluyen:
- HD (1280×720)
- Full HD (1920×1080)
- 4K UHD (3840×2160)
- 8K UHD (7680×4320)
- Tasa de Refresco: Medida en hercios (Hz), indica cuántas veces por segundo se actualiza la imagen en la pantalla. Valores comunes son 60Hz, 120Hz, 144Hz, y 240Hz.
Escáneres
- Tipos de Escáneres:
- Escáner Plano: Utiliza una superficie plana para escanear documentos y fotos. Es ideal para documentos en papel y materiales frágiles.
- Escáner de Alimentación Automática (ADF): Permite escanear múltiples páginas automáticamente, ideal para oficinas.
- Escáner Portátil: Compacto y fácil de transportar, utilizado para escanear documentos sobre la marcha.
- Resolución de Escaneo: Medida en puntos por pulgada (DPI), determina la calidad del escaneo. Valores más altos (600 DPI o más) son mejores para imágenes detalladas.
Administración de Periféricos
La correcta administración de periféricos es crucial para el buen funcionamiento del sistema:
- Instalación de Controladores: Los controladores son necesarios para que el sistema operativo pueda comunicarse con los periféricos. Deben ser compatibles con el sistema operativo y el hardware específico.
- Actualización de Firmware: Los fabricantes de hardware a menudo lanzan actualizaciones de firmware para mejorar el rendimiento, añadir características o corregir errores. Mantener el firmware actualizado es importante.
- Configuración de BIOS/UEFI: La configuración de BIOS o UEFI permite ajustar opciones de hardware, como la prioridad de arranque de los dispositivos de almacenamiento y la configuración de los puertos SATA.
- Gestión de Dispositivos en el Sistema Operativo: Utilidades como el Administrador de Dispositivos en Windows o la Utilidad de Discos en macOS permiten ver, configurar y solucionar problemas con los periféricos conectados.
Las especificaciones de USB (Universal Serial Bus) han evolucionado significativamente desde su introducción, con diferentes versiones que ofrecen distintas tasas de transferencia de datos y funcionalidades mejoradas. A continuación, se presenta un resumen de las principales versiones de USB y sus respectivas tasas de transferencia:
USB 1.0 y USB 1.1
- Fecha de lanzamiento: 1996 (1.0) y 1998 (1.1)
- Tasa de transferencia:
- USB 1.0: 1.5 Mbps (Low Speed) y 12 Mbps (Full Speed)
- USB 1.1: 12 Mbps (Full Speed)
- Uso típico: Teclados, ratones, dispositivos de entrada básicos.
USB 2.0
- Fecha de lanzamiento: 2000
- Tasa de transferencia: 480 Mbps (High Speed)
- Uso típico: Dispositivos de almacenamiento externo, impresoras, cámaras web, y otros periféricos que requieren mayor ancho de banda.
USB 3.0
- Fecha de lanzamiento: 2008
- Tasa de transferencia: 5 Gbps (SuperSpeed)
- Uso típico: Dispositivos de almacenamiento externo más rápidos, discos duros, unidades flash, cámaras de alta definición.
USB 3.1
- Fecha de lanzamiento: 2013
- Tasa de transferencia: 10 Gbps (SuperSpeed+)
- Uso típico: Almacenamiento de alta velocidad, monitores 4K, dispositivos multimedia de alta definición.
USB 3.2
- Fecha de lanzamiento: 2017
- Tasa de transferencia:
- USB 3.2 Gen 1: 5 Gbps (equivalente a USB 3.0)
- USB 3.2 Gen 2: 10 Gbps (equivalente a USB 3.1)
- USB 3.2 Gen 2×2: 20 Gbps (doble canal)
- Uso típico: Dispositivos de almacenamiento ultrarrápidos, estaciones de trabajo, y aplicaciones que requieren altas tasas de transferencia de datos.
USB4
- Fecha de lanzamiento: 2019
- Tasa de transferencia:
- USB4 Gen 2×2: 20 Gbps
- USB4 Gen 3×2: 40 Gbps
- Uso típico: Docking stations, monitores de alta resolución, dispositivos de almacenamiento de datos de alta velocidad, y compatibilidad mejorada con Thunderbolt 3.
USB-C (Conector)
- Introducción: 2014
- Características:
- Conector reversible, más pequeño y delgado que los anteriores (USB-A, USB-B).
- Compatible con varias versiones de USB, incluido USB 3.1, USB 3.2 y USB4.
- Soporta la entrega de energía (USB Power Delivery) hasta 100W.
- Puede transmitir video y audio (alternativo a HDMI, DisplayPort).
Resumen de Tasas de Transferencia
- USB 1.0/1.1: 1.5 Mbps / 12 Mbps
- USB 2.0: 480 Mbps
- USB 3.0 / USB 3.1 Gen 1 / USB 3.2 Gen 1: 5 Gbps
- USB 3.1 Gen 2 / USB 3.2 Gen 2: 10 Gbps
- USB 3.2 Gen 2×2: 20 Gbps
- USB4: Hasta 40 Gbps
Cada nueva versión de USB no solo ha incrementado la tasa de transferencia, sino que también ha mejorado la eficiencia energética y ha añadido nuevas funcionalidades, adaptándose a las necesidades tecnológicas crecientes de los dispositivos y usuarios.
Tema 3
Tipos Abstractos de Datos (TAD)
1.1. Concepto y características
Concepto: Un Tipo Abstracto de Datos (TAD) es una especificación matemática de un conjunto de datos y las operaciones que se pueden realizar sobre ellos, sin preocuparse por su implementación. Un TAD define qué operaciones se pueden realizar y cuáles son sus comportamientos, pero no cómo se llevan a cabo.
Características:
- Encapsulamiento: Oculta la implementación interna de los datos y muestra solo las operaciones disponibles.
- Abstracción: Permite trabajar con datos a un nivel más alto, sin considerar los detalles internos.
- Modularidad: Facilita la construcción de sistemas modulares al permitir que los componentes se desarrollen y prueben independientemente.
- Reusabilidad: Los TAD pueden ser reutilizados en diferentes partes del programa o en diferentes proyectos.
- Independencia del Lenguaje: La especificación de un TAD no depende del lenguaje de programación.
1.2. Especificación e implementación
Especificación: La especificación de un TAD incluye:
- Conjunto de datos: Los datos que el TAD manejará.
- Operaciones: Las funciones o procedimientos que se pueden realizar sobre los datos.
- Precondiciones y postcondiciones: Condiciones que deben cumplirse antes y después de ejecutar una operación.
Implementación: La implementación de un TAD puede variar, pero debe cumplir con la especificación dada. Se puede implementar usando diferentes estructuras de datos y algoritmos, dependiendo de los requisitos de eficiencia y recursos disponibles.
1.3. Ejemplos de TAD: Pila, Cola, Lista, Árbol, Grafo
- Pila (Stack):
- Operaciones: push (insertar), pop (extraer), top (consultar el elemento en la cima), isEmpty (verificar si está vacía).
- Ejemplo: Navegadores web usan pilas para gestionar el historial de navegación.
- Cola (Queue):
- Operaciones: enqueue (insertar), dequeue (extraer), front (consultar el primer elemento), isEmpty (verificar si está vacía).
- Ejemplo: Gestión de tareas en impresoras.
- Lista (List):
- Operaciones: insert (insertar), delete (eliminar), find (buscar), isEmpty (verificar si está vacía).
- Ejemplo: Manejo de elementos en un menú desplegable.
- Árbol (Tree):
- Operaciones: insert (insertar), delete (eliminar), search (buscar), traverse (recorrer).
- Ejemplo: Sistemas de archivos.
- Grafo (Graph):
- Operaciones: addVertex (añadir vértice), addEdge (añadir arista), removeVertex (eliminar vértice), removeEdge (eliminar arista).
- Ejemplo: Redes sociales (usuarios y sus conexiones).
1.4. Ventajas y aplicaciones de los TAD
Ventajas:
- Abstracción y Modularidad: Facilita el diseño y desarrollo de software modular y mantenible.
- Reusabilidad: Permite reutilizar código en diferentes contextos.
- Facilidad de Mantenimiento: Cambios en la implementación no afectan al resto del sistema.
- Mejor Documentación: Proporciona una descripción clara de lo que se puede hacer con los datos.
Aplicaciones:
- Sistemas Operativos: Gestión de procesos, memoria y archivos.
- Bases de Datos: Estructuras de datos para el almacenamiento y recuperación eficiente.
- Algoritmos de búsqueda y ordenación: Mejoran la eficiencia en la manipulación de datos.
- Inteligencia Artificial: Implementación de árboles de decisión, grafos de búsqueda, etc.
Estructuras de Datos
2.1. Estructuras de datos lineales
2.1.1. Arrays y matrices
- Arrays: Colecciones de elementos homogéneos almacenados en ubicaciones contiguas de memoria. Se accede a ellos mediante índices.
- Matrices: Extensiones bidimensionales (o más dimensiones) de arrays, útiles para representar tablas de datos.
2.1.2. Listas enlazadas
- Concepto: Colección de nodos donde cada nodo contiene un dato y una referencia al siguiente nodo.
- Tipos:
- Listas simplemente enlazadas: Cada nodo apunta al siguiente.
- Listas doblemente enlazadas: Cada nodo apunta al siguiente y al anterior.
- Listas circularmente enlazadas: El último nodo apunta al primero.
2.1.3. Pilas
- Concepto: Estructura LIFO (Last In, First Out), donde el último elemento insertado es el primero en salir.
- Operaciones: push, pop, top, isEmpty.
2.1.4. Colas
- Concepto: Estructura FIFO (First In, First Out), donde el primer elemento insertado es el primero en salir.
- Operaciones: enqueue, dequeue, front, isEmpty.
2.2. Estructuras de datos no lineales
2.2.1. Árboles
- Concepto: Estructura jerárquica donde cada nodo tiene un valor y referencias a hijos.
- Tipos:
- Árbol binario: Cada nodo tiene como máximo dos hijos.
- Árbol binario de búsqueda (BST): Árbol binario ordenado.
- Árbol AVL, Árbol Rojo-Negro: Tipos de árboles balanceados.
2.2.2. Grafos
- Concepto: Conjunto de nodos (vértices) y aristas que conectan pares de nodos.
- Tipos:
- Grafo dirigido: Las aristas tienen una dirección.
- Grafo no dirigido: Las aristas no tienen dirección.
- Grafo ponderado: Las aristas tienen un peso asociado.
2.3. Estructuras de datos avanzadas
2.3.1. Tablas hash
- Concepto: Estructura que asocia claves con valores usando una función hash.
- Ventajas: Búsqueda, inserción y eliminación eficientes.
2.3.2. Montículos (Heaps)
- Concepto: Estructura de árbol binario que satisface la propiedad de montículo (el valor en un nodo es mayor/menor que los valores de sus hijos).
- Tipos:
- Montículo máximo: El valor de cada nodo es mayor que el de sus hijos.
- Montículo mínimo: El valor de cada nodo es menor que el de sus hijos.
- Aplicaciones: Implementación de colas de prioridad.
2.3.3. Árboles balanceados (AVL, Rojo-Negro)
- Árboles AVL: Árboles binarios de búsqueda donde la diferencia de altura entre subárboles izquierdo y derecho de cualquier nodo es como máximo uno.
- Árboles Rojo-Negro: Árboles binarios de búsqueda con balanceo mediante reglas de coloración de nodos para garantizar la altura logarítmica.
Organización de Ficheros
3.1. Conceptos básicos de almacenamiento en ficheros
- Fichero: Colección de datos almacenados en un dispositivo de almacenamiento.
- Directorio: Estructura que organiza y contiene archivos.
3.2. Organización secuencial
- Concepto: Los registros se almacenan uno tras otro en el orden en que se crean.
- Ventajas: Simplicidad y eficiencia en la lectura secuencial.
- Desventajas: Ineficiencia en la búsqueda y modificación.
3.3. Organización indexada
- Concepto: Uso de índices para acceder directamente a los registros.
- Ventajas: Búsqueda rápida.
- Desventajas: Complejidad en la gestión del índice.
3.4. Organización directa o aleatoria
- Concepto: Uso de funciones hash para acceder directamente a los registros.
- Ventajas: Acceso rápido y eficiente.
- Desventajas: Colisiones y gestión compleja.
3.5. Organización multianillo
- Concepto: Combinación de múltiples índices o listas invertidas para mejorar el acceso.
- Ventajas: Flexibilidad y velocidad en la búsqueda.
- Desventajas: Complejidad y sobrecarga de mantenimiento.
3.6. Métodos de acceso a ficheros
- Secuencial: Lectura y escritura de registros en orden.
- Directo: Acceso mediante posición calculada.
- Indexado: Acceso mediante búsqueda en un índice.
Algoritmos
4.1. Análisis de algoritmos
4.1.1. Complejidad temporal y espacial
- Complejidad temporal: Tiempo requerido por un algoritmo en función del tamaño de la entrada.
- Complejidad espacial: Memoria requerida por un algoritmo en función del tamaño de la entrada.
4.1.2. Notación asintótica (O, Ω, Θ)
- O (Big-O): Límite superior del tiempo de ejecución.
- Ω (Omega): Límite inferior del tiempo de ejecución.
- Θ (Theta): Comportamiento exacto del tiempo de ejecución.
4.2. Algoritmos de ordenación
4.2.1. Métodos simples (burbuja, selección, inserción)
- Burbuja: Compara y cambia elementos adyacentes.
- Selección: Selecciona el menor y lo coloca en su posición.
- Inserción: Inserta elementos en su posición correcta.
4.2.2. Métodos avanzados (quicksort, mergesort, heapsort)
- Quicksort: Divide y conquista, elige un pivote y particiona.
- Mergesort: Divide y conquista, divide en mitades y mezcla ordenadamente.
- Heapsort: Utiliza un montículo para ordenar.
4.3. Algoritmos de búsqueda
4.3.1. Búsqueda secuencial
- Concepto: Recorrido lineal de la lista hasta encontrar el elemento deseado.
4.3.2. Búsqueda binaria
- Concepto: Divide la lista ordenada en mitades y busca en la mitad relevante.
4.3.3. Búsqueda en árboles y grafos
- Árboles: Búsqueda binaria, recorrido en profundidad o anchura.
- Grafos: Búsqueda en profundidad (DFS), búsqueda en anchura (BFS).
4.4. Algoritmos sobre grafos
4.4.1. Recorridos (anchura, profundidad)
- BFS: Explora los vecinos más cercanos primero.
- DFS: Explora lo más profundo primero.
4.4.2. Caminos mínimos (Dijkstra, Floyd-Warshall)
- Dijkstra: Encuentra el camino más corto desde un nodo a todos los demás.
- Floyd-Warshall: Encuentra los caminos más cortos entre todos los pares de nodos.
4.4.3. Árboles de expansión mínima (Prim, Kruskal)
- Prim: Construye un árbol de expansión mínima agregando el borde de menor peso.
- Kruskal: Construye un árbol de expansión mínima agregando bordes en orden de peso.
4.5. Técnicas de diseño de algoritmos
4.5.1. Divide y vencerás
- Concepto: Divide el problema en subproblemas más pequeños, resuélvelos y combina los resultados.
4.5.2. Programación dinámica
- Concepto: Resuelve problemas almacenando soluciones de subproblemas para evitar cálculos redundantes.
4.5.3. Algoritmos voraces (greedy)
- Concepto: Selecciona la mejor opción local en cada paso con la esperanza de encontrar la solución global óptima.
4.5.4. Backtracking
- Concepto: Explora todas las posibilidades para encontrar la solución correcta, retrocediendo cuando se alcanza un callejón sin salida.
Formatos de Información y Ficheros
5.1. Formatos de texto
5.1.1. ASCII, Unicode
- ASCII: Código de caracteres que representa texto en computadoras.
- Unicode: Sistema de codificación que abarca una gama más amplia de caracteres de muchos lenguajes.
5.1.2. CSV, TSV
- CSV (Comma-Separated Values): Formato de archivo donde los valores están separados por comas.
- TSV (Tab-Separated Values): Formato de archivo donde los valores están separados por tabulaciones.
5.1.3. XML, JSON
- XML (eXtensible Markup Language): Formato de marcado que define una gramática para estructurar datos.
- JSON (JavaScript Object Notation): Formato de texto ligero para el intercambio de datos.
5.1.4. YAML
- Concepto: Lenguaje de serialización de datos amigable para humanos, utilizado para configuraciones y transmisión de datos.
5.2. Formatos binarios
5.2.1. Concepto y características
- Concepto: Archivos que contienen datos en formato binario (no texto), a menudo más eficientes en almacenamiento y procesamiento.
- Características: Menor tamaño de archivo, mayor velocidad de acceso y procesamiento.
5.2.2. Ejemplos de formatos binarios comunes
- Imágenes: JPEG, PNG.
- Audio: MP3, WAV.
- Video: MP4, AVI.
5.3. Formatos de imagen
5.3.1. Mapas de bits (BMP, PNG, JPEG)
- BMP: Formato sin compresión, archivos grandes.
- PNG: Compresión sin pérdida, soporta transparencia.
- JPEG: Compresión con pérdida, ideal para fotos.
5.3.2. Gráficos vectoriales (SVG)
- Concepto: Imágenes definidas mediante geometría matemática, escalables sin pérdida de calidad.
5.4. Formatos de audio y video
- Audio: MP3, AAC, WAV.
- Video: MP4, AVI, MKV.
5.5. Formatos de documentos (PDF, DOCX)
- PDF: Formato de documento portátil, mantiene el formato en diferentes dispositivos.
- DOCX: Formato de Microsoft Word, admite texto, imágenes, tablas, etc.
5.6. Compresión de ficheros
5.6.1. Algoritmos de compresión sin pérdida
- Concepto: Comprimen los datos sin perder información.
- Ejemplos: ZIP, PNG.
5.6.2. Algoritmos de compresión con pérdida
- Concepto: Comprimen los datos eliminando parte de la información, generalmente imperceptible.
- Ejemplos: JPEG, MP3.
Gestión y Manipulación de Ficheros
6.1. Operaciones básicas con ficheros
- Apertura: Preparar un archivo para lectura o escritura.
- Lectura: Extraer datos de un archivo.
- Escritura: Insertar datos en un archivo.
- Cierre: Finalizar el acceso al archivo.
Las operaciones básicas con archivos son acciones fundamentales que se realizan para gestionar la lectura, escritura y manipulación de datos almacenados en archivos en un sistema informático. Estas operaciones son esenciales para cualquier programa o aplicación que necesite interactuar con datos persistentes. Aquí te explico brevemente cada una:
- Apertura de archivos:
- Para manipular un archivo, primero debes abrirlo. Esto se hace usando funciones proporcionadas por el sistema operativo o por la biblioteca estándar del lenguaje de programación que estés utilizando. Al abrir un archivo, especificas si deseas leer, escribir o ambas cosas (lectura y escritura).
- Lectura de archivos:
- Una vez abierto un archivo para lectura, puedes leer los datos almacenados en él. La lectura puede hacerse de diferentes formas dependiendo del lenguaje de programación, como leer línea por línea o leer todo el contenido en una sola operación. Es importante manejar adecuadamente la lectura para evitar problemas de manejo de memoria y errores de lectura.
- Escritura en archivos:
- Si un archivo se abre en modo de escritura, puedes escribir datos en él. Esto incluye escribir texto, números u otros tipos de información estructurada según sea necesario por tu aplicación. Es crucial tener en cuenta que la escritura puede sobrescribir datos existentes o agregar nuevos datos al final del archivo, dependiendo del modo de apertura.
- Cierre de archivos:
- Después de realizar las operaciones necesarias (lectura, escritura, etc.), es buena práctica cerrar el archivo. Esto libera los recursos asociados al archivo en el sistema operativo y asegura que todos los datos se escriban correctamente en el disco. No cerrar un archivo puede resultar en pérdida de datos o en problemas de acceso para otros programas.
- Manipulación de archivos:
- Además de la lectura y escritura básicas, hay otras operaciones que se pueden realizar en archivos, como moverlos, renombrarlos, eliminarlos o cambiar sus permisos de acceso. Estas operaciones son útiles para la administración general del sistema de archivos y son fundamentales para muchas aplicaciones.
- Control de errores y excepciones:
- Durante cualquier operación con archivos, es importante manejar errores y excepciones correctamente. Esto incluye asegurarse de que el archivo existe antes de intentar abrirlo, controlar errores de escritura o lectura debido a problemas de permisos o falta de espacio en disco, entre otros.
6.2. Gestión de directorios
- Crear: Crear nuevos directorios.
- Eliminar: Borrar directorios existentes.
- Mover: Cambiar la ubicación de un directorio.
- Renombrar: Cambiar el nombre de un directorio.
La gestión de ficheros se refiere al conjunto de operaciones y técnicas utilizadas para administrar archivos de datos en un sistema de computación. Aquí te explico algunos aspectos clave:
- Creación de archivos: Consiste en la creación de nuevos archivos en el sistema de almacenamiento. Esto implica asignar espacio en disco para el archivo y establecer atributos como nombre, tamaño inicial, permisos de acceso, entre otros.
- Escritura y lectura de archivos: Estas operaciones son fundamentales para manipular el contenido de los archivos. Es posible escribir datos en un archivo, añadir información al final o modificar contenido existente. Por otro lado, la lectura permite acceder al contenido de un archivo y recuperar la información almacenada.
- Actualización y borrado de archivos: Permite modificar el contenido de un archivo ya existente, ya sea sobrescribiendo parte de su contenido o eliminándolo completamente. La eliminación implica liberar el espacio ocupado por el archivo en el sistema de almacenamiento.
- Organización de archivos: Involucra la estructuración de los archivos en directorios o carpetas, lo cual facilita la organización y la gestión de los mismos. Los sistemas de archivos utilizan árboles de directorios para gestionar la ubicación y jerarquía de los archivos.
- Control de acceso y permisos: Los sistemas operativos suelen gestionar permisos de acceso a los archivos, determinando qué usuarios o procesos pueden leer, escribir o ejecutar un archivo específico. Esto es fundamental para mantener la seguridad y la integridad de los datos.
- Metadatos: Los archivos pueden contener metadatos, que son información adicional sobre el archivo mismo, como la fecha de creación, tamaño, propietario, tipo de archivo, entre otros detalles. Estos metadatos son útiles para la gestión y el manejo de los archivos.
- Sistemas de archivos: Se refiere al formato y la estructura utilizada para almacenar y organizar archivos en un dispositivo de almacenamiento. Los sistemas de archivos pueden variar en cuanto a sus características y capacidades, dependiendo del tipo de dispositivo y del sistema operativo utilizado.
6.3. Permisos y seguridad en ficheros
- Concepto: Controlar el acceso y las modificaciones a los archivos mediante permisos (lectura, escritura, ejecución).
- Métodos: Sistemas de archivos con permisos (Unix, NTFS).
Los permisos y la seguridad en los sistemas de archivos son fundamentales para garantizar que los datos sean accesibles solo para los usuarios autorizados y para protegerlos de modificaciones no deseadas. A continuación, se describe cómo funcionan los permisos y la seguridad en los sistemas de archivos, especialmente en sistemas operativos Unix y similares, como Linux:
1. Permisos en sistemas Unix/Linux:
En estos sistemas, cada archivo y directorio tiene asociados permisos que determinan quién puede leer, escribir o ejecutar el archivo. Estos permisos se dividen en tres categorías:
- Usuario (Owner): El propietario del archivo.
- Grupo (Group): Un grupo de usuarios que tienen ciertos permisos sobre el archivo.
- Otros (Others): Todos los demás usuarios.
Cada una de estas categorías puede tener tres tipos de permisos:
- Lectura (Read – r): Permite leer el contenido del archivo.
- Escritura (Write – w): Permite modificar el archivo.
- Ejecución (Execute – x): Permite ejecutar el archivo, si es un programa o script. En el caso de directorios, permite acceder a los archivos contenidos en el directorio.
2. Representación de los permisos:
Los permisos se representan de dos maneras:
- Modo simbólico: Usa letras para representar los permisos, por ejemplo, rwxr-xr–.
- Modo octal: Usa números para representar los permisos, por ejemplo, 755.
En el modo simbólico, los primeros tres caracteres representan los permisos del propietario, los siguientes tres del grupo y los últimos tres de otros. En el modo octal, cada dígito representa un conjunto de permisos en formato binario.
3. Comandos básicos para gestionar permisos:
- ls -l: Lista los archivos en el directorio con sus permisos.
- chmod: Cambia los permisos de un archivo o directorio.
- Ejemplo: chmod 755 archivo otorga permisos de lectura, escritura y ejecución al propietario, y permisos de lectura y ejecución al grupo y otros.
- chown: Cambia el propietario de un archivo o directorio.
- Ejemplo: chown usuario archivo cambia el propietario del archivo a «usuario».
- chgrp: Cambia el grupo asociado a un archivo o directorio.
- Ejemplo: chgrp grupo archivo cambia el grupo del archivo a «grupo».
4. Máscara de creación de archivos (umask):
La máscara de creación de archivos (umask) determina los permisos predeterminados que se aplican cuando se crea un nuevo archivo o directorio. Se define mediante una máscara octal que se resta de los permisos completos (generalmente 777 para directorios y 666 para archivos).
- Ejemplo: umask 022 resulta en permisos predeterminados de 755 para directorios y 644 para archivos.
5. Permisos especiales:
Hay tres permisos especiales que pueden aplicarse en Unix/Linux:
- SetUID (SUID): Hace que un archivo se ejecute con los permisos del propietario del archivo.
- SetGID (SGID): Hace que un archivo se ejecute con los permisos del grupo del archivo.
- Sticky bit: Para directorios, permite que solo el propietario de un archivo pueda borrarlo o renombrarlo dentro del directorio.
6. Permisos en sistemas Windows:
En sistemas Windows, los permisos se gestionan mediante el Sistema de Archivos NTFS, que utiliza un enfoque basado en listas de control de acceso (ACLs). Los permisos básicos incluyen:
- Full Control (Control total): Permite hacer cualquier cosa con el archivo o directorio.
- Modify (Modificar): Permite leer, escribir y borrar el archivo o directorio.
- Read & Execute (Leer y ejecutar): Permite leer y ejecutar el archivo.
- List Folder Contents (Listar el contenido de la carpeta): Permite ver los archivos y subdirectorios dentro de una carpeta.
- Read (Leer): Permite leer el contenido del archivo o directorio.
- Write (Escribir): Permite escribir o añadir datos al archivo o directorio.
7. Mejores prácticas de seguridad:
- Principio de mínimo privilegio: Asignar solo los permisos necesarios para que un usuario realice su trabajo.
- Revisar y auditar permisos: Realizar auditorías periódicas de los permisos de archivos y directorios para garantizar que no haya configuraciones inseguras.
- Utilizar permisos especiales con precaución: Los permisos SetUID, SetGID y el sticky bit deben ser utilizados solo cuando sea absolutamente necesario y con una comprensión completa de sus implicaciones de seguridad.
- Seguridad de grupos y roles: Utilizar grupos y roles para gestionar permisos de manera eficiente y evitar la asignación directa de permisos a cada usuario individualmente.
6.4. Sistemas de ficheros
- Concepto: Organización y estructura de cómo los archivos se almacenan y recuperan en un sistema operativo.
- Ejemplos: FAT32, NTFS, ext4.
Los sistemas de ficheros son una parte fundamental del sistema operativo de un computador, ya que son responsables de la organización, almacenamiento, recuperación y gestión de datos en dispositivos de almacenamiento como discos duros, SSDs, unidades flash y otros medios de almacenamiento. A continuación, se describe de manera extensa los conceptos, tipos, estructura, características y ejemplos de sistemas de ficheros:
Conceptos Básicos
- Sistema de Archivos (File System): Es una estructura de datos y un conjunto de rutinas de software utilizadas para gestionar la creación, eliminación, lectura y escritura de archivos en un dispositivo de almacenamiento.
- Archivo (File): Es una colección de datos almacenados en un dispositivo de almacenamiento y administrados por el sistema de archivos.
- Directorio (Directory): Es una estructura que contiene referencias a otros archivos y/o directorios. A menudo se organiza en una estructura jerárquica de árbol.
- Bloque (Block): Es la unidad básica de almacenamiento utilizada por un sistema de archivos para leer y escribir datos en el dispositivo de almacenamiento.
- Inode (Index Node): Es una estructura de datos utilizada en muchos sistemas de archivos para almacenar información sobre un archivo, como su tamaño, permisos, tiempos de acceso/modificación y ubicaciones de los bloques de datos.
Tipos de Sistemas de Ficheros
- FAT (File Allocation Table):
- FAT12, FAT16, FAT32: Estos son sistemas de archivos simples y ampliamente utilizados en disquetes y unidades flash. La diferencia principal radica en el tamaño de la tabla de asignación y el tamaño máximo de volumen y archivo que pueden manejar.
- exFAT: Es una versión extendida de FAT diseñada para superar las limitaciones de FAT32, como el tamaño máximo de archivo y volumen.
- NTFS (New Technology File System):
- Desarrollado por Microsoft, NTFS es el sistema de archivos predeterminado para Windows. Soporta grandes volúmenes y archivos, control de acceso basado en ACL (Listas de Control de Acceso), y características avanzadas como compresión, cifrado y recuperación tras fallos.
- EXT (Extended File System):
- EXT2: Fue uno de los primeros sistemas de archivos utilizados en Linux. No soporta journaling.
- EXT3: Añade journaling a EXT2, lo que mejora la recuperación tras fallos.
- EXT4: Es una mejora de EXT3, con soporte para volúmenes y archivos más grandes, y mejoras en el rendimiento y la integridad de los datos.
- XFS:
- Desarrollado por Silicon Graphics (SGI) y utilizado en sistemas Linux, XFS es un sistema de archivos de alto rendimiento que soporta volúmenes y archivos muy grandes, con características avanzadas de gestión y recuperación.
- Btrfs (B-Tree File System):
- Desarrollado por Oracle, Btrfs es un sistema de archivos de próxima generación para Linux, con características como snapshots, compresión, integración de RAID, y verificación de integridad.
- HFS+ (Hierarchical File System Plus) y APFS (Apple File System):
- Desarrollados por Apple, HFS+ es el sistema de archivos utilizado en versiones anteriores de macOS, mientras que APFS es el sistema de archivos moderno diseñado para mejorar el rendimiento, la seguridad y la fiabilidad.
- ZFS (Zettabyte File System):
- Desarrollado por Sun Microsystems, ZFS es un sistema de archivos y gestor de volúmenes con características avanzadas como snapshots, clonación, compresión, y verificación de integridad de datos.
Estructura de un Sistema de Ficheros
- Superbloque:
- Contiene información sobre el sistema de archivos en su conjunto, como el tamaño del sistema, el estado, y la información de configuración.
- Inodes:
- Estructuras que almacenan metadatos sobre archivos y directorios, como permisos, propietario, tamaño, y punteros a bloques de datos.
- Bloques de Datos:
- Unidades básicas de almacenamiento donde se guardan los datos de los archivos.
- Directorios:
- Estructuras que contienen entradas para archivos y otros directorios. Cada entrada típicamente contiene un nombre y un puntero a un inode.
- Tabla de Asignación (por ejemplo, la FAT en sistemas FAT):
- Utilizada para rastrear qué bloques de datos están libres o asignados y a qué archivos pertenecen.
Características y Funcionalidades
- Journaling:
- Es una técnica utilizada para mantener la integridad del sistema de archivos, registrando los cambios pendientes en un journal (diario) antes de que se realicen. Esto ayuda a recuperar el sistema de archivos después de un fallo.
- Permisos y Seguridad:
- Los sistemas de archivos modernos permiten establecer permisos y políticas de acceso para proteger los datos. Esto puede incluir permisos de lectura, escritura y ejecución, así como cifrado de datos.
- Snapshots y Clonación:
- Algunos sistemas de archivos permiten crear instantáneas del estado del sistema en un momento dado, lo que facilita la recuperación y la copia de seguridad.
- Compresión:
- La capacidad de comprimir datos para ahorrar espacio en el disco.
- Integridad y Verificación de Datos:
- Características que permiten detectar y corregir errores en los datos almacenados.
Ejemplos de Uso
- FAT32 y exFAT: Usados comúnmente en tarjetas de memoria, unidades flash y discos duros portátiles debido a su amplia compatibilidad con distintos sistemas operativos.
- NTFS: Utilizado principalmente en sistemas Windows debido a sus características avanzadas y su integración con el sistema operativo.
- EXT4: Comúnmente utilizado en distribuciones de Linux debido a su estabilidad y buen rendimiento.
- APFS: Sistema de archivos predeterminado para dispositivos de Apple como Mac, iPhone, y iPad.
- ZFS: Utilizado en sistemas que requieren alta fiabilidad y disponibilidad de datos, como servidores y sistemas de almacenamiento en red.
Comparación de Sistemas de Ficheros
| Característica | FAT32 | NTFS | EXT4 | XFS | APFS | ZFS |
| Tamaño máximo archivo | 4 GB | 16 TB | 16 TB | 8 EB | 8 EB | 16 EB |
| Tamaño máximo volumen | 8 TB | 256 TB | 1 EB | 8 EB | 8 EB | 16 EB |
| Journaling | No | Sí | Sí | Sí | Sí | Sí |
| Compresión | No | Sí | No | No | Sí | Sí |
| Cifrado | No | Sí | No | No | Sí | No |
| Snapshots | No | No | No | No | Sí | Sí |
6.5. Recuperación y respaldo de ficheros
- Recuperación: Restaurar archivos eliminados o dañados.
- Respaldo: Crear copias de seguridad periódicas de archivos para prevenir pérdida de datos.
La recuperación y respaldo de ficheros son procesos cruciales para garantizar la seguridad y disponibilidad de datos importantes en caso de pérdida, corrupción, o daño de los mismos. A continuación, se detalla cada uno de estos procesos:
Respaldo de Ficheros
Definición
El respaldo de ficheros, también conocido como copia de seguridad, consiste en duplicar los datos almacenados en un sistema para protegerlos contra la pérdida accidental o intencional. Este proceso crea una copia adicional de los datos que se almacena en un lugar seguro, separado del almacenamiento original.
Tipos de Respaldos
- Completo: Se realiza una copia de todos los datos seleccionados. Es el tipo más seguro, pero también el más lento y que más espacio requiere.
- Incremental: Solo se copian los datos que han cambiado desde el último respaldo (completo o incremental). Es rápido y ahorra espacio, pero la recuperación puede ser más compleja.
- Diferencial: Se copian todos los datos que han cambiado desde el último respaldo completo. Es un equilibrio entre el respaldo completo y el incremental.
Métodos de Respaldo
- Local: Almacenamiento en dispositivos físicos como discos duros externos, DVDs, o cintas magnéticas.
- En la Nube: Uso de servicios de almacenamiento en la nube como Google Drive, Dropbox, o servicios especializados como Amazon S3.
- Híbrido: Combina respaldo local y en la nube para mayor seguridad y redundancia.
Buenas Prácticas
- Frecuencia: Realizar respaldos de manera regular, dependiendo de la criticidad de los datos.
- Verificación: Comprobar regularmente la integridad de los respaldos.
- Almacenamiento Seguro: Guardar las copias de seguridad en ubicaciones seguras, preferiblemente fuera del sitio original.
- Automatización: Utilizar software de respaldo que permita automatizar el proceso.
Recuperación de Ficheros
Definición
La recuperación de ficheros es el proceso de restaurar datos desde una copia de seguridad después de que se hayan perdido o dañado los datos originales. Este proceso puede involucrar la recuperación de ficheros individuales o la restauración completa de un sistema.
Tipos de Recuperación
- Recuperación Completa: Restauración de todo el sistema o conjunto de datos desde un respaldo completo.
- Recuperación Parcial: Restauración de ficheros o datos específicos desde un respaldo incremental o diferencial.
- Recuperación de Desastres: Proceso más amplio que implica la restauración de todo el sistema de TI, incluyendo hardware y software, después de un evento catastrófico.
Pasos en el Proceso de Recuperación
- Identificación del Problema: Determinar la causa de la pérdida de datos (error humano, fallo de hardware, ataque cibernético, etc.).
- Selección del Respaldo: Elegir la copia de seguridad adecuada que contiene los datos necesarios.
- Restauración de Datos: Utilizar software o herramientas específicas para restaurar los datos desde la copia de seguridad.
- Verificación: Comprobar que los datos recuperados son correctos y completos.
- Análisis y Prevención: Investigar la causa de la pérdida de datos y tomar medidas para evitar futuros incidentes.
Herramientas Comunes
- Software de Respaldo: Acronis True Image, Norton Ghost, Veeam Backup & Replication.
- Servicios de Respaldo en la Nube: Google Cloud Storage, Amazon S3, Microsoft Azure Backup.
- Sistemas Operativos: Funcionalidades de respaldo y restauración integradas en Windows (Historial de archivos, Restauración del sistema) y macOS (Time Machine).
Importancia
- Protección contra Pérdida de Datos: Garantiza que los datos importantes no se pierdan debido a errores, fallos o desastres.
- Continuidad del Negocio: Facilita la recuperación rápida de datos, minimizando el tiempo de inactividad y el impacto en las operaciones.
- Cumplimiento Normativo: Muchas industrias tienen regulaciones que requieren mantener copias de seguridad de ciertos tipos de datos.
En resumen, la recuperación y respaldo de ficheros son componentes esenciales de la gestión de datos que permiten a las organizaciones y usuarios individuales proteger y recuperar sus datos en caso de cualquier eventualidad.
Tema 4
Introducción a los sistemas operativos
1.1 Definición y funciones básicas
Definición: Un sistema operativo (SO) es un conjunto de programas que gestionan los recursos de hardware y software de una computadora. Actúa como intermediario entre los usuarios y el hardware.
Funciones básicas:
- Gestión de procesos: Administración de la ejecución de programas, multitarea, y gestión de estados de los procesos.
- Gestión de memoria: Asignación y liberación de memoria para aplicaciones y procesos, administración de la memoria virtual.
- Gestión de archivos y directorios: Organización, almacenamiento, acceso, y seguridad de los datos en los sistemas de archivos.
- Gestión de entrada/salida: Control y coordinación de dispositivos de entrada y salida como teclados, monitores, impresoras, etc.
- Interfaz de usuario: Provisión de una interfaz gráfica o de línea de comandos para la interacción con el sistema.
1.2 Evolución histórica de los sistemas operativos
- Década de 1950: Primeros sistemas operativos en computadoras mainframe. Operaciones muy básicas, sin multiprogramación.
- Década de 1960: Introducción de sistemas operativos como CTSS y Multics, con multitarea y tiempo compartido.
- Década de 1970: Unix se populariza, influenciando muchos sistemas operativos modernos. Primeros sistemas operativos personales (PC-DOS, CP/M).
- Década de 1980: MS-DOS y el inicio de Windows. Crecimiento de Unix y el surgimiento de sistemas operativos específicos para diferentes tareas.
- Década de 1990: Windows 95 introduce la interfaz gráfica de usuario en el mercado masivo. Nacimiento de Linux.
- Siglo XXI: Sistemas operativos modernos como Windows, macOS, Linux se consolidan. Aparición de sistemas operativos móviles como iOS y Android.
Características generales de los sistemas operativos
2.1 Gestión de procesos
- Proceso: Programa en ejecución, incluyendo su código, datos y recursos.
- Gestión de procesos: Creación, planificación, ejecución y terminación de procesos. Uso de algoritmos de planificación para optimizar el uso de CPU.
2.2 Gestión de memoria
- Memoria principal (RAM): Espacio de almacenamiento temporal para los datos y programas en ejecución.
- Memoria virtual: Técnica que permite usar espacio en disco duro para ampliar la capacidad de la memoria RAM.
- Paginas y segmentación: Métodos para la gestión de la memoria virtual y protección de los espacios de memoria.
2.3 Gestión de archivos y directorios
- Sistema de archivos: Estructura que el SO usa para organizar y gestionar archivos y directorios.
- Operaciones: Creación, lectura, escritura, y eliminación de archivos y directorios. Permisos y seguridad.
2.4 Gestión de entrada/salida
- Controladores: Programas que gestionan la comunicación con dispositivos de hardware.
- Buffering y spooling: Técnicas para gestionar la entrada/salida eficiente.
Elementos constitutivos de los sistemas operativos
3.1 Kernel o núcleo
- Kernel: Parte central del SO, gestionando las operaciones más esenciales (memoria, procesos, dispositivos).
- Monolítico vs. Microkernel: Arquitecturas de kernel, donde el monolítico integra más funciones y el microkernel las minimiza.
3.2 Interfaz de usuario
- GUI (Interfaz gráfica de usuario): Basada en ventanas, íconos y menús.
- CLI (Interfaz de línea de comandos): Basada en comandos de texto.
3.3 Sistema de archivos
- Estructura jerárquica: Organización en forma de árbol con directorios y subdirectorios.
- Sistemas de archivos populares: NTFS, FAT32, ext4, HFS+, APFS.
3.4 Controladores de dispositivos
- Drivers: Software que permite al SO comunicarse con el hardware específico del dispositivo.
- Plug and Play: Capacidad del SO para detectar y configurar automáticamente dispositivos.
Sistema operativo Windows
4.1 Historia y versiones
- Historia: Desde Windows 1.0 (1985) hasta Windows 11 (2021), evolución de GUI y funcionalidad.
- Versiones clave: Windows 95, XP, 7, 10, 11.
4.2 Arquitectura de Windows
- Capas: Hardware Abstraction Layer (HAL), kernel, subsistemas de usuario.
- Componentes: Sistema de ventanas, gestión de memoria, seguridad, controladores.
4.3 Gestión de procesos en Windows
- Planificación: Uso de colas de prioridad para la asignación de CPU.
- Herramientas: Administrador de tareas, Servicios de Windows.
4.4 Sistema de archivos NTFS
- NTFS (New Technology File System): Sistema de archivos con características avanzadas como seguridad, journaling, compresión y cifrado.
4.5 Registro de Windows
- Registro: Base de datos que almacena configuraciones y opciones del sistema operativo y aplicaciones.
- Editor del Registro: Herramienta para visualizar y modificar el registro.
4.6 Seguridad en Windows
- Características: Firewall, Windows Defender, BitLocker, Control de Cuentas de Usuario (UAC).
Sistemas Unix y Linux
5.1 Historia y filosofía Unix
- Unix: Desarrollado en AT&T Bell Labs en los 70s. Filosofía de pequeñas herramientas bien definidas.
- Linux: Creado por Linus Torvalds en 1991, inspirado en Unix y distribuido bajo la licencia GPL.
5.2 Distribuciones Linux más populares
- Distribuciones: Ubuntu, Debian, Fedora, CentOS, Arch Linux.
- Diferencias: Enfocadas en distintos usuarios y necesidades.
5.3 Estructura del sistema de archivos
- Directorio raíz (/): Base del sistema de archivos.
- Subdirectorios: /bin, /etc, /home, /var, /usr, /dev, /proc.
5.4 Shell y comandos básicos
- Shell: Interfaz de línea de comandos (Bash, Zsh).
- Comandos: ls, cp, mv, rm, mkdir, chmod, chown, ps, top.
5.5 Gestión de usuarios y permisos
- Usuarios: Administración de cuentas de usuario y grupos.
- Permisos: Lectura (r), escritura (w), ejecución (x).
5.6 Procesos y servicios en Unix/Linux
- Gestión de procesos: ps, top, kill, nice.
- Servicios: Demonios y gestión de servicios (systemd, init).
Sistema operativo macOS
6.1 Historia y evolución de macOS
- Historia: Desde System 1 en 1984 hasta macOS Ventura (2022).
- Evolución: Transición de Mac OS clásico a macOS basado en Unix.
6.2 Arquitectura de macOS (basada en Unix)
- Capas: Núcleo Darwin, APIs (Cocoa, Carbon), entorno gráfico (Aqua).
- Características: Seguridad, estabilidad, eficiencia.
6.3 Interfaz gráfica y características distintivas
- Aqua: Interfaz gráfica distintiva.
- Características: Mission Control, Spotlight, Finder, Dock.
6.4 Sistema de archivos HFS+ y APFS
- HFS+: Sistema de archivos utilizado hasta 2017.
- APFS: Sistema de archivos moderno, optimizado para SSDs, con mejor gestión de espacio y seguridad.
6.5 Integración con el ecosistema Apple
- iCloud: Sincronización y almacenamiento en la nube.
- Continuidad: Integración con otros dispositivos Apple (Handoff, AirDrop).
Sistemas operativos para dispositivos móviles
7.1 Android
7.1.1 Arquitectura y componentes
- Capas: Kernel de Linux, bibliotecas, Android Runtime (ART), Framework de Aplicaciones, Aplicaciones.
- Componentes: Servicios del sistema, administradores de ventanas, paquetes y actividades.
7.1.2 Gestión de aplicaciones y permisos
- Aplicaciones: A través de la Play Store, gestión de procesos en segundo plano.
- Permisos: Modelo de permisos en tiempo de ejecución.
7.1.3 Seguridad en Android
- Características: Google Play Protect, cifrado, SELinux, actualizaciones de seguridad.
7.2 iOS
7.2.1 Arquitectura y características principales
- Capas: Núcleo XNU, Core OS, Core Services, Media, Cocoa Touch.
- Características: Seguridad, eficiencia energética, integración con hardware.
7.2.2 Gestión de aplicaciones y App Store
- App Store: Distribución de aplicaciones.
- Gestión: Modelo de sandboxing, control estricto de calidad y permisos.
7.2.3 Seguridad y privacidad en iOS
- Características: Cifrado, Touch ID/Face ID, actualizaciones frecuentes, privacidad de datos.
7.3 Otros sistemas operativos móviles (breve mención)
- Otros SO: Windows Phone, BlackBerry OS, KaiOS.
Comparativa entre sistemas operativos
8.1 Diferencias en la gestión de recursos
- Windows vs. Unix/Linux vs. macOS: Diferencias en la eficiencia, gestión de memoria y procesos.
8.2 Compatibilidad de software y hardware
- Compatibilidad: Windows es compatible con una amplia gama de hardware y software. Linux tiene amplia compatibilidad en servidores, menos en desktop. macOS está optimizado para hardware de Apple.
8.3 Seguridad y privacidad
- Seguridad: Unix/Linux y macOS tienen menos vulnerabilidades debido a su base Unix. Windows es más atacado pero ha mejorado en seguridad.
- Privacidad: iOS y macOS destacan en privacidad, Android mejora continuamente.
8.4 Usabilidad y experiencia de usuario
- Windows: Popular en ambientes de oficina.
- macOS: Preferido en diseño y multimedia.
- Linux: Flexibilidad y personalización.
Tendencias futuras en sistemas operativos
9.1 Sistemas operativos en la nube
- Cloud OS: Sistemas operativos diseñados para funcionar en entornos de nube, como Chrome OS y AWS Lambda.
9.2 Integración con inteligencia artificial
- IA: Mejora de la gestión de recursos, automatización y personalización.
9.3 Sistemas operativos para Internet de las Cosas (IoT)
- IoT OS: Sistemas como Contiki, RIOT, FreeRTOS diseñados para dispositivos con recursos limitados y conectividad.
Tema 5
Introducción a los sistemas de gestión de bases de datos
1.1. Definición y conceptos básicos
Un Sistema de Gestión de Bases de Datos (SGBD) es un conjunto de programas que permite la creación, administración y manipulación de bases de datos. Los SGBD actúan como intermediarios entre los usuarios y las bases de datos, garantizando que los datos sean accesibles, coherentes, seguros y administrados de manera eficiente.
1.2. Evolución histórica
- Años 60: Primeros sistemas de gestión de bases de datos, como el sistema de archivos secuenciales.
- Años 70: Introducción de los modelos jerárquico (IMS) y de red (CODASYL).
- Años 80: Aparición del modelo relacional con el SGBD relacional (Oracle, DB2).
- Años 90: Desarrollo de bases de datos orientadas a objetos.
- Años 2000 en adelante: Proliferación de bases de datos NoSQL debido a los requerimientos de grandes volúmenes de datos y escalabilidad.
1.3. Tipos de sistemas de gestión de bases de datos
- Relacionales (RDBMS): Basados en el modelo relacional de E.F. Codd.
- Orientados a objetos (OODBMS): Combina características de bases de datos y programación orientada a objetos.
- NoSQL: Diseñados para grandes volúmenes de datos no estructurados y alta escalabilidad.
Bases de datos relacionales
2.1. Fundamentos del modelo relacional
El modelo relacional organiza los datos en tablas (relaciones) compuestas por filas (tuplas) y columnas (atributos). Cada tabla representa una entidad y cada fila representa una instancia de esa entidad.
2.2. Características principales
- Integridad referencial: Asegura que las relaciones entre tablas se mantengan coherentes.
- Consistencia: Los datos deben cumplir con las reglas definidas en el esquema.
- Atomicidad: Las operaciones se completan en su totalidad o no se realizan.
- Aislamiento: Las transacciones concurrentes no deben interferir entre sí.
- Durabilidad: Los cambios realizados por una transacción confirmada deben persistir.
2.3. Componentes de un SGBD relacional
- Motor de almacenamiento: Gestiona cómo se almacenan y recuperan los datos.
- Procesador de consultas: Interpreta y ejecuta las consultas SQL.
- Gestor de transacciones: Controla las transacciones para mantener la integridad de los datos.
- Sistema de gestión de usuarios: Administra el acceso y los permisos de los usuarios.
2.4. Lenguaje SQL
SQL (Structured Query Language) es el lenguaje estándar para interactuar con bases de datos relacionales. Permite definir esquemas (DDL), manipular datos (DML), controlar el acceso (DCL) y gestionar transacciones (TCL).
2.5. Normalización y diseño de bases de datos relacionales
La normalización es el proceso de estructurar una base de datos para reducir la redundancia y mejorar la integridad de los datos. Se realiza a través de una serie de formas normales (1NF, 2NF, 3NF, BCNF).
Sistemas de gestión de bases de datos orientados a objetos
3.1. Conceptos de la programación orientada a objetos
La programación orientada a objetos (POO) organiza el software en «objetos» que encapsulan datos y comportamientos. Los conceptos clave incluyen clases, objetos, herencia, polimorfismo y encapsulamiento.
3.2. Características de las bases de datos orientadas a objetos
- Persistencia de objetos: Los objetos se almacenan de forma persistente sin necesidad de transformación.
- Herencia: Permite la reutilización de estructuras de datos y comportamiento.
- Polimorfismo: Permite que diferentes objetos sean tratados de manera uniforme.
- Encapsulamiento: Protege los datos internos de los objetos, exponiendo solo lo necesario.
3.3. Componentes de un SGBD orientado a objetos
- Motor de almacenamiento de objetos: Maneja el almacenamiento y recuperación de objetos.
- Sistema de gestión de esquemas: Administra las definiciones de las clases y sus relaciones.
- Gestor de consultas: Soporta consultas sobre los objetos almacenados.
3.4. Lenguajes de consulta para bases de datos orientadas a objetos
Lenguajes como OQL (Object Query Language) permiten realizar consultas sobre bases de datos orientadas a objetos, similar a cómo SQL interactúa con bases de datos relacionales.
Bases de datos NoSQL
4.1. Introducción y motivación del movimiento NoSQL
El movimiento NoSQL surge como respuesta a las limitaciones de los sistemas relacionales tradicionales, especialmente en términos de escalabilidad horizontal, flexibilidad de esquemas y manejo de grandes volúmenes de datos no estructurados.
4.2. Tipos de bases de datos NoSQL
4.2.1. Bases de datos de documentos
Almacenan datos en documentos similares a JSON, como MongoDB. Son ideales para datos semi-estructurados y aplicaciones que requieren flexibilidad en el esquema.
4.2.2. Bases de datos de clave-valor
Almacenan datos como pares clave-valor, como Redis. Son eficientes para operaciones rápidas de lectura y escritura.
4.2.3. Bases de datos de columnas anchas
Utilizan un modelo de almacenamiento basado en columnas, como Cassandra. Son adecuadas para aplicaciones que requieren consultas rápidas sobre grandes volúmenes de datos.
4.2.4. Bases de datos de grafos
Representan datos en grafos con nodos y aristas, como Neo4j. Son ideales para aplicaciones que requieren modelado de relaciones complejas.
4.3. Características comunes de las bases de datos NoSQL
- Escalabilidad horizontal: Capacidad de expandirse distribuyendo datos y carga a través de múltiples servidores.
- Flexibilidad de esquemas: Permite cambios en la estructura de los datos sin necesidad de migraciones complejas.
- Rendimiento: Optimizado para operaciones rápidas de lectura y escritura.
4.4. Componentes de los sistemas NoSQL
- Motor de almacenamiento distribuido: Maneja la distribución de datos y la redundancia.
- Sistema de gestión de nodos: Coordina las operaciones entre múltiples nodos.
- Lenguajes de consulta específicos: Adaptados al tipo de base de datos, como CQL para Cassandra.
Comparativa entre sistemas de gestión de bases de datos
5.1. Ventajas y desventajas de cada tipo
- RDBMS: Ventajas en integridad y consistencia; desventajas en escalabilidad horizontal.
- OODBMS: Ventajas en manejo de datos complejos; desventajas en adopción y estandarización.
- NoSQL: Ventajas en escalabilidad y flexibilidad; desventajas en falta de estandarización y posibles problemas de consistencia.
5.2. Escenarios de uso recomendados
- RDBMS: Aplicaciones empresariales con datos estructurados y requerimientos de transacciones ACID.
- OODBMS: Aplicaciones que requieren manejo de datos complejos y persistencia de objetos.
- NoSQL: Aplicaciones con grandes volúmenes de datos, datos semi-estructurados y necesidades de alta escalabilidad.
5.3. Rendimiento y escalabilidad
- RDBMS: Alta consistencia y rendimiento en vertical.
- NoSQL: Alta escalabilidad horizontal y rendimiento distribuido.
Aspectos de seguridad en los sistemas de gestión de bases de datos
6.1. Control de acceso y autenticación
Implementa medidas para garantizar que solo usuarios autorizados puedan acceder a la base de datos y sus recursos. Esto incluye la gestión de usuarios y permisos.
6.2. Cifrado de datos
Protege los datos en reposo y en tránsito utilizando técnicas de cifrado para evitar accesos no autorizados.
6.3. Auditoría y registro de actividades
Mantiene registros detallados de las operaciones realizadas en la base de datos para facilitar la auditoría y la detección de actividades sospechosas.
Gestión de transacciones y concurrencia
7.1. ACID vs BASE
- ACID: Atomicidad, Consistencia, Aislamiento y Durabilidad; garantiza transacciones seguras y consistentes.
- BASE: Basically Available, Soft state, Eventual consistency; prioriza disponibilidad y escalabilidad sobre consistencia inmediata.
7.2. Técnicas de control de concurrencia
- Bloqueos (Locks): Previenen conflictos mediante la restricción de accesos concurrentes.
- Versionamiento: Permite múltiples versiones de datos para evitar conflictos y permitir accesos concurrentes.
7.3. Recuperación y tolerancia a fallos
Incluye técnicas de respaldo y restauración, así como mecanismos de tolerancia a fallos para asegurar la continuidad del servicio.
Optimización y rendimiento
8.1. Índices y estrategias de indexación
Los índices mejoran la velocidad de las consultas permitiendo un acceso más rápido a los datos.
8.2. Optimización de consultas
Involucra técnicas para mejorar el rendimiento de las consultas, como la reescritura de consultas, uso de índices adecuados y análisis del plan de ejecución.
8.3. Técnicas de caché
Utiliza la memoria caché para almacenar temporalmente los resultados de consultas frecuentes, mejorando el rendimiento y reduciendo la carga sobre la base de datos.
Integración y interoperabilidad
9.1. APIs y protocolos de acceso a datos
Proporcionan interfaces estandarizadas para interactuar con la base de datos desde aplicaciones externas, como ODBC, JDBC y RESTful APIs.
9.2. Integración con aplicaciones y frameworks
Facilita la conexión y uso de bases de datos dentro de aplicaciones y entornos de desarrollo, incluyendo ORM (Object-Relational Mapping) frameworks como Hibernate.
9.3. Migración entre diferentes sistemas de bases de datos
Involucra herramientas y técnicas para trasladar datos de un sistema de bases de datos a otro, asegurando la integridad y consistencia de los datos durante el proceso.
Tendencias y futuro de los sistemas de gestión de bases de datos
10.1. Bases de datos en la nube
La adopción de servicios de bases de datos en la nube (DBaaS) como Amazon RDS y Google Cloud SQL, que ofrecen escalabilidad, alta disponibilidad y administración simplificada.
10.2. Big Data y análisis de datos
La integración de SGBD con tecnologías de Big Data (Hadoop, Spark) para el procesamiento y análisis de grandes volúmenes de datos.
10.3. Inteligencia artificial y aprendizaje automático en bases de datos
El uso de algoritmos de inteligencia artificial y aprendizaje automático para optimizar consultas, predecir tendencias y mejorar la toma de decisiones basada en datos.
Este temario cubre un amplio espectro de conceptos, tecnologías y prácticas que son fundamentales para entender y gestionar sistemas de bases de datos en diversos contextos y aplicaciones.


Deja un comentario