The following is a "pseudo-Unixish" definition of the terms. Various sources use these terms in different ways.

Process

A process is a running program, including code, data, heap, and stack. In most implementations (but not always), each process has its own virtual address space (i.e. its own logical address-to-physical memory mapping) and its own set of system resources (files, environment variable, etc.)

Thread

A thread is a control flow in an executable image. Threads can be "user level" (i.e., the process handles multiple threads within itself) or "kernel level" (i.e., the OS scheduler handles multiple threads within a single process). Two threads from the same process naturally share the same code and global data but are given different stacks so that they do not interfere with each other's local variable and may have their own call chain.

Task

This is the least well-defined term of the three; it is frequently used to describe a control flow that can be scheduled by the OS (i.e., a kernel-level thread or a process)...