The OpenMP's execution model is a fork/join model, where execution starts with a single (master) thread and then other threads are spawned upon encountering a parallel region[1]. These threads are, indeed, threads, not processes, meaning all the threads spawned in a parallel region have access to the same shared-memory space. Put it in another way, if you were to implement your own OpenMP runtime, you would do it using Pthreads, not using fork()
nor clone()
.
Worth mentioning: According to the standard, each thread has a temporary view of the memory (mostly for cache purposes), so the thread does not have to access the shared memory for every write/read of a variable [2]. Later, a flush operation synchronizes the thread's private view of the memory and the shared memory seen by all the threads.
It may be argued that because of this private view, a thread is actually a process. However, this private view (which is actually not mandatory) is synchronized with the memory seen by all the rest of threads and, therefore, a thread remains being a thread, and not a process.
[1] OpenMP Application Programming Interface 4.5, pp. 14
[2] OpenMP Application Programming Interface 4.5, pp. 17