Resumen Completo de Sistemas Operativos, Procesos, Memoria y Comandos Linux
Historia y Evolución de los Sistemas Operativos
- IBM 704 (1956): Primer sistema operativo para este equipo.
- QDOS (1980): Sistema operativo rápido de disco.
- Android (2008): Sistema operativo desarrollado por Google, basado en Linux.
- IBSYS (1960): Nuevo método de gestión de búferes y dispositivos.
- Windows NT: Arquitectura base para las versiones modernas de Windows.
- Windows 95 (1995): Sistema operativo con interfaz gráfica de usuario.
- CTSS (1961): Sistema de tiempo compartido compatible (Time-sharing).
- Mac OS X (2001): Sistema operativo desarrollado por Apple Inc. para ordenadores Macintosh, que utiliza virtualización.
- EXEC 8 (1964): Combina procesamiento por lotes y tiempo compartido, permitiendo trabajos mixtos simultáneos.
- Unix (1969): Sistema operativo multitarea y multiusuario creado por Bell Labs.
- Apple I (1977): Primer producto de Apple.
- Windows XP (2001): Enfocado en la experiencia del usuario.
- Ubuntu (2004): Distribución de Linux orientada a la facilidad de uso.
- iOS (2007): Sistema operativo móvil diseñado para el iPhone.
- Windows 10 (2015): Sistema operativo de escritorio moderno.
Gestión de Procesos
Un proceso es un programa en ejecución. En su estructura en memoria encontramos:
- Segmento de Código (Text): Instrucciones del programa.
- Datos (Data): Variables globales.
- Pila (Stack): Almacena variables locales y control de llamadas.
- Registro (Registers): Incluye el Program Counter (PC) que indica la siguiente instrucción a ejecutar.
Estados de los Procesos
- Running (Ejecución): El proceso se está ejecutando en la CPU.
- Ready (Listo): El proceso está listo pero esperando a que se le asigne la CPU.
- Blocked (Bloqueado): El proceso espera un evento externo (por ejemplo, una operación de E/S).
Transiciones de Estados
- Running → Blocked: El proceso pide una operación de E/S (como leer un archivo).
- Blocked → Ready: La operación de E/S ha terminado.
- Ready → Running: El sistema operativo selecciona el proceso para ejecutarlo.
- Running → Ready: El sistema operativo arrebata la CPU al proceso para dársela a otro.
Llamadas al Sistema para Procesos
- fork(): Crea una copia exacta del proceso actual. Cada uno tiene su propio espacio de datos y pila.
- kill(): Termina un proceso.
- wait(): Espera a que otro proceso termine.
- pause(): Pausa la ejecución.
- getpid(): Obtiene el identificador (ID) del proceso.
- exec(): Reemplaza el programa actual por uno nuevo.
- Pipes (|): Conectan la salida estándar de un proceso con la entrada de otro (ejemplo:
echo "hola mundo" | wc).
Planificación de CPU (Scheduling)
Métricas clave:
- Turnaround Time: Tiempo de finalización - Tiempo de llegada.
- Response Time: Primer inicio - Tiempo de llegada.
Algoritmos de Planificación
- FIFO (First In, First Out): El primero que llega es el primero en ser atendido. Una vez que comienza, corre hasta terminar.
- SJF (Shortest Job First): Se ejecuta primero el trabajo más corto. Una vez que comienza, no se interrumpe.
- STCF (Shortest Time-to-Completion First): Corre el trabajo con menor tiempo restante; si llega un nuevo trabajo, se compara con el tiempo restante del actual.
- Round Robin (RR): Cada trabajo se ejecuta durante un cuanto de tiempo (quantum), luego se interrumpe y pasa al siguiente.
MLFQ (Multilevel Feedback Queue)
- Regla 1: Prioridad más alta gana.
- Regla 2: Misma prioridad = se aplica Round Robin.
- Regla 3: Todo trabajo nuevo entra con la prioridad más alta.
- Regla 4: Si un trabajo usa todo su quantum, baja su prioridad.
- Regla 5: Si un trabajo libera la CPU antes de terminar su quantum (por E/S), mantiene su prioridad.
- Estructura: Alta prioridad (Q8) descendiendo hasta Baja prioridad (Q1).
Gestión de Memoria y Virtualización
Jerarquía de Unidades: Bit → (÷8) Bytes → (÷1024) KB → MB → GB → TB
API de Memoria en C
- malloc(): Asigna memoria en el montículo (heap). Ejemplo:
int *x = malloc(sizeof(int)); - free(): Libera la memoria asignada previamente.
- Buenas prácticas: Inicializar usando
malloc(10 * sizeof(int)), usarfree()al terminar, y asignar memoria explícitamente (ej.malloc(strlen(...) + 1)). - Errores comunes: Olvidar liberar memoria, hacer doble
free()(liberar solo una vez), o usar un puntero tras liberarlo (se recomienda asignarx = NULLdespués defree(x)).
Distribución de Memoria en un Proceso
Direcciones altas (Stack) ➔ [Libre] ➔ (free) ➔ Heap ➔ BSS ➔ Data ➔ Text (Code) ➔ Direcciones bajas.
Virtualización y Paginación
- Dirección Física: Dirección Virtual + Base.
- Comprobación de límites: 0 ≤ Dirección Virtual ≤ Bound.
- Offset (Desplazamiento): Dirección Virtual % Tamaño de página (en bytes).
- VPN (Número de Página Virtual): Dirección Virtual / Tamaño de página (en bytes).
- Número de páginas virtuales: $2^{ ext{bits del VPN}}$.
- Número de marcos: Memoria física total / Tamaño de página.
- Tamaño de la tabla de páginas: Número de páginas virtuales × Bytes de cada entrada.
Comandos esenciales de Linux
Gestión de Archivos y Directorios
ls: Listar archivos.ls -tr: Listar ordenados por tiempo inverso.ls -ns: Listar mostrando tamaños.ls -R: Listado recursivo.mkdir [dir]: Crear carpeta.rmdir [dir]: Eliminar carpeta vacía.cd [dir]: Entrar a una carpeta.cd ..: Subir un nivel en el directorio.touch [file]: Crear archivo.rm [file]: Borrar archivo.mv [viejo] [nuevo]: Renombrar o mover archivo/carpeta.cat [file]: Ver el contenido de un archivo.man [comando]: Manual de ayuda del comando.
Búsqueda y Procesamiento de Texto
grep "txt" archivo.txt: Buscar texto.grep -i "txt" archivo.txt: Buscar sin distinguir mayúsculas y minúsculas.grep -c "txt" archivo.txt: Contar ocurrencias.grep -v "Linux" archivo.txt | grep "UNIX": Excluir una palabra y buscar otra.grep -m 2 "UNIX" example.txt: Mostrar las primeras 2 coincidencias.diff [file1] [file2]: Comparar archivos.wc -l [file]: Contar líneas.wc -w [file]: Contar palabras.wc -c [file]: Contar caracteres.sort: Ordenar líneas alfabéticamente.sort -r: Orden inverso.sort -n: Orden numérico.sort -u: Quitar duplicados.uniq: Eliminar duplicados consecutivos.uniq -c: Contar duplicados consecutivos.cut -d':' -f1 [archivo]: Cortar por delimitador y seleccionar columna.head -n 3 / tail -n 3: Mostrar las primeras o últimas líneas de un archivo.