Computer Systems: A Programmer's Perspective Chương 1 · A Tour of Computer Systems

Chương 1 · Dạo một vòng hệ thống máy tính Chapter 1 · A Tour of Computer Systems

Hiểu cả một hệ thống máy tính bằng cách dõi theo một chương trình bé xíu Một chương trình nhỏ dẫn bạn đi khắp cái máy tính Understand an entire computer system by following one tiny program

Bryant và O'Hallaron mở đầu bằng một định nghĩa gọn: một hệ thống máy tính gồm phần cứng và phần mềm hệ thống cùng làm việc để chạy các chương trình ứng dụng; cách hiện thực thay đổi theo thời gian, nhưng các khái niệm nền tảng thì không.1 Để dẫn dắt, hai ông dõi theo vòng đời của một chương trình quen thuộc — chương trình hello trong sách kinh điển của Kernighan và Ritchie — từ lúc được gõ ra cho tới khi in dòng chữ của nó rồi kết thúc.15

Một hệ thống máy tính là phần cứng (cái máy thật) cộng với phần mềm hệ thống, cùng làm việc để chạy chương trình của bạn. Thay vì học rời rạc từng thứ, các tác giả đi theo một chương trình nhỏ xíu tên là hello — nó chỉ in ra một dòng chữ rồi dừng — và nhờ nó mà ta gặp gần như mọi ý tưởng lớn. Nhớ nhé: theo chân một chương trình nhỏ, bạn thấy được cả cái máy.

Bryant and O'Hallaron open with a compact definition: a computer system consists of hardware and systems software that work together to run application programs; the implementations change over time, but the underlying concepts do not.1 To guide the tour, they trace the lifetime of a familiar program — the hello program from Kernighan and Ritchie's classic text — from the moment it is created until it prints its message and terminates.15

Điểm tinh tế là lựa chọn phương pháp: thay vì liệt kê các chủ đề một cách trừu tượng, chương dùng hello làm sợi chỉ xuyên suốt. Mỗi khi chương trình bước sang một giai đoạn mới — được soạn thảo, được dịch, được nạp, được chạy, in ra màn hình — một khái niệm mới được giới thiệu đúng lúc nó trở nên cần thiết.1 Nhờ vậy người đọc thấy vì sao mỗi thành phần tồn tại, chứ không chỉ nó là gì. Mục tiêu cuối cùng của cả quyển sách, các tác giả nói rõ, là giúp bạn trở thành một lập trình viên viết được mã nhanh hơn, đáng tin cậy hơn và an toàn hơn nhờ hiểu hệ thống bên dưới.1

Luận đề của chương: một hệ thống máy tính không phải chỉ là cái hộp phần cứng, mà là phần cứng và phần mềm hệ thống đan xen phải hợp tác để chạy ứng dụng; dõi theo một chương trình duy nhất đi hết vòng đời của nó là đủ để gặp mọi trừu tượng lớn — bit và ngữ cảnh, hệ thống biên dịch, phân cấp bộ nhớ, các trừu tượng của hệ điều hành, và các chủ đề xuyên suốt.1

Ý chính: máy tính = phần cứng + phần mềm hệ thống làm việc cùng nhau. Đi theo một chương trình nhỏ từ đầu đến cuối là bạn hiểu được cả bức tranh. Nhớ nhé: cái máy không chỉ là cái hộp — nó là hộp cộng với phần mềm điều phối.

The chapter's thesis: a computer system is not just the hardware box but intertwined hardware and systems software that must cooperate to run applications; following a single program through its whole lifetime is enough to meet every big abstraction — bits and context, the compilation system, the memory hierarchy, the operating system's abstractions, and the cross-cutting themes.1

Cụm khái niệm 01 Concept cluster 01

Thông tin là bit cộng ngữ cảnh, và chương trình được dịch bởi chương trình khác Mọi thứ là số 0 và 1 — và máy phải dịch chương trình của bạn Information is bits plus context, and programs are translated by other programs

Chương trình hello khởi đầu là một chương trình nguồn mà lập trình viên tạo ra và lưu trong tệp văn bản hello.c. Đó là một chuỗi bit, mỗi bit mang giá trị 0 hoặc 1, được gom thành từng khối 8 bit gọi là byte; mỗi byte biểu diễn một ký tự.1 Nhưng cùng một chuỗi byte ấy, tuỳ ngữ cảnh ta nhìn, có thể là số nguyên, số thực, chuỗi ký tự, hay lệnh máy — chính ngữ cảnh mới quyết định ý nghĩa.1

