Giáo trình Hệ điều hành - Chương 2: Quản lý tiến trình - Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
Chương 2
QUẢN LÝ TIẾN TRÌNH
4. Tiến trình
4.1. Khái niệm tiến trình
Một tiến trình là một chương trình trong quá trình thực hiện. Một
tiến trình có thể có nhiều đoạn mã chương trình.
Một chương trình tự nó không phải là một tiến trình. Một chương
trình chỉ là một thực thể thụ động, chỉ là nội dung của một file được lưu
trên đĩa. Trong khi đó, một tiến trình là một thực thể tích cực, hoạt động.
Hai tiến trình có thể được sinh từ cùng một đoạn mã hoặc từ hai
đoạn mã khác nhau.
Trạng thái tiến trình
Tiến trình trong quá trình thực hiện, nó thay đổi trạng thái. Trạng
thái của một tiến trình được định nghĩa bởi hoạt động hiện thời của tiến
trình. Mỗi tiến trình có thể ở một trong các trạng thái sau:
Mới
Kết thúc
Nạp vào
Thoát
Bị ngắt
Sẵn sàng
Thực hiện
Bộ lập lịch gửi đến
Chờ đợi
Đợi
sự
kiện
Sự kiện
vào ra
hoàn tất
Hình 4.1: Sơ đồ chuyển đổi trạng thái của tiến trình
Phạm Ngọc Hưng
41
Quản lý tiến trình
- Mới (new): Tiến trình bắt đầu được tạo ra
- Đang thực hiện (running): Các lệnh đang được thực hiện
- Chờ đợi (waiting): Tiến trình đang chờ đợi một số sự kiện xuất
hiện
- Sẵn sàng (ready): Tiến trình đang chờ đợi để được cấp phát bộ
- Kết thúc (terminated): Tiến trình vừa kết thúc quá trình thực hiện
xử lý
Khối điều khiển tiến trình
Mỗi tiến trình được biểu diễn trong hệ điều hành bằng một khối
điều khiển tiến trình (PCB - Process Control Block), còn được gọi là khối
điều khiển tác vụ. Một PCB được thể hiện ở hình 4.2. Nó chứa các phần
thông tin liên quan đến một tiến trình, bao gồm:
Con trỏ
Trạng thái tiến trình
Số hiệu tiến trình
Bộ đếm chương trình
Các thanh ghi
Danh sách các file đã mở
....
Hình 4.2: Khối điều khiển tiến trình (PCB)
- Trạng thái tiến trình: Trạng thái có thể mới, sẵn sàng, thực hiện,
chờ đợi hay dừng.
- Bộ đếm chương trình: Bộ đếm chương trình xác định địa chỉ câu
lệnh kế tiếp sẽ được thực hiện cho tiến trình này.
- Các thanh ghi CPU: Có nhiều loại thanh ghi với các loại khác
nhau, tuỳ thuộc vào kiến trúc của máy tính. Chúng bao gồm thanh ghi
chứa kết quả trung gian, thanh ghi chỉ số, con trỏ ngăn xếp, và các thanh
ghi công dụng chung.
42
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
- Thông tin quản lý bộ nhớ: Thông tin này có thể là thông tin giống
như giá trị thanh ghi cơ sở và thanh ghi giới hạn, bảng trang, hoặc bảng
đoạn, tuỳ thuộc vào hệ thống nhớ được hệ điều hành sử dụng.
- Thông tin tính toán: Thông tin này bao gồm thời lượng của CPU
và thời gian thực được sử dụng, giới hạn thời gian, số lượng các tính toán,
số lượng các tiến trình hay nhiệm vụ.
- Thông tin trạng thái vào ra: Thông tin bao gồm danh sách các
thiết bị vào ra được cấp phát cho tiến trình này, một danh sách các file
mở.
Các Luồng (Threads)
Mô hình tiến trình đã thảo luận phần trước là một tiến trình sinh từ
một chương trình thực hiện trong một luồng xử lý. Ví dụ, nếu một chương
trình đang chạy như Word, một luồng đơn các chỉ thị lệnh đang được thực
hiện. Luồng đơn này là một luồng điều khiển tiến trình để thực hiện duy
nhất một nhiệm vụ trong một thời điểm. Ví dụ, người sử dụng không thể
vừa gõ chữ vừa thực hiện chức năng kiểm tra lỗi chính tả trong cùng một
tiến trình. Nhiều hệ điều hành cho mở rộng khái niệm tiến trình cho phép
một tiến trình có nhiều luồng thực hiện. Chúng cho phép tiến trình thực
hiện nhiều nhiệm vụ trong một thời điểm.
4.2. Lập lịch tiến trình
Mục tiêu của đa chương trình là cho phép nhiều chương trình cùng
chạy trong một thời điểm vì thế làm gia tăng hiệu quả của làm việc của
CPU. Mục tiêu của hệ thống chia sẻ thời gian chuyển đổi CPU qua các tiến
trình một cách thường xuyên vì vậy người sử dụng có thể tương tác với
mỗi tiến trình trong khi nó thực hiện.
Hàng đợi lịch làm việc
Khi các tiến trình được nhập vào hệ thống, chúng được đưa vào
một hàng đợi các công việc. Các tiến trình đó được lưu trú trong bộ nhớ
chính, đã sẵn sàng và đang chờ đợi để thực hiện được giữ trong một danh
sách được gọi là hàng đợi sẵn sàng. Hàng đợi này là một danh sách liên
kết chứa các con trỏ trỏ tới PCBs đầu tiên và cuối cùng trong danh sách.
Phạm Ngọc Hưng
43
Quản lý tiến trình
Mỗi PCB có một trường con trỏ trỏ tới PCB kế tiếp trong hàng đợi sẵn
sàng.
Hệ điều hành cũng có các hàng đợi khác. Khi một tiến trình được
cấp phát CPU, nó thực hiện cho đến khi dừng hoặc bị ngắt hoặc đợi cho
đến khi một sự kiện cụ thể xuất hiện như hoàn tất một yêu cầu vào ra.
Trong trường hợp có một yêu cầu vào ra, như yêu cầu đến một bộ điều
khiển băng hay một thiết bị được chia sẻ như một đĩa. Với hệ điều hành
có nhiều tiến trình, đĩa có thể bị bận với các yêu cầu vào ra bởi các tiến
trình khác. Các tiến trình vì vậy phải đợi đĩa. Danh sách các tiến trình đợi
một thiết bị vào ra cụ thể được gọi là hàng đợi thiết bị. Mỗi thiết bị có
riêng một hàng đợi của mình.
Một thể hiện của lịch làm việc của tiến trình dưới dạng sơ đồ hàng
đợi như hình 4.3. Mỗi hộp chữ nhật thể hiện cho một hàng đợi. Hai kiểu
hàng đợi được trình bày: hàng đợi sẵn sàng và một tập các hàng đợi thiết
bị các hình tròn thể hiện cho tài nguyên phục vụ cho các hàng đợi và các
mũi tên chỉ định luồng của các tiến trình trong hệ thống.
Hàng đợi sẵn sàng
CPU
Hàng đợi I/O
Yêu cầu I/O
Hết hạn
I/O
Tiến trình con
Phân nhánh cho tiến trình con
thực hiện
Đợi một ngắt
Ngắt xuất hiện
Hình 4.3: Sơ đồ hàng đợi biểu diễn sự lập lịch tiến trình
44
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
Khi một tiến trình mới được khởi động và đưa vào hàng đợi sẵn
sàng nó chờ đợi trong hàng đợi sẵn sàng cho đến khi được lựa chọn để
thực hiện. Khi tiến trình được liên kết với CPU và trong quá trình thực
hiện, có thể xảy ra một số sự kiện sau:
- Tiến trình có thể phát sinh một yêu cầu vào ra và sau đó nó được
đặt vào hàng đợi và ra.
- Tiến trình có thể tạo một tiến trình con mới và đợi cho đến khi nó
kết thúc.
- Tiến trình có thể bị loại bỏ khỏi CPU khi một ngắt xuất hiện và bị
đưa trở lại hàng đợi sẵn sàng.
Ở hai trường hợp đầu, tiến trình cuối cùng sẽ chuyển sang trạng
thái chờ đợi rồi đến trạng thái sẵn sàng và sau đó sẽ được đưa trở lại
hàng đợi sẵn sàng.
Các bộ lập lịch
Một tiến trình sẽ chuyển qua lại giữa các hàng đợi lịch khác nhau
trong suốt thời gian thực hiện. Hệ điều hành phải lựa chọn tiến trình từ
các hàng đợi theo một số cách và công việc này được thực hiện bởi bộ lập
lịch thích hợp.
Có hai bộ lập lịch: Bộ lập lịch dài hạn (long-term scheduler) và bộ
lập lịch ngắn hạn (short-term scheduler). Sự khác nhau cơ bản giữa hai hệ
thống lập lịch là mức độ thường xuyên thực hiện của chúng.
Bộ lập lịch ngắn hạn phải lựa chọn một tiến trình mới cho CPU một
cách thường xuyên hơn. Thời gian để hệ thống này chọn tiến trình thường
là rất ngắn để giảm sự lãng phí thời gian thực hiện của CPU.
Bộ lập lịch dài hạn lại làm việc ít thường xuyên hơn. Nó có thể phải
mất vài phút để tạo một tiến trình mới trong hệ thống. Trong khi đó, bộ
lập lịch ngắn hạn chỉ mất vài chục mini giây. Hệ thống lập lịch dài hạn
điều khiển mức độ đa chương trình (số lượng tiến trình trong bộ nhớ).
Chuyển ngữ cảnh
Việc chuyển CPU sang phục vụ cho một tiến trình khác đòi hỏi phải
lưu lại trạng thái của tiến trình cũ và nạp các trạng thái đã được ghi của
tiến trình mới. Nhiệm vụ này được gọi là chuyển ngữ cảnh (Context Switch
Phạm Ngọc Hưng
45
Quản lý tiến trình
- CS). Khi xuất hiện sự chuyển đổi ngữ cảnh, nhân hệ thống sẽ lưu lại ngữ
cảnh của tiến trình cũ trong PCB của nó và nạp ngữ cảnh đã được cất giữ
của tiến trình mới được lập lịch để thực hiện. Thời gian chuyển ngữ cảnh
là một thời gian vô nghĩa, vì hệ thống sẽ không làm được gì trong khảng
thời gian này. Tuỳ thuộc vào tốc độ bộ bộ nhớ và số lượng thanh ghi phải
sao chép mà thời gian này có thể được thay đổi. Thông thường, tốc độ
đạt trong khoảng từ 1 đến 100 micro giây.
Thời gian chuyển ngữ cảnh cao hay thấp thuỳ thuộc vào sự hỗ trợ
phần cứng máy tính. Ví dụ, một số bộ xử lý (như Sun UltraSPARC) cung
cấp nhiều tập các thanh ghi. Việc chuyển ngữ cảnh chỉ đơn thuần là
chuyển con trỏ đến tập thanh ghi hiện thời, tốc độ chuyển ngữ cảnh sẽ
diễn ra nhanh hơn.
4.3. Sự thực hiện của các tiến trình
Các tiến trình trong hệ thống có thể thực hiện song song, và chúng
phải được tạo và xoá một cách tự động. Vì vậy, hệ điều hành phải cung
cấp một một cơ chế (khả năng) cho phép tạo và kết thúc các tiến trình.
Tạo các tiến trình
Một tiến trình có thể tạo nhiều tiến trình mới bằng lời gọi hệ thống
tạo tiến trình. Tiến trình thực hiện việc tạo ra một tiến trình được gọi là
tiến trình cha. Tiến trình được tạo ra gọi là tiến trình con của tiến trình đã
thực hiện việc tạo tiến trình đó. Đến lượt tiến trình mới, nó lại có thể tạo
ra các tiến trình con của nó. Theo cách này, một cây tiến trình sẽ xuất
hiện trong quá trình thực hiện của các tiến trình.
Một tiến trình cần tới các tài nguyên như thời gian CPU, bộ nhớ, các
file, các thiết bị vào ra để hoàn thành công việc của mình. Khi một tiến
trình con được tạo, tiến trình đó có thể nhận tài nguyên trực tiếp từ hệ
điều hành, hoặc có thể buộc phải chia sẻ một phần tài nguyên của tiến
trình cha. Tiến trình cha phải chia sẻ các phần tài nguyên của nó cho các
tiến trình con.
Khi một tiến trình được tạo nó nhận bổ sung nhiều tài nguyên logic
và vật lý khởi tạo dữ liệu những điều này có thể được tiến trình cha
chuyển cho.
46
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
Ví dụ :
Một tiến trình con có chức năng hiện thị trạng thái của một file
được gọi là F1 trên mà hình của thiết bị đầu cuối. Khi nó được tạo nó sẽ
tiếp nhận, như là một đầu vào từ tiến trình cha tên của file F1, và nó sẽ
thực hiện việc phân tích các thông tin của file đó. Nó cũng có thể lấy tên
của thiết bị ra. Một vài hệ điều hành chuyển các tài nguyên cho các tiến
trình con.
Khi một tiến trình tạo ra một tiến trình con mới, hai khả năng tồn
tại trong thời gian thực hiện:
-
-
-
Tiến trình cha tiếp tục thực hiện song song với tiến trình con
của nó.
Tiến trình cha đợi cho đến khi một số hoặc tất cả các tiến trình
con đã kết thúc mới tiếp tục thực hiện.
Vì vậy cũng có hai đặc tính đối với các tiến trình con về không
gian địa chỉ:
-
-
Tiến trình con là một bản sao của tiến trình cha.
Tiến trình con có một chương trình được nạp vào cho nó.
Kết thúc tiến trình
Khi một tiến trình kết thúc nó sẽ ngừng quá trình thực hiện và yêu cầu
hệ thống xoá nó bằng cách sử dụng lời gọi hệ thống ”thoát”. Ở thời điểm
đó tiến trình có thể trả lại dữ liệu cho tiến trình cha của nó. Tất cả các
tài nguyên của tiến trình (bao gồm bộ nhớ vật lý, bộ nhớ ảo, các file
được mở và bộ đệm vào ra) đều được hệ điều hành giải phóng.
Một tiến trình cha có thể kết thúc quá trình thực hiện của các tiến
trình con của nó bởi một số lý do ví dụ như:
- Tiến trình con đã xâm phạm một số các tài nguyên. Điều này đòi
hỏi tiến trình cha phải có kỹ thuật để nhận biết trang thái của các tiến
trình con.
-
Nhiệm vụ được giao cho tiến trình con không cần thiết nữa.
Phạm Ngọc Hưng
47
Quản lý tiến trình
Tiến trình cha kết thúc và hệ điều hành không cho phép các tiến
-
trình con được kết thúc nếu như tiến trình cha của nó được kết
thúc.
4.4. Tiến trình cộng tác
Trong khi các tiến trình thực hiện song song trong hệ thống, chúng
có thể là các tiến trình độc lập hoặc cộng tác với nhau. Một tiến trình được
gọi là độc lập nếu nó không thể ảnh hưởng hoặc bị ảnh hưởng bởi sự hoạt
động của các tiến trình khác trong hệ thống. Một cách rõ ràng hơn các
tiến trình không chia sẻ bất cứ dữ liệu gì với những tiến trình độc lập
khác. Trong khi đó, một tiến trình gọi là cộng tác nếu như nó có thể ảnh
hưởng hoặc bị ảnh hưởng bởi sự thực hiện của các tiến trình khác trong
hệ thống. Nói khác đi, các tiến trình chia sẻ dữ liệu của mình với các tiến
trình cộng tác khác.
Chúng ta có thể mong muốn hỗ trợ một môi trường cho phép các
tiến trình cộng tác hoạt động vì một số lý do sau:
-
Chia sẻ các thông tin: một số người dung có thể truy nhập vào
cùng một phần thông tin (ví dụ như một file dùng chung),
chúng ta phải cung cấp một môi trường truy nhập song song tới
các kiểu tài nguyên đó.
-
Tăng tốc độ tính toán: để công việc tính toán thực hiện nhanh
hơn chúng ta phải chia một nhiệm vụ thành nhiều nhiệm vụ nhỏ
hơn, mỗi nhiệm vụ có thể thực hiện song song với các nhiệm vụ
khác.
-
-
Tính linh hoạt
Hiệu quả: chỉ với một người dùng cũng có thể thực hiện nhiều
công việc trong cùng một thời điểm
4.5. Giao tiếp trong các hệ thống khách chủ
Sử dụng Socket
Một socket là một thiết bị truyền thông hai chiều tương tự như tập
tin, chúng ta có thể đọc hay ghi lên nó, tuy nhiên mỗi socket là một thành
phần trong một mối nối nào đó giữa các máy trên mạng máy tính và các
48
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
thao tác đọc/ghi chính là sự trao đổi dữ liệu giữa các ứng dụng trên nhiều
máy khác nhau.
Sử dụng socket có thể mô phỏng hai phương thức liên lạc trong
thực tế : liên lạc thư tín (socket đóng vai trò bưu cục) và liên lạc điện
thoại (socket đóng vai trò tổng đài) .
Các thuộc tính của socket:
- Domain: định nghĩa dạng thức địa chỉ và các nghi thức sử dụng.
Có nhiều domaines, ví dụ UNIX, INTERNET, XEROX_NS, ...
- Type: định nghĩa các đặc điểm liên lạc:
a) Sự tin cậy
b) Sự bảo toàn thứ tự dữ liệu
c) Lặp lại dữ liệu
d) Chế độ nối kết
e) Bảo toàn giới hạn thông điệp
f) Khả năng gởi thông điệp khẩn
Để thực hiện liên lạc bằng socket, cần tiến hành các thao tác ::
- Tạo lập hay mở một socket
- Gắn kết một socket với một địa chỉ
- Liên lạc : có hai kiểu liên lạc tùy thuộc vào chế độ nối kết:
Sử dụng lời gọi thủ tục từ xa
Một trong số các kiểu dịch vụ từ xa phổ biến nhất là mô hình RPC
(Remote Procedure Calls). Mô hình này được thiết kế theo cách trừu
tượng hoá các kỹ thuật gọi thủ tục giữa các hệ thống với kết nối mạng.
Ý nghĩa của RPCs là cho phép một máy khách có thể yêu cầu một
thủ tục trên một máy chủ từ xa như nó có thể yêu cầu một thủ tục cục
bộ. Hệ thống RPC thực hiện việc này bằng cách cung cấp một stub phía
máy khách. Thông thường thì mỗi một thủ tục từ xa có một stub riêng.
Khi máy khách yêu cầu đến một thủ tục từ xa, hệ thống RPC sẽ gọi stub
tương ứng, chuyển các tham số được cung cấp cho thủ tục từ xa. Stub
này sẽ tìm cổng trên máy dịch vụ và kết nối các tham số. Các tham số
được đóng gói theo khuôn mẫu thích hợp và truyền đi qua một mạng.
Stub truyền thông điệp đến máy dịch vụ bằng phương pháp gửi thông
Phạm Ngọc Hưng
49
Quản lý tiến trình
điệp. Tương tự, stub trên máy dịch vụ sau khi nhận được thông điệp này
sẽ yêu cầu đến thủ tục trên máy dịch vụ. Nếu cần thiết, giá trị trả lại sẽ
được gửi về cho máy khách bằng kỹ thuật tương tự.
5. Luồng
5.1. Giới thiệu
Luồng, đôi khi còn được gọi là Lightweight process (LWP) hay tiểu
trình, là một đơn vị cơ bản ứng dụng của CPU; nó bao gồm một chỉ số
luồng (thread ID), một bố đếm chương trình, một tập thanh ghi và một
ngăn xếp. Nó chia sẻ với các luồng khác liên quan đến cùng một xử lý.
Một tiến trình truyền thống (heavyweight) có một luồng điều khiển. Nếu
một tiến trình có nhiều luồng điều khiển, nó có thể thực hiện được nhiều
việc trong cùng một thời điểm.
Các tiến trình tạo thành những thực thể độc lập. Mỗi tiến trình có
một tập tài nguyên và một môi trường riêng (một con trỏ lệnh, một Stack,
các thanh ghi và không gian địa chỉ). Các tiến trình hoàn toàn độc lập với
nhau, chỉ có thể liên lạc thông qua các cơ chế thông tin giữa các tiến trình
mà hệ điều hành cung cấp. Ngược lại, các tiểu trình trong cùng một tiến
trình lại chia sẻ một không gian địa chỉ chung, điều này có nghĩa là các
tiểu trình có thể chia sẻ các biến toàn cục của tiến trình. Một tiểu trình có
thể truy xuất đến cả các stack của những tiểu trình khác trong cùng tiến
trình. Cấu trúc này không đòi hỏi một cơ chế bảo vệ nào, và điều này
cũng không thật cần thiết vì các tiểu trình trong cùng một tiến trình thuộc
về cùng một chủ sỡ hữu đã tạo ra chúng trong ý định cho phép chúng
hợp tác với nhau.
Động cơ để phát triển đa luồng
Rất nhiều các gói phần mềm chạy trên mô hình máy tính để bàn là
đa luồng. Một chương trình thông thường được thực hiện như một tiến
trình riêng biệt với vài luồng điều khiển. Một trình duyệt web có thể có
một luồng hiển thị các tranh ảnh trong khi đó lại có một luồng khác đang
nhận dữ liệu từ mạng. Một trình xử lý văn bản có thể có một luồng hiển
50
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
thị đồ hoạ, trong khi luồng khác đang nhận phím được gõ từ người dùng,
luồng thứ 3 lại đang tiến hành kiểm tra lỗi chính tả phía sau.
Tất nhiên là trong một số trường hợp, một ứng dụng đơn luồng có
thể thực nhiều nhiệm vụ tương tự. Ví dụ một trình dịch vụ web, nó chấp
nhận các yêu cầu về các trang web, tranh ảnh, âm thanh,... từ phía người
dùng. Một trình dịch vụ web đang bận nó có thể đang phải xử lý đến hàng
trăm các yêu cầu của nhiều người dùng trong cùng một thời điểm. Nếu
trình dịch vụ web chạy như một tiến trình đơn luồng truyền thống thì nó
chỉ có thể đáp ứng được yêu cầu của một máy khách trong một thời điểm.
Khi đó các máy khách khác phải chờ đợi. Thời gian các máy khách phải
chờ đợi có thể rất lớn.
Một giải pháp để xử lý cho trình dịch vụ đơn luồng chấp nhận nhiều
yêu cầu là khi nhận được yêu cầu, server tạo ra một tiến trình mới để dáp
ứng yêu cầu đó. Trong thực tế, giải pháp tạo tiến trình mới đã được sử
dụng phổ biến trước khi các luồng trở lên phổ biến. Giải pháp tạo tiến
trình mới cho mỗi dịch vụ như vậy sẽ khiến cho hệ thống phải chịu một tải
trọng rất lớn. Trong khi đó, một tiến trình đa luồng có thể đáp ứng được
yêu cầu này rất dẽ dàng mà không phải lãng phí nhiều tài nguyên của hệ
thống.
Lợi ích của đa luồng
Lợi ích của lập trình đa luồng có thể được chia thành 4 nhóm sau:
- Đáp ứng nhanh (Responsveness): Đa luồng một ứng dụng tương
tác cho phép một chương trình tiếp tục chạy trong khi một phần của nó bị
ngăn cản hoặc đang thực hiện một xử lý kéo dài, bằng cách ấy khả năng
đáp ứng yêu cầu người dùng được gia tăng.
- Chia sẻ tài nguyên: Mặc định, các tiến trình chia sẻ bộ nhớ và các
nguồn tài nguyên của các tiến trình có liên quan. Lợi ích của đoạn mã chia
sẻ là nó cho phép một ứng dụng có một vài luồng khác nhau cùng hoạt
động trong một không gian địa chỉ.
- Kinh tế: Cấp phát bộ nhớ, tài nguyên cho một tiến trình được tạo
ra là cả một chi phí đáng kể. Thay vào đó, các luồng chia sẻ tài nguyên
Phạm Ngọc Hưng
51
Quản lý tiến trình
của tiến trình có liên quan, điều đó sẽ kinh tế hơn trng việc tạo và chuyên
đổi ngữ cảnh các luồng. Thời gian để tạo ra một tiến trình lớn hơn so với
thời gian để tạo ra một luồng và chuyển ngữ cảnh. Trong hệ thống Solaris
2, tạo ra một tiến trình chậm hơn đến 30 lần so với việc tạo ra một luồng,
chuyển ngữ cảnh chậm hơn khoảng 5 lần.
- Khai thác được các hệ thống đa xử lý: Lợi ích của đa luồng lại
càng được gia tăng trong các hệ thống đa xử lý. Trong hệ thống này các
luồng có thể được thực hiện song song, mỗi luồng trên một bộ xử lý
riêng. Trong khi đó, một tiến trình đơn luồng chỉ khai thác được một bộ
xử lý.
Các luồng người dùng và luồng nhân hệ thống
Sự hỗ trợ các luồng có thể hoặc là mức người dùng, luồng người
dùng (user threads), hoặc mức nhân hệ thống (kernel), luồng nhân hệ
thống (kernel threads).
User threads là một hỗ trợ bên trên kernel, và được thực hiện bằng
một thư viện luồng tại mức người dùng (user level). Thư viện này cung
cấp các hỗ trợ cho việc tạo luồng, lập lịch, và quản lý các luồng không
được hỗ trợ từ kernel.
Kernel threads được hỗ trợ trực tiếp bởi hệ điều hành. Kernel thực
hiện việc tạo luồng, lập lịch và quản lý các luồng trong không gian của
kernel. Các luồng này được tạo và quản lý bởi hệ điều hành nên thường
tạo và quản lý chậm hơn so với luồng người dùng.
5.2. Các mô hình đa luồng
Mô hình nhiều-một
Mô hình này ánh xạ nhiều luồng người dùng vào một luồng nhân.
Quản lý luồng được thực hiện trong không gian người dùng nên khá hiệu
quả, nhưng toàn bộ tiến trình sẽ khị khoá nếu có một luồng tạo ra một lời
gọi hệ thống bị cấm. Trong mô hình này, chỉ một luồng có thể truy nhập
kernel trong một thời điểm.
52
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
user thread
kernel thread
Hình 5.1: Mô hình nhiều-một
Mô hình một-một
Mô hình này ánh xạ mỗi một luồng của người dùng với một luồng
nhân. Nó gia tăng khả năng chạy song song so với mô hình nhiều-một
bằng cách cho phép các luồng khác có thể chạy trong khi một luồng tạo
ra một lời gọi hệ thống bị cấm. Nó cũng cho phép nhiều luồng chạy song
song trên các đa xử lý. Trong mô hình này, số luồng được tạo ra là hạn
chế. Windows NT, Windows 2000 và OS/2 thực hiện trong mô hình này.
user thread
kernel thread
Hình 5.2: Mô hình một-một
Phạm Ngọc Hưng
53
Quản lý tiến trình
Mô hình nhiều-nhiều
Mô hình này dồn nhiều các luồng mức người dùng vào một số
lượng tương ứng hoặc nhỏ hơn các luồng nhân. Mô hình này cho phép tạo
ra nhiều luồng với số lượng tuỳ thích. Solaris 2, IRIX, HP-UX, Tru64 UNIX
hỗ trợ mô hình này.
user thread
kernel thread
Hình 5.3: Mô hình nhiều-nhiều
5.3. Luồng trong Window 2000
Một ứng dụng trong windows được thực hiện như một tiến trình
riêng biệt, mỗi tiến trình có thể có nhiều luồng. windows 2000 sử dụng
mô hình một-một.
Các thành phần chính của một luồng bao gồm:
- Thread UD: xác định duy nhất luồng
- Tập các thanh ghi: thể hiện trạng thái của bộ xử lý
- Ngăn xếp người dùng: được sử dụng khi thực hiện trong chế độ
người dùng
- Vùng lưu trữ riêng: được sử dụng bởi nhiểu các run-time libraries
và dynamic link libraries.
Tập các thanh ghi, ngăn xếp và vùng lưu trữ riêng cho biế ngữ
cảnh của luồng, là một cấu trúc chỉ định phần cứng mà hệ điều hành dang
chạy. Cấu trúc dữ liệu chính của một luồng bao gồm:
ETHREAD (execitive thread block)
54
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
KTHREAD (kernel thread block)
TEB (thread environment block)
Các thành phần của ETHREAD bao gồm một con trỏ trỏ tới tiến
trình liên quan đến luồng và địa chỉ đoạn mã luồng bắt đầu thực hiện.
Ngoài ra nó còn chứa một con trỏ trỏ đến KTHREAD.
KTREAD bao gồm các thông tin về sự lập lịch và đồng bộ cho
luồng. Ngoài ra nó còn chứa ngăn xếp kernel (được sử dụng khi luồng
chạy trong chế độ kernel) và một con trỏ trỏ đến TEB.
ETHREAD và KTHREAD tồn tại trong không gian kernel, điều đó có
nghĩa là kernel có thể truy nhập đến chúng. TEB là một cấu trúc dữ liệu
trong không gian người dùng, nó được truy nhập bởi luồng chạy trong chế
độ người dùng. Các trường trong TEB chứa ngằn xếp người dùng và một
mảng dữ liệu xác định của luồng.
5.4. Luồng trong Linux
Linux cho phép tạo ra các bản sao của tiến trình, ngoài khả năng
này, nó còn cho phép tạo ra nhiều tiến trình cùng chia sẻ một không gian
địa chỉ của tiến trình gọi. Việc cho phép chia sẻ không gian địa chỉ với tiến
trình cha của tiến trình được sao chép khá giống với nhiều luồng.
Sự chia sẻ không gia địa chỉ là cho phép bởi vì một tiến trình được
biểu diễn ở trong nhân của Linux. Một cấu trúc dữ liệu nhân duy nhất tồn
tại cho mỗi tiến trình trong hệ thống. Cấu trúc dữ liệu này không chỉ chứa
dữ liệu của tiến trình mà nó còn chứa một con trỏ trỏ đến cấu trúc khác
nơi mà dữ liệu này được lưu trữ.
5.5. Bài tập
1. Hãy đưa ra hai ví dụ cho thấy đa luồng cải thiện khả năng thực
hiện của hệ thống hơn đơn luồng.
2. Hãy đưa ra hai ví dụ cho thấy đa luồng không cải thiện khả năng
thực hiện của hệ thống hơn đơn luồng.
3. Hai sự khác nhau giữa luồng mức người dùng và luồng mức hệ
thống là gì?
4. Những tài nguyên nào được sử dụng khi một luồng được tạo ra?
Phạm Ngọc Hưng
55
Quản lý tiến trình
6. Lập lịch CPU
6.1. Các khái niệm cơ bản
CPU-I/O Burst Cycle
Sự thành công của việc lập lịch cho CPU phụ thuộc vào các đặc tính
của tiến trình được chú ý đến. Sự thực hiện của các tiến trình bao gồm
một chu kỳ thực hiện CPU và đợi vào ra. Một tiến trình thực hiện bắt đầu
với một CPU Burst, tiếp theo là một I/O Burst, rồi lại đến CPU Burst và cứ
tiếp tục như vậy. CPU Burst cuối cùng sẽ kết thúc quá trình thực hiện của
tiến trình với một lời gọi hệ thống kết thúc tiến trình.
....
CPU
Burst
I/O
Burst
CPU
Burst
I/O
Burst
CPU
Burts
I/O
Burst
....
Đọc file
Đợi I/O
Ghi file
Đợi I/O
Đọc file
Đợi I/O
CPU Scheduler
Ngay khi CPU rỗi, hệ điều hành phải lựa chọn một tiến trình trong
hàng đợi sẵn sàng để thực hiện. Sự lựa chọn các tiến trình này được thực
hiện bằng bộ lập lịch ngắn hạn. Bộ lập lịch lựa chọn một trong số các tiến
trình trong bộ nhớ và cấp phát CPU cho nó.
Hàng đợi sẵn sàng không nhất thiết phải có dạng FIFO, mà nó có
thể là hàng đợi ưu tiên, một cây hoặc chỉ đơn giản là một danh sách liên
kết không sắp xếp. Tất cả các tiến trình trong hàng đợi sẵn sàng đều
được xếp hàng và chờ cơ hội được thực hiện. Các bản ghi trong hàng đợi
này thông thường là các PCBs của các tiến trình.
Preemptive Scheduling
Sự lập lịch CPU quyết định vào một trong 4 trường hợp sau:
- Khi một tiến trình chuyển từ trạng thái thực hiện sang trạng thái
chờ đợi (đợi I/O)
- Khi một tiến trình chuyển từ trạng thái thực hiện sang trạng thái
sẵn sàng (khi có ngắt)
- Khi một tiến trình chuyển từ trạng thái chờ đợi sang trạng thái
sẵn sàng (hoàn tất I/O)
56
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
- Khi một tiến trình kết thúc
Ở các thời điểm 1 và 4 không được chọn trong thời gian lập lịch.
Với một tiến trình mới, nếu tồn tại trong hàng đợi sẵn sàng, nó phải được
chọn để thực hiện. Việc quyết định chọn lựa thường chỉ diễn ra ở thời
điểm 2 và 3.
Khi bộ lập lịch chỉ thực hiện ở thời điểm 1 và 4 thì sự lập lịch đó
được gọi là lược đồ nonpreemtive (không dừng), còn lại là lược đồ
preemtive (có dừng). Trong lược đồ không dừng, khi CPU được cấp phát
cho một tiến trình, tiến trình đó sẽ giữ CPU liên tục và chỉ trả lại khi kết
thúc hoặc chuyển sang trạng thái chờ đợi. Phương pháp lập lịch này được
sử dụng trong Microsoft Windows 3.1 và hệ điều hành Apple Macintosh.
Không may là lập lịch có dừng lại phải chấp nhận một chi phí. Hãy
xem xét trường hợp hai tiến trình cùng chia sẻ dữ liệu. Một tiến trình đang
cập nhật dữ liệu thì bị dừng và tiến trình thứ hai chạy. Tiến trình thứ hai
có thể lại đọc dữ liệu hiện đang ở trạng thái cập nhật giữa chừng (trạng
thái lấp lửng).
Dispatcher
Một thành phần khác liên quan đến chức năng lập lịch CPU đó là
Dispatcher. Dispatcher là một module trao quyền điều khiển CPU tới tiến
trình được lựa chọn bởi bộ lập lịch ngắn hạn. Chức năng này bao gồm:
- Chuyển ngữ cảnh
- Chuyển chế độ người dùng
- Chuyển đến vị trí thực hiện của chương trình người dùng để thực
hiện
Dispatcher làm việc càng nhanh càng tốt.
6.2. Các tiêu chuẩn lập lịch
Các thuật toán lập lịch khác nhau có các đặc điểm khác nhau. Việc
lựa chọn giải thuật sử dụng trong một tình huống cụ thể phải căn cứ vào
các đặc điểm của các thuật toán khác nhau. Rất nhiều các tiêu chuẩn đã
được để nghị để so sánh các giải thuật lập lịch cho CPU. Các đặc tính
được dùng để so sánh có thể tạo nên sự khác nhau đáng kể trong việc
xác định giải thuật tốt nhất. Các tiêu chuẩn bao gồm:
Phạm Ngọc Hưng
57
Quản lý tiến trình
- Khai thác CPU: làm cho CPU càng bận càng tốt, tính toán, xử lý
nhiều
- Thông suốt: CPU mắc bận trong suốt quá trình tiến trình thực
hiện cho đến khi tiến trình hoàn tất công việc. Một thước đo công việc là
số lượng tiến trình hoàn tất trên một đơn vị thời gian được gọi là
throughtput.
- Thời gian luân chuyển (quay vòng): tổng thời gian tiến trình phải
chờ bên được nạp vào bộ nhớ, chờ đợi, thực hiện CPU, thực hiện I/O
- Thời gian chờ đợi: tổng thời gian tiến trình phải chờ đợi trong
hàng đợi sẵn sàng
- Thời gian trả lời: là khoảng thời gian chờ đợi để có được sự bắt
đầu trả lời yêu cầu.
6.3. Các thuật toán lập lịch
Đến trước phục vụ trước (First come, first served)
Đây là thuật toán lập lịch CPU đơn giản nhất, gọi tắt là FCFS. Với
lược đồ này, tiến trình yêu cầu CPU đầu tiên sẽ được cấp phát CPU trước.
Việc cài đặt giải thuật này cũng khá đơn giản, chỉ cần dùng một hàng đợi
dạng FIFO. Khi một tiến trình được đưa vào hàng đợi sẵn sàng, PCB của
nó sẽ được liên kết vào cuối hàng đợi. Khi CPU rỗi, nó sẽ được cấp phát
cho tiến trình trên đầu hàng đợi. Tiến trình đang chạy sau đó sẽ bị loại bỏ
khỏi hàng đợi.
Thời gian chờ đợi trung bình của chính sách FCFS nói chung là khá
dài. Hãy xem xét tập các tiến trình đến vào thời điểm 0 sau, với độ dài
CPU-burst time là mini giây:
Process
P1
Burst time
24
3
P2
P3
3
58
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
Nếu các tiến trình đến theo trật tự: P1,P2,P3 và được phục vụ theo
thứ tự FCFS biểu đồ Gantt thể hiện như sau:
P1 P2
P3
0
24
27
30
- Thời gian chờ đợi của P1: 0 mini giây
- Thời gian chờ đợi của P2: 24 mini giây
- Thời gian chờ đợi của P3: 27 mini giây
Thời gian chờ đợi trung bình: (0+24+27)/3=17 mini giây
Nếu các tiến trình này đến theo trật tự: P2, P3, P1 thì
P2
0
P3
3
P1
6
30
Thời gian chờ đợi trung bình: (6+0+3)/3=3 mini giây
Lập lịch hàng đợi nhiều mức
Trong quá trình thực hiện, hệ thống có thể có nhiều loại tiến trình
khác nhau. Có tiến trình chạy với giao diện trên Desktop, có tiến trình
chạy Background. Các tiến trình này có mức ưu tiên khác nhau. Tiến trình
chạy trên Desktop thường có mức ưu tiên cao hơn tiến trình chạy
background. Để đáp ứng tốt nhất cho các loại tiến trình này, cần thiết
phải có một thuật toán lập lịch khác có quan tâm tới mức ưu tiên của các
tiến trình.
Thuật toán lập lịch cho nhiều mức hàng đợi chia hàng đợi sẵn sàng
thành nhiều hàng đợi khác nhau. Các tiến trình được liên kết cố định vào
một hàng đợi nào đó dựa trên một số thông số đặc trưng như kích thước
bộ nhớ chiếm dụng, độ ưu tiên của tiến trình hoặc kiểu tiến trình. Mỗi
hàng đợi có một thuật toán lập lịch riêng. Thêm vào đó, cần phải có thuật
toán lập lịch giữa các hàng đợi.
Ví dụ: thuật toán lập lịch cho các hàng đợi với hệ thống có nhiều
hàng đợi như sau:
1. Các tiến trình hệ thống
2. Các tiến trình tương tác
3. Các tiến trình soạn thảo tương tác
Phạm Ngọc Hưng
59
Quản lý tiến trình
4. Các tiến trình xử lý gói
5. Các tiến trình người dùng
Tại mỗi hàng đợi có mức ưu tiên cao hơn so với hàng đợi bên dưới
nó. Mỗi hàng đợi được cung cấp một khoảng thời gian sử dụng CPU, sau
đó mỗi hàng đợi sẽ sử dụng thời gian này lập lịch cho các tiến trình trong
hàng đợi đó.
Trong giải thuật trên, các tiến trình được liên kết cố định tại một
hàng đợi, không được phép chuyển sang hàng đợi khác. Điều này làm
giảm tính linh hoạt của hệ thống. Khi một hàng đợi có ít tiến trình (do đã
có một số tiến trình hoàn tất công việc và kết thúc) khi đó thời gian dành
cho hàng đợi đó có thể bị lãng phí. Các tiến trình trong hàng đợi đó có
nhiều thời gian để thực hiện trong khi các tiến trình ở những hàng đợi
đông khác chỉ có ít thời gian thực hiện. Để giải quyết vấn đề này, người ta
cho phép điều chỉnh, sắp xếp lại các tiến trình ở các hàng đợi, chuyển tiến
trình qua lại giữa các hàng đợi để phân bố tải trọng đều cho các hàng đợi,
khai thác hiểu quả tài nguyên tính toán của hệ thống hơn. Giải thuật thực
hiện như vậy được gọi là giải thuật Mutilevel Feedback Queue. Thông
thường giải thuật này được định nghĩa bởi một số thông số sau:
- Số hiệu hàng đợi
- Thuật toán lập lịch cho mỗi hàng đợi
- Phương pháp sử dụng để xác định để chuyển một tiến trình lên
hàng đợi có mức ưu tiên cao hơn.
- Phương pháp sử dụng để xác định tiến trình cần chuyển đến hàng
đợi có mức ưu tiên thấp hơn
- Phương pháp xác định hàng đợi một tiến trình sẽ nhập vào khi
tiến trình cần dịch vụ
6.4. Lập lịch cho hệ thống đa xử lý
Có hai phương pháp để lập trình cho hệ thống có nhiều CPU:
- Mỗi CPU có một bộ lập lịch riêng, mỗi CPU có một số hàng đợi sẵn
sàng của mình và tự lựa chọn tiến trình trong đó để thực hiện. Với giải
pháp này có thể có hai tiến trình cùng cố gắng truy nhập vào một cấu trúc
60
Phạm Ngọc Hưng
Tải về để xem bản đầy đủ
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: Quản lý tiến trình - Phạm Ngọc Hưng", để 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:
- giao_trinh_he_dieu_hanh_chuong_2_quan_ly_tien_trinh_pham_ngo.pdf