1
Chương 7:
Chương 7:
Xử lý tiến trình trong Linux
Xử lý tiến trình trong Linux
CITD - VNUHCM
Bao g m các ph n sau:ồ ầ
1. Khái quát v ti n trình trong Linuxề ế
2. Cách ho t đ ng c a ti n trìnhạ ộ ủ ế
3. C u trúc ti n trìnhấ ế
4. T o l p ti n trìnhạ ậ ế
5. Đ c thông tin v các ti n trìnhọ ề ế
2
7.1. Khái quát về tiến trình trong Linux
7.1. Khái quát về tiến trình trong Linux
-
Mục tiêu: Nắm vững cơ chế hoạt động của các HĐH đa
nhiệm thông qua khái niệm tiến trình (Process)
-
Điểm nổi bật của các HĐH tựa Unix là khả năng chạy đồng
thời nhiều chương trình (Multi-Programming).
-
HĐH xem mỗi đơn thể mã lệnh mà nó điều khiển là Tiến
trình.
-
Một ứng dụng có thể bao gồm nhiều tiến trình kết hợp với
nhau.
3
- Các tiến trình cùng hoạt động chia sẻ thời gian
CPU, có thể dùng chung vùng nhớ và các tài nguyên
hệ thống khác.
hoạt động tách biệt khác)
-
Hai tiến trình khác nhau không thể xâm phạm vùng
nhớ của nhau Tuy nhiên, để chia sẻ dữ liệu giữa hai
tiến trình có thể sử dụng vùng không gian địa chỉ
chung.
6
7.2. Cách hoạt động của tiến trình
7.2. Cách hoạt động của tiến trình
-
Trong môi trường HĐH Linux, một tiến trình có các trạng thái sau:
Running (Đang chạy): Tiến trình chiếm quyền xử lý CPU
Waiting (Chờ): Tiến trình bị HĐH “tước” quyền xử lý CPU
Suspend (Tạm dừng): HĐH tạm dừng tiến trình Sleeping
-
Tại dòng lệnh, có thể bấm Ctrl-Z để tạm ngừng tiến trình sau đó dùng
lệnh bg để đưa nó vào hậu trường để sau đó dùng fg chuyển lên mặt
trước.
-
Hàm fork() để nhân bản một tiến trình.
-
Hàm system() để tạo lập tiến trình mới.
-
Hàm exec() dùng thay thế tiến trình hiện hành.
7
7.3. Cấu trúc tiến trình
7.3. Cấu trúc tiến trình
-
Cách thức quản lý tiến trình của Linux:
Hai user neil và rick cùng đăng nhập và chạy chương trình grep
filedes
treck.txt somefile.doc
Không gian của Hệ điều hành
8
-
Dùng lệnh ps cho phép xem thông tin về các tiến trình mà Linux đang
kiểm soát (có thể sử dụng thêm tham số “-af” để liệt kê chi tiết thông tin
về các tiến trình):
Hình 7.1.a
Liệt kê thông tin về các tiến trình trên hệ thống
9
-
Mỗi tiến trình được gán cho một định danh gọi là PID (Process
Identifier)
-
PID là một số nguyên dương có giá trị từ 2 – 32768
-
Tiến trình init được gọi và chạy ngay khi ta khởi động HĐH. Đây là
tiến trình quản lý và tạo ra mọi tiến trình con khác Có PID là 1
-
Cách thức gán PID: Khi một tiến trình mới yêu cầu khởi động, HĐH sẽ
chọn lấy một giá trị số nguyên trong khoảng 2 – 32768 (số nguyên này
chưa bị tiến trình đang chạy nào chiếm giữ) và cấp phát cho tiến trình
này. Khi tiến trình chấm dứt, HĐH sẽ thu lại số PID để cấp phát cho tiến
trình khác trong lần sau.
-
Trên Unix/Linux, thư mục /proc chứa các file lưu trữ thông tin về
những tiến trình đang chạy.
-
Theo quy ước, mỗi tiến trình hoạt động trong không gian địa chỉ ảo độc
• PID: Số định danh mà hệ thống cung cấp cho tiến trình
• PPID: Số định danh của tiến trình cha (init có PID là 1)
• STIME: Thời điểm bắt đầu đưa tiến trình vào chạy
• TIME: Khoảng thời gian chiếm dụng CPU của tiến trình
• CMD: Toàn bộ dòng lệnh triệu gọi tiến trình
• TTY: Chỉ ra màn hình Terminal ảo nơi gọi thực thi tiến trình
12
7.3.3. Các tiến trình hệ thống
-
Sử dụng lệnh ps với tham số là “-ax” để xem các tiến trình của hệ thống
-
Xét tiến trình ở dòng đầu: Các tiến trình hệ thống (ở đây là init) không
gắn với terminal nào hết nên ở cột TTY của tiến trình init sẽ có giá trị
là “?”
-
Tiến trình cuối cùng khi mà init gọi trước khi chuyển giao quyền điều
khiển cho Shell đó là tiến trình getty (Trình yêu cầu nhập username /
password lúc đăng nhập).
13
7.3.4. Điều phối tiến trình
-
Các HĐH đa nhiệm, đa tiến trình như Unix/Linux
(hay cả MS Windows NT/2000/XP/2003,…) điều có
trách nhiệm điều phối sự hoạt động đồng bộ của các
tiến trình.
-
Bộ điều phối tiến trình (Process Scheduler) của
HĐH liên tục xoay vòng và cung cấp một thời gian đủ
để các tiến trình thực hiện một phần công việc của nó.
Thông thường, khoảng thời gian cho phép tiến trình
17
7.4.2. Thay thế tiến trình hiện hành với hàm exec()
-
Hàm exec() sẽ thay thế toàn bộ ảnh của tiến trình hiện tại {tiến trình A}
(bao gồm mã lệnh, dữ liệu, bảng mô tả file) bằng ảnh của một tiến trình
khác {tiến trình B}
-
Việc thay thế này chỉ giữ lại số PID của tiến trình A
-
Hàm thay thế ảnh của tiến trình bao gồm tập các hàm sau:
#include <unistd.h>
int execl(const char *path, const char *arg, );
int execlp(const char *file,const char *arg, );
int execle(const char *path, const char *arg, ,
char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *file, char *const argv[],
char *const envp[]);
- Ví dụ 7-2: pexec.c
18
7.4.3. Nhân bản tiến trình với hàm fork()
-
Việc thay thế tiến trình đôi khi cũng bất lợi do tiến trình mới tạo ra
chiếm toàn bộ không gian của tiến trình cũ và không còn khả năng kiểm
soát tiến trình cũ nữa.
-
Sử dụng hàm fork() để nhân bản tiến trình.
-
Hàm fork() sẽ quay về nơi gọi hai lần với hai giá trị trả về khác nhau.
break;
case 0:
printf(“This is child process”);
/*Mã lệnh dành cho tiến trình con*/
break;
default:
printf(“This is parent process”);
/* Mã lệnh dành cho tiến trình cha*/
break;
}
- Ví dụ 7-3: fork_demo.c
20
7.4.4. Kiểm soát và đợi tiến trình con
-
Hàm fork() nhân bản tiến trình hiện hành thành hai tiến trình cha và con
hoạt động độc lập với nhau.
-
Đôi khi tiến trình cha phải đợi tiến trình con thực thi xong tác vụ thì
mới được tiếp tục thực thi.
-
Giải quyết vấn đề này bằng hàm wait()
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status)
pid_t waitpid(pid_t pid,int *status,
int options)
-
Sử dụng một số macro được khai báo sẵn trong <sys/wait.h> để
diễn dịch một số trạng thái mà hàm wait() sẽ trả về (Tham khảo)
-
nhưng tiến trình cha kết thúc trước tiến trình con và đến khi tiến trình
con kết thúc thì sẽ không còn điểm trở về để liên hệ với tiến trình cha đã
sinh ra nó trước đó Tiến trình con ở trạng thái zombie (bỏ rơi)
-
Linux sẽ tự động gán PPID của tiến trình con (đang ở trạng thái
zombie) về giá trị 1 (tiến trình init)
-
Ví dụ 7-8: zombie_child.c
24
7.4.8. Chuyển hướng xuất nhập của tiến trình
-
Mỗi tiến trình có một bảng mô tả tập tin riêng để lưu trữ thông tin về
các tập tin đang mở. Có thể tận dụng kỹ thuật này để xây dựng bộ lọc dữ
liệu bằng chuyển hướng xuất nhập.
-
Xét ví dụ đọc dữ liệu từ luồng nhập chuẩn stdin sau đó chuyển đổi dữ
liệu nhập được thành chữ hoa.
-
Ví dụ 7-9: upper.c
-
Ví dụ 7-10: dataupper.c
25
7.5. Đọc thông tin v
7.5. Đọc thông tin v
ề
ềcác tiến trình
các tiến trình