Professional Documents
Culture Documents
Vm-Smalltables Vietnamese Translated
Vm-Smalltables Vietnamese Translated
Vm-Smalltables Vietnamese Translated
Bây giờ chúng ta giải quyết vấn đề thứ hai mà quá trình phân trang gây
ra: bảng trang quá lớn và do đó tiêu tốn quá nhiều bộ nhớ. Hãy bắt đầu
với một bảng trang tuyến tính. Như bạn có thể nhớ lại1, các bảng trang
tuyến tính trở nên đẹp hơn
to lớn. Giả sử lại không gian địa chỉ 32 bit byte), với 4KB (212 byte)
(232
trang và một mục nhập bảng trang 4 byte. Do đó, không gian địa chỉ có khoảng
chừng
32
một triệu trang ảo trong đó (2 2Nhân
12 với kích thước mục nhập bảng trang và
bạn sẽ thấy bảng trang của chúng ta có kích thước 4MB. Hãy nhớ rằng: thông
thường chúng ta có một bảng trang cho mỗi quy trình trong hệ thống! Với hàng
trăm quy trình hoạt động (không phải là điều hiếm trên một hệ thống hiện đại),
chúng ta sẽ phải cấp phát hàng trăm megabyte bộ nhớ chỉ cho bảng trang! Kết
quả là, chúng ta đang tìm kiếm một số kỹ thuật để giảm gánh nặng nặng này. Có
rất nhiều kỹ thuật, vì vậy hãy bắt đầu. Nhưng trước tiên, hãy xem điểm quan
trọng của chúng ta:
CRUX: LÀM THẾ NÀO ĐỂ LÀM CHO BẢNG TRANG NHỎ HƠN?
Bảng trang dựa trên mảng đơn giản (thường được gọi là bảng trang
tuyến tính) quá lớn, chiếm quá nhiều bộ nhớ trên các hệ thống thông
thường. Làm thế nào chúng ta có thể làm cho bảng trang nhỏ hơn?
Những ý tưởng chính là gì? Những không hiệu quả phát sinh như một
kết quả của các cấu trúc dữ liệu mới này là gì?
1
2 PAGING: SMALLER TABLES
giảm bốn lần kích thước bảng trang (không ngạc nhiên, sự giảm này
chính xác phản ánh sự tăng gấp bốn lần kích thước trang).
Vấn đề chính của phương pháp này, tuy nhiên, là các trang lớn dẫn
đến lãng phí bên trong mỗi trang, một vấn đề được biết đến là sự phân
mảnh nội bộ (vì lãng phí nằm bên trong đơn vị phân bổ). Do đó, các
ứng dụng cuối cùng sẽ phân bổ các trang nhưng chỉ sử dụng một ít
mảnh nhỏ của mỗi trang, và bộ nhớ nhanh chóng đầy với những trang
quá lớn này. Do đó, hầu hết các hệ thống sử dụng kích thước trang
tương đối nhỏ trong trường hợp thông thường: 4KB (như trong x86)
hoặc 8KB (như trong SPARCv9). Vấn đề của chúng ta sẽ không được
giải quyết đơn giản như vậy, tiếc thay.
Hình 20.1: Một Không gian Địa chỉ Ảo 16KB với Trang 1KB
©
© 2008–23, ARPACI- 2008–
DUSSEAU 2008–23, ARPACI- 23,
ARPA
4 PAGING: SMALLER TABLES
15) được ánh xạ vào các trang vật lý 28 và 4, tương ứng. Như bạn có thể
thấy từ hình ảnh, hầu hết bảng trang không được sử dụng, đầy các mục
không hợp lệ. Thật lãng phí! Và điều này chỉ đối với một không gian địa
chỉ nhỏ 16KB. Hãy tưởng tượng bảng trang của một không gian địa chỉ
32-bit và tất cả không gian lãng phí tiềm năng trong đó! Thực ra, đừng
tưởng tượng một điều như vậy; nó quá ghê rợn.
Do đó, phương pháp lai của chúng tôi: thay vì có một bảng trang
duy nhất cho toàn bộ không gian địa chỉ của quá trình, tại sao không có
một bảng trang cho mỗi đoạn logic? Trong ví dụ này, chúng ta có thể có
ba bảng trang, một cho mã, heap và stack của không gian địa chỉ.
Bây giờ, hãy nhớ rằng với phân đoạn, chúng ta có một thanh ghi cơ
sở cho biết nơi mỗi phân đoạn sống trong bộ nhớ vật lý, và một thanh
ghi giới hạn cho biết kích thước của phân đoạn đó. Trong hệ thống lai
của chúng ta, chúng ta vẫn có những cấu trúc đó trong MMU; ở đây,
chúng ta sử dụng thanh ghi cơ sở không để trỏ đến phân đoạn chính mà
để giữ địa chỉ vật lý của bảng trang của phân đoạn đó. Thanh ghi giới
hạn được sử dụng để chỉ ra cuối của bảng trang (tức là số trang hợp lệ
mà nó có).
Hãy làm một ví dụ đơn giản để làm rõ. Giả sử có một không gian địa
chỉ ảo 32 bit với các trang 4KB và một không gian địa chỉ được chia
thành bốn đoạn. Chúng ta chỉ sử dụng ba đoạn cho ví dụ này: một đoạn
cho mã, một đoạn cho heap và một đoạn cho stack.
Để xác định địa chỉ tham chiếu đến đoạn nào, chúng ta sẽ sử dụng
hai bit đầu của không gian địa chỉ. Hãy giả sử 00 là đoạn không sử
dụng, 01 là đoạn mã, 10 là đoạn heap và 11 là đoạn stack. Do đó, một
địa chỉ ảo có dạng như sau:
33222222222211111111110000000000
10987654321098765432109876543210
Seg VPN Offset
Trong phần cứng, giả sử rằng có ba cặp cơ sở/giới hạn, mỗi cặp cho
mã, heap và stack. Khi một quá trình đang chạy, thanh ghi cơ sở cho
mỗi đoạn này chứa địa chỉ vật lý của một bảng trang tuyến tính cho
đoạn đó; do đó, mỗi quá trình trong hệ thống hiện có ba bảng trang liên
quan. Trong quá trình chuyển ngữ cảnh, các thanh ghi này phải được
thay đổi để phản ánh vị trí của các bảng trang của quá trình mới đang
chạy.
Khi xảy ra TLB miss (giả sử có TLB được quản lý bởi phần cứng, tức
là phần cứng chịu trách nhiệm xử lý TLB miss), phần cứng sử dụng các
bit đoạn (SN) để xác định cặp base và bounds nào được sử dụng. Sau
đó, phần cứng lấy địa chỉ vật lý trong đó và kết hợp với VPN như sau
để tạo thành địa chỉ của mục bảng trang (PTE).
SN = (Địa chỉ ảo & SEG_MASK) >> SN_SHIFT VPN = (Địa chỉ ảo
& VPN_MASK) >> VPN_SHIFT Địa chỉ của PTE = Base[SN] + (VPN
*sizeof(PTE))
Chuỗi này sẽ trông quen thuộc; nó hoàn toàn giống như những gì
chúng ta đã thấy trước đây với bảng trang tuyến tính. Sự khác biệt duy
nhất, tất nhiên, là việc sử dụng một trong ba thanh ghi cơ sở đoạn thay
vì chỉ sử dụng một thanh ghi cơ sở bảng trang duy nhất.
OPERATING
SYSTEMS WWW.OSTEP.ORG
[VERSION 1.10]
PHÂN TRANG: BẢNG NHỎ 5
HƠN SMALLER TABLES
Sự khác biệt quan trọng trong phương pháp lai của chúng tôi là sự
hiện diện của một thanh ghi giới hạn cho mỗi đoạn; mỗi thanh ghi giới
hạn chứa giá trị của trang hợp lệ tối đa trong đoạn. Ví dụ, nếu đoạn mã
đang sử dụng ba trang đầu tiên của nó (0, 1 và 2), bảng trang đoạn mã chỉ
có ba mục được cấp phát cho nó và thanh ghi giới hạn sẽ được đặt thành
3; việc truy cập bộ nhớ vượt quá cuối đoạn sẽ tạo ra một ngoại lệ và có thể
dẫn đến kết thúc quá trình. Theo cách này, phương pháp lai của chúng tôi
tiết kiệm bộ nhớ đáng kể so với bảng trang tuyến tính; các trang chưa
được cấp phát giữa ngăn xếp và vùng nhớ không cần thiết không còn
chiếm không gian trong bảng trang (chỉ để đánh dấu chúng là không hợp
lệ).
Tuy nhiên, như bạn có thể nhận thấy, phương pháp này không phải
là không có vấn đề. Đầu tiên, nó vẫn yêu cầu chúng ta sử dụng phân
đoạn; như chúng ta đã thảo luận trước đây, phân đoạn không linh hoạt
như chúng ta muốn, vì nó giả định một mẫu sử dụng cụ thể của không
gian địa chỉ; nếu chúng ta có một vùng nhớ heap lớn nhưng rải rác, ví
dụ, chúng ta vẫn có thể gặp phải nhiều lãng phí bảng trang. Thứ hai,
phương pháp lai này gây ra sự phân mảnh bên ngoài trở lại. Trong khi
hầu hết bộ nhớ được quản lý theo đơn vị kích thước trang, bảng trang
giờ đây có thể có kích thước tùy ý (theo bội số của PTE). Do đó, việc tìm
không gian trống cho chúng trong bộ nhớ phức tạp hơn. Vì những lý do
này, mọi người tiếp tục tìm cách cải thiện cách triển khai bảng trang
nhỏ hơn.
OPERATING
SYSTEMS WWW.OSTEP.ORG
[VERSION 1.10]
PHÂN TRANG: BẢNG NHỎ 7
HƠN SMALLER TABLES
valid
valid
prot
prot
PFN PFN PFN
1 rx 12 1 201 1 rx 12
PFN 200
PFN 201
PFN 204 PFN 203 PFN 202 PFN 201
1 rx 13 0 - 1 rx 13
0 - - 0 - 0 - -
1 rw 100 1 204 1 rw 100
0 - -
0 - - Bảng Thư Mục
- Trang [Trang 1 của PT: Chưa Được
0 -
- Cấp Phát]
0 -
0 - -
0 - -
0 - - [Trang 2 của PT: Chưa Được
0 - - Cấp Phát]
0 - - 0 - -
PFN 204
0 - - 0 - -
1 rw 86 1 rw 86
1 rw 15 1 rw 15
©
© 2008–23, ARPACI- 2008–
DUSSEAU 2008–23, ARPACI- 23,
ARPA
8 PAGING: SMALLER TABLES
Không có gì mã số
0000 0001 mã số
0000 0010 (miễn phí)
0000 0011 (miễn phí)
0000 0100 đống
đống
0000 0101
(miễn phí)
Không có gì
(miễn phí)
0000 0111
©
© 2008–23, ARPACI- 2008–
DUSSEAU 2008–23, ARPACI- 23,
ARPA
10 PAGING: SMALLER TABLES
(miễn phí)
(miễn phí)
ngăn xếp
ngăn xếp
Hình 20.4: Một không gian địa chỉ 16KB với trang 64 byte.
Do đó, bảng trang của chúng ta có kích thước 1KB (256 × 4 byte). Với
trang có kích thước 64 byte, bảng trang 1KB có thể chia thành 16 trang
64 byte; mỗi trang có thể chứa 16 PTEs.
Cái mà chúng ta cần hiểu bây giờ là cách sử dụng một VPN để truy
cập trước vào thư mục trang và sau đó vào trang của bảng trang. Hãy
nhớ rằng mỗi cái đều là một mảng các mục; do đó, tất cả những gì
chúng ta cần làm là tìm cách xây dựng chỉ mục cho mỗi cái từ các phần
của VPN.
Hãy trước tiên chỉ mục vào thư mục trang. Bảng trang của chúng ta
trong ví dụ này nhỏ: 256 mục nhập, phân bố trên 16 trang. Thư mục
trang cần một mục nhập cho mỗi trang của bảng trang; do đó, nó có 16
mục nhập. Kết quả là, chúng ta cần bốn bit của VPN để chỉ mục vào thư
mục; chúng ta sử dụng bốn bit đầu của VPN như sau:
VPN khoảng cách
13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPERATING
SYSTEMS WWW.OSTEP.ORG
[VERSION 1.10]
PHÂN TRANG: BẢNG NHỎ 11
HƠN SMALLER TABLES
VPN bù lại
13 12 11 10 9 8 7 6 5 4 3 2 1 0
Trang chỉ mục bảng trang (PTIndex cho ngắn gọn) sau đó có thể
được sử dụng để chỉ mục vào bảng trang chính nó, cho chúng ta địa chỉ
của PTE của chúng ta.
PTEAddr = (PDE.PFN << SHIFT) + (PTIndex* kích thước của PTE
Lưu ý rằng số khung trang nhận được từ mục thư mục trang phải
được dịch trái vào vị trí trước khi kết hợp với chỉ mục bảng trang để tạo
thành địa chỉ của PTE.
Để xem xem tất cả điều này có hợp lý không, chúng ta sẽ điền vào
một bảng trang đa cấp với một số giá trị thực tế và dịch một địa chỉ ảo
duy nhất. Hãy bắt đầu với bảng trang cho ví dụ này (phía trái của Hình
20.5).
Trong hình vẽ, bạn có thể thấy rằng mỗi mục lục thư mục trang
(PDE) mô tả một số thông tin về một trang của bảng trang cho không
gian địa chỉ. Trong ví dụ này, chúng ta có hai vùng hợp lệ trong không
gian địa chỉ (ở đầu và cuối), và một số ánh xạ không hợp lệ ở giữa.
Trong trang vật lý số 100 (số khung vật lý của trang 0 của bảng
trang), chúng ta có trang đầu tiên của 16 mục bảng trang cho 16 VPN
đầu tiên trong không gian địa chỉ. Xem Hình 20.5 (phần giữa) để biết
nội dung của phần này của bảng trang.
Trang này của bảng trang chứa các ánh xạ cho 16 VPN đầu tiên;
trong ví dụ của chúng ta, VPN 0 và 1 là hợp lệ (đoạn mã), như.
Figure 20.5: Một Thư Mục Trang Và Các Mảnh Của Bảng Trang
©
© 2008–23, ARPACI- 2008–
DUSSEAU 2008–23, ARPACI- 23,
ARPA
12 PAGING: SMALLER TABLES
là 4 và 5 (đống). Do đó, bảng có thông tin ánh xạ cho từng trang đó. Các
mục còn lại được đánh dấu không hợp lệ.
Trang hợp lệ khác của bảng trang được tìm thấy bên trong PFN 101.
Trang này chứa ánh xạ cho 16 VPN cuối cùng của không gian địa chỉ;
xem Hình 20.5 (phải) để biết chi tiết.
Trong ví dụ, VPN 254 và 255 (ngăn xếp) có ánh xạ hợp lệ. Hy vọng
rằng những gì chúng ta có thể thấy từ ví dụ này là có thể tiết kiệm được
bao nhiêu không gian với cấu trúc được lập chỉ mục nhiều cấp. Trong ví
dụ này, thay vì phân bổ đầy đủ 16 trang cho một bảng trang tuyến tính,
chúng tôi chỉ phân bổ ba trang: một cho thư mục trang và hai cho các
đoạn của bảng trang có ánh xạ hợp lệ. Mức tiết kiệm cho không gian địa
chỉ lớn (32 bit hoặc 64 bit) rõ ràng có thể lớn hơn nhiều.
Cuối cùng, hãy sử dụng thông tin này để thực hiện một bản dịch.
Đây là một địa chỉ liên quan đến byte thứ 0 của VPN 254: 0x3F80, hoặc.
11 1111 1000 0000 trong hệ nhị phân.
Hãy nhớ rằng chúng ta sẽ sử dụng 4 bit đầu của VPN để chỉ mục vào
bảng trang. Do đó, 1111 sẽ chọn mục cuối cùng (mục thứ 15, nếu bạn
bắt đầu từ mục thứ 0) của bảng trang phía trên. Điều này đưa chúng ta
đến một trang hợp lệ của bảng trang nằm tại địa chỉ 101. Sau đó, chúng
ta sử dụng 4 bit tiếp theo của VPN (1110) để chỉ mục vào trang đó của
bảng trang và tìm PTE mong muốn. 1110 là mục gần cuối cùng (mục
thứ 14) trên trang, và cho chúng ta biết rằng trang 254 của không gian
địa chỉ ảo của chúng ta được ánh xạ tại trang vật lý 55. Bằng cách ghép
nối PFN=55 (hoặc hex 0x37) với offset=000000, chúng ta có thể tạo thành
địa chỉ vật lý mong muốn và gửi yêu cầu đến hệ thống bộ nhớ:
PhysAddr = (PTE.PFN << SHIFT) + offset.
= 00 1101 1100 0000 = 0x0DC0.
Bạn nên hiểu cách xây dựng một bảng trang hai cấp, sử dụng một
thư mục trang để trỏ đến các trang của bảng trang. Rất tiếc, công việc
của chúng ta vẫn chưa hoàn thành. Như chúng ta sẽ thảo luận sau đây,
đôi khi hai cấp bảng trang không đủ!
OPERATING
SYSTEMS WWW.OSTEP.ORG
[VERSION 1.10]
PHÂN TRANG: BẢNG NHỎ 13
HƠN SMALLER TABLES
29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Điều bạn cũng có thể nhận thấy từ sơ đồ trên là có bao nhiêu bit 14
còn lại vào (lớn) thư mục trang: 14. Nếu thư mục trang của chúng ta có 2
mục (và PDE 4 byte), nó không chỉ trải dài trên một trang mà là 128, và
mục tiêu của chúng ta là làm cho mỗi phần của bảng trang đa cấp vừa
với một trang biến mất.
Để khắc phục vấn đề này, chúng ta xây dựng một cấp độ cây nữa,
bằng cách chia thư mục trang thành nhiều trang, sau đó thêm một thư
mục trang khác lên trên đó, để trỏ đến các trang của thư mục trang. Do
đó, chúng ta có thể chia địa chỉ ảo của chúng ta như sau:
VPN offset
29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Bây giờ, khi chỉ mục thư mục trang cấp cao, chúng ta sử dụng các bit
trên cùng của địa chỉ ảo (Chỉ số PD 0 trong sơ đồ); chỉ số này có thể
được sử dụng để lấy mục thư mục trang từ thư mục trang cấp cao. Nếu
hợp lệ, mức thứ hai của thư mục trang được tham khảo bằng cách kết
hợp số khung vật lý từ PDE cấp cao và
©
© 2008–23, ARPACI- 2008–
DUSSEAU 2008–23, ARPACI- 23,
ARPA
14 PAGING: SMALLER TABLES
OPERATING
SYSTEMS WWW.OSTEP.ORG
[VERSION 1.10]
PHÂN TRANG: BẢNG NHỎ 15
HƠN SMALLER TABLES
©
© 2008–23, ARPACI- 2008–
DUSSEAU 2008–23, ARPACI- 23,
ARPA
16 PAGING: SMALLER TABLES
OPERATING
SYSTEMS WWW.OSTEP.ORG
[VERSION 1.10]
PHÂN TRANG: BẢNG NHỎ 17
HƠN SMALLER TABLES
Câu hỏi
1. Với một bảng trang tuyến tính, bạn cần một thanh ghi duy nhất
để xác định bảng trang, giả sử phần cứng thực hiện việc tìm kiếm
khi có lỗi TLB. Bạn cần bao nhiêu thanh ghi để xác định một bảng
trang hai cấp? Một bảng ba cấp?
2. Sử dụng trình giả lập để thực hiện việc dịch các giá trị ngẫu nhiên
0, 1 và 2, và kiểm tra câu trả lời của bạn bằng cờ -c. Cần bao nhiêu
tham chiếu bộ nhớ để thực hiện mỗi tìm kiếm?
3. Dựa trên hiểu biết của bạn về cách bộ nhớ cache hoạt động, bạn
nghĩ tham chiếu bộ nhớ đến bảng trang sẽ hoạt động như thế nào
trong bộ nhớ cache? Liệu chúng có dẫn đến nhiều lần trúng cache
(và do đó truy cập nhanh)? Hay nhiều lần không trúng (và do đó
truy cập chậm)?
©
© 2008–23, ARPACI- 2008–
DUSSEAU 2008–23, ARPACI- 23,
ARPA