miércoles, 14 de mayo de 2014

Memoria en un Sistema Operativo

Memoria

La memoria es uno de los principales recursos de la computadora, la cual debe de administrarse con mucho cuidado. Aunque actualmente la mayoría de los sistemas de cómputo cuentan con una alta capacidad de memoria, de igual manera las aplicaciones actuales tienen también altos requerimientos de memoria, lo que sigue generando escasez de memoria en los sistemas multitarea y/o multiusuario.
La parte del sistema operativo que administra la memoria se llama administrador de memoria y su labor consiste en llevar un registro de las partes de memoria que se estén utilizando y aquellas que no, con el fin de asignar espacio en memoria a los procesos cuando éstos la necesiten y liberándola cuando terminen, así como administrar el intercambio entre la memoria principal y el disco en los casos en los que la memoria principal no le pueda dar capacidad a todos los procesos que tienen necesidad de ella.
Los sistemas de administración de memoria se pueden clasificar en dos tipos: los que desplazan los procesos de la memoria principal al disco y viceversa durante la ejecución y los que no.
El propósito principal de una computadora es el de ejecutar programas, estos programas, junto con la información que accesan deben de estar en la memoria principal (al menos parcialmente) durante la ejecución.
Para optimizar el uso del CPU y de la memoria, el sistema operativo debe de tener varios procesos a la vez en la memoria principal, para lo cual dispone de varias opciones de administración tanto del procesador como de la memoria. La selección de uno de ellos depende principalmente del diseño del hardware para el sistema.

Jerarquía de la memoria.

 Una jerarquía de memoria es una reacción natural a la localidad y tecnología. Una jerarquía en memoria está organizada en varios niveles, cada uno más pequeño, más rápido y más caro por byte que el siguiente. Los niveles de la jerarquía están contenidos en el siguiente: todos los datos de un nivel se encuentran también en el nivel siguiente y así sucesivamente hasta que alcancemos el extremo inferior de la jerarquía.

Conceptos básicos

Nivel (level)
Bloque o línea (block or line): mínima unidad de información que puede estar presente o no en la jerarquía de dos niveles (tamaño fijo o variable)
Acierto/Fallo (hit/miss)
Frecuencia de aciertos/fallos(hit rate/miss rate)
Tiempo de acierto (hit time)
Penalización por fallo (miss penalty)
  • Tiempo de acceso (access time): tiempo para acceder a la primera palabra de un bloque en un fallo
  • Tiempo de transferencia (transfer time): tiempo adicional para transferir las restantes palabras del bloque.

Jerarquía de memoria

Registros de procesador: Estos registros interaccionan continuamente con la CPU (porque forman parte de ella). Los registros tienen un tiempo de acceso muy pequeño y una capacidad mínima, normalmente igual a la palabra del procesador (1 a 8 bytes).

Registros intermedios: Constituyen un paso intermedio entre el procesador y la memoria, tienen un tiempo de acceso muy breve y muy poca capacidad.

Memorias caché: Son memorias de pequeña capacidad. Normalmente una pequeña fracción de la memoria principal. y pequeño tiempo de acceso. Este nivel de memoria se coloca entre la CPU y la memoria central. Hace algunos años este nivel era exclusivo de los ordenadores grandes pero actualmente todos los ordenadores lo incorporan. Dentro de la memoria caché puede haber, a su vez, dos niveles denominados caché on chip, memoria caché dentro del circuito integrado, y caché on board, memoria caché en la placa de circuito impreso pero fuera del circuito integrado, evidentemente, por razones físicas, la primera es mucho más rápida que la segunda. Existe también una técnica, denominada Arquitectura Harvard, en cierto modo contrapuesta a la idea de Von Newmann, que utiliza memorias caché separadas para código y datos. Esto tiene algunas ventajas como se verá en este capítulo.

Memoria central o principal: En este nivel residen los programas y los datos. La CPU lee y escribe datos en él aunque con menos frecuencia que en los niveles anteriores. Tiene un tiempo de acceso relativamente rápido y gran capacidad.

Extensiones de memoria central: Son memorias de la misma naturaleza que la memoria central que amplían su capacidad de forma modular. El tiempo de similar, a lo sumo un poco mayor, al de la memoria central y su capacidad puede ser algunas veces mayor.

Memorias de masas o auxiliares: Son memorias que residen en dispositivos externos al ordenador, en ellas se archivan programas y datos para su uso posterior. También se usan estas memorias para apoyo de la memoria central en caso de que ésta sea insuficiente (memoria virtual). Estas memorias suelen tener gran capacidad pero pueden llegar a tener un tiempo de acceso muy lento. Dentro de ellas también se pueden establecer varios niveles de jerarquía.

Asignación de memoria.


Memoria contigua