Chương trình của bạn thật ra chỉ là một dãy số 0 và 1 được lưu trong một tệp. Người ta gom tám chữ số nhị phân lại thành một “byte”, và mỗi byte thường ứng với một ký tự. Nhưng cùng một dãy số đó có thể là một con số, một chữ, hay một câu lệnh — tuỳ cách ta nhìn nó. Nhớ nhé: bên trong máy chỉ có 0 và 1; cái quyết định ý nghĩa là cách ta nhìn chúng.

The hello program begins life as a source program that the programmer creates and saves in a text file called hello.c. It is a sequence of bits, each valued 0 or 1, organized into 8-bit chunks called bytes; each byte represents one character.1 Yet the same sequence of bytes can, depending on the context in which we view it, be an integer, a floating-point number, a character string, or a machine instruction — context is what gives meaning.1

Định nghĩa. Hầu hết hệ thống biểu diễn ký tự văn bản theo chuẩn ASCII, gán cho mỗi ký tự một giá trị nguyên duy nhất cỡ một byte. Trong hello.c, byte đầu mang giá trị 35 ứng với ký tự ‘#’, byte kế mang giá trị 105 ứng với ‘i’, và mỗi dòng kết thúc bằng ký tự xuống dòng vô hình ‘\n’ có giá trị 10.12

Nói đơn giản. Có một bảng tra tên là ASCII: mỗi chữ cái ứng với một con số. Ví dụ ‘#’ là 35, ‘i’ là 105. Nhớ nhé: máy không thấy chữ, nó thấy số theo một bảng tra.

Definition. Most systems represent text with the ASCII standard, giving each character a unique byte-size integer value. In hello.c the first byte holds 35 for ‘#’, the next holds 105 for ‘i’, and each line ends with the invisible newline character ‘\n’, value 10.12

hello.c --[cpp]--> hello.i
  --[cc1]--> hello.s
  --[as]--> hello.o
  --[ld]--> hello

văn bản --> (4 bước dịch)
  --> tệp chạy được

