GIẢI THUẬT ĐỊNH THỜI CPU
Định thời là một chức năng cơ bản của hệ điều hành. Hầu như tất cả các tài nguyên máy tính đều được lập lịch trước khi sử dụng. Có nhiều giải thuật định thời khác nhau, trong đó mỗi giải thuật định thời đều có cách tiếp cận khác nhau để giúp hệ điều hành điều phối các tiến trình. Trong bài học này, các bạn sẽ được học một số thuật toán định thời CPU bao gồm: FCFS, SJF độc quyền, SJF không độc quyền, Round Robin, Độ ưu tiên độc quyền và độ ưu tiên không độc quyền. Mỗi thuật toán đều được minh họa viết bằng ngôn ngữ C để giúp các bạn hiểu rõ hơn về nguyên lý hoạt động của các tiến trình trong hệ điều hành. Chúng ta cùng bắt đầu với từng giải thuật nhé.
THUẬT TOÁN FCFS
Thuật toán đến trước được phục vụ trước (First Come First Serve) thường được viết tắt là FCFS . Nó hoạt động trên nguyên tắc vào trước ra trước (FIFO - First In First Out) .
Các tiến trình đến trong hàng đợi hệ thống (hàng đợi Ready List) được thực thi dựa trên cơ sở "ai đến trước thì được phục vụ trước". Đây là một thuật toán định thời theo cơ chế độc quyền. .
Khi CPU được cấp phát cho một tiến trình cụ thể, tiến trình đó sẽ thực hiện cho đến khi hoàn thành. CPU không thể rời khỏi tiến trình hiện tại trước khi nó được hoàn thành. Vì vậy, CPU không thể chuyển sang tiến trình khác trong hàng đợi.
FCFS không được tối ưu hóa cho các hệ thống chia sẻ thời gian. Thời gian chờ trung bình cho thuật toán FCFS phụ thuộc nhiều vào thời gian xử lý của các tiến trình.
Ưu điểm của FCFS
Đơn giản và dễ thực hiện
Mọi tiến trình đều được thực thi
Khả năng đói CPU thấp
Nhược điểm của FCFS
Hiệu suất kém do thời gian chờ trung bình cao
Không có tùy chọn ưu tiên cho một tiến trình.
Thời gian hoàn tất trung bình của tiến trình cao
Không hiệu quả cho các hệ thống chia sẻ thời gian
Ví dụ về thuật toán FCFS
Cho bảng dữ liệu định thời như sau:
P1
24
P2
3
P3
3
Tính thời gian chờ, thời gian hoàn tất của từng tiến trình; thời gian chờ trung bình, thời gian hoàn tất trung bình theo giải thuật FCFS.
Biểu đồ Gantt cho thuật toán FCFS với dữ liệu đã cho là

Thời gian chờ (waiting time) của mỗi tiến trình:
P1=0
P2=24
P3=27
Thời gian chờ trung bình: (0+24+27)/3 = 17
Thời gian hoàn tất (turnaround time) của mỗi tiến trình
P1=24
P2=27
P3=30
Thời gian hoàn tất trung bình: (24+27+30)/3 = 27
Chương trình C minh họa thuật toán định thời FCFS
Kết quả chạy chương trình (biên dịch bằng GCC trong môi trường hệ điều hành CentOS)

THUẬT TOÁN SJF ĐỘC QUYỀN
Thuật toán định thời công việc đầu tiên ngắn nhất (SJF - Shortest Job First) là một thuật toán định thời công việc rất phổ biến trong các hệ điều hành. Thuật toán này được thiết kế để khắc phục những thiếu sót của thuật toán FCFS.
Ban đầu, hàng đợi công việc chứa nhiều tiến trình để thực thi. Theo thuật toán SJF độc quyền, các tiến trình được so sánh với nhau và tiến trình có thời gian xử lý ngắn nhất (thời gian thực thi) sẽ được thực thi đầu tiên.
Các tiến trình còn lại cũng được thực hiện theo thứ tự thời gian xử lý của chúng. Nếu có hai hoặc nhiều tiến trình có cùng thời gian thực thi, thì các tiến trình sẽ được thực hiện theo thứ tự đến hàng đợi của chúng.
Khi CPU bắt đầu thực hiện một tiến trình, nó phải hoàn thành tiến trình thành công và sau đó chuyển sang tiến trình khác trong hàng đợi.
Ưu điểm
Thời gian phản hồi của các tiến trình tốt hơn.
Thông lượng tốt hơn nhiều vì thời gian thực hiện ít hơn.
Hiệu suất tổng thể của hệ thống là hiệu quả.
Nhược điểm
Thời gian thực hiện của tất cả các tiến trình trong hàng đợi công việc phải được biết trước để áp dụng thuật toán một cách hiệu quả cho tất cả các tiến trình.
Các tiến trình có thời gian thực thi lớn hơn sẽ có thời gian chờ cao hơn và điều này có thể dẫn đến đói CPU.
Ví dụ về thuật toán SJF độc quyền
Cho bảng dữ liệu định thời như sau:
P1
6
P2
8
P3
7
P4
3
Tính thời gian chờ, thời gian hoàn tất của từng tiến trình; thời gian chờ trung bình, thời gian hoàn tất trung bình theo giải thuật SJF độc quyền.
Biểu đồ Gantt cho thuật toán SJF độc quyền với dữ liệu đã cho là

