Giáo trình Hệ điều hành - Chương 2: Tiến trình

CHƯƠNG 2.  
TIN TRÌNH  
2.0. Quan niệm về tiến trình  
Trước đây tuỳ từng thời điểm, máy tính được xác định một nhiệm vụ chính; tất  
cả các chương trình được lại thành gói (paket) và được gởi đi liên tục. Điều đó  
được gọi xử đóng gói (pile processing) hay quản lý lô (batch manager). Ngày  
nay, không chỉ một chương trình chạy trên máy tính, mà nhiều chương trình  
cùng thực hiện (multi-tasking). Cũng như thế, không chỉ một người sử dụng  
làm việc, nhiều người sử dụng cùng làm việc (multi- user). Để hạn chế sự  
tranh chấp giữa chúng ở việc dùng máy tính, do đó sự phân bổ các phương tiện  
điều hành phải được điều chỉnh trên chương trình.  
Ngoài ra, điều đó còn tiết kiệm thời gian chạy máy và giảm đáng kể thời gian  
thao tác. Thí dụ, người ta có thể điều chỉnh sự phân chia bộ vi xử lý chính (Central  
Processing Unit- CPU) cho việc biểu thị Text song song với việc xử lý Text, điều  
đó cho thấy rằng, CPU đã trợ giúp việc xử lý Text trong thời gian máy in in ký tự.  
Nếu điều đó hoàn thiện thì bộ vi xử đẩy một tự mới cho máy in và tiếp tục  
việc xử lý Text.  
Thêm vào đó, chương trình phải được lưu trữ khi cần thiết sử dụng phương tiện  
điều hành nào: không gian nhớ, thế hệ CPU, dùng lượng CPU… Từ đó, ta hiểu,  
tiến trình là thông tin trạng thái của các phương tiện điều hành đối với một  
chương trình (thường gọi một Job).  
Hình 2.1 minh họa điều trên đây:  
Tiến trình  
Daten  
Thanh ghi  
CPU  
Thanh ghi  
NMU  
Programm  
Stack  
luật truy cập  
thông tin file  
Kernel-stack  
ngữ cảnh tiến trình  
Hình 2.1. Sự cấu thành các dữ liệu tiến trình  
Một tiến trình này có thể sinh ra một tiến trình khác, khi đó người ta gọi tiến  
trình đầu tiến trình cha, còn tiến trình được sinh ra là tiến trình con.  
Một hệ thống đa chương trình (multi-programming system) cho phép thực hiện  
đồng thời nhiều chương trình và nhiều tiến trình. Một chương trình (gọi một job  
) cũng thể tự phát sinh ra nhiều tiến trình.  
Thí dụ về hệ điều hành UNIX:  
Các chương trình hệ thống của Unix được gọi nền tảng, tổng hợp các giải  
pháp đồng bộ và thích ứng thuận tiện. Sự độc lập của các tiến trình và kể cả các  
chương trình của hệ điều hành Unix cho phép khởi động đồng thời nhiều công  
việc.Thí dụ, chương trình pr hình thành Text1, chương trình lpr biểu diễn Text2  
thì người ta có thể kết nối thành chương trình cat bằng dòng lệnh sau:  
cat Text1 Text2 | pr | lpr  
Ở đây, bộ thông dịch, người ta sẽ chuyển lệnh cho nó, khởi động ba  
chương trình với tư cách là ba tiến trình riêng lẻ, ở đây tự “|” tạo ra một sự  
thay đổi cho việc xuất ra một chương trình thành việc nhập vào một chương trình  
khác. Nếu trong hệ thống nhiều bộ vi xử lý, do đó, mỗi bộ vi xử lý có thể được  
sắp xếp theo một tiến trình, và quả vậy, sự điều hành được tiến hành song song.  
Ngoài ra, cũng có khi một bộ vi xử chỉ thực hiện một phần tiến trình và dẫn tới  
bộ tiếp theo.  
Ở hệ thống đơn vi xử lý thì luôn chỉ có 1 tiến trình thực hiện, những tiến trình  
khác được giữ lại chờ đợi. Điều này sẽ được khảo sát các phần dưới.  
2.1 Các trạng thái tiến trình  
Kế tiếp trạng thái hoạt động (running) đối với một tiến trình đang diễn ra,  
chúng ta phải xem xét những tiến trình khác chờ đợi ở đâu. Đối với một trong  
nhiều khả năng biến cố, nó có một hàng đợi riêng, mà trong đó các tiến trình được  
phân loại.  
Một tiến trình bị hãm phải chờ đợi, để:  
+ đón nhận một bộ vi xử hoạt động, lúc đó ta có trạng thái sẵn sang  
(ready),  
+ đón nhận một thông tin (massage) của một tiến trình khác,  
+ đón nhận tín hiệu của một bộ chỉ thị thời gian (timer),  
+ đón nhận những dữ liệu của một thiết bị xuất nhập.  
Thực ra, trạng thái sẵn sang rất đặc biệt: tất cả các tiến trình nhận được các  
thay đổi được giải hãm, tiếp đến, đầu tiên chúng được chuyển dịch vào trong  
danh sách sẵn sàng và sau đó, chúng đón nhận bộ vi xử trong dãy tuần tự.Các  
trạng thái và sự quá độ của chúng được sơ đồ hoá trên hình 2.2  
Nhaän CPU  
running  
ready  
Rs  
CPU  
Rs  
CPU  
Traû CPU  
blocked  
Chôø R  
Nhaän R  
Rs  
CPU  
Hình 2.2.Các trạng thái tiến trình  
Ở đây, chúng ta còn quan tâm tới điều, rằng các chương trình và các tiến trình  
thì không tồn tại vĩnh viễn, mà chúng có thể được sinh ra và kết thúc bất kỳ khi  
nào. Do đó, từ các lý do bảo vệ, các tiến trình không tự quản được, mà chúng  
được thuyên chuyển từ một chức năng đặc biệt của một hệ điều hành cho bộ định  
giờ, hay thuyên chuyển từ một trạng thái này thành một trạng thái liền kề. Việc  
chuyển đổi của các tín hiệu, việc lưu trữ các dữ liệu tiến trình và việc sắp xếp  
thành các hàng đợi được một chức năng trung tâm hoàn thiện, các chức năng này  
người sử dụng không trực tiếp điều khiển. Bởi vậy, qua việc gọi hệ điều hành thì  
những mong muốn của các tiến trình được khai báo, mà những cái đó trong khuôn  
khổ của việc quản lý các phương tiện điều hành của bộ định thời phù hợp với sự  
quan tâm đối với người sử dụng khác.  
Tất cả các trạng thái chứa đựng một hay nhiều danh sách. Các tiến trình ứng  
với một trạng thái thì được đưa vào danh sách đó. Điều đã rõ, rằng một tiến trình  
thể được luôn luôn chứa đựng chỉ trong một danh sách.  
Trong sự khác nhau với mã máy, những dữ liệu trạng thái của phần cứng (CP,  
FPU, MNU), mà với các tiến trình làm việc, chúng được biểu thị văn cảnh tiến  
trình (stask context), xem hình 2.1. Ở một tiến trình hãm, phần dữ liệu chứa đựng  
trạng thái sau cùng của CPU thì nó như một bản sao của CPU có thể được biểu thị  
nột vi xử ảo phải được nạp mới nhờ sự chuyển đổi tới một tiến trình khác  
cũng như chuyển đổi văn cảnh (context switch).  
Những hệ điều hành khác nhau sẽ thu hẹp chỉ số các biến cố và thu hẹp số  
lượng cũng như kiểu hàng đợi. Điều đó cũng được phân biệt, rằng những giao thức  
nào chúng dự định cho việc bắt đầu kết thúc của bộ vi xử cũng như việc phân  
chia và sắp xếp danh sách chờ. Ở đây, người ta còn phân biệt giữa việc đặt kế  
hoạch phân bổ các phương tiện điều hành (scheduling) và việc phân bổ trên thực  
tế (dispatching).  
2.1.1. Thí dụ về Unix  
Trong hệ điều hành Unix có sáu trạng thái khác nhau. Có ba trạng thái đã nhắc  
tới ở trên. Đó trạng thái running(SRUN), trạng thái blocked (SSLEEP) và trạng  
thái ready (SWAIT). Trạng thái tiếp theo là trạng thái stopped (SSTOP), mà một  
cái gì đó phù hợp với sự chờ đợi của các tiến trình cha ở việc tìm lỗi (tracing anh  
debugging).  
bị hãm  
Đón nhận tín hiệu  
Không  
tồn tại  
chờ đợi tín hiệu  
Phát sinh  
Phân bổ  
Lý  
tưởng  
sẵn  
sàng  
hoạt  
động  
zombi  
kết thúc  
tiếp tục thực hiện  
chờ đợi tiến trình cha  
dừng  
Không  
tồn tại  
++++++++++++++++++++  
Hình 2.3.Những trạng thái tiến trình và sự quá độ ở Unix.  
Ngoài ra còn tồn tại những trạng thái trung gian phụ như trạng thái idle (SIDL)  
trạng thái zombie (SZOMB), mà chúng xuất hiện bởi việc sinh ra và kết thúc  
của một tiến trình. Sự quá độ trạng thái có những hình thái như trong hình vẽ 2.3 ở  
trên.  
Sự quá độ của một trạng thái tới một trạng thái kế tiếp đạt được qua sự thăm dò  
gọi hệ thống. Thí dụ, nếu một tiến trình gọi hàm fork(), do đó một bản sao một  
tiến trình được lôi ra và đem treo vào danh sách sẵn sàng. Với điều đó, bây giờ ta  
có hai tiến trình đồng nhất, cả hai trở lại từ việc gọi hàm fork(). Sự khác nhau  
giữa hai tiến trình là ở chỗ giá trị trả lại của hàm: tiến trình cha đón nhận chỉ số  
tiến trình (PID) của con; khi PID = 0 thì nó nhận ra rằng, đó tiến trình con và nó  
thể hiện sự diễn biến tiếp tục của chương trình qua lần gọi hệ thống khác. Đối với  
các chương trình thực thi (execute) có thể nhận thấy rằng, chương trình chạy sẽ  
quá tải bởi chương trình. Tất cả các thiết bị hiển thị và các biến số được kích  
thích (thí dụ sử dụng bộ đếm địa chỉ gọi hệ thống của chương trình) và tiến trình  
hoàn tất được treo vào danh sách sẵn sang. Ở hiệu quả cuối cùng của tiến trình cha  
thì một chương trình hoàn toàn mới được khởi động.  
Tiến trình cha có khả năng chờ đợi hàm gọi hệ thống exit() và chờ đợi sự  
kết thúc của tiến trình con với hàm waitpid(PID). Trong hình 2.4 chỉ ra quá trình  
phát sinh một tiến trình như vậy.  
Người ta quan tâm rằng, tiến trình con đạt được hàm gọi hệ thống exit() như  
nói trên chỉ khi, nếu một lỗi xuất hiện tại hàm exec(). Điều đó nghĩa, nếu tệp  
tin programm không tồn tại , thì nó không thể đọc được. Ngoài ra, lệnh của  
chương trình kế tiếp theo hàm exec() ở trạng thái người sử dụng thì giống hệt với  
lệnh đầu tiên của chương trình ‘programm’.  
Cha  
con  
PID = fork ()  
/* PID # 0*/  
if (PID = = 0)  
{ exec …  
/* PID = = 0*/  
if (PID = = 0)  
{ exec (“programm”)  
};  
exit () };  
Waitpid (PID)  
Hình 2.4.Sự phát sinh và loại trừ một tiến trình ở hệ điều hành Unix  
Tiến trình con kết thúc chỉ khi, nếu như trong ‘programmmột hàm gọi exit()  
tự đạt tới.  
Với suy nghĩ này, thí dụ sau đây sẽ làm sáng tỏ một tiến trình đối với sự thỉnh  
cầu của người sử dụng ở thiết bị đầu cuối. Tuy nhiên, mã (nói trên) chỉ cơ sở  
cho việc thỉnh cầu đó trong Unix để mỗi người sử dụng khởi động shell.  
Thí dụ shell của Unix:  
LOOP  
Write(prompt);  
(*thí dụ dạng :>*)  
ReadLine(command, params); (*đọc chuỗi, phân cách qua ý tự trống *)  
pid := fork();  
IF (pid=0)  
(*tái bản của tiến trình này*)  
THEN execve(command, params,0)  
ELSE waitpid(-1, status, 0)  
(*con chở tải Programm*)  
(*cha chờ sự kết thúc của con*)  
END;  
END;  
Tất cả các tiến trình trong Unix thích hợp với tiến trình khởi đầu (PID =1). Nếu  
ở sự chấm dứt của một tiến trình con mà không có một tiến trình cha nào tồn tại  
nữa, khi đó tiến trình khởi đầu nói trên được thông báo. Trong khoảng thời gian  
gọi hệ thống với hàm exit() và sự tiếp nhận các thông tin tại tiến trình cha, thì tiến  
trình con đạt được một trạng thái đặc biệt gọi là “zombi” (xem hình 2.1).  
Văn cảnh tiến trình nội bộ (intern process context) được phân thành hai phần:  
Phần thứ nhất phần mang tiến trình trong một bảng nhớ trú ngụ, nó thì rất  
quan trọng đối với việc điều khiển tiến trình và do đó nó luôn luôn tồn tại. Phần  
thứ hai gọi phần cấu trúc người sử dụng (user structure), nó chỉ quan trọng, nếu  
nó là tiến trình hoạt động nếu nó có thể được xuất ra trên bộ nhớ quảng đại với  
mã còn lại và các dữ liệu.  
Thực chất hai phần kể trên là:  
Các khối điều khiển tiến trình của bảng tiến trình (process control bock- PCB)  
+ Thông số định giờ  
+ Những tham chiếu nhớ: địa chỉ mã, địa chỉ dữ liệu, địa chỉ ngăn xếp ở bộ  
nhớ chính cũng như bộ nhớ quảng đại.  
+ Các dữ liệu tín hiệu: mặt nạ, trạng thái.  
+ Những điều khác: trạng thái tiến trình, biến cố chờ đợi, trạng thái định  
thời, PID, PID cha, người sử dụng.  
Văn cảnh người sử dụng (user context):  
+ Trạng thái bộ vi xử lý: thanh ghi, thanh ghi FPU…  
+ Gọi hệ thống: thông số…  
+ Bảng thông tin file  
+ Ngăn xếp nhân: không gian ngăn xếp đối với gọi hệ thống của tiến trình.  
Khác biệt với PCB là tiến trình có thể thay đổi kiểm tra chỉ gián tiếp qua gọi  
hệ thống, cho phép gọi hệ thống Unix để kiểm tra trực tiếp cấu trúc người sử dụng  
để thay đổi các phần  
2.1.2. Thí dụ về Windows NT  
Vì trong Windows NT phải được được các loại tiến trình khác nhau trợ giúp,  
những tiến trình đó không hạn chế sự phát sinh đa dạng, cho nên chỉ đối với  
một loại riêng lẻ của các tiến trình ( đối tượng xâu: thread object) thì một hệ thống  
tiến trình được tạo nên. Việc phát sinh các đối tượng (như OS/2,  
POSIX,Windows32) thì được liên hợp lại thành các đối tượng ở sự thay đổi  
trạng thái của chúng không đóng vai trò gì cả. Sơ đồ đơn giản hoá các quá độ  
trạng thái được chỉ ra trong hình 2.5.  
vận  
chuyển  
Đón nhận tín hiệu  
Không  
tồn tại  
chờ đợi biến cô  
Phát sinh  
Đình chỉ  
khởi  
xướng  
sẵn  
sàng  
chạy  
kết mãn  
kết thúc  
lựa chọn / bẻ gãy  
gởi đi  
dừng  
Không  
tồn tại  
Hình 2.5.Các trạng thái tiến trình của Windows NT  
Việc sản sinh tiến trình Windows NT thì phức tạp hơn trong Unix, vì để có  
sự chuyển giao thì nhiều trạng thái tiến trình phải được thực hiện. Do đó, những sự  
phát sinh đặc biệt được liên kết trong những hệ thống con.  
Để sản sinh ra các tiến trình thì chỉ có duy nhất một hàm gọi hệ thống  
NtCreateProcess(), ở đấy, bên cạnh sự kích thích nhờ các mà thì còn có tiến trình  
cha có thể được thông báo. Trên cơ sở đó, tất cả các biến gọi hệ thống con khác  
được thiết lập, mà cái đó sẽ được người sử dụng quan tâm và cần tới.  
Thật vậy, cái đó đã tạo ra cơ cấu của hàm gọi POSIX-fork(). Thí dụ, chương  
trình POSIX (hay tiến trình POSIX) gọi lệnh với hàm fork() qua giao diện người  
lập trình ứng dụng ( Application Programming Interface). Cái đó sẽ được chuyển  
đổi thành một thông tin và được gởi tới một hệ thống con POSIX qua nhân hệ  
thống (xem hình 1.7). Cái đó trở lại gọi hàm NtCreateProcess() và thông báo  
chương trình POSIX cho PID cha. Chìa khoá đối tượng (object handle) được trao  
trở lại hệ thống con POSIX quản lý; tất cả gọi hệ thống của tiến trình POSIX, mà  
đưa ra thông tin tới hệ thống con POSIX, thì được hoàn thiện ở đó với sự trợ  
giúp của gọi hệ thống của Windows NT và đưa kết quả dạng POSIX trở lại tiến  
trình gọi. Tương tự, điều đó cũng dẫn tới gọi tiến trình của các hệ thống con khác.  
2.1.3. Các tiến trình trọng lượng nhẹ.  
Nhu cầu lưu trữ của một tiến trình thì rất toàn diện. chứa đựng không chỉ  
vài con số, như số tiến trình và các dữ liệu,mà cả những thông báo về các files  
thông thường như các mã chương trình và các dữ liệu của chúng. Điều đó hầu  
hết ở các tiến trình, khi nó thích ứng ở trong bộ nhớ chính. Cho nên, tiến trình  
chiếm rất ít không gian trên bộ nhớ quảng đại (chẳng hạn harddisk). Vì có sự  
chuyển đổi tiến trình, bộ nhớ hiện tại bị tiêu tốn (chiếm chỗ), còn bộ nhớ trước đó  
của đĩa cứng được phục hồi trở lại, do đó một sự thay đổi tiến trình đều làm cho  
tải hệ thống nặng nthời gian thực hiện tương đối dài.  
Ở nhiều ứng dụng thì không có tiến trình mới được sử dụng, chỉ những  
đoạn độc lập (threads) được sử dụng. Những đoạn độc lập này được tả  
bằng văn cảnh tiến trình (thí dụ các thủ tục của một chương trình). Trường hợp  
này người ta gọi đồng lập thức (coroutine).  
Việc ứng dụng các đoạn mã theards có điều kiện để tạo trong một khoảng tiến  
trình bởi một hệ thống tiến trình tiếp theo mà người ta gọi là các tiến trình trọng  
lượng nhẹ (light weight process: LWP). Với hình dạng đơn giản nhất thì những  
tiến trình này tự chuyển đổi sự điều khiển một cách dứt khoát, mà người gọi bản  
phác thảo đồng lập thức (coroutine concept). Có lý do để nói rằng, những tiến  
trình mới này cũng những tiến trình gọi hệ thống. Nếu mỗi tiến trình mà càng  
sinh ra nhiều tiến trình khác, thì điều đó càng khó khăn hơn. Từ lý do đó, người ta  
thể dẫn ra đây một bộ định thời, bộ định thời này luôn luôn chứa đựng sự  
điều khiển sự điều khiển này được chuyển tiếp tục tới một tiến trình kế tiếp  
trong danh sách sẵn sang của nó. Nếu điều đó không được lập trình bởi người sử  
dụng, thì nó đã được chứa đựng trong hệ điều hành qua việc gọi hệ thống. Do đó,  
qua thời gian chuyển đổi của gọi hệ thống thì các tiến trình threads sẽ tiến trình  
trọng lượng nặng (heavy weight process: HWP).  
Mỗi tiến trình đều phải thâu giữ các dữ liệu riêng của một cách độc lập với  
các tiến trình khác. Điều đó thì cũng thuận với tiến trình trọng lượng nhẹ: Nếu  
chúng phân bổ các files đồng đều (nói chính xác là vùng địa chỉ ảo đồng đều, xem  
chương 3) với các tiến trình trọng lượng nhẹ khác. Do vậy, hầu hết các ngăn xếp  
của được sử dụng, ngăn xếp này được dữ trữ không gian để phát sinh cho  
mỗi tiến trình. Trong sự khác biệt với các tiến trình xác thực, thì do đó, các tiến  
trình trọng lượng nhẹ sử dụng chỉ ít các dữ liệu văn cảnh (context data), mà các dữ  
liệu này phải được thay đổi khi chuyển đổi. Từ đó, trạng thái vi xử lý (processor-  
status: PS) và con trỏ ngăn xếp (stack-pointer:SP) là những thứ quan trọng nhất.  
Còn, tự bản thân bộ đếm chương trình (programm-counter) có thể được tách khỏi  
ngăn xếp, do đó, nó không phải chuyển giao một cách rõ ràng. Bằng ngôn ngữ  
Assemble, việc chuyển đổi được thực thi một cách hiệu nghiệm và làm cho việc  
gọi hệ thống của các tiến trình này xảy ra rất nhanh.  
2.1.4. Trạng thái tiến trình Unix  
Ở hệ điều hành Unix, các tiến trình trọng lượng nhẹ được thực thi bởi thư viện  
của người sử dụng bằng ngôn ngữ C hay C++ (xem phần Unix ở chương 3).  
Tuỳ theo sự thực thi, mà hoặc là có một hệ thống đơn giản với việc chuyển giao  
điều khiển một cách trực tiếp, hoặc là có một hệ thống phức tạp hơn với bộ định  
thời đặc biệt (xem mục 2.2).  
Lợi thế của việc thực thi bằng thư viện tồn tại một sự chuyển đổi rất nhanh,  
vì các cơ cấu gọi hệ điều hành và các cơ cấu giải của chúng sẽ không có điều  
kiện thực hiện theo số dịch vụ và theo các thông số. Còn nhược điểm của nó là  
tiến trình thread phải chờ đợi một biến cố (thí dụ biến cố vào/ra) và nó chặn tiến  
trình tổng thể lại.  
những thí nghiệm để tiêu chuẩn hóa các tiến trình threads và để giảm nhẹ  
sự thực thi chương trình (xem chuẩn IEEE năm 1922)  
các phiên bản mới nhất của Unix, chúng chứa đựng loại 64bit –Unix, còn  
gọi là Unix-98.  
2.1.5. Trạng thái tiến trình Windows NT  
Khác với Unix, trong hệ điều hành Windows NT, các tiến trình trọng lượng  
nhẹ LWP được thực thi với chức năng gọi hệ điều hành. Tuy nhiên, sự chuyền đổi  
chậm chạp hơn, nên được gọi tiến trình trọng lượng nặng (heavy weight thread),  
nhưng vẫn ưu điểm. Đó là, người lập trình hệ thống một giao diện kết nối  
chắc chắn. Nó làm giảm nhẹ sự thực thi chương trình, vì chúng được sử dụng các  
tiến trình LWP và nó cũng tránh được việc thực nghiệm để phát triển những hệ  
thống lệch lạc riêng lẻ như đối với Unix. Một điều khác nữa là nhân của hệ điều  
hành cũng được điều khiển qua các tiến trình LWP.Ở đây, điều cần phải lưu ý là,  
các tiến trình LWP được thực hiện song song trong hệ thống đa vi xử lý và đối  
với biến cố I/O thì chỉ tiến trình thread ngăn hãm chỉ một tiến trình.  
một tiến trình thread trọng lượng nặng dẫn tới việc thu hẹp không cần thiết  
những cái đang cần thiết sử dụng, do đó, trong Windows NT với version 4.0 được  
dẫn vào trạng thái các files. Đó những thủ tục được tiến hành song song, mà  
những thủ tục đó được hoạt động theo bản phác thảo đồng lập thức: Sự chuyển đổi  
của một tiến trình fiber (thớ) tới một tiến trình thread khác được thực hiện một  
cách tự do. Nếu tiến trình thread bị ngăn hãm, do đó tất cả các tiến trình fiber cũng  
bị ngăn hãm tương tự. Điều đó cũng giảm nhẹ việc thực thi các chương trình như  
trên hệ thống Unix.  
2.2 Định thời tiến trình  
Nếu ở một hệ điều hành có nhiều nhu cầu về phương tiện điều hành, khi đó,  
việc truy cập phải được phối hợp. Thật vậy, đóng vai trò quan trọng bộ định thời  
đã nói trên và các giao thức của ở việc sắp xếp các tiến trình theo hàng chờ.  
Nếu chúng ta khảo sát hệ thống đơn vi xử lý, thì sẽ thấy trên đó các tiến trình độc  
lập làm việc một cách tuần tự (sequemtiell).  
Trong hệ thống tính toán thông thường, chúng ta có thể phân biệt ra hai loại  
nhiệm vụ định thời: định thời dự định việc thực hiện Job (còn gọi định thời dài  
cho Job) và dự định việc phân bổ bộ vi xử hoạt động (còn gọi định thời  
ngắn). Ở việc định thời dài, người ta phải lưu ý:(1). Khi mà có nhiều người sử  
dụng được phép đi vào hệ thống (login) với công việc của họ, khi ra (logout)  
người sử dụng phải báo như thế nào đó; (2). Nếu trong hệ thống người sử dụng  
quá nhiều, thì việc dẫn vào phải được chặn lại cho đến khi tải hệ thống chất đầy.  
ĐỊNH THỜI  
ĐỊNH THỜI  
NGẮN  
NSD  
DÀI  
Hình 2.6. Định thời dài và định thời ngắn  
Tuy nhiên ở việc định thời ngắn, công việc chính là phải dẫn ra giao thức để  
điều phối bộ vi xử các tiến trình. Sau đây, chúng ta sẽ khảo sát một giao thức  
thông dụng nhất.  
2.1.1 Tranh chấp mục đích  
Tất cả các giao thức định thời để thực hiện những mục đích nào đó. Người ta  
thấy những mục đích thông dụng sau đây:  
Khả năng chịu tải của CPU:  
Nếu CPU là phương tiện điều hành, thì ít nhất, chúng ta muốn thể hiện sự sử  
dụng hiệu nghiệm nhất. Mục đích là CPU tải 100%, thông thường chỉ tải khoảng  
40-90%.  
Lưu lượng (througput):  
Số công việc trên một đơn vị thời gian được gọi lưu lượng, nó chính là mức  
độ chịu tải của hệ thống.  
Cách điều khiển thật:  
Không có công việc nào ưu tiên hơn việc khác, khi chưa được thoả thuận đích  
xác. Điều đó có ý nghĩa rằng, mỗi một người sử dụng nhận được các phương tiện  
một cách đồng đều trong thời gian truy cập CPU.  
Thời gian thực hiện:  
Thời gian thực hiện (turnround time) là khoảng thời gian từ khi bắt đầu Job  
cho tới khi kết thúc Job, nó chứa đựng tất cả thời gian trong các hàng đợi, thời  
gian thực hiện thời gian xuất nhập. Tất nhiên chúng phải tối thiểu.  
Thời gian chờ đợi:  
Trong khoảng thời gian tổng cộng, bộ định thời chỉ ảnh hưởng tới thời gian  
chờ ở trong danh sách ready (sẵn sàng). Đối với giao thức định thời, người ta có  
thể giới hạn mục đích để làm giảm thời gian chờ.  
Thời gian trả lời:  
Ở sự hoạt động bên trong của hệ thống, người sử dụng cảm thấy đặc biệt không  
dễ chịu, vì sau một sự truy nhập nào đó, người ta phải chờ đợi lâu phản ứng của  
máy tính. Một cách độc lập với thời gian tổng cộng thực hiện Job, thời gian giữa  
việc nhập vào và việc chuyển giao dữ liệu trả lời thì được gọi thời gian trả lời.  
Danh sách của việc chuyển giao mục đích không những phải đầy đủ mà còn  
phải chặt chẽ. Thí dụ, mỗi một sự chuyển đổi tiến trình thì cần một sự thay đổi  
văn cảnh tiến trình (context switch). Những tiến trình ngắn thì được ưa chuộng  
hơn, bởi thời gian trả lời được rút ngắn- đó thời gian giữa hai lần truy nhập,  
nhờ vậy năng suất được gia tăng. Ngược lại, các tiến trình chậm thì không được ưa  
chuộng. Mặc khác, nếu khả năng chịu tải được nâng cao, thì do diễn biến bên  
trong của Job, thời gian trả lời sẽ kéo dài.  
Tương tự, trong đời sống thường nhật, người ta có thể nhìn thấy điều đó: Thí  
dụ ở việc cho thuê ô tô, những khách hàng xác định sẽ được dịch vụ thuận tiện,  
mặc dụ chật chội, còn những khách hàng khác phải chờ đợi lâu hơn. Nếu muốn  
thuê một chiếc ô tô chạy tốt, thì một khách hàng mới tới phải đợi cho đến khi anh  
ta nhận được chiếc ô tô thích muốn đó. Đối với một thời gian phản ứng ngắn, thì  
khi có nhiều ô tô cùng được đưa vào sử dụng.  
đối mỗi một nhóm người sử dụng thì sự nhượng bộ mục đích thể  
được thay đổi, nếu không có thuật toán định thời tưởng đối với mỗi tình huống.  
Trên cơ sở này, có rất nhiều phương hướng để tách chia cơ cấu định thời thành các  
giao thức định thời riêng lẻ và thành các thông số của chúng. Thí dụ, một tiến trình  
của ngân hàng dữ liệu phát sinh một vài tiến trình trợ giúp, thì nó sẽ nhận biết đặc  
trưng của sự trợ giúp đó và vì thế, tạo ra khả năng để ảnh hưởng tới giao thức định  
thời của các tiến trình con qua các tiến trình cha. Những bộ phận của nhân hệ điều  
hành, các cơ cấu định thời bên trong và cơ cấu điều phối cần thiết được dùng nhờ  
giao diện đã được chuẩn hoá (tức nhờ gọi hệ thống). Giao thức định thời sẽ chỉ  
thể được do người sử dụng lập trình.  
2.2.2. Định thời không có ưu tiên trước.  
Trong trường hợp đơn giản, các tiến trình có thể chạy thật lâu cho đến khi rời  
khỏi trạng thái hoạt động chờ đợi một biến cố (I/O hoặc một thông tin) hoặc  
trao việc điều khiển cho tiến trình khác, rồi tự kết thúc: nghĩa là chúng không được  
ngắt khỏi quá sớm. Trường hợp này được gọi định thời không có ưu tiên trước.  
Loại định thời này rất lợi đối với tất cả các hệ thống, ở đây người ta phải  
hiểu chính xác là những tiến trình nào tồn tại và chúng có những đặc trưng nào.  
Thí dụ, một chương trình ngân hàng dữ liệu, người ta phải hiểu chính xác: một  
cách thông thường, một sự dàn xếp nào để chương trình thực thi thôi qua trong  
bao lâu (?). Trong trường hợp này, người ta có thể sử dụng một hệ thống tiến trình  
trọng lượng nhẹ để thực hiện. Đối với loại định thời này, những chiến lược sau đây  
thường được sử dụng nhất:  
Chiến lược đến trước dịch vụ trước (First Com First Serve: FCFS):  
Một chiến lược đơn giản loại này thì bao gồm các tiến trình được sắp xếp theo  
thứ tự xuất hiện ở trong hàng đợi. Tất cả các tác vụ xảy ra theo tuần tự, mà không  
cần biết, chúng cần bao nhiêu thời gian. Cho nên việc thực thi giao thức này với  
hàng đợi FCFS thì rất đơn giản.  
Tuy nhiên, hiệu quả của thuật toán này thì rất giới hạn. Chúng ta giả định,  
chúng ta có 3 Job với chiều dài 10, 4 và 3. Các Job được sắp xếp và làm việc theo  
giao thức FCFS. Hình 2.7 mô tả điều đó.  
Job 1  
10  
Job 2
 
