Professional Documents
Culture Documents
báo-cáo-kiến trúc máy tính
báo-cáo-kiến trúc máy tính
TRƯỜNG ĐIỆN-ĐIỆN TỬ
----------
Đề Tài :
Lời mở đầu
Trong những ngày đầu, máy tính đơn giản hơn nhiều. Các thành phần khác nhau của
hệ thống, chẳng hạn như CPU, bộ nhớ, bộ nhớ chung và giao diện mạng, được phát
triển cùng nhau và do đó, hiệu suất của chúng khá cân bằng. Ví dụ, bộ nhớ và giao
diện mạng không nhanh hơn (nhiều) so với CPU khi cung cấp dữ liệu
Ngày nay, Khi các lõi CPU trở nên nhanh hơn và nhiều hơn, yếu tố hạn chế đối với
hầu hết các chương trình hiện nay và sẽ là khả năng truy cập bộ nhớ trong một thời
gian. Các nhà thiết kế phần cứng đã đưa ra các kỹ thuật tăng tốc và xử lý bộ nhớ phức
tạp hơn bao giờ hết - chẳng hạn như bộ nhớ đệm của CPU.
Bài báo cáo này giải thích cấu trúc của hệ thống con bộ nhớ được sử dụng trên phần
cứng hàng hóa hiện đại, minh họa lý do tại sao bộ nhớ đệm CPU được phát triển, cách
chúng hoạt động và chương trình nên làm gì để đạt được hiệu suất tối ưu bằng cách sử
dụng chúng.
1. RAM
1.1 Tổng quát về RAM
RAM (viết tắt của Random Access Memory) là một loại bộ nhớ khả biến cho
phép truy xuất đọc-ghi ngẫu nhiên đến bất kỳ vị trí nào trong bộ nhớ dựa theo địa
chỉ bộ nhớ. Thông tin lưu trên RAM chỉ là tạm thời, chúng sẽ mất đi khi mất nguồn
điện cung cấp.
RAM là bộ nhớ chính của máy tính và các hệ thống điều khiển, để lưu trữ các
thông tin thay đổi đang sử dụng. Các hệ thống điều khiển còn sử dụng SRAM như
làm một thiết bị lưu trữ thứ cấp (secondary storage). Khi cần thiết thì bố trí một pin
nhỏ làm nguồn điện phụ để duy trì dữ liệu trong RAM. RAM có một đặc tính là
thời gian thực hiện thao tác đọc hoặc ghi đối với mỗi ô nhớ là như nhau, cho dù
đang ở bất kỳ vị trí nào trong bộ nhớ. Mỗi ô nhớ của RAM đều có một địa chỉ.
Thông thường, mỗi ô nhớ là một byte (8 bit); tuy nhiên hệ thống lại có thể đọc ra
hay ghi vào nhiều byte (2, 4, 8 byte) một lúc.
Bộ nhớ RAM có 4 đặc trưng sau:
Dung lượng bộ nhớ: Tổng số byte của bộ nhớ (nếu tính theo byte) hoặc là
tổng số bit trong bộ nhớ nếu tính theo bit.
Tổ chức bộ nhớ: Số ô nhớ và số bit cho mỗi ô nhớ
Thời gian thâm nhập: Thời gian từ lúc đưa ra địa chỉ của ô nhớ đến lúc đọc
được nội dung của ô nhớ đó.
Chu kỳ bộ nhớ: Thời gian giữa hai lần liên tiếp thâm nhập bộ nhớ.
Công thức tính băng thông (bandwidth) từ BUS Speed và BUS Width:
Bandwidth = (Bus Speed x Bus Width) / 8
Bandwidth là tốc độ tối đa RAM có thể đọc được trong một giây. Bandwidth
được ghi trên RAM là con số tối đa theo lý thuyết. Trên thực tế, bandwidth
thường thấp hơn và không thể vượt quá được con số theo lý thuyết.
Hình 2.7 cho thấy một chip DRAM ở mức rất cao.
Các ô DRAM được tổ chức thành các hàng và cột. Tất cả chúng đều có thể được
xếp thành một hàng nhưng khi đó chip DRAM sẽ cần một bộ phân kênh lớn. Với
cách tiếp cận mảng, thiết kế có thể sử dụng một bộ phân kênh và một bộ ghép kênh
có kích thước bằng một nửa số Đây là một khoản tiết kiệm rất lớn trên tất cả các
mặt. Trong ví dụ, các dòng địa chỉa0vàa1 thông qualựa chọn địa chỉ hàng(RAS)bộ
phân kênh chọn các dòng địa chỉ của toàn bộ hàng ô. Khi đọc, nội dung của tất cả
các ô do đó được cung cấp cholựa chọn địa chỉ cột(CAS)bộ ghép kênh. Dựa trên
các dòng địa chỉa2vàa3nội dung của một cột sau đó được cung cấp cho chân dữ
liệu của chip DRAM. Điều này xảy ra nhiều lần song song trên một số chip DRAM
để tạo ra tổng số bit tương ứng với độ rộng của bus dữ liệu
Để ghi, giá trị ô mới được đặt trên bus dữ liệu và khi ô được chọn bằng RAS và
CAS, giá trị này sẽ được lưu trữ trong ô đó. Một thiết kế khá đơn giản. Trong thực
tế - rõ ràng là - còn nhiều phức tạp hơn nữa. Cần có thông số kỹ thuật về độ trễ sau
khi có tín hiệu là bao nhiêu trước khi dữ liệu có sẵn trên bus dữ liệu để đọc. Các tụ
điện không tải ngay lập tức, như được mô tả trong phần trước. Tín hiệu từ các tế
bào rất yếu nên nó cần được khuếch đại. Để ghi, nó phải được chỉ định thời gian dữ
liệu phải có sẵn trên bus sau khi thực hiện RAS và CAS để lưu trữ thành công giá
trị mới trong ô (một lần nữa, dung lượng
1.5 Chi tiết kỹ thuật truy cập DRAM
Trong phần giới thiệu DRAM, chúng ta đã thấy rằng các chip DRAM ghép các
địa chỉ để tiết kiệm tài nguyên dưới dạng các chân địa chỉ. Chúng tôi cũng thấy
rằng việc truy cập các ô DRAM mất nhiều thời gian vì các tụ điện trong các ô đó
không phóng điện ngay lập tức để tạo ra tín hiệu ổn định; chúng tôi cũng thấy rằng
các ô DRAM phải được làm mới. Bây giờ là lúc để tổng hợp tất cả những điều này
lại với nhau và xem tất cả những yếu tố này quyết định cách thức truy cập DRAM
diễn ra như thế nào.
DRAM đồng bộ, như tên cho thấy, hoạt động liên quan đến nguồn thời gian. Bộ
điều khiển bộ nhớ cung cấp một xung nhịp, tần số xác định tốc độ của Front Side
Bus (FSB) - giao diện bộ điều khiển bộ nhớ được sử dụng bởi các chip DRAM.
Theo văn bản này, các tần số 800MHz, 1.066MHz hoặc thậm chí 1.333MHz có sẵn
với các tần số cao hơn (1.600MHz) sẽ được công bố cho thế hệ tiếp theo. Điều này
không có nghĩa là tần suất sử dụng trên xe buýt thực sự cao như vậy. Thay vào đó,
các xe buýt ngày nay được bơm gấp đôi hoặc bốn, có nghĩa là dữ liệu được vận
chuyển hai hoặc bốn lần mỗi chu kỳ. Số lượng bán cao hơn nên các nhà sản xuất
thích quảng cáo xe buýt 200MHz được bơm bốn như là một xe buýt 800MHz “hiệu
quả”
Đối với SDRAM ngày nay mỗi lần truyền dữ liệu bao gồm 64 bit - 8 byte. Do
đó, tốc độ truyền của FSB là 8 byte nhân với tần số bus hiệu dụng (6.4GB / s cho
bus 200MHz được bơm bốn). Nghe có vẻ nhiều nhưng đó là tốc độ bùng nổ, tốc độ
tối đa sẽ không bao giờ vượt qua được. Như chúng ta sẽ thấy bây giờ, giao thức để
nói chuyện với các mô-đun RAM có rất nhiều thời gian chết khi không có dữ liệu
nào có thể được truyền. Đó chính xác là thời gian chết mà chúng ta phải hiểu và
giảm thiểu để đạt được hiệu suất tốt nhất
Hình 2.8 cho thấy hoạt động trên một số đầu nối của mô-đun DRAM xảy ra ở ba
pha có màu khác nhau. Như thường lệ, thời gian trôi từ trái sang phải. Rất nhiều chi
tiết bị bỏ sót. Ở đây chúng ta chỉ nói về đồng hồ bus, tín hiệu RAS và CAS, địa chỉ
và bus dữ liệu. Một chu kỳ đọc bắt đầu với bộ điều khiển bộ nhớ làm cho địa chỉ
hàng có sẵn trên địa chỉ bus và hạ tín hiệu RAS. Tất cả các tín hiệu được đọc trên
cạnh lên của đồng hồ (CLK) nên không có vấn đề gì nếu tín hiệu không hoàn toàn
vuông miễn là nó ổn định tại thời điểm nó được đọc. Việc đặt địa chỉ hàng sẽ khiến
chip RAM bắt đầu chốt hàng được định địa chỉ. Tín hiệu CAS có thể được gửi sau
chu kỳ đồng hồ tRCD (RAS-to-CAS Delay). Địa chỉ cột sau đó được truyền bằng
cách làm cho nó có sẵn trên bus địa chỉ và hạ dòng CAS. Ở đây chúng ta có thể
thấy cách hai phần của địa chỉ (nhiều hơn hoặc ít hơn một nửa, không có ý nghĩa gì
khác) có thể được truyền qua cùng một bus địa chỉ.
Bây giờ việc định địa chỉ đã hoàn tất và dữ liệu có thể được truyền đi. Chip
RAM cần một thời gian để chuẩn bị cho việc này. Độ trễ thường được gọi là Độ trễ
CAS (CL). Trong Hình 2.8, độ trễ CAS là 2. Nó có thể cao hơn hoặc thấp hơn, tùy
thuộc vào chất lượng của bộ điều khiển bộ nhớ, bo mạch chủ và mô-đun DRAM.
Độ trễ cũng có thể có một nửa giá trị. Với CL = 2,5, dữ liệu đầu tiên sẽ có sẵn ở lần
đầu tiênrơiflmắt cá chân trong khu vực màu xanh.
Với tất cả sự chuẩn bị này để truy cập dữ liệu sẽ là lãng phí nếu chỉ chuyển một
từ dữ liệu. Đây là lý do tại sao các mô-đun DRAM cho phép bộ điều khiển bộ nhớ
chỉ định lượng dữ liệu được truyền. Thường thì sự lựa chọn là giữa 2, 4 hoặc 8 từ.
Điều này cho phép lấp đầy toàn bộ các dòng trong bộ nhớ đệm mà không cần trình
tự RAS / CAS mới. Bộ điều khiển bộ nhớ cũng có thể gửi tín hiệu CAS mới mà
không cần đặt lại lựa chọn hàng. Bằng cách này, các địa chỉ bộ nhớ liên tiếp có thể
được đọc hoặc ghi nhanh hơn đáng kể vì tín hiệu RAS không phải được gửi đi và
hàng không cần phải hủy kích hoạt (xem bên dưới). Giữ hàng “mở” là điều mà bộ
điều khiển bộ nhớ phải quyết định. Việc cố ý để nó mở mọi lúc có bất lợi với các
ứng dụng trong thế giới thực (xem [3]).x, ở đâuxlà một giá trị như 1 hoặc 2; nó sẽ
là 1 cho các mô-đun DRAM hiệu suất cao chấp nhận các lệnh mới mỗi chu kỳ)
Trong ví dụ này, SDRAM phát ra một từ mỗi chu kỳ. Đây là những gì thế hệ
đầu tiên làm. DDR có thể truyền hai từ mỗi chu kỳ. Điều này làm giảm thời gian
chuyển nhưng không thay đổi độ trễ. Ở hoàng tử ple, DDR2 hoạt động giống nhau
mặc dù trong thực tế, nó trông khác nhau. Không cần phải đi vào chi tiết ở đây.
Cần lưu ý rằng DDR2 có thể được sản xuất nhanh hơn, rẻ hơn, đáng tin cậy hơn và
tiết kiệm năng lượng hơn (xem [6] để biết thêm thông tin)các ô DRAM phải liên
tục được làm mới sau mỗi 64ms theo đặc điểm kỹ thuật của JEDEC (Hội đồng Kỹ
thuật Thiết bị Điện tử Chung).
2. Bộ nhớ Cache
2.1 Cache là gì?
Cache hay còn gọi là bộ nhớ đệm, bộ nhớ khay là một thành phần của cấu trúc
phân cấp của hệ thống bộ nhớ. Cache đóng vai trong trung gian, trung chuyển dữ
liệu từ bộ nhớ chính về CPU và ngược lại.
Hình 2. Lân cận về không gian trong không gian chương trình
Nguyên lý lân cận về không gian có thể phát biểu như sau: “Nếu một ô nhớ đang được
truy nhập thì xác xuất các ô nhớ liền kề với nó được truy nhập trong tương lai gần là
rất cao”. Lân cận về không gian thường được áp dụng cho nhóm lệnh hoặc dữ liệu có
tính tuần tự cao trong không gian chương trình. Do các lệnh trong một chương trình
thường tuần tự, cache có thể đọc cả khối lệnh từ bộ nhớ chính và khối lệnh đọc được
bao phủ cả các ô nhớ lân cận (neighbour cell) của ô nhớ đang được truy nhập (current
cell).
Khác với nguyên lý lân cận về không gian, nguyên lý lân cận về thời gian chú trọng
hơn đến tính lặp lại của việc truy nhập các mẩu thông tin trong một khoảng thời gian
tương đối ngắn. Có thể phát biểu nguyên lý này như sau: “Nếu một ô nhớ đang được
truy nhập thì xác xuất nó được truy nhập lại trong tương lai gần là rất cao”. Lân cận về
thời gian được áp dụng cho dữ liệu và nhóm các lệnh trong vòng lặp. Với các phần tử
dữ liệu, chúng được CPU cập nhập thường xuyên trong quá trình thực hiện chương
trình nên có tính lân cận cao về thời gian. Với các lệnh trong vòng lặp, chúng thường
được CPU thực hiện lặp đi lặp lại nhiều lần nên cũng có tính lân cận cao về thời gian;
nếu cache nạp sẵn khối lệnh chứa cả vòng lặp sẽ phủ được tính lân cận về thời gian
Hình 3. Lân cận về thời gian với việc thực hiện vòng lặp
2.2.3 Trao đổi dữ liệu giữa CPU – cache
Hình 4. Trao đổi dữ liệu giữa CPU với cache và bộ nhớ chính
CPU trao đổi dữ liệu với cache theo các đơn vị cơ sở như byte, từ và từ kép. Còn
cache trao đổi dữ liệu với bộ nhớ chính theo các khối, với kích thước 16, 32 hoặc
64 bytes. Sở dĩ CPU trao đổi dữ liệu với cache theo các đơn vị cơ sở mà không theo
khối do dữ liệu được lưu trong các thanh ghi của CPU – vốn có dung lượng rất hạn
chế. Vì vậy, CPU chỉ trao đổi các phần tử dữ liệu cần thiết theo yêu cầu của các
lệnh. Ngược lại, cache trao đổi dữ liệu với bộ nhớ chính theo các khối, mỗi khối
gồm nhiều byte kề nhau với mục đích bao phủ các mẩu dữ liệu lân cận theo không
gian và thời gian. Ngoài ra, trao đổi dữ liệu theo khối (hay mẻ) với bộ nhớ chính
giúp cache tận dụng tốt hơn băng thông đường truyền và nhờ vậy có thể tăng tốc độ
truyền dữ liệu.
Tthời gian truy nhập trung bình hệ thống nhớ tiệm cận thời gian truy nhập cache với
trường hợp cache đạt hệ số hit cao.
3. Bộ nhớ ảo
3.1. Tổng quan bộ nhớ ảo
Bộ nhớ ảo là một kĩ thuật quản lý bộ nhớ được thực hiện bởi phần mềm và phần
cứng. Nó sẽ liên kết địa chỉ ô nhớ được dùng bởi phần mềm, gọi là địa chỉ ảo, tới
địa chỉ vật lý trong bộ nhớ máy tính. Bộ nhớ chính được các tác vụ coi như là
những khoảng trống có địa chỉ liên tiếp hoặc tập hợp những vùng liên tiếp. Hệ điều
hành quản lý các ô địa chỉ ảo và sự phân vùng từ ổ nhớ thực đến ổ nhớ ảo. Phần
cứng phụ trách xử lý địa chỉ nằm trong CPU, thường được gọi tên là MMU (đơn vị
quản lý bộ nhớ), sẽ tự động chuyển địa chỉ ảo sang địa chỉ vật lý. Phần mềm nằm
trong hệ điều hành có thể tạo ra những vùng địa chỉ ảo nằm mở rộng khả năng lưu
trữ vật lý của bộ nhớ và từ đó chương trình sẽ có nhiều bộ nhớ hơn thực tế máy tính
có. Lợi ích quan trọng nhất của bộ nhớ ảo là đảm nhiệm giùm các ứng dụng quản lý
vùng bộ nhớ được chia sẻ, tăng độ an toàn cho các vùng nhớ và giúp chương trình
sử dụng nhiều bộ nhớ nhiều hơn bộ nhớ vật lý mà phần cứng máy tính có, dựa trên
kĩ thuật phân trang.
Đầu vào cho bản dịch địa chỉ được thực hiện bởi MMU là một địa chỉ ảo.
Thường có rất ít – nếu có hạn chế về giá trị của nó. Địa chỉ ảo là giá trị 32 bit trên
hệ thống 32 bit và giá trị 64 bit trên hệ thống 64 bit. Trên một số hệ thống, chẳng
hạn như x86 và x86-64, các địa chỉ được sử dụng thực sự liên quan đến một mức
hướng dẫn khác: các kiến trúc này sử dụng các phân đoạn chỉ đơn giản là tạo ra
một phần bù được thêm vào mọi địa chỉ logic.
Bộ nhớ ảo khiến cho việc lập trình ứng dụng dễ dàng hơn bởi chúng làm ẩn đi sự
phân mảnh bộ nhớ vật lý, bằng cách ủy thác cho kernel hệ điều hành sự quản lý
phân cấp bộ nhớ (loại bỏ việc chương trình máy tính tự xử lý việc sử dụng chồng ô
nhớ). Mỗi khi ứng dụng sử dụng không gian bộ nhớ được chỉ định bởi ứng dụng,
bộ nhớ ảo sẽ ngăn ngừa việc phân bố lại ô nhớ hoặc cho truy cập ô nhớ có địa chỉ
ảo tương ứng.
3.2. Simplest Address Translation (Dịch địa chỉ đơn giản nhất)
Phần quan trọng của bộ nhớ ảo là dịch địa chỉ ảo sang địa chỉ thực. MMU có thể
ánh xạ lại các địa chỉ trên cơ sở từng trang. Cũng giống như khi định địa chỉ các
dòng trong bộ nhớ cache, địa chỉ ảo được chia thành các phần riêng biệt. Những
phần này được sử dụng để lập chỉ mục thành các bảng khác nhau được sử dụng
trong việc xây dựng địa chỉ vật lý
Ngày nay, cấu trúc bảng trang phức tạp nhất bao gồm bốn cấp độ. Hình 3.2 cho
thấy các sơ đồ của việc triển khai như vậy. Trong ví dụ này, địa chỉ ảo được chia
thành ít nhất năm phần. Bốn trong số các phần này là các chỉ mục trong các thư
mục khác nhau. Thư mục cấp 4 được tham chiếu bằng cách sử dụng một thanh ghi
mục đích đặc biệt trong CPU. Nội dung của thư mục cấp 4 đến cấp 2 là tham chiếu
đến thư mục cấp thấp hơn tiếp theo. Nếu một mục nhập thư mục được đánh dấu là
trống thì rõ ràng nó không cần phải trỏ đến bất kỳ thư mục nào dưới đây. Bằng
cách này, cây bảng trang có thể thưa và nhỏ gọn. Các mục nhập của thư mục cấp 1,
giống như trong Hình 3.1, là một phần địa chỉ vật lý, cộng với dữ liệu phụ trợ như
quyền truy cập.
Để xác định địa chỉ vật lý tương ứng với một địa chỉ ảo, trước tiên bộ xử lý xác
định địa chỉ của thư mục cấp cao nhất. Địa chỉ này thường được lưu trong sổ đăng
ký. Sau đó, CPU lấy phần chỉ mục của địa chỉ ảo tương ứng với thư mục này và sử
dụng chỉ mục đó để chọn mục nhập thích hợp. Mục nhập này là địa chỉ của thư
mục tiếp theo, được lập chỉ mục bằng cách sử dụng phần tiếp theo của địa chỉ ảo.
Quá trình này tiếp tục cho đến khi đến thư mục cấp 1, lúc này giá trị của mục nhập
thư mục là phần cao của địa chỉ vật lý. Địa chỉ vật lý được hoàn thành bằng cách
thêm các bit bù trang từ địa chỉ ảo. Quá trình này được gọi là bước đi trên cây
trang. Một số bộ xử lý (như x86 và x86-64) thực hiện thao tác này trong phần cứng,
những bộ khác cần hỗ trợ từ HĐH. Mỗi tiến trình chạy trên hệ thống có thể cần cây
bảng trang riêng của nó. Có thể chia sẻ một phần cây nhưng trường hợp này là
ngoại lệ. Do đó, nó sẽ tốt cho hiệu suất và khả năng mở rộng nếu bộ nhớ của cây
bảng trang càng nhỏ càng tốt. Trường hợp lý tưởng cho việc này là đặt bộ nhớ đã
sử dụng gần nhau trong không gian địa chỉ ảo; địa chỉ vật lý thực tế được sử dụng
không quan trọng. Một chương trình nhỏ có thể có được bằng cách sử dụng chỉ một
thư mục ở mỗi cấp 2, 3 và 4 và một vài thư mục cấp 1. Trên x86-64 với 4kB trang
và 512 mục trên mỗi thư mục, điều này cho phép định địa chỉ 2MB với tổng số 4
thư mục (một cho mỗi cấp). 1GB bộ nhớ liền kề có thể được giải quyết bằng một
thư mục cho cấp 2 đến 4 và 512 thư mục cho cấp 1.
3.4. Tối ưu hóa bảng trang nhiều cấp
Tất cả các cấu trúc dữ liệu cho các bảng trang được lưu giữ trong bộ nhớ chính;
đây là nơi hệ điều hành xây dựng và cập nhật các bảng. Khi tạo quy trình hoặc thay
đổi bảng trang, CPU sẽ được thông báo. Các bảng trang được sử dụng để phân giải
mọi địa chỉ ảo thành địa chỉ thực bằng cách sử dụng hướng dẫn bảng trang được
mô tả ở trên. Thông tin thêm về vấn đề: ít nhất một thư mục cho mỗi cấp được sử
dụng trong quá trình phân giải một địa chỉ ảo. Điều này yêu cầu tối đa bốn quyền
truy cập bộ nhớ (cho một lần truy cập duy nhất bởi quá trình đang chạy), điều này
là chậm. Có thể coi các mục trong bảng thư mục này là dữ liệu bình thường và lưu
chúng vào bộ nhớ cache trong L1d, L2, v.v., nhưng điều này vẫn còn quá chậm. Từ
những ngày đầu tiên của bộ nhớ ảo, các nhà thiết kế CPU đã sử dụng một cách tối
ưu hóa khác. Một phép tính đơn giản có thể cho thấy rằng chỉ giữ các mục của
bảng thư mục trong L1d và bộ nhớ cache cao hơn sẽ dẫn đến hiệu suất khủng
khiếp. Mỗi phép tính địa chỉ tuyệt đối sẽ yêu cầu một số truy cập L1d tương ứng
với độ sâu của bảng trang. Các truy cập này không thể song song vì chúng phụ
thuộc vào kết quả tra cứu trước đó. Riêng điều này, trên máy có bốn cấp bảng
trang, cần ít nhất 12 chu kỳ. Thêm vào đó là xác suất bỏ lỡ L1d và kết quả là không
có gì mà đường dẫn lệnh có thể che giấu. Các truy cập L1d bổ sung cũng đánh cắp
băng thông quý giá vào bộ nhớ đệm.
Vì vậy, thay vì chỉ lưu vào bộ đệm các mục trong bảng thư mục, việc tính toán
hoàn chỉnh địa chỉ của trang vật lý sẽ được lưu vào bộ đệm. Vì lý do tương tự mà
mã và bộ nhớ cache dữ liệu hoạt động, việc tính toán địa chỉ được lưu trong bộ nhớ
cache như vậy có hiệu quả. Vì phần bù trang của địa chỉ ảo không đóng vai trò nào
trong việc tính toán địa chỉ trang vật lý, nên chỉ phần còn lại của địa chỉ ảo được sử
dụng làm thẻ cho bộ nhớ cache. Tùy thuộc vào kích thước trang, điều này có nghĩa
là hàng trăm hoặc hàng nghìn hướng dẫn hoặc đối tượng dữ liệu chia sẻ cùng một
thẻ và do đó cùng một tiền tố địa chỉ thực.
Bộ nhớ đệm mà các giá trị đã tính được lưu trữ được gọi là Bộ đệm xem xét bản
dịch (TLB). Nó thường là một bộ nhớ cache nhỏ vì nó phải cực kỳ nhanh. Các CPU
hiện đại cung cấp bộ đệm TLB nhiều cấp, giống như các bộ nhớ đệm khác; các bộ
nhớ đệm cấp cao hơn lớn hơn và chậm hơn. Kích thước nhỏ của L1TLB thường
được bù đắp bằng cách làm cho bộ nhớ cache được kết hợp hoàn toàn với chính
sách loại bỏ LRU. Gần đây, bộ nhớ cache này đã tăng kích thước và trong quá trình
này, đã được thay đổi để được đặt thanh liên kết. Do đó, nó có thể không phải là
mục nhập cũ nhất bị loại bỏ và thay thế bất cứ khi nào phải thêm mục nhập mới.
Như đã lưu ý ở trên, thẻ được sử dụng để truy cập TLB là một phần của địa chỉ ảo.
Nếu thẻ có khớp trong bộ nhớ cache, địa chỉ vật lý cuối cùng sẽ được tính bằng
cách thêm phần bù trang từ địa chỉ ảo vào giá trị được lưu trong bộ nhớ cache. Đây
là một quá trình rất nhanh; nó phải có vì địa chỉ vật lý phải có sẵn cho mọi lệnh sử
dụng địa chỉ tuyệt đối và, trong một số trường hợp, đối với tra cứu L2 sử dụng địa
chỉ vật lý làm khóa.
3.5. Tác động của ảo hóa
Ảo hóa hình ảnh hệ điều hành sẽ ngày càng trở nên phổ biến hơn; điều này có
nghĩa là một lớp xử lý bộ nhớ khác được thêm vào hình ảnh. Ảo hóa các quy trình
(về cơ bản là nhà tù) hoặc vùng chứa hệ điều hành không thuộc loại này vì chỉ có
một hệ điều hành có liên quan. Các công nghệ như Xen hoặc KVM cho phép – có
hoặc không có sự trợ giúp từ quá trình thực thi các hình ảnh hệ điều hành độc lập.
Trong những tình huống này, chỉ có một phần mềm duy nhất kiểm soát trực tiếp
quyền truy cập vào bộ nhớ vật lý.
Trong trường hợp của Xen (xem Hình 4.4) Xen VMM là phần mềm đó. Tuy nhiên,
VMM không thực hiện nhiều điều khiển phần cứng khác. Không giống như các
VMM trên các hệ thống khác, trước đó (và phiên bản đầu tiên của Xen VMM),
phần cứng bên ngoài bộ nhớ và bộ xử lý được điều khiển bởi miền Dom0 đặc
quyền. Hiện tại, về cơ bản đây là nhân giống như nhân DomU không đặc quyền và
liên quan đến việc
xử lý bộ nhớ, chúng không khác nhau. Điều quan trọng ở đây là VMM phân phối
bộ nhớ vật lý cho các nhân Dom0 và DomU, sau đó thực hiện xử lý bộ nhớ thông
thường như thể chúng đang chạy trực tiếp trên một bộ xử lý.
Để thực hiện việc phân tách các miền cần thiết cho quá trình ảo hóa hoàn tất, ghi
nhớ xử lý ory trong hạt nhân Dom0 và DomU khôngkhông phải có quyền truy cập
không hạn chế vào bộ nhớ vật lý. VMM không cung cấp bộ nhớ bằng cách cung
cấp các trang vật lý riêng lẻ và cho phép các hệ điều hành khách xử lý địa chỉ; điều
này sẽ không cung cấp bất kỳ sự bảo vệ nào chống lại các miền khách bị lỗi hoặc
giả mạo. Thay vào đó, VMM tạo cây bảng trang riêng cho từng miền khách và cấp
bộ nhớ bằng cách sử dụng các cấu trúc dữ liệu này. Điều tốt là có thể kiểm soát
quyền truy cập vào thông tin quản trị của cây bảng trang. Nếu mã không có các đặc
quyền thích hợp, nó không thể làm bất cứ điều gì. Kiểm soát truy cập này được
khai thác trong ảo hóa mà Xen cung cấp, bất kể ảo hóa para- hay phần cứng (hay
còn gọi là đầy đủ) được sử dụng. Các miền khách xây dựng cây bảng trang của
chúng cho mỗi quá trình theo cách có chủ đích khá giống đối với ảo hóa phần cứng
và phần cứng. Bất cứ khi nào hệ điều hành khách sửa đổi các bảng trang của nó,
VMM sẽ được gọi. Sau đó, VMM sử dụng thông tin cập nhật trong miền khách để
cập nhật các bảng trang bóng của chính nó. Đây là các bảng trang thực sự được sử
dụng bởi phần cứng. Rõ ràng, quá trình này khá tốn kém: mỗi sửa đổi của cây bảng
trang yêu cầu một lệnh gọi VMM. Mặc dù những thay đổi đối với ánh xạ bộ nhớ
không hề rẻ nếu không có ảo hóa, chúng thậm chí còn trở nên đắt hơn bây giờ.
Các chi phí bổ sung có thể thực sự lớn, vì những thay đổi từ hệ điều hành khách
sang VMM và bản thân chúng đã khá tốn kém. Đây là lý do tại sao các bộ xử lý bắt
đầu có thêm chức năng để tránh việc tạo ra các bảng trang bóng. Điều này tốt
không chỉ vì lo ngại về tốc độ mà nó còn làm giảm mức tiêu thụ bộ nhớ của VMM.
Số lượng công việc cần thiết cho mỗi lần sửa đổi không gian địa chỉ là một vấn đề
với hệ điều hành ảo hóa. Tuy nhiên, có một vấn đề khác cố hữu trong ảo hóa dựa
trên VMM: không có cách nào để có hai lớp xử lý bộ nhớ. . Cách tiếp cận Xen của
việc sử dụng một VMM riêng biệt làm cho việc xử lý tối ưu (hoặc thậm chí tốt) trở
nên khó khăn vì tất cả các phức tạp của việc triển khai quản lý bộ nhớ, bao gồm cả
những thứ “tầm thường” như khám phá các vùng bộ nhớ, phải được sao chép trong
VMM. Hệ điều hành có triển khai đầy đủ và tối ưu hóa; một người thực sự muốn
tránh sao chép chúng.
Hình 4.5 cho thấy các phần mở rộng nhân Linux KVM cố gắng giải quyết vấn đề
như thế nào. Không có VMM riêng biệt chạy trực tiếp trên phần cứng và kiểm soát
tất cả các khách; thay vào đó, một nhân Linux bình thường đảm nhận chức năng
này. Điều này có nghĩa là chức năng xử lý bộ nhớ hoàn chỉnh và phức tạp trong
nhân Linux được sử dụng để quản lý bộ nhớ của hệ thống. Miền khách chạy cùng
với các quy trình cấp người dùng thông thường trong cái mà người sáng tạo gọi là
"chế độ khách". Chức năng ảo hóa, ảo hóa toàn phần hoặc toàn bộ, được kiểm soát
bởi KVM VMM. Đây chỉ là một quy trình cấp người dùng khác, xảy ra để kiểm
soát miền khách bằng cách sử dụng thiết bị KVM đặc biệt mà hạt nhân thực hiện.
Lợi ích của mô hình này so với VMM riêng biệt của mô hình Xen là, mặc dù vẫn
có hai trình xử lý bộ nhớ hoạt động khi hệ điều hành khách được sử dụng, chỉ cần
có một triển khai, đó là trong nhân Linux. Không cần thiết phải sao chép cùng một
chức năng trong một đoạn mã khác như Xen VMM. Điều này dẫn đến ít công việc
hơn, ít lỗi hơn và có lẽ, ít ma sát hơn khi hai trình xử lý bộ nhớ chạm vào nhau vì
trình xử lý bộ nhớ trong máy khách Linux đưa ra các giả định tương tự như trình
xử lý bộ nhớ trong nhân Linux bên ngoài chạy trên phần cứng trống. Nhìn chung,
các lập trình viên phải lưu ý rằng, với việc sử dụng ảo hóa, chi phí bỏ sót bộ nhớ
cache (lệnh, dữ liệu hoặc TLB) thậm chí còn cao hơn so với không ảo hóa. Bất kỳ
tối ưu hóa nào làm giảm công việc này sẽ mang lại hiệu quả nhiều hơn trong môi
trường ảo hóa.