[go: up one dir, main page]

0% encontró este documento útil (0 votos)
11 vistas22 páginas

Sistemas Operativos 2

El documento aborda la gestión de memoria en sistemas operativos, explicando conceptos como la abstracción de memoria, particionamiento fijo y dinámico, y la paginación y segmentación para optimizar el uso de la memoria. Se discuten técnicas para evitar la fragmentación y mejorar la eficiencia, así como la implementación de memoria virtual para manejar procesos que requieren más memoria de la disponible. Además, se presentan algoritmos para la ubicación de procesos en memoria y la utilización de tablas de páginas para la traducción de direcciones.

Cargado por

Martin Roca
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
11 vistas22 páginas

Sistemas Operativos 2

El documento aborda la gestión de memoria en sistemas operativos, explicando conceptos como la abstracción de memoria, particionamiento fijo y dinámico, y la paginación y segmentación para optimizar el uso de la memoria. Se discuten técnicas para evitar la fragmentación y mejorar la eficiencia, así como la implementación de memoria virtual para manejar procesos que requieren más memoria de la disponible. Además, se presentan algoritmos para la ubicación de procesos en memoria y la utilización de tablas de páginas para la traducción de direcciones.

Cargado por

Martin Roca
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 22

SISTEMAS OPERATIVOS 2

M3.
Espacio de direcciones
Cuando un programa accede directamente a la memoria física, se dice que no hay ninguna abstracción de memoria. Los
programas se escriben referenciando directamente a direcciones físicas de memoria, que serían las celdas de la memoria.
Algunas opciones para organizar la memoria cuando solo la física está disponible (no hay memoria virtual). Si el SO está en
la RAM es posible borrarlo, no así cuando se encuentra en la ROM.

Bajo el esquema sin abstracción de memoria, normalmente un sistema solo puede ejecutar un proceso, aunque no es imposible
ejecutar varios. Lo que se debe hacer es guardar toda la información que un determinado proceso está utilizando en algún
archivo en disco, para liberar la memora y poder cargar un segundo proceso.
Otra solución que evita el intercambio, es implementar, un sistema de llaves que consiste en dividir la memoria en bloques y
asignarle, a cada bloque, una llave. Todas las llaves se almacenan en registros que permiten controlar que un proceso esté
usando determinado bloque de memoria, lo que evita que otros sobrescriban. La desventaja, es que, si se cargan varios procesos,
aunque no haya sobrescritura, puede haber referencias a datos equivocados.
Inconvenientes debido a referencias absolutas:
Se cargan los programas de a y b en la memoria. En c, se observan ambos
programas cargados, y el inconveniente se produce cuando se ejecuta JMP28.
Como este hace referencia al número 18, se ejecuta la instrucción ADD en
lugar de CMP.

Abstracción de memoria.
Para evitar inconvenientes debidos a las referencias directas a la memoria física, se utiliza una abstracción de memoria
denominada espacio de direcciones, el cual es asignado a cada programa y no hace referencia directa a la memoria física.
La forma más simple es utilizar dos registros: el base y el límite. El funcionamiento es similar al de la parte (c) de la Figura
anterior. El registro base del Programa 1 sería 0, y el límite, 16384. El registro base del Programa 2 sería 16384, y el límite
tendría también el valor 16384.
Lo que el CPU hace cuando debe realizar alguna operación con la memoria es sumar la dirección base. En el caso del ejemplo,
cuando se lee JMP 28 en la dirección 16384, en lugar de saltar a la ubicación 28, se debe sumar el registro base 16384. El
resultado es 16412, precisamente la ubicación de CMP.
Particionamiento fijo.
La memoria se divide en tamaños fijos (pueden ser todos iguales, o no), que pueden ser asignados a diferentes procesos. Un
proceso, entonces, requiere una región cuyo tamaño sea, como mínimo, el que requiere. Si un proceso ocupa más tamaño que
la partición más grande, se deberá corregir mediante el uso de overlays en la etapa de programación.
La desventaja es el desperdicio de espacio. Si un proceso requiere menos tamaño del que ofrece una partición, el resto quedara
inusable, lo cual se denomina fragmentación interna. Es sencillo, sin embargo, implementar esta para el sistema operativo.
Particionamiento dinámico.
El espacio asignado a cada proceso es el que el proceso requiere de forma dinámica, es decir que no existen particiones previas
que ofrecer. El uso es más eficiente y, además, no existen las fragmentaciones internas que se producen en el método anterior.
Tiene como desventaja la fragmentación externa, que implica que existen muchos huecos en la memoria.
La memoria como recurso escaso
Los programas demandan cada vez más memoria, y los usuarios demandan cada vez más programas que funcionen en
simultáneo. Si bien las memorias crecen en tamaño y disminuyen sus costos, nunca es suficiente. Para lidiar con el problema
del agotamiento de la memoria RAM, existen dos opciones: el intercambio y la memoria virtual.
Intercambio.
En el momento (a), solo el proceso A está cargado en memoria
RAM. En los momentos (b) y (c), los procesos B y C se cargan
también a la memoria RAM, la cual todavía no está llena. Sin
embargo, por decisión del sistema operativo, en el momento (d)
el proceso A es intercambiado al disco y libera el espacio que
consumía de la memoria RAM. En el momento (e), el proceso
D ingresa a RAM y consume parte del espacio que dejó A. En
el momento (f), el proceso B abandona la memoria y libera
espacio. Y, finalmente, en el momento (g), el proceso A regresa
a la RAM y ocupa el espacio que liberó B, más parte del espacio
que liberó él mismo anteriormente.

En general, los procesos entran y salen, y generan pequeños huecos (fragmentación externa) que luego no les sirven a otros
procesos que requieren mayor espacio. También puede darse el caso de que un determinado proceso necesite crecer y consumir
más espacio de direcciones. En este caso, dicho proceso utilizará el espacio contiguo, si es que lo hay. Pero si no lo hay, se
debe intercambiar otros procesos hasta generar un hueco suficiente para el nuevo tamaño deseado. Pensar en el futuro
crecimiento de los procesos, y asignarles a estos espacios de más, es una solución a este desafío.
Ubicar procesos en memoria
Si se utilizó una partición de memoria con tamaños iguales, la ubicación es sencilla. Se debe seleccionar cualquier sector libre
para ubicar un determinado proceso.
Si la memoria está llena y se debe realizar un intercambio, el planificador deberá seleccionar algún sector cuyo proceso no se
encuentre listo.
Si la memoria se parte en sectores de diferente tamaño, la primera opción consiste en ubicar un determinado proceso en el
sector más pequeño posible, para evitar desperdiciar recursos. La desventaja es que pueden quedar sectores grandes sin usar,
debido a que el tamaño requerido por algún proceso es menor al tamaño de otros sectores. Esto se soluciona con una única cola
de procesos, que selecciona el sector más pequeño posible o recurre a un intercambio a disco para hacer lugar.
Cuando se utiliza el particionamiento dinámico, se requiere ubicar procesos de forma eficiente. Para lograr esta tarea, existen
tres algoritmos.
 Mejor ajuste (best-fit): busca al bloque de memoria que más se aproxime al tamaño requerido por el proceso.
 Primer ajuste (first-fit): comienza su búsqueda en el inicio de la memoria y se detiene apenas consigue un bloque
suficientemente grande como para cumplir con la solicitud del proceso.
 Siguiente ajuste (next-fit): al igual que el algoritmo anterior, este se detiene cuando consigue un bloque lo suficientemente
grande para la solicitud del proceso, pero en lugar de comenzar al inicio de la memoria, comienza su búsqueda desde la última
colocación.

Se observa dónde se ubicaría un proceso de 16MB en la


