Tercer Corte

 

CORRECION PARCIAL 2 Dina.docx (118,7 kB)

Primer Quiz paginacion simple y algoritmos de ubicación.docx (21667)

Segundo Quiz Paginación simple.docx (21878)

Tercer Quiz memoria virtual I.docx (21848)

 

 

 

 

Memoria virtual.

La memoria virtual permite una multiprogramación muy efectiva y releva al usuario de las rígidas e innecesarias restricciones de la memoria principal.
Las ventajas de la memoria virtual son importantes. La cuestión es: ¿Funcionará este esquema? En un primer momento, se produjo un gran debate sobre este punto, pero la experiencia con numerosos sistemas operativos demuestra más allá de cualquier duda que la memoria virtual funciona. Por consiguiente, ha llegado a ser un componente esencial de la mayoría de los sistemas operativos actuales.
 
 
Para comprender cuál él es elemento clave y por qué la memoria virtual generó tanto debate, se va a considerar de nuevo la labor del sistema operativo con respecto a la memoria virtual. Considérese un proceso grande formado por un programa largo y un conjunto de series de datos. Durante un corto periodo, la ejecución puede estar reducida a una pequeña sección del programa (por ejemplo, una subrutina) y acceder sólo a una o dos series de datos. Si esto es así, sería un claro desperdicio cargar docenas de fragmentos para el proceso cuando se van a usar sólo unos pocos antes de que pase a estar suspendido o se descargue. Se puede aprovechar mejor la memoria cargando tan sólo unos pocos fragmentos. Además, si el programa se bifurca a una instrucción o hace referencia a datos de un fragmento que no está en memoria, se producirá un fallo de página. Este fallo le dice al sistema operativo que traiga el fragmento deseado.
  
 
 
 
 
 
Conjunto Residente
 
Gestión del Conjunto Residente
En la Gestión del conjunto residente el  SO debe decidir cuánta memoria asignar a un proceso (nº págs. a cargar en memoria principal). Factores que influyen en la decisión:
Cuanta menos memoria necesite cada proceso, mayor cantidad de procesos en memoria
Mayor probabilidad de procesos listos en memoria.
Si hay pocas páginas de un proceso en memoria, aumenta la probabilidad de FdP.  Por encima de un determinado tamaño, más memoria no tendrá un efecto notable (por principio de cercanía).
 
Tamaño del Conjunto Residente –Políticas
 Asignación Fija
Problemas: Desperdicia espacio si el proceso no necesita todos los marcos que se le han asignado.
Si el proceso necesita más marcos de los asignados, el proceso no podrá ejecutarse correctamente, aunque en el sistema haya muchos marcos vacíos.
Se da al proceso un número fijo de página en las que ejecutarse
Cuando ocurre un fallo de página, una de las páginas de ese proceso se debe reemplazar
Asignación variable
el número de páginas asignadas a un proceso varía durante el tiempo de vida del proceso
Un proceso con menos FdP. tendrá menos marcos. La asignación variable es más potente pero costosa (más trabajo del SO, que debe evaluar comportamiento de procesos dinámicamente)
Este tipo de asignación se relaciona con la Política de Alcance del Reemplazo
 
Alcance del Reemplazo
Reemplazo Local: se elige una página del proceso que originó el FdP.
Reemplazo Global: todas las páginas de la memoria son candidatas a reemplazar.
Sólo tiene sentido con Asignación Variable
 
ESTRUCTURAS DE CONTROL
 
NUMERO DE MARCO
NUMERO DE DESPLAZAMIENTO
Buffer de traduccion adelantada (TLB Translation Lookaside Buffer)
Es una memoria caché administrada por la MMU que contiene partes dela tabla de paginación, es decir, relaciones entre direcciones virtuales y reales.
•          Contiene aquellas entradas de la tabla de páginas usadas hace menos tiempo.
•          Hay TLBs unificadas y separadas (datos e instrucciones)
 
MMU (Unidad de gestión de memoria): es un dispositivo de Hardware formado por un grupo de circuitos, responsable del manejo de los accesos a la memoria por parte de la Unidad de Procesamiento Central (CPU).
 
Memoria 2: primer mega del sistema operativo
Memoria Cache: L1 L2
 
