🌱 RTOS 03. Thuật toán lập lịch RTOS - RTOS Scheduling Algorithms
Ở post trước chúng ta đã cùng tìm hiểu về cơ chế Multi-Task và Scheduling trong RTOS. Post này mình sẽ giới thiệu sâu hơn về bộ lập lịch Scheduler và một số thuật toán lập lịch - Scheduling.
👉 Các nội dung chính
👉 Kernel là gì?
Kernel - hay gọi là Nhân của hệ điều hành, thực chất là một quy ước có nhiệm vụ điều phối các công việc của RTOS (Mình gọi là quy ước vì thực tế nó vẫn là do mình code nên và nạp vào bộ nhớ, chứ không phải cái gì to tát nhúng từ bên ngoài vào bên trong vi điều khiển của mình). Việc lập trình ra các Kernel hay toàn bộ hoạt động của một OS trong vi điều khiển thường được thực hiện bằng ngôn ngữ Assembly, để đảm bảo tốc độ xử lý nhanh nhất của Kernel.
- Kernel sẽ điều phối hoạt động của các Task dựa vào bộ lập lịch - Scheduler và các thuật toán lập lịch (do con người quy định).
- Kernel sẽ quản lý tài nguyên phần cứng - bộ nhớ, để lưu trữ hoạt động của các task.
- Kernel quản lý các công việc giao tiếp giữa các task, xử lý ngắt, ...
👉 Một số thuật toán lập lịch RTOS
Chẳng hạn, hệ thống có 3 task 1, 2, 3. Khi task 1 vừa kết thúc, hoặc hết thời gian thực hiện, thì Kernel cần gọi bộ lập lịch để biết tiếp theo task nào sẽ thực hiện.
Có khá nhiều thuật toán lập lịch, nên mình cũng chỉ giới thiệu một số thuật toán cơ bản và cách nó hoạt động:
➤ Round-Robin
Có thể thấy cách làm này khá "dân chủ" 😂 nên freeRTOS (hệ điều hành RTOS hỗ trợ cho STM32) đã quyết định sử dụng nó. Các rất đơn giản mà chúng ta có thể nghĩ đến để thực thi thuật toán này, đó là dùng 1 Timer (cụ thể freeRTOS dùng Systick Timer) để đếm thời gian Time Slide, sau đó sinh ra một ngắt để gọi từng Task thực thi.
💬 Tuy nhiên, vấn đề xảy ra là nếu như một Task quan trọng (chẳng hạn Task C trong hình), cần thực hiện ngay, mà lúc đó Task A mới bắt đầu chạy, thì Task C phải đợi hết gần 2 Time Slice mới đến lượt mình 😌 Điều này khiển cho các lập trình viên nghĩ ra thêm các thuật toán khác để bổ sung.
➤ Preemptive
➤ Cooperative
Có thể thấy ở đây mặc dù có độ ưu tiên cao hơn, nhưng Task 2 cũng không thể chiếm quyền điều khiển của Task 1, mà phải đợi Task 1 làm xong thì mới đến lượt.
- 💬 Cơ chế này có thể dùng để tránh việc các task có quyền ưu tiên chiếm hết quyền sử dụng CPU, dẫn đến việc những task nhỏ, có quyền ưu tiên thấp, không được thực hiện. Điều này cũng giống nguyên tắc "bình đẳng" trong xã hội.
- 💬 Tuy nhiên, khi mà bình đẳng như vậy, thì việc những Task có quyền ưu tiên thấp có nguy cơ "lấn tới", làm quá nhiều thứ, dẫn đến việc chiếm dụng quyền sở hữu CPU, và những Task quan trọng sẽ lại không được thực hiện.
dễ hiểu lắm anh trai, cảm ơn anh
Trả lờiXóaThank em đã ủng hộ :D
XóaMặc dù giờ mới đọc được nhưng cảm ơn anh vì những bài viết bổ ích!!
Trả lờiXóaThank em đã ủng hộ
Xóa