Essentially, to adopt terms that closely meet the implementation, it's single-threaded (one command at a time), and similar to a 'time slice', the scheduler regularly runs, in-between threads, splitting processing time between process threads equally.