1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài tập lớn môn hệ Điều hành chương 5 lập lịch cpu

106 3 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập lịch CPU
Tác giả Hà Lâm Trường Giang, Huỳnh Thái Dương, Võ Đức Lưu, Huỳnh Tấn Mạnh, Bùi Thanh Thi, Trần Chí Tâm
Người hướng dẫn Th.s Nguyễn Thanh Tiến
Trường học Trường Đại học Giao thông Vận tải Thành phố Hồ Chí Minh, Viện Công nghệ Thông tin Điện tử
Chuyên ngành Hệ Điều Hành
Thể loại Bài tập lớn
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 106
Dung lượng 1,24 MB

Cấu trúc

  • 1. LẬP LỊCH LUỒNG (7)
    • 1.1. PHẠM VI TRANH CHẤP (7)
      • 1.1.1. PHẠM VI TRANH CHẤP QUY TRÌNH (PCS) (8)
      • 1.1.2. PHẠM VI TRANH CHẤP HỆ THỐNG (SCS) (8)
      • 1.1.3. SỰ KHÁC NHAU GIỮA PHẠM VI TRANH CHẤP QUY TRÌNH VÀ PHẠM VI TRANH CHẤP HỆ THỐNG (8)
    • 1.2. LẬP LỊCH PTHREAD (9)
      • 1.2.1. PTHREAD SCOPE PROCESS (10)
      • 1.2.2. PTHREAD SCOPE SYSTEM (11)
      • 1.2.3. GIAO TIẾP GIỮA CÁC QUY TRÌNH (11)
  • 2. LẬP LỊCH ĐA BỘ XỬ LÝ (13)
    • 2.1. CÁC PHƯƠNG PHÁP LẬP LỊCH ĐA BỘ XỬ LÝ (13)
    • 2.2. BỘ XỬ LÝ ĐA LÕI(NHÂN) (14)
    • 2.3. SỰ CÂN BẰNG TẢI (18)
    • 2.4. MỐI QUAN HỆ CỦA BỘ XỬ LÝ (19)
    • 2.5. ĐA XỬ LÝ KHÔNG ĐỒNG NHẤT (21)
  • 3. LẬP LICH CPU VÀ THỜI GIAN THỰC (23)
    • 3.1. GIẢM THIỂU ĐỘ TRỄ (23)
    • 3.2. LẬP LỊCH DỰA TRÊN ƯU TIÊN (25)
    • 3.3. LẬP LỊCH ĐƠN ĐIỆU THEO TẦN SUẤT (27)
    • 3.4. LẬP LỊCH EARLIEST DEADLINE FIRST (28)
    • 3.5. LẬP LỊCH CHIA SẺ THEO TỈ LỆ (29)
    • 3.6. LẬP LỊCH THỜI GIAN THỰC POSIX (29)
      • 3.6.1. LẬP LỊCH TRONG LINUX (30)
      • 3.6.1. LẬP TRÌNH TRONG WINDOWS (36)
      • 3.6.2. LẬP TRÌNH TRONG SOLARIS (41)
  • 4. ĐÁNH GIÁ THUẬT TOÁN (46)
    • 4.5. MÔ HÌNH XÁC ĐỊNH (47)
    • 4.6. MÔ HÌNH XẾP HÀNG (HÀNG ĐỢI) (48)
    • 4.7. MÔ PHỎNG (50)
    • 4.8. TRIỂN KHAI (51)
  • 5. TÓM TẮT (54)
    • 5.5. KHÁI NIỆM (54)
    • 5.6. CÁC THUẬT TOÁN LẬP LỊCH (54)
    • 5.7. ĐÁNH GIÁ THUẬT TOÁN LẬP LỊCH (56)
    • 5.8. CÁC THUẬT TOÁN LẬP LỊCH PHỔ BIẾN (56)
    • 5.9. CÁCH THỨC CHỌN LỰA THUẬT TOÁN LẬP LỊCH (57)
  • TÀI LIỆU THAM KHẢO (106)

Nội dung

Chế độ này được gọi là phạm vi tranh chấp giữa các quá trình process contention scope - PCS, vì sự cạnh tranh cho CPU diễn ra giữa các luồng thuộc cùng một quá trình.Thư viện luồng lập l

LẬP LỊCH LUỒNG

PHẠM VI TRANH CHẤP

Sự khác biệt giữa các luồng cấp người dùng (user-level threads) và luồng cấp kernel (kernel-level threads) nằm ở cách các luồng này được lập lịch.

Trên các hệ thống triển khai mô hình nhiều-một (many-to-one) và nhiều- nhiều (many-to-many), thư viện luồng sẽ lập lịch các luồng cấp người dùng để chạy trên các LWP (lightweight processes) có sẵn Chế độ này được gọi là phạm vi tranh chấp giữa các quá trình (process contention scope - PCS), vì sự cạnh tranh cho CPU diễn ra giữa các luồng thuộc cùng một quá trình. Thư viện luồng lập lịch các luồng người dùng lên các LWP có sẵn, nhưng điều này không có nghĩa là các luồng đang chạy thực sự trên CPU vì điều đó đòi hỏi hệ điều hành phải lập lịch luồng nhân của LWP trên lõi CPU vật lý. Để quyết định luồng ở mức kernel nào sẽ được lên lịch trên CPU, hệ điều hành sử dụng phạm vi tranh chấp hệ thống (SCS) Cạnh tranh cho CPU với lập lịch SCS diễn ra giữa tất cả các luồng trong hệ thống Các hệ thống sử dụng mô hình một-một như Windows và Linux, chỉ sử dụng SCS để lập lịch luồng Thông thường, PCS được thực hiện theo mức độ ưu tiên—trình lập lịch chọn luồng có thể chạy với mức ưu tiên cao nhất để thực thi Mặc dù một số thư viện luồng có thể cho phép lập trình viên thay đổi mức ưu tiên của một luồng tuy nhiên các mức ưu tiên của luồng ở mức người dùng được thiết lập bởi lập trình viên và không được điều chỉnh bởi thư viện luồng Điều quan trọng là lưu ý rằng PCS thường sẽ lấy quyền điều khiển luồng hiện đang chạy để ưu tiên cho luồng có mức ưu tiên cao hơn; tuy nhiên, không có đảm bảo về việc phân chia thời gian giữa các luồng có mức ưu tiên bằng nhau.

Trong lập lịch luồng, có hai phạm vi tranh chấp chính là phạm vi tranh chấp quy trình (PCS) và phạm vi tranh chấp hệ thống (SCS) Cả hai phạm vi này đều ảnh hưởng đến cách thức quản lý và tối ưu hóa tài nguyên CPU.

1.1.1 PHẠM VI TRANH CHẤP QUY TRÌNH (PCS)

Trong hệ điều hành, thư viện luồng được lên lịch bởi hệ điều hành sẽ tạo ra các luồng hạt nhân, giúp luồng cấp người dùng chạy như một quy trình nhẹ Đó là phạm vi tranh chấp quy trình (PCS-Process Contention Scope).

PCS được thực hiện dựa trên mức độ ưu tiên,bộ lập lịch sẽ ưu tiên chọn luồng có mức ưu tiên cao nhất để chạy trước Mức độ ưu tiên của luồng ở cấp độ người dùng do lập trình viên thiết lập và không bị thư viện luồng điều chỉnh Tuy vậy, một số thư viện luồng có thể cho phép lập trình viên thay đổi mức độ ưu tiên của luồng.

1.1.2 PHẠM VI TRANH CHẤP HỆ THỐNG (SCS)

Trong một hệ điều hành, phạm vi tranh chấp hệ thống (SCS-System Contention Scope) là một trong hai sơ đồ lập lịch luồng chính Sơ đồ này được sử dụng bởi hạt nhân để quyết định luồng cấp hạt nhân nào sẽ được lên lịch chạy trên CPU Trong phạm vi tranh chấp hệ thống, tất cả các luồng trong hệ thống cạnh tranh cho CPU.

Các hệ thống như Windows và Linux, sử dụng mô hình một-một, thực hiện việc lên lịch luồng chỉ dựa trên phạm vi tranh chấp hệ thống, có nghĩa là chúng chỉ xem xét tất cả các luồng để quyết định luồng nào sẽ được chạy tiếp theo trên CPU.

1.1.3 SỰ KHÁC NHAU GIỮA PHẠM VI TRANH CHẤP QUYTRÌNH VÀ PHẠM VI TRANH CHẤP HỆ THỐNG

Phạm vi tranh chấp quy trình Phạm vi tranh chấp hệ thống

Thường được gọi là lập lịch cục bộ trên các luồng không liên kết.

Thường được gọi là lập lịch toàn cục trên các luồng bị ràng buộc.

Phạm vi tranh chấp quy trình áp dụng mô hình nhiều-nhiều và nhiều-một.

Phạm vi tranh chấp hệ thống áp dụng mô hình một-một.

Trong phạm vi tranh chấp quy trình, có sự cạnh tranh cho việc sử dụng CPU giữa các luồng tương đương với các quy trình.

Trong phạm vi tranh chấp hệ thống, có sự cạnh tranh cho việc sử dụng CPU giữa tất cả các luồng trong một hệ điều hành. Phạm vi tranh chấp quy trình sử dụng mối quan hệ mô hình luồng nhiều-một hoặc nhiều-nhiều.

Trong phạm vi tranh chấp hệ thống, luồng sử dụng mối quan hệ mô hình luồng một-một với một luồng kernel. Chủ yếu được sử dụng trong các chủ đề windows, Linux và Solaris.

Chủ yếu được sử dụng trong các chủ đề

Phạm vi tranh chấp quy trình hoặc phạm vi tranh chấp cục bộ là một luồng cấp người dùng chia sẻ một luồng nhân với luồng người dùng khác trong quy trình.

Phạm vi tranh chấp hệ thống hoặc phạm vi tranh chấp toàn cục là một luồng người dùng được ánh xạ trực tiếp tới một luồng nhân.

Thư viện luồng có quyền kiểm soát thực sự đối với luồng cấp người dùng nào sẽ được lên lịch trên một quy trình nhẹ.

Hệ điều hành cung cấp luồng cấp hạt nhân, tức là hệ điều hành quyết định luồng nào sẽ được lên lịch vào CPU. Tất cả các cơ chế lập lịch cho luồng đều mang tính cục bộ đối với các quy trình.

