Every process/thread/task has its own Stack. FreeRTOS allocates memory from the heap for that purpose.
This is what FreeRTOS does when making a context switch from Task_A to Task_B:
(1) Push all contents from the CPU registers to the stack of Task_A.
(2) Make the CPU stack pointer refer to the stack of Task_B instead of Task_A.
(3) The stack of Task_B has the CPU registers on top that represent the saved status of the CPU when Task_B was put to sleep. Now is the time to restore those values to the CPU registers.
(4) Continue running Task B.
This context switch normally happens very regularly in FreeRTOS. In this way the FreeRTOS operating system can ensure that all Tasks with highest priority get a share of the CPU time. Tasks with lower priorities get CPU time when the higher priority Tasks cannot run, eg. when they are waiting for a Queue, Semaphore, ..
FreeRTOS does not support multi-cores - as far as I know. FreeRTOS generally runs on tiny microcontrollers that have just one CPU core.