Professional Documents
Culture Documents
BTL CPU Scheduling 2
BTL CPU Scheduling 2
TP.HCM
Khoa Công Nghệ Thông Tin
TIỂU LUẬN
CPU SCHEDULING
Nhóm 11
Lớp: CN22G
SVTH:
i
BÀI TẬP...........................................................................................................................
DANH MỤC TÀI LIỆU THAM KHẢO.......................................................................
ii
DANH MỤC TỪ VIẾT TẮT
iii
LỜI MỞ ĐẦU
Điều phối CPU, hay còn gọi là CPU scheduling, là một trong những
khía cạnh quan trọng của hệ thống máy tính và quản lý tài nguyên tính toán.
Trong thời đại số hóa và sự phát triển không ngừng của CNTT, việc tối ưu
hóa việc sắp xếp và chia sẻ thời gian CPU cho các tiến trình là một việc đầy
thách thức.
Điều phối CPU là một phần quan trọng của hệ điều hành, đóng vai trò
quyết định cách hệ thống phân phối thời gian xử lý CPU cho các tiến trình
hoặc nhiệm vụ khác nhau. Hiệu suất của hệ thống, đáng lẽ có thể được nâng
cao, hoặc giảm sút đột ngột, phục thuộc vào cách điều phối CPU được thực
hiện. Sự hiểu biết và nghiên cứu sâu về điều phối CPU là điều cần thiết để
đảm bảo hệ thống hoạt động hiệu quả, đáng tin cậy và đáp ứng được nhu cầu
ngày càng tăng về tính toán. Trong bài này, chúng ta sẽ khám phá về Thread
Scheduling, Multi-Processor Scheduling, Real-Time CPU Scheduling,
Operating-System Examples, Algorithm Evaluation.
4
5.4 Thread Scheduling
Trong mô hình luồng, có sự phân biệt giữa luồng ở cấp độ người dùng và cấp
độ nhân:
+ Luồng ở cấp độ người dùng (user-level): Được quản lý bởi thư viện
luồng và không được nhân hệ điều hành nhận biết trực tiếp. Để có thể
chạy trên CPU, luồng user-level cuối cùng sẽ được gán với một luồng
kernel-level liên kết, mặc dù phép gán này có thể là gián tiếp và có thể
dùng một LWP (tiến trình nhẹ).
+ Còn ở luồng ở cấp độ nhân (kernel-level): Trong hầu hết các hệ điều
hành hiện nay, luồng kernel-level (không phải tiến trình) được điều
phối trực tiếp bởi hệ điều hành.
5.4.1 Contention Scope
Phạm vi cạnh tranh (Contention Scope): Xác định phạm vi mà các luồng cạnh
tranh cho tài nguyên CPU.
Sự quyết định phạm vi cạnh tranh sẽ ảnh hưởng đến cách điều phối và cạnh
tranh giữa các luồng. Điều này quan trọng trọng việc đảm bảo hiệu xuất và
công bằng trong việc phân bố tài nguyên hệ thống.
5
tạo và quản lý luồng trong hệ điều hành POSIX. Có chức năng: Posix Pthread
API cung cấp các hàm để thiết lập và lấy thông tin về phạm vi cạnh tranh cho
các luồng.
Pthread API cho phép chỉ định PCS hoặc SCS trong quá trình tạo luồng.
Pthreads xác định các giá trị phạm vi tranh chấp sau:
POSIX Pthread API cung cấp hàm IPC để quản lý phạm vi cạnh tranh:
• pthread attr setscope(pthread attr t *attr, int scope) à Hàm thiết lập phạm
vi cạnh tranh.
• pthread attr getscope(pthread attr t *attr, int *scope) à Hàm lấy thông tin
phạm vi cạnh tranh.
*Lưu ý: Trên một vài hệ thống, chỉ có một giá trị phạm vi tranh chấp được
cho phép (Như Linex, MacOS chỉ cho phép PTHREAD_SCOPE_SYSTEM).
Thuật ngữ multiprocessor (đa bộ xử lý) được áp dụng cho các hệ thống cung
cấp nhiều bộ xử lý vật lý, nơi mỗi bộ xử lý chứa một CPU đơn lõi. Tuy nhiên,
định nghĩa của multiprocessor đã tiến hóa đáng kể, và trên các hệ thống tính
toán hiện đại, multiprocessor được áp dụng cho các kiến trúc hệ thống sau:
6
giống nhau – đồng nhất – về chức năng của chúng. Tuy nhiên đối với kiến
trúc hệ thống cuối cùng là một hệ thống mà các bộ xử lý không giống nhau về
khả năng của chúng.
Nhược điểm của cách tiếp cận này là máy chủ chính trở thành một nút thắt cổ
chai tiềm năng => kéo theo hiệu suất hệ thống tổng thể bị giảm.
+ Tất cả các luồng có thể nằm trong một hàng đợi chung (common ready
queue) => Hay còn gọi là Global queue.
Ưu điểm: sử dụng hiệu quả CPU, công bằng với các tiến trình.
Nhược điểm: xảy ra tình huống 1 tiến trình được chọn bởi 2 bộ xử lý khác
nhau, tiến trình có thể bị thất lạc khỏi hàng đợi.
7
+ Mỗi bộ xử lý có thể có hàng đợi riêng của mình với các luồng (per-core
run queues) => Hay còn gọi là Local queue.
Ưu điểm: dễ tổ chức hoàn thiện, sử dụng bộ nhớ cache hiệu quả hơn.
Nhược điểm: một bộ xử lý rảnh rỗi với hàng đợi rỗng trong khi bộ xử lý
khác phải tính toán nhiều hơn.
è Đây cũng là cách tiếp cận phổ biến nhất trên các hệ thống hỗ trợ
SMP.
Để giải quyết nhược điểm của Local queue các thuật toán về cân bằng được
sử dụng để cân đối khối lượng công việc giữa tất cả các bộ xử lý. Hầu như tất
cả các hệ điều hành hiện đại, bao gồm Windows, Linux, MacOS, Androi và
IOS đều hỗ trợ SMP.
Nhược điểm là bộ xử lý đa lõi có thể làm phức tạp các vấn đề điều phối.
8
Khi một bộ xử lý truy cập vào bộ nhớ, nó sẽ dành một khoảng thời gian đáng
kể để chờ dữ liệu có sẵn. Tình trạng này, được gọi là ngừng hoạt động bộ nhớ,
chủ yếu xảy ra do các bộ vi xử lý hiện đại hoạt động với tốc độ nhanh hơn
nhiều so với bộ nhớ. Tuy nhiên, sự cố bộ nhớ cũng có thể xảy ra do lỗi bộ nhớ
đệm (truy cập dữ liệu không có trong bộ nhớ đệm). Hình 5.12 minh họa một
lỗi bộ nhớ. Trong trường hợp này, bộ xử lý có thể dành tới 50 phần trăm thời
gian để chờ dữ liệu có sẵn từ bộ nhớ.
Để khắc phục được tình trạng này, ngày nay các kỹ sư thiết kế phần cứng đã
triển khai các lõi xử lý đa luồng trong đó hai (hoặc nhiều hơn) luồng phần
cứng được gán cho một lõi. Như vậy, nếu một luồng phần cứng bị đình trệ
trong khi chờ đợi bộ nhớ, lõi có thể chuyển sang một luồng khác. Hình 5.13
mô tả một lõi xử lý luồng kép trên đó xen kẽ việc thực thi luồng 0 và luồng 1.
Từ quan điểm hệ điều hành, mỗi luồng phần cứng duy trì trạng thái kiến trúc
của nó, chẳng hạn như con trỏ lệnh và tập thanh ghi, và do đó xuất hiện như
một CPU logic sẵn có để chạy một luồng phần mềm. Kỹ thuật này - được gọi
là đa luồng chip (CMT) - được minh họa trong Hình 5.14. Ở đây, bộ xử lý
chứa bốn lõi điện toán, với mỗi lõi chứa hai luồng phần cứng. Từ quan điểm
của hệ điều hành, có tám CPU logic.
Trong các bộ xử lý Intel sử dụng thuật ngữ Hyper-threading (còn được gọi là
đa luồng đồng thời hoặc SMT).
9
Hình 5.14 Đa luồng chip
Nói chung có hai cách để đa luồng một lõi xử lý:
Coarse-grained:
• Một luồng thực thi trên một lõi cho đến khi xảy ra sự kiện độ trễ dài
như một sự chậm trễ của bộ nhớ.
• Do đó, lõi phải chuyển sang một luồng khác để thực thi. Chi phí
chuyển đổi giữa các luồng là cao, vì ống dẫn lệnh phải được xả trước khi
luồng khác có thể bắt đầu thực thi trên lõi xử lý.
Fine-graine:
10
• Chuyển đổi giữa các luồng ở một mức độ tỷ lệ hạt nhỏ hơn nhiều
thường là ở ranh giới của một lệnh.
Trong thiết kế kiến trúc của các hệ thống fine-grained bao gồm logic cho việc
chuyển đổi giữa các luồng. Một lưu ý quan trọng là tài nguyên của lõi vật lý
(bao gồm cache và đường ống) phải được chia sẻ giữa các luồng phần cứng
của nó, do đó 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. Vì vậy, một bộ xử lý đa luồng, đa lõi thực tế yêu cầu 2 cấp độ điều
phối khác nhau, như được minh họa trong Hình 5.15, mô tả một lõi xử lý hai
luồng.
Trên cấp độ 1, hệ điều hành chọn luồng phần mềm nào để chạy trên mỗi
luồng phần cứng (logical CPU). Đối với cấp độ điều phối này hệ điều hành có
thể chọn bất kỳ thuật toán điều phối nào, bao gồm cả những thuật toán được
mô tả trong Phần 5.3
Trên cấp độ 2, xác định cách mà mỗi lõi quyết định chạy luồng phần cứng
nào. Có một số cách để áp dụng trong tình huống này:
• Sử dụng thuật toán Round-Robin để điều phối cho một luồng phần
cứng đến lõi xử lý. Được áp dụng bởi UltraSPACRC T3.
• Mỗi luồng phần cứng được gán một giá trị khẩn cấp động trong phạm
11
vi từ 0 đến 7, trong đó 0 đại diện cho mức khẩn cấp thấp nhất và 7 đại
diện cho mức khẩn cấp cao nhât. Từ đó, Itanium có thể xác định và so
sánh mức độ khẩn cấp của mỗi luồng từ đó đưa ra quyết định kích hoạt
việc chuyển đổi luồng. Được áp dụng bởi Intel Itanium.
Lưu ý rằng cân bằng tải thường chỉ cần thiết trên các hệ thống mà mỗi bộ xử
lý có hàng đợi riêng của các luồng riêng để thực thi.
Đẩy di chuyển - kiểm tra tác vụ định kỳ tải trên từng bộ xử lý và nếu
được tìm thấy sẽ đẩy tác vụ từ CPU quá tải sang các CPU khác. Với di
chuyển đẩy, một tác vụ cụ thể định kỳ kiểm tra tải trên mỗi bộ xử lý và
nếu phát hiện thấy sự mất cân bằng sẽ phân bổ đều tải bằng cách di
chuyển (hoặc đẩy) các luồng từ bộ xử lý quá tải sang bộ xử lý nhàn rỗi
hoặc ít bận hơn.
12
Sự gắn kết với bộ xử lý cũng có nhiều hình thức khác nhau. Có 2 hình thức:
Sự gắn kết mềm (soft affinit): là khi hệ điều hành sẽ cố gắng giữ một
tiến trình chạy trên cùng một bộ xử lý nhưng không có sự đảm bảo rằng
nó sẽ như vậy.
Sự gắn kết cứng (hard affinit): cho phép một quy trình chỉ định tập con
của các bộ xử lý mà nó có thể chạy trên.
Có nhiều hệ thống cung cấp cả sự gắn kết cứng và mềm. ví dụ, Linux thực
hiện sự gắn kết mềm, nhưng cũng cung cấp cuộc gọi hệ thống
sched_setaffinity(), hỗ trợ sự gắn kết cứng bằng cách cho phép một luồng chỉ
định tập hợp các CPU mà nó có thể thực thi trên.
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 đề về
mối quan hệ của bộ xử lý. Hình 5.16 minh họa một kiến trúc có tính năng truy
cập bộ nhớ không đồng nhất (NUMA) trong đó có hai chip xử lý vật lý, mỗi
chip có CPU và bộ nhớ cục bộ riêng. Mặc dù kết nối hệ thống cho phép tất cả
các CPU trong hệ thống NUMA chia sẻ một không gian địa chỉ vật lý, nhưng
một CPU có quyền truy cập vào bộ nhớ cục bộ của nó nhanh hơn so với bộ
nhớ cục bộ của một CPU khác. Nếu bộ điều phối CPU và thuật toán vị trí bộ
nhớ của hệ điều hành nhận biết NUMA và hoạt động cùng nhau, thì một
luồng đã được điều phối rên một CPU cụ thể có thể được cấp phát bộ nhớ gần
nơi CPU cư trú nhất, do đó cung cấp cho luồng truy cập bộ nhớ nhanh nhất có
thể.
13
Dùng cả local và global queue.
Đối với các bộ xử lý ARM hỗ trợ nó, kiểu kiến trúc này được biết đến là
big.LITTLE nơi các lõi lớn có hiệu suất cao hơn được kết hợp với các lõi
LITTLE tiết kiệm năng lượng. Lõi lớn tiêu thụ năng lượng lớn hơn và do đó
chỉ nên được sử dụng trong thời gian ngắn. Tương tự, các lõi nhỏ sử dụng ít
năng lượng hơn và do đó có thể được sử dụng trong thời gian dài hơn.
Có một số lợi ích với cách tiếp cận này. Bằng cách kết hợp một số lõi chậm
với những lõi nhanh hơn, một bộ điều phối CPU có thể gán các tác vụ không
yêu cầu hiệu suất cao, nhưng có thể cần chạy trong thời gian dài hơn, (như
các tác vụ nền) cho các lõi nhỏ, do đó giúp bảo tồn năng lượng pin. Tương tự,
các ứng dụng tương tác yêu cầu nhiều sức mạnh xử lý hơn, nhưng có thể chạy
trong thời gian ngắn hơn, có thể được gán cho các lõi lớn. Ngoài ra, nếu thiết
bị di động đang ở chế độ tiết kiệm năng lượng, các lõi lớn tiêu thụ năng lượng
có thể bị vô hiệu hóa và hệ thống có thể chỉ dựa vào các lõi nhỏ tiết kiệm
năng lượng. Windows 10 hỗ trợ điều phối HMP bằng cách cho phép một
14
luồng chọn một chính sách điều phối phù hợp nhất với yêu cầu quản lý năng
lượng của nó.
+ Điều phối thời gian thực mềm (Soft real-time systems): không có đảm
bảo nào về thời điểm các nhiệm vụ sẽ được điều phối, chỉ đảm bảo các
nhiệm vụ thời gian thực quan trọng có mức độ ưu tiên cao nhất.
+ Điều phối thời gian thực cứng (Hard real-time systems): Các nhiệm vụ
phải hoàn thành đúng thời hạn, quá trình phải được điều phối trước thời
hạn.
Sơ đồ độ trễ sự kiện
Thông thường các sự kiện khác nhau sẽ có các yêu cầu độ trễ khác nhau.
Ví dụ: Yêu cầu độ trễ hệ thống chống bó cứng phanh (Anti Lock Braking
System – ABS) có thể mất từ 3-5 mili giây.
15
Có 2 loại độ trễ ảnh hưởng đến hiệu suất của hệ thống thời gian thực (real-
time systems):
+ Độ trễ ngắt (Interrupt latency): Thời gian từ khi xuất hiện ngắt đến khi
bắt đầu quy trình mà các dịch vụ làm gián đoạn. Khi một ngắt xảy ra,
trước tiên hệ điều hành phải hoàn thành lệnh mà nó đang thực thi và
xác định loại ngắt đã xảy ra. Sau đó, nó phải lưu trạng thái của tiến
trình hiện tại trước khi sửa chữa ngắt bằng cách sử dụng quy trình dịch
vụ ngắt cụ thể (ISR). Tổng thời gian cần thiết để thực hiện các tác vụ
này là độ trễ ngắt .
+ Độ trễ gửi (Dispatch latency): Thời gian cho lịch trình để ngắt quy trình
hiện tại khỏi CPU và chuyển sang xử lý quy trình khác. Khoảng thời
gian cần thiết để người điều phối điều phối dừng một quá trình và bắt
đầu một quá trình khác gọi là độ trễ gửi. Việc cung cấp các tác vụ thời
gian thực với quyền truy cập ngay vào CPU có nghĩa là hệ điều hành
thời gian thực cũng giảm thiểu độ trễ này. Kỹ thuật hiệu quả nhất để
giữ cho độ trễ gửi thấp là cung cấp các hạt nhân ưu tiên. Đối với các hệ
thống thời gian thực cứng, độ trễ gửi thường được đo bằng vài micro
giây.
Điều quan trọng đối với các hệ điều hành thời gian thực là giảm thiểu độ trễ
liên tục để đảm bảo rằng các tác vụ thời gian thực nhận được sự chú ý ngay
lập tức. Đối với các hệ thống thời gian thực cứng, độ trễ ngắt không chỉ là
được giảm thiểu, mà nó phải được giới hạn để đáp ứng các yêu cầu nghiêm
ngặt của các hệ thống.
16
Sơ đồ của độ trễ gửi đi
5.6.2 Priority-Based Scheduling
Tính năng có tính quan trọng nhất của hệ thời gian thực là đáp ứng ngay lập
tức quy trình thời gian thực ngay khi quy trình đó yêu cầu CPU. Do đó, bộ
điều phối cho hệ điều hành thời gian thực phải hỗ trợ thuật toán dựa trên mức
độ ưu tiên với quyền ưu tiên. Thuật toán điều phối dựa trên mức độ ưu tiên
chỉ định mỗi quá trình một mức độ ưu tiên dựa trên tầm quan trọng của nó;
những nhiệm vụ quan trọng hơn được giao mức độ ưu tiên cao hơn những
nhiệm vụ được coi là ít quan trọng hơn. Nếu bộ điều phối biểu cũng hỗ trợ
quyền ưu tiên, một quá trình hiện đang chạy trên CPU sẽ được ưu tiên nếu
một quá trình có mức độ ưu tiên cao hơn khả dụng để chạy.
Trước khi tiến hành chi tiết về các bộ điều phối riêng lẻ, thì phải xác định các
đặc điểm nhất định của các quá trình sẽ được điều phối. Đầu tiên, các quy
trình được coi là định kỳ (periodic). Nó yêu cầu CPU ở những khoảng thời
gian không đổi (chu kỳ-periods). Khi một quá trình định kỳ đã có được CPU,
nó có thời gian xử lý cố định t, thời hạn d mà nó phải được CPU hỗ trợ và
khoảng thời gian p. Mối quan hệ của thời gian xử lý, thời hạn và khoảng thời
gian có thể được biểu thị bằng 0 ≤ t ≤ d ≤ p. Tỷ lệ (rate) của một nhiệm vụ
tuần hoàn là 1 ∕ p. Người điều phối có thể tận dụng những đặc điểm này và chỉ
định mức độ ưu tiên theo thời hạn hoặc yêu cầu tỷ lệ của quy trình
17
Sơ đồ nhiệm vụ định kỳ
Điều bất thường về hình thức điều phối này là một quy trình có thể phải thông
báo các yêu cầu về thời hạn của nó cho người điều phối. Tiếp đó, bằng cách
sử dụng một kỹ thuật được gọi là thuật toán kiểm soát nhập học (admission-
control), bộ điều phối thực hiện một trong hai việc. Nó hoặc thừa nhận quá
trình, đảm bảo rằng quá trình sẽ hoàn thành đúng thời hạn, hoặc từ chối yêu
cầu là không thể nếu nó không thể đảm bảo rằng nhiệm vụ sẽ được hoàn
thành trước thời hạn của nó.
Việc cung cấp bộ điều phối dựa trên ưu tiên, ưu tiên chỉ đảm bảo chức 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 hơn nữa
rằng các tác vụ thời gian thực sẽ được phục vụ theo yêu cầu thời hạn của
chúng và việc đảm bảo như vậy yêu cầu các tính năng điều phối bổ sung.
Điều quan trọng nhất là các quá trình được coi là định kỳ, tức là quá trình sẽ
tự lặp lại sau một khoảng thời gian cố định. Khoảng thời gian của một quá
trình được ký hiệu là p. Đặc điểm tiếp theo là thời gian xử lý t tức là thời gian
mà tiến trình yêu cầu CPU trong mỗi khoảng thời gian. Nói cách khác thời
gian xử lý đề cập đến thời lượng sử dụng. Đặc điểm cuối cùng là thời hạn d,
tức là thời gian trước khi quy trình phải được hỗ trợ. Nói chung, mối quan hệ
giữa ba đặc điểm này là thực hiện một quá trình tuần hoàn theo thời gian.
18
ngắn, mức độ ưu tiên càng cao; thời gian càng dài, mức độ ưu tiên càng thấp.
Lý do đằng sau chính sách này là chỉ định mức độ ưu tiên cao hơn cho các tác
vụ yêu cầu CPU thường xuyên hơn. Hơn nữa, điều phối đơn điệu tỷ lệ giả
định rằng thời gian xử lý của một tiến trình định kỳ là như nhau đối với mỗi
cụm CPU. Có nghĩa là, mỗi khi một tiến trình lấy được CPU, thời lượng của
CPU nó là như nhau.
Ví dụ: Giả sử có hai tiến trình P1 và P2. Khoảng thời gian cho P1 và P2 là 50
và 100. Thời gian xử lý là t1 = 20 cho P1 và t2 = 35 cho P2. Thời hạn cho mỗi
tiến trình yêu cầu nó phải hoàn thành CPU burst trước khi bắt đầu giai đoạn
tiếp theo.
Mô tả phương thức: Mức độ ưu tiên của P1 cao hơn P2 vì P1 có giá trị nhỏ
hơn trong khoảng thời gian. Do đó, tại thời điểm 0, P1 sẽ bắt đầu thực hiện.
P1 sẽ kết thúc ở 20 và sau đó P2 sẽ bắt đầu thực hiện. Tại thời điểm 50 P1,
tiết thứ hai sẽ bắt đầu. Đồng thời P2 đã hoàn thành 30. Nhưng vì mức độ ưu
tiên của P1 cao hơn, do đó P1 sẽ xếp trước P2 và chạy từ 50-70. P2 hoàn
thành 5 còn lại từ 70-75 nhưng vẫn đáp ứng thời hạn 100. Hệ thống vẫn
không hoạt động cho đến 100, khi khoảng thời gian thứ 3 của P1 và khoảng
thời gian thứ hai của P2 sẽ bắt đầu và P1 sẽ bắt đầu thực hiện tại thời điểm đó.
Phần còn lại của quá trình thực hiện sẽ tuân theo cùng một thứ tự thực hiện
như từ 0-100.
19
5.6.4 Earliest-Deadline-First Scheduling
Điều phối theo thời hạn sớm nhất (Earliest-deadline firs-EDF) nó sẽ chỉ định
mức độ ưu tiên một cách linh hoạt theo thời gian. Thời hạn càng sớm thì mức
độ ưu tiên càng cao hoặc ngược lại. Theo các điều khoản của EDF, khi có một
quy trình trở lên chạy được thì nó phải thông báo các yêu cầu về thời hạn của
nó cho hệ thống. Mức độ ưu tiên có thể phải được điều chỉnh để phản ánh thời
hạn của quy trình mới có thể chạy được. Nó khác với việc lập kế hoạch đơn
điệu theo tỷ lệ, trong đó các ưu tiên được cố định.
Không như thuật toán đơn điệu tốc dộ, việc lập kế hoạc EDF không yêu cầu
các quá trình diễn ra một cách định kỳ và một quá trình cũng không cần yêu
cầu một mượng CPU không đổi cho môi lần sử dụng. Yêu cầu duy nhất là
một quy trình phải thông báo thời hạn của nó tới bộ điều phối khi có thể chạy
được. Sự hấp dẫn của việc lập kế hoạch EDF à nó tối ưu về mặt lý thuyết, nó
có thể lập kế hoạch cho quy trình sao cho mỗi quy trình có thể đáp ứng được
các yêu cầu về thời hạn và việc sử dụng CPU sẽ được 100%. Tuy nhiên, về
thực tế không thể đạt được mức CPU này do việc chuyển đổi ngữ cảnh giữa
các tiến trình và xử lý ngắt.
Những người điều phối cổ phiếu theo tỷ lệ phải làm việc kết hợp với chính
20
sách kiểm soát tiếp nhận để đảm bảo rằng ứng dụng nhận được cổ phiếu được
phân bổ trong thời gian. Chính sách kiểm soát thu nhận sẽ chỉ chấp nhận một
khách hàng yêu cầu một số lượng cổ phiếu cụ thể nếu có đủ cổ phiếu. Trong
ví dụ hiện tại, đã phân bổ 50 + 15 + 20 = 85 cổ phiếu trong tổng số 100 cổ
phiếu. Nếu một quy trình mới D yêu cầu 30 lượt chia sẻ, bộ điều khiển nhập
học sẽ từ chối cho D nhập vào hệ thống.
Một số API POSIX liên quan đến việc điều phối các chuỗi thời gian thực.
POSIX định nghĩa hai lớp điều phối cho các luồng thời gian thực
SCHED RR sử dụng chính sách quay vòng. Nó tương tự như SCHED FIFO
ngoại trừ việc nó cung cấp phân chia thời gian giữa các luồng có mức độ ưu
tiên như nhau. POSIX cung cấp một lớp điều phối bổ sung SCHED OTHER
nhưng việc triển khai nó là không xác định và dành riêng cho hệ thống; nó có
thể hoạt động khác nhau trên các hệ thống khác nhau.
API POSIX chỉ định hai chức năng sau để nhận và thiết lập chính sách điều
phối:
21
5.7 Operating-System Examples
Các chính sách điều phối của các hệ điều hành Linux, Windows và Solaris.
Đáng lưu ý rằng ở đây chúng ta sử dụng thuật ngữ điều phối quy trình một
cách tổng quát. Trên thực tế, chúng ta đang mô tả việc điều phối cho các
luồng hạt nhân trong các hệ thống Solaris và Windows và cho các tác vụ với
điều phối Linux.
Với phiên bản 2.5 của hạt nhân, lập trình viên đã thay đổi toàn bộ lịch trình để
bao gồm một thuật toán điều phối - được biết đến với tên gọi O(1) - chạy
trong thời gian hằng số bất kể số lượng nhiệm vụ trong hệ thống. Lịch trình
O(1) cũng cung cấp hỗ trợ tăng lên cho các hệ thống SMP, bao gồm sự gắn
kết với bộ xử lý và cân bằng tải giữa các bộ xử lý.
+ Lịch trình O(1) cũng cung cấp hỗ trợ tăng lên cho các hệ thống SMP,
bao gồm sự gắn kết với bộ xử lý và cân bằng tải giữa các bộ xử lý.
22
+ Tuy nhiên, trong thực tế, mặc dù lịch trình O(1) mang lại hiệu suất
xuất sắc 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 desktop.
Trong quá trình phát triển của hạt nhân 2.6, lịch trình đã được sửa đổi lại; và
trong phiên bản 2.6.23 của hạt nhân, lịch trình CFS (Completely Fair
Scheduler) trở thành thuật toán điều phối Linux mặc định.
+ Điều phối trong hệ thống Linux dựa trên các lớp điều phối. 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 điều phối khác nhau,
hạt nhân có thể phù hợp với các thuật toán điều phối 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ó.
Để quyết định nhiệm vụ nào sẽ được chạy tiếp theo, điều phối chọn ra nhiệm
vụ có ưu tiên cao nhất thuộc lớp điều phối có ưu tiên cao nhất. Các hạt nhân
Linux tiêu biểu triển khai hai lớp điều phối:
(1) Một lớp điều phối mặc định sử dụng thuật toán điều phối CFS
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 đoạn thời gian, điều phối CFS gán một phần trăm thời gian
xử lý CPU cho mỗi nhiệm vụ
Phần của hạt nhân Windows xử lý điều phối được gọi là bộ phân phối. Một
luồng được chọn để chạy bởi bộ phân phối sẽ chạy cho đến khi nó bị
preempted bởi một luồng có ưu tiên cao hơn, cho đến khi nó kết thúc, cho đến
khi khoảng thời gian của nó kết thúc, hoặc cho đến khi nó gọi một cuộc gọi hệ
thống chặn, như cho I/O.
+ Nếu một luồng thời gian thực có ưu tiên cao hơn trở nên sẵn sàng
trong khi một luồng có ưu tiên thấp hơn đang chạy, luồng có ưu tiên thấp hơn
sẽ bị preempted. Sự preempt này cho phép một luồng thời gian thực truy cập
23
ưu tiên vào CPU khi luồng cần truy cập đó.
Bộ phân phối sử dụng một hệ thống ưu tiên 32 cấp độ để xác định thứ tự thực
thi của luồng. Các ưu tiên được chia thành hai lớp. Lớp biến chứa các luồng
có ưu tiên từ 1 đến 15, và lớp thời gian thực chứa các luồng có ưu tiên từ 16
đến 31. (Cũng có một luồng đang chạy ở ưu tiên 0 được sử dụng cho quản lý
bộ nhớ.) Bộ phân phối sử dụng một hàng đợi cho mỗi ưu tiên điều phối và
duyệt qua tập hợp các hàng đợi từ cao nhất đến thấp nhất cho đến khi nó tìm
thấy một luồng sẵn sàng để chạy. Nếu không tìm thấy luồng sẵn sàng, bộ
phân phối sẽ thực thi một luồng đặc biệt được gọi là idle thread
Có một mối quan hệ giữa các ưu tiên số của hạt nhân Windows và Windows
API. Có một mối quan hệ giữa các ưu tiên số của hạt nhân Windows và
Windows API. Windows API xác định các lớp ưu tiên sau đây mà một tiến
trình có thể thuộc về:
(IDLE_PRIORITY_CLASS)
(BELOW_NORMAL_PRIORITY_CLASS)
(NORMAL_PRIORITY_CLASS)
(ABOVE_NORMAL_PRIORITY_CLASS)
(HIGH_PRIORITY_CLASS)
(REALTIME_PRIORITY_CLASS)lớp ưu ti
Một luồng trong một lớp ưu tiên cụ thể cũng có một ưu tiên tương đối. Các
giá trị cho các ưu tiên tương đối bao gồm:
IDLE
LOWEST
BELOW NORMAL
NORMAL
ABOVE NORMAL
HIGHEST
TIME CRITICAL
Hơn nữa, mỗi luồng có một ưu tiên cơ bản đại diện cho một giá trị trong
phạm vi ưu tiên cho lớp mà luồng thuộc về. Mặc định, ưu tiên cơ bản là giá trị
24
của ưu tiên tương đối NORMAL cho lớp đó. Các ưu tiên cơ bản cho mỗi lớp
ưu tiên được liệt kê như sau:
Khi hết thời gian lượng tử của một luồng, luồng đó sẽ bị gián đoạn. Nếu
luồng đó thuộc lớp ưu tiên biến đổi, ưu tiên của nó sẽ giảm. Tuy nhiên, ưu
tiên không bao giờ được giảm dưới ưu tiên cơ bản. Việc giảm ưu tiên thường
giới hạn việc tiêu thụ CPU của các luồng tính toán.
Khi một luồng biến đổi được giải phóng từ một hoạt động chờ đợi, bộ phân
phối sẽ tăng ưu tiên của nó. Số lượng tăng này phụ thuộc vào những gì mà
luồng đã chờ đợi.
Khi một người dùng đang chạy một chương trình tương tác, hệ thống cần
cung cấp hiệu suất đặc biệt tốt. Vì lý do này, Windows có một quy tắc điều
phối đặc biệt cho các quy trình thuộc lớp ưu tiên NORMAL.
Windows phân biệt giữa quy trình nền hiện đang được chọn trên màn hình và
các quy trình nền không được chọn hiện tại. Khi một quy trình chuyển vào
nền, Windows tăng lượng tử điều phối bằng một hệ số nào đó - thường là
bằng 3. Sự tăng này cho phép quy trình nền chạy dài hơn ba lần trước khi xảy
ra sự gián đoạn thời gian chia sẻ.
25
2. Interactive (IA)
4. System (SYS)
Trong mỗi lớp, có các ưu tiên và các thuật toán điều phối khác nhau.
Lớp điều phối mặc định cho một quy trình là chia sẻ thời gian. Chính sách
điều phối cho lớp chia sẻ thời gian điều chỉnh độ ưu tiên động và gán các
đoạn thời gian có độ dài khác nhau bằng cách sử dụng một hàng đợi phản hồi
đa cấp.
Theo mặc định, có một mối quan hệ nghịch đảo giữa độ ưu tiên và các đoạn
thời gian. Độ ưu tiên càng cao, đoạn thời gian càng nhỏ; và độ ưu tiên càng
thấp, đoạn thời gian càng lớn. Các quy trình tương tác thường có độ ưu tiên
cao hơn; các quy trình ràng buộc CPU có độ ưu tiên thấp hơn.
Chính sách điều phối này mang lại thời gian phản hồi tốt cho các quy trình
tương tác và hiệu suất tốt cho các quy trình ràng buộc CPU. Lớp tương tác sử
dụng cùng một chính sách điều phối như lớp chia sẻ thời gian, nhưng nó cung
cấp ưu tiên cao hơn cho các ứng dụng cửa sổ - như những ứng dụng được tạo
ra bởi các quản lý cửa sổ KDE hoặc GNOME - để cải thiện hiệu suất.
First-Come, First-Served (FCFS): Tiến trình đến trước được phục vụ trước.
Đây là thuật toán đơn giản nhất nhưng có thể dẫn đến hiệu quả thấp nếu có
tiến trình dài cần chờ đợi.
Shortest Job First (SJF): Tiến trình có thời gian thực thi ngắn nhất được ưu
tiên điều phối trước. Điều này giúp giảm thời gian chờ đợi trung bình.
Shortest Remaining Time First (SRTF): Một biến thể của SJF, nơi thời gian
thực thi còn lại nhỏ nhất được ưu tiên thay vì thời gian thực thi dự kiến ban
đầu.
26
Round Robin (RR): Mỗi tiến trình được phục vụ trong một khoảng thời gian
cố định được gọi là quantum (lượng tử). Nếu một tiến trình không hoàn thành
trong quantum đó, nó được đưa ra sau đó trong hàng đợi.
Tại sao phải đánh giá thuật toán ?
Giúp xác định các tiêu chí được sử dụng để lựa chọn một thuật toán. Tiêu chí
có thể gồm :
- Tối đa hóa việc sử dụng CPU theo rang buộc rằng mức thời gian phản
hồi tối đa là 1 giây.
- Tối đa hóa thông lượng sao cho thời gian hoàn thành trung bình tỷ lệ
tuyến tính với tổng thời gian thực hiện.
5.8.1 Deterministic Modeling
Đánh giá phân tích (sử dụng thuật toán đã cho và khối lượng công việc của
hệ thống để tạo ra một công thức hoặc thông số đánh giá hiệu suất của thuật
toán)
Mô hình xác định thuộc loại đánh giá phân tích. Phương pháp này nhận một
khối lượng công việc xác định trước cụ thể và xác định hiệu suất của từng
thuật toán cho khối lượng công việc đó
Ví dụ: giả sử rằng có khối lượng công việc như bên dưới, tất cả năm tiến trình
đều đến tại thời điểm 0, theo thứ tự đã cho, với chu kỳ thực hiện tính bằng
mili giây
Đối với mỗi thuật toán, tính thời gian chờ đợi trung bình tối thiểu:
27
SJF (Shortest Job First ) không trưng dụng: 13 ms
RR (Round Robin): 23 ms
Trong mô hình hàng đợi CPU, các tiến trình được đặt vào hàng đợi theo thứ
tự đến và phục vụ, tương tự như cách một hàng đợi hoạt động trong cuộc sống
hàng ngày. Các mô hình hàng đợi có thể mô tả các yếu tố như thời gian chờ
đợi, thời gian phản hồi, và sự sử dụng của CPU.
Các yếu tố quan trọng trong mô hình hàng đợi CPU bao gồm:
Tỷ lệ đến (Arrival Rate): Số lượng tiến trình đến hệ thống trong một đơn vị
thời gian.
Tỷ lệ phục vụ (Service Rate): Tốc độ mà CPU có thể xử lý các tiến trình
trong một đơn vị thời gian.
Số lượng CPU: Số lượng CPU có sẵn để xử lý tiến trình. Một số mô hình
cũng có thể xem xét việc có nhiều hơn một CPU (multi-core systems).
Hàng đợi: Cơ chế lưu trữ các tiến trình đang chờ đợi để được thực thi bởi
CPU. Các thuật toán điều phối sẽ quyết định tiến trình nào sẽ được lựa chọn từ
hàng đợi để thực thi tiếp theo.
28
Little’s Formula - ở trạng thái ổn định, các tiến trình rời hàng đợi = các tiến
trình đến
công thức : n = λ x W
Trong đó :
Ví dụ: nếu trung bình có 7 tiến trình đến mỗi giây và thông thường có 14 tiến
trình trong hàng đợi, thì thời gian chờ trung bình cho mỗi tiến trình bằng 2
giây.
5.8.3 Simulations
Xây dựng một mô hình máy tính chạy thuật toán và giả lập quá trình điều
phối và thực thi các tiến trình. Điều này cho phép đánh giá hiệu suất của thuật
toán trong một môi trường điều kiện thực tế
Dữ liệu để điều khiển mô phỏng có thể được tạo ra bằng nhiều cách. 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, sự xuất hiện, sự ra đi, và những điều
tương tự, theo các phân phối xác suất
Mô phỏng có thể tốn kém, thường đòi hỏi nhiều giờ máy tính. Một mô phỏng
chi tiết hơn cung cấp kết quả chính xác hơn, nhưng nó cũng tốn nhiều thời
gian hơn của máy tính.
5.8.4 Implementation
Viết mã và triển khai nó trong hệ thống điều hành, sau đó quan sát cách nó
hoạt động trong điều kiện hoạt động thực tế. Phương pháp này đặt thuật toán
thực tế vào hệ thống thực sự để đánh giá dưới các điều kiện vận hành thực tế.
29
KẾT LUẬN
FCFS là thuật toán điều phối đơn giản nhất, nhưng có thể khiến các tiến trình
ngắn phải chờ các tiến trình rất dài
SJF là thuật toán tối ưu nhất có thể, có thời gian chờ đợi trung bình ngắn nhất,
tuy nhiên việc triển khai thuật toán SJF là rất khó vì khó điều chỉnh độ dài của
chu kỳ thực hiện CPU tiếp theo.
Điều phối theo vòng (RR) thích hợp hơn cho việc chia sẻ thời gian hệ thống.
RR phân bổ CPU cho tiến trình đầu tiên ở trạng thái sẵn sàng xếp hàng cho q
đơn vị thời gian, trong đó q là lượng tử thời gian.
Nhiều hệ thống máy tính hiện đại hỗ trợ nhiều bộ xử lý và cho phép mỗi bộ
xử lý tự điều phối một cách độc lập. Thông thường, mỗi bộ xử lý duy trì hàng
đợi tiến trình (hoặc luồng) riêng tư của riêng nó, tất cả đều có sẵn để chạy.
30
MIND MAP
31
BÀI TẬP
1. Một thuật toán điều phối CPU xác định một thứ tự cho việc thực thi
các quy trình đã được điều phối của nó. Cho n quy trình cần được điều
phối trên một bộ xử lý, có bao nhiêu lịch trình khác nhau có thể có? Hãy
cung cấp một công thức dựa trên n.
Đáp án:
n! (n factorial = n × n – 1 × n – 2 × ... × 2 × 1).
2. Giải thích sự khác biệt giữa điều phối chủ động và điều phối không chủ
động.
Đáp án:
Điều phối chủ động cho phép một quy trình bị gián đoạn giữa quá trình thực
thi của nó, lấy CPU đi và cấp nó cho một quy trình khác. Điều phối không
chủ động đảm bảo rằng một quy trình chỉ từ bỏ kiểm soát của CPU khi nó
hoàn thành với chuỗi thời gian CPU hiện tại của nó.
3. Giả sử các quy trình sau đây đến để thực thi vào các thời điểm được
chỉ ra. Mỗi quy trình sẽ chạy trong thời gian được liệt kê. Trong việc trả
lời các câu hỏi, sử dụng điều phối không chủ động và dựa trên tất cả
thông tin bạn có tại thời điểm quyết định phải được thực hiện.
a. Trong thuật toán điều phối FCFS, thời gian trung bình để hoàn thành
cho các quy trình này là bao nhiêu?
b. Trong thuật toán điều phối SJF, thời gian trung bình để hoàn thành cho
các quy trình này là bao nhiêu?
c. Thuật toán SJF được cho là cải thiện hiệu suất, nhưng hãy chú ý rằng
chúng tôi đã chọn để chạy quy trình P1 vào thời điểm 0 vì chúng tôi không
biết rằng hai quy trình ngắn hơn sẽ đến sớm. Tính toán thời gian trung
32
bình hoàn thành sẽ là bao nhiêu nếu CPU được để trống trong thời gian
đó?
Đáp án:
a. Biểu đồ Gantt:
P1 P2 P3
0 8 12
13
Time turnaround:
P1=8-0=8 ms
P2=12-0.4=11.6 ms
P3=13-1=12 ms
=> Time average Turnaround = (8+11.6+12)/3=10.53 ms
b. Biểu đồ Gantt:
P1 P3 P2
0 8 9
13
Time Turnaround:
P1=8-0=8 ms
P2=9-1=8 ms
P=13-0.4=12.6 ms
=>Time average Turnaround = (8+8+12.6)/3=9.53ms
c. Biểu đồ Gantt:
P3 P2 P1
33
1 2 6
14
Time Turnaround:
P1=14-0=14 ms
P2=6-0.4=5.6 ms
P3=2-1=1 ms
4. Sử dụng thuật toán điều phối của Windows, xác định ưu tiên số của
mỗi luồng sau đây:
a. Một luồng trong REALTIME PRIORITY CLASS với ưu tiên tương đối là
HIGHEST
b. Một luồng trong NORMAL PRIORITY CLASS với ưu tiên tương đối là
NORMAL
c. Một luồng trong HIGH PRIORITY CLASS với ưu tiên tương đối là
ABOVE NORMAL
Đáp án:
a. 26
b. 8
c. 14
Đáp án:
34
HIGH PRIORITY CLASS và HIGH PRIORITY trong lớp đó. (ưu tiên số là
15)
6. Xem xét thuật toán điều phối trong hệ điều hành Solaris cho các luồng
time-sharing
a. Thời lượng lượng tử (tính bằng mili giây) cho một luồng có độ ưu tiên 10 là
bao nhiêu? Với độ ưu tiên 55?
b. Giả sử một luồng có độ ưu tiên 35 đã sử dụng hết thời lượng lượng tử của
mình mà không bị chặn. Hệ thống sẽ gán độ ưu tiên mới cho luồng này là gì?
c. Giả sử một luồng có độ ưu tiên 35 bị chặn I/O trước khi thời lượng lượng
tử của nó kết thúc. Hệ thống sẽ gán độ ưu tiên mới cho luồng này là gì?
Đáp án:
a. 160 and 40
b. 35
c. 54
7. Trong một hệ thống SMP, việc sử dụng một hàng đợi sẵn sàng chung
cho tất cả các CPU có thể dẫn đến vấn đề về hiệu suất?
Đáp án:
Khi nhiều CPU cố gắng truy cập các CPU phải đợi nhau, làm giảm
hiệu quả tổng thể.
Trong hệ thống SMP, bộ nhớ chính thường được chia sẻ giữa các CPU.
CPU gặp phải độ trễ nếu dữ liệu của hàng đợi nằm trên bộ nhớ của một
CPU khác làm chậm quá trình tìm nạp và cập nhật hàng đợi.
8. Giả sử một hệ thống SMP có các hàng đợi chạy riêng cho từng bộ xử
lý. Khi một tiến trình mới được tạo, nó có thể được đặt vào cùng hàng
đợi với tiến trình cha hoặc một hàng đợi riêng biệt. Lợi ích của từng
trường hợp?
Đáp án:
35
Lợi ích của việc đặt tiến trình mới vào cùng hàng đợi với tiến trình cha:
Tiến trình con có thể tận dụng bộ nhớ cache của bộ xử lý đang chạy
tiến trình cha hiệu suất thực thi có thể được cải thiện đáng kể.
Lợi ích của việc đặt tiến trình mới vào một hàng đợi khác:
Việc đặt tiến trình con vào một hàng đợi khác trên một bộ xử lý nhàn
rỗi có thể giúp cải thiện hiệu suất tổng thể của hệ thống.
Trong một số trường hợp, việc tách biệt các tiến trình theo loại bằng
cách đặt chúng vào các hàng đợi khác nhau có thể cải thiện khả năng
đáp ứng của hệ thống
9. Khi một luồng (thread) bị chặn chờ I/O mạng và giờ đây đã sẵn sàng
chạy trở lại, thuật toán điều phối có nhận thức NUMA (Non-Uniform
Memory Access - Truy cập bộ nhớ không đồng nhất) nên điều phối lại
luồng đó trên cùng một CPU mà nó đã chạy trước đó. Vì sao?
Đáp án:
Bằng cách chạy lại luồng trên cùng một CPU, luồng có thể tận dụng lợi
thế của dữ liệu được lưu trong cache, dẫn đến hiệu suất cao hơn do
tránh được độ trễ truy cập bộ nhớ chính chậm hơn.
36
DANH MỤC TÀI LIỆU THAM KHẢO
1. https://cs.lth.se/fileadmin/cs/EDAF35/lectures/2020/
EDAF35_5A_2020.pdf
2. https://os.ecci.ucr.ac.cr/slides/Abraham-Silberschatz-Operating-
System-Concepts-10th-2018.pdf (217-249).
3. https://www.studocu.com/vn/document/truong-dai-hoc-bach-khoa-ha-
noi/he-dieu-hanh/nlhdh-bao-cao-chuong-6-cpu-scheduling-doc-va-tom-
tat-tu-tai-lieu-operating-systems-concepts/28424494
4. https://www.studocu.com/vn/document/truong-dai-hoc-cong-nghe-
thong-tin-dai-hoc-quoc-gia-thanh-pho-ho-chi-minh/operating-system/
chapter-5-slides-cpu-scheduling/21027321
5. https://daynhauhoc.com/t/thac-mac-posix-la-gi/41170
37