Zombie

Introduction

  • child process 已經結束,但他的 parent process 沒有 wait 它 🥲
  • 我們必須持續儲存 minimal information (PCB) 直到 parent process 讀取

Why we need zombie?

  • 我們必須讓 parent process 能知道這個 pid 代表的 child process 已經 terminated ,否則如果同個 pid 被分給其他 process,parent process 會不知道而把它當作自己的 child process (喂!抱錯孩子了啊!)
  • 又或是 parent process 可能會以為在 wait 他的 child process,實際上這是拿著同個 pid 的另一個 process

Problem with zombie

  • Zombie process 會佔用 process IDs,然後 process ID 是有限的資源,太多 zombie process 可能會造成我們沒辦法 fork 新的 child

Create Background Process without Making Zombies

if (pid=fork() == 0) {
	if (pid=fork() == 0) {
		... // grandchild
	}
	else
		exit(0);
}
else
	exit(0);
  • 這樣 grandchildren 的 parent process 就會變成 Init (PID 1),因為 child process terminates 了
  • Init 會自動 wait 他的 child

Orphan

那麼如果在 child process 結束前 parent process 就 terminate 了呢?那這樣這個 child process 就會變成 orphan,並且 Init (PID 1) 會變成此 process 的 parent process