Tổng quan module — Thread & Lập lịch CPU
4 core CPU chạy 400 tiến trình thế nào. Lộ trình module: thread vs process, trạng thái & context switch, scheduler, CPU-bound vs I/O-bound.
TL;DR: Mở máy tính lên, htop báo hơn 400 tiến trình đang chạy — nhưng CPU của bạn chỉ có 4 core. Không ai phải xếp hàng chờ lâu. Bí mật là lập lịch (scheduling): hệ điều hành cho mỗi thread chạy vài mili-giây rồi cướp CPU trao cho thread khác, nhanh tới mức bạn tưởng mọi thứ chạy song song. Module này mổ xẻ cơ chế đó — thread khác process ở chỗ chia sẻ gì; một thread đi qua ba trạng thái ready/running/blocked ra sao; mỗi lần context switch tốn gì thật (không chỉ lưu register mà còn mất cache nóng); scheduler quyết ai chạy tiếp thế nào; và vì sao chọn đúng số thread cho workload lại quyết định app nhanh hay chậm.
Vì sao module này tồn tại
Bạn từng deploy một service, thấy nó chậm, rồi tăng thread pool từ 10 lên 200 — và nó chậm hơn. Bạn từng nghe "app này I/O-bound, thêm thread đi" nhưng không rõ vì sao thêm thread lại giúp khi CPU đằng nào cũng chỉ có 4 core. Bạn từng thấy dòng context switches trong output vmstat mà không biết con số đó nói lên điều gì.
Ba tình huống này có chung một gốc: bạn chưa hình dung được ai thật sự chạy code của bạn, và trả giá gì mỗi lần đổi việc. Module 02 đã dạy tiến trình là gì và cấu trúc PCB lưu trạng thái nó thế nào. Module này trả lời câu tiếp theo: khi có nhiều thứ cần chạy hơn số CPU, ai được chạy, chạy bao lâu, và đổi qua đổi lại tốn gì.
Đây không phải lý thuyết suông. Nó là nền để bạn cấu hình thread pool đúng, đọc được profiler khi app nghẽn, và biết khi nào thêm thread là thuốc, khi nào là thuốc độc.
Sau module này bạn sẽ
- Compare thread và process: cái gì chia sẻ (heap, code, file descriptor), cái gì riêng (stack, register), và khi nào chọn cái nào.
- Trace vòng đời một thread qua ba trạng thái ready/running/blocked và chi phí thật của mỗi lần context switch — cả phần trực tiếp (lưu/khôi phục register) lẫn gián tiếp (mất cache nóng, flush TLB).
- Explain scheduler preemptive chia CPU thế nào: timer interrupt, time slice, priority/nice, và ý tưởng cốt lõi của CFS (chọn thread "thiệt thòi nhất").
- Choose số thread hợp lý cho workload CPU-bound vs I/O-bound dựa trên dự đoán tỉ lệ chờ/tính.
Lộ trình module
Bài 01 đặt nền: thread khác process ở đâu — vì sao nhiều thread trong cùng một tiến trình chia sẻ heap và code nhưng mỗi thread có stack riêng, và tạo thread rẻ hơn tạo process bao nhiêu. Bài 02 đưa thread vào chuyển động: ba trạng thái ready/running/blocked, vì sao chờ I/O không tốn CPU, và context switch tốn gì — đây là bài "trả giá" quan trọng nhất, nối thẳng về cache và TLB bạn đã học ở khoá Bộ nhớ. Bài 03 giới thiệu scheduler: timer interrupt cướp CPU thế nào, time slice, priority, và ý tưởng CFS của Linux. Bài 04 biến tất cả thành quyết định thực tế: CPU-bound vs I/O-bound, và công thức gợi ý chọn số thread. Bài 05 là mini-challenge — bạn tự benchmark 1/4/16/64 thread và giải thích kết quả. Bài 06 là trang tổng kết để bookmark.
Trình tự có chủ đích: không hiểu thread chia sẻ gì thì không hiểu vì sao context switch giữa hai thread rẻ hơn giữa hai process; không hiểu context switch tốn gì thì không hiểu vì sao thêm thread cho CPU-bound lại phản tác dụng.
flowchart LR A["01 Thread vs process"] --> B["02 Trang thai va context switch"] B --> C["03 Scheduler va time slice"] C --> D["04 CPU-bound vs I/O-bound"] D --> E["05 Mini-challenge: bao nhieu thread"]
Yêu cầu trước khi bắt đầu
- Hoàn thành Module 02 — Tiến trình của khoá này, hoặc đã giải thích được tiến trình là gì và
PCBlưu trạng thái tiến trình thế nào. Tham chiếu: tiến trình và PCB. - Nắm cơ bản về cache và TLB từ khoá Bộ nhớ (
cs-memory) — bài 02 sẽ dùng lại trực tiếp. Nếu chưa, đọc cache line và locality và MMU và TLB. - Biết đọc code Java cơ bản (thread, vòng lặp). Ví dụ dùng Java 21 nhưng khái niệm language-agnostic.
Time budget
- Module: ~1,3 giờ (đọc + chạy thử mini-challenge).
| Bài | Chủ đề | Phút |
|---|---|---|
| 00 | Tổng quan module | 5 |
| 01 | Thread vs process | 13 |
| 02 | Trạng thái & context switch | 13 |
| 03 | Scheduler & time slice | 13 |
| 04 | CPU-bound vs I/O-bound | 12 |
| 05 | Mini-challenge: bao nhiêu thread | 18 |
| 06 | Tổng kết & cheat sheet | 6 |
Cách học module này hiệu quả
- Mở
htopkhi đọc. Nhìn cột số process/thread và cột CPU nhảy lên xuống — đó chính là scheduler bạn đang học đang làm việc ngay trước mắt. - Đừng bỏ qua bài 02. Context switch là khái niệm nối cả module lại; hiểu nó thì bài 03 và 04 tự sáng.
- Chạy mini-challenge trên máy thật. Bài 05 chỉ có giá trị khi bạn tự đo — con số trên máy bạn có thể khác con số trong bài, và hiểu vì sao khác mới là bài học.
Bài tiếp theo: Thread vs process — chia sẻ gì, riêng gì
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
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