What the CPython GIL Actually Locks

In CPython, what does the Global Interpreter Lock (GIL) actually guarantee?

A

The operating system scheduler is disabled while Python runs, so only one OS thread can exist in the process at all.

B

At most one thread executes Python bytecode at a time inside a given CPython process, even on a multi-core machine.

C

Any two threads that read and write the same variable are safe from race conditions, because the GIL serializes every access to it.

D

Every Python implementation must include a GIL, since it is defined by the language specification rather than by any single interpreter.