- Process và Thread khác nhau thế nào? Khi nào nên dùng multi-process vs multi-thread?
Process là đơn vị thực thi độc lập với không gian bộ nhớ riêng (virtual address space, heap, stack, file descriptors). Thread là đơn vị thực thi nhẹ hơn bên trong process: các thread cùng process chia sẻ heap/code/file descriptors nhưng có stack riêng. Tạo…
- Context switching là gì? Chi phí của nó ảnh hưởng thế nào đến performance?
Context switching là quá trình OS lưu trạng thái CPU (registers, program counter, stack pointer) của process/thread hiện tại vào PCB (Process Control Block), rồi nạp trạng thái của process/thread kế tiếp để chạy. Chi phí bao gồm: (1) Thời gian lưu/nạp CPU state (~microseconds);…
- Các thuật toán process scheduling phổ biến là gì? (FCFS, Round Robin, SJF)
Các thuật toán scheduling khác nhau về cách ưu tiên process: FCFS đơn giản nhưng tệ với latency, Round Robin fair nhất, SJF tối ưu throughput nhưng gây starvation. - FCFS (First-Come First-Served): process đến trước chạy trước — đơn giản nhưng convoy effect: một…
- Inter-Process Communication (IPC) là gì? Các cơ chế IPC phổ biến?
IPC là các cơ chế để các process độc lập trao đổi dữ liệu, vì chúng không chia sẻ bộ nhớ trực tiếp. - Pipe (anonymous pipe): luồng dữ liệu một chiều giữa parent-child process. - Named pipe (FIFO): pipe có tên trong filesystem, không…
- Deadlock là gì? 4 điều kiện cần thiết và các cách phòng tránh?
Deadlock xảy ra khi nhiều process chờ nhau giải phóng resource mà không process nào có thể tiếp tục. Coffman (1971) xác định 4 điều kiện cần thiết đồng thời: (1) Mutual Exclusion: resource chỉ 1 process dùng tại một thời điểm; (2) Hold and…
- Mutex và Semaphore khác nhau thế nào? Khi nào dùng cái nào?
Mutex (Mutual Exclusion Lock) là binary lock: chỉ có 2 trạng thái locked/unlocked, và quan trọng là chỉ thread nào lock thì mới được unlock (ownership semantics). Dùng để bảo vệ critical section — chỉ 1 thread access vào một lúc. Semaphore là counter: counting…
- Concurrency và Parallelism khác nhau thế nào?
Concurrency là khả năng xử lý nhiều task đồng thời về mặt logic — các task có thể interleave nhau (chạy một ít rồi nhường, rồi lại chạy) nhưng không nhất thiết cùng lúc trên nhiều CPU. Parallelism là thực sự chạy nhiều task cùng…
- Thread pool là gì? Tại sao cần thread pool và cách sizing đúng cách?
Thread pool là một tập worker thread được tạo sẵn và tái sử dụng, thay vì sinh rồi huỷ thread cho từng task — bởi mỗi thread tốn khoảng 1MB stack, tốn thời gian để OS cấp phát, và tốn thêm overhead context switch. Cách…
- Virtual memory là gì? Tại sao cần virtual memory?
Virtual memory là abstraction layer giữa process và RAM vật lý: mỗi process có không gian địa chỉ ảo riêng (64-bit: 128TB), OS + MMU (Memory Management Unit) dịch virtual address sang physical address qua page table. Lợi ích: (1) Isolation: process A không thể…
- Paging và Segmentation khác nhau thế nào? x86-64 dùng cơ chế nào?
Paging chia physical memory thành các frame kích thước cố định (4KB, 2MB, 1GB huge pages), và virtual memory thành pages cùng kích thước — OS map pages lên frames qua page table. Fragmentation chỉ là internal (page cuối có thể dư), không có external…
- Memory leak là gì? Cách phát hiện và phòng tránh trong Node.js/Go?
Memory leak xảy ra khi program allocate memory nhưng không release, dần dần RSS tăng cho đến khi OOM. Nguyên nhân phổ biến: - global/module-level variables tích luỹ data. - event listeners không được removeListener. - closures capture large objects. - circular references (trong ngôn…
- Garbage Collection hoạt động thế nào? So sánh GC trong JVM, Go và V8.
- File system hoạt động thế nào? So sánh ext4, NTFS và APFS.
File system quản lý cách data được lưu trên storage: cấu trúc directory tree, metadata (inode: permissions/timestamps/size/data block pointers), free space management, journaling để tránh corruption khi crash. ext4 (Linux): journaling filesystem, extents thay vì block maps, delayed allocation, dirindex (HTree), max file 16TB, max…
- Các I/O models là gì? So sánh blocking, non-blocking, I/O multiplexing và async I/O.
- Linux signals là gì? Các signal quan trọng và cách handle graceful shutdown?
Signal là cơ chế thông báo bất đồng bộ mà OS hoặc process khác gửi tới một process: SIGTERM (15, yêu cầu kết thúc — mặc định của kill PID), SIGKILL (9, giết cưỡng bức — không thể catch hay ignore), SIGINT (2, Ctrl+C), SIGHUP…
- Container khác gì so với VM? Cách container hoạt động ở cấp OS?
- cgroups và namespaces là gì? Cách Kubernetes dùng chúng để quản lý pods?
- Race condition là gì? Cách detect và ngăn chặn trong code thực tế?
Race condition xảy ra khi kết quả của chương trình phụ thuộc vào thứ tự/timing của các concurrent operations — thứ tự không được control → kết quả unpredictable. Ví dụ kinh điển (balance): Detect: Go race detector (go test -race, go run -race); Java…
- Monitor pattern là gì? Cách implement producer-consumer problem?
Monitor là high-level synchronization construct: object chứa mutex (đảm bảo mutual exclusion) + condition variables (cho phép threads wait/notify). Producer-Consumer problem: producer thêm item vào bounded buffer, consumer lấy ra; khi buffer đầy producer phải chờ; khi buffer rỗng consumer phải chờ. Implement với Java…
- Readers-Writers problem: cách giải quyết với read/write lock và trade-offs?
- select, poll, epoll, kqueue — tiến hoá của I/O multiplexing trong Linux/macOS?
select/poll là O(n) scan không scale; epoll (Linux) và kqueue (BSD) dùng kernel-managed event notification, O(1) per event, scale đến hàng triệu FDs; iouring là next-gen zero-copy async I/O. select (POSIX): monitor tối đa 1024 FDs (FDSETSIZE), truyền full set mỗi syscall (O(n) scan), không…
- Multilevel Feedback Queue (MLFQ) scheduler hoạt động như thế nào? Linux CFS là gì?
MLFQ ưu tiên interactive processes bằng cách tự động hạ priority của CPU-bound tasks; Linux CFS thay thế MLFQ bằng vruntime tracking để đảm bảo công bằng mà vẫn ưu tiên interactive. MLFQ: nhiều queue với priority khác nhau (Q0 highest priority, Qn lowest). Rules:…
- File descriptors, pipes và /proc filesystem trong Linux là gì?
File descriptor là abstraction cốt lõi của Linux I/O; pipe là unidirectional IPC qua kernel buffer; /proc là virtual FS cho phép introspect kernel state — ba concept liên kết chặt với nhau. File Descriptor (FD): là integer đại diện cho open file/socket/pipe/device. Process bắt…
- Linux process states: R, S, D, Z, T có nghĩa gì? Khi nào process ở trạng thái D?
Linux process có 5 trạng thái chính: R (running), S (interruptible sleep), D (uninterruptible — không thể kill), Z (zombie), T (stopped) — trạng thái D là dấu hiệu storage issue nghiêm trọng. Xem process state bằng ps aux hoặc top (cột STATUS/S): - R…
- Copy-on-Write (CoW) khi fork() hoạt động như thế nào? Tại sao nó quan trọng với Redis?
Khi process A gọi fork(), OS tạo process B là bản copy của A. Nếu copy toàn bộ memory ngay lập tức thì tốn kém và lãng phí (nhất là khi child chỉ exec một program khác sau fork). Copy-on-Write (CoW): sau fork, parent và…
- OOM Killer trong Linux: cách hoạt động và cách bảo vệ process quan trọng?
- Inode, hard links và symbolic links: phân biệt và ứng dụng thực tế?
Inode chứa metadata file (không phải tên); hard link là alias đến cùng inode; symlink là pointer đến path — khác nhau về behavior khi target bị xoá và khi cross-filesystem. Inode (Index Node): metadata của file trong filesystem — chứa permissions, owner, timestamps, file…
- Page cache trong Linux là gì? Tại sao disk I/O thường nhanh hơn người ta nghĩ?
Linux page cache là phần RAM kernel dùng để cache file content từ disk — khi đọc file lần đầu, kernel load data vào page cache; lần sau đọc cùng file sẽ phục vụ từ RAM (không động đến disk). Write-back: write vào file chỉ…
- Các thuật toán thay trang FIFO, LRU và Optimal khác nhau thế nào? Belady’s Anomaly là gì?
Khi bộ nhớ vật lý đầy mà cần nạp trang mới, OS phải chọn một trang để thay ra: - FIFO: thay trang được nạp vào sớm nhất. Đơn giản nhưng không quan tâm trang đó còn dùng nhiều hay không. - LRU (Least Recently…
- Thrashing là gì? Xảy ra khi nào và xử lý ra sao?
Thrashing là trạng thái hệ thống dành phần lớn thời gian để swap trang vào/ra đĩa thay vì thực thi lệnh — CPU utilization tụt nhưng đĩa quay liên tục. Nguyên nhân: tổng nhu cầu bộ nhớ (working set) của các tiến trình đang chạy…
- Demand paging là gì? Chuyện gì xảy ra khi có page fault?
Demand paging: chỉ nạp trang vào RAM khi thực sự được truy cập, thay vì nạp toàn bộ chương trình lúc khởi động. Mỗi entry trong page table có valid/invalid bit đánh dấu trang đang ở RAM hay còn trên đĩa. Khi CPU truy cập…
- Mô hình 5 trạng thái của tiến trình gồm những trạng thái nào?
Vòng đời một tiến trình: - New: đang được tạo, chưa nạp vào ready queue. - Ready: sẵn sàng chạy, chỉ chờ scheduler cấp CPU. - Running: đang thực thi trên CPU (chỉ 1 tiến trình mỗi lõi tại một thời điểm). - Waiting (Blocked):…
- Zombie process và orphan process khác nhau thế nào?
Cả hai liên quan tới cách Unix quản lý quan hệ cha–con. Zombie (defunct): tiến trình con đã kết thúc (exit) nhưng cha CHƯA gọi wait()/waitpid() để đọc exit status. Con đã giải phóng hầu hết tài nguyên nhưng entry trong process table vẫn còn…
- Banker’s algorithm hoạt động thế nào? Safe state là gì?
- OS phát hiện và phục hồi khỏi deadlock như thế nào?
- Phân mảnh trong (internal) và phân mảnh ngoài (external) khác nhau thế nào?
Cả hai đều là bộ nhớ bị lãng phí, nhưng ở dạng khác nhau. Internal fragmentation: phần dư BÊN TRONG một khối đã cấp mà không dùng tới. Xảy ra khi cấp phát theo đơn vị cố định — ví dụ cần 3KB nhưng cấp…
- Địa chỉ logic (ảo) và địa chỉ vật lý khác nhau ra sao? MMU dịch địa chỉ thế nào?
Địa chỉ logic (virtual): địa chỉ mà CPU/chương trình sinh ra; mỗi tiến trình thấy một không gian địa chỉ ảo riêng, liền mạch, bắt đầu từ 0. Địa chỉ vật lý (physical): địa chỉ thật trên thanh RAM. MMU (Memory Management Unit) là phần…
- Process Control Block (PCB) chứa những thông tin gì?
PCB là cấu trúc dữ liệu OS dùng để đại diện và quản lý mỗi tiến trình — một hồ sơ đầy đủ để có thể tạm dừng rồi khôi phục tiến trình. Thành phần chính: - Process state: new/ready/running/waiting/terminated. - PID: định danh tiến…
- Starvation trong lập lịch CPU là gì? Aging giải quyết ra sao?
Starvation (đói tài nguyên / indefinite blocking): một tiến trình bị trì hoãn vô hạn, không bao giờ được cấp CPU. Thường gặp ở lập lịch theo độ ưu tiên (priority scheduling): nếu luôn có tiến trình ưu tiên cao hơn tới, tiến trình ưu…
- Lập lịch preemptive và non-preemptive khác nhau thế nào?
Khác nhau ở chỗ OS có được quyền cướp CPU khỏi tiến trình đang chạy hay không. Non-preemptive (cooperative): một khi được cấp CPU, tiến trình giữ tới khi tự nguyện nhả — do kết thúc hoặc chuyển sang waiting (chờ I/O). Scheduler chỉ ra…
- Bài toán critical-section là gì? Ba yêu cầu và giải pháp Peterson?
- Thread mức người dùng (user-level) và mức nhân (kernel-level) khác nhau thế nào? Các mô hình ánh xạ?
Kernel-level threads: nhân biết và tự lập lịch từng thread. Chuyển thread cần vào kernel (tốn hơn), nhưng nhiều thread chạy song song thật trên nhiều lõi, và một thread block I/O không chặn cả tiến trình. User-level threads: do thư viện ở userspace quản…
- Monolithic kernel và microkernel khác nhau thế nào?
Khác nhau ở việc bao nhiêu chức năng OS chạy trong không gian nhân (kernel space). Monolithic kernel: gần như toàn bộ dịch vụ — quản lý tiến trình, bộ nhớ, file system, driver, network stack — chạy chung trong kernel space, gọi nhau trực…
- Kernel mode và user mode là gì? System call hoạt động thế nào?
CPU hiện đại có ít nhất 2 mức đặc quyền, phân biệt bằng một bit chế độ (mode bit): - User mode: code ứng dụng chạy ở đây, KHÔNG được thực thi lệnh đặc quyền (truy cập trực tiếp phần cứng, sửa page table, tắt…
- Swapping là gì? Swap space dùng để làm gì?
Swapping: OS chuyển trang (hoặc cả tiến trình, ở mô hình cũ) từ RAM ra vùng lưu trữ trên đĩa để giải phóng RAM, và nạp lại khi cần. Nhờ đó tổng không gian địa chỉ các tiến trình có thể vượt quá RAM vật…
- RAID là gì? Các mức 0, 1, 5, 6, 10 khác nhau ra sao?
RAID (Redundant Array of Independent Disks) ghép nhiều đĩa thành một khối logic để tăng hiệu năng và/hoặc độ tin cậy, dựa trên hai kỹ thuật: striping (chia dữ liệu ra nhiều đĩa để đọc/ghi song song) và mirroring/parity (dư thừa để chịu lỗi). -…