5 trạng thái tiến trình của Linux là gì?

Tác giả Network Engineer, T.Tư 12, 2025, 12:50:07 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Trên mỗi phiên bản hệ điều hành Linux, có các tiến trình chạy. Chúng có thể bao gồm các tiến trình ssh, sshd và cron jobs. Bất kỳ ứng dụng nào cần chạy đều gọi một tiến trình. Thông thường, các tiến trình đó tạo ra các tiến trình khác. Vì lý do đó, có một hệ thống phân cấp các tiến trình. Một ví dụ về điều này là khi bạn đăng nhập, shell của bạn là một tiến trình. Nó được tạo bởi một tiến trình cha.

Chúng tôi sẽ không đi sâu vào quá nhiều chi tiết về các tiến trình cha, nhưng khi bạn chạy các ứng dụng hoặc tiến trình mới, tiến trình cha của chúng là tiến trình shell của bạn. Khi bạn đăng xuất, tất cả các tiến trình con đó sẽ được dọn dẹp như một phần của quá trình đăng xuất đó.


Khi giới thiệu khái niệm về tiến trình, người ta mong đợi rằng các tiến trình này sẽ chạy 100% thời gian. Một tiến trình đang chạy sẽ tiêu thụ CPU, vì vậy nếu tất cả các tiến trình luôn chạy, mức sử dụng CPU sẽ rất cao và sẽ khó để chạy nhiều tiến trình cùng một lúc. Vì lý do này, có nhiều trạng thái khác nhau, một số tiêu thụ CPU, trong khi những trạng thái khác thì không hoặc nếu có thì rất ít.

1. 5 trạng thái tiến trình của Linux là gì?

Có năm trạng thái tiến trình Linux. Chúng như sau: running & runnable, interruptable_sleep, uninterruptable_sleep, stopped và zombie. Mỗi trạng thái tiến trình này tồn tại vì một lý do được xác định rất rõ ràng. Hiểu các trạng thái này có thể rất hữu ích khi khắc phục sự cố  như cạn kiệt tài nguyên hoặc tạo tiến trình ngoài tầm kiểm soát. Sự hiểu biết đó thậm chí còn quan trọng hơn khi chúng ta cần hiểu cách chấm dứt hoặc hủy các tiến trình vì tùy thuộc vào trạng thái tiến trình, có thể cần một kỹ thuật khác nhau.


2. Cách tìm trạng thái tiến trình

Cách đơn giản nhất để tìm trạng thái tiến trình là sử dụng lệnh top. Lệnh này liệt kê các tiến trình đang chạy hàng đầu — và một vài cột theo mặc định. Trạng thái thường được phản ánh dưới dạng một ký tự trong cột "S". Lệnh ps cũng có thể được sử dụng. Lệnh này sẽ liệt kê các tiến trình dựa trên các tiêu chí bạn truyền cho nó bằng cờ. Nó chấp nhận một vài cờ khác nhau tùy thuộc vào thông tin bạn muốn xem. Cờ phổ biến là "ps aux"

Như thường lệ, hãy tham khảo trang hướng dẫn để biết cách phân phối và lệnh cụ thể của bạn  nhưng các ánh xạ phổ biến nhất của ký tự sang trạng thái như sau.

'D' = UNINTERRUPTABLE_SLEEP

'R' = RUNNING & RUNNABLE

'S' = INTERRRUPTABLE_SLEEP

'T' = STOPPED

'Z' = ZOMBIE

3. Trạng thái tiến trình CHẠY & CÓ THỂ CHẠY

Trong khi running và runnable thường được gộp chung với nhau, vẫn có những khác biệt nhỏ giữa chúng. Hầu hết thời gian, sự khác biệt đó không quan trọng vì nó chỉ ra rằng tiến trình đang xếp hàng để chạy hoặc đang trong quá trình chạy. Như tên gọi của nó, running là chạy tích cực và được phân bổ cho một lõi CPU/CPU hoặc luồng. Điều này sẽ ảnh hưởng đến số liệu sử dụng CPU theo thời gian thực.

Sự khác biệt giữa chạy và có thể chạy là một tiến trình có thể chạy đã sẵn sàng và được xếp hàng để chạy, nhưng vì lý do nào đó, CPU không sẵn sàng để lên lịch cho nó. Do đó, nó được xếp hàng để chạy. Trong môi trường máy ảo, điều này phổ biến hơn vì CPU vật lý được cung cấp quá mức nên CPU ảo có thể có độ trễ hoặc CPU sẵn sàng nhiều hơn một chút. Điều này cũng có thể xảy ra trong thế giới vật lý khi có quá nhiều tiến trình được lên lịch để chạy và không có đủ thời gian CPU khả dụng.

4. Trạng thái tiến trình INTERRRUPTABLE_SLEEP

Trong quá trình chạy một tiến trình, nó sẽ đến một điểm mà nó đang chờ dữ liệu. Điều này có thể ở dạng đầu vào từ thiết bị đầu cuối như yêu cầu người dùng nhập dữ liệu. Trong các trường hợp khác, tiến trình có thể là một máy chủ web và đang chờ, chờ truy vấn.

Trong khi chờ đợi điều này, một ứng dụng được mã hóa tốt sẽ chuyển sang trạng thái INTERRUPTABLE_SLEEP. Trong trạng thái này, một tiến trình có thể dễ dàng bị chấm dứt mà không có vấn đề gì. Việc chuyển sang trạng thái tiến trình này trong khi chờ đầu vào cho phép tiến trình lùi lại và cung cấp thời gian CPU cho các tiến trình khác. Sẽ lãng phí CPU nếu tuần hoàn thời gian CPU một cách không cần thiết.