Tất cả các cơ chế lập lịch cho luồng đều mang tính toàn cục đối với các tiến trình. Phạm vi tranh chấp quy trình rẻ hơn nhiều so với phạm vi tranh chấp hệ thống.

Phạm vi tranh chấp hệ thống rất dễ dự đoán do chi phí xử lý cao.

Các luồng chia sẻ một hoặc nhiều quy trình nhẹ có sẵn.

Các luồng chia sẻ các quy trình nhẹ riêng biệt.

LẬP LỊCH PTHREAD

Đây là quá trình quản lý và lập lịch thực thi các luồng (threads) trong hệ thống sử dụng thư viện pthread (POSIX Threads), nó rất quan trọng trong lập trình đa luồng Thư viện pthread cung cấp một giao diện tiêu chuẩn cho các hệ điều hành tuân thủ tiêu chuẩn POSIX (Portable Operating System

Interface) Khi sử dụng pthread, hệ điều hành sẽ quản lý việc lập lịch và thực thi các luồng dựa trên các yếu tố như ưu tiên, điều kiện cạnh tranh và tài nguyên hệ thống.

Các hàm trong pthread cung cấp các chức năng để tạo, quản lý và đồng bộ hóa các luồng, nhưng không can thiệp trực tiếp vào cách thức các luồng được lập lịch Việc lập lịch và quản lý thực thi các luồng phụ thuộc vào chính sách của hệ điều hành và cách triển khai cụ thể của nó Cách thức lập lịch trong pthread có thể thay đổi tùy theo hệ điều hành và cấu hình hệ thống, bao gồm việc sử dụng các thuật toán như Round Robin, Priority Scheduling hoặc các chiến lược khác nhằm đảm bảo hiệu suất và công bằng trong việc chia sẻ tài nguyên giữa các luồng.

Trong mô hình luồng nhiều-nhiều (M:N), các luồng người dùng có thể thuộc phạm vi tranh chấp hệ thống hoặc phạm vi tranh chấp quy trình, nên mô hình này thường được gọi là mô hình phạm vi hỗn hợp.

Mức đồng thời là một thuộc tính quan trọng của thư viện luồng M:N, nó sẽ xác định số lượng bộ xử lý ảo được sử dụng để chạy các luồng người dùng trong phạm vi tranh chấp quy trình Số lượng này không được vượt quá số lượng luồng người dùng trong phạm vi tranh chấp quy trình và thường được thiết lập động bởi thư viện luồng Hệ thống cũng đặt ra giới hạn cho số lượng luồng hạt nhân có sẵn.

PTHREAD SCOPE PROCESS là một chính sách lập lịch trong thư viện Pthreads (POSIX Threads) cho phép quản lý các luồng (threads) theo phạm vi tranh chấp quy trình (Process Contention Scope - PCS) Khi sử dụng chính sách này, các luồng người dùng cạnh tranh để được lên lịch thực thi trên các luồng nhẹ (LWPs) có sẵn trong hệ thống. Đặc điểm:

 Các luồng cạnh tranh trong cùng một quy trình, cho phép thư viện luồng kiểm soát lập lịch và quyết định luồng nào sẽ chạy.

 PTHREAD SCOPE PROCESS thường hoạt động trong mô hình nhiều-nhiều, nơi nhiều luồng người dùng có thể ánh xạ đến nhiều luồng hạt nhân.

 Chính sách này có thể sử dụng các yếu tố như mức ưu tiên của luồng để quyết định luồng nào sẽ được thực thi trước.

 Thường giúp tối ưu hóa việc sử dụng tài nguyên trong quy trình,đặc biệt khi có nhiều luồng cần xử lý.

PTHREAD SCOPE SYSTEM là một chính sách lập lịch trong thư viện Pthreads (POSIX Threads) cho phép quản lý các luồng (threads) theo phạm vi tranh chấp hệ thống (System Contention Scope - SCS) Khi sử dụng chính sách này, tất cả các luồng trong hệ thống cạnh tranh để được lên lịch thực thi trên các luồng hạt nhân (kernel threads) có sẵn. Đặc điểm của PTHREAD SCOPE SYSTEM:

 Các luồng trong hệ thống cạnh tranh với nhau, không chỉ trong một quy trình, giúp tối ưu hóa việc sử dụng tài nguyên hệ thống.

 PTHREAD SCOPE SYSTEM thường hoạt động trong mô hình một-một, trong đó mỗi luồng người dùng được ánh xạ trực tiếp đến một luồng hạt nhân.

 Chính sách này cho phép hệ điều hành quyết định luồng nào sẽ được thực thi, điều này giúp đảm bảo rằng các luồng có ưu tiên cao hơn sẽ được thực thi trước.

 Do việc lập lịch được quản lý bởi hệ điều hành, PTHREAD SCOPE SYSTEM có thể mang lại tính dự đoán cao hơn so với PTHREAD SCOPE PROCESS.

1.2.3 GIAO TIẾP GIỮA CÁC QUY TRÌNH

IPC (Giao tiếp giữa các quy trình) của Pthread cung cấp hai hàm để thiết lập và lấy chính sách phạm vi tranh chấp: pthread_attr_setscope(pthread_attr_t *attr, int scope) pthread_attr_getscope(pthread_attr_t *attr, int *scope)

Tham số đầu tiên của cả hai hàm chứa một con trỏ đến tập hợp thuộc tính cho luồng Tham số thứ hai của hàm pthread_attr_setscope() được truyền vào giá trị PTHREAD SCOPE SYSTEM hoặc PTHREAD SCOPE PROCESS,cho biết cách thiết lập phạm vi tranh chấp Trong trường hợp của pthread_attr_getscope(), tham số thứ hai chứa một con trỏ đến một giá trị kiểu int sẽ được thiết lập với giá trị hiện tại của phạm vi tranh chấp Nếu có lỗi xảy ra, mỗi hàm này sẽ trả về một giá trị khác không.

Chương trình trước tiên xác định phạm vi tranh chấp hiện tại và thiết lập nó thành PTHREAD SCOPE SYSTEM Sau đó, nó tạo năm luồng riêng biệt sẽ chạy theo chính sách lập lịch SCS Lưu ý rằng trên một số hệ thống, chỉ một số giá trị phạm vi tranh chấp nhất định được cho phép Ví dụ, các hệ thống Linux và macOS chỉ cho phép PTHREAD SCOPE SYSTEM.

LẬP LỊCH ĐA BỘ XỬ LÝ

CÁC PHƯƠNG PHÁP LẬP LỊCH ĐA BỘ XỬ LÝ

Một phương pháp lập lịch CPU trong hệ thống đa bộ xử lý là giao toàn bộ quyết định lập lịch, xử lý I/O và các hoạt động hệ thống khác cho một bộ xử lý duy nhất gọi là máy chủ chính Các bộ xử lý còn lại chỉ thực thi mã của người dùng Phương pháp đa xử lý không đối xứng này khá đơn giản vì chỉ một lõi truy cập vào các cấu trúc dữ liệu của hệ thống thông qua đó giảm thiểu nhu cầu chia sẻ dữ liệu Tuy nhiên, nhược điểm lớn là máy chủ chính có thể trở thành một nút thắt cổ chai dẫn đến giảm hiệu suất tổng thể của hệ thống.

Một phương pháp phổ biến hơn cho việc hỗ trợ đa bộ xử lý là đa xử lý đối xứng (SMP) mỗi bộ xử lý tự lập lịch cho chính nó Trong SMP, mỗi bộ lập lịch sẽ kiểm tra hàng đợi sẵn sàng và chọn một luồng để thực hiện Điều này mang đến hai chiến lược chính để tổ chức các luồng đủ điều kiện được lập lịch:

 Tất cả các luồng có thể nằm trong một hàng đợi sẵn sàng chung.

 Mỗi bộ xử lý có thể có hàng đợi riêng tư của các luồng.

Hình 2 Cách tổ chức hàng đợi sẵn sàng

Nếu chọn tùy chọn đầu tiên, có thể xảy ra tình trạng tranh chấp giữa các bộ xử lý trong việc truy cập hàng đợi sẵn sàng, gây ra nguy cơ hai bộ xử lý khác nhau lập lịch cho cùng một luồng và có thể làm mất các luồng khỏi hàng đợi. Một cách để bảo vệ hàng đợi sẵn sàng chung khỏi tình trạng này là sử dụng các hình thức khóa Tuy nhiên sử dụng khóa có thể tạo ra sự cạnh tranh cao bởi tất cả các truy cập vào hàng đợi đều cần quyền sở hữu khóa, điều này có thể trở thành một điểm nghẽn hiệu suất.

Tùy chọn thứ hai, với hàng đợi riêng tư cho từng bộ xử lý sẽ cho phép mỗi bộ xử lý lập lịch các luồng từ hàng đợi riêng của nó Phương pháp này giúp tránh các vấn đề hiệu suất có thể xảy ra do việc chia sẻ hàng đợi, từ đó trở thành lựa chọn phổ biến nhất trên các hệ thống hỗ trợ SMP Hơn nữa, việc có hàng đợi chạy riêng cho mỗi bộ xử lý có thể dẫn đến việc sử dụng bộ nhớ cache hiệu quả hơn.

Hầu hết các hệ điều hành hiện đại đều hỗ trợ SMP, bao gồm Windows,Linux, macOS cũng như các hệ thống di động như Android và iOS Trong các phần tiếp theo, nhóm em sẽ có các thảo luận về các vấn đề liên quan đến hệ thống SMP khi thiết kế các thuật toán lập lịch CPU.

BỘ XỬ LÝ ĐA LÕI(NHÂN)

Trong bộ xử lý đa nhân, nhiều lõi xử lý được tích hợp trên cùng một chip vật lý Mỗi lõi có một bộ thanh ghi riêng để duy trì trạng thái kiến trúc của nó, vì vậy hệ điều hành nhận diện chúng như các bộ xử lý vật lý riêng biệt So với các hệ thống mà mỗi bộ xử lý có chip vật lý riêng, các hệ thống SMP sử dụng bộ xử lý đa nhân thường nhanh hơn và tiêu thụ ít năng lượng hơn.