memoria, según que algoritmo se utilice. El algoritmo mejor
ajustado usa un bloque de 18MB, y 2MB quedan fragmentados.
Primer ajuste y siguiente ajuste crean fragmentos de 6MB y
20MB.

Lec. 2
Paginación y segmentación
Cuando se divide la memoria principal en regiones, ya sean fijas o variables, surge el problema de la fragmentación, lo cual
hace que la utilización de la memoria no sea la óptima. Pero, en realidad, el problema surge porque los tamaños de las regiones
y de las solicitudes que hacen los procesos no son lo suficientemente pequeñas como para evitar dicha fragmentación.
Paginación, consiste en dividir los procesos en pequeñas partes, denominadas páginas. Cada una tendrá asignada una porción
de igual tamaño en la memoria principal, la cual se denomina marco de página. Como ambos tamaños son iguales, ya que las
particiones son de tamaño fijo, se elimina la fragmentación externa.
Cuando se utiliza la segmentación, los programas se dividen en segmentos, que, a diferencia de las paginas, son variables,
algo que asemeja esta técnica con el particionamiento dinámico.
Paginación.
La memoria principal consta de 15 marcos disponibles, los
cuales se encuentran desocupados en el momento a. el
proceso A ingresa en memoria principal en el momento b y
consume cuatro marcos.
En los momentos c y d, los procesos B y C ingresan a
memoria y consumen tres y cuatro páginas.
En el momento f, el proceso D ingresa a la memoria
principal.
Como este proceso ocupa cinco páginas, puede utilizar los
tres espacios que libero el proceso B, más otros dos. No es
necesario que estos espacios estén todos juntos.

El tamaño de página es siempre potencia de 2, y puede ir desde


los 512 bytes hasta los 16 MB, según la arquitectura de la
computadora. Al ser potencia de 2, se simplifica la traducción
de una dirección lógica en un número de página y
desplazamiento. Si el tamaño de una dirección lógica es 2
elevado a la “n” y el tamaño de página es de 2 elevado a la
“m” unidades de direccionamiento, entonces el bit de orden
superior de “m-n” indica el número de página, mientras que
el bit menos significativo de “n” indica el offset.
La dirección lógica es:

p es el índice dentro de la tabla de páginas y del desplazamiento dentro de la página.


Tabla de páginas. Para poder ubicar las paginas dentro de la memoria principal. Por cada página se ubica el marco
correspondiente, ya que la relación es 1 a 1. Para traducir una dirección de memoria física (es la que realmente necesita el
procesador para leer o escribir datos), el procesador utiliza la tabla de páginas.
Contiene las tablas de páginas de los procesos A, B, C
y D del ejemplo de las figuras anteriores y, además,
una tabla con marcos libres. El proceso A, por ejemplo,
utiliza cuatro páginas. En la memoria principal, los
marcos utilizados son 0, 1, 2 y 3.

Protección de memoria.
Para evitar que un proceso sobrescriba a otro en una implementación con paginación, se utiliza un bit de protección asociado a
cada marco, los cuales normalmente se almacenan en la tabla de páginas. Este bit indica si es posible leer y escribir, o solo
leer.
Los marcos 0, 1, 2, 3, 4 y 5 tienen el bit V (valido), es decir que es posible
leer y escribir. En cambio, los marcos 6 y 7 son inválidos, por lo que, si se
intentara escribir allí, se generaría un trap o una violación a la protección de
memoria.
En este ejemplo, el proceso utiliza de 0 a 10 468. Al no utilizar entre 10 468
y 12 287, se genera fragmentación, ya que este espacio no puede ser
utilizado por otro proceso.

Paginas compartidas.
En determinadas situaciones como, por ejemplo, cuando múltiples usuarios utilizan la misma aplicación, es posible, si el
código del programa lo permite, que estos compartan información en memoria. Esta información es el código de ejecución
del programa, que no cambia.
Todas las tablas de páginas de los diferentes procesos que usen la aplicación compartida harán referencia a los mismos marcos
de memoria para el código, mientras que utilizarán marcos distintos para la información propia. Con este esquema, el ahorro
de memoria principal es significativo.
Segmentación.
Los segmentos de un programa no requieren espacios contiguos de memoria principal. Es una gran ventaja, ya que permiten un
uso más eficiente de la memoria. Además, como es posible dividir los programas en fragmentos más pequeños que las secciones
de un particionamiento dinámico, la fragmentación externa es, menor.
A diferencia de la paginación, la segmentación se basa en la forma en que un programador ve la memoria: un conjunto de
segmentos de tamaño variable, que no están necesariamente en orden. Entonces, en este tipo de gestión de memoria, las
direcciones especifican tanto el nombre de un segmento como su longitud. Este nombre, por razones de simplicidad, es tratado
como un número.
Se requiere, además, un mecanismo que mapee estas direcciones con dos
variables en direcciones de una sola dimensión, que es como se identifica
a las direcciones físicas de la memoria principal.
Esto se logra mediante una tabla de segmentos:
Cada segmento se identifica en la tabla con un número (de 0 a 4) y con
sus dos dimensiones (base y limite). Por ej., el segmento 0 tiene su base
de la memoria principal en 1000, y su límite es 1400, por lo que puede
consumir hasta 1400. Cualquier referencia a una dirección de memoria
que se encuentre fuera de este límite generara un trap.
En el ejemplo, se generaría un trap si hubiera una referencia al byte 1300
del segmento 0. Si sumamos 1300 más 1400, obtenemos por resultado
2700, que está fuera del rango que ocupa el segmento.
Lec.3
Memoria virtual
Para que un proceso pueda ejecutarse, debe estar en la memoria principal.
Puede suceder, debido a la voracidad de las aplicaciones, que un proceso necesite más memoria que la que existe físicamente
en una computadora. El programador de dicha aplicación puede usar el concepto de overlays para dividir este tamaño en otros
más pequeños, pero, para evitar que el programador sea el encargado de dicha tarea, se emplea el concepto de memoria virtual.
Esta memoria toma su nombre del hecho de que un programador ve una memoria superior a la memoria física real. Esto es
posible porque utiliza espacio en el disco o en la memoria secundaria.
Resulta más eficiente dejar datos o instrucciones no necesarios en la memoria secundaria y solicitarlos cuando el procesador
los requiere, que tener todo en la memoria principal, y desperdiciar espacio que podría ser usado por un proceso que realmente
debe ser procesado.
Lo que el sistema operativo debe evitar es el efecto denominado thrashing, por el que, debido a la cantidad de intercambios
entre las memorias principal y secundaria, el sistema se pasa más tiempo intercambiando qué procesando. Para evitar este
efecto, se utilizan diversos algoritmos.
Paginación en la memoria virtual
Si bien se mantiene una tabla por proceso, ahora debe indicarse si la página está en la memoria principal o en la secundaria. En
el caso de que esté en la memoria principal, se indicará el marco, al igual que en el caso de la memoria real. También se utiliza
un bit adicional que indica si los datos de la entrada que contiene el bit fueron modificados cuando estuvieron en la memoria
principal.
Bit P para indicar si la página está o no en la memoria principal, el bit M para
indicar si fue modificada.