En los sistemas de ejecución en lotes, así como en las primeras computadoras personales, sólo un programa se ejecutaba a la vez, por lo que, más allá de la carga del programa y la satisfacción de alguna eventual llamada al sistema solicitando recursos, el sistema operativo no tenía que ocuparse de la asignación de memoria.

Al nacer los primeros sistemas operativos multitarea, se hizo necesario resolver cómo asignar el espacio en memoria a diferentes procesos.

Memoria contigua simple

este esquema de gestión consiste en situar a los procesos en la memoria en direcciones consecutivas. existen varios métodos basados en la asignación contigua.

Bare Machine

Se trata de tener solo un proceso en la memoria y permitir que use toda la memoria. el usuario accede a cualquier parte de la memoria. Es la denominada BM. El método tiene máxima flexibilidad y prácticamente toda la responsabilidad recae sobre el usuario. Éste tiene, a su vez todos los derechos y todos los deberes.

Monitor residente

En este esquema se utilizan mecanismos de protección porque distingue una parte de la memoria destinada al monitor o sistema operativo y otra dedicada al usuario. ]En mecanismo de protección nuega al usuario el acceso a la zona de memoria destinada al sistema operativo; de esta manera se evitara que pueda ser modificado. Esta técnica es frecuentemente en microcomputadoras simples. El sistema operativo puede encontrarse en la parte baja de la memoria RAM, o bien puede estar en ROM en la parte alta. Cuando el sistema se organiza de esta forma, sólo puede estar en ejecución un único proceso(monoprogramación).



Memoria particionada

Es el primer mecanismo que puede ser compartida por varios usuarios. A cada una de las zonas asignadas a los distintos usuarios se les denomina partición . Existen varias razones fundamentales para su empleo que pueden quedar resumidas en los siguientes puntos:
  • Facilitar la creación de procesos para simplificar una aplicación.
  •  Proporcionar servicio interactivo a varios usuarios.
  • Mejorar la utilización de la UCP.
Es evidente que el uso de la multiprogramación complica el diseño del sistema operativo, puesto que añade mayor complejidad. 

Algoritmos de planificación de procesos

Proceso

Un proceso es un programa en ejecución. Existen 3 estados en los que puede encontrarse un proceso, estos son: "Listo", "Bloqueado" y "En ejecución". Para el control de los mismos internamente son almacenados en una lista, cada uno de los nodos guarda información de un proceso. En esa información se almacena, entre otros aspectos, el estado en que se encuentra el proceso, el tiempo que el proceso ha usado el CPU, e información de E/S (entrada/salida). Los sistemas operativos cuentan con un componente llamado planificador, que se encarga de decidir cuál de los procesos hará uso del procesador. La toma de esta decisión, así como el tiempo de ejecución del proceso, estará dada por un algoritmo, denominado Algoritmo de Planificación.


Objetivo de la planificación de procesos

La Planificación de procesos tiene como principales objetivos la equidad, la eficacia, el tiempo de respuesta, el tiempo de regreso y el rendimiento.

  • Equidad: Todos los procesos deben ser atendidos.
  • Eficacia: El procesador debe estar ocupado el 100% del tiempo.
  • Tiempo de respuesta: El tiempo empleado en dar respuesta a las solicitudes del usuario debe ser el menor posible.
  • Tiempo de regreso: Reducir al mínimo el tiempo de espera de los resultados esperados por los usuarios por lotes.
  • Rendimiento: Maximizar el número de tareas que se procesan por cada hora.

Ejemplos

  • Primero en llegar primero en ser servido: Conocido como FCFS (First Come First Served). Este algoritmo emplea una cola de procesos, asignando un lugar a cada proceso por el orden de llegada. Cuando el proceso llega es puesto en su lugar en la cola después del que llegó antes que él y se pone en estado de listo. Cuando un proceso comienza a ejecutarse no se interrumpe su ejecución hasta que termina de hacerlo.
  • Prioridad al más corto: Su nombre es SJF (Shortest Job First). El proceso que se encuentra en ejecución cambiará de estado voluntariamente, o sea, no tendrá un tiempo de ejecución determinado para el proceso. A cada proceso se le asigna el tiempo que usará cuando vuelva a estar en ejecución, y se irá ejecutando el que tenga un menor tiempo asignado. Si se da el caso de que dos procesos tengan igual valor en ese aspecto emplea el algoritmo FCFS. 
  • Round Robin: A cada proceso se le asigna un tiempo determinado para su ejecución, el mismo tiempo para todos. En caso de que un proceso no pueda ser ejecutado completamente en ese tiempo se continuará su ejecución después de que todos los procesos restantes sean ejecutados durante el tiempo establecido. Este es un algoritmo basado en FCFS que trata la cola de procesos que se encuentran en estado de listos como una cola circular. 
  • Planificación por prioridad: En este tipo de planificación a cada proceso se le asigna una prioridad siguiendo un criterio determinado, y de acuerdo con esa prioridad será el orden en que se atienda cada proceso.
  • Planificación garantizada: Para realizar esta planificación el sistema tiene en cuenta el número de usuarios que deben ser atendidos. Para un número "n" de usuarios se asignará a cada uno un tiempo de ejecución igual a 1/n.
  • Planificación de Colas Múltiples: El nombre se deriva de MQS (Multilevel Queue Schedulling). En este algoritmo la cola de procesos que se encuentran en estado de listos es dividida en un número determinado de colas más pequeñas. Los procesos son clasificados mediante un criterio para determinar en qué cola será colocado cada uno cuando quede en estado de listo. Cada cola puede manejar un algoritmo de planificación diferente a las demás.

