Bài 2: Tiến trình và các hàm trong C của Linux (Phần 1)

 Sỡ dĩ mình sẽ viết tiếp phần các hàm C trong của Linux, nhưng các hàm này đều liên quan đến tiến trình, vì một số bạn co thể sẽ chưa biết tiến trình là gì nên mình sẽ giới thiệu sơ lược về Tiến trình (process) để giúp các bạn nắm được những kiến thức cơ bản!


1. Giới thiệu
 Một trong những đặc điểm nổi bật của Linux là khả năng chạy đồng thời nhiều chương trình. Hệ Điều Hành xem mỗi đơn thể mã lệnh mà nó điều khiển là tiến trình (process). Một chương trình có thể bao gồm nhiều tiến trình kết hợp với nhau
 Định nghĩa của tiến trình: là một thực thể điều khiển đoạn mãlệnh có riêng một không gian địa chỉ, có ngăn xếp stack riêng rẽ, có bảng chứa các thông số mô tả file được mở cùng tiến trình và đặc biệt có một định danh PID (Process Identify) duy nhất trong toàn bộ hệ thống vào thời điểm tiến trình đang chạy.
Rất nhiều tiến trình có thể thực thi trên cùng một máy với cùng một Hệ Điều Hành, cùng một người 1 dùng hoặc nhiều người dùng đăng nhập khác nhau. Ví dụ shell bash là một tiến trình có thể thực thi lệnh ls hay cp. Bản thân ls, cp lại là những tiến trình có thể hoạt động tách biệt khác.

2. Cách hoạt động của tiến trình

Khi 1 chương trình đang chạy từ dòng lệnh, chúng ta có thể nhấn phím Ctrl+z để tạm dùng chương trình và đưa nó vào hoạt động phía hậu trường (background).
Tiến trình của Linux có các trạng thái:
+ running : đây là lúc tiến trình chiếm quyền xử lý CPU dùng tính toán hay thực các công việc của mình.
+ waiting : tiến trình bị Hệ Điều Hành tước quyền xử lý CPU, và chờ đến lược cấp phát khác.
+ suspend : Hệ Điều Hành tạm dừng tiến trình. Tiến trình được đưa vào trạng thái ngủ (sleep). Khi cần thiết và có nhu cầu, Hệ Điều Hành sẽ đánh thức (wake up) hay nạp lại mã lệnh của tiến trình vào bộ nhớ. Cấp phát tài nguyên CPU để tiến trình tiếp tục hoạt động.


Trên dòng lệnh, thay vì dùng lệnh Ctrl+z, chúng ta có thể sử dụng lệnh bg để đưa một tiến trình vào hoạt động phía hậu trường. Chúng ta cũng có thể yêu cầu 1 tiến trình chạy nền bằng cú pháp &.
Ví dụ: $ls –R &


3. Cấu trúc tiến trình
Chúng ta hăy xem Hệ Điều Hành quản lý tiến trình như thế nào?
Nếu có hai người dùng: user1 và user2 cùng đăng nhập vào chạy chương trình grep đồng thời, thực tế, Hệ Điều Hành sẽ quản lý và nạp mãcủa chương trình grep vào hai vùng nhớ khác nhau và gọi mỗi phân vùng như vậy là tiến trình. Hình sau cho thấy cách phân chia chương trình grep thành hai tiến trình cho hai người khác nhau sử dụng 

Trong hình này, user1 chạy chương trình grep tìm chuỗi abc trong tập tin file1.
$grep abc file1
user2 chạy chương trình grep và tìm chuỗi cde trong tập tin file2.
$grep cde file2
Chúng ta cần ta cần nhớ là hai người dùng user1 và user2 có thể ở hai máy tính khác nhau đăng nhập vào máy chủ Linux và gọi grep chạy đồng thời. Hình trên là hiện trạng không gian bộ nhớ Hệ Điều Hành Linux khi chương trình grep phục vụ người dùng.
Nếu dùng lệnh ps, hệ thống sẽ liệt kê cho chúng ta thông tin về các tiến trình mà Hệ Điều Hành đang kiểm soát,
Ví dụ: $ps –af
Mỗi tiến trình được gán cho một định danh để nhận dạng gọi là PID (process
identify). PID thường là số nguyên dương có giá trị từ 2-32768. Khi một tiến trình mới yêu cầu khởi động, Hệ Điều Hành sẽ chọn lấy một số (chưa bị tiến trình nào đang chạy chiếm giữ) trong khoảng số nguyên trên và cấp phát cho tiến trình mới. Khi tiến trình chấm dứt, hệ thống sẽ thu hồi số PID để cấp phát cho tiến trình khác trong lần sau. PID bắt đầu từ giá trị 2 bởi v giá trị 1 được dành cho tiến trình đầu tiên gọi là init. Tiến trình init được và chạy ngay khi chúng ta khởi động Hệ Điều Hành. init là tiến trình quản lý và tạo ra mọi tiến trình con khác.
a) Bảng thông tin tiến trình
Hệ Điều Hành lưu giữ một cấu trúc danh sách bên trong hệ thống gọi là bảng tiến trình (process table). Bảng tiến trình quản lý tất cả PID của hệ thống cùng với thông tin chi tiết về các tiến trình đang chạy. Ví dụng khi chúng ta gọi lệnh ps, Linux thường đọc thông tin trong bảng tiến trình này và hiển thị những lệnh hay tên tiến trình được gọi: thời 4 gian chiếm giữ CPU của tiến trình, tên người sử dụng tiến trình, ...
b) Xem thông tin của tiến trình
Lệnh ps của Hệ Điều Hành dùng để hiển thị thông tin chi tiết về tiến trình. Tùy theo tham số, ps sẽ cho biết thông tin về tiến trình người dùng, tiến trình của hệ thống hoặc tất cả các tiến trình đang chạy. Ví dụ ps sẽ đưa ra chi tiết bằng tham số -af
Trong các thông tin do ps trả về, UID là tên của người dùng đă gọi tiến trình, PID là số định danh mà hệ thống cấp cho tiến trình, PPID là số định danh của tiến trình cha (parent PID). Ở đây chúng ta sẽ gặp một số tiến trình có định danh PPID là 1, là định danh của tiến trình init, được gọi chạy khi hệ thống khởi động. Nếu chúng ta hủy tiến trình init thì Hệ Điều Hành sẽ chấm dứt phiên làm việc. STIME là thời điểm tiến trình được đưa vào sử dụng. TIME là thời gian chiếm dụng CPU của tiến trình. CMD là toàn bộ dòng lệnh khi tiến trình được triệu gọi. TTY là màn hình terminal ảo nơi gọi thực thi tiến trình. Như chúng ta đă biết, người dùng có thể đăng nhập vào hệ thống Linux từ rất nhiều terminal khác nhau để gọi tiến trình. Để liệt kê các tiến trình hệ thống, chúng ta sử dụng lệnh: $ps –ax



To be continue....
SHARE

The Blues

Wellcome to my blog

  • Image
  • Image
  • Image
  • Image
  • Image
    Blogger Comment
    Facebook Comment

1 nhận xét: