TIẾN TRÌNH TRONG LINUX
Last updated
Last updated
Tiến trình là một chương trình đang thực thi. Về bản chất, nó chính là nội dung tập tin nằm trong bộ nhớ RAM và được nhân (Kernel) của hệ điều hành kiểm soát các chỉ thị lệnh.Trong bài học này, các bạn sẽ được học cách tương tác với tiến trình trong hệ điều hành CentOS bằng cách sử dụng các lệnh để điều khiển chúng. Cụ thể, các bạn sẽ thực hiện các thao tác trên tiến trình như: tạo tiến trình, kết thúc tiến trình, xem trạng thái của tiến trình, hiểu về tiến trình Zombie và tiến trình Orphan.
XEM THÔNG TIN TIẾN TRÌNH
Để xem các tiến trình đang tồn tại trên RAM, ta sử dụng lệnh ps. Lệnh này tương tự như lệnh ls nhưng ls sẽ hiển thị các tập tin trên đĩa còn lệnh ps sẽ hiển thị các tập tin trên RAM (đó chính là các chương trình đang chạy!). Hình bên dưới cho thấy có 2 tiến trình: tiến trình bash là tiến trình gốc trong Linux, còn tiến trình ps là lệnh ta vừa mới thực thi.
Các thông tin kết quả hiển thị trong hình trên có ý nghĩa như sau:
CMD: Cho biết tên của tiến trình, chính là tên tập tin thực thi hiện đang nằm trong bộ nhớ RAM. Nó mã định danh duy nhất, được gọi là pid.
PID: Mỗi tiến trình có một số duy nhất được gán cho nó. Vì Kernel cần biết 'ai' đang làm việc.
TTY: Thiết bị đầu cuối (một máy tính hoặc thiết bị khác) mà tiến trình thực thi.
TIME: Thời gian CPU thực hiện lệnh của tiến trình này.
TIẾN TRÌNH CHA VÀ TIẾN TRÌNH CON
Trong Linux, Bash là tiến trình tương tác với Kernel thay mặt cho các yêu cầu hoặc lệnh của người dùng, nó còn được gọi là trình thông dịch ngôn ngữ lệnh. Khi bạn chưa tạo tiến trình nào, bạn sử dụng lệnh ps thì vẫn thấy tiến trình bash hiện diện trong danh sách hiển thị. Bạn cũng có thể nhập thêm các lệnh Bash liên tiếp, khi đó các Bash sau được gọi là các tiến trình con của Bash trước.
Trong hình bên trên, Bash cha có mã PID là 3204 sẽ yêu cầu Kernel tạo một Bash khác khi bạn nhập lệnh. Kết quả bạn nhận được các Bash con lần lượt có mã là 3245, 3286. Mã cuối cùng 3328 là của lệnh ps dùng để hiển thị các tiến trình bên trên.Bạn có thể lấy PID của tiến trình cha của một tiến trình bằng cách dùng thêm tham số trong lệnh ps. Hình bên dưới cho thấy, khi bạn nhập lệnh: ps -o ppid 3286 là bạn muốn xem tiến trình cha của tiến trình có mã 3286 là 'ai', khi đó bạn sẽ nhận được mã tương ứng là 3245, chính là PID cha của tiến trình 3286.
Bạn có thể hiển thị thêm thông tin đầy đủ của tiến trình cha, ví dụ hình bên dưới sau khi bạn nhập lệnh: ps -o ppid,cmd 3286 thì bạn sẽ nhận được thêm tên tiến trình cha của tiến trình 3286 là Bash
Bình thường thì mã PID của tiến trình con sẽ cao hơn mã PID của tiến trình cha. Như trong hình bên dưới, khi bạn liên tục muốn xem cha của tiến trình, rồi lại xem cha của tiến trình cha, ... cuối cùng bạn sẽ nhận được một mã PID là 1, đây chính là tiến trình init, cha của tất cả các tiến trình.
TRẠNG THÁI CỦA TIẾN TRÌNH
Bạn có thể xem trạng thái của một tiến trình bằng cách thực hiện lệnh: ps -S. Hình bên dưới cho thấy 3 tiến trình với 2 trạng thái là S và R+. Các tiến trình chạy trong hệ thống có thể có các trạng thái sau đây:
D: Uninterruptible sleep (usually IO) - Trạng thái tương tác với nhập/xuất
R: Running or runnable (on run queue) - Trạng thái đang chạy
S: Interruptible sleep (waiting for an event to complete) - Tạm ngưng
T: Stopped, either by a job control signal. – Gián đoạn
X: Dead (should never be seen) – Thoát
Z: Defunct ("zombie") process, terminated but not reaped by its parent. - Kết thúc không bình thường
Bạn có thể dừng một tiến trình đang chạy bằng cách sử dụng tổ hợp phím Ctrl+Z. Hình bên dưới cho thấy tiến trình sleep 200s trước khi chạy lại, nhưng trong thời gian đó, bạn nhấn Ctrl+Z nên tiến trình bị Stop, đó là tiến trình với PID là 4651
Tiếp theo, bạn thử nhập lệnh: seq 500000, lệnh này sau khi Enter sẽ bắt đầu sinh ra các số từ 1 đến 500000. Trong khi sinh số, bạn có thể nhấn Ctrl+Z để stop nó, khi đó kiểm tra trạng thái bằng lệnh ps -S, bạn sẽ thấy nó đang ở trạng thái T (tiến trình với PID là 4717 ở hình bên dưới)
TIẾN TRÌNH ZOMBIE
Một tiến trình đã kết thúc, nhưng tiến trình cha vẫn chưa gọi lời gọi wait(), thì được gọi là tiến trình zombie.Trong chương trình sau, tiến trình con kết thúc quá trình thực thi bằng cách lệnh gọi hệ thống exit() ,trong khi tiến trình cha "ngủ" trong 50 giây, do đó không gọi hàm wait() và thực thể của tiến trình con vẫn tồn tại trong bảng tiến trình.
Sau khi viết chương trình trên, bạn dùng lệnh gcc Zombie.c -o testZombie để biên dịch chương trình thành tập tin chạy testZombie. Sau đó dùng lệnh ./testZombie để chạy, trong lúc nó chạy, bạn nhấn Ctrl+Z để làm gián đoạn nó như hình bên dưới. (Bạn có thể xem lại bài Biên dịch chương trình với GCC trên CentOS)
Tiếp theo, bạn nhập lệnh ps -S để xem trạng thái, thì bạn sẽ thấy tiến trình với PID là 6653 đang ở trạng thái Z, đó chính là trạng thái Zombie của tiến trình testZombie như hình bên dưới
TIẾN TRÌNH ORPHAN
Nếu tiến trình cha kết thúc mà không gọi lời gọi wait(), thì tiến trình con được gọi là tiến trình orphan.Để xem một tiến trình Orphan, bạn có thể thực hiện như sau: Đầu tiên nhập lệnh ps để xem các tiến trình hiện tại, tiếp theo bạn nhập lệnh bash để tạo thêm 1 tiến trình con (bash mới tạo có PID là 6304, là con của tiến trình bash có PID 6260 như hình bên dưới)Sau đó bạn tiếp tục nhập lệnh: ( sleep 100 & ( kill -9 6304 ) ) như hình bên dưới. Lệnh này có tác dụng tạo tiến trình sleep là con của bash 6304 và đồng thời chấm dứt tiến trình với 6304Sau đó dùng lệnh ps để xem lại thì sẽ không thấy tiến trình 6304 xuất hiện nữa, tiến trình con của nó là sleep 6354 vẫn còn
Nhập tiếp lệnh: ps -o ppid 6354 để xem tiến trình cha của tiến trình 6354, thì không thấy mã PID của tiến trình cha (vì nó đã bị chấm dứt ở trên). Tiến trình 6354 bây giờ trở thành tiến trình Orphan và do tiến trình init quản lý.
Như vậy, bạn đã hoàn thành thành công bài học rồi nhé.
Chúc bạn học tập chăm chỉ!