Almacenamiento Magnético: Disquetes, Discos Duros, Cintas, Zip drive
Almacenamiento Óptico: CD, DVD, Blue Ray
Almacenamiento Electrónico: Memoria Cache, USB, SD, Memory Stick Pro Duo
 
Estructura de la tabla de páginas
 
El mecanismo básico de lectura de una palabra de la memoria supone la traducción por medio de la tabla de páginas de una dirección virtual o lógica, formada por un número de página y un desplazamiento, a una dirección física que está formada por un número de marco y un desplazamiento.
Con la memoria virtual, la CPU produce direcciones virtuales que son traducidas por una combinación de hardware y software a direcciones físicas, pues pueden ser utilizadas para acceder a memoria principal. Este proceso se denomina correspondencia de memoria o traducción de direcciones. 
 
 
 
Buffer de traducción adelantada
 
Cada referencia a la memoria virtual puede generar dos accesos a la memoria: uno para obtener la entrada  de la tabla de páginas correspondientes y otro para obtener el dato deseado.
 
Un esquema sencillo de memoria virtual podría tener el efecto de doblar el tiempo de acceso a la memoria. Para solucionar este problema, la mayoría de los esquemas de memoria virtual hacen uso de una cache especial para las entradas de la tabla de páginas, llamada generalmentebuffer de traducción adelantada (TLB,Translation Lookaside Buffer) que contiene aquellas entradas de la tabla de páginas usadas hace menos tiempo.
Algoritmos básicos de reemplazo:
•         Política óptima:
–        Selecciona para reemplazar la página que tiene que esperar una mayor cantidad de tiempo hasta que se produzca la referencia siguiente.
–        Es imposible de implementar porque requiere que el sistema operativo tenga un conocimiento exacto de los sucesos futuros.
 
“Pagina candidata: pagina seleccionada para asignar un marco para poner una página referenciada ..”
 
•         Política del reloj:
–        Requiere asociar un bit adicional a cada marco, denominado bit de uso.
–        Cuando se carga una página por primera vez en un marco de memoria, el bit de uso de dicho marco se pone a cero.
–        Cuando se hace referencia a la página posteriormente, el bit de uso se pone a 1.
–        Cuando llega el momento de reemplazar una página, el primer marco encontrado con el bit de uso a 0 es reemplazado.
–        Durante la búsqueda para realizar reemplazos cada bit de uso a 1 se cambia a 0. 
 
Gestion de memoria y acceso a datos
 
·         La gestión de memoria es uno de los aspectos mas complicados del sistema O.
·         Gestion de memoria implica traer y llevar bloques de datos de memoria secundaria.
·         El S.O es encargado de las siguientes actividades relacionadas con la gestión de memoria:
-          Saber cuales partes de la memoria se están usando actualmente  y quienes las están usando
-          Decidir cuales procesos se cargaran en la memoria cuando se disponga de espacio.
-          Asignar y liberar espacio de memoria según se necesite.
 
REQUISITOS GESTION DE MEMORIA 
organizacion fisica organizada en dos niveles
MEMORIA PRINCIPAL
ofrece un acceso rapido con un costo demasiado alto, volatil y no proporciona almacenamiento permanente.
MEMORIA SECUNDARIA:es de acceso mas lento y no es volatil como la memoria principal,permitiendo almacenamiento a largo plazo.
 
Los objetivos que tiene :
 
1- Reubicacion : se basa principalmente en traducir las direcciones logicas a direcciones fisicas, hace referencia al hecho de poder localizar a los programas para su ejecucion en diferentes zonas de memoria se conocen dos tipos :
 
REUBICACION ESTATICA: se realiza antes o durante la carga del programa en memoria y sus programas no pueden ser movidos despues de iniciados
 
REUBICACION DINAMICA:Los programas pueden moverse en tiempo de ejecucion ademàs necesita un hardware adicional,esquema de gestion de memoria,memoria virtual ,maquina desnuda etc.
 
COMPARTIMIENTO: permite el acceso a varios procesos a la misma zona de la memoria, principal para poder compartir y actualizar estructuras de datos comunes
 
