Tiến trình và Quản lý Tiến trình Linux

SƠ LƯỢC VỀ TIẾN TRÌNH
Tiến trình là một môi trường thực hiện, bao gồm một phân đoạn lệnh và một phân đoạn dữ liệu. Cần phân biệt với khái niệm chương trình chỉ gồm tập hợp lệnh.
Tiến trình cũng khác với lệnh vì 1 lệnh có thể sinh ra nhiều tiến trình.
Trên hệ điều hành Linux, tiến trình được nhận biết thông qua số hiệu của tiến trình, gọi là pid. Cũng như đối với user, nó có thể nằm trong nhóm. Vì thế để phân biệt ta nhận biết qua số hiệu nhóm gọi là pgrp.
Có 3 loại tiến trình:
1. Tiến trình có tương tác (Interactive processes) : là tiến trình khởi động và quản lý bởi shell, kể cả tiến trình forthground hoặc background.
2. Tiến trình batch (Batch processes) : Tiến trình không gắn liền đến terminal và được nằm trong hàng đợi để lần lượt thực hiện.
3. Tiến trình ẩn trên bộ nhớ (Daemon processes) : Là các tiến trình chạy dưới nền
(background). Các tiến trình này thường được khởi động từ đầu. Đa số các chương trình
server cho các dịch vụ chạy theo phương thức này. Đây là các chương trình sau khi được gọi
lên bộ nhớ, đợi thụ động các yêu cầu chương trình khách (client) để trả lời sau các cổng xác
định (cổng là khái niệm gắn liền với giao thức TCP/IP BSD socket). Hầu hết các dịch vụ trên
Internet như mail, Web, Domain Name Service … chạy theo nguyên tắc này. Các chương
trình được gọi là các chương trình daemon và tên của nó thường kết thúc bằng ký tự "d" như
named, inetd …

QUẢN LÝ TIẾN TRÌNH
1. Theo dõi tiến trình
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ó.

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 dượ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 –ax 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.
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.
Một số STAT của tiến trình:
  • Runnable: tiến trình ở trạng thái sẵn sàng để chạy. Nó đã được cấp phát đầy đủ các tài nguyên và chỉ đợi tới phiên được cấp CPU thì sẽ chạy.
  • Sleeping: tiến trình đang đợi một sự kiện nào đó xảy ra, khi sự kiện đó xảy ra nó sẽ được duyệt chờ cấp phát CPU để chạy. Ví dụ: một tiến trình đang đợi một thao tác đọc/ghi file nào đó hoàn tất hoặc một tiến trình dịch vụ mạng đang đợi có yêu cầu từ phía client đều là các tiến trình sleeping. Trong trường hợp đặc biệt, có một số tiến trình rơi vào tình trạng không thể đánh thức nó bằng một sự kiện nào được. Những tiến trình này được kí hiệu là D (uninterruptible process).
  • Zoombie: tiến trình đã kết thúc nhưng nó không được xóa sạch sẽ khỏi RAM và tiến trình cha của của nó không nhận được thông báo về việc nó đã kết thúc. Nhìn chung các tiến trình zoombie không gây hại gì. Nếu muốn dọn dẹp các tiến trình này, cách duy nhất là khởi động lại máy.
  • Traced/Stopped: Những tiến trình đã bị buộc dừng lại. Tiến trình rơi vào trạng thái này do nhận được signal STOP hoặc TSTP và chỉ có thể chạy lại khi nhận được signal CONT hoặc khi người dùng cho nó chạy trong chế độ background/ foreground bằng lệnh bg/fg. Khái niệm signal xem phần ??, lệnh bg, fg xem phần ?? dưới đây.
