Trước hết, ta cần tìm hiểu khái niệm tiến trình là gì?
Tiến trình, theo ta hiểu, là một đoạn chương trình thực hiện một công việc cụ thể nào đó. Cũng như khi ta viết một chương trình đơn giản (hello world chẳng hạn), thì công việc của chúng ta đó là in ra dòng chữ Hello World. Nhưng khi đó, dĩ nhiên ta sẽ chỉ có một hàm main chạy chính và hệ thống của ta cũng sẽ chỉ quản lý hàm main đó.
Vậy sự khác nhau giữa tiến trình và một chương trình thông thường là gì?
Trước hết ta cần biết, hệ thống Linux quản lý rất nhiều tác vụ trong cùng một thời điểm,các tác vụ đó có thể là:
- truyền nhận file
- đọc ghi từ ổ cứng
- giao tiếp với ngoại vi (bàn phím, chuột v.v...)
Tương ứng với mỗi tác vụ là mỗi chương trình mà ta thường viết (giống hello world), hệ thống Linux sẽ cung cấp và tài nguyên để các chương trình này hoạt động một cách gần như song song và độc lập với nhau.
Khi một process chạy, Linux kernel sẽ cung cấp một không gian địa chỉ vùng nhớ như sau cho nó.
Chức năng của từng phần các bạn có thể tra google nhé.
Phần quan trọng nhất đó là text segment, data segment và bss segment. Text segment chưa các mã thực thi và là vùng nhớ chỉ đọc, ví dụ như các giá trị hằng số. Data segment chứa các biến toàn cục đã được khởi tạo, vùng nhớ này có thể được ghi. Vùng bss chứa các giá trị toàn cục chưa được khởi tạo, mặc định, C compiler sẽ gán cho các giá trị này giá trị là 0, do đó các giá trị này không cần lưu giá trị 0 của chúng nhằm tiết kiệm bộ nhớ, mỗi khi chương trình được chạy, các giá trị này sẽ đồng thời được gán giá trị 0 bằng cách map với một bảng 0 (zero page) bởi kernel sau đó load vào bộ nhớ. Đó là lí do tại sao ta không để chung bộ nhớ bss và data chung. BSS - Block Started by Symbol.
Process thường đi kèm với rất nhiều tài nguyên được quản lý bởi kernel.
Thread (Luồng)
Một process có thể bao gồm ít nhất 1 hoặc nhiều thread.
- 1 thread - single-threaded
- nhiều thread - multi-threaded
Các thread trong cùng một process chia sẻ cùng tài nguyên trừ stack segment (bao gồm biến local, thanh ghi lệnh - instruction pointer).
Linux xây dựng các thread theo chuẩn POSIX, do đó thường được gọi là Pthread.
Process hierarchy (Phân tầng của tiến trình)
Mỗi process đều có một định danh là ID của chúng, process ID là duy nhất và là số dương.
Khi hệ thống khởi động lên, ta có một process chạy đầu tiên đó là init process có PID = 1. Process này sẽ là process cha của các process khác thông qua hàm fork() để tạo ra một process mới. Bất cứ một process nào được sinh ra sau đó cũng có thể sinh ra các process con kế tiếp, khi một process cha bị kill, các process con của nó sẽ nhận process init là process cha.
Không có nhận xét nào:
Đăng nhận xét