# Shared Memory Applications

> eXtremeDB allows two or more processes in a multi-processing operating environment (for example, Linux and Windows platforms) to share a common database.

> ## Overview

> In order to share the data between multiple processes, the database must be created in shared memory. Multiple threads within a process share the memory of that process. The shared memory that is used by the eXtremeDB runtime is architecture and operating system dependent. In some environments, the eXtremeDB runtime uses a System V shared memory mechanism (for example, Sun Solaris and Linux) while for others it uses POSIX style shared memory. On Microsoft Windows platforms there is yet another shared memory mechanism. When the database is created, the runtime allocates two shared memory segments: one for the eXtremeDB “registry” that keeps information about all database instances created on the machine, and another segment for the data itself. All database operations are then done via eXtremeDB standard interfaces.

> ## Implementation

> eXtremeDB shared memory applications are different in two ways from database applications that use conventional memory:

> > 1) they must link with the shared-memory runtime libraries, and

> > 2) the shared database is opened in only one process while other processes simply connect to it.

> The shared-memory libraries are operating system dependent and are explained in detail in the package contents pages.

> ## Shared Memory Runtime Options

> The eXtremeDB runtime must be informed of shared memory configuration through runtime options. The shared memory options are OS specific.

> ### For Windows applications

> There are two groups of runtime options: one for determining the scope of the shared memory block name (local or global), and one for determining the security level applied to the shared memory block. The combination of options are applied to the name specified in the shared (named) memory block device. Please see the Native Language APIs section for instructions on setting these runtime options for your development environment.

> ### For Linux applications

> Linux shared memory applications use the POSIX function `mmap()` to provide mapping of virtual shared memory to a current process. (See `man` page `http://man7.org/linux/man-pages/man2/mmap.2.html` for details). Please see the Native Language APIs section for instructions on setting these runtime options for your development environment.

> ### For Unix applications

> On Unix systems the shared memory access mode is specified by the Unix specific value of file system access rights. Shared memory and semaphores have the same system of permissions as ordinary files to restrict access by processes of different users and groups. (Unix file access permissions are described here: `https://en.wikipedia.org/wiki/File_system_permissions`).

> ## Shared memory on MacOS and some Linux systems

> When developing eXtremeDB applications on MacOS it might be necessary to reconfigure system shared memory settings – even for applications that do not intentionally use shared memory. This is because a small amount of shared memory is allocated to processes by default. (Actually, this is not only a Mac problem; some Linux distributions have similar settings by default.)

> To resolve this the default shared memory settings should be changed by editing (or creating) file `/etc/sysctl.conf` with the following settings:

>         kern.sysv.shmmax=1073741824
>         kern.sysv.shmall=262144
>         kern.sysv.shmmin=1
>         kern.sysv.shmseg=32
>         kern.sysv.shmmni=128

> This allocates up to 1Gb of shared memory to a process. (Please refer to the following article for more details: `http://www.spy-hill.net/help/apple/SharedMemory.html.)`

> ## Native Language APIs

> The APIs for shared memory applications are specific to the programming language used. Please use the links below to view detailed explanations and examples for your development environment:

> C | Shared memory applications in C
> C++ | Shared memory applications in C++
> Java | Shared memory applications in Java
> Python | Shared memory applications in Python
> C# | Shared memory applications in C#