hello.c --[cpp]--> hello.i
  --[cc1]--> hello.s
  --[as]--> hello.o
  --[ld]--> hello

  1. bits + context

    Bit và ngữ cảnh — ý nghĩa nằm ở cách nhìn Bit và ngữ cảnh — ý nghĩa tuỳ cách nhìn Bits and context — meaning is in the viewpoint

    Mọi thông tin trong hệ thống — tệp trên đĩa, chương trình trong bộ nhớ, dữ liệu người dùng, dữ liệu truyền qua mạng — đều là một mớ bit. Thứ duy nhất phân biệt các đối tượng dữ liệu khác nhau là ngữ cảnh mà ta dùng để nhìn chúng.1

    Tất cả — tệp, chương trình, tin nhắn — đều là 0 và 1. Cùng một dãy số, nhìn kiểu này là con số, nhìn kiểu khác là chữ. Nhớ nhé: cùng một đống bit, đổi cách nhìn là đổi ý nghĩa.

    All information in a system — files on disk, programs in memory, user data, data sent across a network — is a bunch of bits. The only thing that distinguishes different data objects is the context in which we view them.1

    Bạn gặp nó ở đâuWhere you meet it Khi một lỗi “số lạ” xuất hiện vì máy biểu diễn số không giống số nguyên hay số thực trong toán học — một chủ đề được đào sâu ở Chương 2. Khi phép tính cho ra kết quả kỳ lạ vì máy lưu số theo kiểu riêng của nó. When a “strange number” bug appears because the machine represents numbers unlike true integers or reals — a theme explored in Chapter 2.

    Chi tiết của tác giả

    Các tác giả nhấn mạnh biểu diễn số trên máy là hữu hạn và có thể hành xử bất ngờ: chúng xấp xỉ, chứ không trùng với số nguyên và số thực toán học.1

    Vì sao điều này quan trọng

    Hiểu biểu diễn máy giúp tránh những lỗi số học hiểm hóc và những lỗ hổng bảo mật phát sinh từ tràn số — nền tảng cho lập trình đúng và an toàn.1

  2. compilation system

    Hệ thống biên dịch — bốn pha từ văn bản tới tệp chạy được Hệ thống biên dịch — bốn bước biến chữ thành chương trình chạy The compilation system — four phases from text to executable

    Để chạy được, hello.c phải được các chương trình khác dịch thành lệnh máy, đóng gói thành tệp đối tượng chạy được (executable object file). Một lệnh như gcc -o hello hello.c kích hoạt bốn pha: tiền xử lý (cpp), biên dịch (cc1), hợp dịch (as), và liên kết (ld) — gọi chung là hệ thống biên dịch (compilation system).13

    Máy không chạy thẳng tệp chữ của bạn. Nó nhờ bốn chương trình khác lần lượt dịch: dọn dẹp, dịch sang hợp ngữ, đổi thành mã máy, rồi ghép các mảnh lại. Cuối cùng mới ra tệp chạy được. Nhớ nhé: từ chữ tới chương trình chạy phải qua bốn bước dịch.

    To run, hello.c must be translated by other programs into machine instructions and packaged into an executable object file. A command like gcc -o hello hello.c drives four phases: preprocessing (cpp), compilation (cc1), assembly (as), and linking (ld) — together the compilation system.13

    Bạn gặp nó ở đâuWhere you meet it Pha liên kết ghép hello.o với printf.o — hàm printf nằm trong thư viện C chuẩn, ở một tệp đối tượng tiền biên dịch riêng.1 Khi chương trình của bạn gọi một hàm có sẵn, bước “liên kết” sẽ ghép phần đó vào. The linking phase merges hello.o with printf.o — the printf function lives in the standard C library, in a separate precompiled object file.1

    Một con số đáng nhớ

    Sau pha hợp dịch, hello.o là tệp nhị phân chứa 17 byte mã hoá các lệnh của hàm main; mở nó bằng trình soạn thảo văn bản chỉ thấy ký tự vô nghĩa.1

    Vì sao nên hiểu nó

    Hiểu hệ thống biên dịch giúp tối ưu hiệu năng (ví dụ switch so với chuỗi if-else), hiểu các lỗi thời điểm liên kết, và tránh lỗ hổng tràn bộ đệm.1

  3. why it pays

    Vì sao đáng công hiểu trình biên dịch Vì sao nên hiểu cách máy dịch chương trình Why it pays to understand compilation

    Với chương trình đơn giản, ta có thể phó mặc hệ thống biên dịch. Nhưng các tác giả nêu ba lý do phải hiểu nó: tối ưu hiệu năng, gỡ các lỗi thời điểm liên kết khó hiểu, và tránh các lỗ hổng bảo mật — đặc biệt là tràn bộ đệm, nguyên nhân của nhiều lỗ hổng trong phần mềm mạng suốt nhiều năm.1

    Với chương trình nhỏ bạn chẳng cần lo gì. Nhưng hiểu cách máy dịch sẽ giúp chương trình chạy nhanh hơn, ít lỗi khó hiểu hơn, và an toàn hơn trước kẻ xấu. Nhớ nhé: hiểu bước dịch thì mã của bạn nhanh hơn và an toàn hơn.

    For simple programs we can rely on the compilation system. But the authors give three reasons to understand it: optimizing performance, debugging baffling link-time errors, and avoiding security holes — especially buffer overflow vulnerabilities, long responsible for many flaws in network software.1

    Bạn gặp nó ở đâuWhere you meet it Mỗi lần bạn tự hỏi vì sao vòng lặp này chạy nhanh hơn vòng lặp kia, hay vì sao trình liên kết báo “không giải quyết được một tham chiếu”. Khi bạn muốn biết vì sao một cách viết lại nhanh hơn cách khác. Every time you wonder why one loop runs faster than another, or why the linker reports it “cannot resolve a reference”.

Cụm khái niệm 02 Concept cluster 02

Tổ chức phần cứng, cache, và phân cấp bộ nhớ Cái máy chạy ra sao, và vì sao cache quan trọng Hardware organization, caches, and the memory hierarchy

Để hiểu điều gì xảy ra khi chạy hello, cần biết tổ chức phần cứng của một hệ thống tiêu biểu: các bus chở từng khối byte cố định gọi là word (từ máy); bộ xử lý (CPU) với bộ đếm chương trình (PC), tệp thanh ghi và đơn vị số học/logic (ALU); bộ nhớ chính bằng DRAM; và các thiết bị I/O như bàn phím, màn hình, đĩa.1

Muốn biết máy chạy chương trình thế nào, hãy nhìn các bộ phận: những “đường ống” gọi là bus chở dữ liệu đi lại; bộ xử lý CPU làm phép tính; bộ nhớ chính giữ chương trình đang chạy; và các thiết bị như bàn phím, màn hình, đĩa. Nhớ nhé: CPU tính, bộ nhớ giữ, bus chở, thiết bị vào–ra nối với thế giới.

To understand what happens when hello runs, you need the hardware organization of a typical system: buses carrying fixed-size chunks of bytes called words; a processor (CPU) with a program counter (PC), a register file, and an arithmetic/logic unit (ALU); main memory built from DRAM; and I/O devices such as keyboard, display, and disk.1

Định nghĩa. Word (từ máy) là số byte cố định mà bus chuyển mỗi lần, một tham số nền tảng khác nhau giữa các hệ thống: phần lớn máy ngày nay dùng word 4 byte (32 bit) hoặc 8 byte (64 bit). Trên máy x86-64 chạy Linux, kiểu short chiếm 2 byte, int và float 4 byte, long và double 8 byte.1