5. Trạng thái tiến trình UNINTERRUPTABLE_SLEEP

Giống như INTERRUPTABLE_SLEEP, UNINTERRUPTABLE_SLEEP là trạng thái mà tiến trình đang chờ một cái gì đó. Thông thường trong trạng thái này, việc ngắt quãng có thể gây ra một số vấn đề lớn. Rất hiếm khi bắt được một tiến trình trong trạng thái này nhưng khi bắt được, thường là do một lệnh gọi hệ thống hoặc syscall. Một ví dụ tuyệt vời là lệnh mkdir. Lệnh này thực hiện một lệnh gọi hệ thống đến kernel và trong quá trình đó sẽ vào trạng thái này. Đối với các đĩa cục bộ, lệnh này diễn ra ngay lập tức, ngoại trừ trong những trường hợp cực đoan. Với một hệ thống tệp được kết nối mạng như NFS, lệnh này có thể bị treo vô thời hạn ở trạng thái này nếu có đủ điều kiện.

Ví dụ, nếu mạng bị ngắt kết nối trong khi đang chạy đúng lúc, nó có thể bị treo ở trạng thái này, chờ mạng trở lại. Các ví dụ khác về việc ở trạng thái này trong thời gian dài thường là do lỗi trình điều khiển hạt nhân.

6. Làm thế nào để ngăn chặn quá trình ngủ?

Bạn có thể giết một tiến trình đang ngủ hay không phụ thuộc rất nhiều vào việc nó có thể ngắt quãng hay không. Thông thường, trạng thái ngủ có thể ngắt quãng có thể bị giết bằng lệnh kill hoặc "kill -9" nếu bạn muốn nó xảy ra ngay lập tức. Mặt khác, trạng thái ngủ không thể bị giết. Bạn có thể ra lệnh giết nó nhưng lệnh giết đó sẽ được xếp hàng cho đến khi nó thoát khỏi trạng thái này. Hoặc khởi động lại hệ thống là một lựa chọn.

Các tiến trình bị kẹt trong UNINTERRUPTABLE_SLEEP thường là các trường hợp ngoại lệ trong các trạng thái không mong muốn. Cho dù đó là yêu cầu mạng bị loại khỏi bản đồ hay trình điều khiển hạt nhân bị lỗi, đây là các trạng thái có thể trở nên rất không nhất quán nếu bị hủy và do đó không được phép.

7. Trạng thái tiến trình đã dừng

Quá trình STOPPED bạn có thể nghĩ về nó nhiều hơn như một quá trình bị treo. Nhiều ứng dụng và công cụ/ứng dụng bảng điều khiển cho phép bạn sử dụng Control + Z để tạm dừng các quá trình. Ở trạng thái này, quá trình bị giữ lại và không phản hồi. Một ví dụ về thời điểm bạn có thể có một quá trình ở trạng thái này là khi bạn có một ứng dụng nền trước yêu cầu người dùng nhập dữ liệu, nhưng bạn chưa sẵn sàng nhập dữ liệu đó. Bạn có thể Control + Z và chuyển sang thứ khác. Khi bạn đã sẵn sàng quay lại, bạn có thể chạy lệnh "fg" để đưa nó trở lại.

8. Trạng thái tiến trình ZOMBIE

Các tiến trình ở trạng thái ZOMBIE có thể nghe có vẻ là một trạng thái kỳ lạ. Về cơ bản, đây là trạng thái tạm thời sau khi một tiến trình thoát — nhưng trước khi tiến trình cha xóa nó khỏi bảng tiến trình. Khi một tiến trình kết thúc, tiến trình cha có trách nhiệm "gặt hái" tiến trình con và dọn dẹp bảng tiến trình.

Thông thường, bạn chỉ gặp phải các tiến trình zombie khi tiến trình cha chưa thực hiện quá trình dọn dẹp này và bạn có một tiến trình đang tồn tại. Tên này có thể xuất phát từ phép loại suy rằng zombie không chết, chúng là xác sống nên bạn không thể giết chúng! Hãy nghĩ về một tiến trình ở trạng thái này theo hướng đó. Nó đã kết thúc nhưng vẫn chưa chết hẳn. Phép loại suy này không hoàn toàn phù hợp nhưng có thể đó là lý do tại sao tên này xuất phát.

9. Làm thế nào để tiêu diệt quá trình ZOMBIE?

Chúng tôi đã nói rằng bạn không thể giết một tiến trình zombie, nhưng làm sao bạn thực sự giết được nó? Như chúng tôi đã tham chiếu, tiến trình cha chịu trách nhiệm thu hoạch nó và bạn có thể kích hoạt tiến trình cha để thực hiện việc này.

Bước đầu tiên là tìm tiến trình cha của nó. Thông thường có một cột trong đầu ra "ps" cho PPID hoặc ID tiến trình cha. Bạn muốn xác định số này. Khi bạn đã xác định, bạn có thể gửi tín hiệu SIGCHLD đến tiến trình cha đó để yêu cầu nó thực hiện việc dọn dẹp này.

Mã nguồn [Chọn]
kill -s SIGCHLD <PPID>
Trong trường hợp xấu nhất, khi tiến trình cha tạo ra nhiều tiến trình zombie không được dọn dẹp, bạn có thể giết hoặc khởi động lại tiến trình cha. Tuy nhiên, bạn nên sử dụng cách này một cách hạn chế nếu bạn chắc chắn rằng đây là điều bạn muốn làm. Nó có thể gây ra hậu quả không mong muốn. Ưu điểm và nhược điểm của Linux là luôn có nhiều thứ để học hơn. Cho dù bạn đang hướng đến chứng chỉ hay chỉ là hiểu biết về công nghệ, hãy cân nhắc tham gia khóa học về Linux.