Jest taki problem, że na poziomie języka nie wie się za wiele musisz wejść już do kernela.
Języki niskopoziomowe i wysokopoziomowe jak chcą wątek w danym systemie, odniosę się tylko do linuxa, bo windows znam gorzej, w linuxie masz clone syscall do robienia threada i fork do robienia procesa nowego, wewnątrz kernela struct_task zawiera informację o threadach, thread i process nie jest odróżnialny, różnica jest taka, że mmio (memory map input output) jest współdzielony i nie trzeba swapować page tables, ale też to wymaga przez sheduler wykonywania threadów dla tego samego procesu bardzo blisko po sobie, żeby nie trzeba było swapować bo jest to dość kosztowne czasowo.
Przez to wątki współdzielą pamięć ram, a procesy mają swoją własna wirtualną przez co nie naruszają innych.
Sama implementacja to sheduler, który co pewien czasu występuje przerwanie procesora,
Proces ma zapisany dla każdego rdzenia cpu własne dane, jest taka struktura na x86, na x64 tylko służy od przechowywania adresu do stacka kernela.
Np. gs segment zawiera adres do struktury threada.
Potem jak przechodzisz z jednego wątku na inny, to musisz zrzucić wartości wszystkich rejestrów na ten stos, zmienić na inny proces z listy, przemapować mmio jeśli przejście do innego procesu w przypadku wątków pomija się
Raz opisałem cały proces zmiany wątku, ale mogłem niecaly opisać, ale jak będziesz chciał sobie do googlujesz.