Nói đơn giản. “Word” là kích thước một miếng dữ liệu máy thích chở một lần — thường 4 hoặc 8 byte. Nhớ nhé: máy chở dữ liệu theo từng miếng cố định, không chở lẻ từng bit.

Definition. A word is the fixed number of bytes a bus moves at once, a fundamental parameter that varies by system: most machines today use 4-byte (32-bit) or 8-byte (64-bit) words. On an x86-64 machine running Linux, short is 2 bytes, int and float are 4 bytes, and long and double are 8 bytes.1

L0 thanh ghi
L1/L2/L3 cache (SRAM)
L4 bộ nhớ chính (DRAM)
L5 đĩa cục bộ
L6 lưu trữ từ xa

nhanh & nhỏ: thanh ghi, cache
  ↓
chậm & lớn: bộ nhớ, đĩa

L0 registers
L1/L2/L3 cache (SRAM)
L4 main memory (DRAM)
L5 local disks
L6 remote storage

  1. processor

    Bộ xử lý — máy đọc và thực thi lệnh trong bộ nhớ Bộ xử lý — cái đọc và làm theo từng lệnh The processor — reads and executes instructions in memory

    CPU là bộ máy diễn giải (thực thi) các lệnh lưu trong bộ nhớ chính. Lõi của nó là PC, trỏ tới lệnh kế tiếp. Nó lặp đi lặp lại: đọc lệnh PC trỏ tới, thực thi, rồi cập nhật PC. Tập thao tác cơ bản rất ít — Load, Store, Operate, Jump — xoay quanh bộ nhớ chính, tệp thanh ghi và ALU.1

    CPU chỉ làm đi làm lại một việc: đọc một lệnh, làm theo, rồi đọc lệnh tiếp. Các việc cơ bản của nó rất ít: lấy số vào, cất số ra, tính toán, hoặc nhảy sang chỗ khác. Nhớ nhé: CPU cứ đọc một lệnh, làm, rồi đọc lệnh sau — mãi như thế.

    The CPU interprets (executes) instructions stored in main memory. At its core is the PC, pointing to the next instruction. It repeats: read the instruction the PC points to, execute it, update the PC. The set of basic operations is small — Load, Store, Operate, Jump — revolving around main memory, the register file, and the ALU.1

    Bạn gặp nó ở đâuWhere you meet it Khi bạn gõ ./hello, shell nạp tệp và CPU bắt đầu thực thi các lệnh của hàm main, chép chuỗi “hello, world” ra màn hình.1 Khi bạn chạy một chương trình, chính CPU làm theo từng lệnh của nó. When you type ./hello, the shell loads the file and the CPU executes main's instructions, copying the “hello, world” string to the display.1

    ISA so với vi kiến trúc

    Bộ xử lý trông như thực thi tuần tự theo kiến trúc tập lệnh (instruction set architecture, ISA), nhưng thực tế dùng cơ chế phức tạp hơn nhiều; ta phân biệt ISA (hiệu ứng của mỗi lệnh) với vi kiến trúc (microarchitecture — cách bộ xử lý thật sự được hiện thực).1

    Nối với các chương sau

    Chương 3 nghiên cứu mã máy qua trừu tượng ISA; Chương 4 và 5 nói về cách bộ xử lý được hiện thực và mô hình hoá để dự đoán hiệu năng.1

  2. caches matter

    Cache quan trọng — thu hẹp khoảng cách bộ xử lý–bộ nhớ Cache quan trọng — bộ nhớ đệm nhanh ở sát CPU Caches matter — bridging the processor–memory gap

    Hệ thống tốn rất nhiều thời gian chỉ để chép dữ liệu từ nơi này sang nơi khác. Thiết bị lớn thì chậm: đĩa có thể lớn gấp 1.000 lần bộ nhớ chính, nhưng đọc một word từ đĩa có thể lâu hơn từ bộ nhớ tới 10.000.000 lần.1 Tệp thanh ghi lại đọc nhanh gần 100 lần so với bộ nhớ. Để khoả lấp, người ta chèn các cache nhỏ và nhanh (SRAM).1

    Máy mất rất nhiều công chỉ để chuyển dữ liệu. Chỗ chứa càng lớn thì càng chậm: lấy dữ liệu từ đĩa có thể chậm hơn từ bộ nhớ hàng triệu lần. Nên người ta đặt những ngăn nhớ nhỏ, cực nhanh (cache) ngay cạnh CPU để giữ thứ hay dùng. Nhớ nhé: để dữ liệu hay dùng ở thật gần CPU thì chạy mới nhanh.

    A system spends much of its time just copying data from one place to another. Bigger devices are slower: a disk may be 1,000 times larger than main memory, yet reading a word from disk can take 10,000,000 times longer than from memory.1 The register file reads nearly 100 times faster than memory. To bridge this, designers insert small, fast caches (SRAM).1

    Bạn gặp nó ở đâuWhere you meet it Lập trình viên biết tận dụng cache có thể tăng hiệu năng chương trình lên một bậc độ lớn — bằng cách khai thác tính cục bộ (locality), xu hướng truy cập dữ liệu và mã trong các vùng gần nhau.1 Viết mã sao cho hay dùng lại dữ liệu ở gần nhau thì chương trình nhanh hơn hẳn. Programmers who exploit caches can speed programs up by an order of magnitude — by using locality, the tendency to access data and code in nearby regions.1

    Các mức cache

    Cache L1 trên chip giữ hàng chục nghìn byte, truy cập gần nhanh bằng tệp thanh ghi; cache L2 lớn hơn (hàng trăm nghìn tới hàng triệu byte) truy cập có thể lâu gấp 5 lần L1 nhưng vẫn nhanh hơn bộ nhớ chính 5–10 lần. Hệ thống mạnh hơn còn có thêm L3.1

    Khoảng cách ngày càng rộng

    Theo thời gian, khoảng cách bộ xử lý–bộ nhớ ngày càng lớn vì làm CPU nhanh lên dễ hơn làm bộ nhớ nhanh lên — khiến cache càng quan trọng.1

  3. memory hierarchy

    Phân cấp bộ nhớ — mỗi tầng là cache cho tầng dưới Phân cấp bộ nhớ — nhiều tầng nhanh–chậm xếp chồng The memory hierarchy — each level caches the one below

    Ý tưởng chèn thiết bị nhanh–nhỏ trước thiết bị chậm–lớn được tổng quát thành phân cấp bộ nhớ (memory hierarchy): tệp thanh ghi ở mức L0; ba mức cache L1–L3; bộ nhớ chính ở L4; đĩa cục bộ ở L5; và lưu trữ từ xa (hệ tệp phân tán, máy chủ web) ở L6. Ý chính: mỗi tầng là cache cho tầng ngay dưới nó.1

    Mọi chỗ chứa dữ liệu được xếp thành tầng: trên cùng nhỏ và nhanh, dưới cùng lớn và chậm. Mỗi tầng giữ bản sao của những thứ hay dùng từ tầng dưới. Nhớ nhé: càng lên cao càng nhanh và nhỏ; mỗi tầng là bộ đệm cho tầng dưới.

    The idea of placing a fast, small device before a slow, large one generalizes to the memory hierarchy: the register file at level L0; three cache levels L1–L3; main memory at L4; local disks at L5; and remote storage (distributed file systems, web servers) at L6. The key idea: each level is a cache for the level just below it.1

    Bạn gặp nó ở đâuWhere you meet it Mỗi lần một trang web tải nhanh nhờ đã nằm trong bộ nhớ đệm, hay một tệp mở tức thì vì vừa được dùng — bạn đang hưởng lợi từ phân cấp này. Khi một tệp vừa mở xong, mở lại thấy nhanh hơn hẳn. Every time a web page loads fast because it is cached, or a file opens instantly because it was just used — you are benefiting from this hierarchy.