Thời gian chờ (waiting time) của mỗi tiến trình:
P1=3
P2=16
P3=9
P4=0
Thời gian chờ trung bình: (3+16+9+0)/4 = 7
Thời gian hoàn tất (turnaround time) của mỗi tiến trình
P1=9
P2=24
P3=16
P4=3
Thời gian hoàn tất trung bình: (9+24+16+3)/4 = 13
Chương trình C minh họa thuật toán định thời SJF độc quyền
Kết quả chạy chương trình (biên dịch bằng GCC trong môi trường hệ điều hành CentOS)

THUẬT TOÁN SJF KHÔNG ĐỘC QUYỀN
Theo thuật toán SJF, các công việc trong hàng đợi được so sánh với nhau và công việc có thời gian xử lý ngắn nhất sẽ được thực thi trước.
Các tiến trình còn lại cũng được thực hiện theo thứ tự thời gian xử lý của chúng. Tuy nhiên, có thể có các tình huống trong đó một hoặc nhiều tiến trình có cùng thời gian thực hiện.
Trong những trường hợp như vậy, các tiến trình dựa trên cơ chế "đến trước được phục vụ trước" hay nói cách khác, phương pháp FIFO được sử dụng.
Thuật toán SJF theo cơ chế không độc quyền có nghĩa là CPU có thể rời khỏi một tiến trình trong khi nó đang thực thi và chuyển sang tiến trình khác trong hàng đợi.
Ưu điểm
Thời gian phản hồi tốt hơn nhiều so với thuật toán FCFS.
Thời gian chờ trung bình tối thiểu.
Thông lượng tốt vì thời gian xử lý của các tiến trình ít hơn.
Thời gian xuay vòng tối ưu.
Nhược điểm
Thời gian thực hiện của tất cả các tiến trình trong hàng đợi phải được biết trước, điều này không thể thực hiện được trong tất cả các tình huống.
Các tiến trình có thời gian xử lý lớn hơn sẽ có thời gian chờ cao và điều này có thể dẫn đến đói CPU.
Ví dụ về thuật toán SJF không độc quyền
Cho bảng dữ liệu định thời như sau:
P1
0
7
P2
1
16
P3
3
8
P4
4
3
P5
2
2
Tính thời gian chờ, thời gian hoàn tất của từng tiến trình; thời gian chờ trung bình, thời gian hoàn tất trung bình theo giải thuật SJF không độc quyền.
Biểu đồ Gantt cho thuật toán SJF không độc quyền với dữ liệu đã cho là

Thời gian chờ (waiting time) của mỗi tiến trình:
P1=0+(7-2)=5
P2=20-1=19
P3=12-3=9
P4=4-4=0
P5=2-2=0
Thời gian chờ trung bình: (5+19+9+0+0)/5 = 6.6
Thời gian hoàn tất (turnaround time) của mỗi tiến trình
P1=12
P2=36-1=35
P3=20-3=17
P4=7-4=3
P5=4-2=2
Thời gian hoàn tất trung bình: (12+35+17+3+2)/5 = 13.8
Chương trình C minh họa thuật toán định thời SJF không độc quyền
Kết quả chạy chương trình (biên dịch bằng GCC trong môi trường hệ điều hành CentOS)

THUẬT TOÁN ROUND ROBIN
Round robin là một giải thuật định thời CPU, trong đó mỗi tiến trình được gán một thời gian giữ CPU nhất định trong một chu kỳ chạy, thời gian đó được gọi là thời gian xoay vòng (quantum).
Giải thuật Round Robin có một số đặc điểm sau:
- Là giải thuật chạy theo cơ chế không độc quyền vì mỗi tiến trình đều có một thời gian xoay vòng như nhau
- Đơn giản, dễ thực thi, và tất cả các tiến trình tránh được tình trạng "đói CPU"
- Khuyết điểm chính của giải thuật là tốn nhiều thời gian chuyển ngữ cảnh
Ví dụ về thuật toán Round Robin
Cho bảng dữ liệu định thời như sau:
P1
0
7
P2
1
16
P3
3
8
P4
4
3
P5
2
2
Tính thời gian chờ, thời gian hoàn tất của từng tiến trình; thời gian chờ trung bình, thời gian hoàn tất trung bình theo giải thuật Round Robin. Với q=3.
Biểu đồ Gantt cho thuật toán Round Robin với dữ liệu đã cho là