Tuy nhiên, việc sử dụng bộ xử lý đa nhân có thể làm phức tạp các vấn đề lập kế hoạch Khi một bộ xử lý truy cập bộ nhớ, nó có thể mất một khoảng thời gian đáng kể để chờ dữ liệu sẵn sàng Tình trạng này, được gọi là "tình trạng bộ nhớ", có thể xảy ra vì nhiều lý do khác nhau, chẳng hạn như lỗi bộ đệm hoặc khi dữ liệu không có trong bộ nhớ đệm Trong những tình huống này, bộ xử lý có thể dành tới 50% thời gian chỉ để chờ dữ liệu từ bộ nhớ. Để giải quyết vấn đề này, các thiết kế phần cứng hiện đại đã triển khai các lõi xử lý đa luồng, trong đó mỗi lõi có thể xử lý hai hoặc nhiều luồng phần cứng cùng lúc Điều này có nghĩa là nếu một luồng gặp phải tình trạng treo khi chờ bộ nhớ, lõi có thể nhanh chóng chuyển sang thực hiện một luồng khác.

Có hai phương pháp chính để quản lý đa luồng trên bộ xử lý: Đa luồng hạt thô: Trong phương pháp này, một luồng sẽ tiếp tục thực thi trên bộ xử lý cho đến khi xảy ra sự kiện có độ trễ dài, như tình trạng dừng bộ nhớ Khi điều đó xảy ra, bộ xử lý sẽ chuyển sang một luồng khác để tiếp tục thực hiện Tuy nhiên, chi phí chuyển đổi giữa các luồng ở đây là khá cao, vì đường dẫn lệnh phải được hoàn tất trước khi luồng mới có thể bắt đầu thực thi. Khi luồng mới bắt đầu, nó sẽ lấp đầy đường ống với các lệnh của mình. Đa luồng mịn: Phương pháp này cho phép chuyển đổi giữa các luồng diễn ra mượt mà hơn, thường ở ranh giới của chu kỳ lệnh Thiết kế kiến trúc của các hệ thống này bao gồm logic cho việc chuyển mạch luồng, giúp giảm thiểu chi phí chuyển đổi giữa các luồng.

Hình 3 Tình trạng dừng bộ nhớ Để khắc phục tình trạng dừng bộ nhớ này này, nhiều thiết kế phần cứng hiện đại đã triển khai các lõi xử lý đa luồng, trong đó mỗi lõi được gán hai (hoặc nhiều hơn) luồng phần cứng Nhờ vậy, nếu một luồng phần cứng bị dừng lại khi chờ dữ liệu từ bộ nhớ, lõi có thể nhanh chóng chuyển sang thực hiện một luồng khác

Hình 4 Hệ thống đa nhân đa luồng (multithreaded multicore system)

Hình 4 minh họa một lõi xử lý với hai luồng, trong đó việc thực thi của luồng 0 và luồng 1 diễn ra xen kẽ Từ góc độ của hệ điều hành, mỗi luồng phần cứng duy trì trạng thái kiến trúc riêng, như con trỏ lệnh và tập thanh ghi, và vì vậy chúng xuất hiện như các CPU logic có sẵn để thực hiện các luồng phần mềm Kỹ thuật này, được gọi là đa luồng chip (chip multithreading - CMT), được thể hiện trong Hình 5.

Hình 5 Chip multithreading (đa luồng chip)

Trong hình này, bộ xử lý chứa bốn lõi tính toán, mỗi lõi có hai luồng phần cứng Từ quan điểm của hệ điều hành, tổng cộng có tám CPU logic Các bộ xử lý Intel thường sử dụng thuật ngữ hyper-threading (còn được gọi là đa luồng đồng thời hoặc SMT) để mô tả việc gán nhiều luồng phần cứng cho một lõi xử lý duy nhất Các bộ xử lý Intel hiện đại, như i7, hỗ trợ hai luồng cho mỗi lõi, trong khi bộ xử lý Oracle Sparc M7 hỗ trợ tới tám luồng cho mỗi lõi, với tổng cộng tám lõi cho mỗi bộ xử lý Như vậy, hệ điều hành có thể sử dụng đến 64 CPU logic.

Về mặt tổng quan, có hai phương pháp chính để thực hiện đa luồng trên một lõi xử lý: đa luồng hạt thô và đa luồng mịn. Đa luồng hạt thô: Trong phương pháp này, một luồng sẽ tiếp tục thực thi trên lõi cho đến khi xảy ra một sự kiện có độ trễ dài, như tình trạng dừng bộ nhớ Khi sự kiện này xảy ra, lõi phải chuyển sang thực hiện một luồng khác. Tuy nhiên, chi phí chuyển đổi giữa các luồng tương đối cao, vì ống lệnh cần phải được xóa sạch trước khi luồng mới có thể bắt đầu thực thi Khi luồng mới này được khởi động, nó sẽ lấp đầy ống lệnh bằng các lệnh của mình. Đa luồng mịn (fine-grained) hay còn gọi là đa luồng xen kẽ (interleaved multithreading) chuyển đổi giữa các luồng ở mức độ chi tiết hơn—thường là ở ranh giới của một chu kỳ lệnh Tuy nhiên, thiết kế kiến trúc của các hệ thống đa luồng mịn bao gồm logic cho việc chuyển đổi giữa các luồng Do đó, chi phí chuyển đổi giữa các luồng là rất nhỏ. Điều quan trọng cần lưu ý là các tài nguyên của lõi vật lý (như bộ nhớ đệm và ống lệnh) phải được chia sẻ giữa các luồng phần cứng vì vậy một lõi xử lý chỉ có thể thực thi một luồng phần cứng tại một thời điểm Kết quả là một bộ xử lý đa luồng, đa nhân thực sự yêu cầu hai cấp độ lập lịch khác nhau, như được minh họa trong Hình 6, thể hiện một lõi xử lý với hai luồng.

Hình 6 Hai cấp độ lập lịch

Cấp độ đầu tiên là các quyết định lập lịch mà hệ điều hành phải thực hiện khi chọn luồng phần mềm nào sẽ chạy trên mỗi luồng phần cứng (CPU logic). Đối với tất cả các mục đích thực tiễn, những quyết định này là trọng tâm chính của chương này Do đó, cho cấp độ lập lịch này, hệ điều hành có thể chọn bất kỳ thuật toán lập lịch nào.

Cấp độ lập lịch thứ hai xác định cách mỗi lõi quyết định luồng phần cứng nào sẽ được thực thi Có một số chiến lược để áp dụng trong tình huống này. Một phương pháp là sử dụng thuật toán luân phiên đơn giản để lập lịch một luồng phần cứng cho lõi xử lý Đây là phương pháp được áp dụng bởi UltraSPARC T3 Một phương pháp khác được sử dụng bởi bộ xử lý Intel Itanium, một bộ xử lý dual-core với hai luồng được quản lý bởi phần cứng cho mỗi lõi Mỗi luồng phần cứng được gán một giá trị độ khẩn cấp động từ 0 đến 7 (trong đó 0 đại diện cho độ khẩn cấp thấp nhất và 7 là cao nhất) Itanium xác định năm sự kiện khác nhau có thể kích hoạt một lần chuyển đổi luồng Khi một trong những sự kiện này xảy ra, logic chuyển đổi luồng sẽ so sánh độ khẩn cấp của hai luồng và chọn luồng có giá trị khẩn cấp cao nhất để thực thi trên lõi bộ xử lý.

Lưu ý rằng hai cấp độ lập lịch khác nhau được thể hiện trong Hình 6 không nhất thiết phải loại trừ lẫn nhau Thực tế, nếu bộ lập lịch hệ điều hành (cấp độ đầu tiên) nhận thức được việc chia sẻ tài nguyên bộ xử lý, nó có thể đưa ra các quyết định lập lịch hiệu quả hơn Ví dụ, giả sử một CPU có hai lõi xử lý và mỗi lõi có hai luồng phần cứng Nếu hai luồng phần mềm đang chạy trên hệ thống này, chúng có thể đang chạy trên cùng một lõi hoặc trên các lõi riêng biệt.Nếu chúng được lập lịch để chạy trên cùng một lõi, chúng sẽ phải chia sẻ tài nguyên bộ xử lý và do đó dẫn tới khả năng thực thi chậm hơn so với việc được lập lịch trên các lõi riêng biệt Nếu hệ điều hành nhận thức được mức độ chia sẻ tài nguyên bộ xử lý, nó có thể lập lịch các luồng phần mềm vào các CPU logic không chia sẻ tài nguyên.

SỰ CÂN BẰNG TẢI

Cân bằng tải là quá trình phân bổ khối lượng công việc một cách đồng đều giữa tất cả các bộ xử lý trong hệ thống SMP (đa xử lý đối xứng) Việc này là cần thiết trong các hệ thống mà mỗi bộ xử lý có hàng đợi quy trình riêng đủ điều kiện thực thi Nếu không có cân bằng tải, một số bộ xử lý có thể không hoạt động trong khi những bộ xử lý khác lại phải xử lý khối lượng công việc lớn, dẫn đến tình trạng lãng phí tài nguyên. Để tận dụng tối đa lợi ích của việc có nhiều bộ xử lý, điều quan trọng là giữ cho khối lượng công việc được phân bổ hợp lý Có hai phương pháp chính để thực hiện cân bằng tải:

 Di chuyển đẩy: Trong phương pháp này, một tác vụ liên tục theo dõi tải trên từng bộ xử lý Khi phát hiện sự mất cân bằng, nó sẽ phân bổ lại khối lượng công việc bằng cách chuyển các tiến trình từ bộ xử lý quá tải sang các bộ xử lý nhàn rỗi hoặc ít bận hơn.

 Di chuyển kéo: Phương pháp này xảy ra khi một bộ xử lý nhàn rỗi chủ động kéo một tác vụ đang chờ từ một bộ xử lý bận để thực thi.

Cả hai phương pháp đều nhằm mục tiêu tối ưu hóa hiệu suất hệ thống bằng cách đảm bảo rằng tất cả các bộ xử lý đều hoạt động hiệu quả và không có bộ xử lý nào bị bỏ phí.

