Bài này sẽ giới thiệu với các bạn về tiến trình và thuộc tính của tiến trình trên hệ điều hành Linux.
1. Tiến trình ( Process )
Tiến trình ( Process ) chỉ là sự thể hiện của một hoặc nhiều tác vụ liên quan đến sự thực thi trên máy tính của bạn. Nó không giống như một chương trình hoặc một lệnh. Một lệnh duy nhất thực sự có thể bắt đầu một số tiến trình cùng một lúc. Một số tiến trình độc lập với nhau và những tiến trình khác có liên quan. Lỗi của một tiến trình có thể ảnh hưởng hoặc không thể ảnh hưởng đến các tiến trình khác đang chạy trên hệ thống.
Các tiến trình sử dụng nhiều tài nguyên hệ thống:bộ nhớ, CPU và các thiết bị ngoại vi, như máy in và màn hình,… Hệ điều hành (đặc biệt là nhân) chịu trách nhiệm phân bổ một phần thích hợp các tài nguyên này cho từng tiến trình và đảm bảo việc sử dụng hệ thống được tối ưu hóa tổng thể.
2.Các loại tiến trình
Một cửa sổ terminal là một quá trình. Nó cho phép chúng ta thực thi các chương trình và truy cập tài nguyên trong môi trường.
Các tiến trình có thể có nhiều loại khác nhau tùy theo nhiệm vụ đang được thực hiện. Dưới đây là một số loại tiến trình khác nhau, cùng với các mô tả và ví dụ của chúng:
Loại tiến trình | Mô tả |
---|---|
Tiến trình tương tác | Được bắt đầu bởi người dùng, tại một dòng lệnh hoặc thông qua giao diện đồ hoạ như biểu tượng hay lựa chọn trong menu. Ví dụ: bash,firefox top,... |
Tiến trình batch | Các tiến trình tự động được lên lịch bắt đầu kết nối và sau đó ngắt kết nối khỏi terminal. Các tác dụ này được sắp xếp và hoạt động trên cơ sở FIFO. Ví dụ: updatedb |
Daemons | Máy chủ sử lý chạy liên tục. Nhiều người được khởi chạy trong quá trình khởi động hệ thống. Sau đó, chờ người dùng hoặc yêu cầu hệ thống cho biết rằng dịch vụ nào là bắt buộc. Ví dụ: http,sshd,... |
Threads | Các tiến trình nhẹ là các tác vụ chạy dưới tiến trình chính nhằm chia sẻ bộ nhớ và các tài nguyên khác, được hệ thống lên lịch và chạy trên cơ sở cá nhân. Một luồng có thể kết thúc mà không kết thúc toàn bộ tiến trình và một tiến trình có thể tạo các luồng mới bất cứ lúc nào. Ví dụ: firefox,gnome-terminal-server,... |
Kernel threads | Các tác vụ nhân mà người dùng không bắt đầu cũng không chấm dứt và có ít quyền kiểm soát. Chúng có thể thực hiện các hành động như di chuyển một luồng từ CPU này sang CPU khác hoặc đảm bảo các hoạt động đầu vào / đầu ra vào đĩa được hoàn thành. Ví dụ: kthreadd,migration,ksoftirqd,... |
3. Tiến trình Scheduling và States
Một nhân quan trọng được gọi là bộ Scheduler liên tục thay đổi các quá trình bật và tắt CPU, chia sẻ thời gian theo mức độ ưu tiên tương đối, cần bao nhiêu thời gian và bao nhiêu đã được cấp cho một tác vụ.
Khi một tiến trình ở trạng thái đang chạy, có nghĩa nó đang thực thi các hướng dẫn trên CPU hoặc đang chờ để được cấp một phần thời gian để nó có thể thực thi. Tất cả các tiến trình trong trạng thái này nằm trên hàng đợi chạy và trên máy tính có nhiều CPU hoặc lõi, có một hàng đợi chạy trên mỗi máy.Tuy nhiên, tiến tình ở trạng thái ngủ. Tất cả các tiến trình trong trạng thái này đang ngồi trên hàng đợi chờ người dùng thực hiện một lệnh nào đó.
Có một số trạng thái tiến trình ít thường xuyên hơn, khi một quá trình đang kết thúc. Đôi khi, một quá trình con hoàn thành, nhưng quá trình mẹ của nó không hỏi về trạng thái của nó. Một tiến trình như vậy được cho là ở trạng thái zombie; nó không thực sự sống nhưng vẫn xuất hiện trong danh sách các tiến trình của hệ thống.
4. Tiến trình và Thread ID
Hệ điều hành Linux theo dõi các tiến trình bằng cách gán cho mỗi số ID tiến tình (PID) duy nhất. Bộ vi xử lý được sử dụng để theo dõi trạng thái tiến trình, sử dụng CPU, sử dụng bộ nhớ… Các bộ vi xử lý mới thường được chỉ định theo thứ tự tăng dần khi các tiến trình được sinh ra. Do đó, PID 1 biểu thị quá trình init (quá trình khởi tạo) và các tiến trình dần dần được gán số cao hơn.
Bảng các loại PID:
Loại ID | Miêu tả |
---|---|
ID tiến trình (PID) | Số ID tiến trình là duy nhất |
Paren tiến tình ID (PPID) | Tiến trình Paren nếu tiến trình mẹ chết thì PPID sẽ tìm đến tiến trình mẹ khác. |
Thread ID (TID) | Số ID thread giống như PID cho các tiến trình đơn luồng. Đối với một tiến trình đa luồng thì mỗi luồng chia sẻ cùng một PID nhưng TID là duy nhất. |
5. ID người dùng và ID nhóm
Nhiều người dùng có thể truy vào một hệ thống cùng một lúc và mỗi người dùng có thể chạy nhiều tiến trình khác nhau. Hệ điều hành Linux sẽ xác định người dùng bắt đầu tiến trình bằng ID người dùng (RUID) được gán riêng cho mỗi người dùng.
Mỗi người dùng được xác định quyền truy cập bằng UID hiệu quả (EUID). EUID có thể hoặc không thể giống như RUID.
Người dùng có thể được phân loại thành các nhóm khác nhau. Mỗi nhóm được xác định bởi ID nhóm (RGID). Quyền truy cập của nhóm được xác định bởi ID nhóm hiệu quả (EGID). Mỗi người dùng có thể là thành viên của một hoặc nhiều nhóm.
6. Thông tin thêm về các ưu tiên
Tại một thời điểm, nhiều tiến trình đang chạy trong một hệ thống. Tuy nhiên, CPU thực sự chỉ có thể chứa một nhiệm vụ tại một thời điểm. Một số tiến trình quan trọng hơn các tiến trình khác, vì vậy hệ điều hành Linux cho phép chúng ta thiết lập và thao tác ưu tiên tiến trình. Các tiến trình ưu tiên cao hơn được cấp nhiều thời gian hơn trên CPU.
Mức độ ưu tiên cho một tiến trình có thể đặt bằng cách chỉ định một giá trị cho tiến trình. Giá trị càng thấp, mức độ ưu tiên càng cao. Giá trị thấp được dùng gán cho các tiến trình quan trọng, các giá trị cao được gán cho các tiến trình có thể chờ lâu hơn. Một tiến trình có giá trị cao cho phép các tiến trình khác được thực hiện trước. Trong trong hệ điều hành Linux, giá trị thấp là -20 đại diện cho mức ưu tiên cao nhất và 19 đại diện cho mức thấp nhất. Chúng ta có thể chỉ định ưu tiên thời gian cho các tác vụ quan trọng với thời gian.