---
# System prepended metadata

title: 'SO: Resumen'

---

SO: Resumen
===

[TOC]

# Sistema operativo
Es el programa que controla todos los recursos de la computadora y establece la base sobre la que pueden escribirle los programas de aplicacion. También es un programa que controla la ejecucion de aplicaciones y programas, hace de interfaz entre apps y hardware.

* Debe ser: 
    * Eficiente -> Administrando recursos
    * Robusto -> Contra programas q funcionan mal

* Tipos:
    1. Por lote
    2. Propositos generales
    3. Paralelos
    4. Distribuidos
    5. De tiempo real
    6. Embebidos

* Arquitecturas
    * Monoliticos
    * Monoliticos y modulares
    * Monoliticos en capas
    * Maquinas virtuales

> **Registros privilegiados**: Solo son accesibles en modo privilegiado
> **Modo privilegiado**: Se accede via interrupciones o tramas de kernel
> **Instrucciones privilegiadas**: Se utilizan para utilizar registros privilegiados. Incluyen las no privilegiadas
> Algunos procesadores tienen varios niveles de privilegios.

## Manejo de E/S
* **Por estado**: El procesodr interroga
* **Por interrupciones**: El dispositivo de E/S emite la interrupcion 
    * Controlada por programa: el proce las maneja
    * Iniciado por programa: las maneja el DMA, no usa CPU, pero tiene tiempo de acceso a memoria
    * Controlado por canal: las maneja un canal dedicado, un micro-procesador a parte