Việc di chuyển bằng phương pháp đẩy và kéo không nhất thiết phải tách biệt, mà thực tế thường được triển khai song song trong các hệ thống cân bằng tải Ví dụ, bộ lập lịch CFS của Linux và bộ lập lịch ULE dành cho hệ thống FreeBSD đều sử dụng cả hai kỹ thuật này.

Khái niệm về "khối lượng công việc cân bằng" có thể có nhiều cách hiểu khác nhau Nhìn nhận một cách đơn giản là khối lượng công việc cân bằng chỉ cần đảm bảo rằng tất cả các hàng đợi có số lượng luồng tương đương nhau Tuy nhiên, cũng có quan điểm cho rằng sự cân bằng cần phải phân phối đồng đều mức độ ưu tiên của các luồng trên tất cả các hàng đợi Hơn nữa, trong một số tình huống cụ thể, cả hai chiến lược này có thể không đủ,thậm chí có thể đi ngược lại với mục tiêu của thuật toán lập lịch.

MỐI QUAN HỆ CỦA BỘ XỬ LÝ

Khi một luồng chạy trên một bộ xử lý cụ thể, dữ liệu mà luồng đó truy cập gần đây sẽ được lưu trong bộ nhớ cache của bộ xử lý đó Dẫn đến các truy cập bộ nhớ tiếp theo của luồng thường được đáp ứng nhanh chóng nhờ vào việc dữ liệu đã có sẵn trong cache, hiện tượng này được gọi là "cache ấm." Tuy nhiên, khi luồng này di chuyển sang một bộ xử lý khác thường là do lý do cân bằng tải thì nội dung của bộ nhớ cache của bộ xử lý đầu tiên sẽ cần phải bị vô hiệu hóa, và bộ nhớ cache của bộ xử lý thứ hai phải được làm đầy lại Do chi phí cao liên quan đến việc vô hiệu hóa và làm đầy lại cache,hầu hết các hệ điều hành hỗ trợ SMP cố gắng tránh việc di chuyển luồng giữa các bộ xử lý Thay vào đó, họ ưu tiên giữ cho một luồng hoạt động trên cùng một bộ xử lý để tận dụng lợi ích từ cache ấm, một khái niệm được gọi là sự gắn bó với bộ xử lý (processor affinity) Điều này giúp tối ưu hóa hiệu suất bằng cách giảm thiểu thời gian truy cập bộ nhớ.

Hai chiến lược chính trong việc tổ chức hàng đợi luồng cho việc lập lịch có tác động đáng kể đến sự gắn bó với bộ xử lý Nếu chúng ta áp dụng phương pháp hàng đợi sẵn chung, một luồng có thể được chọn để thực thi bởi bất kỳ bộ xử lý nào Điều này có nghĩa là nếu một luồng được lập lịch trên một bộ xử lý mới, cache của bộ xử lý đó sẽ cần phải được làm đầy lại Ngược lại, với các hàng đợi sẵn riêng cho từng bộ xử lý, một luồng luôn được lập lịch trên cùng một bộ xử lý và do đó có thể hưởng lợi từ cache ấm.

Sự gắn bó với bộ xử lý có thể xuất hiện dưới nhiều hình thức khác nhau. Khi một hệ điều hành có chính sách cố gắng giữ cho một tiến trình chạy trên cùng một bộ xử lý nhưng không đảm bảo điều này sẽ xảy ra ta sẽ có một tình huống gọi là gắn bó mềm (soft affinity) Trong trường hợp này, hệ điều hành sẽ cố gắng giữ một tiến trình trên một bộ xử lý duy nhất, nhưng vẫn có khả năng cho phép tiến trình di chuyển giữa các bộ xử lý trong quá trình cân bằng tải Trái lại, một số hệ thống cung cấp các lệnh hệ thống hỗ trợ gắn bó cứng (hard affinity), cho phép một tiến trình chỉ định tập hợp các bộ xử lý mà nó có thể chạy Nhiều hệ thống cung cấp cả hai hình thức gắn bó này Ví dụ, Linux thực hiện gắn bó mềm, nhưng cũng cung cấp lệnh hệ thống sched_setaffinity(), cho phép một luồng xác định tập hợp CPU mà nó đủ điều kiện để chạy.

Kiến trúc bộ nhớ chính của hệ thống cũng có thể ảnh hưởng đến các vấn đề liên quan đến sự gắn bó với bộ xử lý Kiến trúc truy cập bộ nhớ không đồng nhất (NUMA) cho phép mỗi bộ xử lý có bộ nhớ cục bộ riêng, giúp cải thiện tốc độ truy cập dữ liệu Nếu hệ thống có bộ lập lịch CPU và thuật toán phân bổ bộ nhớ nhận thức được kiến trúc NUMA và làm việc cùng nhau, thì một luồng đã được lập lịch cho một CPU cụ thể có thể được cấp phát bộ nhớ gần nhất với vị trí của CPU đó, từ đó cung cấp cho luồng này khả năng truy cập bộ nhớ nhanh nhất có thể.

Hình 7 Lập lịch CPU và NUMA

Tuy nhiên, một thách thức lớn là việc cân bằng tải thường làm giảm lợi ích của sự gắn bó với bộ xử lý Cụ thể, lợi ích của việc giữ một luồng chạy trên cùng một bộ xử lý là luồng đó có thể tận dụng dữ liệu có trong bộ nhớ cache của bộ xử lý đó Việc cân bằng tải bằng cách di chuyển luồng từ bộ xử lý này sang bộ xử lý khác sẽ loại bỏ lợi ích này Tương tự, việc di chuyển luồng giữa các bộ xử lý có thể dẫn đến mức độ phạt trên các hệ thốngNUMA, nơi một luồng có thể được chuyển đến một bộ xử lý có thời gian truy cập bộ nhớ lâu hơn Nói cách khác, có một sự căng thẳng tự nhiên giữa việc cân bằng tải và tối thiểu hóa thời gian truy cập bộ nhớ Do đó, các thuật toán lập lịch cho các hệ thống NUMA đa lõi hiện đại đã trở nên khá phức tạp.

ĐA XỬ LÝ KHÔNG ĐỒNG NHẤT

Heterogeneous Multiprocessing – HMP là một khái niệm trong công nghệ máy tính, cho phép các thiết bị tính toán sử dụng đồng thời nhiều bộ vi xử lý (CPU) khác nhau để thực hiện các tác vụ Trong kiến trúc này, các CPU có thể khác biệt về mặt kiến trúc, tốc độ xử lý, mức tiêu thụ năng lượng, hoặc các yếu tố khác Mục tiêu của HMP là tận dụng những ưu điểm riêng biệt của từng loại CPU nhằm cải thiện hiệu suất và hiệu quả năng lượng trong các hệ thống tích hợp. Đối với các bộ xử lý ARM hỗ trợ kiến trúc này, thuật ngữ "big.LITTLE" được sử dụng để chỉ sự kết hợp giữa các lõi lớn có hiệu suất cao với các lõi LITTLE tiết kiệm năng lượng Các lõi lớn tiêu tốn nhiều năng lượng hơn và do đó chỉ nên được kích hoạt trong thời gian ngắn Ngược lại, các lõi nhỏ tiêu tốn ít năng lượng hơn và có thể hoạt động lâu hơn mà không làm giảm hiệu quả.

Phương pháp này mang lại nhiều lợi ích Bằng cách kết hợp các lõi chậm hơn với các lõi nhanh hơn, bộ lập lịch CPU có thể phân công các tác vụ không yêu cầu hiệu suất cao như các tác vụ nền cho các lõi nhỏ, từ đó giúp bảo tồn năng lượng cho pin Đồng thời, những ứng dụng tương tác đòi hỏi sức mạnh xử lý lớn nhưng chỉ chạy trong thời gian ngắn có thể được giao cho các lõi lớn Hơn nữa, khi thiết bị di động ở chế độ tiết kiệm năng lượng, các lõi lớn có thể bị vô hiệu hóa, cho phép hệ thống chỉ dựa vào các lõi nhỏ tiết kiệm năng lượng.Windows 10 hỗ trợ lập lịch HMP bằng cách cho phép một luồng chọn chính sách lập lịch hỗ trợ tốt nhất cho nhu cầu quản lý năng lượng của nó.

LẬP LICH CPU VÀ THỜI GIAN THỰC

GIẢM THIỂU ĐỘ TRỄ

Xét đến bản chất điều khiển theo sự kiện của một hệ thống thời gian thực

Hệ thống thường chờ đợi một sự kiện xảy ra trong thời gian thực Các sự kiện có thể xuất hiện trong phần mềm — như khi bộ đếm thời gian hết hạn — hoặc trong phần cứng — như khi một phương tiện điều khiển từ xa phát hiện nó đang tiến gần đến một vật cản Khi một sự kiện xảy ra, hệ thống phải phản hồi và xử lý nó nhanh nhất có thể Chúng ta gọi độ trễ sự kiện là khoảng thời gian từ khi sự kiện xảy ra cho đến khi nó được xử lý.

Hình 8 Độ trễ sự kiện(Event latency)

Thông thường, các sự kiện khác nhau sẽ có yêu cầu về độ trễ khác nhau Chẳng hạn, hệ thống phanh chống bó cứng (ABS) có yêu cầu độ trễ từ 3 đến 5 mili giây Nghĩa là, từ lúc bánh xe đầu tiên phát hiện bị trượt, hệ thống điều khiển phanh chống bó cứng cần phải phản hồi và kiểm soát tình huống trong khoảng 3 đến 5 mili giây Nếu mất nhiều thời gian hơn để phản hồi, xe có thể mất kiểm soát Ngược lại, một hệ thống nhúng điều khiển radar trong máy bay có thể chấp nhận được khoảng thời gian trễ lên đến vài giây mà vẫn đảm bảo an toàn Điều này cho thấy rằng yêu cầu về độ trễ phụ thuộc vào tính chất và mức độ khẩn cấp của sự kiện cần xử lý.

Có hai loại độ trễ chính ảnh hưởng đến hiệu suất của hệ thống thời gian thực:

1 Độ trễ ngắt (Interrupt Latency): Độ trễ này được tính từ thời điểm xảy ra ngắt đến khi CPU bắt đầu thực hiện quy trình phục vụ ngắt Khi một ngắt xuất hiện, hệ điều hành cần hoàn thành lệnh đang thực thi, xác định loại ngắt, sau đó lưu trạng thái của quy trình hiện tại và cuối cùng thực hiện quy trình dịch vụ ngắt (ISR) Thời gian cần để thực hiện tất cả các bước này tạo thành độ trễ ngắt Để tối ưu hóa hệ thống thời gian thực, đặc biệt là trong các hệ thống thời gian thực cứng, việc giảm thiểu và giới hạn độ trễ ngắt là vô cùng quan trọng.

Hình 9 Độ trễ gián đoạn

Ngoài ra, một yếu tố khác ảnh hưởng đến độ trễ ngắt là khoảng thời gian các ngắt bị tắt trong quá trình cập nhật cấu trúc dữ liệu của nhân (kernel) Để đảm bảo hệ thống thời gian thực hoạt động tốt, thời gian tắt ngắt phải được giảm thiểu càng ngắn càng tốt.

2 Độ trễ phân phối (Dispatch Latency): Đây là thời gian từ khi hệ điều hành quyết định ngừng một tiến trình đang chạy để chuyển sang thực hiện một tiến trình khác Việc đảm bảo các tiến trình thời gian thực có thể truy cập ngay lập tức vào CPU là cực kỳ quan trọng, và do đó, độ trễ phân công cần được tối thiểu hóa Một cách hiệu quả để giảm độ trễ phân công là sử dụng các kernel có khả năng can thiệp ngay lập tức (preemptive kernels), cho phép các quy trình có mức độ ưu tiên cao giành quyền truy cập CPU ngay lập tức Trong hệ thống thời gian thực cứng, độ trễ phân công thường được đo lường bằng vài micro giây.

Hình 10 Sơ đồ cấu tạo trễ gửi

Trong hình trên , chúng ta tóm tắt cấu tạo của độ trễ phân công Giai đoạn mâu thuẫn của độ trễ phân công có hai thành phần:

 Giai đoạn xung đột: Đây là khoảng thời gian để ngắt một tiến trình đang chạy trong kernel và giải phóng các tài nguyên mà nó sử dụng Đặc biệt, các tiến trình có mức ưu tiên thấp cần phải nhanh chóng giải phóng tài nguyên để các tiến trình có mức ưu tiên cao có thể sử dụng ngay lập tức.

 Giai đoạn lập lịch: Sau khi giải quyết xung đột, hệ điều hành sẽ lập lịch cho tiến trình có mức độ ưu tiên cao hơn để nó có thể được thực hiện trên CPU sẵn có.

Hệ thống thời gian thực, đặc biệt là các hệ thống có tính chất dựa trên sự kiện, yêu cầu khả năng phản ứng nhanh chóng đối với các sự kiện phát sinh Để đảm bảo đáp ứng yêu cầu của hệ thống thời gian thực cứng, việc giảm thiểu và kiểm soát chặt chẽ độ trễ ngắt và độ trễ phân công là rất quan trọng Chỉ có như vậy, hệ thống mới có thể đảm bảo hiệu suất tối ưu, đáp ứng đúng thời gian và đảm bảo an toàn trong các ứng dụng khắt khe như phanh ABS hay điều khiển radar trên máy bay.

LẬP LỊCH DỰA TRÊN ƯU TIÊN

Tính năng quan trọng nhất của một hệ điều hành thời gian thực là phản hồi ngay lập tức với một tiến trình thời gian thực ngay khi tiến trình đó cần CPU

Do đó, bộ lập lịch cho một hệ điều hành thời gian thực phải hỗ trợ một thuật toán lập lịch dựa trên ưu tiên với khả năng ngắt Nhớ rằng các thuật toán lập lịch dựa trên ưu tiên gán cho mỗi tiến trình một mức ưu tiên dựa trên tầm quan trọng của nó; các tác vụ quan trọng hơn sẽ được gán mức ưu tiên cao hơn so với những tác vụ ít quan trọng hơn Trong các hệ thống này, các tiến trình thời gian thực thường được gán mức ưu tiên cao nhất Chẳng hạn, Windows phân loại ưu tiên thành 32 cấp độ khác nhau, trong đó các giá trị từ 16 đến 31 được dành riêng cho tiến trình thời gian thực Solaris và Linux cũng áp dụng các cơ chế ưu tiên tương tự.

Hình 11 Tác vụ định kỳ (Periodic task.)

Chẳng hạn, Windows có 32 mức độ ưu tiên khác nhau Các mức độ cao nhất

—giá trị ưu tiên từ 16 đến 31—được dành riêng cho các tiến trình thời gian thực Solaris và Linux cũng có các phương pháp phân loại ưu tiên tương tự.

Lưu ý rằng việc cung cấp một bộ lập lịch dựa trên ưu tiên và có tính chiếm quyền chỉ đảm bảo tính năng thời gian thực mềm Các hệ thống thời gian thực cứng phải đảm bảo thêm rằng các tác vụ thời gian thực sẽ được phục vụ đúng theo các yêu cầu về deadline của chúng, và để làm được điều này cần có các tính năng lập lịch bổ sung Trong phần còn lại của mục này, chúng ta sẽ đề cập đến các thuật toán lập lịch phù hợp cho các hệ thống thời gian thực cứng.

Trước khi đi vào chi tiết các bộ lập lịch cụ thể, chúng ta cần xác định một số đặc điểm của các tiến trình sẽ được lập lịch Đầu tiên, các tiến trình được coi là có tính chu kỳ, nghĩa là chúng cần sử dụng CPU ở các khoảng thời gian không đổi (chu kỳ) Khi một tiến trình chu kỳ đã giành được CPU, nó sẽ có một thời gian xử lý cố định t, một deadline d mà tại đó nó phải được phục vụ bởi CPU, và một chu kỳ p Mối quan hệ giữa thời gian xử lý, deadline và chu kỳ có thể được biểu diễn dưới dạng 0 ≤ t ≤ d ≤ p Tần suất của một tác vụ chu kỳ là 1∕p.

Hình 11 minh họa việc thực thi của một tiến trình chu kỳ theo thời gian Các bộ lập lịch có thể tận dụng các đặc điểm này để gán mức ưu tiên theo yêu cầu về deadline hoặc tần suất của một tiến trình. Điểm khác biệt của hình thức lập lịch này là một tiến trình có thể phải thông báo các yêu cầu deadline của mình cho bộ lập lịch Sau đó, sử dụng một kỹ thuật gọi là thuật toán kiểm soát tiếp nhận (admission-control), bộ lập lịch sẽ thực hiện một trong hai điều sau: hoặc chấp nhận tiến trình, đảm bảo rằng tiến trình sẽ hoàn thành đúng thời hạn, hoặc từ chối yêu cầu nếu không thể đảm bảo rằng tác vụ sẽ được phục vụ trước deadline của nó.

LẬP LỊCH ĐƠN ĐIỆU THEO TẦN SUẤT

Thuật toán lập lịch đơn điệu theo tần suất sắp xếp các tác vụ định kỳ bằng cách sử dụng chính sách ưu tiên tĩnh với khả năng giành quyền điều khiển Nếu một tiến trình có mức ưu tiên thấp hơn đang chạy và một tiến trình có mức ưu tiên cao hơn trở nên sẵn sàng để thực thi, tiến trình có mức ưu tiên cao hơn sẽ giành quyền điều khiển từ tiến trình có mức ưu tiên thấp hơn Khi một tác vụ định kỳ tham gia vào hệ thống, nó sẽ được gán một mức ưu tiên tỉ lệ nghịch với chu kỳ của nó Chu kỳ càng ngắn thì mức ưu tiên càng cao; chu kỳ càng dài thì mức ưu tiên càng thấp Lý do đằng sau chính sách này là gán mức ưu tiên cao hơn cho các tác vụ cần CPU thường xuyên hơn Hơn nữa, lập lịch theo tần suất đơn điệu giả định rằng thời gian xử lý của một tác vụ định kỳ là như nhau cho mỗi lần sử dụng CPU Cụ thể, mỗi lần một tác vụ chiếm quyền sử dụng CPU, thời gian của lần sử dụng CPU đó là như nhau.

Hình 12 Lập lịch các nhiệm vụ khi P2 có ưu tiên cao hơn P1

Thuật toán lập lịch tần suất đơn điệu (rate-monotonic scheduling) gán ưu tiên cao hơn cho tác vụ có chu kỳ ngắn hơn Trong ví dụ, P1 có chu kỳ ngắn hơn, nên được ưu tiên cao hơn P2 Khả năng sử dụng CPU của hai tác vụ là (25/50) + (35/80) = 0.94, tức là 94% Điều này cho thấy CPU vẫn còn 6% thời gian rảnh.

Khi P1 chạy đến thời điểm 25, P2 bắt đầu chạy và đến thời điểm 50 thì bị tạm dừng bởi P1, dù vẫn còn 10 mili giây chưa hoàn thành P1 tiếp tục chạy đến thời điểm 75, và P2 hoàn thành vào thời điểm 85, sau khi thời hạn kết thúc vào thời điểm 80 Điều này cho thấy P2 đã không đáp ứng được thời hạn.

Dù được coi là tối ưu, lập lịch tần suất đơn điệu có giới hạn về khả năng sử dụng CPU, không phải lúc nào cũng đạt tối đa Trong trường hợp tệ nhất, khả năng sử dụng CPU với N tác vụ là N(2^(1/N) - 1) Với một tác vụ, khả năng sử dụng CPU đạt 100%, nhưng giảm xuống khoảng 69% khi số tác vụ tăng lên vô hạn Đối với hai tác vụ, khả năng sử dụng CPU tối đa là 83% Trong ví dụ này, với mức sử dụng CPU là 94%, lập lịch tần suất đơn điệu không đảm bảo đáp ứng được các thời hạn.

LẬP LỊCH EARLIEST DEADLINE FIRST