Como los procesos pueden disponer ahora de mucho espacio virtual, la cantidad de
páginas en una tabla puede ser muy grande. Sería un gran problema que las tablas de página completas se almacenaran en la
memoria principal, porque gran parte de esa memoria estaría destinada a almacenar información de las tablas, y no al
almacenamiento de instrucciones y de los datos. Para evitar esto, una parte de las tablas de páginas también se almacena en la
memoria virtual.
Tabla de páginas con jerarquía.
El procesador utiliza un esquema de dos niveles. Cada entrada
de un directorio general apunta a una tabla de páginas. Si la
extensión del directorio es X, y la longitud máxima de la tabla
de páginas es Y, entonces un proceso consistirá en X=Y
páginas.
En la figura se observa el mecanismo utilizado para traducir
una dirección virtual. La página raíz siempre se mantiene en
la memoria principal. Los primeros 10 bits de la dirección
virtual se pueden usar para indexar en la tabla de páginas raíz,
a fin de encontrar la ETP (entrada de tabla de página) para la página en la que está la tabla de páginas de usuario. Si la página
no está en la memoria principal, se produce un fallo de página. Si la página está en la memoria principal, los siguientes 10 bits
de la dirección virtual se usan para indexar la tabla de páginas de usuario, a fin de encontrar la ETP de la página a la cual se
hace referencia desde la dirección virtual original.
Implementación de la traducción de direcciones.

Caché para tabla de páginas.


Utilizar memoria virtual es ventajoso, pero podría introducir demoras si, por ejemplo, se requiere primero buscar tanto la tabla
de páginas en el disco como en la página propiamente dicha. Así como existe una memoria caché entre la memoria principal y
los registros, existe una memoria muy rápida, llamada buffer de traducción anticipada (translation lookaside buffer o TLB),
que se emplea para mantener aquellas tablas de páginas usadas recientemente o con mayor frecuencia.
Así como el procesador intenta, primero, obtener datos de la memoria caché, cuando tiene una dirección virtual, lo
primero que hace es consultar la TLB. Si la búsqueda es exitosa, es decir, si la entrada de página está en TLB, entonces
se traduce en una dirección real. Si no hay acierto, el procesador debe buscar en la tabla de página del proceso. Aquí hay
dos opciones: que la página esté en la memoria principal o que esté en la virtual. En este último caso, el hardware ya no
tiene más que hacer, y es el sistema operativo el que deberá hacerse cargo de la situación y generar una solicitud de I/O
(input/output) para traer la información desde el disco hasta la memoria principal.
Tamaño de página.
Elegir un tamaño de página no es algo trivial. Si el tamaño de cada página es grande, entonces habrá menos fragmentación
interna. Si el tamaño es pequeño, entonces cada proceso necesitará muchas páginas, lo que hará aumentar el tamaño de la tabla
de páginas y la memoria requerida para almacenar dicho proceso. Si la memoria secundaria está compuesta por discos
magnéticos, resultará más conveniente usar tamaños grandes para mejorar el rendimiento de las transferencias.
Tasas de fallo.
El grafico “a” muestra cómo, a medida que el tamaño
de página crece, crece también la probabilidad de fallo
de página, debido al principio de proximidad. Sin
embargo, cuando este tamaño se aproxime al del
proceso, volverá a disminuir, hasta llegar a la situación
en la que no habrá fallo de página, porque el proceso
completo entra en una sola página.
En la parte “b”, se muestra como el número de fallos
disminuye mientras más sean las páginas que se
ubiquen en la memoria principal.
Segmentación en la memoria virtual
Al igual que en la memoria real, en la memoria virtual es posible utilizar la técnica de segmentación. También se utilizan tablas
de segmentos (una por proceso), pero más complejas que las utilizadas para la segmentación de la memoria real, ya que debe
indicarse si el segmento está en la memoria virtual o real.
Lec. 4
Políticas
Para lograr el mejor rendimiento posible, existen diferentes políticas que se encargan de traer páginas de la memoria virtual a
la principal, definir dónde ubicarlas, reemplazarlas, limpiarlas y gestionar conjuntos residentes.
 Políticas de recuperación. Recuperar significa traer una página desde la memoria virtual (secundaria) a la memoria
principal. Existen dos alternativas: traer una página cuando es necesario, ya que ocurrió un fallo de página, o hacerlo
en forma proactiva (prepaging). Cuando la memoria virtual reside en un disco magnético, traer más páginas que las
que ocasionaron el fallo mejora el rendimiento, por el hecho de que un disco magnético introduce grandes demoras
simplemente debido a su mecanismo de funcionamiento, es decir, a la latencia rotacional y al tiempo de búsqueda.
 Políticas de ubicación. Ubicar significa definir donde se deben ubicar las porciones de memoria que utiliza un proceso.
En el caso de que se utilice la estrategia de paginación, o la combinación de paginación y segmentación, no es necesaria
ninguna política de ubicación, porque el mismo hardware se encarga de esto con igual eficiencia.
Las políticas son útiles, entonces, cuando se utiliza solo segmentación, y es posible utilizar políticas de mejor ajuste o
de primer ajuste.
 Políticas de reemplazo. Si se produce un fallo de página, entonces se debe traer esa página desde la memoria virtual
hasta la memoria principal y, para ello, eliminar otra página que actualmente se encuentre en la memoria principal, de
forma tal que se produzca espacio.
Existen diversos algoritmos para lograr esto.
o Algoritmo óptimo (OPT). Se reemplaza la página que se va a
utilizar con menos frecuencia. Es un algoritmo que no se
puede implementar, porque requiere conocer el futuro.
o Algoritmo usado recientemente (LRU). Como su nombre lo
indica, aquella página que no ha sido referenciada por más
tiempo será eliminada de la memoria principal. La
probabilidad de que la página menos usada vuelva justamente
a ser usada es baja, por lo que se acerca al algoritmo OPT. La
gran desventaja es la sobrecarga, ya que se debería mantener
un registro del tiempo en que se hizo referencia a cada página.
o Algoritmo primero en entrar, primero en salir (FIFO).
Funciona como un Round-Robin y es muy sencillo de
implementar, ya que solo hace falta un puntero que recorra
todos los marcos de página y que vaya eliminando páginas en forma circular. El inconveniente con este algoritmo es
que, si un proceso usa durante toda su vida ciertos sectores de datos, el algoritmo de todas formas los eliminará de la
memoria principal y necesitará volverlos a traer, lo cual resulta ser muy ineficiente.
o Algoritmo del reloj. supone una solución de compromiso a los anteriores. Requiere introducir un bit adicional a los
marcos de página, que se coloca en 1 la primera vez que una página es puesta en la memoria. Una especie de buffer
circular que puede estar orientado a un proceso o a toda la memoria principal, en busca de marcos que tengan el bit en
0. El primero de esos marcos en ser encontrado es seleccionado para reemplazo. Si el buffer encuentra marcos con bit
en 1, los pone en 0 y continúa la búsqueda. En el caso de que todos los marcos hayan estado en 1, entonces el puntero
recorrerá todo el buffer cambiándolos por 0 y seleccionará como reemplazable al primero.
La diferencia de este algoritmo con respecto a FIFO es que se discrimina entre marcos que acaban de ser colocados en
la memoria y aquellos que ya llevan cierto tiempo en ella.
Rendimientos comparados. Algoritmo del reloj

Mientras menos marcos se reserven, más notoria es la diferencia a favor del algoritmo OPT, el cual, debemos recordar, no es
posible que sea implementado. Pero, a medida que aumenta la cantidad de marcos reservados, la diferencia no es tan notoria,
aunque se mantiene el orden OPT, LRU, Reloj y FIFO.

Debido a la utilización necesaria del bit que indica si una página fue modificada o no en la memoria, ahora es posible disponer
de cuatro estados para optimizar el funcionamiento del algoritmo del reloj:
00 = No se accedió recientemente, no se modificó
10 = Accedida recientemente, no se modificó
01 = No se accedió recientemente, modificada
11 = Accedida recientemente, modificada.

El algoritmo se modifica y funciona de la siguiente manera:

