Cython's documentation talks about releasing the GIL however it does not explain what exactly the GIL does or allows.
Similarly Python's documentation defines the GIL as: The mechanism used by the CPython interpreter to assure that only one thread executes Python bytecode at a time.
What does this actually mean? What are some (pseudo code) examples of what is possible if the GIL did not exist and what would not be allowed? How is the memory managed because of the GIL? For example are all objects copied for each thread?