Prallelism is when several problems are being worked on in a single time slice. Concurrency is when one problem is worked on per time slice, but the problem being worked on changes from slice to slice.

True parallelism requires one hardware thread (or CPU core) per task. The kernel offers preemptive mulitasking as an alternative for when CPU time is over-committed (which is literally always, and badly); it "pre-empts" tasks and switches between them in each time slice, which is effectively a kind of transparent concurrency.

Cooperative multitasking is the opposite of preemptive multitasking, and in this case each task decides for itself when to relinquish control to another task. A common way of achieving this is coroutines.

A process is a task with its own isolated memory space. A thread is a task within a process, which shares its memory space. Multithreading is using multiple threads, multiprocessing is using multiple processes.