Các trang cĩ kích thước cố định
Bộ nhớ vật lý tương ứng với trang gọi là page frame
Chuyển đổi địa chỉ thơng qua bảng trang, được đánh chỉ mục bằng page number
Mỗi mục tin trong bảng trang lưu một con số đại diện page frame mà trang đĩ ánh xạ tới và trạng thái của trang trong bộ nhớ
Trạng thái: valid/invalid, access permission, reference bit, modified bit, caching
Paging (1)
Hỗ trợ HĐH khắc phục bài tốn cấp phát bộ nhớ động và loại bỏ external fragmentation
Mơ hình Paging
KGĐC: Phân chia chương trình thành các page cĩ kích thước bằng nhau
KGVL ( bộ nhớ) được tổ chức thành các fixed partitions cĩ kích thước bằng nhau, gọi là frame
Page size = frame size
Nạp tiến trình:
Mỗi page cần được nạp vào 1 frame tự do
Các pages của cùng 1 chương trình cĩ thể được nạp vào những frames khơng kế cận nhau
Paging (3)
Địa chỉ logic: <page-number, offset>
Địa chỉ physic: <frame-number, offset>
Chuyển đổi địa chỉ: <p,d> <f,d>
Chuyển đổi địa chỉ vào thời điểm thi hành
MMU thi hành
Sử dụng Page table để luu thơng tin cấp phát BNC, làm cơ sở thực hiện ánh xạ địa chỉ
Mội tiến trình cĩ 1 page table
Page table
Số phần tử của Page table = số page trong KGĐC của chương trình Mỗi phần tử của bảng page table mơ tả cho 1 page, và cĩ cấu trúc:
Frame: số hiệu frame trong BNC chứa page
Lưu trữ page table?
Cache: khơng đủ
Paging (4)
Paging (6)
Bài tập : Một tiến trình được nạp vào bộ nhớ theo mơ hình phân trang với kích thước trang là 1024 byte. Bảng trang P F 0 1 1 4 2 2 3 6
Chuyển địa chỉ logic thành địa chỉ vật lý :
1642 3671 3671
1642 xác định p? d? 1642 div 1024 = 1 => p =1 1642 mod 1024 = 618 => d = 618 Xác định f ? Theo bảng trang : f =4 Xác định địa chỉ vật lý : 1642 => 4 * 1024 + 618 = 4714
3671 Xác định p? d? 3671 div 1024 = 3 => p =3 3671 mod 1024 = 599 =>d = 599 Xác định f ? F = 6 Xác định địa chỉ vật lý ? 3671 => 6 * 1024 + 599 = 6743
Paging (7)
NHẬN XÉT MƠ HÌNH PAGING
Loại bỏ
Dynamic Allocation
External Fragmentation
Hỗ trợ bảo vệ và chia sẻ ở mức page
Internal Fragmentation
Lưu trữ Page Table trong bộ nhớ
Tốn chỗ
Paging (8)
Lưu trữ Page table : tiết kiệm khơng gian
Sử dụng bảng trang đa cấp
Chỉ lưu thường trực bảng trang cấp 1, sau đĩ khi cần sẽ nạp bảng trang thích hợp
Sử dụng bảng trang nghịch đảo
Paging (11)
Bảng trang nghịch đảo :
Sử dụng duy nhất một bảng trang nghịch đảo cho tất cả các tiến trình
Mỗi phần tử trong bảng trang nghịch đảo mơ tả một frame cĩ cấu trúc
<page> : số hiệu page mà frame đang chứa <idp> : id của tiến trình đang sở hữu trang Địa chỉ ảo là <idp, p, d>
000 000 000 000 000 111 000 101 000 000 000 011 100 000 110 001 010 0 00 00 00 01 00 01 00 00 00 01 01 01 01 01 01 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Bảng trang Bit trạng thái 110 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
Giá trị trang ảo =2, cũng là chỉ mục của bảng trang 12 bit địa chỉ offset chép nguyên qua địa chỉ vật lý địa chỉ ảo (8196) địa chỉ vật lý (24580) Bảng trang 16-bit, Mỗi trang kích thước 4KB
Ví dụ bảng trang 2 cấp
Một địa chỉ logic (máy 32-bit kích thước trang 4K) được
chia thành:
Page number: 20 bits.
Page offset: 12 bits.
Vì bảng trang lại được phân trang, page number lại được
chia thành:
10-bit: page number.
Bảng trang nghịch đảo
Mục tiêu của bảng trang là để tìm ra trang vật lý tương ứng của từng trang ảo
Tuy nhiên, số lượng trang ảo rất lớn kích thước bảng trang cĩ thể chiếm một khơng gian lớn trên bộ nhớ
Ví dụ hệ thống 64-bit địa chỉ, kích thước mỗi trang là 4KB, vậy bảng trang cần 252 mẫu tin. Nếu mỗi mẫu tin 8 bytes thì bảng trang chiếm 30 triệu GB.
Bảng trang nghịch đảo
Mỗi mẫu tin dành cho 1 trang thật (frame) trên bộ nhớ.
Mỗi mẫu tin gồm địa chỉ ảo của trang, cùng với thơng tin về tiến trình đang dùng trang này. <pid, p>
Giảm bộ nhớ cần thiết để lưu mỗi trang, nhưng tăng thời gian để tìm bảng trang.
Giải quyết vấn đề địa chỉ ảo > địa chỉ VLý ntn?
Nếu khơng gian địa chỉ ảo của một tiến trình nhỏ hơn bộ nhớ vật lý thì khơng cĩ vấn đề gì
Chỉ lo giải quyết vấn đề phân mảnh
Khi bộ nhớ ảo của một tiến trình lớn hơn bộ nhớ vật lý
Một phần lưu trên bộ nhớ
Một phần lưu trên đĩa Giải quyết ntn?
Nạp trang theo yêu cầu
Để bắt đầu một tiến trình (chương trình), chỉ nạp trang chứa đoạn mã cho tiến trình bắt đầu thực thi
Khi tiến trình cĩ yêu cầu tới vùng nhớ (chứa lệnh hay dữ liệu) nằm ngồi trang đã nạp, thì nạp trang đĩ lên
Làm sao biểu diễn một trang của máy ảo mà nĩ chưa nạp lên bộ nhớ?
0 1 2 1 v i i A B C 0 1 2 3 A 0 1 2 B C VM
Lỗi trang
Điều gì xảy ra khi tiến trình yêu cầu một trang bị đánh dấu lỗi?
Trap lỗi trang
Kiểm tra cĩ phải truy xuất hợp lệ (cĩ trang vật lý đúng)
Tìm 1 frame bộ nhớ trống
Đọc trang cần thiết từ bộ nhớ phụ (ổ đĩa)
Đổi valid bit của trang thành v (hợp lệ)
Bắt đầu lại lệnh bị ngắt bởi trap
Lỗi trang (tt)
Các tình huống khi truy cập bộ nhớ?
Nếu TLB miss đọc mẫu tin trong bảng trang
Và nếu, lỗi trang (=>thay trang)
Và nếu, tất cả các frames đang dùng cần thu hồi một trang thay đổi giá trị trong bảng trang của tiến trình
Chi phí xử lý lỗi trang
Trap, kiểm tra bảng trang, tìm frame trống (hoặc tìm trang thay thế) … khoảng 200 - 600 s
Tìm và đọc trên đĩa … khoảng 10 ms
Truy cập bộ nhớ … khoảng 100 ns
Lỗi trang làm chậm thực thi khoảng ~100,000 lần!!!!!
Đĩ là chưa kể phát sinh cĩ thể xảy ra trong các bước trên Tốt nhất là khơng để xảy ra nhiều lỗi trang!
Nếu muốn sự ảnh hưởng ít hơn 10%, chỉ cho phép 1 lỗi trang trong 1,000,000 lần truy cập bộ nhớ
Thay trang
Nếu khơng cịn frame trống khi bị lỗi trang?
Lấy lại một frame đang được sử dụng
Chọn frame để thay thế (nạn nhân)
Lưu trang nạn nhân vào ổ đĩa
Cập nhật lại bảng trang (trang nạn nhân thành invalid)
Đọc trang cần thiết vào frame vừa chọn
Cập nhật lại bảng trang (trang vừa thay thế là valid)
Bắt đầu lại lệnh đã gây ra lỗi trang
Tối ưu hĩa: khơng phải ghi trang nạn nhân trở lại nếu như
nĩ vẫn chưa bị thay đổi (cần thêm dirty bit cho mỗi trang).
Thay trang
Khơng dễ dàng để tìm được chính sách thay thế trang tốt
Khi thu hồi một trang, làm sao chúng ta biết là trang tốt nhất cĩ thể giảm thiểu lỗi trang sau này?
Cĩ tồn tại thuật tốn thay thế trang tối ưu?
Nếu cĩ, thuật tốn thay thế trang tối ưu là gì?
Xem ví dụ sau:
Giả sử chúng ta cĩ 3 frames và chạy chương trình theo mẫu sau
7, 0, 1, 2, 0, 3, 0, 4, 2, 3
Thay thế trang FIFO First-in, First-out
Cơng bằng, thời gian mỗi trang trên bộ nhớ gần như tương đương nhau
Cĩ vấn đề gì khơng?
Cĩ phù hợp với yêu cầu của một chương trình? Cĩ hiệu quả với ví dụ của chúng ta?
Ví dụ khác FIFO
Reference string: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5