Lập lịch theo thời hạn sớm nhất trước tiên (EDF) gán các mức ưu tiên một cách động theo deadline Deadline càng sớm thì mức ưu tiên càng cao; deadline càng muộn thì mức ưu tiên càng thấp Theo chính sách EDF, khi một tiến trình có thể chạy được, nó phải thông báo yêu cầu deadline của mình cho hệ thống Các mức ưu tiên có thể cần phải được điều chỉnh để phản ánh deadline của tiến trình mới có thể chạy Lưu ý rằng điều này khác với lập lịch theo tần suất (rate- monotonic), nơi mà các mức ưu tiên được cố định. Để minh họa lập lịch EDF, chúng ta lại lập lịch cho các tiến trình được hiển thị trong Hình 5.23, vốn không đáp ứng được các yêu cầu về deadline khi sử dụng lập lịch theo tần suất (rate-monotonic) Nhớ lại rằng tiến trình P1 có các giá trị p1 = 50 và t1 = 25, trong khi tiến trình P2 có các giá trị p2 = 80 và t2 =

35 Việc lập lịch EDF cho các tiến trình này được thể hiện trong Hình 5.24 Tiến trình P1 có deadline sớm nhất, do đó mức ưu tiên ban đầu của nó cao hơn so với tiến trình P2 Tiến trình P2 bắt đầu chạy sau khi P1 hoàn thành một đoạn xử lý CPU Tuy nhiên, trong khi lập lịch theo tần suất cho phép P1 giành lại CPU từ

Trong ví dụ này, có hai tác vụ, P1 và P2, với chu kỳ lần lượt là p1Pp1 50p1P và p20p2 = 100p20 Thời gian xử lý của P1 là t1 t1 20t1 và của P2 là t25t2 = 35t25 Mỗi tác vụ phải hoàn thành trước khi chu kỳ tiếp theo bắt đầu, và tổng khả năng sử dụng CPU là 75%.

Nếu gán P2 ưu tiên cao hơn P1, P2 sẽ hoàn thành vào thời điểm 35 và P1 sẽ bắt đầu từ thời điểm đó Tuy nhiên, P1 sẽ bỏ lỡ thời hạn của mình vào thời điểm

50 Ngược lại, nếu áp dụng lập lịch tần suất đơn điệu, P1 sẽ có ưu tiên cao hơn vì chu kỳ của nó ngắn hơn, hoàn thành vào thời điểm 20, và P2 sẽ hoàn thành vào thời điểm 75, đáp ứng thời hạn của cả hai tác vụ.

Lập lịch tần suất đơn điệu được coi là tối ưu vì nếu một tập hợp tác vụ không thể được lập lịch bằng thuật toán này, nó cũng sẽ không thể được lập lịch bằng bất kỳ thuật toán nào khác gán ưu tiên tĩnh Cuối cùng, tác vụ P1 với chu kỳ p1Pp1 = 50p1P và thời gian CPU t1%t1 = 25t1% cùng với P2 có p2p2 = 80p2 và t25t2 = 35t25 được xem xét, cho thấy rằng không phải lúc nào cũng có thể lập lịch các tác vụ này hiệu quả.

LẬP LỊCH CHIA SẺ THEO TỈ LỆ

Các bộ lập lịch chia sẻ tỉ lệ hoạt động bằng cách phân bổ T cổ phần (shares) cho tất cả các ứng dụng Một ứng dụng có thể nhận N cổ phần thời gian, đảm bảo rằng ứng dụng đó sẽ có N/T tổng thời gian của bộ xử lý.

Giả sử tổng số T = 100 cổ phần sẽ được chia cho ba tiến trình A, B, và C.

 Tiến trình A được cấp 50 cổ phần,

 Tiến trình B được cấp 15 cổ phần,

 Tiến trình C được cấp 20 cổ phần.

Sơ đồ này đảm bảo rằng:

 Tiến trình A sẽ chiếm 50% tổng thời gian của bộ xử lý,

Các bộ lập lịch chia sẻ tỉ lệ phải làm việc kết hợp với một chính sách kiểm soát nhập cảnh để đảm bảo rằng một ứng dụng nhận được cổ phần thời gian đã được cấp Chính sách kiểm soát nhập cảnh sẽ cho phép một khách hàng yêu cầu một số cổ phần nhất định chỉ khi có đủ cổ phần khả dụng Trong ví dụ hiện tại, chúng ta đã phân bổ 50 + 15 + 20 = 85 cổ phần trong tổng số 100 cổ phần Nếu một tiến trình mới D yêu cầu 30 cổ phần, bộ kiểm soát nhập cảnh sẽ từ chối cho

LẬP LỊCH THỜI GIAN THỰC POSIX

Tiêu chuẩn POSIX cũng cung cấp các mở rộng cho tính toán thời gian thực—POSIX Ở đây, chúng tôi sẽ đề cập đến một số API của POSIX liên quan đến việc lập lịch cho các luồng thời gian thực POSIX xác định hai lớp lập lịch cho các luồng thời gian thực:

 SCHED_FIFO: Lập lịch các luồng theo chính sách "đến trước, phục vụ trước" (first-come, first-served) bằng cách sử dụng hàng đợi FIFO Tuy nhiên, không có việc chia thời gian giữa các luồng có cùng ưu tiên Do đó, luồng thời gian thực có ưu tiên cao nhất ở đầu hàng đợi FIFO sẽ được cấp CPU cho đến khi nó kết thúc hoặc bị chặn.

 SCHED_RR: Sử dụng chính sách vòng (round-robin) Nó tương tự như SCHED_FIFO, nhưng cung cấp việc chia thời gian giữa các luồng có cùng ưu tiên.

POSIX cũng cung cấp một lớp lập lịch bổ sung—SCHED_OTHER—nhưng việc thực hiện nó không được xác định và phụ thuộc vào hệ thống; nó có thể hoạt động khác nhau trên các hệ thống khác nhau.

API POSIX xác định hai hàm sau để lấy và thiết lập chính sách lập lịch:

 pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy)

 pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)

Tham số đầu tiên của cả hai hàm là một con trỏ đến tập hợp các thuộc tính cho luồng Tham số thứ hai là (1) một con trỏ đến một số nguyên sẽ được thiết lập cho chính sách lập lịch hiện tại (đối với hàm pthread_attr_getschedpolicy()) hoặc (2) một giá trị số nguyên (SCHED_FIFO, SCHED_RR hoặc

SCHED_OTHER) cho hàm pthread_attr_setschedpolicy() Cả hai hàm đều trả về giá trị khác không nếu có lỗi xảy ra.

Trong Hình 13, chúng tôi minh họa một chương trình POSIX Pthread sử dụng API này Chương trình này đầu tiên xác định chính sách lập lịch hiện tại và sau đó thiết lập thuật toán lập lịch thành SCHED_FIFO.

Quá trình lập lịch trong Linux đã có một lịch sử đáng chú ý Trước phiên bản 2.5,hạt nhân Linux chạy một biến thể của thuật toán lập lịch UNIX truyền thống.

Tuy nhiên, vì thuật toán này không được thiết kế với hệ thống SMP (Symmetric MultiProcessing) trong tâm trí, nó không hỗ trợ đủ cho các hệ thống có nhiều bộ xử lý Ngoài ra, nó dẫn đến hiệu suất kém cho các hệ thống có một lượng lớn các tiến trình có thể chạy Với phiên bản 2.5 của hạt nhân, lập trình viên đã làm lại lập lịch để bao gồm một thuật toán lập lịch—được biết đến với tên gọi làO(1)—chạy trong thời gian hằng số bất kể số lượng tác vụ trong hệ thống Lập lịch O(1) cũng cung cấp tăng cường hỗ trợ cho các hệ thống SMP, bao gồm sự liên kết với bộ xử lý và cân bằng tải giữa các bộ xử lý Tuy nhiên, trong thực tế,mặc dù lập lịch O(1) mang lại hiệu suất tốt trên các hệ thống SMP, nó dẫn đến thời gian phản hồi kém cho các tiến trình tương tác phổ biến trên nhiều hệ thống máy tính để bàn Trong quá trình phát triển của hạt nhân 2.6, lập lịch đã được xem xét lại và trong phiên bản 2.6.23 của hạt nhân, Completely Fair Scheduler (CFS) trình lập lịch hoàn toàn công bằng đã trở thành thuật toán lập lịch mặc định của Linux.

Hình 13 POSIX real-time scheduling API

Lập lịch trong hệ thống Linux dựa trên scheduling classes ( các lớp lập lịch).Mỗi lớp được gán một ưu tiên cụ thể Bằng cách sử dụng các lớp lập lịch khác nhau, Kernel có thể điều chỉnh các thuật toán lập lịch khác nhau dựa trên nhu cầu của hệ thống và các tiến trình của nó Các tiêu chí lập lịch cho một máy chủLinux, ví dụ, có thể khác so với các thiết bị di động chạy Linux Để quyết định nhiệm vụ nào sẽ chạy tiếp theo, bộ lập lịch chọn nhiệm vụ có ưu tiên cao nhất thuộc vào lớp lập lịch có ưu tiên cao nhất Kernel Linux tiêu biểu thực hiện hai lớp lập lịch: (1) một lớp lập lịch mặc định sử dụng thuật toán lập lịch CFS và (2) một lớp lập lịch thời gian thực Chúng tôi sẽ thảo luận về mỗi lớp lập lịch ở đây. Các lớp lập lịch mới cũng có thể được thêm vào.

Thay vì sử dụng các quy tắc nghiêm ngặt liên kết một giá trị ưu tiên tương đối với độ dài của một lát cắt thời gian, bộ lập lịch CFS gán một tỷ lệ thời gian xử lý CPU cho mỗi tác vụ Tỷ lệ này được tính dựa trên giá trị nice được gán cho mỗi tác vụ Giá trị tốt có giá trị từ -20 đến +19, trong đó giá trị nice số nhỏ hơn chỉ ra một ưu tiên tương đối cao hơn Các tác vụ có giá trị nice thấp h được một tỷ lệ thời gian xử lý CPU cao hơn so với các tác vụ có giá trị nice cao Giá trị nice mặc định là 0 (Thuật ngữ nice xuất phát từ ý tưởng rằng nếu một tác vụ tăng giá trị nice của mình từ, ví dụ, 0 lên +10, nó đang tốt bụng với các tác vụ khác trong hệ thống bằng cách giảm ưu tiên tương đối của mình Nói cách khác, các tiến trình nice sẽ kết thúc sau cùng!) CFS không sử dụng các giá trị rời rạc của lát cắt thời gian và thay vào đó xác định một targeted latency (độ trễ mục tiêu) đó là một khoảng thời gian trong đó mọi tác vụ có thể chạy ít nhất một lần. Các tỷ lệ thời gian CPU được phân bổ từ giá trị độ trễ mục tiêu Ngoài các giá trị mặc định và tối thiểu, độ trễ mục tiêu có thể tăng nếu số lượng các tác vụ hoạt động trong hệ thống tăng lên vượt quá một ngưỡng nhất định.

