Task vs. process, is there really any difference?
I'm old-school. Strictly speaking, "processing" is work performed in memory that does not involve input/output operations. A "task" is a process that includes I/O operations. Accordingly, a multi-tasking system can run concurrent I/O streams, whereas a multi-processing system must task switch its I/O. PC's have only one mouse, keyboard, etcetera, so they are not multi-tasking systems to me. I consider a mainframe to be a multi-tasking system.
Threading is a technique for switching processing context. Allows a physical processor to drive multiple processes. No direct relationship to tasks.
It depends on your context.
In Ada, a task is a construct in the programming language to enable concurrency.
It isn't specified what operating system construct should be used to implement it, but it allows shared-memory between tasks, so a thread would be a more natural implementation.
Processes and threads are the mechanics, task is more conceptual. You can queue a chuck of work to run asynchronously, on windows with .NET for example, this gets run on a thread from the thread pool. With OpenMP, a task would be part of your for loop running on one core.
Minor related notes: on windows, there are also jobs, thread pools, and fibers for mechanics. Also, a process is nothing without at least one thread running.
The term "task" is mostly used in the context of scheduling*, when it can refer to either a thread or a *process***, that can be scheduled to run on a processor.
From the scheduler's point of view there might be little-to-no difference between a thread and a process - both represent a task that must be scheduled.
Recently, the term "task" is gaining more-widespread usage, especially among .NET developers, thanks to e.g. the Task Parallel Library. Within it, tasks are units of work that can be scheduled to run on threads from a pool of worker threads.
* e.g in kernel programming, esp. on Linux
** theoretically, you could make up your schedulable entities