- Thời gian chờ (waiting time) của mỗi tiến trình:
P1=0+(8-3)+(20-11)=14
P2=(3-1)+(17-6)+(24-20)+(29-27)=19
P3=(11-3)+(21-14)+(27-24)=18
P4=14-4=10
P5=6-2=4
- Thời gian hoàn tất (turnaround time) của mỗi tiến trình
P1=21
P2=36-1=35
P3=29-3=26
P4=17-4=13
P5=8-2=6
Chương trình C minh họa thuật toán định thời Round Robin
Kết quả chạy chương trình (biên dịch bằng GCC trong môi trường hệ điều hành CentOS)
THUẬT TOÁN PRIORITY ĐỘC QUYỀN
Định thời ưu tiên là một phương pháp điều phối tiến trình dựa trên mức độ ưu tiên của mỗi tiến trình. Định thời ưu tiên hoạt động theo 2 cơ chế: Độc quyến và không độc quyền.
Với cơ chế độc quyền, một khi tiến trình đã nhận CPU thì nó sẽ chạy cho đến hết thời gian thực thi của nó, bất kể tiến trình khác có độ ưu tiên cao hơn nó.
Ví dụ về thuật toán Priority độc quyền
Cho bảng dữ liệu định thời như sau:
Tiến trình
Thời gian đến Ready List (RL)
Thời gian xử lý (thực thi)
Độ ưu tiên
P1
0
7
3
P2
1
16
1
P3
3
8
4
P4
4
3
5
P5
2
2
2
Tính thời gian chờ, thời gian hoàn tất của từng tiến trình; thời gian chờ trung bình, thời gian hoàn tất trung bình theo giải thuật Priority độc quyền.
Biểu đồ Gantt cho thuật toán Priority độc quyền với dữ liệu đã cho là

- Thời gian chờ (waiting time) của mỗi tiến trình:
P1=0
P2=7-1=6
P3=25-3=22
P4=33-4=29
P5=23-2=21
- Thời gian hoàn tất (turnaround time) của mỗi tiến trình
P1=7
P2=23-1=22
P3=33-3=30
P4=36-4=32
P5=25-2=23
Chương trình C minh họa thuật toán định thời Priority độc quyền
Kết quả chạy chương trình (biên dịch bằng GCC trong môi trường hệ điều hành CentOS)
THUẬT TOÁN PRIORITY KHÔNG ĐỘC QUYỀN
Định thời ưu tiên là một phương pháp điều phối tiến trình dựa trên mức độ ưu tiên của mỗi tiến trình. Định thời ưu tiên hoạt động theo 2 cơ chế: Độc quyến và không độc quyền.
Với cơ chế không độc quyền, khi tiến trình được nhận CPU thì nó sẽ chạy cho đến khi có sự xuất hiện của tiến trình mới đến có độ ưu tiên cao hơn nó. Tiến trình có độ ưu tiên thấp hơn sẽ phải chờ cho đến khi các tiến trình có độ ưu tiên cao hơn chạy xong.
Ví dụ về thuật toán Priority không độc quyền
Cho bảng dữ liệu định thời như sau:
Tiến trình
Thời gian đến Ready List (RL)
Thời gian xử lý (thực thi)
Độ ưu tiên
P1
0
7
3
P2
1
16
1
P3
3
8
4
P4
4
3
5
P5
2
2
2
Tính thời gian chờ, thời gian hoàn tất của từng tiến trình; thời gian chờ trung bình, thời gian hoàn tất trung bình theo giải thuật Priority không độc quyền.
Biểu đồ Gantt cho thuật toán Priority không độc quyền với dữ liệu đã cho là
- Thời gian chờ (waiting time) của mỗi tiến trình:
P1=0+(19-1)=18
P2=1-1=0
P3=25-3=22
P4=33-4=29
P5=17-2=15
- Thời gian hoàn tất (turnaround time) của mỗi tiến trình
P1=25
P2=17-1=16
P3=33-3=30
P4=36-4=32
P5=19-2=17
Chương trình C minh họa thuật toán định thời Priority không độc quyền
Kết quả chạy chương trình (biên dịch bằng GCC trong môi trường hệ điều hành CentOS)

Bạn vừa hoàn thành bài học với các thuật toán: FCFS, SJF, Round Robin và Priority rồi đó. Hẹn gặp các bạn ở bài học tiếp theo.
Chúc các bạn học tập thật tốt.
Last updated