MEMORIA DIRECCIONABLE: LaMemoria del contenido direccionable, es un tipo de memoria de computador empleada en determinadas aplicaciones que requieren velocidades de búsqueda muy elevadas.
PARTICIONES FIJAS
Consiste en dividir la memoria libre en varias partes de igual tamaño o de diferentes tamaños Un programa puede ser demasiado grande para caber en la partición. En este caso, el programador debe diseñar el programa mediante superposiciones, para que sólo una parte del programa esté en memoria principal.
En el caso de particiones de igual tamaño, si todas las particiones estuvieran ocupadas con procesos que no están listos para ejecutar y necesita cargarse un nuevo proceso, debe determinarse qué partición expulsarse de memoria
Asignación de memoria con particiones fijas: consiste en el proceso de asignar memoria en tiempo de compilación antes de que el programa asociado sea ejecutado
PARTICIONES DINAMICAS
Consiste en particiones de memoria de tamaños variable, es decir, a cada proceso se le asigna la cantidad de memoria que necesita deben utilizarse algunos algoritmos para la ubicación de procesos en las particiones. Estos algoritmos son:
Mejor ajuste (Best-fit): se elige el bloque con el tamaño más parecido al del proceso entrante.
Primer ajuste (First-fit): comienza recorriendo la memoria desde el comienzo y escoge el primer bloque disponible en el que entre el proceso entrante
Siguiente ajuste (Next-fit): recorre la memoria desde el lugar de la última ubicación y elige el siguiente bloque disponible que sea suficientemente grande.
ALGORITMOS DE UBICACION:
 
1.EL PRIMER AJUSTE (Best-fit) se elige el bloque con el tamaño mas parecido al del proceso entrante,se dice que es el menos eficiente, necesita un apuntador que recorre la memoria de la parte superior a la parte inferior ubicando huecos en el momento que el hueco sea determinado  se ubica en el
 
proceso y termina.

2.SIGUIENTE AJUSTE:  Best Fit (Mejor ajuste): Selecciona el bloque disponible de tamaño más próximo al solicitado.
requiere un registro que guarda la ubicacion del procesador que guarda el ultimo ajuste 
 
3.MEJOR AJUSTE 
Elmejor ajuste se refiere a tener la disponibilidad de huecos  posibles y organizar la lista que tenga mayor tamaño pero menor tiempo solicitado


imagen tomada de https://chsos20122910022.wordpress.com/2012/10/11/particiones-variables/
PEOR AJUSTE 
 
se dice que es el mejor algoritmo , guarda la posicion de bloque de memoria, una de sus grandes ventajas es su rapidez evitando la fragmentacion 

PAGINACION Y SEGMENTACION DE MEMORIA VIRTUAL
PAGINACION  MEMORIA VIRTUAL
La paginación permite que la memoria de un proceso no sea contigua, y que a un proceso se le asigne memoria física donde quiera que ésta esté disponible.
La paginación evita el gran problema de acomodar trozos de memoria de tamaño variable en el almacenamiento auxiliar.
Cuando es necesario intercambiar fragmento de códigos o datos que residen en la memoria principal, hay que encontrarles espacio en el almacenamiento auxiliar. Por sus ventajas la paginación es de uso común en muchos SO.
la ventaja de la paginación es la posibilidad de compartir código común. Tiene mucha importancia en un entorno de tiempo compartido.
Caracteristicas de la paginacion 
1.El espacio de direcciones logico de un proceso puede ser no continuo.
2.Se divide la memoria fisica en bloques de tamañno llamados marcos(Frames ).
3.Se divide la memoria en bloques de tamaño llamados paginas.
4.se mantiene informacion en los marcos libres.
5.Para correr   un  programa de en paginas de tamaño, se necesitan encontrar n marcos y cargar el programa..
6.Se establece una tabla de paginaspara trasladar las direcciones logicas a fisicas.
7.se produce fragmentacion interna.
VENTAJAS DE LA PAGINACION
 
1.Es posible comenzar a ejecutar un programa, cargando solo una parte del mismo en memoria , y elresto se cargara bajo la solicitud 
2.No es necesario que las paginas esten en memoria, por lo que no se necesitan procesos de compactacion cuando existen marcos de paginaslibres dispersos en la memoria.
3.Es facil controlar todas las paginas ya que tienen el mismo tamaño.
El mecanismo detraduccionde direcciones (DAT)    permite separar los conceptos de espacio de direcciones y espacios de memoria .
Todo el mecanismo es transparente al usuario.
 