Bộ lập lịch CFS không trực tiếp gán ưu tiên Thay vào đó, nó ghi lại thời gian mỗi tác vụ đã chạy bằng cách duy trì virtual run time (thời gian chạy ảo) của mỗi tác vụ bằng cách sử dụng biến vruntime cho mỗi tác vụ Thời gian chạy ảo được liên kết với một hệ số phân rã dựa trên ưu tiên của một tác vụ: các tác vụ ưu tiên thấp có tỷ lệ phân rã cao hơn so với các tác vụ ưu tiên cao Đối với các tác vụ ở ưu tiên bình thường (giá trị nice là 0), thời gian chạy ảo là giống như thời gian chạy vật lý thực tế Do đó, nếu một tác vụ với ưu tiên mặc định chạy trong 200 mili giây, thời gian chạy ảo của nó cũng sẽ là 200 mili giây Tuy nhiên, nếu một tác vụ có ưu tiên thấp chạy trong 200 mili giây, thời gian chạy ảo của nó sẽ cao hơn 200 mili giây Tương tự, nếu một tác vụ có ưu tiên cao chạy trong 200 mili giây, thời gian chạy ảo của nó sẽ ít hơn 200 mili giây Để quyết định tác vụ nào sẽ chạy tiếp theo, bộ lập lịch đơn giản chọn tác vụ có giá trị vruntime nhỏ nhất Ngoài ra, một tác vụ có ưu tiên cao hơn khi trở nên khả dụng để chạy có thể ngắt một tác vụ có ưu tiên thấp hơn.

Hãy xem xét bộ lập lịch CFS trong hành động: Giả sử rằng hai tác vụ có cùng giá trị nice Một tác vụ bị ràng buộc bởi I/O và tác vụ khác là bị ràng buộc bởi CPU Thông thường, tác vụ bị ràng buộc bởi I/O chỉ chạy trong thời gian ngắn trước khi chặn thêm I/O, và tác vụ bị ràng buộc bởi CPU sẽ tiêu tốn thời gian của nó mỗi khi có cơ hội chạy trên một bộ xử lý.

Hiện nay, bộ lập lịch CFS trên Linux cung cấp một thuật toán hiệu quả để lựa chọn công việc tiếp theo để chạy Thay vì sử dụng một cấu trúc dữ liệu hàng đợi tiêu chuẩn, mỗi tác vụ có thể chạy được được đặt trong một cây red-black— một cây tìm kiếm nhị phân cân bằng mà khóa được dựa trên giá trị của vruntime Cây này được hiển thị dưới đây.

Khi một tác vụ trở nên có thể chạy, nó sẽ được thêm vào cây Nếu một tác vụ trong cây không thể chạy (ví dụ, nếu nó bị chặn trong khi đợi I/O), nó sẽ được loại bỏ Nói chung, các tác vụ đã được cấp ít thời gian xử lý (có giá trị nhỏ của vruntime) sẽ nằm ở phía bên trái của cây, và các tác vụ đã được cấp nhiều thời gian xử lý sẽ nằm ở phía bên phải Theo các thuộc tính của một cây tìm kiếm nhị phân, nút ở bên trái cùng có giá trị khóa nhỏ nhất, điều này có nghĩa là nó là tác vụ có độ ưu tiên cao nhất cho lập lịch CFS Do cây red-black là cân bằng, điều hướng nó để tìm nút ở bên trái cần yêu cầu các phép toán O(log N) (ở đây N là số lượng nút trong cây) Tuy nhiên, vì lý do hiệu quả, lập lịch Linux lưu giữ giá trị này trong biến rb leftmost, và do đó, việc xác định tác vụ nào sẽ chạy tiếp theo chỉ đòi hỏi việc lấy giá trị đã được lưu giữ.

Dựa trên các giá trị nice của họ, trong đó một giá trị -20 tương ứng với độ ưu tiên 100 và một giá trị nice của +19 tương ứng với 139.

Bộ chỉ số này được hiển thị trong Hình 5.26.

Hình 15 Scheduling priorities on a Linux system

Lập lịch CFS cũng hỗ trợ cân bằng tải, sử dụng một kỹ thuật tinh vi để làm cho tải cân bằng giữa các lõi xử lý nhưng cũng nhận biết về NUMA và giảm thiểu việc di chuyển các luồng CFS xác định tải của mỗi luồng như một kết hợp của độ ưu tiên của luồng và tỷ lệ trung bình của việc sử dụng CPU của nó Do đó, một luồng có độ ưu tiên cao, nhưng chủ yếu là I/O-bound và yêu cầu ít sử dụng CPU, có tải tổng thể thấp, tương tự như tải của một luồng có độ ưu tiên thấp có sử dụng CPU cao Sử dụng đại lượng này, tải của một hàng đợi là tổng của các tải của tất cả các luồng trong hàng đợi, và cân bằng đơn giản là đảm bảo rằng tất cả các hàng đợi có tải gần như giống nhau.

Như được nhấn mạnh trong phần Processor Affinity (Bộ xử lý Affinity), tuy nhiên, di chuyển một luồng có thể dẫn đến một phạt trừ khi truy cập bộ nhớ do buộc phải vô hiệu hóa nội dung bộ nhớ cache hoặc, trên các hệ thống NUMA, phải chịu thời gian truy cập bộ nhớ kéo dài hơn Để giải quyết vấn đề này, Linux xác định một hệ thống phân cấp các miền lập lịch.

ĐÁNH GIÁ THUẬT TOÁN

MÔ HÌNH XÁC ĐỊNH

Một lớp chính của các phương pháp đánh giá là đánh giá phân tích Đánh giá phân tích sử dụng thuật toán đã cho và tải công việc của hệ thống để tạo ra một công thức hoặc con số nhằm đánh giá hiệu suất của thuật toán đối với tải công việc đó

Mô hình xác định (deterministic modeling) là một loại của đánh giá phân tích Phương pháp này sử dụng một tải công việc đã được xác định trước và định nghĩa hiệu suất của mỗi thuật toán cho tải công việc đó Ví dụ, giả sử rằng chúng ta có tải công việc như được hiển thị bên dưới Cả năm tiến trình đều đến vào thời điểm 0, theo thứ tự đã cho, với độ dài của khoảng thời gian CPU (CPU burst) được đưa ra tính bằng mili giây:

Xem xét các thuật toán lập lịch FCFS, SJF và RR (lượng tử = 10 mili giây) cho tập hợp các quy trình này. Đối với thuật toán FCFS, ta sẽ thực hiện các quy trình như sau:

Thời gian chờ là 0 mili giây đối với quy trình P1, 10 mili giây đối với quy trình P2, 39 mili giây đối với quy trình P3, 42 mili giây đối với quy trình P4 và 49 mili giây đối với quy trình P5 Do đó, thời gian chờ trung bình là (0 + 10 + 39 +

Với lập lịch SJF không ưu tiên, ta thực hiện các quy trình như sau:

Thời gian chờ là 10 mili giây đối với quy trình P1, 32 mili giây đối với quy trình P2, 0 mili giây đối với quy trình P3, 3 mili giây đối với quy trình P4 và

20 mili giây đối với quy trình P5 Do đó, thời gian chờ trung bình là (10 + 32 + 0 + 3 + 20) / 5 = 13 mili giây.

Với thuật toán RR, ta thực hiện các quy trình như sau:

Thời gian chờ là 0 mili giây đối với quy trình P1, 32 mili giây đối với quy trình P2, 20 mili giây đối với quy trình P3, 23 mili giây đối với quy trình P4 và 40 mili giây đối với quy trình P5 Do đó, thời gian chờ trung bình là (0 + 32 + 20 +

Trong ví dụ này, chúng ta quan sát thấy rằng thời gian chờ trung bình thu được với thuật toán SJF ít hơn một nửa so với FCFS, trong khi thuật toán RR cho một giá trị trung gian.

Mô hình xác định rất đơn giản và nhanh chóng, cung cấp cho chúng ta dữ liệu chính xác để so sánh các thuật toán Tuy nhiên, mô hình này chỉ phù hợp với các trường hợp mà dữ liệu đầu vào đã biết rõ Mô hình xác định thường được sử dụng để mô tả các thuật toán lập lịch và cung cấp các ví dụ Trong trường hợp có thể đo lường chính xác yêu cầu xử lý của một chương trình lặp đi lặp lại, mô hình xác định có thể được áp dụng để chọn lựa thuật toán lập lịch thích hợp Hơn nữa, qua việc phân tích các ví dụ, mô hình xác định có thể chỉ ra các xu hướng sau đó có thể nghiên cứu sâu hơn Chẳng hạn: có thể khẳng định rằng trong môi trường được mô tả (tất cả các quy trình và thời gian có sẵn tại thời điểm 0), thuật toán SJF sẽ luôn dẫn đến thời gian chờ ngắn nhất.

MÔ HÌNH XẾP HÀNG (HÀNG ĐỢI)

Trên nhiều hệ thống, các tiến trình chạy có thể thay đổi từ ngày này sang ngày khác, do đó không có một tập hợp tiến trình (hoặc thời gian) cố định nào để sử dụng cho mô hình xác định Tuy nhiên, điều có thể xác định được là phân phối của các khoảng thời gian CPU và I/O Những phân phối này có thể được đo lường và sau đó được xấp xỉ hoặc đơn giản là ước tính Kết quả là một công thức toán học mô tả xác suất của một khoảng thời gian CPU cụ thể Thông thường, phân phối này là hàm mũ và được mô tả bằng giá trị trung bình của nó. Tương tự, chúng ta có thể mô tả phân phối thời gian khi các tiến trình đến hệ thống (phân phối thời gian đến) Từ hai phân phối này, có thể tính toán thông lượng trung bình, mức sử dụng, thời gian chờ đợi trung bình, v.v cho hầu hết các thuật toán.

Hệ thống máy tính được mô tả như một mạng lưới các máy chủ Mỗi máy chủ có một hàng đợi của các tiến trình chờ CPU là một máy chủ với hàng đợi sẵn sàng của nó, giống như hệ thống I/O với các hàng đợi thiết bị của nó Biết được các tỷ lệ đến và tỷ lệ phục vụ, chúng ta có thể tính toán mức sử dụng, độ dài hàng đợi trung bình, thời gian chờ trung bình, v.v Lĩnh vực nghiên cứu này được gọi là phân tích mạng hàng đợi.

Ví dụ, giả sử nnn là độ dài hàng đợi trung bình dài hạn (không bao gồm tiến trình đang được phục vụ), WWW là thời gian chờ trung bình trong hàng đợi, và λ›lambdaλ là tỷ lệ đến trung bình cho các tiến trình mới trong hàng đợi (chẳng hạn như ba tiến trình mỗi giây) Chúng ta mong đợi rằng trong thời gian WWW mà một tiến trình chờ, λ×W\lambda \times Wλ×W tiến trình mới sẽ đến trongW›lambda ›times Wλ×W\lambda \times Wλ×W tiến trình mới sẽ đến trongW tiến trình mới sẽ đến trong hàng đợi Nếu hệ thống đang ở trạng thái ổn định, thì số lượng tiến trình rời khỏi hàng đợi phải bằng với số lượng tiến trình đến. n = λ ×W\lambda \times Wλ×W tiến trình mới sẽ đến trong W

Phương trình này, được gọi là công thức Little, rất hữu ích vì nó áp dụng cho bất kỳ thuật toán lập lịch và phân phối đến nào Chẳng hạn, nnn có thể đại diện cho số lượng khách hàng trong một cửa hàng.

Chúng ta có thể sử dụng công thức Little để tính toán một trong ba biến,miễn là chúng ta biết hai biến còn lại Ví dụ, nếu biết rằng trung bình có 7 tiến trình đến mỗi giây và trong hàng đợi thường có 14 tiến trình, thì ta có thể tính thời gian chờ trung bình cho mỗi tiến trình là 2 giây.

Mặc dù phân tích hàng đợi giúp so sánh các thuật toán lập lịch, nhưng nó cũng tồn tại một số hạn chế Hiện tại, các loại thuật toán và phân phối mà có thể được xử lý vẫn còn khá hạn chế Việc toán học phức tạp của các thuật toán và phân phối có thể khiến cho việc phân tích trở nên khó khăn Do đó, các phân phối đến và phục vụ thường được định nghĩa theo cách dễ xử lý về mặt toán học, nhưng không thực tế Thêm vào đó, thường cần phải đưa ra nhiều giả định độc lập, điều này có thể không phản ánh đúng thực tế Vì vậy, các mô hình hàng đợi thường chỉ là những xấp xỉ của các hệ thống thực tế, và độ chính xác của các kết quả được tính toán có thể không hoàn toàn đáng tin cậy.

MÔ PHỎNG

Để có được đánh giá chính xác hơn về các thuật toán lập lịch, chúng ta có thể sử dụng mô phỏng Việc chạy mô phỏng liên quan đến việc lập trình một mô hình của hệ thống máy tính Các cấu trúc dữ liệu phần mềm đại diện cho các thành phần chính của hệ thống Trình mô phỏng có một biến đại diện cho đồng hồ Khi giá trị của biến này tăng lên, trình mô phỏng sẽ thay đổi trạng thái của hệ thống để phản ánh các hoạt động của các thiết bị, các tiến trình và trình lập lịch Khi mô phỏng thực thi, các thống kê chỉ ra hiệu suất của thuật toán được thu thập và in ra.

Dữ liệu để điều khiển mô phỏng có thể được tạo ra theo nhiều cách khác nhau Phương pháp phổ biến nhất sử dụng một bộ sinh số ngẫu nhiên được lập trình để tạo ra các tiến trình, thời gian CPU burst, thời gian đến, thời gian rời khỏi, và các yếu tố khác, theo các phân phối xác suất Các phân phối này có thể được định nghĩa một cách toán học (đồng nhất, hàm mũ, Poisson) hoặc thực nghiệm Nếu một phân phối được định nghĩa một cách thực nghiệm, các phép đo của hệ thống thực tế đang được nghiên cứu sẽ được thực hiện Kết quả này định nghĩa phân phối của các sự kiện trong hệ thống thực tế; phân phối này sau đó có thể được sử dụng để điều khiển mô phỏng.

Mô phỏng dựa trên phân phối có thể dẫn đến những kết quả không chính xác do mối quan hệ giữa các sự kiện liên tiếp trong hệ thống thực tế Phân phối tần suất chỉ cho chúng ta biết số lần mà mỗi sự kiện xảy ra, mà không cho biết thứ tự mà chúng diễn ra Để giải quyết vấn đề này, ta có thể sử dụng các tệp theo dõi (trace files) Những tệp này được tạo ra bằng cách theo dõi hoạt động của hệ thống thực tế và ghi lại chuỗi các sự kiện xảy ra Sau đó, chuỗi này sẽ được sử dụng để điều khiển mô phỏng Tệp theo dõi là một phương pháp tuyệt vời để so sánh hai thuật toán trên cùng một tập hợp đầu vào thực tế, giúp mang lại những kết quả chính xác cho những dữ liệu đó.

Tuy nhiên, mô phỏng có thể tiêu tốn nhiều tài nguyên, thường cần rất nhiều giờ để máy tính thực hiện Mô phỏng càng chi tiết thì kết quả càng chính xác,nhưng điều này cũng có nghĩa là nó sẽ mất nhiều thời gian máy tính hơn Thêm vào đó, các tệp theo dõi có thể yêu cầu một lượng lớn không gian lưu trữ Cuối cùng, thiết kế, lập trình và gỡ lỗi cho trình mô phỏng có thể là một nhiệm vụ chính.

TRIỂN KHAI

Ngay cả mô phỏng cũng có những giới hạn về độ chính xác Cách duy nhất để đánh giá một thuật toán lập lịch một cách hoàn toàn chính xác là triển khai nó, tích hợp vào hệ điều hành và quan sát hiệu suất của nó trong thực tế Phương pháp này đưa thuật toán vào hệ thống thực tế để đánh giá trong điều kiện hoạt động thực tế.

Tuy nhiên, phương pháp này không miễn phí Chi phí phát sinh từ việc lập trình thuật toán và điều chỉnh hệ điều hành để hỗ trợ thuật toán cùng với các cấu trúc dữ liệu cần thiết Ngoài ra, việc kiểm tra những thay đổi này cũng tốn kém, thường được thực hiện trên các máy ảo thay vì phần cứng chuyên dụng Kiểm tra hồi quy cần thiết để đảm bảo rằng những thay đổi không làm mọi thứ tồi tệ hơn và không gây ra lỗi mới hoặc tái xuất hiện các lỗi đã từng có (ví dụ, nếu thuật toán được thay thế đã giải quyết một lỗi, thì thay đổi nó có thể khiến lỗi đó quay lại).

Một thách thức khác là môi trường mà thuật toán hoạt động sẽ thay đổi Môi trường sẽ không chỉ thay đổi theo cách thông thường, khi các chương trình mới được viết và các vấn đề mới xuất hiện, mà còn bị ảnh hưởng bởi hiệu suất của trình lập lịch Nếu các tiến trình ngắn được ưu tiên, người dùng có thể chia nhỏ các tiến trình lớn thành nhiều tiến trình nhỏ hơn Nếu các tiến trình tương tác được ưu tiên hơn các tiến trình không tương tác, người dùng có thể chuyển sang sử dụng tương tác Vấn đề này thường được giải quyết bằng cách sử dụng các công cụ hoặc kịch bản tổng hợp các hành động đầy đủ, sử dụng chúng một cách lặp đi lặp lại và đo lường kết quả (cũng như phát hiện bất kỳ vấn đề nào mà chúng gây ra trong môi trường mới).

Tất nhiên, hành vi của con người hoặc chương trình có thể cố gắng lách luật các thuật toán lập lịch Ví dụ, có một hệ thống được thiết kế để tự động phân loại các tiến trình tương tác và không tương tác bằng cách theo dõi lượng I/O từ thiết bị đầu cuối Nếu một tiến trình không thực hiện bất kỳ thao tác nào với thiết bị đầu cuối trong khoảng thời gian 1 giây, tiến trình đó sẽ được xem là không tương tác và được chuyển vào hàng đợi có ưu tiên thấp hơn Để phản ứng với chính sách này, một lập trình viên đã thay đổi chương trình của mình để ghi một ký tự tùy ý vào thiết bị đầu cuối với các khoảng thời gian dưới 1 giây Kết quả là hệ thống đã cấp ưu tiên cao cho các chương trình của anh ta, mặc dù đầu ra từ thiết bị đầu cuối hoàn toàn không có giá trị

Nói chung, các thuật toán lập lịch linh hoạt thường cho phép các quản trị viên hệ thống hoặc người dùng điều chỉnh chúng để phù hợp với một ứng dụng hoặc một tập hợp ứng dụng cụ thể Một máy trạm chạy các ứng dụng đồ họa cao cấp, chẳng hạn, có thể có nhu cầu lập lịch khác với một máy chủ web hoặc máy chủ tệp Một số hệ điều hành—đặc biệt là nhiều phiên bản của UNIX—cho phép quản trị viên hệ thống tinh chỉnh các tham số lập lịch cho một cấu hình hệ thống nhất định Ví dụ, Solaris cung cấp lệnh dispadmin để cho phép quản trị viên hệ thống điều chỉnh các tham số của các lớp lập lịch được mô tả trong Mục 3.7.2 Một phương pháp khác là sử dụng các API có thể thay đổi độ ưu tiên của một tiến trình hoặc luồng Các API của Java, POSIX và Windows cung cấp các chức năng này Tuy nhiên, nhược điểm của phương pháp này là việc tinh chỉnh hiệu suất cho một hệ thống hoặc ứng dụng thường không dẫn đến cải thiện hiệu suất trong các tình huống tổng quát hơn.

Ngày đăng: 09/11/2024, 06:38

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w