Vịng lặp vơ tận:

Một phần của tài liệu document (Trang 78 - 79)

VI. Trì hỗn thời gian trong kernel:

1.Vịng lặp vơ tận:

Kỹ thuật trì hỗn thời gian đầu tiên là vịng lặp busy loop. Đây là cách trì hỗn thời

gian cổ điển và đơn giản nhất, áp dụng cho tất cả các hệ thống. Kỹ thuật trì hỗn này có dạng như sau:

/*Khai báo thời điểm tương lai muốn thực hiện trì hỗn*/

unsigned long timeout = jiffies + HZ/10;//Trì hỗn 10ms; /*Thực hiện vịng lặp vơ tận while () trì hỗn thời gian*/

while (time_before(jiffies, timeout)) ;

Với cách trì hỗn thời gian trên, chúng ta dùng biến jiffies để so sánh với thời điểm tương lai làm điều kiện cho lệnh while () thực hiện vòng lặp. Như vậy chúng ta chỉ có thể trì hỗn một khoảng thời gian đúng bằng một số nguyên lần của tick. Hơn nữa, khác

với lớp user, vịng lặp trong kernelkhơng được chia tiến trình thực hiện. Vì thế vịng lặp vơ tận trong kernel sẽ chiếm hết thời gian làm việc của CPU và như thế các hoạt động khác sẽ không được thực thi, hệ thống sẽ bị ngưng lại tạm thời. Điều này rất nguy hiểm cho các ứng dụng đòi hỏi độ tin cậy cao về thời gian thực. Cách trì hỗn thời gian này rất hiếm khi được sử dụng trong những hệ thống lớn.

Để giải quyết vấn đề này, người ta dùng kỹ thuật chia tiến trình trong lúc thực hiện trì hỗn như sau:

while (time_before(jiffies, timeout))

schedule();//Hàm này chứa trong thư viện <linux/sched.h>

Trong khi jiffies vẫn thõa mãn điều kiện nhỏ hơn thời điểm đặt trước, kernel sẽ chia thời gian thực hiện công việc khác trong hệ thống. Cho đến khi vịng lặp được thốt, những lệnh tiếp theo sẽ tiếp tục thực thi.

Chúng ta cũng có thể áp dụng những lệnh so sánh thời gian thực trong phần trước để thực hiện trì hỗn thời gian với độ chính xác cao hơn.

Một phần của tài liệu document (Trang 78 - 79)