1. Comenzando por la posición actual del puntero, recorremos el buffer de marcos. Durante el recorrido, no se hace ningún
cambio en el bit de usado. El primer marco que se encuentre con (u = 0; m = 0) se selecciona para reemplazo.
2. Si el paso 1 falla, se recorre el buffer de nuevo, en busca de un marco con (u = 0; m = 1). El primer marco que se
encuentre se seleccionará para reemplazo. Durante el recorrido, se pondrá el bit de usado a 0 en cada uno de los marcos
que se vayan saltando.
3. Si el paso 2 también falla, el puntero debe haber vuelto a la posición original, y todos los marcos del conjunto tendrán
el bit de usado a 0. Se repite el paso 1 y, si resulta necesario, también el paso 2. Esta vez, se encontrará un marco para
reemplazo.
En la primera vuelta del buffer, el algoritmo busca reemplazar la opción 00 (no modificadas, no accedidas recientemente). Al
no tener que escribir en el disco, esto mejora el rendimiento. Si no hay candidatos en su segunda vuelta, buscará la combinación
01 (modificada, no accedida recientemente); se le da más valor al hecho de que la página probablemente no vuelva a ser usada,
que a la demora que implica tener que escribir en el disco.
Buffering. Para aprovechar la simpleza de implementación del algoritmo FIFO, el buffering permite que una página que deba
ser reemplazada vaya a la lista de páginas modificadas o a la lista de no modificadas. La ventaja es que esa página permanece
en la memoria principal.
M4
Sistema de archivos
Los archivos son fundamentales para la mayoría de las aplicaciones, ya que estas obtienen información que requiere ser
procesada desde un archivo o bien, una vez procesada la información, las aplicaciones deben almacenarla en almacenamiento
secundario a fin de no perder datos ante falta de energía. Asimismo, para evitar que cada aplicación deba disponer de un código
para interactuar con los archivos, se crea una abstracción que permite, por ejemplo, crear archivos, guardar información,
copiarlos o eliminarlos.
Niveles de gestión de archivos.
Desde el programa de usuario hasta un medio de almacenamiento
secundario. A medida que se sube de nivel, hay más interacción con el
software que con el hardware. Los manejadores (nivel inferior) deben
interactuar de forma directa con el hardware. Así, inician peticiones de
E/S y las finalizan.
Este nivel es gestionado por el sistema operativo. El nivel sistema de
ficheros (archivos) básico maneja bloques entre la memoria principal y el
almacenamiento secundario. También se lo considera parte del sistema
operativo.
El supervisor de E/S básico se encarga de todas las iniciaciones y
finalizaciones de E/S. Permite, además, obtener mejores rendimientos a partir del empleo de algoritmos de planificación. Al
igual que los niveles anteriores, es parte del sistema operativo. El sistema de ficheros básicos se maneja con bloques, mientras
que el nivel E/S lógico se maneja con registros y su acceso.
Los registros son conjuntos de campos relacionados y tratados como una única unidad. Por su parte, un campo es la unidad
mínima de datos. Finalmente, el nivel superior se denomina método de acceso y permite diferentes maneras de acceder a un
archivo.
Funciones de un sistema de archivos.
Cuando los programas o usuarios necesitan acceder a un
archivo, un software de gestión de directorios lo ubica y un
software de control de acceso de usuario válida que lo que
usuario esté intentando hacer sea posible. Una vez ubicado el
archivo, se accede mediante un método de acceso a los
registros. A partir de este momento deben convertirse los
registros en bloques, la unidad utilizada por las peticiones de
E/S. Así, se debe ubicar el lugar del almacenamiento
secundario en el que se grabará ese bloque o aquel donde
actualmente se encuentra para ser leído. Un planificador hará
este trabajo lo más eficiente posible.
Acceso a archivos.
Los archivos están formados por registros, los cuales luego son convertidos en bloques para ser almacenados en el disco. La
forma en que se accede a un registro (no a los bloques en el disco) determina la estructura lógica de un archivo.
Diversas formas de acceso:
 Pila. forma más simple de organizar un archivo. Los datos van llegando al archivo y en ese orden se va formando una
pila de registros. Como los registros pueden tener diferentes tipos de campos, estos deben autodescribirse. Su longitud
debe estar indicada de manera explícita, de modo que luego sea posible utilizar el método de búsqueda exhaustiva para
obtener un dato particular. Esta búsqueda revisa todos los registros y busca coincidencias entre registro, campo y valor.
No obstante, como en general debe recorrerse gran parte del archivo (o todo) para encontrar el dato buscado, este
método no es el más usado por la mayoría de las aplicaciones.
 Archivo secuencial. En un archivo secuencial todos los registros son de igual tamaño. Cada registro está compuesto
por un número predefinido de campos de igual tamaño. No es necesario, entonces, identificar información adicional
sobre el tamaño. Se denomina campo clave al primer campo de cada registro, el cual identifica de forma única a cada
registro y sirve, además, para realizar un orden, ya sea alfabético o numérico. Si bien el rendimiento no es bueno para
aplicaciones interactivas que requieren consultar y actualizar registros individuales, es ideal para aplicaciones por lotes.
Aun así, el rendimiento no es bueno, ya que se debe buscar la clave, lo cual lleva tiempo.
 Archivo secuencial indexado. Para mejorar el rendimiento del archivo secuencial, se agregan en este caso dos
funcionalidades: índice y archivo de desbordamiento.
El índice funciona como el de un libro: es mucho más rápido buscar contenido en el índice que si se recorren todas las
hojas del libro. Además, proporciona acceso aleatorio. El índice se forma con un archivo secuencial, cuyos registros se
forman por dos campos: el campo clave, igual al campo clave del registro del archivo que contiene todos los datos
(denominado principal), y un puntero a dicho archivo principal. De esta forma, ubicar un campo clave en el archivo
índice es mucho más rápido que hacerlo en el archivo principal. El archivo de desbordamiento es útil para agregar
información al archivo.
 Archivo indexado. Permite realizar búsquedas por atributos que no sean el campo clave. Para lograrlo, se debe utilizar
un índice por cada atributo que puede utilizarse para la búsqueda. Un índice exhaustivo contiene una entrada por cada
registro del fichero principal. Para facilitar la búsqueda, el índice, a su vez, está organizado como un fichero secuencial.
Un índice parcial contiene entradas a los registros donde el campo de interés existe.
Comparación indexado, secuencial indexado:

 Comparación de registro en bloque. Los registros deben convertirse


en bloques para poder escribirse en un disco. Asimismo, para ser
traídos del disco y colocados en la memoria principal, los bloques
deben convertirse en registros. Cada vez que se requiere grabar o leer
un bloque, se necesita una petición de entrada/salida (request, en
inglés, por input/output). El tamaño del bloque determina la cantidad
de registros que podrían operarse en una misma solicitud. Si los
bloques son demasiado grandes, se corre el riesgo de transferir
registros innecesariamente. Existen tres métodos para asignar
registros a bloques:
-bloques fijos: la longitud de los registros es fija, por lo que cierta cantidad de ellos entrarán en un bloque. Si sobra
lugar, se genera fragmentación interna.
-bloques expandidos de longitud variable: los registros son de longitud variable y deben llenar un bloque en su
totalidad. Es posible que algún registro necesite dos bloques.
-bloques no expandidos de longitud variable: no es posible expandir un registro, como en el caso anterior, así que, si
el espacio que queda en un bloque no es suficiente para que un registro lo utilice, no podrá ser utilizado y el registro
completo demandará otro bloque.

Comparación entre las tres técnicas de asignación. Al no generar


fragmentación, la técnica de bloques variables extendidos optimiza el espacio
utilizado, pero su implementación es más complicada.
Cuadro sinóptico de la composición del disco rígido.
Disco duro.