Cụm khái niệm 03 Concept cluster 03

Hệ điều hành, mạng, và các chủ đề xuyên suốt Hệ điều hành chia sẻ máy, mạng, và vài ý tưởng lớn The operating system, networks, and cross-cutting themes

Mọi thao tác của ứng dụng lên phần cứng phải đi qua hệ điều hành. Nó có hai mục đích chính: bảo vệ phần cứng khỏi bị ứng dụng lỗi lạm dụng, và cho ứng dụng những cơ chế đơn giản, đồng nhất để điều khiển phần cứng phức tạp. Nó đạt cả hai qua ba trừu tượng nền tảng: tiến trình (process), bộ nhớ ảo (virtual memory), và tệp (file).1

Chương trình không được tự ý đụng vào phần cứng; mọi thứ phải xin phép hệ điều hành. Hệ điều hành làm hai việc: giữ cho một chương trình hỏng không phá phần cứng, và cho mọi chương trình một cách dùng phần cứng đơn giản như nhau. Nó dùng ba ý tưởng: tiến trình, bộ nhớ ảo, và tệp. Nhớ nhé: muốn chạm phần cứng, phải qua hệ điều hành.

Every attempt by an application to manipulate hardware must go through the operating system. It has two primary purposes: protecting the hardware from misuse by runaway applications, and giving applications simple, uniform mechanisms for controlling complex hardware. It achieves both through three fundamental abstractions: processes, virtual memory, and files.1

