IPC: Shared memory (SHM)

El Shared Memory (memoria compartida) es un mecanismo de comunicación y compartición de datos entre procesos en sistemas operativos. Permite que múltiples procesos accedan a una región de memoria común, lo que les permite intercambiar información de manera eficiente y sincronizada.

En el contexto del Shared Memory, una región de memoria se establece y se asigna en un área compartida, que puede ser accedida por varios procesos simultáneamente. Estos procesos pueden leer y escribir datos en la memoria compartida, lo que les permite comunicarse y colaborar entre sí.

**Memory Mapping (**nos permite conectar entre procesos relacionados)

El memory mapping (mapeo de memoria) es una técnica utilizada en sistemas operativos que permite que una región de memoria física sea asignada y accesible para un proceso como si fuera un archivo. En lugar de leer o escribir datos en un archivo tradicional utilizando llamadas al sistema como read() o write(), el memory mapping permite que el proceso acceda directamente a la memoria asignada y realice operaciones de lectura y escritura en ella.

**Wrapper (**objeto que identifica un archivo en alto nivel)

Es una entidad que encapsula o envuelve a otra entidad, proporcionando una interfaz más conveniente o abstrayendo los detalles de implementación subyacentes. El objetivo principal de un wrapper es simplificar o extender la funcionalidad de la entidad envuelta.

Algunos ejemplos comunes de wrappers son:

  1. Wrappers de bibliotecas: En el desarrollo de software, un wrapper puede ser utilizado para proporcionar una interfaz más fácil de usar y abstraer los detalles internos de una biblioteca o API. Esto puede incluir la simplificación de los métodos, la adición de características adicionales o la adaptación de la biblioteca para cumplir con requisitos específicos.
  2. Wrappers de código: Un wrapper puede envolver una porción de código existente para proporcionar una interfaz más amigable o para integrarse con otro sistema. Por ejemplo, se puede crear un wrapper alrededor de una función compleja o un bloque de código para facilitar su reutilización y promover la legibilidad del código.
  3. Wrappers de componentes: En el desarrollo de software modular, los wrappers pueden utilizarse para encapsular y proporcionar una interfaz coherente para interactuar con componentes individuales del sistema. Estos wrappers permiten abstraer los detalles internos de un componente y proporcionar una interfaz unificada para interactuar con él.

Nota: A nivel python yo escribo todo en alto nivel pero eso se traduce en funciones de bajo nivel

**os.ftruncate #** me permite extender la capacidad de tamaño de un archivo 

Por ejemplo:

Tengo 30b y lo agrando a 100b (ftruncate es de bajo nivel)

**file.resize # (usando resize)** → hace lo mismo pero en este caso te cambia el tamaño de la memoria mapeada (resize es de alto nivel)
mmap.mmap(-1, size) # mapeo anonimo