# Memoria
![](https://cdn.discordapp.com/attachments/835912758939484161/989615504807305286/unknown.png)

> **Cache write through**: Actualizacion de memoria cache y lenta
> **Delayed write**: Actualizacion de memoria cache, pero posterga la lenta
> 
# Planificador de procesos
La planificacion de procesos es una herramienta del sistema operativo para dictarle al procesador en que orden se tienen que ejecutar los procesos entrantes.

> **Proceso**: una instancia de programa en ejecucion.

## Diagrama de estado
![](https://i.imgur.com/16xAJA7.png)
Los estados mas importantes son el de **ready**, **running** y **blocked**:
1. Ready: listo para la ejecucion, **espera a la CPU.**
2. Running: ejecutandose, **posee la CPU**.
3. Bloqueado: no esta listo para ejecutarse, esta **esperando un recurso**.

## Cambio de contexto
Es lo que hace el procesador cada vez que cambia el proceso que se encuentra en **ejecucion**, y consiste en:
1. Guarda el estado del proceso o hilo en ejecucion. (Registros)
2. Carga el estado del nuevo proceso o hilo a ejecutar.
3. Repite...

> El cambio de procesos puede ser caro si es que se sobrecarga la memoria, por lo que para un proceso es siempre preferible continuar con la misma CPU.

## Tipos de planificacion
Encontramos de 3 tipos:
![](https://i.imgur.com/hif4ALd.png)

**Planificacion a largo plazo:** Planificacion del conjunto de procesos a ser ejecutados.
**Planificacion a mediano plazo**: Planificacion del conjunto de procesos a mantener en la memoria principal.
**Planificacion a corto plazo**: Planificacion de la asignacion de la CPU.

## Criterios de planificacion
> Imagen porque no sabemos si incluirlo o no...

![](https://i.imgur.com/nDIFpTt.png)

---

# Hilos
Un hilo es un proceso ligero, que ejecuta una secuencia de tareas. Tambien conocido como una secuencia de tareas encadenadas muy pequeñas.

![](https://i.imgur.com/95YdtKm.png)

## Ventajas
1. Menor tiempo de creacion que un proceso.
2. Menor tiempo de finalizacion.
3. Menor tiempo para cambiar entre 2 hilos.
4. Los hilos comparten el **mismo espacio de memoria**. Para evitar la interferencia entre hilos es necesario utilizar tecnicas de **sincronizacion**, que se ven mas adelante.
5. **La comunicacon entre hilos es mas facil que la de procesos, ya que no requiere participacion del kernel.**

## Tipos de hilos
### Hilo a nivel usuario
Un hilo a nivel usuario se maneja completamente en espacio de usuario, por lo que el kernel no sabe que existe.

#### Ventajas
1. No requiere llamadas al sistema.
2. La conmutacion entre hilo es rapida.
3. Se pueden implementar en un sistema operativo que no maneje hilos.

#### Desventajas
1. Un solo procesador.
2. Problemas con las llamadas bloqueantes.
3. Bloqueos en llamadas al sistema.

### Hilo a nivel kernel
El kernel es el que planifica y administra los hilos.

#### Ventajas
1. No se necesita un planificador de procesos.
2. Si un hilo se bloquea, el kernel puede activar otro.
3. Con esto se logra el verdadero paralelismo.

#### Desventajas
1. Costo de creacion y destruccion alto.
2. Alto costo de conmutacion.

---

# Interrupciones
Se pueden dar por software o hardware. Estas interrumpen el estado del sistema, haciendo que la CPU deje de hacer lo que estaba haciendo para gestionar la interrupcion.
Al recibir una interrupcion, la CPU guarda el estado y hace el cambio de contexto, disparando la rutina de servicio de interrupcion.

### Control de interrupciones
* Agrupamiento 
* Codificacion
* Priorizacion
* Habilitacion/Deshabilitacion


## Rutina de servicio de interrupcion
* Guarda los registros esenciales de la CPU.
* Salta a la rutina de servicio de interrupcion (maneja la interrupcion).
* Recupera los registros esenciales al retornar.

# Concurrencia
> Proceso determinista: Es cuando podemos predecir el resultado del proceso. En otras palabras, su ejecucion va a ser la misma siempre.

## Soluciones 
### Exclusion mutua usando regiones criticas
La exclusion mutua consiste en que un proceso, si quiere utilizar una variable, la bloquea de acceso para el resto de procesos o hilos.

> **Region critica**: parte del programa donde se acceden a variables compartidas.

![](https://i.imgur.com/xcuZHV3.png)

### Por software
#### Busy wait
Incorporamos un bucle while con una condicion, hasta que termine de ejecutar la operacion. El lado negativo, es que consume muchos recursos, ya que mantiene al procesador evaluando constantemente la condicion.

#### Alternancia estricta
Lo que hace es imponer un orden. Lo que hace es mientras uno de los bucles se esta ejecutando, el otro no se va a poder ejecutar hasta que el primero finalice su operacion.

```c=
int turn = 0;

while (TRUE) {
    while (turn != 0) {} // BUSY WAIT
    critical_region();
    turn = 1;
    noncritical_region()
}

while (TRUE) {
    while (turn != 1) {} // BUSY WAIT
    critical_region();
    turn = 0;
    noncritical_region()
}
```

#### Solucion de Peterson
No nos sirve para usos practicos, y el profe dijo que era inutil ya que nos sirve para 2 procesos unicamente. 

Sirve para mencionarlo y poco mas xd.
### Semaforos
### Transferencia de mensajes
Consiste en utilizar una tuberia (pipe), donde tengamos 2 procesos comunicados, siendo 1 que mande el mensaje y el otro que quede bloqueado hasta que se haga la lectura o escritura.

### Interbloqueo

El interbloqueo puede ser definido como "el bloqueo permanente" de un conjunto de procesos que compiten por recursos del sistema o se comunican entre sí.
Un conjunto de procesos esta interbloqueado cuando cada proceso se bloquea esperando un evento(por lo gral que se libere algun recurso) que solo puede ser generado por otro evento bloqueado del conjunto.

![](https://i.imgur.com/QzOu5cn.png)
#### Condiciones

1. Exclusion mutua
2. Retencion y espera
3. No apropiacion
4. Cola circular

**Las condiciones 1 a 3 son necesarias pero no suficientes para que se de un interbloqueo.**

#### Maneras de tratarlo

1. Impedir/Prevenir que ocurran: Eliminando alguna de las condiciones necesarias.
    * Generalmente es muy costoso
2. Evitar que ocurran: Permite que se den todas las condiciones, pero realiza tareas para que no ocurran. Por ejemplo solicitar informacion de que tipo re cursos requiere un proceso antes de dejarlo iniciar.
3. Detectar y recuperar: El sistema debe autoexaminarse periodicamente para detectar interbloqueos y eliminarlos.
4. Ignorarlos.

# Comunicacion entre procesos
* **Señales**: Interrupciones de software
* **Tuberias**: Canal unidireccional
* **Sockets**: Punto de comunicacion entre multiples procesos, de propositos generales

## Tuberias 
Solo existen entre procesos con mismo padre (el que crea la tuberia)

## Sockets
Tienen llamadas de funciones asociadas. 
La API consiste en:
* Formato de direcciones para familias de protocolos de red
* Funciones para crear, nombrar, conectar y destruir
* Funciones para convertir nombres legibles en direcciones y viceversa
* Funciones para enviar y recibir datos
* Funciones para multiplexar la E/S en varios sockets

Tipos de sockets:
* De flujo: flujo de bytes
* Datagramas: mensajeria no confiable
* En crudo: enviar y recibir datagramas en crudo

# Administracion de memoria

* **Memoria Principal RAM:**
    * Conjunto ordenado de palabras o bytes
    * Cada palabra o bryte tiene una direccion unica
    
    **El SO** es en encargado de:
    * Asignar y liberar regiones de memoria
    * Decidir que procesos se cargan en la mem
    * Controla y supervisa el uso
    **MMU:** 
    * Mapea el espacio de direcciones logicas en el espacio de direcciones fisicas
    * Asignacion dinamica de memoria para procesos
    * Memoria compartida
    * Proteccion contra accesos erroneos/no autorizados
    
* Swaping: Cuando pasamos algo de la memoria principal a una mas lenta(disco) cuando no nos alcanza la memoria.
    * El planificador **NO** los debe considerar ejecutables
    
    
## Tipos de Asignacion:

* **Segmentacion**
    * Segmentos llamados overlays
    * Distintos segmentos pueden tener distintos derechos de acceso(ro/rw)
    * Fragmentacion externa
    * Las distintas estrategias de posicionado pueden cambiar la edifiencia y comportamiento.

* **Asignacion Contigua:** 
    * Se almacena la direccion base y la direccion limite
    * Hay 2 tipos
        * Particiones Estaticas(fragmentacion interna)
        * Particiones dinamicas(fragmentacion externa)
            * Requiere compactacion para combatir la frag externa.
    * Estrategias de busqueda de huecos:
        *  First fit: Asigna el primer hueco con espacio suficiente
        *  Next fit: Asigna el primer hueco con espacio suficiente desde la ultima busqueda
        *  Best fit: Asigna el hueco mas pequeño pero suficiente.
        *  Worst fit: Asigna el hueco mas grande.
    * Sistema de colegas(No se si lo explicó)
        * Los huecos siempre tienen tamaño 2^i 
        * Hay una lista para cada i
        * 2 huecos de la lista i se pueden combinar para tener uno de la lista i+1(porque es potencia de 2)
        * 1 hueco de la lista i se puede dividir en 2 huecos de la lista i-1
        * **Son rapidos porque se busca en listas pequeñas**
        * Es el algoritmo que usa malloc()

* **Paginación:**
    * La memoria *fisica* se organiza en marcos
    * La memoria *logica* se organiza en paginas
    * Las paginas se mapean a marcos utilizando una **tabla de pagina**
    * Las paginas **no necesariamente** tienen que estar contiguas(pueden estar en cualquier parte de la memoria)
        * Pros:
            * No hay fragmentacion externa y no se necesita compactacion
            * Las paginas de tamaño fijo pueden ser movidas dentro/fuera de la mem principal
    * Las **direcciones logicas** estan compuestas por 2 componentes (p, d) donde p indica el indice en la tabla de paginas(que pagina es) y d es el corrimiento(offset) dentro de la pagina p
    * La **direccion fisica** esta compuesta por 2 comp (f,d) donde f es el numero de marco y d es el corrimiento dentro del marco.
    ![](https://i.imgur.com/bhiuXRr.png)

            * Ambas son generalmente en hexa(por ej 0xpppddd)


    * **Propiedades**
        * La traduccion tiene q ser rapida
        * La tabla de paginas puede requerir mucho espacio(direcciones de 32 bits con paginas de 4096 bytes necesita 1 millon de entradas)
        * Se debe incluir informacion adicional en la tabla:
            * Bit de proteccion(lectura/escritura/ejecucion)
            * Dirty bit(con valor si la pag se modifico y hay q cambiarlo en la otra mem)
        * No es necesario tener todas las pag en la memoria principal para que se ejecute el programa.
        * Cuando el programa necesita una pag que no se encuentra en memoria se produce un **fallo de pagina**
        ![](https://i.imgur.com/EWYeUj0.png)
        
    * **Caracteristicas**
        * Fragmentacion interna limitada(solo la ultima pag)
        * Los fallos de pag son costosos(son lentos)
        * Intentar asegurar que las paginas "esenciales" de un proceso *esten siempre en memoria*
        * Tratar de seleccionar paginas usadas(victimas) que *no se usen en el futuro*
        * Mientras se resuelve el fallo de pagina *ejecutar otros procesos*
        * *Trashing:* El sistema esta ocupado swapeando paginas de memoria y no hace tareas utiles
    * Translation Lookaside Buffer(TLB)
        * Una especie de cache pero solo de paginas

    ![](https://i.imgur.com/FnH36uy.png)
    
* **Memoria Virtual**
    * 