El sistema de archivos es la forma en que el sistema operativo va a organizar la información dentro de un disco para su
grabación y posterior recuperación. Cada sistema operativo tiene su propio y único sistema de archivos, lo que hace que no
pueda funcionar con otros. Por ejemplo:
 DOS y Windows hasta 3.11: FAT 8 o 12.
 Windows 95: FAT 16 o 32.
 Windows 98, ME, XP: FAT 32.
 Windows XP, 2000, NT: NTFS.
 Linux, Unix.
 FAT (File Allocation Table – Tabla de Asignación de Archivos): consiste en una serie de sectores (que se
agrupan bajo el nombre de clusters) que alojan la mínima porción de información, y una tabla que enlista
los sectores libres y los ocupados. Los sectores tienen dos características que, con el tiempo, se les fueron
en contra. Una, que son de tamaño fijo; la otra, que cuanto más grande sea el disco, mayor es su tamaño.
 FAT16
 FAT 32

Los sistemas operativos de Microsoft distinguen el tipo de FAT (12-16-32) utilizado en un volumen mediante la siguiente regla:
 se obtiene el número total de sectores en el volumen.
 Se le resta el espacio de sectores reservados.
 Se le resta el espacio ocupado por las FAT.
 Se le resta el espacio ocupado por el directorio raíz.
 El total anterior se divide por el número de sectores en un cluster redondeando hacia abajo. El resultado R es el número
de clusters en el área de datos.

 NTFS (new technology file system). soporta completa seguridad. Puede decidir los tipos de acceso a archivos
y directorios. Guarda un LOG (archivo) de actividades para reconstruir el disco en el caso de problemas
eléctricos. La madre de todo volumen formateado con NTFS es la Master File Table, una base de datos que
contiene los atributos de todos los ficheros. Podríamos considerarlo similar en funciones a la FAT, aunque
hace mucho más.
Cada fichero tiene asociada una entrada en la MFT que contiene una serie de atributos. Debemos distinguir
entre atributos internos (almacenados en el propio registro de la MFT) y externos, que son referenciados
mediante punteros en la MFT. Casi todos los atributos de cada fichero pueden ser internos o externos. En
cada fichero se almacenan atributos como: Una cabecera, que es siempre interna; un atributo con
información estándar (timestamps para creación, modificación y acceso de cada fichero), así como si un
fichero es de solo lectura, oculto y demás; otro atributo con el nombre del fichero (teniendo en cuenta que
es posible que cada fichero tenga muchos nombres, dado que podemos realizar hard links en distintos
directorios a un mismo archivo); otro atributo con los datos del propio fichero, y un descriptor de seguridad
(como las listas de control de acceso).
Adicionalmente, los directorios indexan los archivos en estructuras más complejas que en el caso de FAT.
De meras colecciones de registros pasamos a utilizar una estructura compleja como es el caso de un árbol
B+, ofreciendo un rendimiento bastante superior.
La principal desventaja de NTFS es que, como podemos imaginar, la MFT puede transformarse en un
verdadero monstruo (dado que controla todo el sistema de ficheros). En el momento de formatear un
volumen con este sistema de fichero se reserva aproximadamente un 12,5 % del tamaño del volumen para
la MFT. Esto hace de NTFS un sistema de ficheros poco adecuado para sistemas de archivos pequeños.
 Ext. los sistemas de archivos de Linux, particularmente ext3 y ext4. Son similares porque existe una estructura
por cada volumen con información de los archivos. Son distintos, a su vez, por el tipo de estructura. Es
inevitable hablar de inodos: registros identificados por un número entero que contienen los metadatos de los
archivos.
Estructura del sistema de archivos en Linux.

Virtualización.
En la actualidad se torna fundamental en referencia a los sistemas operativos, especialmente en el papel de servidores.
Este concepto no se refiere a una única metodología o tecnología, sino que agrupa varias de ellas. En términos generales,
virtualizar consiste en proveer algo que no está ahí, para que parezca estarlo. Es decir, presentar a un sistema elementos
que se comporten de la misma forma que un componente físico (HW) sin que exista en realidad.
El concepto de virtualización se asocia siempre a dos partes:
o Anfitrión. Es el HW o sistema real que ofrece el mecanismo de virtualización. En ingles se denomina host.
o Huésped. Es el sistema o aplicaciones que se ejecutan en el entorno virtualizado. En ingles, guest.
Emulación.
La técnica de virtualización más sencilla, y que hace más tiempo tienen las computadoras personales, es la emulación. Emular
consiste en implementar en software algo que se presente como el hardware de un sistema completo, típicamente de una
arquitectura de hardware distinta a la del anfitrión (la arquitectura nativa). El emulador puede ser visto (de una forma
extremadamente simplificada) como una lista de equivalencias, de cada una de las instrucciones en la arquitectura huésped a la
arquitectura del sistema anfitrión.
Una emulación no se limita con traducir del lenguaje y la estructura de un procesador a otro —para que una computadora pueda
ser utilizada, requiere de una serie de chips de apoyo, desde los controladores de cada uno de los buses hasta los periféricos
básicos (teclado, video). Casi todas las emulaciones incluirán un paso más allá: los periféricos mismos (discos, interfaces de
red, puertos). Todo esto tiene que ser implementado por el emulador.
Resulta obvio que emular un sistema completo es altamente ineficiente. Los sistemas huéspedes resultantes típicamente tendrán
un rendimiento cientos o miles de veces menor al del anfitrión.
Hoy en día las máquinas virtuales implementan varias técnicas para reducir el tiempo que se desperdicia emulando.
 Traducción dinámica: Compilación parcial del código a ejecutar a formatos nativos, de modo que solo la primera
vez que se ejecuta el código intermedio tiene que ser traducido.
 Traducción predictiva: Anticipar cuáles serán las siguientes secciones de código que tendrán que ser ejecutadas
para, paralelamente al avance del programa, traducirlas a código nativo de forma preventiva.
 Compilación justo a tiempo (JIT): almacenar copia del código ya traducido de un programa, de modo que no tenga que
hacerse ni siquiera en cada ejecución, sino que solo una vez en la vida de la máquina virtual.

Emulación versus simulación.


Emular significa imitar las acciones de otro, procurando igualarlas e incluso excederlas. Esto significa que un emulador
reproduce todos los procesos internos que realizaría el sistema nativo, y busca cubrir todos los comportamientos respectivos
implementando los mismos mecanismos.
Simular, por otra parte, significa representar algo, fingiendo o imitando lo que no es. Un sistema simulador simula o finge las
áreas de determinado sistema que interesan al usuario; puede emplear datos precargados para generar ciertas respuestas,
obviando los procesos que los generarían.

Lec. 2
Asignación de espacio a archivos
Es posible agregar a un archivo espacio en almacenamiento secundario de forma dinámica o mediante preasignación. La
segunda opción consiste en asignar el espacio total que va a requerir la aplicación. Esta es su desventaja, ya que en muchas
aplicaciones no es fácil estimar este espacio, y muy probablemente el programador asigne espacio de más, el cual termina por
ser desperdiciado. La asignación dinámica, va otorgando espacio a medida que la aplicación lo necesita.
Para elegir el método de asignación también hay que tener en cuenta el tamaño de la porción. Una porción puede ser tan grande
como el archivo o tan pequeña como el tamaño de un bloque.

Asignar de forma contigua mejora el rendimiento. Utilizar muchas porciones pequeñas incrementa la carga para la gestión. Si
las porciones son de tamaño fijo, se simplifica la reasignación. Usar porciones pequeñas o de tamaño fijo optimiza la utilización
de espacio cuando hay reasignaciones.
Para decidir el tamaño de la porción, se utilizan dos variables: mejor rendimiento (porciones variables, grandes y contiguas) y
mayor flexibilidad (pequeñas porciones fijas).