Job 3  
Job 3
 
Job 2  
Job 1  
10  
4
3
4
3
0
10  
14  
17  
0
3
7
10  
(a) Dãy tuần tự FCFS  
(b) Dãy tuần tự SIN  
Hình 2.7. Dãy tuần tự các Job  
Thời gian thực hiện của Job1 là 10, của Job 2 là 14 và của Job3 là 17, vậy thời  
gian thực hiện trung bình là (10+14+17): 3= 13,67. Tuy nhiên, chúng ta có thể sắp  
xếp lại các Job này theo kiểu: Job có chiều dài ngắn nhất làm việc đầu tiên, xem  
hình (b). Khi đó, ta có thời gian thực hiện trung bình ngắn hơn (3+7+17):3=9.  
Chiến lược đầu tiên Job ngắn nhất (Shortest Job First: SJF):  
Tiến trình có thời gian dịch vụ ngắn nhất được chuộng hơn các tiến trình khác.  
Nghĩa chiến lược loại này tránh được các nhược điểm nói trên. Thật vậy, những  
tiến trình hoạt động nội bộ thì cần thời gian CPU ít và hầu như việc chờ đợi sự kết  
thúc của các hoạt động diễn ra song song cùng các kênh xuất nhập. Do đó, thời  
gian trả lời trung bình được giảm đáng kể.  
Người ta có thể chỉ ra rằng, giao thức SJF đã giảm thiểu đáng kể thời gian chờ  
đợi trung bình của từng Job trong dãy các Job. Vì theo nguyên tắc ưu tiên Job  
ngắn, thì thời gian chờ đợi của giảm đi rất mạnh, trong khi đó thời gian chờ của  
Job dài tăng lên.  
Ở loại giao thức này vẫn còn tồn tại một vấn đề: Tại dòng vào lớn của các tiến  
trình ngắn với rất nhiều yêu cầu của CPU, tuy rằng một tiến trình không bị hãm  
chặn, nhưng vẫn không đón nhận CPU.. Điều này được gọi sự làm đói  
(starvation). Đó một vấn đề quen thuộc, mà nó cũng hay xuất hiện ở nhiều hoàn  
cảnh khác nhau nữa.  
Chiến lược tỷ lệ kế cận đáp ứng cao nhất (Hightest Response Ratio Next:  
HRN):  
Ở đây, các Job được làm việc theo một tỷ lệ mong muốn, mà trong đó, những  
nhận xét và phân tích về thời gian đáp ứng thời gian dịch vụ được sử dụng để  
làm cơ sở cho việc đánh giá đo đạc trước đó. Chiến lược này chỉ chú ý các Job có  
thời gian dịch vụ ngắn, nhưng mà nó giới hạn thời gian chờ của các Job có thời  
gian dịch vụ dài, vì ở một sự thiệt hại đáng kể, thời gian đáp ứng của chúng bị kéo  
dài.  
Chiến lược định thời ưu tiên trước (Priority Scheduling: PS):  
Mỗi một tiến trình sẽ chiếm dụng một sự ưu tiên. Nếu một tiến trình mới đi vào  
hàng đợi, do đó sẽ được sắp xếp, rằng những tiến trình có sự ưu tiên cao nhất sẽ  
đứng đầu hàng chờ; những tiến trình có ít sự ưu tiên đứng cuối. Nếu nhiều tiến  
trình có sự ưu tiên như nhau, thì dãy tuần tự trong các tiến trình này phải được  
quyết định theo một chiến lược khác thí dụ chiến lược FCFS.  
Người ta cũng lưu ý rằng, những Job bị làm tổn thất thì có thể tiếp tục làm đói.  
Ở việc định thời ưu tiên trước, vấn đề này cần phải được nhìn bao quát, rằng  
việc ưu tiên là không cố định, mà nó là một quá trình động. Nếu một tiến trình  
nhận được sự ưu tiên trong một dãy hợp lý, do đó sẽ sự ưu tiên cao nhất bất  
kỳ khi nào và cũng như thế, nhận được CPU.  
Sự giả định của các chiến lược SJF và HRN được thiết đặt bằng các câu hỏi  
viện cớ, rằng thời gian thực hiện của các Job thì không thống nhất thường hay  
thay đổi. Do đó, lợi thế của các giao thức ở các hệ thống khác nhau bị hạn chế.  
Điều đó thì khác với trường hợp của các Job thường hay xuất hiện, các Job có thể  
được nhìn bao quát và các Job quen thuộc, tức những Job tồn tại trong ngân  
hàng dữ liệu (datenbank) hay các hệ thống tiến trình (chỉ đối với hệ thống thời  
gian thực). Ở đây, điều lợi để nhận xét các tham số quen thuộc một cách  
thường xuyên mới mẻ để tối ưu việc định thời.  
Ở việc làm thích hợp thường xuyên các tham số (như thời gian thực hiện và  
thời gian dịch vụ) ở việc thực thi, người ta có thể đạt được với các thuật toán  
khác nhau. Một trong các thuật toán nổi tiếng, đó là: Với tham số a của một tiến  
trình tại một thời điểm t, thì từ giá trị tức thời bt và giá trị trước đó a(t), người ta  
xác định giá trị trung bình theo biểu thức sau:  
a(t+1) = (1-α) a(t) + αbt  
Ở đây, sẽ được diễn giải như sau:  
a(0) =  
b0  
a(1) = (1-α) b0  
+
αb1  
a(2) = (1-α)2b0 + (1-α)αb1  
+
αb2  
a(3) = (1-α)3b0 + (1-α)2 αb1 +(1-α)αb2 + b3  
a(n) = (1-α)nb0 + (1-α)n-1αb1 +…+(1-α)n-iαbi +…+αbn  
Người ta thấy rằng, với a<1, ảnh hưởng của việc đo đạc sớm sẽ giảm đi theo  
hàm số mũ. Nguyên tắc này cũng được tìm thấy ở nhiều phương pháp thích ứng  
khác. Ý nghĩa hạn hẹp của việc đo sớm sẽ tạo nên sự thay đổi bản chất của tiến  
trình và điều này cũng được nhìn thấy ở trong sự phân tích các tham số tức thời.  
Khi đó người ta nhận thấy dãy các giá trị tham số như những biến cố của một  
biến ngẫu nhiên. Điều đó có ý nghĩa rằng, sự phân chia của biến này không phải là  
hằng số, thực ra, nó thay đổi theo thời gian. Một thuật toán thích ứng như thế  
không dễ xác định giá trị trung bình của đo đạc (giá trị tham số chờ đợi) mà nó chỉ  
đánh giá trạng thái tức thời của chức năng phân bổ phụ thuộc thời gian. Đối với  
trường hợp α =1/2 thì thuật toán được thực thi đặc biệt nhanh. Ở đây, phép chia 2  
thì phù hợp với cấp bậc một phép xê dịch con số sang phải một vị trí.  
Sự đánh giá thích ứng các tham số của một tiến trình đối với một thuật toán  
định thời (tức việc phân bộ vi xử lý thích ứng) phải được thực hiện cho mỗi  
tiến trình một cách đích thực. Trong thí dụ ở trên, tham số a phải nhận hai chỉ số:  
một chỉ số cho số tham số trên một tiến trình và một chỉ số cho số tiến trình.  
Phương pháp đánh giá các tham số thì độc lập với thuật toán, vì thuật toán chỉ  
được dùng cho việc định thời. Ngoài ra, thuật toán này không chỉ được dùng cho  
việc định thời không có ưu tiên trước, nó còn là phương pháp để nghiên cứu việc  
định thời ưu tiên trước.  
2.2.3. Định thời chặn trước (preemptive scheduling)  
Ở hệ thống nhiều người sử dụng sẽ nhiều Job của nhiều người sử dụng  
cùng khởi động, khi đó sẽ điều không vừa ý, nếu một Job hãm chặn các Job  
khác. Do đó, đòi hỏi phải một kiểu định thời khác, để ở đó mỗi Job có thể được  
ngắt hãm sớm.  
Một trong các chiến lược quan trọng chiến lược nói về việc phân chia  
khoảng thời gian sử dụng các phương tiện điều hành (chẳng hạn CPU) thành các  
khoảng thời gian riêng lẻ bằng nhau. Nếu tiến trình đó tiến trình sẵn sang thì  
sẽ được sắp xếp một vị trí thích hợp trong một hàng đợi theo một chiến lược. Ở  
việc khởi đầu một khoảng thời gian, bộ điều phối sẽ cho một ngắt thời gian được  
gọi, cho đến khi tiến trình được thực hiện, thì nó bị chặn lại một tiến trình ready  
mới sẽ được xếp vào hàng đợi. Sau đó, tiến trình đầu tiên của hàng đợi được  
chuyển vào trạng thái hoạt động. Điều đó được trình bày trong hình 2.8 dưới  
đây.  
Hàng đợi  
Lối tới  
Lối ra  
Bộ vi xử lý  
Đình chỉ  
Hình 2.8. Định thời chặn trước  
Ở đây, đường thẳng góc đậm tượng trưng cho các tiến trình, mà nó được dịch  
chuyển vào từ trái sang trong ống hàng đợi. Bộ phận công tác - ở đây bộ vi xử  
lý- được biểu thị tượng trưng hình ê-líp. Sau một sự ngắt đoạn, tiến trình được xếp  
một vị trí giữa các tiến trình khác trong hàng đợi. Dưới đây sẽ khảo sát các chiến  
lược định thời khác nhau.  
Chiến lược quay tròn Robin (Round Robin: RR):  
Chiến lược đơn giản nhất ở phương pháp lát cắt thời gian là chiến lược FCFS  
và hàng đợi FIFO (vào trước ra trước). Sự kết hợp giữa chiến lược phương pháp  
lát cắt thời gian được gọi thuật toán quay vòng Robin. Việc phân tích này chỉ ra  
rằng, ở đây, các thời gian đáp ứng thì tỷ lệ với thời gian dịch vụ, độc lập với sự  
phân bổ thời gian dịch vụ chỉ phụ thuộc vào thời gian dịch vụ trung bình.  
Điều đã rõ, hiệu suất của chiến lược RR thì phụ thuộc mạnh vào lát cắt thời  
gian. Nếu người ta chọn lát cắt thời gian không kết thúc lâu, thì do đó chỉ còn giao  
thức đơn giản FCFS được thực hiện. Ngược lại, nếu người ta chọn lát cắt thời gian  
rất nhỏ (thí dụ đúng bằng một lệnh), do đó, tất cả n Job đón nhận mỗi lần chừng  
1/n hiệu suất bộ vi xử lý; bộ vi xử lý thì phân thành n bộ vi xử ảo. Tuy nhiên,  
điều đó chỉ xẩy ra khi, nếu bộ vi xử chạy rất nhanh so với các thiết bị ngoại vi  
(thí dụ bộ nhớ) việc chuyển đổi tiến trình nhờ cơ cấu phần cứng được thực hiện  
rất nhanh. Đối với các hệ thống chuẩn thì điều đó không còn đúng nữa. Ở đây, sự  
chuyển đổi văn cảnh tiến trình xảy ra qua cơ cấu phần mềm sử dụng một  
khoảng thời gian để sắp xếp thô áng chừng 10 đến 100 μs. Nếu chúng ta chọn lát  
cắt thời gian quá ngắn, do đó sẽ tỷ số quan hệ giữa thời gian làm việc thời  
gian chuyển đổi rất nhỏ. Bởi vậy, năng suất giảm thời gian chờ đợi gia tăng.  
Trong trường hợp tại thời điểm cực trị, bộ vi xử chỉ chuyển đổi, nhưng không  
thực thi Job.  
Đối với một sự tương quan hợp giữa giao thức FCFS và chu kỳ chuyển đổi,  
thì sự hiểu biết các tham số khác nhau là rất cần thiết. Ở đây, quy tắc số 1 được chỉ  
ra: lát cắt thời gian phải lớn hơn nhu cầu trung bình của CPU giữa hai lần truy cập  
I/O (CPU - burst) khoảng 80% của Job, tức là nó phù hợp với một giá trị khoảng  
100ms.  
Chiến lược quay vòng Robin có ưu tiên động: (Dynamic Priority Round  
Robin:DPRR)  
Định thời kiểu RR đối với một Job được làm đầy đủ thêm nhờ tầng đầu tiên  
của hàng đợi ưu tiên. Sự ưu tiên của tiến trình trong tầng đầu tiên được thay đổi  
sau mỗi lát cắt thời gian, kéo dài cho tới khi có đạt sự ưu tiên bung ra theo phương  
pháp RR riêng lẻ rồi được sắp xếp vào hàng đợi chính. Do đó, một sự xử lý  
khác nhau của Job sẽ đạt được theo ưu tiên hệ thống, vẫn không làm thay đổi  
trực tiếp phương pháp RR.  
Chiến lược thời gian còn lại ngắn nhất ở trước (Shortest Remaining Time  
First):  
Ở đây, chiến lược SJF để sắp xếp hàng đợi có ý nghĩa rằng, Job phải được  
phân tích để biểu thị Job có thời gian dịch vụ còn lại nhỏ nhất. (xem giao thức SJF  
được trình bày phía trước).  
Tóm lại, sự định thời ưu tiên chỉ có ý nghĩa khi: Tiến trình đang diễn biến  
thể được thay thế bởi một tiến trình mới tới (từ hàng đợi I/O) có ưu tiên cao  
hơn hay được sắp xếp trở lại trong danh sách sẵn sàng. Trong thực tế, một liên  
hiệp hai phương pháp thường hay được sử dụng. Chẳng hạn, giao thức FCFS được  
thuyên chuyển cho hàng đợi quay vòng Robin (RR) ở sự định thời ưu tiên.  
2.2.4 Đa hàng đợi đa bộ định thời  
Ở một hệ thống vi xử hiện đại vẫn chỉ một bộ vi xử lý chính, còn hầu hết  
các thiết bị vào ra thì nhanh hơn nhờ sử dụng một bộ điều khiển, bộ điều khiển  
này thì độc lập với bộ vi xử lý chính, và các dữ liệu thể được tạo ra từ bộ nhớ  
chính đến bộ nhớ quảng đại ngược lại (Direct Memory Acess:DMA). Bộ điều  
khiển DMA này có tác dụng như những bộ vi xử lý chuyên dụng và chúng được  
xem như phương tiện điều hành độc lập. Mục đích là, để tạo ra một hàng đợi  
cho mỗi cách xuất nhập mà nó được dịch vụ bởi bộ điều khiển DMA. Sự điều phối  
chung thì được phủ lên toàn bộ Job từ hàng đợi này tới hàng đợi kế tiếp, do những  
phản ứng ngắn của CPU (CPU bursts) nằm trong khoảng đó.  
Một biến cố nữa cho thấy, chúng ta không chỉ một loại Job, thực ra có rất  
nhiều loại Job vì do có sự ưu tiên khác nhau. Vì vậy, đối với mỗi loại Job thì một  
hàng đợi được thông báo. Khi đó, ta có định thời đa mức (Multi – level -  
Scheduling).  
Bộ vi xử lý chính  
I/O ổ đĩa cứng 1  
I/O ổ đĩa cứng 2  
I/O đầu cuối  
Hình 2.9. Định thời với đa hàng đợi  
Với sự ưu tiên khác nhau, các hàng đợi được sắp xếp theo một tuần tự xác  
định, tức là theo một thứ tự làm việc xác định: hàng đợi ưu tiên cao nhất làm  
việc trước tiên, tiếp đến hàng đợi thứ hai. Vì để một Job mới luôn luôn đi tới,  
do đó dãy tuần tự làm việc cũng luôn luôn thay đổi. Điều đó được mô hình hoá  
thành bốn bình diện, thể hiện trong hình 2.10 ở dưới đây.  
Mức ưu tiên 0: Các tiến trình hệ thống  
Mức ưu tiên 1: Job nội hoạt  
Mức ưu tiên 2: Job chung chung thống  
Mức ưu tiên 3: Job tính toán cấp tốc  
Hình 2.10. Định thời đa mức  
Khi thời gian chờ đợi lâu hơn ở trong hàng chờ, Job có thể chuyển đến vị trí  
cao hơn. Lúc đó, người ta nói định thời ăn sau đa mức (multi-level-feedback-  
Scheduling).  
Ở những thuật toán định thời được trình bày trên, cho đến nay, ta đã bỏ qua  
một tính huống, rằng tất cả các tiến trình trong bộ nhớ chính không thể cùng  
đồng thời được sử dụng. Để thể định thời các tiến trình, người ta phải dựa vào  
các dữ liệu quan trọng của tiến trình trong bộ nhớ chính, mà cái đó được mô  
phỏng đầy đủ trong khối điều khiển tiến trình (Process Controll Block: PCB); tất  
cả các dữ liệu khác thì được di chuyển trên bộ nhớ quảng đại. Nếu một tiến trình  
được hoạt động, thì đầu tiên nó phải nhận được sự sao chép từ bộ nhớ quảng đại  
vào bộ nhớ chính và sau đó, thực hiện. Cái đó yêu cầu thời gian bổ sung đáng  
kể thay đổi văn cảnh tiến trình và nâng cao thời hạn làm việc. Tuy nhiên, tốt nhất  
phải tiến trình sẵn sang đúng ở trong bộ nhớ chính. Nghĩa là, sự quá độ của  
tiến trình cần thiết phải được điều chỉnh từ bộ nhớ quảng đại tới bộ nhớ chính.  
Cách giải quyết vấn đề này là dẫn vào một bộ định thời thứ hai để chỉ có  
nhiệm vụ gộp hay tachs ra các tiến trình. Bộ định thời thứ nhất điều hành việc sắp  
xếp các tiến trình tới các phương tiện điều hành (như bộ vi xử lý) và nó làm việc  
ngắn hạn. Còn bộ định thời thứ hai là bộ định thời trung bình hay dài hạn (giống  
trong hình 2.6) và nó điều chỉnh sự sắp xếp các tiến trình tự phương tiện điều hành  
( bộ nhớ chính), mà trong đó điều chỉnh độ lớn của phạm vi bộ nhớ chính.  
Trong những khoảng thời gian lớn hơn, loại định thời thứ hai cũng được gọi loại  
định thời ngắn hạn. Chai loại đều sử dụng những hàng đợi riêng lẻ điều chỉnh  
sự sắp xếp cả sự dẫn vào của tiến trình. Chiến lược cho định thời như kiểu đã  
nói này sẽ được trình bày trong chương 3.  
2.2.5. Định thời ở trong hệ điều hành thời gian thực.  
một loạt các hệ thống máy tính mà chúng được gọi hệ thống thời gian  
thực (real time system). Với sự biểu thị này, người ta sẽ hiểu được điều gì? Một  
quan điểm trực giác về điều đó cho rằng: Đó những hệ thống phải tác dụng  
nhanh, những hệ thống này cũng còn được gọi những hệ thống thời gian thực.  
Với khái niệm “nhanh”, điều đó làm cho chúng ta có thể hiểu một cách chính xác  
hơn: Một hệ thống đang thực hiện một Job, thì Job đó phải tuân theo những quy  
định về thời gian đã được đề ra. Nhưng điều đó cũng chưa đủ đúng, vì có thể  
những quy định đó chưa thể những quy định cứng được, dụ: một người soạn  
thảo không cần thiết phải sử dụng lâu hơn 2 giây để đưa một tự lên màn hình;  
một ngân hàng cần thiết phải thực hiện một việc chuyển tiền trong khoảng một  
tuần để tránh một sự nhẫm lẫn đáng tiếc…Lúc đó, ta gọi nó là hệ thống thời gian  
thực mềm. Hệ thống thời gian thực mềm đặc điểm: tại đó, các ngăn xếp các  
ngăn xếp thời gian là mềm và không được chuyên môn hoá. Lẽ tất nhiên, không có  
sự thoả mãn nào để dẫn tới sự phán quyết nặng cân. Trái ngựơc với hệ thống thời  
gian thực mềm hệ thống thời gian thực cứng. Throng cog nigh may tin, he thing  
this gain theca conga cons được gọi tắt hệ thống thời gian thực; nó cũng thường  
được dùng trong điều khiển các nhà máy điện nguyên tử, điều khiển máy bay, điều  
khiển giao thông…Vậy một hệ thống thời gian thực phải thừa nhận giới hạn thời  
gian đầu cuối rõ ràng đối với các tiến trình, để loại trừ được những quyết định sai  
phạm nghiêm trọng làm cho hệ thống tổn thất nặng nề.  
Những thuật toán định thời phải được hướng tới kiểu dạng của các tiến trình.  
Kiểu dạng hệ thống thời gian thực là tình huống, mà các tiến trình luôn luôn quay  
trở lại khoảng thời gian đã được xác định chính xác và các tiến trình này thì có thể  
nhìn thấy trước đó ở trong sự thường xuyên xuất hiện của chúng cũng như ở trong  
chu kỳ làm việc trong sự xác định các phương tiện điều hành…Cho nên, điều  
đó thì có lợi để kiến tạo một sự định thời cố định.  
Thí dụ về tác vụ định kỳ (Priodic task): Một máy bay(thí dụ loại Airbus A-  
340) được điều khiển bằng máy tính. Để điều khiển, máy tính cần sử dụng những  
số liệu bay khác nhau, mà nó phải được xác định xử lý thành những quảng khác  
nhau: giá trị gia tốc theo hướng x,y,z khoảng 5ms, ba giá trị của các chuyển động  
quay khoảng 40 giây, nhiệt độ khoảng 1 giây và vị trí tuyệt đối để điều khiển  
khoảng 10giây. Trên màn hình cho thấy sự diễn biến trong từng giây. Những chiến  
lược định thời quan trọng theo chuẩn IEEE năm 1993 có những loại sau đây:  
Chiến lược vòng được xén ( Polled Loop):  
Bộ vi xử thực hiện một chu trình tính,mà ở đó, nó luôn luôn kiểm tra trở lại  
thiết bị, xem những số liệu mới tồn tại không. Nếu tồn tại, thì do đó, sẽ xử lý  
ngay. Chiến lược này thích hợp với những thiết bị riêng lẻ, mà không thích hợp,  
nếu một biến cố khác xuất hiện trong khi xử lý và do đó, các số liệu cũng  
không được sờ tới.  
Chiến lược điều khiển ngắt các hệ thống:  
Bộ vi xử thực hiện một chu trình chờ.Nếu những số liệu mới xuất hiện, do  
đó, mỗi một ngắt của thiết bị được gọi để xử lý các số liệu mới này. Phương pháp  
điều khiển ngắt hệ thống này được gọi lập thức dịch vụ ngắt (Interrupt Service  
Routine: ISR).  
Nếu các ưu tiên được sắp xếp cho lập thức ISR, thì do đó, sự định thời ưu  
tiên sẽ xẩy ra một cách tự động nhờ ngắt logic của điều khiển ngắt. Vấn đề còn lại  
của chiến lược này là, nếu các biến cố bị chất đống, thì khi đó, các ngắt ưu tiên  
thấp không bị bẻ gãy và có thể được đẩy lên đầu.  
Chiến lược đường tử ít nhất- trước nhất (Minimal Deadline First: MDF):  
Đâu tiên tiến trình được chỉnh lý: nó sẽ chiếm trước ngăn xếp thời gian nhỏ  
nhất (deadline time Td: thời gian chết), rồi đến ngăn xếp tiếp theo. Giao thức này  
cũng thường hay được sử dụng (thí dụ để triển khai những dự án phần mềm),  
nhưng mà nó cũng một vài nhược điểm. Thí dụ, chúng không có lợi, nếu tất cả  
các tiến trình chiếm các ngăn xếp thời gian như nhau.  
Chiến lược thời gian xử lý ít nhất-trước nhất (Minimal Processing Time  
First: MPTF)  
Một tiến trình được chọn làm tiến trình điều khiển khi tiến trình này chiếm  
phần thời gian dịch vụ nhỏ nhất (control time Tc: thời gian điều khiển). Điều đó thì  
phù hợp với chiến lược SJF và nó có ý nghĩa rằng, Job ngắn với ưu tiên thấp thì  
được ưa chuộng hơn Job dài có ưu tiên cao.  
Chiến lược định thời đơn điệu tỷ suất (Rate Monotonic Scheduling : RMS):  
Nếu chúng ta có một hệ thống ưu tiên cố định với các tỷ suất thực hiện cố định  
của các tiến trình tham gia ( xem thí dụ định thời điều khiển máy bay trên), thì  
do đó, một cách tối ưu là, nếu chúng ta sắp xếp những ưu tiên cao nhất cho tỷ suất  
thực hiện cao và những ưu tiên thấp cho tỷ suất thực hiện thấp ( gọi định thời  
đơn điệu tỷ suất). Nếu trường hợp không có sự định thời đơn điệu tỷ suất đối với  
một tiến trình được tìm thấy, thì điều đó được chứng minh rằng, sau đó vẫn không  
một sự định thời khác tồn tại, do đó sự định thời nói trên đạt yêu cầu. Thật vậy,  
nếu CPU có một khả năng tải nhỏ hơn 70%, thì với chiến lược RMS, tất cả các  
ngăn xếp thời gian được giữ đúng một cách bảo đảm. Tuy nhiên, điều cần thiết là,  
sự ưu tiên thấp của các tiến trình quan trọng với tấn số thực hiện hạn chế phải  
được nâng lên. Cái đó được gọi đảo ngược ưu tiên.  
Chiến lược định thời hậu cảnh- tiền cảnh (Foreground Background  
Scheduling):  
Trong các hệ thống thời gian thực một số tiến trình có ích, nhưng cũng  
không cần thiết lắm. Những tiến trình đó thể được thu hẹp ở hậu cảnh, ngay khi  
bộ vi xử được giải phóng và nó không được dùng việc gì khác nữa. Mỗi một  
tiến trình có thể làm cho các hệ thống gián đoạn. Minh hoạ cho điều đó có vài ví  
dụ sau đây:  
Tự thử nghiệm để khám phá ra những khuyết tật.  
Lắp thêm RAM để đọc viết lại nội dùng của RAM. Với những hệ  
thống tiện dụng thì, chúng ta có bus dữ liệu để sửa lỗi bit trong RAM.  
Nâng cao khả năng tải của màn hình để phát hiện sớm các lỗi. Thí  
dụ nhờ việc cảnh giới quá thời gian (watch dog time) mà tránh được một sự báo  
động khẩn cấp.  
Một hệ điều hành thời gian thực bây giờ không chỉ những tiến trình giới  
hạn, mà các ngăn xếp thời gian (time stack) của chúng nhất thiết phải được giữ cố  
định; nó còn có các tiến trình tới hạn cần thiết và các tiến trình không có giới hạn.  
Tất cả đều được sửa lỗi tương tự nếu còn thời gian. Chúng ta thấy rằng, những tiến  
trình tới hạn cần thiết được tháo gở theo một chiến lược RMS cố định. Loại tiến  
trình không có tới hạn được định thời theo chiến lược hậu cảnh. Còn loại tiến trình  
tới hạn quan trọng được định thời chiến lược điều khiển ngắt hệ thống.  
Những nhà thiết kế hệ thống đã phát triển thêm nhiều chiến lược phụ cho loại  
các hệ thống vừa nêu. Họ đã tách chia để phân biệt các biến: biến về sự quan  
trọng, biến về thời gian ngăn xếp ( với Td thời gian đình chỉ hay thời gian chết)  
biến về phương tiện điều hành cần thiết ( với Tc thời gian dịch vụ hay thời  
gian điều khiển )…Đồng thời, họ cũng liên hiệp các biến này tới những chiến lược  
mới:  
Chiến lược tình trạng biến động nhỏ đầu tiên (Minimum Laxity  
First): Tiến trình được chọn cho kiểu định thời này phải thời gian  
tự do nhỏ nhất (minimum free time), tức biểu thức [Td – (Ts +Tc)] đạt nhỏ nhất.  
Chiến lược liên hiệp tiêu chuẩn 1: Tiến trình được chọn cho kiểu  
định thời này có thời gian tự do biểu diễn trong biểu thức [Td +Tc] đạt nhỏ nhất.  
Chiến lược liên hiệp tiêu chuẩn 2: Tiến trình được chọn cho kiểu  
định thời này có thời gian tự do ở dạng [Td +Ts] đạt nhỏ nhất.  
Những sự mô hình hoá cho thấy rằng, tất cả sự định thời, mà nó chỉ dùng một  
mình thời gian Td, đều mang tới những kết quả tồi cho hệ thống đơn cũng như đa  
vi xử lý. Ngược lại, các tiêu chuẩn liên hiệp đã loại trừ cái đó một cách tốt đẹp,  
đặc biệt, liên hiệp tiêu chuẩn 2 đã đưa tới kiểu định thời tốt nhất, vì nó đã quan  
tâm tới các phương tiện điều hành.  
2.2.6. Định thời ở hệ thống đa vi xử lý  
Nói chung, đối với mỗi một phương tiện điều hành vẫn còn tồn tại những vấn  
đề, và do đó, đối với mỗi bvi xử lý, mỗi hàng đợi riêng lẻ hay mỗi kiểu định thời  
riêng lẻ cũng vậy. Tuy nhiên, sự quá độ giữa các hàng đợi là không thể tuỳ tiện  
được, đặc biệt, ở nhiều tiến trình xẩy ra song song hay cùng đồng thời làm việc,  
thì phải xem xét vấn đề trên cùng hệ trục toạ độ. Điều cho thấy rằng, giữa các tiến  
trình riêng lẻ tồn tại nhiều sự phụ thuộc ở dãy tuần tự làm việc.  
Nếu chúng ta biểu thị các phương tiện điều hành bằng các chữ cái A,B,C và  
các yêu cầu đối với chúng là Ai, Bj, Ck , do đó mỗi yếu tố gây được ấn tượng qua  
tự “>”. Chẳng hạn Ai > Bj có ý nói: đầu tiên Ai và sau đó (bất kỳ khi nào) Bj  
phải thực hiện. Nếu Ai là hành động trực tiếp ngay trước Bj là hành động kế gần,  
thì quan hệ giữa chúng được viết bằng dấu “>>”.  
Sau đây dẫn ra một vài ví dụ:  
A1>>B1 >>C1>> A5 >>B3 >> A6  
B1 >>B4>>C3>> B3  
A2>> A3>> B4  
A3>> C2>> B2>> B3  
A4>> C2  
Những tương quan trong 5 hàng ví dụ trên sẽ được mô hình hoá qua một sơ đồ:  
một nút chỉ một yêu cầu của hệ điều hành, còn tương quan (>>) giữa chúng được  
biểu thị bằng mũi tên (với gốc nguồn, ngọn đích). Chu kỳ làm việc ti của các  
yêu cầu phương tiện điều hành thì do đó một con số (gọi trọng số) viết cạnh nút  
(để biểu thị một yêu cầu nào đó). Hình 2.11 chỉ ra một thí dụ. Một dãy tuần tự  
được gọi đúng nhưng chưa cần thiết, nếu nó bao gồm những tiến trình độc lập,  
những tiến trình này chẳng dữ liệu để mà thay đổi. Nhưng chúng cũng cần  
tới phương tiện điều hành, do đó dẫn tới tranh chấp tiến trình.  
Tải về để xem bản đầy đủ
doc 76 trang Thùy Anh 27/04/2022 5960
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Hệ điều hành - Chương 2: Tiến trình", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docgiao_trinh_he_dieu_hanh_chuong_2_tien_trinh.doc
  • htmbtc2.htm
  • xmlfilelist.xml
  • gifimage001.gif
  • gifimage002.gif
  • gifimage003.gif
  • jpgimage004.jpg