DESVENTAJAS DELA PAGINACION
el costo de hardware y software se incrementa, por la nueva informacion que debe manejarse y el mecanismo de traduccion de direcciones necesario.
se consumen muchos mas recursos de memoria, tiempo en el cpu para suimplantacion
 
Se deben reservar areas de memora para las PMT delos procesos.al no ser fijo de estas, se crea un problema semejante al de los programas(como asignar un tamaño optimo sin desperdicio de memoria.


 
SEGMETANCION-MEMORIA VIRTUAL
La segmentación permite al programador contemplar la memoria como si constara de varios espacios de direcciones o segmentos. Los segmentos pueden ser de distintos tamaños, incluso de forma dinámica. Las referencias a la memoria constan de una dirección de la forma (número de segmento, desplazamiento).
Permite modificar y recopilar los programas independientemente, sin que sea necesario recopilar o volver a montar el conjunto de programas por completo.
un segmento puede ser construido para albergar un conjunto de procedimientos y datos bien definido, el programador o el administrador del sistema podrá asignar los permisos de acceso de la forma adecuada.
Fragmentación interna y externa
  • Aprovechamiento subóptimo de la memoria.
  • Fragmentación interna:memoria asignada que no se utiliza.
  • Fragmentación externa:memoria desocupada que no puede aprovecharse para dar cabida a nuevos procesos.
 
Fragmentación externa: fragmentación externa ocurre cuando un algoritmo de asignación de memoria dinámica asigna memoria y se deja una pequeña pieza más que no se puede utilizar con eficacia. Si se produce demasiada fragmentación externa, se reduce drásticamente la cantidad de memoria. Espacio de memoria total para satisfacer una solicitud, pero no es contiguo.
Fragmentación interna: fragmentación interna es el espacio perdido dentro de bloques de memoria asignada por la restricción en los tamaños permitidos de bloques asignados. Memoria asignada puede ser ligeramente mayor que la memoria solicitada; Esta diferencia de tamaño es la memoria interna a una partición, pero no se utiliza.
 
 MEMORIA VIRTUAL Y CERCANÍA DE REFERENCIA
MEMORIA VIRTUAL
La memoria virtual es una técnica que permite que el so disponga de una mayor cantidad de memoria mayor a la que hay disponible físicamente, la memoria virtual mueve datos de la RAM a un espacio llamado archivo de paginación. Al mover datos al archivo de paginación y desde él, se libera RAM para completar la tarea.
La memoria virtual combina la RAM del quipo con especio temporal en el disco duro, cuando queda 
poca RAM la memoria virtual mueve de la RAM a un espacio archivo de paginación una vez están allí se libra RAM para completar la tarea
ERROR DE PÁGINA
Se recibe un mensaje de error avisando de un nivel de memoria virtual bajo ,por esto se agrega mas RAM o aumenta el tamaño de archivo de paginación para poder ejecutar los programas en el equipo
HIPERPAGINACIÓN
Sucede cuando se utiliza una gran cantidad de recursos para hacer una cantidad de trabajos cada vez menor
Se refiere a cuando se cargan y descargan sucesiva y constantemente partes de la imagen de un proceso desde y hacia la memoria principal a otro proceso listo
CERCANIA DE REFERENCIA
Es el agrupamiento de las lecturas de memoria por medio de la unidad central de procesamiento, también implica que para que un programa se ejecute no son necesarias todas sus páginas cargadas en la memoria principal
Direccionamiento absoluto: Consiste en direccionar una posición de memoria de forma directa, esto es, que la dirección hace referencia directamente a dicha posición sin tener que realizar cálculos adicionales para la EA
Direccionamiento relativo: Cuando para direccionar una posición de memoria se hace referencia a otra sobre la cual se especifica un incremento o decremento, es decir, se requiere otro dato para el cálculo de la dirección efectiva.

Fallos de páginas
Como hemos visto anteriormente, cuando un proceso requiere una página que no está en memoria se genera un fallo de página. La gran mayoría de las dificultades de la paginación por demanda se deben a cómo los fallos de página son tratados.
 
 
Gestión de un fallo de página
 
 
 
 
En primer lugar, para que los fallos de página puedan ser tratados correctamente necesitamos un sistema que sea capaz de reiniciar una instrucción, de esta manera pasará lo siguiente:
 
 
  • Una instrucción necesita una página que no está en memoria.
  • Se genera fallo de página (No se puede satisfacer la instrucción).
  • Se carga a memoria la página requerida.
  • Se reinicia la instrucción
Como vemos en este proceso existe una carga a memoria, éste es uno de los factores determinantes para saber si la paginación por demanda es conveniente o no, puesto que, en el peor de los casos, puede existir una carga en memoria por instrucción lo que nos daría tiempos de ejecución mucho peores que con una paginación regular.
Rendimiento de la paginación por demanda
Para calcular el tiempo de acceso efectivo (tae) de un sistema de paginación por demanda debemos conocer los siguientes datos:
  • p: Probabilidad de que ocurra un fallo de página (0
  • am : Tiempo de acceso a memoria. Si no existen fallos de página el tiempo de acceso estará dado solo por el tiempo de acceso a memoria de una paginación normal, que es el doble de un acceso a memoria (un acceso a la tabla de páginas y otro a la dirección de memoria).
  • fp: Tiempo de fallo de página: Si existe un fallo de página se debe leer del disco la página solicitada y luego acceder a ésta, este proceso tiene los siguientes pasos:
  1. Se encuentra la referencia inválida.
  2. Se guarda el contexto del proceso.
  3. Se verifica que la dirección de memoria sea válida.
  4. Se lee del disco la página necesitada.
  5. Se corrige la tabla de página y demás tablas.
  6. Restablecer el contexto y reiniciar la instrucción.
En todo este proceso se puede perder aún más tiempo ya sea por la complejidad de la instrucción, errores de lectura del disco u otros. Debido a esto, la CPU, puede ser asignada a otro proceso mientras ser obtiene la página a utilizar.
Entonces con estos datos tenemos: tae = (1-p)\cdot am + p \cdot fp
Del planteamiento anterior notamos que el tiempo de un fallo de página (mseg) es mucho mayor al tiempo de acceso de memoria (nseg), por lo cual la paginación por demanda, en términos de tiempo, no será conveniente.
Aún a pesar de todas estas dificultades los sistemas de paginación por demanda son muy utilizados puesto que los beneficios que nos dan son mucho mayores a la disminución de velocidad, siempre y cuando podamos mantener el promedio de fallos de paginación a solo uno entre millones de accesos.
Tratamiento de fallos de páginas
Para lograr un rendimiento aceptable del sistema de paginación por demanda debemos mantener la tasa de fallos de página al mínimo. Existen diferentes enfoques para su disminución:
Algoritmos para el reemplazo de páginas
 
 
Ejemplo de Algoritmo Óptimo
 
 
 
 
Cuando debemos cargar una página a memoria pero tenemos todos los frames ocupados necesitamos reemplazar el contenido de alguno de ellos por la información requerida. Para seleccionar cual es la mejor opción para hacer este cambio existen los siguientes algoritmos:
 
 
 
  • Algoritmo óptimo: Consiste en quitar de memoria la página que no será utilizada en más tiempo. Es solo un algoritmo teórico, su implementación es imposible pues no podemos saber el futuro. Sirve para analizar los demás algoritmos al compararlos con este.
     
     
    Ejemplo de Algoritmo FIFO
     
  •  
  •  
     
 
 
 
  • FIFO (First in first out): Como su nombre lo indica, la primera página que fue cargada a memoria es la primera en salir de esta. Su implementación es simple e intuitiva, se utiliza una cola para ordenar las páginas pero, al solo priorizar el orden de entrada es ineficiente. La anomalía de Belady nos muestra que al agregar frames pueden ocurrir más fallos de página pues se puede quitar del archivo de paginación información que es fuertemente usada solo por el hecho de haber ingresado antes.
     
     
    Ejemplo de Algoritmo LRU
     
  •  
  •  
     
 
 
 
  • LRU (Least recently used): Plantea quitar de memoria las páginas menos usadas recientemente, para ello, ordena las páginas poniendo arriba las que fueron usadas recientemente y va reemplazando por las páginas que se sitúan abajo. Puede ser implementado mediante varios métodos que intentan aminorar los recursos que este método consume, pero, en la actualidad, aunque posea un buen rendimiento teórico, no es conveniente pues consume demasiados recursos.
     
     
    Ejemplo de Algoritmo Segunda Oportunidad
     
  •  
  •  
     
 
 
 
  • Segunda oportunidad: Mejora del algoritmo FIFO. Se agrega un bit de referencia a todas las páginas y cuando éstas son utilizadas se fija en 1. El algoritmo consiste en buscar las páginas de la misma manera que lo hacemos en FIFO. Si la página que tenemos al final de la cola tiene su bit de referencia en 0 es reemplazada normalmente, pero si su bit de referencia vale 1 éste es cambiado a 0 y se intenta quitar la siguiente página con el mismo criterio.
 
  • LFU (Least frequently used): Algoritmo de conteo. El contador aumenta con cada referencia a la página, a la hora de reemplazar elige la página con el menor contador. Es caro de implementar y no se aproxima al algoritmo óptimo.
 
  • MFU (Most frequently used): Algoritmo de conteo. El contador aumenta con cada referencia. Nos dice que probablemente la página con menor contador será utilizada próximamente y se basa en esto para hacer el reemplazo. Es un algoritmo caro respecto a su implementación y se aleja del algoritmo óptimo.
Asignación de frames
Existen dos esquemas para determinar cual es el número de frames que tendrá cada proceso para su paginación:
  • Asignación fija:
    • igualitaria: Si existe un determinado número de frames m y un número de procesos n a cada proceso le correspondenm / n frames.
    • proporcional: Se asigna una cantidad de frames acorde al tamaño del proceso. Con tn como el tamaño del proceso,stn como la suma del tamaño de todos los proceso y m como el número de frames obtendremos la número de frames para cada proceso mediante: tn\cdot stn/m
  • Asignación por prioridad: Funciona como la asignación por prioridad, pero en vez de utilizar el tamaño de los procesos usa la prioridad de los mismos.

El proceso de reemplazo de página puede darse de manera local o global, es decir, si un proceso necesita hacer un reemplazo el enfoque local le obliga a hacerlo en sus propios frames, mientras que el global le permite usar algún frame de otro proceso con prioridad más baja.
https://wiki.inf.utfsm.cl/index.php?title=Paginaci%C3%B3n_por_demanda_y_Fallos_de_P%C3%A1ginas
 
 
HIPERPAGINACION

-Memoria virtual y cercanía de referencia:
Memoria virtual, la memoria virtual se debe aumentar cuando los programas consumen demasiados recursos de la máquina, aunque es recomendable aumentar la memoria RAM.
Tipos de memoria:  Virtual y Física
Cercanía de referencia: es la utilización de diferentes tecnologías para lograr un desempeño favorable, se utiliza dos localías una cercana y otra localía lejana, estas las utiliza el programador a la hora de hacer función de intercambio ya que por ejemplo al momento de referenciar una página web se traen también las paginas cercanas y luego cuando no está en las q se trajeron se trae esa lejana con su grupo de cercanas.
- Hiperpaginacion: se produce cuando el procesador pasa más tiempo paginando que ejecutando los procesos que requiere el usuario. Este es un problema del sistema del proceso virtual. Una posible solución es la ampliación de la memoria RAM.
- Fallo de página: hay ocasiones en la memoria que no encuentra el fragmento necesario en la memoria principal y se da el intercambio de página si esto se produce mucho se da la hiperpaginacion.
FUNCION DE INTERCAMBIO
El espacio de intercambio es una zona del disco (un fichero o particion) que se usa para guardar las imágenes de los procesos que no han de mantenerse en memoria fisica. 
                                                                                                   TLB

CARGA Y MONTAJE
CARGA
Es el proceso por el cual un modulo es llevado a la memoria principal comenzando a ubicarlo en la posición x y satisfaciendo ciertas condiciones para conseguirlo se puede realizar de tres maneras distintas.
  1. Carga absoluta
  2. Carga reubicable
  3. Carga dinámica en tiempo de ejecución
 
MONTAJE
Montaje Es realizado por un montador el cual toma varios módulos objetos y Los ensambla en un único modulo de carga que luego sería llevado a memoria , el montador se encarga de concatenar los distintos módulos objetos talque aquellos que hagan referencia a otros módulos ya solo hagan referencias a una posición relativa dentro del modulo de carga.
La función de un montador es tomar como entrada una colección de módulos objeto y generar un modulo de carga que contenga un conjunto de módulos de programa y datos para el cargador, el montador crea un único modulo de carga que es la unión de todos los módulos objetos.

.