Skip to main content

Command Palette

Search for a command to run...

Tiến trình (Process)

Updated
5 min read

Tiến trình là một chương trình đang chạy trong máy tính.

Tiến trình được tạo ra khi một chương trình được tải vào bộ nhớ để thực thi.

  1. Các trạng thái của tiến trình

Trạng thái của tiến trình là cách hệ điều hành theo dõi quá trình hoạt động của tiến trình. Mỗi tiến trình luôn nằm trong một trạng thái cụ thể tại một thời điểm. Trạng thái tiến trình thay đổi khi chạy, chờ, hay bị tạm dừng.

a. New

Tiến trình được tạo mới nhưng chưa sẵn sàng để chạy (chưa vào hàng đợi Ready).

b. Ready

Tiến trình đang ở trong bộ nhớ chờ CPU chọn để chạy.

c. Running

Tiến trình đang được CPU thực thi lệnh.

d. Waiting/Blocked

Tiến trình chuyển sang trạng thái chờ hoặc blocked khi chờ xử lý sự kiên I/O ví dụ như đọc/ghi file đồng bộ. Khi đó việc đọc/ghi file được thực hiện bằng các hàm đọc file của hệ điều hành. Tiến trình sẽ rơi vào trạng thái blocked để chờ các tác vụ này hoàn thành mới tiếp tục.

Tiến trình ở trạng thái blocked sẽ không được chọn để chạy dù CPU rảnh.

e. Terminated/Exit

Tiến trình đã thực hiện xong chuyển sang trạng thái kết thúc.

  1. Thông tin mô tả của tiến trình

Thông tin của tiến trình được lưu trong một cấu trúc dữ liệu là PCB (Process Control Block) gọi là khối quản lý tiến trình.

Trong mã nguồn của hệ điều hành Linux, thông tin của tiến trình (PCB) được lưu trong struct task_struct, định nghĩa trong file sched.h của mã nguồn.

Chúng ta hãy xem mã nguồn Linux phiên bản rút gọn của struct task_struct như sau:

struct task_struct {
    pid_t pid;             
    pid_t tgid;                   
    struct task_struct *real_parent;
    struct task_struct *parent;
    struct list_head children;
    struct list_head sibling;
    struct task_struct *group_leader;
    char comm[TASK_COMM_LEN];

    unsigned int __state; 

    int prio;
    int static_prio;
    int normal_prio;
    unsigned int rt_priority;
    struct sched_entity se;        
    struct sched_rt_entity rt;     
    struct sched_dl_entity dl;     
    const struct sched_class *sched_class;

    struct mm_struct *mm;          
    struct mm_struct *active_mm;   

    struct files_struct *files;    
    struct fs_struct *fs;          

    struct signal_struct *signal;
    struct sighand_struct __rcu *sighand;
    sigset_t blocked;
    struct sigpending pending;

    int on_cpu;                     
    int on_rq;                      
    u64 utime;                      
    u64 stime;                      
    u64 start_time;                 
    unsigned long nvcsw;            
    unsigned long nivcsw;           

    struct list_head tasks;         

    struct thread_struct thread;
};

a. Nhóm định danh và mối quan hệ của tiến trình, giúp Kernel biết tiến trình là ai và thuộc về đâu.

  • pid (Process ID): Trong Linux, mỗi thread cũng được coi là một process, vì vậy mỗi thread có một pid riêng.

  • tgid (Thread Group ID): mã số định danh duy nhất của tiến trình, Các thread thuộc cùng một tiến trình có chung tgid.

b. Nhóm trạng thái và lập lịch (State, Scheduling)

  • __state: là trạng thái của tiến trình như RUNNING, BLOCKED …

  • prio: mức độ ưu tiên của tiến trình, Kernel dùng để tính toán xem tiến trình có được ưu tiên chiếm CPU của các tiến trình khác hay không.

c. Nhóm quản lý bộ nhớ

  • mm: con trỏ trỏ đến không gian bộ nhớ của tiến trình trong RAM (Code/Text, Data, bss, Heap, Stack)

d. Nhóm quản lý file và hệ thống tệp

  • files: bảng mô tả file, lưu danh sách các file mà tiến trình đang mở

  • fs: lưu thông tin về thư mục gốc (root) và thư mục hiện hành (curent working directory) của tiến trình

e. Nhóm thống kê tài nguyên

  • utime/stime: thống kê thời gian tiến trình chạy ở chế độ User mode và Kernel mode

  • start_time: thời điểm tiến trình được tạo

f. Liên kết tiến trình

  • list_head tasks: kết nối tiến trình vào danh sách chứa toàn bộ tiến trình toàn hệ thống, giúp scheduler duyệt và quản lý toàn bộ tiến trình.
  1. Xem thông tin của tiến trình đang chạy trong Linux

Trong linux, tiến trình đang chạy được lưu trong thư mục /proc.

Mỗi tiến trình có một thư mục con theo PID (process ID)

chúng ta có thể xem toàn bộ các tiến trình bằng câu lệnh:

cd /proc
ls

Mỗi thư mục 1, 110, 114 … là số PID tương ứng của một tiến trình.

Chúng ta có thể truy cập vào từng thư mục để xem cụ thể thông tin của một tiến trình cụ thể (ví dụ tiến trình có mã số PID là 110) như sau:

cd 110
cat status

  • Name: là tên tiến trình

  • State: là trạng thái hiện tại (Sleeping)

  • Pid: 110

  1. Chuyển đổi giữa các tiến trình

Trong quá trình thực hiện, CPU có thể chuyển từ thực hiện tiến trình hiện thời sang thực hiện tiến trình khác. Trong trường hợp như vậy hệ điều hành cần lưu thông tin của tiến trình đang chạy để có thể khôi phục và thực hiện lại tiến trình tự thời điểm bị tạm dừng.

Thông tin về tiến trình hiện thời được gọi là Context và việc chuyển đổi giữa các tiến trình là chuyển đổi ngữ cảnh - Context Switch.

Việc chuyển đổi tiến trình xảy ra trong các trường hợp sau:

  • Khi có ngắt:

  • khi tiến trình gọi lời gọi hệ thống

Ngắt: có thể sinh ra do các sự kiện bên ngoài (ngắt do Time Tick khi tiến trình đã chạy hết thời gian được phân bổ, ngắt vào ra dữ liệu của DMA, ngắt khi bấm phím trên bàn phím … ) hoặc ngắt do lỗi phát sinh bên trong tiến trình.

Lời gọi hệ thống: ví dụ khi tiến trình gọi các hàm đọc/ghi file của hệ điều hành.

Ngữ cảnh của tiến trình được lưu trong cấu trúc PCB được mô tả ở trên.

Trước khi xảy ra Context Switch để thực hiện tiến trình khác, các thông tin có thể thay đổi như nội dung các thanh ghi, trạng thái của CPU sẽ được lưu vào PCB.

Sau khi kết thúc ngắt các thông tin về các thanh ghi, trạng thái của CPU được nạp lại từ PCB và tiến trình có thể tiếp tục thực hiện lại từ vị trí trước khi bị ngắt.

Tóm lại, để có thể chuyển đổi giữa các tiến trình thì hệ thống cần thực hiện một số bước liên quan tới việc lưu và khôi phục ngữ cảnh của tiến trình.

The End.

More from this blog

U40 Học Code - Lập trình & Hệ điều hành

11 posts