3 métodos para asignar espacio a los archivos: asignación contigua, encadenada, indexada.

Asignación contigua. Requiere que cada archivo utilice bloques contiguos en almacenamiento secundario. Esto permite menos
latencia por parte del disco, ya que los bloques se ubican en sectores contiguos de una misma pista o solo es necesario moverse
de una pista a la siguiente. Soporta acceso tanto secuencial como directo.

La tabla de asignaciones contiene el bloque inicial de un archivo y su longitud.


Su desventaja es la fragmentación externa, por lo que debe realizarse una
compactación cada cierta cantidad de tiempo (como en la imagen de abajo)
para permitir que los archivos encuentren suficiente espacio libre para asignar.
Asignación encadenada. Resuelve los inconvenientes de la asignación
contigua, ya que un archivo es ahora un listado de enlaces a bloques del
disco que pueden estar en cualquier ubicación. Cada bloque hace referencia
al siguiente bloque, mientras que la tabla de asignación solo requiere del
bloque inicial y su longitud. De esta forma, la fragmentación externa no
existe, ya que es posible asignar cualquier bloque libre en cualquier lugar
del disco. La desventaja de usar bloques contiguos es que, si se requiere leer
bloques que se encuentran en diferentes sectores del disco, el rendimiento
decrece debido a la latencia rotacional y al tiempo de búsqueda. Para
mejorar el bajo rendimiento, es posible, realizar la consolidación cada cierto
tiempo.
Asignación encadenada luego
de consolidar.

Asignación indexada. Cada archivo tiene su propio índice de bloques en una estructura similar a la de paginación de memoria.
Un archivo nuevo tendrá todos sus punteros nulos, pero cuando se utiliza el primer bloque se obtiene su ubicación y esta se
coloca como puntero. Este método no produce fragmentación externa, como la asignación continua. Y mejora la proximidad
sobre la asignación encadenada. Estas ventajas hacen que sea el método más utilizado.

El archivo B utiliza 5 bloques: 1, 8, 3, 14 y 28. Este índice de bloques, a


su vez, utiliza un bloque (el 24) para almacenar los índices.

Espacio libre en almacenamiento secundario.


Para saber qué bloques están disponibles para poder asignarlos, se utiliza la gestión de espacio libre y diferentes métodos:
 Mapa de bits o vector de bits. Cada bloque de un disco se representa con un bit. Si el bit está en 0, significa que el
bloque está libre mientras que un 1 indica que está ocupado. Resulta ventajoso el hecho de que sea muy simple
implementar este mapa, el cual resulta eficiente para buscar bloques libres, ya que solo debe recorrerse el vector en
busca de bits cero. Su desventaja está relacionada con el espacio que requiere en la memoria para funcionar. El espacio
es proporcional al tamaño del disco y depende también del tamaño de bloques que se emplee. Cuanto más grande sea
el disco, más espacio se requiere en la memoria principal para su funcionamiento. Colocar el mapa de bits en la memoria
secundaria no ofrece un buen rendimiento.
 Lista de bloques libres. Se forma un listado con números de bloques asignados secuencialmente. Como el tamaño del
listado es muy grande, siempre se almacena en el mismo disco. Para mejorar el rendimiento, algunos bloques libres se
pueden almacenar en la memoria principal. A medida que se van utilizando, la lista se actualiza. De esta forma, siempre
habrá una cierta cantidad de bloques libres en la memoria principal.
 Lista enlazada. Emplea enlaces entre bloques. En la memoria caché se mantiene un bloque libre, el cual tiene un
puntero al siguiente bloque libre. Este último apuntará al siguiente, y así sucesivamente. Si bien la eficiencia de este
método no es buena, ya que se requiere leer los bloques para encontrar más bloques libres, es útil cuando solo se
necesita un bloque, porque este se encuentra en caché.
 Implementaciones. Diferentes sistemas operativos implementan una u otra de las técnicas analizadas.
Lec. 3
Actualmente, el almacenamiento secundario todavía está liderado por discos magnéticos. Estos presentan los siguientes
inconvenientes.
o Debido a su principio de funcionamiento, en comparación con la memoria principal, son extremadamente lentos. Se
requiere gran cantidad de tiempo hasta que el cabezal de lectura logra posicionarse sobre el lector donde hay que leer
o escribir datos.
o Como los discos magnéticos tienen componentes mecánicos que permiten que los discos roten y el brazo donde se
ubica el cabezal de lectura/escritura se mueva, tienden a fallar luego de un determinado tiempo de uso.
Si se utiliza solo un disco como memoria secundaria, el rendimiento será muy pobre y la probabilidad de perder información
vital, muy alta. Para evitar esto, existen diferentes configuraciones que agrupan los discos y mejoran el rendimiento, la
probabilidad de pérdida de información o ambas.
Niveles RAID
Redundant array of independent disks o arreglo redundante de discos independientes, es decir, la agrupación de diferentes
discos en un grupo. El sistema operativo ve a este grupo como si fuera en realidad un solo dispositivo lógico, por lo que no
tiene noción de lo que ocurre dentro del grupo. Existen siete niveles RAID, cada uno con sus características, ventajas y
desventajas. Es importante aclarar que el número del nivel no implica que un nivel sea mejor o peor que otro, sino solo que son
diferentes.
RAID 0. No ofrece ningún tipo de redundancia, aunque sí mejora notablemente el rendimiento. Los datos se dividen en bandas
(stripes) y cada una de estas se ubica en un disco diferente.
Mejora el rendimiento de lectura, ya que, si se requiere leer muchos stripes, esto se puede
hacer de forma simultánea en varios discos. Cuantos más discos conformen el RAID 0,
mejor será el rendimiento. La desventaja es que, al no poseer redundancia, la falla de un
disco del grupo afecta los datos que utilizaban esos stripes.
RAID 1. La forma básica de armar un RAID 1 es utilizando dos discos. Cada stripe que se graba en un primer disco, se graba
también en el segundo. Debido a esto, también suele denominarse disk mirroring o espejado de discos. Como los datos están
duplicados, si cualquiera de los discos falla, es posible recuperar la información con el disco restante y evitar la pérdida de
datos.
Presenta una desventaja: su alto costo. Se requiere el doble de discos para almacenar la misma información en comparación
con RAID 0. Sin embargo, es sumamente útil para aplicaciones críticas. Implica la utilización de dos discos únicamente, por lo
cual el espacio disponible queda limitado. Para poder aumentarlo, conservando las características del nivel, es posible
combinarlo con RAID 0. Las dos implementaciones se conocen
como RAID 1 + 0 y RAID 0 + 1.
Raid 1+0. Primero se espeja y luego se distribuyen los stripes en
cada lado del espejo:
RAID 2. En la práctica, este esquema no es utilizado, ya que
requiere gran cantidad de discos. Se utiliza el código de
Hamming para corregir un error o detectar dos. Esta
particularidad lo hace diferente a otros tipos de RAID, pero no
resulta muy atractiva, debido a que en la actualidad los discos casi
no producen errores.
RAID 3. No utiliza tantos discos redundantes como RAID 2, solo necesita uno. La redundancia es provista por el bit de paridad
que se calcula utilizando la función XOR (exclusive or) en todos los stripes de datos. Este bit resultante se almacena en un disco
denominado disco de paridad. En el caso de que falle alguno de los discos, la información se reconstruye realizando la misma
operación XOR con los discos restantes.
Para grandes flujos de datos, el rendimiento es muy bueno, ya que es posible leer
y escribir en los discos de forma simultánea, aunque no se puede hacer más de un
pedido de E/S a la vez.
Ejemplo con cinco discos, cuatro son de datos y el último es donde se almacenan
las paridades que están calculadas a nivel de bit. Para calcular P(b), se realizó una
XOR entre b0, b1,b2,b3.
RAID 4. A diferencia del nivel anterior, el cálculo de paridad se hace a nivel de
bloque y no de bit. Los discos funcionan de manera independiente, por lo cual
es posible, recibir pedidos de E/S en forma paralela.
Esta característica es compartida con los niveles RAID5 y RAID6, lo cual los
hace más adecuados para aplicaciones que generan gran número de pedidos de
E/S. Asimismo, también comparten la penalización de escritura, lo que quiere
decir que cada vez que debe escribirse un dato el hardware RAID debe:
 Leer los datos
 Calcular la paridad
 Escribir los datos
 Escribir la paridad
