
Sistemas Operativos: Procesos
Información del documento
Autor | Leopoldo Taravilse |
Escuela | Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires |
Especialidad | Sistemas Operativos |
Lugar | Buenos Aires |
Tipo de documento | Apuntes de Clase |
Idioma | Spanish |
Formato | |
Tamaño | 357.21 KB |
Resumen
I.Gestión de Procesos e Hilos
Este documento aborda conceptos fundamentales de sistemas operativos, comenzando con la gestión de procesos. Cada proceso se identifica de forma única mediante su PID (Process ID). El cambio de contexto, crucial en la gestión de procesos, implica guardar y cargar información del proceso en su PCB (Process Control Block), consumiendo tiempo de procesador. La sección introduce también los hilos (Threads), unidades básicas de ejecución dentro de un proceso, identificadas por su TID (Thread ID), que comparten recursos como memoria y archivos. Las llamadas al sistema Linux shmget
, shmat
, shmdt
y shmctl
se utilizan para la gestión de memoria compartida entre hilos. La API pthreads (POSIX threads) ofrece una forma estandarizada para la creación y manejo de hilos en sistemas Unix-like, utilizando funciones como pthread_create
y pthread_join
.
1. Identificación y Cambio de Contexto de Procesos
La sección inicia definiendo que cada proceso tiene un identificador único, el PID (Process ID). Se describe el concepto de cambio de contexto, un proceso fundamental en la gestión de sistemas operativos. Este cambio ocurre cuando un proceso en ejecución en una CPU es desalojado para dar paso a otro. El proceso implica guardar la información del proceso saliente en su PCB (Process Control Block) y cargar la información del proceso entrante desde su propio PCB. Se destaca que el cambio de contexto consume tiempo de procesador, tiempo durante el cual ningún proceso realiza trabajo útil. Por lo tanto, la frecuencia óptima de cambio de contexto busca un equilibrio: lo suficientemente infrecuente como para no desperdiciar demasiado tiempo de procesador, pero lo suficientemente frecuente como para evitar que un proceso monopolice la CPU por demasiado tiempo. Este equilibrio es crucial para el rendimiento general del sistema y la eficiencia en la asignación de recursos del procesador. Un cambio de contexto eficiente es un componente clave para un sistema operativo que responda de forma rápida y eficiente a las peticiones de los diferentes procesos.
2. Introducción a los Hilos Threads
A diferencia de la visión inicial de los procesos como un único hilo de ejecución, se presenta el concepto de hilos (threads) que permite dividir un proceso en varios hilos de ejecución que pueden correr simultáneamente, incluso en diferentes CPUs. Cada hilo se identifica mediante un TID (Thread ID), similar al PID para los procesos. Un hilo posee su propio estado de registros de la CPU y su propia área de stack en memoria. Sin embargo, a diferencia de los procesos, los hilos comparten otros recursos del proceso al que pertenecen, como la sección de código, datos en memoria, archivos abiertos y dispositivos de entrada/salida. Esta compartición de recursos es una característica fundamental que distingue a los hilos de los procesos, facilitando la comunicación y la colaboración entre ellos, pero también introduce la necesidad de mecanismos de sincronización para evitar conflictos. Se describe la gestión de memoria compartida en Linux utilizando las llamadas al sistema shmget
, shmat
, shmdt
y shmctl
.
3. Programación con pthreads
Se describe la programación con pthreads (POSIX threads), el estándar para la creación y gestión de hilos en sistemas operativos basados en Unix. Se define pthread_t
como el tipo de dato utilizado para representar un hilo y se explica la función pthread_create(&tid, &attr, start_fn, args)
para crear un nuevo hilo. Los parámetros incluyen tid
(el identificador del hilo), attr
(atributos del hilo, generalmente NULL), start_fn
(la función que el hilo ejecutará al iniciarse), y args
(argumentos para la función start_fn
). La función start_fn
debe ser un puntero a void. Para esperar a que un hilo termine su ejecución, se utiliza la función pthread_join
, que recibe el TID del hilo y un puntero a void donde se almacenará el valor de retorno de la función start_fn
(opcional). Aunque los hilos comparten la memoria del proceso, la posibilidad de reservar áreas de memoria específicas para cada hilo se menciona como una característica adicional que provee mayor control y previene posibles problemas de concurrencia. El uso adecuado de estas funciones es esencial para la programación eficiente y robusta con hilos en entornos Unix.
II.Planificación de Procesos y Algoritmos
Se discuten diferentes algoritmos de planificación como SJF (Shortest Job First) y FCFS (First-Come, First-Served). SJF, un planificador con prioridades, prioriza los procesos con menor tiempo de ejecución restante, aunque puede provocar inanición (starvation). FCFS, por su parte, puede generar ineficiencias si un proceso largo bloquea otros. Se describen los objetivos de la planificación: maximizar el rendimiento (throughput) y liberar rápidamente los recursos. Se distinguen entre planificadores cooperativos (non-preemptive) y planificadores con desalojo (preemptive), importantes en escenarios de concurrencia y contención de recursos.
1. Algoritmos de Planificación SJF y FCFS
La sección introduce dos algoritmos de planificación de procesos: SJF (Shortest Job First) y FCFS (First-Come, First-Served). SJF es un ejemplo de planificador con prioridades, donde la prioridad de un proceso se determina por su tiempo de ejecución restante. Si bien SJF puede optimizar el tiempo de espera promedio, es susceptible a la inanición (starvation), un problema donde un proceso de baja prioridad nunca recibe tiempo de CPU. Para mitigar esto, se sugiere reducir la prioridad de los procesos a medida que avanzan en su ejecución, aunque esta solución no es perfecta, ya que la llegada constante de procesos con alta prioridad puede relegar a procesos de baja prioridad indefinidamente. Por otro lado, FCFS, aunque simple, puede resultar ineficiente si un proceso de larga duración, sin necesidad de E/S, bloquea a procesos que sí necesitan E/S. La elección del algoritmo de planificación implica un compromiso entre la simplicidad y la optimización del rendimiento global del sistema, teniendo en cuenta factores como el tiempo de espera medio, la utilización de la CPU y la eficiencia en la gestión de recursos. La comprensión de las ventajas y desventajas de cada enfoque es fundamental para la selección del algoritmo más adecuado para un sistema operativo.
2. Objetivos de la Planificación y Tipos de Planificadores
Se definen los objetivos principales de un buen algoritmo de planificación: maximizar el rendimiento (throughput), entendido como la cantidad de procesos completados por unidad de tiempo, y la liberación rápida de recursos, priorizando la finalización de procesos que mantienen reservados una mayor cantidad de recursos del sistema. Estos objetivos ayudan a garantizar que el sistema operativo funcione de manera eficiente y responda adecuadamente a las necesidades de los usuarios. Además, se diferencia entre dos tipos de planificadores: los cooperativos (non-preemptive), donde un proceso se ejecuta hasta que termina o realiza una solicitud de E/S, y los planificadores con desalojo (preemptive), que pueden interrumpir la ejecución de un proceso para dar paso a otro, algo que resulta esencial para la gestión eficiente de procesos en entornos concurrentes, donde múltiples procesos compiten por los recursos del sistema. Un planificador preemptive ofrece mayor control y flexibilidad al sistema operativo para manejar la ejecución de procesos, aunque su implementación es más compleja.
3. Concurrencia y Contención
La sección enfatiza que la necesidad de un planificador preemptive, con la capacidad de desalojar procesos, surge en escenarios con concurrencia (múltiples procesos ejecutándose simultáneamente, no necesariamente en paralelo) y contención (varios procesos que compiten por el mismo recurso). La gestión de estos escenarios es fundamental para evitar problemas como la inanición y garantizar la correcta ejecución de cada proceso. Un planificador adecuado debe balancear la necesidad de atender a todos los procesos sin causar inanición con la eficiencia en el uso de los recursos de sistema. La concurrencia y contención son problemas inherentes a los sistemas multitarea y requieren un manejo preciso para mantener la estabilidad y el rendimiento del sistema, destacando la importancia de un diseño cuidadoso de los algoritmos de planificación y la gestión adecuada de recursos.
III.Sincronización y Exclusión Mutua
La sincronización es clave para evitar problemas en entornos concurrentes. Se define la sección crítica, un bloque de código que no puede ejecutarse simultáneamente por varios procesos para evitar corrupción de datos. Se explican mecanismos para garantizar la exclusión mutua, incluyendo el busy waiting (una mala práctica), y se introduce el concepto de semáforos, incluyendo los semáforos binarios o mutex, como solución para el problema de la sección crítica, evitando el busy waiting mediante listas de espera. Se mencionan problemas de sincronización comunes como el rendezvous y el uso de semáforos para la gestión de recursos compartidos, también se describe el uso de monitores y read-write locks como alternativas para la sincronización.
1. Sección Crítica y Exclusión Mutua
La sección introduce el concepto de sección crítica, un bloque de código dentro de un proceso que accede a recursos compartidos (memoria, archivos). La ejecución simultánea de secciones críticas por diferentes procesos puede llevar a la corrupción de datos. Por lo tanto, es crucial implementar la exclusión mutua, asegurando que solo un proceso a la vez pueda acceder a la sección crítica. Se mencionan brevemente técnicas como la solución de Peterson y el uso de locks con TestAndSet, que utilizan un bucle while
(busy waiting) para esperar el acceso a la sección crítica. Sin embargo, se advierte que el busy waiting es una mala práctica, ya que consume tiempo de CPU innecesariamente. Se plantea que es mejor usar mecanismos que liberen la CPU mientras se espera el acceso, aunque se debe tener cuidado con el tiempo de espera para evitar ineficiencias. El concepto de exclusión mutua es fundamental para la programación concurrente, y la elección de la técnica adecuada impacta directamente en el rendimiento y la estabilidad del sistema.
2. Semáforos como Mecanismo de Sincronización
Se presentan los semáforos como una solución eficiente para la sincronización de procesos y la gestión de la exclusión mutua. Se describen dos tipos: semáforos generales (con valores no negativos) y semáforos binarios o mutex (con valores 0 y 1). Los mutex son especialmente útiles para resolver el problema de la sección crítica, ya que permiten que solo un proceso acceda a un recurso compartido a la vez. Un proceso 'toma' el mutex al realizar una operación wait
(dejándolo en 0) y lo 'libera' con una operación signal
(dejándolo en 1). La inicialización del mutex en 1 asegura la exclusión mutua. Para evitar el busy waiting, los semáforos incluyen listas de espera de procesos. Cuando un proceso debe esperar (wait), se bloquea y se añade a esta lista, liberando la CPU. Cuando otro proceso realiza un signal
, el primer proceso de la lista se desbloquea y se programa para su ejecución. Esta implementación eficiente de semáforos es crucial para la gestión de recursos compartidos en sistemas concurrentes, mejorando la capacidad de respuesta y la eficiencia del sistema.
3. Aplicaciones y Problemas con Semáforos
Se mencionan ejemplos de problemas de sincronización que se pueden resolver con semáforos: el rendezvous (dos procesos deben sincronizar la ejecución de instrucciones), barreras reutilizables (los procesos se sincronizan repetidamente en bucles), y el problema productor-consumidor (un proceso produce datos y otro los consume de un buffer compartido). Se destaca que las colas de espera para semáforos no son necesariamente FIFO, pudiendo implementarse como colas de prioridades, pero una mala gestión puede provocar inanición. El concepto de turnstile se presenta como un semáforo que se utiliza para permitir el paso de un solo proceso a la vez. La correcta utilización de semáforos requiere cuidado para evitar problemas como la inanición o deadlocks, debido a la complejidad en la gestión de recursos y la interacción entre los procesos. Se introducen brevemente los monitores como una alternativa a los semáforos, ofreciendo una forma más estructurada para la sincronización.
4. Monitores y Read Write Locks
Se introduce la alternativa de los monitores, estructuras de datos que encapsulan variables y métodos, incluyendo variables de condición con operaciones atómicas signal
y wait
. A diferencia de los semáforos, las variables de condición en monitores no almacenan valores y solo despiertan a un proceso bloqueado en wait
si hay un signal
posterior. Si no hay procesos bloqueados, el signal
se ignora. Por último se menciona el problema de sincronización de lectura-escritura, donde múltiples procesos pueden leer una variable simultáneamente pero solo uno puede escribir a la vez. Se propone el uso de Read-Write Locks como una solución para este caso específico. La introducción de los monitores y los Read-Write Locks como alternativas a los semáforos amplía el espectro de herramientas disponibles para la gestión de la sincronización y la exclusión mutua en la programación concurrente.
IV.Gestión de Memoria
La gestión de memoria es crucial para la ejecución eficiente de los procesos. La MMU (Memory Management Unit) traduce direcciones lógicas (virtuales) a direcciones físicas. El swapping permite mover procesos entre memoria y disco para gestionar la memoria limitada. Se abordan técnicas de asignación dinámica de memoria, incluyendo el uso de bitmaps y listas enlazadas, y los problemas de fragmentación interna y fragmentación externa. La paginación divide la memoria en páginas, mejorando la gestión de memoria y permitiendo el uso de memoria virtual. Se introduce el TLB (Translation Lookaside Buffer) para acelerar la traducción de direcciones. También se describe la segmentación y la técnica de Copy-on-Write utilizada en la creación de procesos.
1. MMU y Traducción de Direcciones
La gestión de memoria se basa en la MMU (Memory Management Unit), que traduce las direcciones lógicas o virtuales utilizadas por los procesos a direcciones físicas en la memoria principal. Este proceso de traducción es fundamental para permitir que múltiples procesos se ejecuten simultáneamente sin conflictos, ya que cada proceso opera en su propio espacio de direcciones virtuales. La MMU asigna una porción de la memoria física a cada proceso, aislando sus datos y código del resto. Si bien este mecanismo permite la ejecución concurrente eficiente de múltiples procesos, el cambio de contexto implica un costo en tiempo de procesador, ya que se requiere guardar y cargar la información del estado del proceso en su PCB (Process Control Block). Esta gestión eficiente de la memoria virtual es un factor crítico en el rendimiento general del sistema operativo.
2. Swapping y Asignación Dinámica de Memoria
Cuando la memoria RAM disponible es insuficiente para todos los procesos en ejecución, se utiliza la técnica de swapping, que consiste en mover partes de la memoria de los procesos al disco. Esto permite cargar otros procesos en memoria, aunque es más lento que acceder directamente a la memoria RAM, debido a la velocidad de acceso al disco. La asignación dinámica de memoria se complica debido al swapping y a la liberación de bloques de memoria, lo que genera fragmentación. Se presentan dos técnicas comunes para gestionar los bloques libres y ocupados: bitmaps (con un bit por unidad de memoria) y listas enlazadas (que contienen información sobre el tamaño y ubicación de cada bloque). Los bitmaps son fáciles de consultar pero pueden ocupar un espacio significativo de memoria, mientras que las listas enlazadas requieren más procesamiento pero son más flexibles. La optimización de estas técnicas es esencial para maximizar el uso de la memoria disponible y minimizar el tiempo de acceso.
3. Paginación y Memoria Virtual
La paginación divide la memoria en páginas de tamaño fijo. Las páginas no residentes en memoria se almacenan en disco. Si un proceso accede a una página que no está en memoria (page fault), el sistema operativo la carga desde el disco. La MMU utiliza una tabla de páginas para rastrear la ubicación de cada página, incluyendo un bit que indica si la página está en memoria y el índice del frame donde se encuentra. También se almacenan bits para indicar si la página ha sido modificada, información útil para determinar si debe escribirse en disco al ser desalojada. La paginación permite la implementación de memoria virtual, donde la cantidad de memoria disponible para los procesos puede ser mayor que la memoria física instalada. Sin embargo, la gestión de la tabla de páginas puede ser costosa, especialmente en sistemas con gran cantidad de memoria y procesos. Para mejorar el rendimiento de la traducción de direcciones, se usa el TLB (Translation Lookaside Buffer), una caché de las páginas más frecuentemente usadas.
4. Fragmentación y Técnicas Avanzadas
Se describen dos tipos de fragmentación de memoria: externa (bloques libres no contiguos) e interna (espacio desperdiciado dentro de un bloque asignado). La fragmentación es un problema común en la gestión de memoria dinámica, impactando en el rendimiento del sistema. Para solucionar la complejidad de las tablas de páginas, se propone un diseño de dos niveles: un directorio de tablas de páginas y tablas de páginas individuales. Se menciona que el acceso a la memoria a través de paginación puede ser lento debido a los múltiples accesos a memoria (dos o tres con tablas de dos niveles), lo que se resuelve con el TLB (Translation Lookaside Buffer). Se describe el algoritmo Not Recently Used (NRU) para la gestión de páginas en memoria, que se basa en los bits de referencia (R) y modificación (M) para clasificar las páginas. Finalmente, se describe la técnica Copy-on-Write para la creación de procesos, que permite que el proceso hijo comparta la memoria del padre hasta que se modifica.
5. Segmentación y Combinación con Paginación
El documento menciona brevemente la segmentación, una técnica de gestión de memoria que divide la memoria en segmentos de tamaño variable, normalmente relacionados con las partes lógicas de un programa (código, datos, etc.). La segmentación, al igual que la paginación, sufre de fragmentación y swapping, por lo que se suele combinar con la paginación para aprovechar las ventajas de ambas técnicas. Intel, en sus procesadores Pentium, implementa segmentación con GDT (Global Descriptor Table) y LDT (Local Descriptor Table). Los registros CS (code segment) y DS (data segment) actúan como selectores de segmento, apuntando a entradas en estas tablas. Una vez localizado el segmento, se calcula un offset para acceder a la memoria. Se utiliza la combinación de paginación y segmentación para optimizar la gestión de la memoria, minimizando los problemas de fragmentación y la necesidad de realizar swapping, aunque presenta mayor complejidad en la administración.
V.Sistemas de Archivos
El documento describe la implementación de sistemas de archivos, incluyendo métodos de almacenamiento como el almacenamiento continuo y el almacenamiento con listas enlazadas. Se explica la estructura de directorios en sistemas tipo Unix, con el uso de i-nodos y la posible utilización de tablas hash para mejorar la eficiencia. Se mencionan técnicas como el journaling para mejorar la fiabilidad y la recuperación ante fallos.
1. Métodos de Almacenamiento de Archivos
La sección aborda diferentes maneras de almacenar archivos en un sistema de archivos. Se describe el almacenamiento continuo, donde los archivos ocupan bloques contiguos en el disco. Este método ofrece alta performance, ya que solo requiere buscar el bloque inicial para acceder a todo el archivo. Su simplicidad y eficiencia lo hacen adecuado para medios de almacenamiento de solo lectura, como los CD-ROMs. Como alternativa, se presenta el almacenamiento con listas enlazadas, donde cada bloque contiene un puntero al siguiente bloque del archivo. Si bien es más flexible que el almacenamiento continuo, buscar un bloque específico requiere recorrer la lista desde el inicio, lo que reduce la eficiencia de acceso aleatorio. La elección entre estas estrategias depende de las necesidades del sistema, considerando el balance entre la eficiencia de acceso, la flexibilidad y la complejidad de la implementación. Un sistema de archivos eficiente requiere una cuidadosa consideración de estos aspectos para lograr un buen rendimiento.
2. Implementación de Directorios en Unix
Se describe la implementación de la estructura de directorios en sistemas Unix, utilizando un árbol de directorios con un i-nodo especial que apunta al directorio raíz. Cada directorio contiene un bloque con una lista de pares (nombre de archivo, i-nodo), donde el i-nodo es un puntero a la información del archivo en el disco. Para directorios con muchos archivos, se puede utilizar una tabla hash para acelerar la búsqueda del i-nodo a partir del nombre del archivo, mejorando la eficiencia de acceso a los archivos. La estructura de i-nodos en Unix se detalla, mostrando las primeras doce entradas que apuntan directamente a bloques de datos del archivo, mientras que la entrada 13 apunta a un bloque que contiene más punteros a bloques, permitiendo archivos de mayor tamaño. El diseño busca optimizar el acceso a los datos, pero la gestión de los inodos y de la tabla de hash es un factor clave para el rendimiento y la eficiencia del sistema de archivos.
3. Caching y Journaling en Sistemas de Archivos
Para mejorar el rendimiento, se puede utilizar una caché (copia en memoria de bloques de disco), similar a la paginación en la gestión de memoria. Sin embargo, se plantea el problema de la pérdida de datos en caso de fallo de energía antes de que los cambios en la caché se guarden en el disco. Como solución, se propone el journaling, que mantiene un registro (log o journal) de los cambios en un buffer circular en disco, permitiendo escrituras más rápidas y secuenciales. Estos cambios se aplican al disco periódicamente o cuando el buffer está lleno. El journaling mejora la fiabilidad del sistema, ya que permite la recuperación de datos en caso de fallo inesperado, garantizando la consistencia de los datos aún en presencia de interrupciones. La implementación de estas estrategias busca lograr un balance entre rendimiento y fiabilidad en un sistema de archivos robusto.
VI.Gestión de Entrada Salida E S y RAID
La gestión de E/S requiere drivers específicos para la comunicación con los dispositivos. Se mencionan diferentes métodos para manejar las interrupciones de los dispositivos. Se describe el sistema de archivos virtuales (VFS). La gestión eficiente del disco es crucial, especialmente con dispositivos de bloques, y se introduce RAID (Redundant Array of Inexpensive Disks) como una técnica para mejorar la fiabilidad y el rendimiento del almacenamiento, incluyendo RAID 3, 4, 5 y 6, destacando las ventajas y desventajas de cada una. También se aborda el concepto de spooling para gestionar la impresión.
1. Drivers y Comunicación con Dispositivos
La gestión de Entrada/Salida (E/S) requiere drivers, módulos de software específicos que permiten la comunicación entre la CPU y los dispositivos de E/S. Se mencionan diferentes formas en que los drivers pueden comunicarse con los dispositivos para indicar la finalización de una operación (por ejemplo, un clic del ratón, la finalización de una escritura en disco o la impresión de un documento). La interacción entre los drivers y el sistema operativo es crucial para la gestión eficiente de las operaciones de E/S, asegurando una respuesta adecuada del sistema a las solicitudes de los diferentes periféricos. Se introduce el Virtual File System (VFS) como una capa que abstrae el manejo de archivos, permitiendo al sistema operativo gestionar tanto archivos locales como remotos (a través de NFS, por ejemplo), sin que las aplicaciones deban preocuparse por la implementación específica de cada tipo de sistema de archivos.
2. Gestión de Discos y Rendimiento de E S
Se destaca la importancia de la gestión adecuada del disco para obtener un buen rendimiento de E/S. El movimiento de la cabeza de lectura/escritura del disco consume tiempo, por lo que es crucial optimizar el orden de las solicitudes de acceso al disco para minimizar el tiempo de búsqueda. La llegada constante de peticiones de acceso al disco exige una estrategia que minimice el tiempo de acceso y evite la inanición. Los dispositivos de bloque, que transmiten información en bloques y permiten acceso aleatorio, suelen usar un buffer (cache) para mejorar el rendimiento. La eficiencia en la gestión de los accesos al disco es fundamental para el buen funcionamiento del sistema, evitando demoras en las operaciones de lectura y escritura. Una gestión eficiente del disco se traduce en un sistema operativo más rápido y receptivo.
3. RAID Redundancia y Rendimiento de Almacenamiento
Para mejorar la fiabilidad del sistema de almacenamiento, se introduce RAID (Redundant Array of Inexpensive Disks). RAID permite la copia de información en múltiples discos para evitar la pérdida total de datos si un disco falla. Si bien permite lecturas simultáneas, las escrituras simultáneas son costosas y requieren mayor espacio de almacenamiento. Se mencionan varios niveles de RAID (sin detallar su funcionamiento interno), que ofrecen diferentes balances entre redundancia, rendimiento y coste. La decisión de implementar RAID requiere considerar cuidadosamente el nivel de redundancia necesario, el coste del almacenamiento y las necesidades de rendimiento del sistema. El RAID, en combinación con backups, reduce la probabilidad de pérdida de datos significativa.
4. Gestión del Disco y Spooling
Se describe la gestión de discos, incluyendo la detección y corrección de errores mediante códigos de verificación en cada sector del disco. Estos códigos permiten identificar sectores dañados durante la lectura. Se menciona que el RAID no protege contra la eliminación accidental de archivos, por lo que se recomienda combinarlo con backups para una mayor seguridad de los datos. Por último, se introduce el concepto de spooling, una técnica utilizada para gestionar la impresión a través de una cola. Los trabajos de impresión se colocan en una cola y un proceso los procesa secuencialmente, evitando que los procesos de impresión se bloqueen entre sí y permitiendo a los usuarios cancelar trabajos. El spooling abstrae la complejidad del acceso a dispositivos de impresión, permitiendo a los usuarios enviar trabajos de impresión sin esperar a que los anteriores finalicen.
VII.Seguridad
Finalmente, se introduce brevemente la seguridad en sistemas operativos, mencionando la criptografía y los métodos de control de acceso, incluyendo DAC (Discretionary Access Control) y MAC (Mandatory Access Control), y el uso de Listas de Control de Acceso (ACLs).
1. Criptografía y Protección de Contraseñas
La sección introduce brevemente la criptografía como el área de estudio que permite cifrar información para asegurar la confidencialidad de los mensajes. Se mencionan ejemplos como las funciones hash unidireccionales y el método RSA. La criptografía juega un papel crucial en la seguridad de los sistemas operativos, especialmente en la protección de contraseñas utilizadas para la autenticación de usuarios. El uso de funciones hash permite almacenar representaciones seguras de las contraseñas sin revelar su valor original, mejorando la seguridad del sistema ante posibles ataques. La aplicación de métodos criptográficos robustos es esencial para proteger la información sensible almacenada y transmitida por el sistema operativo.
2. Control de Acceso DAC y MAC
Se describe el control de acceso en sistemas operativos como una matriz de control de accesos que define los permisos de los sujetos (usuarios) sobre los objetos (archivos, recursos). Se presentan dos esquemas principales: DAC (Discretionary Access Control) y MAC (Mandatory Access Control). En DAC, el dueño de un objeto define explícitamente los permisos de acceso para otros usuarios. Este esquema, utilizado en sistemas como Windows y Linux, se implementa con Listas de Control de Acceso (ACLs) que almacenan los permisos para cada usuario y objeto. El texto no detalla las diferencias entre DAC y MAC, pero establece que la manera en la que se asignan los permisos define dos esquemas de control de acceso diferentes, cruciales para mantener la seguridad y la integridad del sistema, regulando el acceso a los recursos del sistema y limitando la exposición a posibles amenazas.