Định nghĩa. Một tiến trình là trừu tượng của hệ điều hành cho một chương trình đang chạy; nó tạo ảo giác rằng chương trình độc chiếm bộ xử lý, bộ nhớ và thiết bị I/O. Nhiều tiến trình chạy đồng thời (concurrently) bằng cách đan xen lệnh; chuyển giữa chúng gọi là chuyển ngữ cảnh (context switch), lưu lại và khôi phục ngữ cảnh (context) — gồm giá trị PC, tệp thanh ghi, nội dung bộ nhớ.1

Nói đơn giản. “Tiến trình” là một chương trình đang chạy, được hệ điều hành cho cảm giác như nó chiếm cả máy. Máy luân phiên rất nhanh giữa các chương trình nên ta tưởng chúng chạy cùng lúc. Nhớ nhé: máy chia lượt cực nhanh, nên nhiều chương trình trông như chạy một lúc.

Definition. A process is the OS's abstraction for a running program; it provides the illusion that the program has exclusive use of the processor, memory, and I/O. Multiple processes run concurrently by interleaving instructions; switching between them is a context switch, saving and restoring the context (PC values, register file, memory contents).1

Amdahl: S = 1 / ((1−α) + α/k)
α=0,6, k=3 → 1,67×
k→∞ → S = 1/(1−α) = 2,5×

tăng tốc một phần
  ≠ tăng tốc cả máy

