22/02/2013
Thư viện Tin hc >> Hệ Điều Hành-Mng >> Linux & Others
www.thuvien-it.net/home/tinhoc/sub.asp?sid=117&rn=100&pn=1&ob=1
1/6
In Bài --
Đóng
Unix/Linux: Tiến trình (process) – Phn 1
Unix hệ đa xlí, tức khả ng thực thi nhiều c vcùng mt c.
Mt chương trình máy tính mt chuỗi các ch lệnh (intructions, hay
còn gi lệnh máy) theo đó máy tính phải thực hin. Mt khác i
nguyên máy tính (CPU, bộ nhớ, tệp, các thiết bị...) hữu hạn và khi các
chương trình chạy thì các chương trình đu có nhu cầu trên các i
nguyên đó.
1. Tng quan về tiến trình:
1.1. Tiến trình:
Đđáp ng nhu cầu tài nguyên, cần một sách lưc chạy tnh thật hiệu quđể đảm bảo tính đa
nhiệm, nhiều ngưi dùng. Cách phbiến nhất là cấp tài nguyên cho mỗi chương trình trong một lưng thi
gian nhất định, sao cho các chương trình đều hội thực hiện như nhau và trong thi gian thc hiện
chương tnh, cần kiểm soát việc thc hiện đó chặt chẻ. Đlàm điều đó, ta đưa ra một khái niệm gọi là tiến
tnh (process).
Vậy tiến trình (TT) là thi gian thc hiện (instance of execution) của một chương tnh và việc thc hiện
hiện đó ch xảy ra trong một khoản thi gian nhất định (gọi là slice time). Tuy nhiên để thc hiện đưc
chương trình, TT sẽ s dụng CPU để chạy các lệnh của nó, và bộ nhớ nơi có mã lệnh (code hay text), dữ
liệu (data), và ngăn xếp (stack). Một TT khi thc hiện phải làm theo một trình tự các ch lệnh trong vùng
code của TT và không nhảy tới các ch lệnh của TT khác; TT ch thđọc/ghi truy nhập data và stack
của nó, nhưng không thtrên data và stack của TT khác. TT liên lạc với các TT khác và phần còn lại của
hthống bằng các Goị Hệ Thống (GHT, system call). Hthống phân chia việc thực hiện ra là hai chế độ,
user mode và kernel mode như đã nói, nhưng cho dù như vậy, thì kernel vẫn là người thực hiện mã của TT
(còn gọi là "nhân danh TT của người dùng"). Cần nhận thc rằng, kernel không phải là tập tách biệt các TT
và chạy song song với TT ngưi dùng, mà kernel là một phần của mỗi TT người dùng.
1.2. Môi trường thc hin:
1.2.1. Chế độ thực hiện
Việc thc hiện một TT tn Unix đưc chia ra làm hai mc: user (ngưi dùng) và kernel (nhân của h
thống). Khi một TT của user thc hiện một chc năng của nhân (thông qua gọi hthốngfiGHT), chế độ
thc hiện của TT sẽ chuyển t chế độ ngưi dùng (user mode) sang chế độ nhân của hthống (kernel
mode): Hthống sẽ thực hiện và phc v các yêu cầu của user, trả lại kết quả. Ngay cả khi user tạo ra các
yêu cầu không tường minh, thì hvẫn thực hiện các kết toán liên quan ti TT của user, thao tác các
ngắt, lập biểu các TT, quản lí bộ nh...
Kernel mode là một chế độ đặc quyền, trong đó không gii hạn nào đối với kernel: kernel sử dụng
22/02/2013
Thư viện Tin hc >> H Điu Hành-Mng >> Linux & Others
www.thuvien-it.net/home/tinhoc/sub.asp?sid=117&rn=100&pn=1&ob=1
2/6
tất cả các lệnh của CPU, các thanh ghi của CPU, kiểm soát bộ nh, liên lạc trực tiếp vi các thiết bị ngoại
vi. Kernel tiếp nhận và x lí các yêu cầu của các TT của user, sau đó gởi kết quả đến các TT đó.
User mode đưc hiểu là chế độ thc hiện nh thưng của một tiến trình. Trong chế độ này, nhiều
hạn chế áp đặt lên TT: TT ch truy nhập đưc các lệnh và dữ liệu của nó, không thtruy nhập lệnh, dữ liệu
của kernel và của các TT khác, một số các thanh ghi của CPU là cấm. Ví dụ: không gian địa ch ảo của
một TT đưc chia ra thành miền ch truy nhập được trong chế độ kernel, miền khác ở chế độ user, hay TT
không thể tương tác với máy vật lí, một số lệnh của CPU không đưc sử dụng, có thbị ngắt trong bất
lúc nào. Một TT trong user mode khi muốn truy nhập tài nguyên, phải thực hiện qua gọi hệ thống (GHT).
Gọi hthống (GHT hay gọi thc hiện chc năng hthống cung cấp) là quá trình chuyển thông số (yêu
cầu qua tên hay số của các dịch v hthống) mà TT yêu cầu cho kernel thc hiện. Trong Unix, việc đó
đưc làm qua một bẫy hthống (trap), sau đó kernel sẽ thc hiện nhu cầu của TT, đôi khi còn nói là:
kernel thực hiện TT trên danh nghĩa của TT, trong môi trưng của TT. Kernel không phảI là tập ch biệt
của TT chạy song song vi TT người dùng, mà là một phần của mỗi TT ngưi dùng. Văn cảnh tnh bày nói
"kernel cung cấp tài nguyên" hay "kernel thc hiện ... "nghĩa là TT đang chạy trong kernel mode cấp tài
nguyên hay TT thc hiện . . .Bản chất của GHT để thc hiện các dịch v của kernel và mã thực thi các dịch
v đó đã là một phần trong mã của TT ngưi dùng, ch khác là mã đó ch chạy trong kernel mode mà thôi.
Ví dụ: shell đọc đầu vào t thiết bị đầu cuối bằng một GHT, lúc này kernel thc hiện nhân danh TT shell,
kiểm soát thao c của thiết bị đầu cuối và trlại cho shell t nhận đưc. Shell sau đó chạy trong user
mode, thông dịch xâu t và thc hiện các hành vi nhất định và có thể phát sinh GHT tiếp theo.
1.2.2. Môi tng thc hiện của Tiến tnh
Như đã nói có rất nhiều TT đưc thực hiện đồng thi trong hthống, nhưng kernel cần lập biểu để đưa
vào thc hiện. Mỗi TT ch có một TT bố, nhưng có nhiều TT con của nó. Kernel nhận biết mỗi TT qua số
hiệu của TT gọi là số định danh của TT (Procces ID: PID).
Khi dịch một chương tnh nguồn, một tệp khả thi (executable) đưc tạo ra và nó có các phần sau:
♦ Tập các "headers" mô tả thuộc tính của tệp;
♦ Mã chương tnh (code hay còn gọi là text);
♦ Một thhiện của nguôn ng máy các dữ liệu đưc khi động khi trình bắt đầu được thc hiện và một
ch báo về kích thước (bộ nh) mà kernel cấp phát cho các dữ liệu chưa được khi động.
♦ Và các thành phần khác, như bảng các biểu tưng.
Ví dụ: chương tnh copy tệp.
22/02/2013
Thư viện Tin hc >> H Điu Hành-Mng >> Linux & Others
www.thuvien-it.net/home/tinhoc/sub.asp?sid=117&rn=100&pn=1&ob=1
3/6
Trong đó, text là mã tạo ra cho hàm main, dữ liệu đưc khởi động là biến version (int version = 1) và
dữ liệu chưa khi động có kích thưc cho trước là trường buffer.
Kernel nạp một tệp thc thi (executable) bằng GHT exec (Unix 6 chc năng exec là execl(),
execv(), execle(), execve(), execlp(), execvp()) và TT được nạp đó ba phần gọi là miền (region): mã
lệnh (text hay code là xâu liên tc các lệnh), dữ liệu (data), ngăn xếp (stack). Hai miền đầu tương ng với
nhng xác định trong tệp, còn stack thì kernel tạo và điều chnh động vào thi điểm chạy tnh. Một TT
trong Unix chạy trong hai chế độ nói trên nênhai stack riêng biệt cho mỗi chế độ: user stack và kernel
stack.
User stack cha các đối đầu vào, các biến cục bộ, các data khác cho các chc năng chạy trong chế
độ user mode. Xem hìnhi, bên trái: Khi TT phát sinh gọi hàm copy() (frame 2) và hàm write() (frame
3) là hai khung stack liên tc trong hàm main(), trong khi frame1 là stack cho main() do khi hthống thc
hiện exec() để gọi main(); Khi TT thc hiện một GHT (writre()), TT thc hiện một lệnh đặc biệt (lệnh trap
cài vào mã khi dịch qua hợp ngữ), lệnh này tạo ra một "ngắt" chuyển CPU vào chế độ kernel, TT thc hiện
lệnh của kernel và s dụng kernel stack.
Kernel stack cha các khung stack cho các chc năng (system calls) thc hiện trong kernel mode.
22/02/2013
Thư viện Tin hc >> H Điu Hành-Mng >> Linux & Others
www.thuvien-it.net/home/tinhoc/sub.asp?sid=117&rn=100&pn=1&ob=1
4/6
Các đầu vào của hàm và dữ liệu trong kernel stack qui chiếu vào các hàm và dữ liệu bên trong của kernel,
không phải các hàm và dư liệu của chương tnh người dùng. Hình i, bên phải biểu diễn khi một TT gọi
GHT write(). Tuy vậy cách cấu tạo stack thì như nhau ở cả hai.
Kernel stack của TT là null khi TT thc hiện trong user mode. Phần này sẽ bàn khi đề cập tới bối
cảnh (context) của TT.
Mỗi TT một đầu vào (entry) trong Bảng các Tiến trình (Process Table). Mỗi TT lại đưc cấp một
vùng dữ liệu gọi là ufiarea (user area) dùng để lưu các dữ liệu riêng của TT mà kernel sẽ x lí. Thông tin
trong cấu trúc này gồm có:
1. Các thanh ghi của CPU. Khi có bẩy vào kernel xuất hiện, các thanh ghi (kể cả đơn v dấu phẩy động)
đưc lưu lại tại đây.registers (including the floating-point ones, if used) are saved here.
2. Trạng thái gọi hthống: thông tin vGHT hiện tại, bao gồm cả các thông số li gọi và cáckết qu
thc hiện lời gọi đó.
3. Bảng mô tả các tệp của TT vi fd là ch số trỏ vào bảng để định v cấu trúc in-core data (i-node)
tươngng với tệp.
4. Con trỏ ti bảng kết toán thi gian sử dụng CPU của mỗi TT, cũng như các giá tr giới hạn hthống
(max stack size, max page frames, v.v…).
5. Kernel stack. Là stack riêng của kernel.
Process table có các thông tin:
1. Các thông số lập biểu chạy TT, mc ưu tiên của TT, lung thi gian hiện đã dùng CPU, thi lưng
trạng thái "sleep". Các thông số này cần để tuyển TT nào sẽ chạy tiếp theo trong lch trình.
2. Nội dung bộ nh cha mã thc thi. Các con trỏ trỏ tới bộ nhớ: text, data, stack , bảng các trang bộ
nhớ ca TT.
3. Tín hiệu và mặt n(mask) tín hiệu. Mask ch ra tín hiệu nào sẽ bỏ qua, tín hiệu nào sẽ x lí, tín hiệu
nào tạm thi để lại và tín hiệu nào TT đã gởi đi.
4. Các trạng thái hiện tại của TT, các sự kiện đang đợi sẽ xuất hiện, các timeouts, các số hiệu (PID) của
TT , PID của TT bố, số hiệu tiến trình gắn với ngưi dùng (UPID) và nhóm người dùng (GPID).
Khi TT gọi chc năng để thoát (exit), kernel giải phóng các miền TT đã sử dụng.
Ví dụ chi tiết các cấu trúc dữ liệu của một TT đang thc hiện:
- Con trỏ trong Procces table trỏ tới Per procces region table (pregion);
- Con trtại Per proccess region table (pregion) trỏ tới các đầu vào của Region table để trỏ tới các
22/02/2013
Thư viện Tin hc >> H Điu Hành-Mng >> Linux & Others
www.thuvien-it.net/home/tinhoc/sub.asp?sid=117&rn=100&pn=1&ob=1
5/6
miền của text, data, stack của TT.
- Đầu vào của Process table và u_area (user_area) cha thông tin điều khiển TT. u_area là phần m
rộng của đầu vào của Proccess table, ghi mi và cập nhật nhng thông tin trong suốt cuộc đời của TT.
Các trường trong Process table là:
- Trường trạng thái;
- Các nhận dạng cho biết ngưi sở hu TT: user IDs, EUIDs, GPID;
- Tập mô tả các s kiện khi treo TT (TT trạng thái ng).
Các trường quan trọng trong u_area và ch truy nhập đưc khi TT đang đưc thc hiện là:
- Con trỏ trỏ ti đầu vào trong Procces table của TT đó;
- Các thông số của GHT hiện tại: giá tr trả lại, mã lỗi;
- Các mô tả tệp của tất cả tệp m;
- Các thông số I/O bên trong, bảng các khối đĩa cha tệp trong FS đĩa;
- Thư mc hiện hành và thư mc root;
- Các gii hạn hệ thống trên tệp và TT.
Kernel có thể truy nhập vào u_area của TT đang đưc thc hiện, nhưng không thể được đối với các TT
khác. Bên trong kernel qui chiếu tới biến u (biến tổng thcủa kernel) của u_area của TT đang thực hiện và
khi một TT khác đi vào thc hiện kernel sắp xếp lại không gian địa ch ảo của TT đó sao cho cấu trúc biến
u sẽ trỏ tới u_area của TT mới (xem context switch sau này). Cách thc này giúp kernel dễ dàng nhận dạng
một TT hiện tại bằng cách theo dõi con trỏ t u_area ti đầu vào của TT trong Proccess table.