Xem PID của tiến trình pgrep <tiến trình>
Xem theo cấu trúc cây: pstree
Lệnh top :Hiển thị một danh sách các tiến trình hệ thống theo thời gian thực. Nó thống kê số lượng các tiến trình cùng trạng thái của chúng, tình trạng sử dụng CPU, bộ nhớ …
2. Hủy tiến trình:
Lệnh kill : Linux có lệnh kill để thực hiện gửi tín hiệu tới tiến trình.
Các tín hiệu có thể là:
SIGHUP - Hangup (gọi lại tiến trình)        kill -1
SIGINT - Ngắt từ bàn phím (Ctrl+C)         kill -2
SIGKILL  - Hủy tiến trình                             kill -9
SIGTERM  - Kết thúc tiến trình                   kill -15      (mặc định với lệnh kill)
SIGSTOP : - Dừng tiến trình.                      kill -17,19,23
Muốn hủy tiến trình gõ:
kill -9 <PID của tiến trình>
Trước tiên bạn cần phải biết PID của tiến trình cần dừng thông qua lệnh ps. Xin nhắc lại chỉ có 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. Sau đó,
ta sử dụng lệnh
Tham số –9 là gửi tín hiệu dừng không điều kiện chương trình.
Một tiến trình có thể sinh ra các tiến trình con trong quá trình hoạt động của mình. Nếu bạn dừng tiến trình
cha, các tiến trình con cũng sẽ dừng theo, nhưng không tức thì . Vì vậy phải đợi một khoảng thời gian và
sau đó kiểm tra lại xem tất cả các tiến trình con có dừng đúng hay không. Trong một số hãn hữu các trường
hợp, tiến trình có lỗi nặng không dừng được, phương pháp cuối cùng là khởi động lại máy.
3. Tiến trình ngầm:
Lệnh jobs: Hiển thị các tiến trình ngầm (background)

Ký hiệu + chỉ ra tác vụ đang được xử lý
Ký hiệu – chỉ ra tác vụ sẽ được xử lý kế tiếp

fg: chuyển các tiến trình background -> foreground
fg %3 (mã số tác vụ của tiến trình ngầm)
bg: chuyển các tiến trình foreground -> background.
Lưu ý: phải tạm dừng bằng cách nhấn tổ hợp phím (ctrl+z), và sau đó mới chuyển nó sang chế độ ngầm bằng lệnh bg
<tiến trình>& : Đưa <tiến trình> về ngầm.
4. Lâp lịch tiến trình:
Bạn đọc xem bài lập lịch của tôi, sẽ nói kỹ hơn vấn đề này.
5. Set độ ưu tiên:
Ngày nay, các hệ điều hành luôn là đa nhiệm (multi tasking) người dùng có thể chạy một lúc nhiều chương trình. Tuy nhiên tại mỗi thời điểm CPU chỉ có thể thực thi được 1 tiến trình, vậy làm thế nào để cùng một lúc chạy được nhiều tiến trình? Giải pháp ở đây là: CPU không thực thi trọn vẹn một tiến trình nào mà với mỗi tiến trình CPU chỉ thực thi trong một khoảng thời gian rất nhanh rồi chuyển sang tiến trình khác và cứ chuyển liên tục như vậy. Rõ ràng các tiến trình được thực thi lần lượt, nhưng vì thời gian cho mỗi tiến trình là rất nhỏ nên người dùng không cảm nhận được. Thêm nữa tốc độ CPU là hàng tỉ phép tính trên giây nên trong một thời gian rất nhỏ nó cũng làm được rất nhiều việc khiến người dùng có cảm giác như tất cả các tiến trình đang chạy đồng thời.
Bởi mỗi tiến trình có mức độ quan trọng khác nhau nên để dễ điều phối, mỗi tiến trình được gắn với một độ ưu tiên nào đó, trong Linux độ ưu tiên này gọi là số nice (viết tắt là NI). Số nice càng cao thì tiến trình càng “chơi đẹp” (nice: đẹp) tức là nó nhường các tiến trình khác chạy trước. Thông thường trong Linux, số nice nằm trong khoảng -20 (được ưu tiên chạy trước nhất) đến +19 (chạy sau cùng nhất).
Có thể tăng hoặc giảm số nice của mỗi tiến trình bằng lệnh nice
Gõ: nice

Nhận xét