Amdahl: S = 1 / ((1−α) + α/k)
α=0.6, k=3 → 1.67×
k→∞ → S = 1/(1−α) = 2.5×

  1. process & kernel

    Tiến trình và nhân — ảo giác độc chiếm, do nhân dàn dựng Tiến trình và nhân — ảo giác “một mình một máy” Process & kernel — the illusion, staged by the kernel

    Khi ứng dụng cần dịch vụ của hệ điều hành — như đọc/ghi tệp — nó thực thi một lệnh đặc biệt gọi là lời gọi hệ thống (system call), trao quyền điều khiển cho nhân (kernel). Nhân là phần mã của hệ điều hành luôn thường trú trong bộ nhớ; nó không phải một tiến trình riêng mà là tập mã và cấu trúc dữ liệu dùng để quản lý mọi tiến trình.1

    Khi chương trình cần làm việc với phần cứng, nó “gọi” hệ điều hành bằng một lệnh đặc biệt. Phần lõi luôn nằm trong bộ nhớ, lo quản lý tất cả chương trình, gọi là “nhân”. Nhớ nhé: cần việc hệ thống thì gọi nhân, đừng tự làm.

    When an application needs an OS service — such as reading or writing a file — it executes a special instruction called a system call, handing control to the kernel. The kernel is the portion of OS code always resident in memory; it is not a separate process but a collection of code and data structures used to manage all processes.1

    Bạn gặp nó ở đâuWhere you meet it Trong ví dụ của sách, shell và hello là hai tiến trình đồng thời; nhân chuyển ngữ cảnh giữa chúng khi bạn chạy lệnh rồi khi lệnh kết thúc.1 Khi bạn gõ lệnh rồi chương trình chạy xong, hệ điều hành đã âm thầm chuyển qua lại giữa chúng. In the book's example, the shell and hello are two concurrent processes; the kernel context-switches between them when you run the command and when it ends.1

    Luồng

    Một tiến trình có thể gồm nhiều đơn vị thực thi gọi là luồng (thread), chạy trong cùng ngữ cảnh và dùng chung mã lẫn dữ liệu toàn cục — một mô hình ngày càng quan trọng cho tính đồng thời.1

    Tệp

    Trừu tượng thứ ba: tệp chỉ là một chuỗi byte. Mọi thiết bị I/O — kể cả mạng — được mô hình hoá như tệp, truy cập qua một tập nhỏ lời gọi hệ thống gọi là Unix I/O.1

  2. virtual memory & networks

    Bộ nhớ ảo và mạng — một không gian riêng, và một thiết bị I/O nữa Bộ nhớ ảo và mạng — chỗ nhớ riêng, và mạng là thiết bị I/O Virtual memory & networks — a private space, and one more I/O device

    Bộ nhớ ảo cho mỗi tiến trình ảo giác độc chiếm bộ nhớ chính qua một không gian địa chỉ ảo (virtual address space) đồng nhất, gồm các vùng xác định: mã và dữ liệu chương trình, heap (do malloc cấp), vùng thư viện dùng chung (shared libraries), ngăn xếp người dùng (user stack), và bộ nhớ ảo của nhân ở trên cùng.1 Với mạng, từ góc nhìn của một hệ thống, mạng chỉ là một thiết bị I/O khác.1

    Hệ điều hành cho mỗi chương trình một “bản đồ bộ nhớ” riêng, như thể nó có cả bộ nhớ cho mình. Còn mạng ư? Máy coi mạng chỉ như một thiết bị vào–ra nữa, giống bàn phím hay đĩa. Nhớ nhé: mỗi chương trình có bản đồ nhớ riêng; gửi qua mạng cũng chỉ như đọc–ghi một thiết bị.

    Virtual memory gives each process the illusion of exclusive use of main memory via a uniform virtual address space with defined regions: program code and data, the heap (allocated by malloc), the shared-library region, the user stack, and kernel virtual memory at the top.1 As for networks, from a single system's viewpoint the network is just another I/O device.1

    Bạn gặp nó ở đâuWhere you meet it Sách minh hoạ bằng telnet: gõ “hello” ở máy khách, chuỗi đi qua mạng tới máy chủ, chạy hello từ xa, rồi kết quả quay về in trên màn hình của bạn.1 Khi bạn chạy một việc trên máy ở xa và thấy kết quả hiện lên máy mình. The book illustrates this with telnet: type “hello” on the client, the string crosses the network to the server, runs hello remotely, and the result returns to print on your display.1
  3. Amdahl & parallelism

    Định luật Amdahl và song song hoá — tăng tốc có giới hạn Định luật Amdahl — tăng tốc một phần không cứu được cả máy Amdahl's law & parallelism — speedup has limits

    Gene Amdahl nhận xét: hiệu quả của việc tăng tốc một phần hệ thống phụ thuộc cả vào phần đó lớn đến đâu và được tăng tốc bao nhiêu. Nếu một phần chiếm tỉ lệ α thời gian được tăng tốc k lần, độ tăng tốc toàn cục là S = 1/((1−α)+α/k). Ví dụ α=0,6 và k=3 cho 1,67×; dù k→∞ cũng chỉ đạt 1/(1−α)=2,5×.14

    Nếu bạn chỉ tăng tốc một phần của công việc, cả công việc không nhanh lên tương ứng đâu. Muốn cả máy nhanh hẳn, phải tăng tốc phần chiếm nhiều thời gian nhất. Nhớ nhé: tăng tốc phần nhỏ thì tổng thể vẫn chậm — phải nhắm phần lớn nhất.

    Gene Amdahl observed: the benefit of speeding up one part of a system depends both on how large that part is and how much it is sped up. If a part taking fraction α of the time is sped up by k, the overall speedup is S = 1/((1−α)+α/k). For α=0.6 and k=3 that is 1.67×; even k→∞ reaches only 1/(1−α)=2.5×.14

    Bạn gặp nó ở đâuWhere you meet it Khi thêm nhân CPU không làm chương trình nhanh gấp bội như kỳ vọng — vì chỉ phần được song song hoá mới hưởng lợi. Khi thêm nhiều lõi mà chương trình vẫn không nhanh hơn bao nhiêu. When adding CPU cores doesn't make a program proportionally faster — only the parallelized part benefits.

    Ba mức song song

    Song song mức luồng (thread-level parallelism — đa lõi/multi-core và siêu phân luồng/hyperthreading), song song mức lệnh (instruction-level parallelism, với bộ xử lý siêu vô hướng/superscalar), và song song SIMD. Một bộ xử lý thường cần khoảng 20.000 chu kỳ để chuyển luồng; siêu phân luồng giúp một nhân chạy hai luồng, nên hệ bốn nhân có thể chạy tám luồng song song.1

    Vài con số lịch sử

    Vi xử lý Intel 8086 đời 1978 cần 3–10 chu kỳ cho một lệnh; bộ xử lý gần đây duy trì 2–4 lệnh mỗi chu kỳ. Ở mức thấp nhất, SIMD có thể cộng 8 cặp số thực đơn chính xác cùng lúc.1

Ba ngộ nhận thường gặp Three common misconceptions

“Hệ thống máy tính chính là phần cứng” “A computer system is just the hardware”

Ngộ nhận: cái máy là cái hộp phần cứng.

Thực tế: hệ thống là phần cứng và phần mềm hệ thống đan xen phải hợp tác mới chạy được ứng dụng; đó là định nghĩa mở đầu của chương.1

Myth: the machine is the hardware box.

Reality: a system is intertwined hardware and systems software that must cooperate to run applications — the chapter's opening definition.1

“Trình biên dịch là hộp đen, không cần hiểu” “The compiler is a black box I needn't understand”

Ngộ nhận: cứ viết C rồi phó mặc trình biên dịch.

