C’est quoi un processus au niveau OS ?
Une instance d’un programme en execution. Le kernel lui donne : PID, espace memoire virtuel, file descriptors, au moins 1 thread, metadata (UID, env, signals).
Processus vs Thread — quelle est la vraie difference ?
Threads du meme processus : partagent heap, FDs, code (seule la stack est privee). Processus entre eux : rien de partage, memoire isolee.
Pourquoi la memoire virtuelle existe ?
Isolation memoire. Chaque processus croit avoir toute la RAM. Meme adresse virtuelle (0x1000) → RAM physique differente. Sans ca, un bug dans un programme pourrait corrompre la memoire d’un autre.
Qui traduit les adresses virtuelles en adresses physiques ?
Le MMU (hardware) via la page table du processus. Pas le kernel a chaque acces — ce serait trop lent. Si l’adresse n’est pas dans la page table → segfault.
C’est quoi fork() ?
Syscall qui clone le processus parent. Le fils est quasi-identique : meme code, meme memoire, memes FDs. Retourne 0 dans le fils, PID du fils dans le parent.
C’est quoi exec() ?
Syscall qui remplace le code du processus courant par un nouveau programme. Apres exec, le processus execute le nouveau binaire.
Pourquoi fork et exec sont separes ?
Entre fork et exec, le fils peut preparer son environnement : rediriger stdout, changer les FDs, modifier les variables d’env. C’est composable.
C’est quoi le copy-on-write (COW) ?
Apres fork, les deux processus pointent vers les memes pages physiques (read-only). A la premiere ecriture → page fault → le kernel copie uniquement la page modifiee (4 KB).
Que se passe-t-il quand tu tapes ./taskserver dans zsh ?
zsh fork() → clone de zsh (COW). Le fils fait exec(taskserver) → remplace le code. Le runtime Go demarre. main() s’execute.
C’est quoi un syscall ?
Instruction CPU qui passe de user mode (Ring 3) a kernel mode (Ring 0). Le kernel execute la demande (I/O, memoire, reseau) puis retourne en user mode.
Pourquoi un programme ne peut pas acceder directement au hardware ?
Ring 3 (user) n’a pas les privileges. Acces direct → exception CPU → kernel tue le processus. Le kernel (Ring 0) est l’intermediaire obligatoire.
go func(){}() fait un syscall ?
Non. La creation de goroutine est 100% userspace. Pas de syscall, c’est pour ca que c’est si rapide.
C’est quoi strace ?
Outil Linux qui trace tous les syscalls d’un programme. strace -c = comptage. -f = suit tous les threads. Sans -f on ne voit que le thread principal.
Pourquoi strace sans -f ne montre pas epoll ?
Les syscalls reseau (epoll, accept) se passent sur d’autres M (threads). Sans -f, strace ne trace que le main thread.
Que fait le syscall futex ?
Synchronisation entre threads (mutex, WaitGroup, channels sous le capot). Domine quand le serveur est idle — les M attendent.
Que fait tgkill dans strace d’un programme Go ?
Envoie SIGURG a un thread specifique — c’est le mecanisme de preemption asynchrone de Go 1.14+. sysmon detecte un G > 10ms et force le context switch.
nanosleep dans strace d’un programme Go — c’est qui ?
sysmon. Il dort entre ses ticks (~10-20ms) puis se reveille pour verifier : preemption, GC, timers, netpoller.
clone3 dans strace — ca correspond a quoi en Go ?
Creation de threads OS = creation de M. Le nombre de clone3 correspond au nombre de M crees par le runtime.