Cấp phát khung trang
Vấn đề đặt ra là làm thế nào để cấp phát một vùng nhớ tự do có kích thước cố định cho các tiến trình khác nhau? Trong trường hợp đơn giản nhất của bộ nhớ ảo là hệ đơn nhiệm, có thể cấp phát cho tiến trình duy nhất của người dùng tất cả các khung trang ...
Vấn đề đặt ra là làm thế nào để cấp phát một vùng nhớ tự do có kích thước cố định cho các tiến trình khác nhau?
Trong trường hợp đơn giản nhất của bộ nhớ ảo là hệ đơn nhiệm, có thể cấp phát cho tiến trình duy nhất của người dùng tất cả các khung trang trống.
Vấn đề nảy sinh khi kết hợp kỹ thuật phân trang theo yêu cầu với sự đa chương : cần phải duy trì nhiều tiến trình trong bộ nhớ cùng lúc, vậy mỗi tiến trình sẽ được cấp bao nhiêu khung trang.
Số khung trang tối thiểu:
Với mỗi tiến trình, cần phải cấp phát một số khung trang tối thiểu nào đó để tiến trình có thể hoạt động. Số khung trang tối thiểu này được quy định bởi kiến trúc của của một chỉ thị.Khi một lỗi trang xảy ra trước khi chỉ thị hiện hành hoàn tất, chỉ thị đó cần được tái khởi động, lúc đó cần có đủ các khung trang để nạp tất cả các trang mà một chỉ thị duy nhất có thể truy xuất.
Số khung trang tối thiểu được qui định bởi kiến trúc máy tính, trong khi số khung trang tối đa được xác định bởi dung lượng bộ nhớ vật lý có thể sử dụng.
Các thuật toán cấp phát khung trang
Có hai hướng tiếp cận:
Cấp phát cố định:
Cấp phát công bằng: nếu có m khung trang và n tiến trình, mỗi tiến trình được cấp m /n khung trang.
Cấp phát theo tỷ lệ: tùy vào kích thước của tiến trình để cấp phát số khung trang :
si = kích thước của bộ nhớ ảo cho tiến trình pi
S = Σ si
m = số lượng tổng cộng khung trang có thể sử dụng
Cấp phát ai khung trang cho tiến trình pi: ai = (si / S) m
Cấp phát theo độ ưu tiên : sử dụng ý tưởng cấp phát theo tỷ lệ, nhưng nhưng số lượng khung trang cấp cho tiến trình phụ thuộc vào độ ưu tiên của tiến trình, hơn là phụ thuộc kích thước tiến trình:
Nếu tiến trình pi phát sinh một lỗi trang, chọn một trong các khung trang của nó để thay thế, hoặc chọn một khung trang của tiến trình khác với độ ưu tiên thấp hơn để thay thế.
Thay thế trang toàn cục hay cục bộ
Có thể phân các thuật toán thay thế trang thành hai lớp chính:
Thay thế toàn cục: khi lỗi trang xảy ra với một tiến trình , chọn trang « nạn nhân » từ tập tất cả các khung trang trong hệ thống, bất kể khung trang đó đang được cấp phát cho một tiến trình khác.
Thay thế cục bộ: yêu cầu chỉ được chọn trang thay thế trong tập các khung trang được cấp cho tiến trình phát sinh lỗi trang.
Một khuyết điểm của thuật toán thay thế toàn cục là các tiến trình không thể kiểm soát được tỷ lệ phát sinh lỗi trang của mình. Vì thế, tuy thuật toán thay thế toàn cục nhìn chung cho phép hệ thống có nhiều khả năng xử lý hơn, nhưng nó có thể dẫn hệ thống đến tình trạng trì trệ toàn bộ (thrashing).
Nếu một tiến trình không có đủ các khung trang để chứa những trang cần thiết cho xử lý, thì nó sẽ thường xuyên phát sinh các lỗi trang , và vì thế phải dùng đến rất nhiều thời gian sử dụng CPU để thực hiện thay thế trang. Một hoạt động phân trang như thế được gọi là sự trì trệ ( thrashing). Một tiến trình lâm vào trạng thái trì trệ nếu nó sử dụng nhiều thời gian để thay thế trang hơn là để xử lý !
Hiện tượng trì trệ này ảnh hưởng nghiêm trọng đến hoạt động hệ thống, xét tình huống sau :
Hệ điều hành giám sát việc sử dụng CPU.
Nếu hiệu suất sử dụng CPU quá thấp, hệ điều hành sẽ nâng mức độ đa chương bằng cách đưa thêm một tiến trình mới vào hệ thống.
Hệ thống có thể sử dụng thuật toán thay thế toàn cục để chọn các trang nạn nhân thuộc một tiến trình bất kỳ để có chỗ nạp tiến trình mới, có thể sẽ thay thế cả các trang của tiến trình đang xử lý hiện hành.
Khi có nhiều tiến trình trong hệ thống hơn, thì một tiến trình sẽ được cấp ít khung trang hơn, và do đó phát sinh nhiều lỗi trang hơn.
Khi các tiến trình phát sinh nhiều lỗi trang , chúng phải trải qua nhiều thời gian chờ các thao tác thay thế trang hoàn tất, lúc đó hiệu suất sử dụng CPU lại giảm
Hệ điều hành lại quay trở lại bước 1...
Theo kịch bản trên đây, hệ thống sẽ lâm vào tình trạng luẩn quẩn của việc giải phóng các trang để cấp phát thêm khung trang cho một tiến trình, và các tiến trình khác lại thiếu khung trang...và các tiến trình không thể tiếp tục xử lý. Đây chính là tình trạng trì trệ toàn bộ hệ thống. Khi tình trạng trì trệ này xảy ra, hệ thống gần như mất khả năng xử lý, tốc độ phát sinh lỗi trang tăng cao khủng khiếp, không công việc nào có thể kết thúc vì tất cả các tiến trình đều bận rộn với việc phân trang !
Để ngăn cản tình trạng trì trệ này xảy ra, cần phải cấp cho tiến trình đủ các khung trang cần thiết để hoạt động. Vấn đề cần giải quyết là làm sao biết được tiến trình cần bao nhiêu trang?
Mô hình cục bộ ( Locality) : theo lý thuyết cục bộ, thì khi một tiến trình xử lý, nó có khuynh hướng di chuyển từ nhóm trang cục bộ này đến nhóm trang cục bộ khác . Một nhóm trang cục bộ là một tập các trang đang được tiến trình dùng đến trong một khoảng thời gian. Một chương trình thường bao gồm nhiều nhóm trang cục bộ khác nhau và chúng có thể giao nhau.
Mô hình « tập làm việc » (working set)
Tiếp cận :
Mô hình working set đặt cơ sở trên lý thuyết cục bộ. Mô hình này sử dụng một tham số Δ , để định nghĩa một cửa sổ cho working set. Giả sử khảo sát Δ đơn vị thời gian (lần truy xuất trang) cuối cùng, tập các trang được tiến trình truy xuất đến trong Δ lần truy cập cuối cùng này được gọi là working set của tiến trình tại thời điểm hiện tại. Nếu một trang đang được tiến trình truy xuất đến, nó sẽ nằm trong working set, nếu nó không được sử dụng nữa , nó sẽ bị loại ra khỏi working set của tiến trình sau Δ đơn vị thời gian kể từ lần truy xuất cuối cùng đến nó. Như vậy working set chính là một sự xấp xỉ của khái niệm nhóm trang cục bộ.
Hình 2.30 Mô hình working set
Một thuộc tính rất quan trọng của working set là kích thước của nó. Nếu tính toán kích thước working set, WSSi, cho mỗi tiến trình trong hệ thống, thì có thể xem như :
D = Σ WSSi
với D là tổng số khung trang yêu cầu cho toàn hệ thống. Mỗi tiến trình sử dụng các trang trong working set của nó, nghĩa là tiến trình i yêu cầu WSSi khung trang. Nếu tổng số trang yêu cầu vượt quá tổng số trang có thể sử dụng trong hệ thống (D > m), thì sẽ xảy ra tình trạng trì trệ toàn bộ.
Sử dụng:
Hệ điều hành giám sát working set của mỗi tiến trình và cấp phát cho tiến trình tối thiểu các khung trang để chứa đủ working set của nó. Như vậy một tiến trình mới chỉ có thể được nạp vào hệ thống khi có đủ khung trang tự do cho working set của nó. Nếu tổng số khung trang yêu cầu của các tiến trình trong hệ thống vượt quá các khung trang có thể sử dụng, hệ điều hành chọn một tiến trình để tạm dừng, giải phóng bớt các khung trang cho các tiến trình khác hoàn tất.
Thảo luận:
Chiến lược working set đã loại trừ được tình trạng trì trệ trong khi vẫn đảm bảo mức độ đa chương của hệ thống là cao nhất có thể, cho phép sử dụng tối ưu CPU.
Điểm khó khăn của mô hình này là theo vết của các working set của tiến trình trong từng thời điểm. Có thể xấp xỉ mô hình working set với một ngắt đồng hồ sau từng chu kỳ nhất định và một bit reference:
phát sinh một ngắt đồng hồ sau từng T lần truy xuất bộ nhớ.
khi xảy ra một ngắt đồng hồ, kiểm tra các trang có bit reference là 1, các trang này được xem như thuộc về working set.
Một hệ thống sử dụng kỹ thuật phân trang theo yêu cầu thuần túy (một trang không bao giờ được nạp trước khi có yêu cầu truy xuất) để lộ một đặc điểm khá bất lợi : một số lượng lớn lỗi trang xảy ra khi khởi động tiến trình. Tình trạng này là hậu quả của khuynh hướng đạt tới việc đưa nhóm trang cục bộ vào bộ nhớ. Tình trạng này cũng có thể xảy ra khi một tiến trình bị chuyển tạm thời ra bộ nhớ phụ, khi được tái kích hoạt, tất cả các trang của tiến trình đã được chuyển lên đĩa phải được mang trở lại vào bộ nhớ, và một loạt lỗi trang lại xảy ra. Để ngăn cản tình hình lỗi trang xảy ra quá nhiều tại thời điểm khởi động tiến trình, có thể sử dụng kỹ thuật tiền phân trang (prepaging) : nạp vào bộ nhớ một lần tất cả các trang trong working set của tiến trình.
Tiếp cận:
Tần suất lỗi trang rất cao khiến tình trạng trì trệ hệ thống có thể xảy ra.
Khi tần suất lỗi trang quá cao, tiến trình cần thêm một số khung trang.
Khi tần suất lỗi trang quá thấp, tiến trình có thể sỡ hữu nhiều khung trang hơn mức cần thiết.
Có thể thiết lập một giá trị chặn trên và chặn dưới cho tần suất xảy ra lỗi trang, và trực tiếp ước lượng và kiểm soát tần suất lỗi trang để ngăn chặn tình trang trì trệ xảy ra :
Nếu tần suất lỗi trang vượt quá chặn trên, cấp cho tiến trình thêm một khung trang
Nếu tần suất lỗi trang thấp hơn chặn dưới, thu hồi bớt một khung trang từ tiến trình