Chương 2 · Khái niệm nền tảng Chapter 2 · Fundamental Concepts
Bộ từ vựng để bắt đầu: nhân, tệp, tiến trình và những gì nối chúng lại Những chữ cơ bản bạn cần biết trước khi lập trình hệ thống The vocabulary to begin: kernel, files, processes, and what ties them together
Kerrisk mở chương bằng một mục tiêu khiêm tốn mà quan trọng: dựng sẵn bộ khái niệm nền tảng cho người đã quen hệ điều hành khác, hoặc chỉ mới làm quen Linux/UNIX, để họ có đủ nền mà bắt đầu học lập trình hệ thống.1 Thay vì đi sâu bất cứ chủ đề nào, chương điểm qua toàn cảnh — kernel, shell, người dùng và nhóm, hệ thống tệp, tiến trình, bộ nhớ, thư viện, IPC, signals, threads — mỗi khái niệm được định nghĩa gọn, rồi hẹn đào sâu ở các chương sau.1
Chương này giống như trang từ vựng ở đầu một cuốn sách ngoại ngữ. Trước khi làm việc thật, bạn cần biết vài chữ cốt lõi: kernel (lõi điều hành máy), shell (chỗ gõ lệnh), tiến trình (chương trình đang chạy), tệp, bộ nhớ… Mỗi chữ chỉ được giải thích ngắn gọn ở đây, rồi sẽ có nguyên một chương riêng sau. Nhớ nhé: chương này cho bạn bản đồ, chưa phải chuyến đi.
Kerrisk opens the chapter with a modest but important goal: to lay out the fundamental concepts for readers who have worked mainly with other operating systems, or who have only limited Linux/UNIX experience, so they have enough background to begin learning system programming.1 Rather than going deep on any one topic, the chapter surveys the whole landscape — the kernel, the shell, users and groups, the file system, processes, memory, libraries, IPC, signals, threads — each defined briefly, then deferred for deeper treatment in later chapters.1
Điểm đáng chú ý về phương pháp: đây là một chương tổng quan có chủ đích. Kerrisk cố ý nhắc đi nhắc lại một ý then chốt — mọi lời như “một tiến trình tạo tiến trình khác”, “một tiến trình ghi dữ liệu vào một pipe”, “một tiến trình kết thúc bằng exit()” thực chất chỉ là cách nói gọn cho “tiến trình yêu cầu nhân làm việc đó”.1 Đặt nhân vào trung tâm từ đầu giúp người đọc, về sau khi gặp từng system call cụ thể, luôn nhìn được bức tranh đúng: chương trình không tự làm, nó nhờ nhân làm hộ.
Luận đề của chương: lập trình hệ thống Linux đứng trên một nhúm khái niệm nền tảng gắn bó chặt với nhau — nhân quản lý tài nguyên và canh gác ranh giới user/kernel; shell và người dùng ngồi phía trên; tệp, tiến trình và bộ nhớ là những trừu tượng trung tâm; còn signals, IPC và threads là cách các tiến trình phối hợp. Nắm trọn bộ từ vựng này trước là đủ nền để học mọi system call về sau.1
Ý chính: trước khi học từng lệnh, hãy nắm vài khái niệm lớn: nhân (người quản lý máy), người dùng, tệp, tiến trình, bộ nhớ, và cách các chương trình “nói chuyện” với nhau. Nhớ nhé: hiểu bộ từ vựng này thì các chương sau mới dễ vào.
The chapter's thesis: Linux system programming rests on a small set of tightly linked fundamental concepts — the kernel manages resources and guards the user/kernel boundary; the shell and users sit above it; files, processes, and memory are the central abstractions; and signals, IPC, and threads are how processes coordinate. Grasping this whole vocabulary first is enough background to learn every later system call.1
Cụm khái niệm 01 Concept cluster 01
Nhân quản lý tài nguyên, shell gửi lệnh, người dùng được định danh Lõi điều hành máy, chỗ gõ lệnh, và ai là ai trên máy The kernel manages resources, the shell sends commands, users are identified
Từ operating system có hai nghĩa: cả gói phần mềm (gồm cả trình thông dịch lệnh, giao diện đồ hoạ, tiện ích tệp), hoặc hẹp hơn là phần lõi quản lý và cấp phát tài nguyên máy (CPU, RAM, thiết bị). Kerrisk dùng từ kernel cho nghĩa hẹp đó, và đó là nghĩa cả cuốn sách quan tâm.1
“Hệ điều hành” có thể hiểu rộng (cả bộ Linux bạn cài) hoặc hẹp (chỉ phần lõi lo chia CPU, bộ nhớ, thiết bị). Phần lõi đó gọi là kernel — đây là nhân vật chính của cả cuốn sách. Phía trên nó là shell (chỗ bạn gõ lệnh) và những người dùng, mỗi người có một danh tính riêng. Nhớ nhé: kernel là người quản lý, shell là quầy nhận lệnh, còn bạn là một người dùng có tên tuổi.
The term operating system has two meanings: the entire software package (including command interpreters, GUIs, and file utilities), or more narrowly the central software that manages and allocates the machine's resources (CPU, RAM, devices). Kerrisk uses kernel for that narrow sense, and it is the sense the whole book is concerned with.1
Định nghĩa. Kernel (nhân) là phần mã luôn thường trú trong bộ nhớ, cung cấp một lớp phần mềm để quản lý các tài nguyên hữu hạn của máy. Chạy chương trình không có nhân là chuyện khả dĩ, nhưng sự hiện diện của nhân giúp việc viết và dùng các chương trình đơn giản hơn hẳn, đồng thời tăng sức mạnh và sự linh hoạt cho lập trình viên.1
Nói đơn giản. Nhân là phần lõi luôn nằm sẵn trong bộ nhớ, lo chia chác tài nguyên cho mọi chương trình. Nhờ có nó, viết phần mềm dễ hơn nhiều. Nhớ nhé: nhân luôn thức để trông coi cả cái máy.
Definition. The kernel is the portion of code always resident in memory, providing a software layer to manage the machine's limited resources. Running programs without a kernel is possible, but the kernel's presence greatly simplifies writing and using programs, and increases the power and flexibility available to programmers.1
user mode ──[ system call ]──> kernel mode
user space : chỉ đọc được vùng của mình
kernel space : nhân toàn quyền
vi phạm → hardware exception
bạn (user mode)
── xin phép ──>
nhân (kernel mode)
user mode ──[ system call ]──> kernel mode
user space : only your own region
kernel space : kernel has full access
violation → hardware exception
-
kernel tasks
Những việc nhân làm — bảy nhóm nhiệm vụ cốt lõi Nhân làm gì — bảy việc chính What the kernel does — seven core tasks
Nhân đảm nhận, trong số khác, bảy nhóm việc: điều phối tiến trình trên một hay nhiều CPU; quản lý bộ nhớ; cung cấp hệ thống tệp; tạo và kết thúc tiến trình; truy cập thiết bị; nối mạng; và cung cấp API lời gọi hệ thống (system call) — chủ đề chính của cả cuốn sách.1 Linux là hệ đa nhiệm ưu tiên (preemptive multitasking): nhiều tiến trình cùng ở trong bộ nhớ, và chính bộ lập lịch của nhân quyết định tiến trình nào chạy, khi nào, bao lâu.1
Nhân làm nhiều việc: chia lượt CPU cho các chương trình, quản lý bộ nhớ, giữ hệ thống tệp, tạo và dừng chương trình, nói chuyện với thiết bị và mạng, và mở “cửa” cho chương trình xin việc (system call). Nhân tự quyết ai chạy trước — chứ không để chương trình giành nhau. Nhớ nhé: nhân là người điều phối, nó cầm cái đồng hồ bấm giờ.
Among other things, the kernel handles seven groups of tasks: process scheduling across one or more CPUs; memory management; provision of a file system; creation and termination of processes; access to devices; networking; and provision of a system call API — the primary topic of the book.1 Linux is a preemptive multitasking system: many processes reside in memory at once, and it is the kernel's scheduler that decides which process runs, when, and for how long.1
Bạn gặp nó ở đâuWhere you meet it Mỗi khi chương trình của bạn mở một tệp, cấp phát bộ nhớ, hay gửi một gói tin — nó đều phải đi qua một trong các dịch vụ này của nhân. Mỗi lần chương trình mở tệp hay xin thêm bộ nhớ, nó đang nhờ nhân làm. Every time your program opens a file, allocates memory, or sends a packet, it goes through one of these kernel services.Hai lợi ích của bộ nhớ ảo
Nhân dùng quản lý bộ nhớ ảo (virtual memory, chi tiết ở §6.4) để đạt hai điều: cô lập các tiến trình với nhau và với nhân, nên một tiến trình không đọc/sửa được bộ nhớ tiến trình khác; và chỉ cần giữ một phần của tiến trình trong RAM, giúp chứa được nhiều tiến trình hơn và dùng CPU hiệu quả hơn.1
Tên tệp của nhân
Bản thực thi của nhân Linux thường nằm ở đường dẫn
/boot/vmlinuz; cái tên mang dấu vết lịch sử: UNIX đời đầu gọi nhân làunix, bản có bộ nhớ ảo đổi thànhvmunix, còn trên Linux chữ z cuối thay cho x báo rằng nhân là tệp thực thi đã nén.1 -
user mode / kernel mode
Hai chế độ CPU — ranh giới bảo vệ cả hệ thống Hai chế độ của CPU — hàng rào an toàn Two CPU modes — the boundary that protects the system
Kiến trúc bộ xử lý hiện đại cho CPU chạy ở ít nhất hai chế độ: user mode và kernel mode (còn gọi supervisor mode). Tương ứng, vùng bộ nhớ ảo được đánh dấu là user space hoặc kernel space. Ở user mode, CPU chỉ truy cập được bộ nhớ user space; chạm vào kernel space sẽ sinh ra một hardware exception. Ở kernel mode, CPU truy cập được cả hai.1
CPU có hai “chế độ”: chế độ thường (user mode) cho chương trình của bạn, và chế độ đặc quyền (kernel mode) cho nhân. Ở chế độ thường, chương trình không được thò tay vào vùng của nhân — thử là bị chặn ngay. Nhớ nhé: có một hàng rào cứng ngăn chương trình phá nhân.
Modern processor architectures let the CPU run in at least two modes: user mode and kernel mode (also called supervisor mode). Correspondingly, virtual memory is marked as user space or kernel space. In user mode the CPU can access only user-space memory; touching kernel space causes a hardware exception. In kernel mode the CPU can access both.1
Bạn gặp nó ở đâuWhere you meet it Một số thao tác chỉ làm được ở kernel mode: dừng máy, truy cập phần cứng quản lý bộ nhớ, khởi động I/O thiết bị — nhờ vậy tiến trình người dùng không thể chạm vào cấu trúc dữ liệu của nhân.1 Những việc nguy hiểm như tắt máy hay điều khiển phần cứng chỉ nhân mới được làm. Certain operations are kernel-mode only: halting the machine, accessing memory-management hardware, initiating device I/O — so user processes cannot touch the kernel's data structures.1Góc nhìn tiến trình so với góc nhìn nhân
Từ góc nhìn một tiến trình, nhiều thứ xảy ra bất đồng bộ: nó không biết khi nào bị ngắt lượt CPU, khi nào được chạy lại, hay dữ liệu của nó đang nằm ở RAM hay vùng swap trên đĩa.1
Nhân biết tất cả
Ngược lại, chỉ có một nhân, nó biết và điều khiển mọi thứ: quyết định tiến trình nào chiếm CPU kế tiếp, giữ cấu trúc dữ liệu về mọi tiến trình, ánh xạ bộ nhớ ảo sang vật lý, và làm mọi giao tiếp trực tiếp với thiết bị I/O.1
-
the shell
Shell — trình thông dịch lệnh, và nó chỉ là một tiến trình người dùng Shell — chỗ gõ lệnh, cũng là một chương trình bình thường The shell — a command interpreter that is just a user process
Shell là chương trình chuyên đọc lệnh người dùng gõ và chạy chương trình tương ứng — một command interpreter. Khác với vài hệ điều hành nơi trình thông dịch là một phần của nhân, trên UNIX shell là một tiến trình người dùng bình thường; nhiều shell khác nhau có thể cùng tồn tại, và nhiều người dùng (hay một người) có thể dùng các shell khác nhau cùng lúc.1 Shell chạy lúc đăng nhập được gọi là login shell.1
Shell là nơi bạn gõ lệnh; nó đọc lệnh rồi chạy chương trình giúp bạn. Điều hay là shell không phải phần của nhân — nó chỉ là một chương trình thường, nên có nhiều loại shell và bạn đổi được. Nhớ nhé: shell là quầy nhận lệnh, không phải ông chủ.
A shell is a program that reads commands typed by a user and runs the matching programs — a command interpreter. Unlike some operating systems where the interpreter is part of the kernel, on UNIX the shell is an ordinary user process; many different shells can coexist, and many users (or one) can use different shells at once.1 The shell started at login is the login shell.1
Bạn gặp nó ở đâuWhere you meet it Khi bạn gõ một lệnh, viết một shell script, hay dùng|,&, biến môi trường — bạn đang dùng các tính năng mà Bourne shell đặt nền và các shell sau kế thừa.1 Mỗi lần gõ lệnh hay viết một đoạn script là bạn đang nói chuyện với shell. When you type a command, write a shell script, or use|,&, environment variables — you are using features the Bourne shell established and later shells inherited.1Những shell quan trọng
Bourne shell (
sh) của Steve Bourne là shell chuẩn của Seventh Edition UNIX; C shell (csh) của Bill Joy ở Berkeley thêm lịch sử lệnh, sửa dòng lệnh, job control; Korn shell (ksh) của David Korn ở AT&T; và Bourne again shell (bash) do Brian Fox và Chet Ramey viết cho dự án GNU — shell phổ biến nhất trên Linux.1Chuẩn hoá
POSIX.2-1992 đặc tả một chuẩn cho shell dựa trên Korn shell đương thời. Ngày nay cả Korn shell lẫn
bashđều tuân POSIX nhưng có nhiều phần mở rộng riêng, và các phần mở rộng đó khác nhau giữa hai shell.1 -
users, groups & superuser
Người dùng, nhóm và superuser — ai được làm gì Người dùng, nhóm, và “sếp lớn” root Users, groups & the superuser — who may do what
Mỗi người dùng có một login name duy nhất và một user ID (UID) dạng số, khai trong tệp mật khẩu
/etc/passwdcùng group ID đầu tiên, thư mục nhà, và login shell.1 Vì lý do an toàn, mật khẩu (dạng mã hoá) thường nằm riêng ở shadow password file. Người dùng được gom thành nhóm (khai trong/etc/group) để tiện kiểm soát truy cập tệp.12Mỗi người trên máy có một tên đăng nhập và một số định danh (UID). Người ta còn gom người dùng thành nhóm để dễ chia quyền. Có một tài khoản đặc biệt tên
rootlà “sếp lớn”, làm được mọi thứ. Nhớ nhé: trên máy, bạn là một cái tên có số; root thì vượt mọi hàng rào.Every user has a unique login name and a numeric user ID (UID), defined in the password file
/etc/passwdalong with a first group ID, a home directory, and a login shell.1 For security, the (encrypted) password is often kept separately in a shadow password file. Users are organized into groups (defined in/etc/group) to help control access to files.12Bạn gặp nó ở đâuWhere you meet it Có một người dùng đặc biệt, superuser, với UID 0 và login name thường làroot: nó vượt qua mọi kiểm tra quyền, truy cập được mọi tệp và gửi tín hiệu tới mọi tiến trình.12 Tài khoản root (số 0) bỏ qua mọi kiểm tra quyền — nên phải rất cẩn thận khi dùng. There is one special user, the superuser, with UID 0 and usually the login nameroot: it bypasses all permission checks, can access any file, and can signal any process.12
Cụm khái niệm 02 Concept cluster 02
Một cây thư mục duy nhất, và một mô hình I/O dùng cho tất cả Một cây thư mục chung, và cách đọc–ghi giống nhau cho mọi thứ A single directory tree, and one I/O model for everything
Nhân duy trì một cấu trúc thư mục phân cấp duy nhất để tổ chức mọi tệp — khác với các hệ như Windows nơi mỗi đĩa có cây riêng. Gốc của cây là root directory, ký hiệu /; mọi tệp và thư mục đều là con cháu của gốc.1 Trên nền đó, điểm đặc trưng của mô hình I/O UNIX là universality of I/O: cùng một tập system call hoạt động được trên mọi loại tệp.1
Trên Linux, tất cả tệp nằm trong một cái cây lớn, bắt đầu từ gốc là dấu /. Không có “ổ C, ổ D” như Windows. Và điều rất hay: dù là tệp văn bản, thiết bị hay đường ống, bạn đều đọc–ghi bằng cùng vài lệnh. Nhớ nhé: một cái cây cho tất cả, và một bộ lệnh cho tất cả.
The kernel maintains a single hierarchical directory structure to organize all files — unlike systems such as Windows where each disk has its own tree. At the base is the root directory, written /; every file and directory is a descendant of the root.1 On that foundation, the defining feature of the UNIX I/O model is universality of I/O: the same set of system calls works on every kind of file.1
Định nghĩa. Một file descriptor là một số nguyên không âm (thường nhỏ) mà system call dùng để chỉ một tệp đang mở, thường nhận được từ lời gọi open(). Theo lệ, mỗi tiến trình thừa kế ba descriptor mở sẵn từ shell: 0 là standard input, 1 là standard output, 2 là standard error — trong thư viện stdio ứng với stdin, stdout, stderr.1
Nói đơn giản. Khi mở một tệp, máy trả cho bạn một con số nhỏ để sau này gọi tên nó — gọi là file descriptor. Ba số đặc biệt luôn sẵn: 0 (đầu vào), 1 (đầu ra), 2 (báo lỗi). Nhớ nhé: mở tệp xong, bạn cầm một con số làm vé.
Definition. A file descriptor is a (usually small) non-negative integer that system calls use to refer to an open file, typically obtained from open(). By convention each process inherits three open descriptors from the shell: 0 is standard input, 1 is standard output, 2 is standard error — in the stdio library, stdin, stdout, stderr.1
open() → fd
read(fd,…) / write(fd,…) / lseek(fd,…)
close(fd)
// cùng bộ lệnh cho tệp, thiết bị, pipe
mở → đọc / ghi → đóng
(giống nhau cho mọi loại tệp)
open() → fd
read(fd,…) / write(fd,…) / lseek(fd,…)
close(fd)
// one API for files, devices, pipes
-
single directory hierarchy
Cây thư mục đơn nhất — mọi thứ treo dưới gốc
/Một cái cây duy nhất, gốc là dấu/The single hierarchy — everything hangs under/Trong hệ thống tệp, mỗi tệp mang một type cho biết nó là loại gì. Loại thông dụng nhất là tệp dữ liệu thường, gọi là regular (hay plain); các loại khác gồm thiết bị, pipe, socket, thư mục và symbolic link.1 Đáng chú ý: từ file thường được dùng cho mọi loại tệp, không riêng tệp thường.1
Mọi tệp đều có một “loại”: tệp thường (chứa dữ liệu), hoặc thư mục, thiết bị, đường ống… Tất cả treo chung trên một cái cây bắt đầu từ gốc
/. Nhớ nhé: “tệp” ở đây nghĩa rất rộng, không chỉ là tệp văn bản.In the file system, each file carries a type telling what it is. The most common is an ordinary data file, called regular (or plain); other types include devices, pipes, sockets, directories, and symbolic links.1 Note: the term file is commonly used for any type of file, not just a regular one.1
Bạn gặp nó ở đâuWhere you meet it Mỗi pathname mô tả vị trí một tệp trong cây: tuyệt đối nếu bắt đầu bằng/(ví dụ/home/mtk/.bashrc), hoặc tương đối so với thư mục làm việc hiện tại của tiến trình.1 Đường dẫn bắt đầu bằng/là tính từ gốc; không có/là tính từ chỗ bạn đang đứng. Each pathname describes a file's location in the tree: absolute if it starts with/(e.g./home/mtk/.bashrc), or relative to the process's current working directory.1Tên tệp hợp lệ
Trên hầu hết hệ tệp Linux, tên tệp dài tối đa 255 ký tự, không được chứa
/hay ký tự null (\0). SUSv3 gọi tập 65 ký tự[-._a-zA-Z0-9]là portable filename character set — nên hạn chế dùng ký tự ngoài tập này để tránh ý nghĩa đặc biệt trong shell.17Thư mục làm việc hiện tại
Mỗi tiến trình có một current working directory, thừa kế từ tiến trình cha; login shell lấy nó từ trường home directory trong tệp mật khẩu, và đổi được bằng lệnh
cd.1 -
links & symbolic links
Liên kết — một tệp có thể mang nhiều tên Liên kết — một tệp, nhiều tên gọi Links — one file can have many names
Một directory thực chất là tệp đặc biệt chứa bảng ánh xạ tên tệp sang tệp tương ứng; cặp “tên-cộng-tham chiếu” đó gọi là link. Một tệp có thể có nhiều link, tức nhiều tên, ở cùng hay khác thư mục.1 Mỗi thư mục luôn có ít nhất hai mục:
.(chính nó) và..(thư mục cha); với gốc,/..trỏ về chính/.1Thư mục chỉ là một bảng ghi “tên này ứng với tệp kia”. Một tệp có thể có nhiều tên cùng trỏ vào. Mỗi thư mục luôn có hai mục đặc biệt:
.là chính nó,..là thư mục cha. Nhớ nhé: tên tệp chỉ là cái nhãn trỏ vào tệp, một tệp dán được nhiều nhãn.A directory is really a special file holding a table that maps filenames to their files; that “name-plus-reference” pairing is a link. A file may have several links — several names — in the same or different directories.1 Every directory has at least two entries:
.(itself) and..(its parent); for the root,/..refers to/itself.1Bạn gặp nó ở đâuWhere you meet it Một symbolic link là tệp chứa tên một tệp khác; khi gặp nó trong một pathname, nhân thường tự dereference (đi theo). Nếu nó trỏ tới tệp không tồn tại thì gọi là dangling link.1 Symbolic link là một “lối tắt” trỏ tới tệp khác; nếu tệp đích biến mất, lối tắt thành “dangling” (trỏ vào hư không). A symbolic link is a file holding another file's name; when the kernel meets one in a pathname it usually dereferences (follows) it. If it points to a nonexistent file, it is a dangling link.1 -
universality of I/O
I/O vạn năng — một bộ lệnh cho tệp, thiết bị, pipe Đọc–ghi vạn năng — cùng vài lệnh cho mọi loại tệp Universality of I/O — one API for files, devices, pipes
Nhờ universality of I/O, cùng các system call (
open(),read(),write(),close()…) dùng được cho mọi loại tệp, kể cả thiết bị: nhân dịch yêu cầu I/O của ứng dụng thành thao tác phù hợp trên hệ tệp hay trình điều khiển thiết bị.1 Nhân về cơ bản cung cấp một loại tệp duy nhất: một dòng byte tuần tự, mà với đĩa, băng từ, thiết bị có thể truy cập ngẫu nhiên bằnglseek().1Dù mở tệp văn bản, bàn phím hay đường ống, bạn đều dùng đúng mấy lệnh: mở, đọc, ghi, đóng. Nhân lo phần khác biệt bên dưới. Nhớ nhé: học một bộ lệnh I/O là đọc–ghi được gần như mọi thứ.
Thanks to universality of I/O, the same system calls (
open(),read(),write(),close()…) work on every file type, including devices: the kernel translates an application's I/O requests into the right file-system or device-driver operations.1 The kernel essentially provides one file type — a sequential stream of bytes — which for disks and tape devices can be accessed randomly withlseek().1Bạn gặp nó ở đâuWhere you meet it Nhiều chương trình xử lý ký tự newline (ASCII 10) như dấu ngắt dòng; UNIX không có ký tự end-of-file — kết thúc tệp được nhận biết khiread()trả về không còn dữ liệu.1 Không có ký tự “hết tệp” đặc biệt: khi đọc mà không còn gì nữa, nghĩa là đã hết. Many programs treat the newline character (ASCII 10) as a line break; UNIX has no end-of-file character — end of file is detected whenread()returns no data.1Thư viện stdio
Để làm I/O tệp, chương trình C thường dùng bộ hàm stdio (
fopen(),fclose(),scanf(),printf(),fgets(),fputs()…), được xây trên các system call I/O.1Hai mức trừu tượng
Nhờ phân tầng này, lập trình viên chọn được: làm việc ở mức thấp với file descriptor và system call, hay ở mức cao với stream của stdio có đệm sẵn — hai cách cùng tồn tại trên một tệp.1
-
file permissions
Quyền tệp — chín bit chia theo chủ, nhóm, và phần còn lại Quyền tệp — ai được đọc, ghi, chạy File permissions — nine bits for owner, group, and others
Mỗi tệp có một user ID và group ID xác định chủ sở hữu. Để xét truy cập, hệ chia người dùng thành ba hạng: owner (chủ), group (thành viên nhóm của tệp), và other (phần còn lại). Mỗi hạng có ba bit quyền — read, write, execute — tổng cộng chín bit.17
Mỗi tệp có chủ và nhóm. Quyền chia ba nhóm người (chủ / cùng nhóm / người khác), mỗi nhóm có ba quyền: đọc, ghi, chạy. Vậy là chín ô bật/tắt. Nhớ nhé: quyền tệp là một bảng 3×3 — ai, được làm gì.
Each file has a user ID and group ID defining its owner. For access, the system divides users into three categories: owner, group (members of the file's group), and other (the rest). Each category has three permission bits — read, write, execute — nine bits in all.17
Bạn gặp nó ở đâuWhere you meet it Trên thư mục, ba quyền mang nghĩa hơi khác: read cho liệt kê tên tệp bên trong, write cho thêm/xoá/đổi tên tệp, còn execute (đôi khi gọi search) cho truy cập tệp bên trong thư mục.1 Với thư mục: đọc = xem danh sách tên, ghi = thêm/xoá tệp, chạy = đi vào trong để lấy tệp. On directories the three permissions mean slightly different things: read lists the filenames inside, write adds/removes/renames files, and execute (sometimes search) permits access to files within.1
Cụm khái niệm 03 Concept cluster 03
Tiến trình: một chương trình đang chạy, với vùng nhớ và danh tính riêng Tiến trình: chương trình đang chạy, có bộ nhớ và danh tính riêng The process: a running program with its own memory and identity
Nói gọn nhất, một process là một thể hiện của một chương trình đang thực thi. Khi chạy chương trình, nhân nạp mã vào bộ nhớ ảo, cấp chỗ cho biến, và dựng các cấu trúc dữ liệu ghi sổ (process ID, trạng thái kết thúc, các user/group ID…).1 Từ góc nhìn nhân, tiến trình chính là các thực thể mà nhân phải chia sẻ tài nguyên cho.1
Tiến trình là một chương trình đang chạy. Khi bạn mở một chương trình, nhân nạp nó vào bộ nhớ, dành chỗ cho dữ liệu, và ghi sổ về nó (số định danh, ai là chủ…). Nhiều tiến trình cùng chạy, và nhân chia tài nguyên cho chúng. Nhớ nhé: chương trình nằm trên đĩa; tiến trình là nó khi đã sống dậy và chạy.
Put most simply, a process is an instance of an executing program. When a program runs, the kernel loads its code into virtual memory, allocates space for variables, and sets up bookkeeping data structures (process ID, termination status, user/group IDs…).1 From the kernel's viewpoint, processes are the entities among which it must share resources.1
Định nghĩa. Một tiến trình được chia logic thành các phần gọi là segment: text (các lệnh của chương trình), data (biến tĩnh), heap (vùng cấp phát động), và stack (phình–co theo lời gọi hàm, giữ biến cục bộ và thông tin liên kết lời gọi).1
Nói đơn giản. Bộ nhớ của một tiến trình chia thành mấy phần: phần lệnh, phần biến, phần heap (xin thêm khi cần), và phần stack (dùng khi gọi hàm). Nhớ nhé: lệnh, dữ liệu, heap, stack — bốn ngăn của một tiến trình.
Definition. A process is logically divided into parts called segments: text (the program's instructions), data (static variables), heap (dynamically allocated memory), and stack (growing and shrinking with function calls, holding local variables and call-linkage information).1
fork() → tạo bản sao (tiến trình con)
exec() → thay mã bằng chương trình mới
exit() → kết thúc, trả termination status
wait() → cha thu trạng thái của con
fork = nhân đôi
exec = thay ruột
exit = kết thúc
wait = cha dọn dẹp
fork() → duplicate (child process)
exec() → replace code with a new program
exit() → terminate, yield a status
wait() → parent reaps the child's status
-
fork · exec · wait
Vòng đời tiến trình — fork sinh, exec biến hình, wait thu dọn Vòng đời — sinh ra, đổi ruột, rồi được dọn dẹp Process lifecycle — fork, exec, and wait
Một tiến trình tạo tiến trình mới bằng system call
fork(): tiến trình gọi là parent, tiến trình mới là child. Nhân tạo con bằng cách nhân bản cha — con thừa kế bản sao các segment data, stack, heap của cha (text, vì ở vùng chỉ-đọc, được dùng chung).1 Con thường gọi tiếpexecve()để nạp và chạy một chương trình hoàn toàn mới, phá bỏ các segment cũ và thay bằng segment của chương trình mới.1Một tiến trình “đẻ” ra con bằng
fork()— con là bản sao của cha. Rồi con thường dùngexec()để thay toàn bộ nội dung bằng một chương trình khác. Đây chính là cách shell chạy mọi lệnh bạn gõ. Nhớ nhé: fork nhân đôi, exec thay ruột.A process creates a new one with the
fork()system call: the caller is the parent, the new process the child. The kernel makes the child by duplicating the parent — the child inherits copies of the parent's data, stack, and heap segments (the text, being read-only, is shared).1 The child commonly then callsexecve()to load and run an entirely new program, discarding the old segments and replacing them with the new program's.1Bạn gặp nó ở đâuWhere you meet it Mỗi process có một process ID (PID) nguyên duy nhất và một parent process ID (PPID) chỉ tiến trình đã yêu cầu nhân tạo ra nó.1 Mỗi tiến trình có một số định danh (PID) và biết cha nó là ai (PPID). Each process has a unique integer process ID (PID) and a parent process ID (PPID) naming the process that asked the kernel to create it.1Kết thúc và termination status
Một tiến trình kết thúc theo hai cách: tự gọi
_exit()(hoặcexit()), hoặc bị một signal giết. Cả hai đều để lại một termination status — số nguyên không âm nhỏ — mà cha đọc được quawait(). Theo lệ, status 0 là thành công, khác 0 là có lỗi.1$? trong shell
Hầu hết shell cho biết termination status của chương trình chạy gần nhất qua biến shell
$?— cách đơn giản để một script kiểm tra lệnh vừa rồi thành công hay thất bại.1 -
credentials & capabilities
Danh tính tiến trình — real, effective, và đặc quyền Danh tính tiến trình — chạy dưới danh nghĩa ai Process credentials — real, effective, and privilege
Mỗi tiến trình mang một tập UID và GID gọi là credentials: real user/group ID (thừa kế từ cha) cho biết tiến trình thuộc về ai; effective user/group ID (cùng với supplementary group ID) quyết định quyền khi truy cập tài nguyên; và các supplementary group ID.12 Thường effective trùng real, nhưng đổi effective là cách tiến trình “mượn” đặc quyền của người khác.1
Mỗi tiến trình chạy “dưới danh nghĩa” một người dùng và nhóm. Có cặp ID thật (bạn là ai) và cặp ID hiệu lực (lúc này được quyền như ai). Nhờ đó một chương trình có thể tạm mượn quyền cao hơn khi cần. Nhớ nhé: tiến trình luôn chạy nhân danh một ai đó, và điều đó quyết định nó được làm gì.
Each process carries a set of UIDs and GIDs called credentials: real user/group IDs (inherited from the parent) say who the process belongs to; effective user/group IDs (together with supplementary group IDs) determine permissions when accessing resources; and supplementary group IDs.12 Usually effective equals real, but changing the effective IDs lets a process assume another's privileges.1
Bạn gặp nó ở đâuWhere you meet it Một tiến trình privileged theo lối cũ là tiến trình có effective user ID bằng 0 (superuser), vượt mọi hạn chế quyền của nhân; set-user-ID là một cơ chế để đạt điều đó.1 Nếu effective ID của tiến trình là 0 thì nó có quyền root — làm được mọi thứ. A traditionally privileged process is one whose effective user ID is 0 (superuser), bypassing the kernel's permission restrictions; set-user-ID is one mechanism that achieves this.1Capabilities
Từ nhân 2.2, Linux chia đặc quyền của superuser thành các đơn vị nhỏ gọi là capabilities. Mỗi thao tác đặc quyền gắn với một capability; một tiến trình chỉ làm được nếu có capability tương ứng. Tên capability bắt đầu bằng tiền tố
CAP_, nhưCAP_KILL; chi tiết ở Chương 39.16Tiến trình init
Khi khởi động, nhân tạo một tiến trình đặc biệt tên init (từ tệp
/sbin/init), “cha của mọi tiến trình”, luôn mang PID 1 và chạy với đặc quyền superuser; init không thể bị giết và chỉ kết thúc khi hệ thống tắt.1 -
memory mappings
Ánh xạ bộ nhớ — mmap đưa tệp hoặc vùng trống vào không gian địa chỉ Ánh xạ bộ nhớ — đưa tệp thẳng vào bộ nhớ Memory mappings — mmap brings files or blank memory into the address space
System call
mmap()tạo một memory mapping mới trong không gian địa chỉ ảo của tiến trình gọi. Có hai loại: file mapping ánh xạ một vùng của tệp vào bộ nhớ, để truy cập nội dung tệp qua thao tác trên byte; và anonymous mapping không có tệp đi kèm, các trang được khởi tạo bằng 0.1Lệnh
mmap()“dán” một tệp — hoặc một vùng trống — thẳng vào bộ nhớ của chương trình, để bạn đọc tệp như đọc một mảng trong RAM. Nhớ nhé: mmap biến tệp thành một vùng nhớ bạn chạm tay vào được.The
mmap()system call creates a new memory mapping in the calling process's virtual address space. There are two kinds: a file mapping maps a region of a file into memory, so its contents can be accessed via byte operations; and an anonymous mapping has no backing file, its pages initialized to 0.1Bạn gặp nó ở đâuWhere you meet it Ánh xạ của một tiến trình có thể là private (thay đổi không lộ ra ngoài) hoặc shared (thay đổi hiện ra với các tiến trình cùng ánh xạ và ghi xuống tệp) — nền cho cả I/O ánh xạ bộ nhớ lẫn IPC.1 Ánh xạ có thể riêng tư hoặc dùng chung; dùng chung thì nhiều tiến trình thấy cùng một vùng nhớ. A mapping can be private (changes stay local) or shared (changes are seen by other processes sharing it and written to the file) — the basis of both memory-mapped I/O and IPC.1Thư viện tĩnh và chia sẻ
Một object library gom mã đối tượng của nhiều hàm. Thư viện static (archive) được trình liên kết chép thẳng vào tệp thực thi; thư viện shared chỉ để lại một ghi chú, và lúc chạy một chương trình gọi dynamic linker nạp thư viện, liên kết tại thời điểm chạy.1
Vì sao chia sẻ thắng thế
Với thư viện shared, chỉ một bản mã nằm trong bộ nhớ cho mọi chương trình dùng chung, tiết kiệm đĩa lẫn RAM; và chỉ cần dựng lại thư viện là các chương trình tự dùng bản hàm mới ở lần chạy sau.1
-
environment & resource limits
Môi trường và giới hạn tài nguyên — hành trang tiến trình mang theo Biến môi trường và giới hạn — hành trang của tiến trình Environment & resource limits — what a process carries along
Mỗi tiến trình có một environment list: tập các environment variable (cặp tên–giá trị) giữ trong bộ nhớ user-space. Khi tạo con bằng
fork(), con thừa kế bản sao môi trường của cha — một cách để cha truyền thông tin cho con.1 Biến môi trường tạo bằng lệnhexporttrong hầu hết shell; chương trình C đọc chúng qua biến ngoàichar **environ.1Mỗi tiến trình mang theo một danh sách “biến môi trường” — như
HOME(thư mục nhà) hayPATH(nơi tìm chương trình). Con thừa kế từ cha. Nhớ nhé: biến môi trường là hành trang truyền từ cha sang con.Each process has an environment list: a set of environment variables (name–value pairs) kept in user-space memory. When a child is created with
fork(), it inherits a copy of the parent's environment — a way for the parent to pass information down.1 Variables are created withexportin most shells; C programs read them via the external variablechar **environ.1Bạn gặp nó ở đâuWhere you meet it Shell dùng các biến nhưHOME(thư mục đăng nhập) vàPATH(danh sách thư mục để tìm chương trình). Ngoài ra, quasetrlimit(), tiến trình đặt giới hạn trên cho tài nguyên nó tiêu thụ, mỗi giới hạn có một soft limit và một hard limit.1PATHcho shell biết tìm chương trình ở đâu; còn giới hạn tài nguyên chặn một tiến trình ngốn quá nhiều. The shell uses variables likeHOME(login directory) andPATH(directories to search for programs). Also, viasetrlimit()a process sets upper limits on the resources it consumes, each with a soft limit and a hard limit.1
Ba ngộ nhận thường gặp Three common misconceptions
“Chương trình tự mở tệp, tự tạo tiến trình” “A program opens files and creates processes by itself”
Ngộ nhận: chương trình trực tiếp làm mọi việc với phần cứng và hệ thống.
Thực tế: mọi câu như “tiến trình tạo tiến trình khác” chỉ là cách nói gọn cho “tiến trình yêu cầu nhân làm việc đó” qua system call.1
Myth: a program does everything with hardware and the system directly.
Reality: every phrase like “a process creates another process” is shorthand for “a process asks the kernel to do it” via a system call.1
“Shell là một phần của hệ điều hành/nhân” “The shell is part of the OS/kernel”
Ngộ nhận: shell là thành phần cố định bên trong nhân.
Thực tế: trên UNIX, shell chỉ là một tiến trình người dùng bình thường; có nhiều shell và người dùng đổi được tự do.1
Myth: the shell is a fixed component inside the kernel.
Reality: on UNIX the shell is just an ordinary user process; many shells exist and users switch freely.1
“root mạnh vì nó là một tiến trình khác thường” “root is powerful because it is a special kind of process”
Ngộ nhận: superuser là một loại tiến trình riêng biệt.
Thực tế: đặc quyền chỉ đến từ một con số — effective user ID bằng 0; từ nhân 2.2, Linux còn chẻ nó thành các capability nhỏ hơn.16
Myth: the superuser is a distinct kind of process.
Reality: privilege comes from a single number — effective user ID 0; since kernel 2.2, Linux also splits it into finer-grained capabilities.16
Toàn cảnh · phần còn lại của chương Overview · the rest of the chapter
Phối hợp, phiên làm việc, thời gian, và một cửa sổ nhìn vào nhân Cách các tiến trình phối hợp, và vài khái niệm còn lại Coordination, sessions, time, and a window into the kernel
Bốn thẻ dưới đây là bản đồ nhanh cho §2.10–2.19 — đúng tinh thần một chương tổng quan: mỗi chủ đề được nêu để bạn biết nó tồn tại và sẽ gặp lại ở một chương riêng, chứ chưa đi sâu.1
Phần này điểm nhanh những khái niệm còn lại: cách tiến trình nói chuyện (IPC, signals), chạy song song (threads), rồi nhóm công việc, thời gian, và thư mục /proc. Chỉ là giới thiệu để bạn nhận mặt. Nhớ nhé: đây là mục lục, chi tiết nằm ở các chương sau.
The four cards below are a quick map of §2.10–2.19 — in the spirit of an overview chapter: each topic is named so you know it exists and will meet it again in its own chapter, not explored in depth here.1
-
IPC & signals
Giao tiếp liên tiến trình và signals — cách tiến trình báo tin cho nhau IPC và signals — tiến trình nhắn tin cho nhau IPC & signals — how processes notify each other
Linux cho nhiều cơ chế interprocess communication (IPC): signals báo một sự kiện đã xảy ra; pipes (chính là toán tử
|của shell) và FIFOs truyền dữ liệu; sockets truyền dữ liệu giữa các tiến trình cùng máy hoặc qua mạng; file locking; message queues; semaphores để đồng bộ; và shared memory cho nhiều tiến trình dùng chung một vùng nhớ.1Các tiến trình có nhiều cách “nói chuyện”: signals (gõ cửa báo tin), pipes (
|trong shell), sockets (qua mạng), shared memory (dùng chung một vùng nhớ)… Nhớ nhé: có cả một hộp công cụ để tiến trình trao đổi với nhau.Linux offers many interprocess communication (IPC) mechanisms: signals indicate an event has occurred; pipes (the shell's
|operator) and FIFOs transfer data; sockets transfer data between processes on one host or across a network; file locking; message queues; semaphores for synchronization; and shared memory for sharing a memory region.1Bạn gặp nó ở đâuWhere you meet it Signals thường được mô tả là “software interrupt”, mỗi loại mang tên dạngSIGxxxx; ví dụ gõ ký tự interrupt (thường Control-C) khiến nhân gửi tín hiệu tới tiến trình đang chạy.13 Bấm Control-C để dừng một chương trình chính là gửi cho nó một signal. Signals are often described as “software interrupts,” each named likeSIGxxxx; typing the interrupt character (usually Control-C) makes the kernel send a signal to the running process.13 -
threads
Threads — nhiều luồng chạy chung một không gian địa chỉ Threads — nhiều luồng cùng làm trong một tiến trình Threads — multiple flows sharing one address space
Mỗi tiến trình có thể có nhiều thread thực thi. Có thể hình dung threads như một tập tiến trình cùng chia sẻ bộ nhớ ảo — mỗi thread chạy cùng mã chương trình, dùng chung vùng dữ liệu và heap, nhưng mỗi thread có stack riêng cho biến cục bộ và thông tin liên kết lời gọi.14
Một tiến trình có thể có nhiều “luồng” cùng chạy, dùng chung bộ nhớ nhưng mỗi luồng có stack riêng. Nhờ vậy nhiều việc làm song song trong một chương trình. Nhớ nhé: threads là nhiều người cùng làm trong một phòng, dùng chung đồ nhưng mỗi người một bàn.
Each process can have multiple threads of execution. Threads can be pictured as a set of processes sharing the same virtual memory — each runs the same program code and shares the data area and heap, but each has its own stack for local variables and call linkage.14
Bạn gặp nó ở đâuWhere you meet it Threads liên lạc qua biến toàn cục chung; API threads cung cấp condition variable và mutex để đồng bộ việc dùng chung biến. Lợi ích chính: dễ chia sẻ dữ liệu và tận dụng xử lý song song trên phần cứng đa xử lý.14 Các luồng chia sẻ dữ liệu dễ dàng, nhưng phải dùng “khoá” (mutex) để không giẫm chân nhau. Threads communicate via shared global variables; the threads API provides condition variables and mutexes to synchronize shared-variable use. Key benefits: easy data sharing and taking advantage of parallelism on multiprocessor hardware.14 -
process groups · sessions · PTYs
Nhóm tiến trình, phiên và pseudoterminal — khung cho job control Nhóm việc, phiên làm việc, và terminal ảo Process groups, sessions & PTYs — the frame for job control
Mỗi chương trình shell chạy đều thành một tiến trình mới; một pipeline như
ls -l | sort -k5n | lesstạo ba tiến trình. Các shell (trừ Bourne shell) có job control: mọi tiến trình trong một pipeline được gộp thành một process group (job), chia sẻ một process group ID.1 Các nhóm tiến trình lại gộp thành session, thường gắn với một controlling terminal.1Khi bạn nối lệnh bằng
|, shell tạo nhiều tiến trình và gộp chúng thành một “job” để quản lý chung (dừng, tiếp, đưa ra nền sau). Nhiều job gộp thành một phiên gắn với cửa sổ terminal. Nhớ nhé: job control là cách shell cầm cả một nhóm lệnh như một khối.Every program the shell runs becomes a new process; a pipeline like
ls -l | sort -k5n | lesscreates three. Shells (except the Bourne shell) offer job control: all processes in a pipeline form one process group (job) sharing a process group ID.1 Process groups in turn form a session, usually tied to a controlling terminal.1Bạn gặp nó ở đâuWhere you meet it Một pseudoterminal là cặp thiết bị ảo (master/slave) hành xử như terminal; nó là nền của cửa sổ terminal trong X, và của đăng nhập mạng quatelnethayssh.1 Cửa sổ terminal và phiênsshchạy được là nhờ “terminal ảo” (pseudoterminal). A pseudoterminal is a pair of virtual devices (master/slave) that behaves like a terminal; it underlies terminal windows under X and network logins viatelnetorssh.1 -
time · realtime · /proc
Thời gian, realtime và
/proc— đo đạc và nhìn vào trong nhân Thời gian, realtime, và cửa sổ/procTime, realtime &/proc— measuring and peering insideTiến trình quan tâm hai loại thời gian: real time (thời gian thực — đo từ một mốc chuẩn hoặc từ lúc tiến trình bắt đầu) và process time (thời gian CPU), chia thành system CPU time (chạy trong kernel mode) và user CPU time (chạy trong user mode).1 Trên UNIX, thời gian lịch được đếm bằng giây kể từ nửa đêm 1/1/1970 UTC — mốc gọi là Epoch.1
Có hai loại thời gian: thời gian thật (đồng hồ treo tường) và thời gian CPU (máy thực sự tính bao lâu). UNIX đếm thời gian từ một mốc tên là Epoch: nửa đêm 1/1/1970. Nhớ nhé: với UNIX, thời gian bắt đầu từ đầu năm 1970.
A process cares about two kinds of time: real time (measured from a standard point or from the process's start) and process time (CPU time), split into system CPU time (in kernel mode) and user CPU time (in user mode).1 On UNIX, calendar time is counted in seconds since midnight on 1 January 1970 UTC — the Epoch.1
Bạn gặp nó ở đâuWhere you meet it Hệ tệp ảo/procphơi bày cấu trúc dữ liệu của nhân dưới dạng tệp và thư mục (ví dụ/proc/PIDcho mỗi tiến trình); nội dung thường là văn bản đọc được./prockhông nằm trong chuẩn nào và là đặc thù Linux.15 Thư mục/proclà “cửa sổ” nhìn vào bên trong nhân, đọc như tệp thường — nhưng chỉ có trên Linux. The virtual/procfile system exposes kernel data structures as files and directories (e.g./proc/PIDper process); contents are usually readable text./procis in no standard and is Linux-specific.15Realtime và client-server
Ứng dụng realtime cần phản hồi trong một hạn chót xác định sau sự kiện kích hoạt; POSIX.1b định nghĩa một loạt mở rộng cho POSIX.1 (I/O bất đồng bộ, khoá bộ nhớ, đồng hồ và timer realtime, signal realtime…) mà Linux hỗ trợ.1
Kiến trúc client-server
Một ứng dụng client-server tách thành hai tiến trình: client gửi yêu cầu dịch vụ, server xử lý rồi gửi phản hồi — client và server có thể cùng máy hoặc trên các máy nối mạng, giao tiếp qua chính các cơ chế IPC ở §2.10.1
Tự kiểm Self-check
Năm câu hỏi để biết bạn đã nắm bộ từ vựng nền tảng Năm câu hỏi kiểm tra nhanh Five questions to check you grasped the fundamentals
Trả lời được những câu này nghĩa là bạn đã nắm trục xuyên suốt của chương: nhân ở trung tâm, và mọi khái niệm khác xoay quanh ranh giới user/kernel.
Nếu trả lời được, nghĩa là bạn đã hiểu những chữ cốt lõi của chương này.
Answering these means you grasped the chapter's spine: the kernel at the center, every other concept circling the user/kernel boundary.
-
Vì sao hầu như mọi việc hệ thống — mở tệp, tạo tiến trình, gửi gói tin — cuối cùng đều phải đi qua nhân? Nêu vai trò của system call.
Gợi ý sâu hơn: user mode và kernel mode khác nhau ở chỗ nào, và điều gì xảy ra khi tiến trình user chạm vào kernel space?
-
“Everything is a file” và “universality of I/O” nghĩa là gì? Kể bốn system call I/O dùng chung cho mọi loại tệp.
Gợi ý sâu hơn: file descriptor 0, 1, 2 là gì, và chúng liên hệ thế nào với
stdin,stdout,stderrcủa stdio? -
Mô tả bộ ba
fork()–exec()–wait(): mỗi lời gọi làm gì, và vì sao shell cần cả ba để chạy một lệnh?Gợi ý sâu hơn: con thừa kế những segment nào từ cha, và segment nào được dùng chung thay vì sao chép?
-
Credentials của một tiến trình gồm những gì? real và effective user ID khác nhau ra sao, và số nào làm nên đặc quyền superuser?
Gợi ý sâu hơn: capabilities (từ nhân 2.2) thay đổi bức tranh “tất cả hoặc không gì” của superuser như thế nào?
-
Kể ba cơ chế IPC và nói signals khác threads ở điểm cốt lõi nào.
Gợi ý sâu hơn: một signal có thể ở trạng thái pending khi nào, và “block” một signal qua signal mask nghĩa là gì?
Vì sao chương trình không tự đụng vào phần cứng mà phải nhờ nhân? Nhân đóng vai gì?
Trên Linux, các tệp được sắp xếp thế nào? Vì sao cùng vài lệnh lại đọc–ghi được nhiều loại tệp?
Tiến trình là gì? Kể hai việc xảy ra khi bạn chạy một chương trình.
Tài khoản root khác người dùng thường ở chỗ nào?
Kể một cách để hai chương trình “nói chuyện” với nhau.
Why does almost every system task — opening files, creating processes, sending packets — ultimately go through the kernel? State the role of a system call.
What do “everything is a file” and “universality of I/O” mean? Name four I/O system calls shared by all file types.
Describe the
fork()–exec()–wait()trio: what each call does, and why the shell needs all three to run a command.What makes up a process's credentials? How do real and effective user IDs differ, and which number confers superuser privilege?
Name three IPC mechanisms and say how signals differ from threads at their core.
Khép lại chương Closing the chapter
Lập trình hệ thống Linux đứng trên một nhúm khái niệm gắn chặt với nhau; ở trung tâm là nhân, và mọi việc hệ thống đều là một lời nhờ nhân làm hộ. Nắm trọn bộ từ vựng này — kernel, tệp, tiến trình, bộ nhớ, IPC — là bạn đã có đủ nền để bước vào từng system call.1
Lập trình hệ thống dựng trên vài khái niệm cốt lõi; nhân đứng giữa, và chương trình luôn nhờ nhân làm việc nặng. Nhớ bộ chữ này là bạn sẵn sàng học tiếp. Nhớ nhé: hiểu bản đồ rồi thì chuyến đi mới dễ.
Linux system programming rests on a small set of tightly linked concepts; at the center is the kernel, and every system task is a request for the kernel to act. Grasp this whole vocabulary — kernel, files, processes, memory, IPC — and you have the background to step into each system call.1