Se dice que la penalidad de escritura es 4. Es decir, cada petición de escritura genera esas cuatro acciones. En RAID1, la
penalidad es 2 (una por disco).
RAID 5. Funciona de manera similar a RAID4. Pero en lugar de utilizar un disco exclusivo para almacenar las paridades, las
distribuye a lo largo de todos los discos que componen el conjunto. La ventaja, en comparación con el anterior, es que se evita
el cuello de botella ubicado en el disco de paridad. La penalidad por escritura es
la misma (4) y la cantidad mínima de discos que pueden usarse es tres. Cuantos
más discos se utilicen, menor será el overhead del espacio destinado a la paridad,
pero mayor la probabilidad de que más de un disco falle a la vez y se pierda
información, ya que RAID 5 puede reconstruir paridad cuando solo un disco
falla. Es un nivel muy utilizado para diversas aplicaciones, ya que es económico
y posee un rendimiento aceptable.
RAID 6. Este nivel realiza dos cálculos de paridad, a diferencia de RAID 5, que realiza uno. Esto aumenta la disponibilidad,
pues permite que dos discos del conjunto fallen al mismo tiempo sin
ocasionar la pérdida de datos. Sin embargo, la penalidad de escritura
ahora es mayor (6), pues RAID 6 tiene que leer datos y calcular
paridad dos veces para luego escribir datos y calcular paridad dos
veces más.
Arreglos de almacenamiento (storage arrays)
Cuando el espacio disponible en un servidor es insuficiente para las aplicaciones, se recurre al almacenamiento externo. Es
posible montar sistemas de archivos externos mediante los protocolos NFS o CIFS y discos externos mediante los protocolos
iSCSI o FC (fiber channel). El servidor los tratará como si fueran recursos locales, aunque en realidad los discos físicos estén
ubicados en equipos dedicados (storage arrays) y conectados a través de redes IP o FC.
Estos equipos varían en su envergadura. Mientras que un equipo hogareño solo dispondrá de algunos discos y de un esquema
RAID, los más robustos agregan además múltiples funcionalidades que mejoran el rendimiento, la seguridad y la disponibilidad.
Para mejorar el rendimiento, se utilizan memorias caché. Asimismo, para mejorar la disponibilidad, es posible configurar
replicaciones, clones o snapshots. Finalmente, para disponer seguridad, se configuran listas de acceso que evitan que servidores
o personas no autorizadas tengan acceso a sistemas de archivos o discos.
Lec. 4
Para que los diferentes hosts (computadoras ubicadas en distintos sitios) puedan comunicarse entre sí, es necesario que exista
una red de comunicaciones que haga posible transportar la información. Estas redes pueden ser de poco alcance, como las de
dos teléfonos inteligentes que intercambian una foto por bluetooth, o cubrir el mundo entero, como lo hace Internet. Ante la
gran diversidad de aplicaciones, sistemas operativos, hardware y tipos de redes, la necesidad de estandarización derivó en la
elaboración de un modelo de referencia por capas denominado modelo de Interconexión de Sistemas Abiertos (OSI). Este
modelo especifica siete niveles. Cada nivel es responsable de ciertas tareas y, a su vez, provee algún servicio al nivel superior,
lo cual permite simplificar el diseño de las redes.
Dicho modelo de referencia surgió después que el conjunto de protocolos TCP/IP. Este nació de la práctica y, se basa en
protocolos que fueron creados y perfeccionados. En lugar de definir siete niveles, TCP/IP define originalmente cuatro, algunos
de los cuales comparten las funcionalidades de sus niveles equivalentes en OSI.
Se describen cinco niveles, ya que muchos autores dividen el nivel originalmente denominado acceso a la red en dos: nivel
físico y acceso a la red, para que compartan características con el modelo OSI.
 Nivel 1 (capa física): se encarga de definir las señales que se usarán, distinguir entre 1 y 0 y definir los medios de
transmisión que se utilizarán.
 Nivel 2 (enlace datos): se encarga de crear una trama (unidad de información) e identificar los diferentes dispositivos
de una misma red. Además, realiza un control de errores.
 Nivel 3 (capa de red): cuando las redes se unen, la identificación usada en el nivel 2 carece de sentido. Esta capa
permite la identificación de dispositivos de redes diferentes y el direccionamiento de los paquetes a través de ellas.
 Nivel 4 (capa de transporte): permite la comunicación proceso a proceso entre dos computadoras. Se crea una
abstracción del número de procesos generados por el sistema operativo y, en su lugar, se utilizan números de puerto.
 Nivel 5 (capa de aplicación): da soporte a las múltiples aplicaciones utilizadas en sistemas distribuidos, como, por
ejemplo, correo electrónico, páginas web, transferencia de archivos, etcétera.
Modelo TCP/IP
La máquina A está conectada a la red 1, por lo que tendrá
una dirección IP correspondiente a dicha red, y además
su dirección Ethernet (de capa 2). La máquina B posee
una dirección IP de la red B y también su dirección
Ethernet. Entre las dos redes, se ubica un encaminador o
router que permite la interconexión. Entre ambas
maquinas existe comunicación proceso a proceso que
utiliza el protocolo TCP. Esta comunicación es lógica, ya
que la información se encapsula en un paquete IP. Luego
en una trama Ethernet viaja hasta la maquina B y
atraviesa el encaminador J, para luego ir subiendo de
niveles hasta llegar a la aplicación.

Modelo cliente/servidor.
Revolucionó las comunicaciones y permitió que diferentes dispositivos interactúen entre sí a través de una red de
comunicaciones.
Para permitir la comunicación entre los procesos de dos computadoras, se utiliza un socket, el cual puede ser orientado a la
conexión (se establece un circuito virtual antes de transferir datos de usuario, por ejemplo, con el protocolo TCP) o no orientado
a la conexión (UDP). El servidor tiene abierto un socket que escucha en un determinado puerto. De esta manera, la aplicación
del cliente intentará conectarse al servidor usando ese número de puerto. Cuando un cliente se conecta, la comunicación se hace
por otro puerto del servidor y el primero se libera para una nueva conexión. Múltiples clientes pueden interactuar con una
aplicación de un servidor.
El socket contiene tres valores: el protocolo que se utiliza (UDP o TCP), la dirección IP y el puerto. Cuando el socket emplea
TCP, se denomina socket stream. Si es para UDP, se denomina socket datagrama y es utilizado como API (interfaz de
programación de aplicaciones) que necesitan usar los protocolos de la capa de transporte UDP o TCP.
Son ejemplos de aplicaciones que utilizan el modelo cliente-servidor el correo electrónico, con sus protocolos POP, SMTP o
IMAP, el servicio para transferencia de archivos FTP o el servicio de shell segura (SSH), utilizado para conectarse remotamente
a una consola. Todos estos protocolos mencionados corresponden a la capa de aplicación del modelo TCP/IP y requieren de
los servicios que ofrece la capa inmediata inferior (transporte y sus protocolos UDP y TCP) para poder funcionar.
Arquitectura cliente-servidor.
En la computadora del cliente, un servicio de presentación le ofrece una
interfaz amigable para su aplicación. Por debajo se encuentra la lógica de
dicha aplicación. Aquí se realiza la interacción al nivel de la aplicación, pero
recordemos que en realidad este es el nivel superior del modelo TCP/IP.
Realmente esa interacción debe utilizar todas las capas del modelo para
poder llegar a destino y ser procesada por el servidor. Los protocolos
permiten que sistemas operativos y hardware diferentes puedan interactuar
entre sí, ya que en esencia un protocolo es un lenguaje común que debe
implementarse.
Implementaciones.
 Procesamiento basado en host. El dispositivo cliente es una terminal boba, ya que todo se realiza en el servidor,
