<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Operating-System on Thanh HV's Blog</title><link>https://thanhhv.github.io/tags/operating-system/</link><description>Recent content in Operating-System on Thanh HV's Blog</description><generator>Hugo -- 0.146.7</generator><language>en-us</language><lastBuildDate>Sun, 22 Feb 2026 00:00:00 +0700</lastBuildDate><atom:link href="https://thanhhv.github.io/tags/operating-system/index.xml" rel="self" type="application/rss+xml"/><item><title>Chương 17 — Kiến trúc thực tế: Linux dưới các hệ thống bạn chạy hằng ngày</title><link>https://thanhhv.github.io/series/linux-os-for-backend/17-kien-truc-thuc-te/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/17-kien-truc-thuc-te/</guid><description>&lt;blockquote>
&lt;p>Chương tổng kết: mỗi hệ thống lớn là một &lt;strong>tập lựa chọn&lt;/strong> trên các trade-off đã học. Đọc mỗi mục và tự kiểm tra: bạn có chỉ ra được chương nào của tài liệu đứng sau từng quyết định không?&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="171-postgresql--đặt-cược-vào-page-cache-của-kernel">17.1. PostgreSQL — đặt cược vào Page Cache của kernel&lt;/h2>
&lt;p>&lt;strong>Kiến trúc trên OS&lt;/strong>: process-per-connection (fork — chương 04; lý do connection đắt và PgBouncer gần như bắt buộc ở connection count cao); shared_buffers là shared memory giữa các process; &lt;strong>double buffering có chủ đích&lt;/strong>: dữ liệu nằm cả ở shared_buffers &lt;em>và&lt;/em> Page Cache (Postgres đọc ghi qua buffered IO — tin kernel làm cache tầng hai, khác Oracle/MySQL-InnoDB dùng O_DIRECT tự quản 100%).&lt;/p></description></item><item><title>Chương 16 — Production Failure Cases (2): IO, Network &amp; Concurrency</title><link>https://thanhhv.github.io/series/linux-os-for-backend/16-failure-cases-io-network-concurrency/</link><pubDate>Sat, 21 Feb 2026 23:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/16-failure-cases-io-network-concurrency/</guid><description>&lt;blockquote>
&lt;p>Tiếp nối khung phân tích của chương 15.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="case-10--file-descriptor-exhausted">Case 10 — File Descriptor Exhausted&lt;/h2>
&lt;p>&lt;strong>Triệu chứng&lt;/strong>: &lt;code>accept: too many open files&lt;/code> / &lt;code>EMFILE&lt;/code>; connection mới bị từ chối trong khi connection cũ vẫn chạy; có thể lan cả máy (&lt;code>ENFILE&lt;/code> — trần toàn hệ thống).&lt;/p>
&lt;p>&lt;strong>Bên trong kernel&lt;/strong>: mỗi process có bảng FD (chương 04, &lt;code>files_struct&lt;/code>) giới hạn bởi &lt;code>RLIMIT_NOFILE&lt;/code> (mặc định soft 1024 lịch sử — quá thấp cho server!); toàn máy bởi &lt;code>fs.file-max&lt;/code>. FD không chỉ là file: socket, pipe, epoll, timerfd, eventfd — &lt;strong>mọi thứ là FD&lt;/strong>. Cạn FD thường là &lt;em>leak&lt;/em>: quên close socket khi lỗi giữa chừng, response body không đóng (Go &lt;code>resp.Body.Close()&lt;/code> — bug số một của HTTP client Go), connection pool cấu hình vô hạn.&lt;/p></description></item><item><title>Chương 15 — Production Failure Cases (1): CPU &amp; Memory</title><link>https://thanhhv.github.io/series/linux-os-for-backend/15-failure-cases-cpu-memory/</link><pubDate>Sat, 21 Feb 2026 22:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/15-failure-cases-cpu-memory/</guid><description>&lt;blockquote>
&lt;p>Mỗi case theo khung: &lt;strong>Triệu chứng → Root cause phổ biến → Bên trong kernel → Metric &amp;amp; Dashboard → Điều tra từng bước → Khắc phục → Phòng tránh.&lt;/strong> Các lệnh mặc định chạy được trên mọi máy Linux; công cụ eBPF (bcc-tools) khi có càng tốt. Kiến thức nền: chương tương ứng ghi trong ngoặc.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="case-1--cpu-100">Case 1 — CPU 100%&lt;/h2>
&lt;p>&lt;strong>Triệu chứng&lt;/strong>: %CPU chạm trần; latency tăng; có thể kèm autoscale bùng nổ chi phí.&lt;/p></description></item><item><title>Chương 14 — Security: từ "root hoặc không" đến quyền chi li từng syscall</title><link>https://thanhhv.github.io/series/linux-os-for-backend/14-security/</link><pubDate>Sat, 21 Feb 2026 21:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/14-security/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Mô hình Unix nguyên thủy chỉ có hai hạng người: &lt;strong>root (uid 0) — làm được tất cả&lt;/strong>, và còn lại — bị giới hạn bởi quyền file. Hai vấn đề chết người: (1) nhiều tác vụ chỉ cần &lt;em>một mẩu&lt;/em> quyền root (bind port 80, đổi giờ) nhưng phải trao &lt;em>cả&lt;/em> root — ping từng phải setuid-root chỉ để mở raw socket; (2) quyền file không nói gì về &lt;em>hành vi&lt;/em>: một process bị khai thác (RCE trong thư viện parse ảnh) được làm mọi thứ &lt;em>user đó&lt;/em> làm được — đọc DB credential, mở kết nối ra ngoài, fork shell.&lt;/p></description></item><item><title>Chương 13 — Container: không phải máy ảo, mà là ảo ảnh do kernel dựng</title><link>https://thanhhv.github.io/series/linux-os-for-backend/13-container/</link><pubDate>Sat, 21 Feb 2026 20:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/13-container/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Bài toán kinh doanh: đóng gói app + dependency thành một đơn vị chạy được ở mọi nơi, khởi động trong milli-giây, nhét hàng chục cái vào một máy, cô lập vừa đủ để không giẫm chân nhau. VM giải được cô lập nhưng trả giá: mỗi VM một kernel + OS riêng (GB memory, khởi động chục giây, density thấp).&lt;/p>
&lt;p>Câu trả lời của Linux: &lt;strong>không cần máy ảo — chỉ cần nói dối process một cách có hệ thống.&lt;/strong> Container = process bình thường + ba lớp cơ chế kernel: &lt;strong>namespace&lt;/strong> (thấy gì), &lt;strong>cgroup&lt;/strong> (dùng bao nhiêu), &lt;strong>capability/seccomp/LSM&lt;/strong> (làm được gì — chương 14). Không có &amp;ldquo;Container Kernel Object&amp;rdquo; nào cả — &lt;code>docker&lt;/code> chỉ là trình lắp ráp các cơ chế này.&lt;/p></description></item><item><title>Chương 12 — Linux Performance Tools: công cụ hoạt động thế nào, không chỉ dùng thế nào</title><link>https://thanhhv.github.io/series/linux-os-for-backend/12-performance-tools/</link><pubDate>Sat, 21 Feb 2026 19:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/12-performance-tools/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Production chậm. Bạn có 30 phút và một máy 64 core đang chạy 200 process. Câu hỏi không phải &amp;ldquo;gõ lệnh gì&amp;rdquo; mà là: &lt;strong>mỗi công cụ nhìn hệ thống qua cửa sổ nào, trả giá bao nhiêu để nhìn, và nói dối ở đâu.&lt;/strong> Không hiểu cơ chế thì: dùng strace làm sập production (overhead 100x), đọc %util của NVMe như HDD (sai), tin flame graph thiếu frame (vì thiếu frame pointer), hay đo latency bằng trung bình (che mất tail).&lt;/p></description></item><item><title>Chương 11 — Network Stack: hành trình một packet xuyên kernel</title><link>https://thanhhv.github.io/series/linux-os-for-backend/11-network-stack/</link><pubDate>Sat, 21 Feb 2026 18:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/11-network-stack/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>NIC là phần cứng nhận/gửi &lt;strong>frame Ethernet thô&lt;/strong>. Ứng dụng muốn một thứ hoàn toàn khác: &amp;ldquo;một kết nối đáng tin cậy tới host X, gửi byte theo thứ tự, đừng làm mất, đừng làm nghẽn mạng&amp;rdquo;. Khoảng cách giữa hai thế giới đó — checksum, định tuyến, phân mảnh, retransmit, congestion control, ghép kênh theo port — chính là network stack trong kernel. Đây là mã đường-nóng lớn nhất và được tối ưu khốc liệt nhất của Linux: mọi request tới backend của bạn đi qua nó &lt;strong>hai lần&lt;/strong> (vào và ra).&lt;/p></description></item><item><title>Chương 10 — IO Models: từ blocking đến io_uring, tiến hóa của câu hỏi "chờ thế nào"</title><link>https://thanhhv.github.io/series/linux-os-for-backend/10-io-models/</link><pubDate>Sat, 21 Feb 2026 17:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/10-io-models/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Server có 10.000 connection. Tại mỗi thời điểm chỉ vài trăm connection có dữ liệu; còn lại im lặng. Câu hỏi định hình cả một thế hệ kiến trúc backend: &lt;strong>làm sao biết connection nào sẵn sàng mà không tốn một thread cho mỗi connection và không đốt CPU quay vòng hỏi?&lt;/strong> Đây là &amp;ldquo;bài toán C10K&amp;rdquo; (1999) — và mỗi IO model là một câu trả lời ở một thời kỳ.&lt;/p></description></item><item><title>Chương 09 — Filesystem: biến mảng block thô thành dữ liệu bền vững</title><link>https://thanhhv.github.io/series/linux-os-for-backend/09-filesystem/</link><pubDate>Sat, 21 Feb 2026 16:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/09-filesystem/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Disk (NVMe/SSD/HDD) là một mảng block 512B/4KB đánh số từ 0 đến N. Không tên file, không thư mục, không quyền, không đảm bảo gì khi mất điện giữa chừng. Filesystem phải dựng trên đó: &lt;strong>không gian tên phân cấp, quyền sở hữu, cấp phát không phân mảnh, và quan trọng nhất — tính toàn vẹn khi crash&lt;/strong> (crash consistency). Cộng thêm yêu cầu hiệu năng: disk chậm hơn RAM 100-1000 lần → phải cache quyết liệt — và cache chính là nơi sinh ra khoảng cách giữa &amp;ldquo;đã ghi&amp;rdquo; và &amp;ldquo;đã bền vững&amp;rdquo;, khoảng cách gây ra nhiều sự cố mất dữ liệu nhất trong nghề backend.&lt;/p></description></item><item><title>Chương 08 — Synchronization: cái giá của việc chia sẻ</title><link>https://thanhhv.github.io/series/linux-os-for-backend/08-synchronization/</link><pubDate>Sat, 21 Feb 2026 15:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/08-synchronization/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hai thread cùng chạy &lt;code>counter++&lt;/code>. Lệnh này thực chất là ba bước: load → add → store. Xen kẽ giữa hai thread → mất update. Đây là &lt;strong>data race&lt;/strong> — nguồn bug khó tái hiện bậc nhất, và với CPU hiện đại còn tệ hơn trực giác: compiler đảo lệnh, CPU thực thi out-of-order, mỗi core có store buffer riêng — &lt;strong>không có &amp;ldquo;thứ tự toàn cục&amp;rdquo; tự nhiên nào giữa các core cả&lt;/strong>. Muốn có, phải &lt;em>trả tiền để mua&lt;/em> nó, bằng các primitive của chương này.&lt;/p></description></item><item><title>Chương 07 — Memory Management: ảo ảnh lớn nhất và đắt giá nhất</title><link>https://thanhhv.github.io/series/linux-os-for-backend/07-memory-management/</link><pubDate>Sat, 21 Feb 2026 14:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/07-memory-management/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>RAM là một mảng byte vật lý hữu hạn, phẳng, ai cũng thấy như nhau. Ta cần: (1) mỗi process một không gian địa chỉ &lt;strong>riêng, cô lập&lt;/strong>; (2) tổng memory các process &lt;em>tưởng&lt;/em> mình có được phép &lt;strong>vượt&lt;/strong> RAM thật; (3) cấp phát/thu hồi linh hoạt không phân mảnh chết; (4) tận dụng RAM thừa làm &lt;strong>cache&lt;/strong> cho disk. Virtual memory giải cả bốn — với cái giá là mọi truy cập memory đều phải qua một tầng dịch địa chỉ.&lt;/p></description></item><item><title>Chương 06 — CPU Scheduling: chia thời gian CPU như thế nào cho công bằng</title><link>https://thanhhv.github.io/series/linux-os-for-backend/06-cpu-scheduling/</link><pubDate>Sat, 21 Feb 2026 13:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/06-cpu-scheduling/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Máy có 32 core; tại một thời điểm có 80 task muốn chạy (runnable). Ai chạy? Chạy bao lâu? Trên core nào? Sai câu trả lời nào cũng có hậu quả: task quan trọng chờ lâu (latency), CPU nhảy task liên tục (mất throughput vì context switch + cache nguội), task nào đó đói vĩnh viễn (starvation), core này 100% core kia rảnh (mất tiền).&lt;/p>
&lt;p>Nếu không có scheduler: quay lại chương 01 — &lt;code>while(1)&lt;/code> chiếm CPU mãi mãi. Scheduler + timer interrupt là bộ đôi biến &amp;ldquo;một CPU&amp;rdquo; thành &amp;ldquo;ảo ảnh nhiều CPU&amp;rdquo;.&lt;/p></description></item><item><title>Chương 05 — Thread: nhiều dòng thực thi, một không gian địa chỉ</title><link>https://thanhhv.github.io/series/linux-os-for-backend/05-thread/</link><pubDate>Sat, 21 Feb 2026 12:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/05-thread/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Process cô lập tốt nhưng trả giá: hai process muốn chia sẻ dữ liệu phải đi đường vòng (pipe, socket, shared memory — đều qua kernel hoặc setup phức tạp), và tạo/chuyển process tương đối đắt. Nhiều bài toán cần điều ngược lại: &lt;strong>nhiều dòng thực thi đồng thời trên cùng một khối dữ liệu&lt;/strong> — web server xử lý 10.000 connection, database xử lý nhiều query cùng chạm một buffer pool.&lt;/p></description></item><item><title>Chương 04 — Process: đơn vị của ảo ảnh "máy tính riêng"</title><link>https://thanhhv.github.io/series/linux-os-for-backend/04-process/</link><pubDate>Sat, 21 Feb 2026 11:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/04-process/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>CPU chỉ có một dòng lệnh; RAM là một khối phẳng. Nhưng ta muốn chạy 500 chương trình &amp;ldquo;đồng thời&amp;rdquo;, mỗi cái tưởng mình sở hữu cả máy. &lt;strong>Process là câu trả lời: một gói đóng kín gồm (code + data + trạng thái CPU + tài nguyên) mà kernel có thể đóng băng, hồi sinh, cô lập, và thu hồi.&lt;/strong>&lt;/p>
&lt;p>Nếu không có process: không chạy được nhiều chương trình; không giết được chương trình treo; một chương trình lỗi kéo sập tất cả; không có khái niệm &amp;ldquo;quyền của ai&amp;rdquo;.&lt;/p></description></item><item><title>Chương 03 — Kernel và Syscall: cánh cổng duy nhất vào thế giới đặc quyền</title><link>https://thanhhv.github.io/series/linux-os-for-backend/03-kernel-va-syscall/</link><pubDate>Sat, 21 Feb 2026 10:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/03-kernel-va-syscall/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Chương 01 kết luận: cần một trọng tài không thể bị qua mặt. Chương 02 cho thấy phần cứng cung cấp nguyên liệu: privilege ring, trap, interrupt. Chương này trả lời: &lt;strong>kernel dựng ranh giới bảo vệ bằng nguyên liệu đó như thế nào, và một chương trình &amp;ldquo;xin&amp;rdquo; kernel làm việc qua cơ chế gì.&lt;/strong>&lt;/p>
&lt;p>Nếu không có ranh giới user/kernel: mọi process đều đọc được memory của nhau và của kernel (mật khẩu, key, dữ liệu khách hàng); mọi process đều ra lệnh trực tiếp cho disk/NIC (phá nát filesystem, giả mạo packet); không thể có multi-tenant, không thể có cloud. Nếu không có syscall: có ranh giới nhưng không có cửa — chương trình không làm được gì hữu ích.&lt;/p></description></item><item><title>Chương 02 — Computer Fundamentals: phần cứng mà kernel phải quản lý</title><link>https://thanhhv.github.io/series/linux-os-for-backend/02-computer-fundamentals/</link><pubDate>Sat, 21 Feb 2026 09:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/02-computer-fundamentals/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Kernel không chạy trong chân không — nó chạy trên CPU thật, RAM thật, với những giới hạn vật lý thật. &lt;strong>Mọi quyết định thiết kế lớn của Linux đều là phản ứng trước một giới hạn phần cứng cụ thể.&lt;/strong> Không hiểu phần cứng thì mọi giải thích về kernel đều thành học thuộc lòng.&lt;/p>
&lt;p>Nếu bỏ qua chương này: bạn sẽ không hiểu vì sao context switch đắt (cache pollution), vì sao lock contention giết throughput (cache line bouncing), vì sao cùng một đoạn code chạy chậm gấp 3 trên máy 2 socket (NUMA), vì sao kernel &lt;em>có thể&lt;/em> giật CPU từ một vòng lặp vô hạn (timer interrupt).&lt;/p></description></item><item><title>Chương 01 — Từ bài toán kinh doanh đến hệ điều hành</title><link>https://thanhhv.github.io/series/linux-os-for-backend/01-tu-bai-toan-den-os/</link><pubDate>Sat, 21 Feb 2026 08:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/01-tu-bai-toan-den-os/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Bạn có một dịch vụ backend: nhận HTTP request, đọc database, trả JSON. Bài toán kinh doanh rất đơn giản: &lt;strong>phục vụ nhiều người dùng nhất có thể, nhanh nhất có thể, trên phần cứng rẻ nhất có thể, và không được sập.&lt;/strong>&lt;/p>
&lt;p>Bây giờ hãy thử làm điều đó &lt;strong>không có hệ điều hành&lt;/strong>. Bài tập tư duy này là nền của toàn bộ tài liệu: mỗi lần bạn gặp một cơ chế kernel phức tạp (page table, futex, epoll&amp;hellip;), hãy quay lại đây và hỏi — &lt;em>nếu không có nó, mình phải tự làm gì?&lt;/em>&lt;/p></description></item><item><title>Operating Systems cho Backend Engineer — Linux Internals từ First Principles</title><link>https://thanhhv.github.io/series/linux-os-for-backend/00-muc-luc/</link><pubDate>Sat, 21 Feb 2026 07:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/linux-os-for-backend/00-muc-luc/</guid><description>&lt;blockquote>
&lt;p>Bộ tài liệu chuyên sâu về hệ điều hành, tập trung vào Linux, viết cho Backend Engineer, Senior Backend Engineer, Tech Lead và Architect. Mục tiêu không phải là học lệnh Linux — mà là hiểu &lt;strong>tại sao&lt;/strong> hệ thống hoạt động như vậy, &lt;strong>điều gì xảy ra bên trong kernel&lt;/strong> khi backend của bạn chạy trong production, và &lt;strong>trade-off&lt;/strong> đằng sau mỗi quyết định thiết kế.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="cách-đọc-bộ-tài-liệu-này">Cách đọc bộ tài liệu này&lt;/h2>
&lt;p>Mỗi chương đi theo một template thống nhất:&lt;/p></description></item></channel></rss>