Paginación simple

Es un método para resolver el problema de la fragmentación externa. Este método se basa en dividir el espacio de memoria asignado a cada proceso en páginas de memoria. Las unidades correspondientes en la memoria física se denomina marcos de página. Las páginas y los marcos son del mismo tamaño, y tienen que ser una potencia de  2. De esta forma se proporciona una memoria superior a la memoria física, al hacer desaparecer la diferencia aparente entre memoria principal y memoria secundaria y no tener que utilizar zonas de memoria contiguas.

Segmentación simple


Al desarrollar un programa, el programador no ve a la memoria como un sólo arreglo plano, en el que todas las direcciones son iguales (si bien está consciente de que la realidad es así). El uso que damos a la memoria sigue una lógica de distintos segmentos: En vez de dar una dirección lineal, damos al procesador una dirección de segmento y un desplazamiento dentro de dicho segmento. Podemos tener segmentos de distintos tamaños presentes en memoria, y la resolución de direcciones de cada uno de ellos se realizará por mecanismos análogos al descrito en el apartado anterior (registro base y desplazamiento). Claro está, esto debe también hacerse con apoyo del MMU.




Paginación por demanda

Un sistema de paginación por demanda es similar a un sistema de paginación con intercambios. Los procesos residen en memoria secundaria (en el disco). Cuando queremos ejecutar un proceso, lo metemos en memoria. Sin embargo, en vez de intercambiar todo el proceso hacia la memoria, utilizamos un intercambiador perezoso. Un intercambiador perezoso nunca reincorpora una página a memoria a menos que se necesite. Como ahora consideramos un proceso como una secuencia de páginas, en vez de un gran espacio contiguo de direcciones, el término intercambio es técnicamente incorrecto. Un intercambiador manipula procesos enteros, mientras que un paginador trata con las páginas individualmente de un proceso.

Servicios de Gestión de Memoria

Servicio Posix

El estándar POSIX define servicios de gestión de memoria para realizar la proyección y desproyección de archivos (mmap, munmap). El servicio mmap tiene el siguiente prototipo: 
caddr_t mmap (caddr_t direc, size_t longitud, int protec, 
int indicador, int descriptor, off_t despl); 
El primer parámetro indica la dirección del mapa donde se quiere que se proyecte el archivo. Generalmente, se especifica un valor nulo para indicar que se prefiere que sea el sistema el que decida donde proyectar el archivo. En cualquier caso, la función devolverá la dirección de proyección utilizada. El parámetro descriptor se corresponde con el descriptor del archivo que se pretende 
proyectar (que debe estar previamente abierto) y los parámetros despl y longitud establecen qué zona del archivo se proyecta: desde la posición despl hasta desp + longitud. El argumento protec establece la protección sobre la región que puede ser de lectura (PROT_READ), de escritura (PROT_WRITE), de ejecución (PROT_EXEC) o cualquier combinación de ellas. Esta protección debe ser compatible con el modo de apertura del archivo. Por último, el parámetro indicador permite establecer ciertas 
propiedades en la región: 
  • MAP_SHARED. La región es compartida. Las modificaciones sobre la región afectarán al archivo. Un proceso hijo compartirá esta región con el padre. 
  • MAP_PRIVATE. La región es privada. Las modificaciones sobre la región no afectarán al archivo. Un proceso hijo no compartirá esta región con el padre, sino que obtendrá un duplicado de la misma
  • MAP_FIXED. El archivo debe proyectarse justo en la dirección especificada en el primer parámetro, siempre que éste sea distinto de cero. 
En el caso de que se quiera proyectar una región sin soporte (región anónima), en algunos sistemas se puede especificar el valor MAP_ANOM en el parámetro indicador. Otros sistemas UNIX no ofrecen esta opción pero permiten proyectar el dispositivo /dev/zero para lograr el mismo objetivo.
    Cuando se quiere eliminar una proyección previa o parte de la misma, se usa el servicio munmap cuyo prototipo es:
       int munmap (caddr_t direc, size_t longitud); 
        Los parámetros direc y longitud definen una región (o parte de una región) que se quiere desproyectar.