Typically, the scheduler/dispatcher handles threads. Threads are the system objects that have execution and the Thread Control Blocks, (or whatever it's called on whatever OS), will have their own stack, register save, (especially stack pointer, ie where the PC is pushed upon interrupt), thread priority, other thread-specific data and a PCB pointer to the process it belongs to. The PCB has memory management data, access-control data, permissions etc, ie. data specific to a process. Processes do not have any execution except insofar as every process must own at least one thread, (usually, but not exclusively, the one raised by the loader when the process was created).
If the thread code exits by returning from the top-level function that was used in its creation, (by no means the most common means for a thread to be terminated), it will pop off a return address that was placed on its stack at creation time and so make a 'TerminateThread', (or whatever), system call, resulting it its own suicide.
Obviously, a very broad overview of a 'typical' OS. Details are OS dependent, (and, indeed, vary with releases).