Tải bản đầy đủ
Quản lý tiến trình trên linux.

Quản lý tiến trình trên linux.

Tải bản đầy đủ

5.2.

Cấu trúc của một tiến trình.
Cách thúc quản lý của tiến trình của linux:
+Hai user niel và rick cùng đăng nhập và chạy chương trình grep đồng
thời HĐH lúc này sẽ quản lý và nạp mã truy cập chương trình grep vào hai
vùng nhớ khác nhau và gọi mỗi phân vùng như là 1 tiến trình.
Hình 5.1 người dùng neil chạy chương trình grep tìm chuỗi “abc” trong
tập tin trec.txt còn người dùng rick chạy chương trình grep tìm chuỗi
“cde”trong tập tin somefile.doc

Hình 5.1 tiến trình quản lý bởi HĐH

12

-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 “ để lieettj kê chi tiết thông tin về các tiến
trình):
-Mỗi tiến trình được gán cho đị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 khoảng 2-32768 (số nguyên naỳ 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 không gian địa chỉ ảo độc lập do hệ
thống cấp phát 4Gb.
5.3.

5.4.

Tạo một tiến trình.
int fork() tạo ra một tiến trình con. Giá trị trả lại là 0 cho tiến trình con và
dấu hiệu pid cho tiến trình cha. Giá trị sẽ là -1 nếu không tạo được tiến trình
mới. Theo nguyên tắc cơ bản của hệ thống, tiến trình con và cha sẽ có cùng
đoạn mã. Đoạn dữ liệu của tiến trình mới là một bản sao chép chính xác đoạn
dữ liệu của tiến trình cha. Tuy nhiên tiến trình con vẫn khác tiến trình cha ở pid,
thời gian xử lý, ...
Giám sát và điều khiển các tiến trình.
Một program là một file thực thi trong hệ thống.

Ví dụ: /sbin/shutdown,/sbin/init.
Process là một instance của một program đang thực thi (ví dụ khi ta chạy
cùng lúc nhiều của sổ Word, mỗi cửa sổ là một instance của ứng dụng Word).
Process đôi khi còn được gọi là task.
Lấy thông tin trạng thái của các tiến trình: sử dụng câu lệnh ps, top
13

1.4.1

Lệnh PS.

+ Lệnh ps, thông số:
- e: hiển thị thông tin về mỗi tiến trình.
- l: hiển thị thông tin đầy đủ tiến trình.
- f: hiển thị thông tin về tiến trình cha.
- a: hiển thị tất cả các tiến trình.
- aux: liệt kê danh sách các tiến trình đang chạy cùng các thông tin của nó.

Hình 5.2
Mỗi tiến trình của Linux đều mang một số ID và các thao tác liên quan đến
tiến trình đều thông qua số PID này. Gạch nối – trước bash để thông báo đó là
shell khởi động khi người sử dụng login.
Để hiển thị tất cả các process, ta có thể sử dụng lệnh ps –a. Một người sử dụng hệ
thống bình thường có thể thấy tất cả các tiến trình, nhưng chỉ có thể điều khiển
được các tiến trình của mình tạo ra. Chỉ có superuser mới có quyền điều khiển tất
cả các tiến trình của hệ thống Linux và của người khác. Lệnh ps –aux cho phép
hiển thị tất cả các tiến trình, ngay cả những tiến trình không gắn liền đến có bàn
điều khiển (tty). Chúng ta có thể coi các tiến trình đang chạy cùng với dòng lệnh
đầy đủ để khởi động tiến trình này bằng ps –aux
14

1. Chủ nhân của tiến trình (owner)
2. Mã số nhận diện tiến trình (PID)
3. Mức sử dụng CPU (%CPU)
4. Mức chiếm dụng bộ nhớ của tiến trình (%MEM)
5. VSZ - lượng bộ nhớ ảo (phần đĩa cứng giả làm RAM) mà tiến trình sử
dụng, tính theo byte
6. RSS - lượng bộ nhớ RAM mà tiến trình sử dụng, tính theo byte
7. TTY - terminal mà tiến trình được khởi tạo trên đó. Dấu hỏi ? thể hiện
tiến trình này là một daemon và nó không liên kết với một terminal nào?
8. trạng thái tiến trình (STAT)
9. thời điểm khởi chạy (START)
10.thời gian đã chạy (TIME) và các thông tin khác.
5.4.2 Lệnh Top.
Giống lệnh ps nhưng danh sách các process được update liên tục. Các
thông số về CPU, RAM cũng được thể hiện và Update. Tham sô –d (delay: khoảng
thời gian refresh giữa 2 lần), -n (number: chạy n lần và ngưng)

15

Hình 5.3

5.5.

Dừng một tiến trình.
Lệnh kill của Shell có thể dùng để chấm dứt hoạt động của một tiến trình.
+ Lệnh kill:
# kill Gởi tín hiệu cho một tiến trình đang
chạy
+ Lệnh kill:
# kill
16

Hình 5.4: Ý nghĩa 1 số lệnh
Lệnh kill có thể gởi bất kỳ tín hiệu signal nào tới một tiến trình, nhưng theo
mặc định nó gởi tín hiệu 15, TERM (là tín hiệu kết thúc chương trình).
Lệnh kill -9 PID: ngừng thi hành tiến trình mà không bị các tiến trình khác can
thiệp (tín hiệu 9, KILL).
Super-user mới có quyền dừng tất cả các tiến trình, còn người sử dụng chỉ được
dừng các tiến trình của mình.
Các signal thường dùng lệnh kill bao gồm:
Tên Giá trị Tác động
- SIGHUP 1 - Hangup (gọi lại tiến trình)
- SIGINT 2 - Ngắt từ bàn phím (Ctrl+C)
- SIGKILL 9 - Hủy tiến trình
- SIGTERM 15 - Kết thúc tiến trình
- SIGSTOP 17,19,23: - Dừng tiến trình.
Khi kết thúc một tiến trình hay một chuỗi các tiến trình, thông thường nên tiến
hành thử với tín hiệu ít gây nguy hiểm nhất, SIGTERM, nếu không được mới sử
dụng các tín hiệu INT hay KILL.
Ví dụ như khi muốn dừng tiến trình 234 ta dùng lệnh: kill 234 C cũng có lệnh
kill như sau:
int kill(pid, sig);
int pid; là dấu hiệu nhận biết của một tiến trình.
int sig; hằng tín hiệu giao tiếp tiến trình
17

5.6. Chạy tiến trình ở trạng thái foreground và trạng thái background.
Quá trình chạy ở chế đọ hiện sẽ tiến hành theo các bước sau:
1

Thực hiện quá trình <>, nhân bản tiến trình cha (trong trường hợp
thực thi các lệnh,đó sẽ là tiến trình shell).

2

Thực hiện quá trình <>, đưa tiến trình cha vào trạng thái ngủ (sleep).

3

Thực hiện quá trình <>, thực thi tiến trình con. Sau khi tiến trình con
thực thi xong, một tín hiệu <<đánh thức>> sẽ được gửi tới tiến trình cha.

4

Do quá trình chạy như trên =>trong quá trình thực hiện tiến trình con, người
sử dụng không thể tương tác với tiến trình cha

5

Quá trình chạy ở chế độ ngầm cho phép thực thi tiến trình cha và tiến trình
con một cách độc lập.
Ví dụ: $ emacs&.

Sau khi thực hiện lệnh trên,emacs sẽ chạy ở chế đọ ngầm, người sử dụng có thể tiếp
tục sử dụng console để thực thi các lệnh khác.

5.7. Độ ưu tiên của các tiến trình (Priority).

Sử dụng lệnh nice, renice
+ Tất cả các tiến trình đều có độ ưu tiên ban đầu được ngầm định là 0.
+ Mức độ ưu tiên của một tiến trình dao động trong khoảng từ -19 đến +19.
Chỉ người sử dụng có quyền rút mới có thể giảm giá trị biểu diễn độ ưu tiên của tiến
trình. Một người sử dụng thông thường chỉ có thể làm giảm độ ưu tiên của tiến trình
thông qua việc tăng giá trị biểu diễn độ ưu tiên.
Sử dụng lệnh nice, renice để thay đổi độ ưu tiên.
+ Nice: cho phép thay đổi độ ưu tiên của một tiến trình ngay khi bắt đầu thực hiện
tương ứng với tiến trình
# nice [–n number] [command]
18

Ví dụ: # nice –n -10 vi /root/data.txt
+ Renice: cho phép thay đổi độ ưu tiên của một tiến trình sau khi đã chạy.
# renice priority PID [[- group] [[-u] user]
Ví dụ: # renice -2 203 Set nice number is -2 to PID=203
Can thiệp vào hoạt động
&: Cho một job hoạt động ở background
Ví dụ: # ls –l –R / > /root/list.txt & Ứng dụng ls sẽ chạy nền bên dưới
6

Giao tiếp giữa các tiến trình.
Việc giao tiếp giữa các tiến trình được thực hiện thông qua các tín hiệu chuẩn
của hệ thống. Tín hiệu là một sự ngắt quãng logic được gửi đến các tiến trình bởi
hệ thống để thông báo cho chúng về những sự việc không bình thường trong môi
trường hoạt động của chúng (như lỗi bộ nhớ, lỗi vào ra). Nó cũng cho phép các
tiến trình liên lạc với nhau. Một tín hiệu (trừ SIGKILL) có thể được xem xét theo
ba cách khác nhau:
Tiến trình có thể được bỏ qua: Ví dụ chương trình có thể bỏ qua sự ngắt quãng
của người sử dụng hệ thống (đó là sự bỏ qua khi một tiến trình đang được sử
dụng ở phần nền.
Tiến trình có thể được thực hiện: Trong trường hợp này, khi nhận được 1 tín
hiệu, việc thực hiện 1 tiến trình được chuyển về một quy trình do người sử dụng
xác định trước, sau đó trở lại nơi nó bị ngắt.
Lỗi có thể được tiến trình trả về sau khi nhận được tín hiệu này.Dưới đây là
một số tín hiệu thường gặp:
SIGHUP Tín hiệu này được phát đến các tiến trình vào lúc cuối khi mà nó tự
ngắt.Nó cũng được phát đến mọi tiến trình có tiến trình chính tự ngắt.
SIGINT Tín hiệu này được phát đến các tiến trình khi ta ra lệnh ngắt.
SIGQUIT Tương tự như trên khi ta gõ vào ^D.
SIGILL Lệnh không hợp lệ, tín hiệu được phát ra khi phát hiện 1 lệnh không
đúng
19

ở cấp độ vật lý (ví dụ như 1 tiến trình thực hiện một lệnh mà máy tính
chông có lệnh này).
SIGTRAP Tín hiệu được phát ra sau mỗi lệnh trong trường hợp tiến trình có
sử dụng lệnh ptrace().
SIGIOT Bẫy được phát khi có các vấn đề về vật lý.
SIGEMT Bẫy của lệnh phát, được phát ra khi có lỗi vật lý trong khi thực
hiện.
SIGFPE Được phát ra khi có lỗi về tính toán như một số có dấu phẩy nối có
định dạng không hợp lý. Gần như luôn chỉ ra lỗi khi lập trình.
SIGKILL Trang bị để kết thúc tiến trình. Không thể bỏ qua hoặc cắt tín hiệu
này.
SIGBUS Được phát khi gặp lỗi trên bus.
SYSGEGV Được phát ra khi gặp lỗi trên phân đoạn sự truy cập dữ liệu bên
ngoài phân đoạn dữ liệu được cấp phát cho tiến trình.
SIGSYS Đối số không đúng cho hệ thống gọi.
SIGPIPE Viết trên một ống dẫn không mở để đọc.
SIGALRM Phát ra khi đồng hồ của một tiến trình ngừng lại. Đồng hồ được
hoạt động bằng lệnh alrm().
SIGTERM Được phát ra khi một tiến trình kết thúc bình thường. Cũng có thể
dùng để dừng 1 hệ thống để kết thúc tất cả các tiến trình hoạt động.

7. Liên lạc giữa hai tiến trình.
Từ một chương trình đơn giản dưới đây sử dụng các lệnh phát và nhận tín
hiệu, sau đó giúp liên lạc giữa hai tiến trình.
Nội dung của ví dụ là sự liên lạc giữa một tiến trình cha và một tiến trình con
thông qua các tín hiệu đã được trình bày phần trước.
#include
#include
20

void fils_atc()
{
printf(" Tien trinh bi loai bo !!!\n");
kill(getpid(), SIGINT);
}
/***********************************/
void fils()
{
signal(SIGUSR1, fils_atc);
printf(" Hinh thanh tien trinh moi. Nhung chuan bi loai bo tien trinh
nay !!\n");
while(1);
}
/******************************/
main()
{
int ppid, pid;
if ((pid = fork())==0) fils();
else
{
sleep(3);
printf(" Chap nhan !! Tien trinh se bi loai bo.\n");
kill(pid, SIGUSR1);
}
}

21