inclusive la interfaz de usuario. La terminal solo se usa para acceder al dispositivo remoto y realizar todo allí.
 Procesamiento basado en servidor. El procesamiento se realiza en el servidor y para el cliente solo está disponible la
interfaz para que acceda el usuario.
 Procesamiento cooperativo. Permite una mayor productividad, ya que utiliza recursos tanto del cliente como del
servidor para realizar las operaciones necesarias. Sin embargo, es más compleja que el resto de las implementaciones.
 Procesamiento basado en el cliente. La mayoría (no todas) las operaciones se realizan en el cliente, lo que libera el uso
de recursos del servidor y lo habilita para permitir más clientes conectados.
El modelo cliente-servidor clásico también puede estar compuesto por tres capas. Entre el cliente y el servidor clásico
se adiciona una capa central, que es otro servidor que puede ser utilizado para convertir protocolos o procesar datos
obtenidos del servidor clásico, lo que libera a este de dichas tareas para que especialice y mejore el rendimiento de otras.
Técnicas de envío de mensajes.
La primera técnica consiste en el envío y recepción simple de mensajes, los cuales se implementan básicamente con las
funciones send para enviar y receive para recibir. Lo que la función receive hace es indicar de quien se recibirá el mensaje y
definir espacio en un buffer donde llegaran los datos recibidos. Send especifica un destino y los datos que se van a transmitir.
Luego de construirse una unidad de datos mediante la función send, el conjunto de protocolos TCP/IP hará posible enviarla a
destino a través de una o más redes. Cuando llegue a destino, el mismo conjunto de protocolos TCP/IP recorrerá el camino
inverso a través de sus capas para entregar la unidad de datos, la cual es analizada para determinar cuál es el proceso que debe
utilizarla para luego pasarla a su respectivo buffer.
Este tipo de pase de mensajes puede ser fiable cuando el protocolo de la capa de transporte garantiza la entrega. La aplicación
puede dar por hecho que una vez que envía un dato, este llegará a destino o, en caso contrario, será informado el error. En el
caso de que no se utilice el protocolo TCP y se utilice UDP, no se garantiza la entrega de datos, por lo cual el pase de mensajes
pasa a ser no fiable y la aplicación debe realizar un control.
El pase de mensajes puede, además, ser bloqueante o no bloqueante. Un send bloqueante no devuelve el control al proceso
emisor hasta que el mensaje haya sido transmitido (servicio no fiable) o hasta que el mensaje haya sido enviado y se haya
recibido el acuse de recibo (servicio fiable). Un receive bloqueante no devuelve el control hasta que el mensaje haya sido
situado en su correspondiente buffer.
La segunda técnica consiste en llamadas a procedimientos remotos o remote procedure call (RPC). Los programas dentro de
una misma máquina utilizan este esquema. Entonces, por su gran aceptación y conocimiento, resulta conveniente llevarlo a un
sistema distribuido.

A la izquierda se encuentra el cliente, el cual realiza, por un


lado, una llamada realmente local y, por otro, una llamada que
parece local per en realidad luego es enviada al servidor
mediante TCP/IP. El servidor trata a este RPC como local y la
respuesta es nuevamente enviada a través de la red al cliente, el
cual recibe una respuesta como si fuera local.
Seguridad y protección.
La seguridad de los datos de un sistema operativo debe contemplar múltiples facetas:
 Protección ante posibles daños físicos de los datos (ruptura de discos u otro tipo de daño).
 Acceso indebido a los mismos (fallas de seguridad).
 La protección consiste en evitar que se haga un uso indebido de los recursos cuando se está dentro del ámbito
del sistema operativo.
 Deben existir mecanismos y políticas que aseguren que los usuarios solo acceden a sus propios recursos (archivos,
zonas de memoria, etc.)
Para poder garantizar estos aspectos deben tenerse en cuenta 3 aspectos de diseño:
o Evitar la pérdida de datos por medio de copias de seguridad, por ejemplo.
o Controlar la privacidad de los datos mediante un cifrado encriptado
o Controlar el acceso a los datos y recursos por medio de la identificación.
Problemas de seguridad.
 Uso indebido o malicioso de programas (troyanos, backdoors, etc.).
 Usuarios inexpertos o descuidados.
 Usuarios no autorizados (errores de autenticación).
 Gusanos: programas destructivos que se autopropagan.
 Rompedores de sistemas de protección (analizadores de contraseñas).
 Ataques por denegación de servicios.
Políticas de seguridad.
 Cada organización tiene requisitos de seguridad distintos.
 Las políticas de seguridad dictan las normas a seguir para proporcionar protección y seguridad a los sistemas.
 No implica mecanismos, solo políticas.
 Existen leyes que se deben cumplir cuando se utiliza información confidencial.
 Las políticas de seguridad deben dar confianza.

Política militar.
-Se basa en la clasificación de todos los recursos con requisitos de seguridad en alguno de los siguientes niveles: desclasificado,
restringido, confidencial, secreto, alto secreto.
- Los usuarios que tienen acceso a recursos del nivel I también lo tienen a los de nivel i+1.
-regla de lo que se necesita saber: solo se permite el acceso a datos sensibles a quien los necesita para hacer su trabajo.

Política comercial.
-se basan en la política militar, pero debilitan los requisitos.
-la muralla china clasifica a recursos y usuarios en 3 niveles de abstracción: objetos, grupos, clases de conflictos
-cada objeto pertenece a un único grupo y cada grupo a una única clase de conflicto.
-una clase de conflicto, sin embargo, puede incluir a varios grupos.
- política de control de acceso: una persona puede acceder a la información siempre que antes no haya accedido otro grupo de
la clase de conflicto a la que pertenece la información a la que quiere acceder.

Modelos de seguridad. Un modelo es un mecanismo que permite hacer explícita una política de seguridad.
 Modelos de seguridad multinivel: rangos de seguridad y separación rigurosa entre usuarios y objetos a los que no tienen
acceso. Suelen ser modelos muy abstractos y costosos de implementar.
 Modelos de seguridad limitada: responden formalmente a las propiedades que un sistema seguro debe satisfacer. Se
basan en dos principios:
-usan la teoría general de sistemas para definir un sistema formal de reglas de protección.
- Usan una matriz de control de acceso en cuyas filas están los usuarios y en las columnas los objetos.
Principios de seguridad de un sistema operativo.
o Diseño abierto.
o Exigir permisos.
o Privilegios mínimos.
o Mecanismos económicos.
o Compartición mínima.
o Fáciles de usar y adaptar.
o Separación de privilegios
Tareas de seguridad.
o Autenticación de recursos.
o Asignación de recursos.
o Control de acceso a los recursos.
o Control de compartición y comunicación entre procesos.
o Protección de datos.
Tareas de seguridad y componentes del sistema operativo.

También podría gustarte