Thực tế: hiểu hệ thống biên dịch giúp tối ưu hiệu năng, gỡ lỗi thời điểm liên kết, và tránh lỗ hổng tràn bộ đệm.1

Myth: just write C and trust the compiler.

Reality: understanding the compilation system aids performance, link-time debugging, and avoiding buffer-overflow holes.1

“Phần cứng nhanh hơn là chương trình nhanh hơn” “Faster hardware alone makes my program fast”

Ngộ nhận: cứ CPU mạnh và nhiều nhân là đủ.

Thực tế: hiệu năng còn bị chi phối bởi phân cấp bộ nhớ và tính cục bộ, và bị định luật Amdahl chặn trên: chỉ phần được tăng tốc mới có lợi.1

Myth: a powerful, many-core CPU is enough.

Reality: performance is also governed by the memory hierarchy and locality, and bounded by Amdahl's law — only the sped-up fraction helps.1

Tự kiểm Self-check

Năm câu hỏi để biết bạn đã nắm vòng tham quan Năm câu hỏi kiểm tra nhanh Five questions to check you grasped the tour

Trả lời được những câu này nghĩa là bạn đã theo trọn hành trình của hello qua phần cứng, phần mềm và các chủ đề xuyên suốt.

Nếu trả lời được, nghĩa là bạn đã hiểu chương này.

Answering these means you followed hello's whole journey through hardware, software, and the cross-cutting themes.

  1. Vì sao nói “thông tin là bit + ngữ cảnh”? Cho một ví dụ về cùng một chuỗi byte mang hai nghĩa khác nhau.

    Gợi ý sâu hơn: điều này liên quan gì tới cách máy biểu diễn số và các lỗi số học?

  2. Kể tên bốn pha của hệ thống biên dịch theo đúng thứ tự, và cho biết pha nào ghép printf.o vào.

    Gợi ý sâu hơn: vì sao lỗi ở pha cuối lại là loại lỗi gây đau đầu nhất cho lập trình viên?

  3. Phân cấp bộ nhớ gồm những mức nào, và “mỗi tầng là cache cho tầng dưới” nghĩa là gì?

    Gợi ý sâu hơn: con số nào trong sách cho thấy khoảng cách bộ xử lý–bộ nhớ lớn đến đâu?

  4. Ba trừu tượng lớn của hệ điều hành là gì, và cái nào tạo ảo giác độc chiếm bộ nhớ?

    Gợi ý sâu hơn: chuyển ngữ cảnh lưu và khôi phục những thành phần nào của ngữ cảnh?

  5. Định luật Amdahl nói gì, và vì sao thêm nhiều nhân không làm chương trình nhanh gấp bội?

    Gợi ý sâu hơn: với α=0,6, độ tăng tốc tối đa khi k→∞ là bao nhiêu?

  1. Bên trong máy, mọi thứ thật ra là gì? Cái gì quyết định ý nghĩa?

  2. Để chạy một chương trình viết bằng chữ, máy phải làm gì trước?

  3. Vì sao người ta đặt cache sát CPU? Kể hai tầng lưu trữ nhanh–chậm.

  4. Hệ điều hành giúp gì cho chương trình của bạn? Kể một việc.

  5. Thêm nhiều lõi có luôn làm chương trình nhanh hơn không? Vì sao?

  1. Why is “information is bits + context” true? Give an example of one byte sequence with two meanings.

  2. Name the four phases of the compilation system in order, and say which merges printf.o.

  3. What levels make up the memory hierarchy, and what does “each level caches the one below” mean?

  4. What are the OS's three big abstractions, and which creates the illusion of exclusive memory?

  5. What does Amdahl's law say, and why don't more cores make a program proportionally faster?

Khép lại chương Closing the chapter

Một hệ thống máy tính không chỉ là phần cứng, mà là phần cứng và phần mềm hệ thống đan xen cùng chạy ứng dụng; bên trong, mọi thông tin là bit, và ngữ cảnh ban cho nó ý nghĩa. Dõi theo một chương trình bé xíu đi hết vòng đời của nó, bạn đã gặp đủ các ý tưởng lớn.1

Máy tính không chỉ là cái hộp; bên trong tất cả là 0 và 1, và cách ta nhìn mới tạo ra ý nghĩa. Đi theo một chương trình nhỏ là đủ thấy cả bức tranh. Nhớ nhé: hiểu hệ thống bên dưới thì mã bạn nhanh hơn, chắc hơn, an toàn hơn.

A computer system is not just the hardware but intertwined hardware and systems software running applications; inside, all information is bits, and context gives it meaning. By following one tiny program through its whole lifetime, you have met all the big ideas.1