9
0
CHƯƠNG 4. QUẢN TRỊ QUÁ TRÌNH
4.1 Quá trình trong UNIX
4.1.1. Sơ bộ về quá trình
Quá trình là đối tượng trong hệ thống tương ứng với một phiên thực hiện của một
chương trình. Quá trình bao gồm ba thành phần là text, data, stack. Text là thành phần câu
lệnh thực hiện, data là thành phần dữ liệu còn stack là thành phần thông tin tạm thời hoạt
động theo cơ chế LIFO. Các câu lệnh trong text chỉ thao tác tới vùng data, stack tương ứng
của quá trình, không truy nhập được tới data và stack của các quá trình khác, ngoại trừ các
vùng dữ liệu dùng chung.
Các quá trình được hệ thống phân biệt bằng số hiệu của quá trình, viết tắt là PID
(Proccess Index). Quá trình được tạo khi khởi động hệ điều hành là quá trình 0. Mọi quá
trình khác đều được tạo ra từ một quá trình khác thông qua lời gọi hệ thống fork: quá trình
thực hiện lời gọi hệ thống fork được gọi là quá trình cha, còn quá trình được tạo ra theo lời
gọi fork được gọi là quá trình con. Trừ quá trình 0 không có cha, mọi quá trình có trong hệ
thống đều có một cha và một cha có thể có nhiều con.
Kết quả dịch chương trình nguồn sẽ tạo ra file chương trình đích gồm một số phần như
sau (lưu trữ trên vật dẫn ngoài):
Phần đầu file mô tả một số đặc tính của file chương trình (tương tự File
header của file chương trình trong MS-DOS),
Phần text của chương trình,
Các giá trị mở đầu về việc phân phối bộ nhớ đối với vùng data của chương
trình,
Một số bảng thông tin liên quan đến đặt file.
Khi có lời gọi fork, thông qua lời gọi hệ thống exec, nhân sẽ tải nội dung
của file chương trình vào bộ nhớ trong theo các vùng text, data và stack:
Vùng text của quá trình tương ứng với file chương trình,
Vùng data của quá trình tương ứng với các giá trị được quy định trong file
chương trình,
Vùng stack được nhân tự động tạo với kích thước theo sự linh hoạt của
nhân.
Phần stach bao gồm các stack frame (khung) lôgic: mỗi satck frame được đặt vào khi
gọi một hàm và lấy ra khi quay về. Mỗi stack frame chứa tham sô của hàm, các biến địa
phương v.v. Tương ứng trong stack có một stack pointer liên quan đến chiều sâu của stack.
Trong mã chương trình có các dòng lệnh quản lý hình trạng của stack, và nhân sẽ định vị
không gian đối với stack theo yêu cầu.
4.1.2. Sơ bộ cấu trúc điều khiển của UNIX
Theo phân cấp, hệ thống thực hiện theo ba mức: mức người dùng, mức nhân và mức
phần cứng.
• Mức người dùng (user level): gồm có chương trình người dùng và chương trình
trong các thư viện. Các chương trình này chạy (phần lệnh của chúng thực hiện)
9
1
trong trạng thái người dùng của quá trình. Chương trình người dùng thao tác với
nhân hoặc trực tiếp hoặc gián tiếp nhờ gọi thư viện nhờ các lời gọi hệ thống.
• Mức nhân là mức trọng tâm nhất của hệ điều hành Linux-UNIX. Chạy ở mức nhân
là những chương trình của hệ điều hành thuộc hệ thống con điều khiển File (hệ
thống con làm việc với File - File Subsystem), hệ thống con điều khiển quá trình
(Proccess Control System), các lời gọi hệ thống (system calls), các chương trình
điều khiển thiết bị (Device Drivers), Cache bộ đệm (Buffer cache) và các chương
trình điều khiển phần cứng (Hard Control). Hai thành phần cơ bản nhất là Hệ thống
điều khiển File và Hệ thống con điều khiển quá trình.
Hình vẽ dưới đây cho sơ bộ cấu trúc điều khiển trong UNIX:
Chương trình người dùng
Thư viện mẫu
Gíao diện theo các lời gọi hệ thống
Hệ thống con điều khiển
File
Hệ thống con điều khiển quá
trình (bao gồm 3 thành phần
con bên phảiBộ truyền
thông liên quá trìnhBộ
lập lịchThành phần điều
phối bộ nhớ
Cache bộ đệm
Ký tựKhốiĐiều khiển
thiết bị
ĐIỀU KHIỂN PHẦN CỨNG
PHẦN CỨNG
Mức phần
cứng
Mức người dùng
Mức
nhân
Mức
nhân
Cấu trúc của Nhân và các mức quá trình
9
2
4.1.3. Các hệ thống con trong nhân
Hệ thống con điều khiển File có nhiệm vụ quản lý hệ thống File, cung cấp vùng nhớ rỗi
ở đĩa cho File, điều khiển truy cập File và tìm kiếm dữ liệu v.v. Đa số các thuật toán về các
lời gọi hệ thống liên quan đến File và các hàm chương trình con mức thấp đã được trình
bày trong chương 2. Các quá trình tương tác với Hệ thống con điều khiển File nhờ các lời
gọi hệ thống (các lời gọi hệ thống File mức cao). Việc truy nhập tới File nhờ hai cách thức:
truy nhập trực tiếp với File hoặc thông qua buffer cache.
Các buffer cache lưu trữ dữ liệu tạm thời theo từng khối. Nhân vào-ra dữ
liệu thông qua các khối trung gian và nhờ thiết bị nhớ thứ cấp: truy nhập dữ liệu
theo khối,
Nhân thao tác trực tiếp với khối điều khiển thiết bị để truy nhập trực tiếp dữ
liệu trong File không qua thiết bị phụ: truy nhập theo ký tự.
Hệ thống con điều khiển quá trình chịu trách nhiệm đồng bộ hóa sự tương tác liên quá
trình, quản lý bộ nhớ và lập lịch thực hiện đối với các quá trình đang tồn tại. Hệ thống con
điều khiển File và Hệ thống con điều khiển quá trình tương tác với nhau khi file được tải
vào bộ nhớ trong và cho thực hiện. Một số lời gọi hệ thống cho khối điều khiển quá trình:
fork: Tạo quá trình mới. Lời gọi hàm này có dạng pid=fork()
exec: Cho thực hiện quá trình đang tồn tại; exec(pid)
exit: Cho kết thúc quá trình đang tồn tại,
brk: điều khiển kích thước bộ nhớ cấp phát cho quá trình,
signal: Điều khiển các hiện tượng bất thường trong quá trình
Hệ thống con điều khiển quá trình bao gồm 3 thành phần sau đây:
Thành phần điều phối bộ nhớ có nhiệm vụ quản lý, điều khiển cấp phát bộ
nhớ. Một số trang bị loại bỏ khi cấp phát bộ nhớ cho quá trình.
Bộ lập lịch (schelduler) có nhiệm vụ điều phối CPU cho các quá trình. Các
quá trình có độ ưu tiên và bộ lập lịch chọn quá trình có độ ưu tiên cao nhất.
Bộ truyền thông liên quá trình thực hiện việc đồng bộ hóa các quá trình liên
quan nhau.
Bộ điều khiển phần cứng (hardware control) có chức năng cho phép ngắt và tương tác
thông tin với máy. Các thiết bị như đĩa, thiết bị đầu cuối có thể ngắt CPU khi đang thực
hiện quá trình. Các chương trình xử lý ngắt là hàm riêng biệt trong nhân mà không phải là
một quá trình.
Stack trong quá trình
Mỗi quá trình thực hiện được mode nhân và mode người dùng vì vậy phân chia hai loại
stack nhân và stack người dùng.
Chúng ta xem xét ví dụ sau:
#include <fenth.h>
char buffer[2048];
int version;
main (argc, argv);
int argc;
char *argv[];
|
int fdold, fdnew;
9
3
if (argc != 3)
|
printf(' cần 2 đối số đối với chương trình sao file!');
exit(1)
|
fdold = open (argv[1], O_RDONLY); /* mở file nguồn chỉ đọc */
if (fdold == -1)
|
printf (' Không thể mở file &cs\n',argv[1]);
exit(1);
|
fdnew =creat (argv[2],0666); /*mở File đich rw cho mọi người */
if (fdnew ==-1)
|
printf('Không thể khởi tạo file &cs\n',argv[2];
exit(1);
|
copy(fdold,fdnew);
exit(0);
|
copy (old, new)
int old, new;
|
int count;
while (count = read(old,buffer,sizeof(buffer))>0)
write(buffer,count);
|
Trong chương trình trên, mã lệnh (gọi là phần text) của file được sinh ra từ các hàm
main và copy. Khởi tạo giá trị ban đầu cho biến version và dành vùng nhớ cho biến mảng
buffer.
Trong ví dụ trên, các tham số argc, argv và các biến fdold, fdnew trong chương trình
main trong stack khi main được gọi (một lần đối với mọi chương trình), còn các tham số
old và new và biến count trong hàm copy xuất hiện mỗi khi copy được gọi.
Stack người dùng
Stack nhân
Biến cục bộ không có
Địa chỉ frame 2
Địa chỉ quay lại sau khi
write
Hướng tăng của stack
Các tham số
của write
bộ đếm
buffer
mới
frame 3
Frame 3
Các biến cục
bộ
count call write () call
func2()
Biến cục bộ
Địa chỉ của Frame 1 Địa chỉ của Frame 1
9
4
Địa chỉ quay về sau lời gọi
copy
Địa chỉ quay về sau lời gọi
func2
Các tham số
của copy
old
new
frame 2
Frame 2
Tham số của func2 nhân
Biến cục bộ fdold
fdnew
call copy () call
func2()
Biến cục bộ
Địa chỉ của Frame 0 Địa chỉ của Frame 0
Địa chỉ quay về sau lời gọi
main
Địa chỉ quay về sau lời gọi
func1
Tham số của
main
argc
argv
Frame 1
Frame 1
Tham số của func1 nhân
call main () call func1()
Các stack cho một quá trình
Quá trình trong UNIX được thực hiện theo một trong hai mode: mode nhân hay mode
người dùng và tương ứng với 2 mode này, quá trình sử dụng stack riêng biệt đối với mỗi
mode.
Stack người dùng chứa các đối số, biến cục bộ, và các dữ liệu khác đối với việc thực
hiện hàm trong mode người dùng. Stach nhân chứa các đối số, biến cục bộ, các tham số,
các địa chỉ liên kết v.v. liên quan đến thực hiện các hàm theo mode nhân.
4.1.4. Sơ bộ về điều khiển quá trình
Nhân sử dụng 4 cấu trúc dữ liệu sau đây để truy nhập đến quá trình:
• Bảng các quá trình, tương ứng với mỗi quá trình đang tồn tại trong hệ thống là một
thành phần. Mỗi thành phần bao gồm một số trường sau đây (mỗi thành phần ở đây
chính là một PCB):
- Trạng thái của quá trình,
- Chủ sở hữu của quá trình,
- Trường liên quan đến trạng thái ngưng của quá trình (theo lời gọi hàm sleep)
- Địa chỉ của vùng sử dụng tương ứng với quá trình,
- Các thông tin tương ứng được trình bày trong PCB.
• Vùng sử dụng (U-area) chứa các thông tin riêng, có tác dụng khi quá trình đang thực
hiện:
- Chỉ số thành phần tương ứng với quá trình trong bảng các quá trình: địa chỉ của
khối PCB tương ứng,
- Bộ đếm thời gian chạy mức nhân và mức người dùng,
- Các giá trị trả về và mã lỗi (nếu có) đối với lời gọi hệ thống hiện tại,
- Mô tả về các file đang mở ứng với quá trình,
- Tham số lưu trữ dung lượng dữ liệu di chuyển trong vào - ra.
- Thư mục hiện tại và thư mục gốc hiện tại: môi trường của quá trình,
- Các giới hạn kích thước file và quá trình,
- Các mức cho phép thực hiện đối với quá trình,
- Một số thông tin khác
• Các bảng định vị địa chỉ bộ nhớ đối với mỗi quá trình,
9
5
• Bảng chứa vùng bộ nhớ chung: phân hoạch bộ nhớ, đặc tính mỗi vùng theo phân hoạch:
chứa text, data hoặc vùng bộ nhớ dùng chung v.v.
Sơ bộ về mối liên kết của các cấu trúc dữ liệu trên được mô tả như hình vẽ phía sau.
Nhân xử lý với các lời gọi hệ thống như sau:
- Với lời gọi fork: Nhân sao vùng địa chỉ của quá trình cũ, cho phép các quá trình
chia xẻ vùng bộ nhớ,
- Với lời gọi exec: Nhân cấp phát các vùng bộ nhớ thực cho các vùng text, data và
stack,
- Với lời gọi exit: Nhân sẽ giải phóng các vùng bộ nhớ liên quan đến quá trình.
Cá
c
cấu
trú
c
dữ
liệu
điề
u
khi
ển
quá
trìn
h
4.1.
5. Trạng thái và chuyển dịch trạng thái
Sơ đồ biểu diễn các trạng thái và việc chuyển trạng thái trong UNIX được trình bày
trong hình dưới đây (Số hiệu trạng thái quá trình xem trong hình vẽ).
Thực hiện mức
nhân (2)
Thực hiện mức
người dùng (1)
Sẵn sàng sang mức
người dùng (7)
Hoàn thiện
(9)
Chờ đợi thiếu tài
nguyên (4)
Sẵn sàng thực
hiện (3)
Chờ đợi ở bộ nhớ
ngoài (6)
Quá trình
phát sinh
(8)
Đợi bộ nhớ để
thực hiện (5)
U-area
Bộ nhớ trong (các trang thực)
Bảng các vùng
nhớ cho một
quá trình
Bảng các vùng nhớ
(bảng các trang ảo)