Hệ điều hành & Tiến trình/Tổng quan module Tiến trình — vòng đời, signal, zombie
8/28
Bài 8 / 28~5 phútTiến trình — sinh ra, sống, chếtMiễn phí lượt xem

Tổng quan module Tiến trình — vòng đời, signal, zombie

Tiến trình là đơn vị OS quản lý chương trình đang chạy. Lộ trình module: PCB, fork/exec/wait, zombie/orphan, signal, và mổ xẻ cây tiến trình thật.

TL;DR: Một file chương trình nằm im trên đĩa chỉ là dữ liệu chết. Khi OS nạp nó vào bộ nhớ và cho CPU chạy, nó trở thành một tiến trình — đơn vị mà OS dùng để cấp phát, tạm dừng và thu hồi tài nguyên. Module này bóc vòng đời một tiến trình từ lúc fork sinh ra, exec thay chương trình, tới lúc exit chết và cha wait thu xác; giải thích OS lưu gì trong PCB để tạm dừng rồi chạy tiếp một tiến trình; vì sao xuất hiện zombie và orphan; và signal — cách OS gõ cửa một tiến trình để bảo nó dừng. Xong module, bạn debug được service treo, zombie đầy bảng tiến trình, và biết docker stop thật sự làm gì.

Vì sao module này tồn tại

Bạn docker stop một container nhưng nó mất đúng 10 giây mới tắt. Bạn chạy ps aux thấy một dòng trạng thái Z với chữ <defunct> bên cạnh — tiến trình đã chết mà vẫn còn đó. Service của bạn treo, bạn gõ Ctrl+C mà nó lì ra không chịu dừng. Ba tình huống này có chung một gốc: bạn chưa có mô hình rõ ràng về vòng đời một tiến trình — nó sinh ra thế nào, ai là cha nó, nó chết ra sao, và OS dùng cơ chế gì để điều khiển nó.

Module này không bắt bạn học thuộc "fork tạo tiến trình con". Nó dạy cơ chế: vì sao fork trả về hai giá trị khác nhau trong hai tiến trình, OS chép gì và không chép gì (copy-on-write), vì sao một tiến trình đã chết vẫn phải chiếm một ô trong bảng tiến trình cho tới khi cha wait, và vì sao SIGKILL không bao giờ bị chặn còn SIGTERM thì có.

Sau module này bạn sẽ

  • Explain tiến trình khác chương trình thế nào và OS lưu những gì trong PCB để tạm dừng rồi chạy tiếp một tiến trình.
  • Trace vòng đời tiến trình qua fork, exec, wait, exit — kể cả nhánh zombie và orphan.
  • Compare SIGTERM, SIGKILL, SIGINT, SIGSTOP và cách tiến trình phản ứng — kể cả pattern graceful shutdown với SIGTERM.
  • Diagnose cây tiến trình thật bằng ps, pstree, kill — tìm quan hệ cha-con, tạo và diệt một zombie.

Lộ trình module

Bài 01 đặt nền: phân biệt chương trình (file trên đĩa) với tiến trình (chương trình đang chạy), và mổ xẻ PCB — cấu trúc OS dùng để nhớ mọi thứ về một tiến trình (register, program counter, trạng thái, file đang mở, không gian địa chỉ) để có thể tạm dừng rồi chạy tiếp nó. Bài 02 dựng vòng đời: fork nhân đôi tiến trình, exec thay ruột, wait thu exit status, exit kết thúc — và vì sao shell chạy mọi lệnh theo đúng bộ ba này. Bài 03 xử lý hai trạng thái "bệnh lý": zombie (con chết mà cha chưa wait) và orphan (cha chết trước con). Bài 04 bóc signal: cơ chế OS gõ cửa tiến trình, so sánh SIGTERM/SIGKILL/SIGINT/SIGSTOP, và pattern graceful shutdown mà docker stop dùng. Bài 05 là mini-challenge: bạn tự cầm ps, pstree, kill mổ xẻ cây tiến trình thật trên máy mình. Bài 06 là cheat sheet để bookmark.

Trình tự có chủ đích: không hiểu PCB thì không hiểu fork chép gì; không hiểu fork/wait thì không hiểu zombie sinh ra từ đâu; không hiểu vòng đời thì signal chỉ là lệnh gõ mù.

flowchart LR
  A["01 Tien trinh va PCB"] --> B["02 fork exec wait"]
  B --> C["03 Zombie va orphan"]
  B --> D["04 Signal"]
  C --> E["05 Mini-challenge cay tien trinh"]
  D --> E
  E --> F["06 Tong ket"]

Yêu cầu trước khi bắt đầu

  • Hoàn thành Module 1 — Kernel & system call của khoá này, hoặc đã giải thích được ranh giới kernel/user mode và system call là gì. fork, exec, wait, kill đều là system call — bạn sẽ thấy lại chính đường đi user→kernel đã học ở bài System call là gì.
  • Quen mô hình bộ nhớ ảo (mỗi tiến trình một không gian địa chỉ riêng) — đã học ở khoá Bộ nhớ (cs-memory), sẽ được gọi lại ở bài 01.
  • Một máy Linux (hoặc WSL/macOS) để chạy ps, pstree ở mini-challenge. Code C dùng gcc; bash script chạy trực tiếp.

Time budget

  • Module: ~1 giờ (đọc + code-along).
BàiChủ đềPhút
01Tiến trình & PCB12
02fork, exec, wait13
03Zombie & orphan11
04Signal12
05Mini-challenge — mổ xẻ cây tiến trình15
06Tổng kết & cheat sheet6

Cách học module này hiệu quả

  • Chạy pspstree song song khi đọc. Mỗi khi bài nhắc tới PID, cha-con, hay trạng thái, mở terminal chạy pstree -p và tìm chính các quan hệ đó trên máy bạn. Tiến trình là thứ đang sống ngay lúc này, không phải khái niệm trừu tượng.
  • Biên dịch và chạy code C. Các ví dụ fork/exec ngắn (dưới 30 dòng) — gcc file.c && ./a.out rồi quan sát. Đoán output trước khi chạy (mỗi bài có bước "Thử đoán").
  • Đừng bỏ qua khối pitfall — zombie và signal là hai chỗ trực giác hay sai nhất, và cũng là hai thứ hay gặp nhất trong production.

Bài tiếp theo: Tiến trình & PCB — chương trình khi đang chạy

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên