anchor.diff:  
   ==== What is I/O Multiplexing?
   
  -Es la capacidad para indicarle al kernel que queremos ser notificados si uno o mas operaciones de IO están listas.
  +Es la capacidad para indicarle al kernel que queremos ser notificados si una o mas operaciones de IO están listas.
   Algunas funciones como select, poll, epoll (linux) and kqueue (bsd) nos proveen esta funcionalidad.
   
   ==== Why Multiplexing?
  
positive.code: 
  Un proceso ejecuta instrucciones en dos modos distintos, ya sea a nivel de aplicación o a nivel de kernel, ya
  que ciertas acciones necesitan mas privilegios que otras. Esto para el usuario es transparente pero hacer el switch
  de un modo al otro es costo.
  
  * *Kernel mode:* El código que se esta ejecutando tiene acceso completo e ilimitado al hardware subyacente.
  Este puede ejecutar cualquier instrucción y referenciar cualquier dirección de memoria. Este modo es reservado
  funciones de bajo nivel del sistema operativo. Cualquier crash en este nivel seria catastrófico y detendría la PC.
  
  * *User Mode:* El código que se esta ejecutando no tiene la capacidad de acceder a hardware o memoria sin delegar estas
  acciones en una llamado a un API del sistema (system call). Debido a esta separación los crash a este nivel son
  recuperables, la mayoría del código se ejecuta en este nivel.
  
  image::images/ProtectionRings.png[]
  
  == Models
  
  Iremos explicando cada modelo junto con una imagen y las descripción de lo que sucede.
  
  _Nota: Las imágenes son de un ejemplo de socket UDP ya que el concepto de data being "ready" es mas simple_
  
  
negative.code: 
  * Cuando el datagrama esta listo, la señal _SIGIO_ es generada para nuestro proceso. Podemos:
  
  ** Leer el datagrama desde el _signal handler_ llamando a _recvfrom_ y luego notificar al loop principal de que los datos estan listo en el buffer de la aplicación.
  
  ** Notificar al loop principal y dejar que este lea el datagrama.
  
  Sin importar como manejamos la señal, la ventaja de este modelo es que no estamos bloqueados mientras esperamos que el datagrama llegue. El loop
  principal puede continuar ejecutando y solo esperar a ser notificado por el _signal handler_ que hay mas datos para ser procesados o leídos.
  
  === 5. Asynchronous I/O (AIO)
  
  *Asynchronous I/O* esta definido en la especificación POSIX _(Portable Operating System Interface)_. La idea es indicarle al kernel
  que comience una operación de IO y que este nos notifique cuando toda la operación haya finalizado (Incluyendo la copia de los datos
  del buffer del kernel al buffer de la aplicación).
  
  +++<u>La principal diferencia entre este modelo y el <i>signal-driven I/O</i>, es que el kernel nos indica que la operación de IO puede ser iniciada, pero con AIO el kernel nos indica que la operación esta completa.</u>+++
  
  