Các kiểu bộ nhớ

Hầu hết máy tính được xây dựng sử dụng mô hình Von Neumann, với trung tâm là bộ nhớ. Chương trình thực thi quá trình được lưu trong bộ nhớ. Chúng ta biết bộ nhớ là cấu trúc logic như 1 dãy các điểm, với địa chỉ từ 0 đến tối đa kích thước bộ nhớ mà vi xử lý có thể đánh địa chỉ. Trong phần này chúng ta sẽ xem xét các loại bộ nhớ khác nhau và cách mà mỗi cái là một phần của hệ thống phân cấp bộ nhớ. Sau đó chúng ta sẽ xem xét một bộ nhớ đệm nhanh (1 bộ nhớ đặc biệt tốc độ cao) và phương thức tận dụng bộ nhớ tối đa của các bộ nhớ ảo thực thi thông qua phân trang.

Tại sao lại có nhiều loại bộ nhớ khác nhau như vậy? Đó là bởi vì công nghệ liên tục phát triển để cố gắng bắt kịp với các cải tiến trong thiết kế CPU – tốc độ của bộ nhớ phải theo kịp CPU hoặc bộ nhớ trở thành nút cổ chai. Trong những năm gần đây, chúng ta đã nhìn thấy rất nhiều cải tiến trong CPU. Như vậy bộ nhớ cũng phải phát triển để theo kịp được tốc độ của CPU, trong đó bộ nhớ chính là bộ nhớ chậm nhất. Nhưng việc cải tiến bộ nhớ chính để theo kịp với CPU không phải là vấn đề thực sự quan trọng bởi vì lợi ích của bộ nhớ đệm nhanh (*cache memory*) và phân cấp bộ nhớ (*THE MEMORY HIERARCHY*). Bộ nhớ đệm nhanh là một loại bộ nhớ nhỏ, tốc độ cao (đồng nghĩa với chi phí cao). Đó là loại bộ nhớ được sử dụng thường xuyên để truy cập dữ liệu. Việc bổ sung chi phí bằng cách sử dụng các công nghệ tiên tiến, nhanh chóng cho bộ nhớ không phải lúc nào cũng hợp lý bởi vì bộ nhớ chậm hơn có thể thường xuyên ẩn bởi hệ thống bộ nhớ đệm nhanh hiệu suất cao. Tuy nhiên, trước khi chúng ta thảo luận về bộ nhớ đệm nhanh, chúng ta sẽ giải thích các công nghệ bộ nhớ khác nhau.

Mặc dù có nhiều công nghệ bộ nhớ tồn tại nhưng chỉ có duy nhất 2 kiểu bộ nhớ cơ bản là RAM (*Random Access Memory*)và ROM (*Read Only Memory*). RAM là loại bộ nhớ đọc ghi. RAM là bộ nhớ mà một máy tính cần có. RAM được sử dụng để lưu trữ chương trình và dữ liệu cần thiết để máy tính có thể thực hiện các chương trình, nhưng RAM là bộ nhớ không ổn định và bị mất các thông tin khi điện bị ngắt. Hiện nay, có hai loại chip chính được chế tạo để sử dụng các loại RAM: Ram tĩnh và Ram động (*static* và *dynamic* RAM).

DRAM được xây dựng từ các tụ điện tí hon. DRAM đòi hỏi cung cấp điện năng liên tục mỗi vài mili giây để duy trì dữ liệu. SRAM thì ngược lại, duy trì nội dung cho tới khi chừng nào vẫn còn có điện. SRAM bao gồm các mạch tương tự. SRAM nhanh hơn và đắt hơn DRAM. Tuy nhiên người thiết kế sử dụng DRAM bởi vì nó có thể lưu trữ nhiều bit trên 1 chip, tiêu tốn ít điện năng, và tỏa nhiệt ít hơn SRAM. Vì những lý do đó, cả hai công nghệ này được kết hợp sử dụng: DRAM cho bộ nhớ chính và SRAM cho bộ nhớ cache. Hoạt động cơ bản của tất cả bộ nhớ DRAM đều tương tự nhau, nhưng vẫn có nhiều đặc thù.

Các loại DRAM: 
*''Multibank'' DRAM (MDRAM)
*''Fast-Page Mode'' (FPM) DRAM
*''Extended Data Out'' (EDO) DRAM
**Burst* EDO DRAM (BEDO DRAM)
**Synchronous Dynamic Random Access Memory* (SDRAM)
*''Synchronous-Link'' (SL) DRAM
*''Double Data Rate'' (DDR) SDRAM
*''Direct Rambus'' (DR) DRAM

Các loại SRAM: 
*SRAM đồng bộ
*SRAM không đồng bộ
**pipeline burst* SRAM

Ngoài bộ nhớ RAM, các máy tính còn chứa 1 bộ nhớ nhỏ ROM lưu trữ những thông tin quan trọng cần thiết cho hoạt động hệ thống. ROM ổn đinh và không bị mất dữ liệu. Loại bộ nhớ này cũng được sử dụng trong hệ thống nhúng hoặc bất cứ hệ thống nào nơi mà các chương trình không cần thay đổi. Nhiều gia dụng, đồ chơi, ô tô sử dụng ROM để duy trì thông tin khi điện bị ngắt. ROM cũng được sử dụng rộng rãi trong máy tính và các thiết bị ngoại vi như máy in laser, trong đó lưư trữ các font trong ROM. 
Các loại ROM cơ bản: 
**Programmable* ROM (PROM) – 1 biến thể của ROM có thể được lập trình bởi người sử dụng với các thiết bị phù hợp. Trong khi ROM được cài đặt bằng phần mềm thì PROM có thể cài đặt vào chương trình vào chip. Sau khi lập trình, dữ liệu và thông tin trong PROM không thể thay đổi.
*EPROM ''erasable'' PROM, là PROM có thể xoá đi và lập trình lại (yêu cầu một công cụ đặc biệt là tia cực tím). Để lập trình lại EPROM, toàn bộ chip trước tiên phải bị xoá hoàn toàn. 
*EEPROM *electrically erasable* PROM loại bỏ đi nhiều nhược điểm của EPROM, không cần công cụ đặc biệt để xoá (nó được thực thi bằng cách áp dụng một trường điện) và bạn chỉ có thể xoá các phần của chip, một byte tại 1 thời điểm. 
*Flash memory là bộ nhớ có thêm các tính năng như ghi hoặc xoá cả 1 khối, xoá bỏ 1 byte tại 1 thời điểm giới hạn. Điều này khiến *flash memory* nhanh hơn EEPROM.

## Phân cấp bộ nhớ

Một trong những điều quan trọng được quan tâm nhất trong sự hiểu biết khả năng hiệu suất của bộ nhớ hiện đại là bộ nhớ phân cấp. Không phải tất cả các bộ nhớ đều được tạo ra ngang nhau, một số kém hiệu quả hơn và rẻ hơn. Để giải quyết sự chênh lệch này, máy tính ngày nay kết hợp các kiểu bộ nhớ để cung cấp hiệu suất cao nhất với giá thành ít nhất. Cách tiếp cận này được gọi là bộ nhớ phân cấp. Bộ nhớ càng nhanh thì càng đắt. Bằng việc sử dụng bộ nhớ chia sẻ, với mỗi tốc độ truy cập và dung lượng khác nhau, 1 hệ thống máy tính có thể nâng cao hiệu suất trên cả khả năng có thể của chúng khi không kết hợp các loại khác nhau lại. Hệ thống bộ nhớ phân cấp bao gồm các thanh ghi, cache, bộ nhớ chính và bộ nhớ phụ.

Máy tính ngày nay có bộ nhớ nhỏ tốc độ cao gọi là cache, nơi mà dữ liệu được lưu trữ thường xuyên. Cache kết nối tới bộ nhớ lớn hơn - bộ nhớ chính, bộ nhớ có tốc độ tầm trung. Bộ nhớ này được bổ sung bới 1 bộ nhớ phụ, kết hợp với hard disk và các phương tiện có thể tháo dời khác nhau (various removable media). Bằng việc sử dụng hệ thống phân cấp, 1 bộ nhớ có thể nâng cao tốc độ truy cập, chỉ sử dụng một số nhỏ chip tốc độ nhanh. Nó cho phép người thiết kế tạo ra máy tính hiệu suất chấp nhận được với giá thành hợp lý.

Chúng ta phân loại bộ nhớ dựa trên "khoảng cách" từ nó tới bộ xử lý, với khoảng cách được định nghĩa bằng số vòng máy đòi hỏi để truy cập. Bộ nhớ càng gần bộ xử lý thì càng nhanh. Và ngược lại. Công nghệ chậm sẽ sử dụng bộ nhớ ở xa còn công nghệ nhanh sẽ sử dụng bộ nhớ gần bộ vi xử lý. Công nghệ càng tốt, bộ nhớ càng nhanh và càng đắt tiền. Bộ nhớ nhanh hơn thì sẽ nhỏ hơn bộ nhớ chậm và giá thành càng cao.

Dưới đây là những thuật ngữ được sử dụng khi miêu tả bộ nhớ phân cấp: 
* *Hit* – Dữ liệu yêu cầu ở 1 cấp độ bộ nhớ (thông thường, chúng ta quan tâm đến tỉ lệ hit chỉ cho bộ nhớ cấp cao hơn). 
* *Miss* – Dữ liệu yêu cầu không tìm thấy trong cấp độ bộ nhớ. 
* *Hit rate* – Tỉ lệ phần trăm truy cập bộ nhớ được tìm thấy trong 1 cấp độ bộ nhớ. 
* *Miss rate* – Tỉ lệ phần trăm truy cập bộ nhớ không được tìm thấy trong 1 cấp độ bộ nhớ. Note: Miss Rate = 1 – Hit Rate 
* *Hit time* – Số lần yêu cầu để truy cập thông tin yêu cầu trong 1 cấp độ bộ nhớ. 
* *Miss penalty* – Thời gian cần thiết để xử lý 1 miss, bao gồm thay thế 1 khối trong 1 cấp độ trên của bộ nhớ, cộng với thời gian đưa dữ liệu yêu cầu tới bộ xử lý. (Thời gian để xử lý 1 miss lớn hơn time xử lý 1 hit).

Đối với dữ liệu bất kì, bộ xử lý sẽ gửi yêu cầu của nó tới phần bộ nhớ nhanh nhất, nhỏ nhất (cache, bởi vì register dành cho mục đích đặc biệt hơn). Nếu dữ liệu được tìm thấy trong cache, nó sẽ nhanh chóng được đưa vào CPU. Nếu nó không ở trong cache, yêu cầu sẽ được gửi tới bộ nhớ thấp hơn trong hệ thống và quá trình tìm kiếm lại bắt đầu. Nếu dữ liệu được tìm thấy ở cấp độ này, một khối dữ liệu ở đó sẽ được đưa vào cache, và cứ thể tiếp tục. Ý tưởng chính ở đây là khi cấp độ thấp hơn của hệ thống phân cấp trả lời yêu cầu từ cấp độ cao hơn cho nội dung ở vị trí X, chúng cũng gửi đi cùng 1 thời điểm, dữ liệu được đặt ở địa chỉ X + 1, X + 2... Cứ như vậy, trả lại toàn bộ khối dữ liệu tới cấp độ bộ nhớ cao hơn. Hi vọng rằng dữ liệu thêm này sẽ được tham chiếu tới trong tương lai gần. Bộ nhớ chia sẻ thiết thực bởi vì các chương trình có xu hướng sở hữu 1 vùng biết đến cục bộ (locality), cái mà thường xuyên cho phép bộ xử lý truy cập tới dữ liệu được trả lại cho địa chỉ X+1, X+2... Vì vậy, mặc dù đó là 1 miss, vẫn có thể có một số hit trong bộ nhớ trên khối mới được truy xuất.

## Bộ nhớ đệm nhanh
Bộ xử lý máy tính rất nhanh và liên tục đọc thông tin từ bộ nhớ có nghĩa là nó phải chờ thông tin đến vì thời gian truy cập bộ nhớ chậm hơn tốc độ bộ xử lý. Một bộ nhớ đệm là bộ nhớ rất nhỏ, tạm thời và nhanh, cái mà bộ xử lý sử dụng để lấy thông tin mà nó cần trong một khơảng thời gian ngắn. Có rất nhiều ví dụ xung quanh chúng ta.

VD: Trong một ngôi nhà và những công cụ để trong gara và bạn cần sửa lại tầm hầm. Nó sẽ cần nhiều công cụ như: mũi khoan,  bộ vặn đai ốc, cưa, ốc vít... Việc đầu tiên bạn nghĩ tới là đo và cắt các tấm gỗ, bạn chạy ra ngoài gara lấy cái thước đo từ kho lưu trữ, chạy xuống tầm hầm đo gỗ rồi quay trở lại nhà xe. Bỏ cái thước dây và lấy cái cưa sau đó trở lại tầng hầm với cái cưa và cắt gỗ. Bạn quyết định vặn ốc vít nối các mảnh gỗ lại. Bạn chạy lại gara để lấy khoan quay xuống tần hầm, khoan các lỗ để đặt ốc vít trở lại nhà để xe lấy cái vặn ốc, sau đó phát hiện ra là sai kích thước trở lại nhà để xe lấy cái khác và chạy lại. Bạn có làm theo cách này không? Nếu cần một cái vặn ốc có lẽ sẽ cần nhiều kích cỡ khác nhau tại sao không lấy toàn bộ những cái vặn ốc. Tiến thêm một bước tại sao không lấy một gói nhỏ bao gồm các công cụ cần thiết vào tầng hầm. Nó sẽ nhanh hơn rất nhiều. Bạn chỉ cần có bộ nhớ đệm. Một công cụ để dễ dàng truy cập và sử dụng nhanh chóng! Những công cụ mà bạn đang có ít có khả năng hơn để sử dụng vẫn còn được lưu giữ trong một địa điểm đó là đi xa hơn và đòi hỏi nhiều thời gian hơn để truy cập vào.

Đây là tất cả những gì mà bộ nhớ đệm phải làm, nó lưu trữ dữ liệu được truy cập và dữ liệu có thể được truy cập bởi CPU nhanh hơn và gần gũi hơn bộ nhớ. Bộ nhớ cache làm việc trên cùng một nguyên tắc cơ bản như là các ví dụ trước bằng cách sao chép dữ liệu thường xuyên được sử dụng vào bộ nhớ cache hơn là một đòi hỏi quyền truy cập vào bộ nhớ chính, để lấy các dữ liệu.
Copy những dữ liệu cần sử dụng vào bộ đệm hơn là truy cập tới bộ nhớ chính để truy xuất dữ liệu. Bộ đệm có thể được tổ chức như cuốn sổ địa chỉ.

Kích cỡ của bộ nhớ cache bộ nhớ có thể khác nhau về độ lớn. Một điển hình của máy tính cá nhân cấp hai (L2) là bộ nhớ cache 256K hoặc 512K. Cấp bậc một (L1) là bộ nhớ cache nhỏ hơn, điển hình là 8K hay 16K. Bộ nhớ cache L1 soáng chung về việc xử lý, trong khi L2 cache soáng chung giữa CPU và bộ nhớ chính. Bộ nhớ cache L1 được, do đó, nhanh hơn bộ nhớ cache L2. Các mối quan hệ giữa L1 và L2 cache có thể được minh họa bằng cách sử dụng của chúng tôi cửa hàng Grocery ví dụ: Nếu các cửa hàng chính là bộ nhớ, bạn có thể xem xét tủ lạnh các L2 cache, và trên thực tế các bàn ăn bộ nhớ cache L1.
 
Mục đích của vùng đệm là tăng tốc độ truy cập bộ nhớ bằng cách lưu trữ các dữ liệu cần sử dụng với CPU thay vì lưu trong bộ nhớ chính. Dù kích cỡ của bộ nhớ đệm không lớn như bộ nhớ chính nhưng nó nhanh hơn. Bộ nhớ chính được tạo bằng DRAM với thời gian truy cập là 60ns.Còn bộ đệm được tạo bằng SRAM truy cập nhanh hơn DRAM với chu kỳ ngắn hơn (một điển hình của thời gian truy cập bộ nhớ cache là 10ns).

Cache hiện không cần phải quá lớn để thực hiện tốt. Một quy tắc chung của bộ nhớ đệm nhở đủ để cho tổng chi phí trung bình cho mỗi bit, gần đó là của chính bộ nhớ, nhưng đủ lớn để mang lại lợi ích. Vì bộ nhớ nhanh này là hơi đắt tiền, nó không khả thi để sử dụng công nghệ tìm thấy trong bộ nhớ cache bộ nhớ để xây dựng các bộ nhớ chính.

Điều gì làm cho bộ nhớ cache "đặc biệt"? Cache không được truy cập theo địa chỉ mà được truy cập theo nội dung. Vì lý do này, bộ nhớ cache đôi khi được gọi là CAM. Theo hầu hết các chương trình lập bản đồ bộ nhớ cache, bộ nhớ cache mục phải được kiểm tra hoặc tìm kiếm nếu giá trị được yêu cầu được lưu trong bộ nhớ cache. Để đơn giản hóa việc này, quá trình tìm những dữ liệu, lập bản đồ bộ nhớ đệm sử dụng các thuật toán khác nhau.

### Ánh xạ bộ nhớ đệm nhanh
Bộ nhớ đệm nhanh lưu trữ những dữ liệu có ích tuy nhiên nó sẽ trở thành vô ích nếu CPU không tìm thấy nó. Khi truy cập vào dữ liệu hoặc các tập lệnh, CPU lần đầu tiên tạo ra một địa chỉ bộ nhớ chính. Nếu dữ liệu đã được sao chép vào bộ nhớ cache, các địa chỉ của dữ liệu trong bộ nhớ cache không giống như là địa chỉ chính của bộ nhớ.
Ví dụ: dữ liệu được cấp phát tại địa chỉ trong bộ nhớ chính là 2E3 có thể được cấp phát rất sớm trong bộ nhớ đệm. Làm thế nào CPU tìm ra dữ liệu khi nó đã được sao chép vào bộ nhớ đệm? CPU sử dụng một chương trình ánh xạ "chuyển đổi" các địa chỉ của bộ nhớ chính vào một vị trí bộ nhớ cache.

Việc chuyển đổi đia chỉ được thực hiện bằng cách vào trong các bit trong bộ nhớ địa chỉ chính. Chúng tôi chia các bit ra làm hai phần riêng biệt gọi là các trường. Tùy thuộc vào chương trình ánh xạ, chúng tôi có thể có hai hoặc ba trường. Làm thế nào chúng tôi sử dụng các trường này phụ thuộc vào chương trình ánh xạ đang được sử dụng. Các chương trình ánh xạ xác định nơi mà các dữ liệu được đặt ban đầu khi nó được sao chép vào bộ nhớ cache và cũng có thể cung cấp một phương pháp cho CPU để tìm kiếm trước đó đã sao chép dữ liệu khi tìm kiếm bộ nhớ đệm.

Làm thế nào để chúng ta sử dụng được các trường trong bộ nhớ địa chỉ chính. Một trường trong bộ nhớ địa chỉ chính chỉ ra cho ta thấy cái dữ liệu ở bên trong nếu nó ở trong bộ nhớ cache goi là cache hit nếu không gọi là cache miss. Các khối đệm tham chiếu được kiểm tra nếu nó hợp lệ. Kết thúc nó sẽ đưa ra các bít tương ứng với mỗi khối đệm. Giá trị Bit không nghĩa là khối đệm đó không hợp lệ, và phải truy cập bộ nhớ chính. Bit một có nghĩa là hợp lệ. Sau đó chúng ta so sánh thẻ trong khối đệm tới các thẻ của địa chỉ. Nếu các thẻ giống nhau ta có thể tìm ra khối bộ đệm mong muốn (chúng tôi có một bộ nhớ cache hit). Lúc này chúng ta cần xác định từ mong muốn của khối. Tất cả các chương trình ánh xạ đều yêu cầu trường từ.

Ba chương trình ánh xạ bộ nhớ chính: 
* **Cache ánh xạ trực tiếp**
:Ánh xạ trực tiếp sử dụng tiếp cận module. Bởi vì có nhiều khối bộ nhớ chính hơn bộ nhớ đệm. Cần rõ ràng rằng các khối bộ nhớ chính cấp phát cho bộ nhớ đệm. Ánh xạ trực tiếp khối X của bộ nhớ chính tới khối Y của bộ nhớ đệm, mod N với N là tổng số khối trong bộ nhớ đệm.

:Cả hai khối '0', '10' đều trỏ tới khối '0' của khối '0' của bộ đệm làm thế nào để phân biệt. Cả hai khối đều được lưu trong bộ đệm và được nhận ra bằng các thẻ được khai báo trước.

:Để thực hiện ánh xạ trực tiếp các bit đại chỉ bộ nhớ chính được chia làm ba trường. Độ dài của mỗi khối phụ thuộc vào đặc điểm vật lý của bộ nhớ chính và đệm. Trường word hay offset chứa các từ để nhận dạng các khối và chứa số bit tương ứng. Khối '0' chứa word trong bộ nhớ chính và được nhận ra = 00000000.Khi một khối của bộ nhớ chính được copy vào bộ nhớ cache, trường tag chứa cái khối và mã để nhận ra khối này. Tổng cộng có ba trường

* **Bộ nhớ đệm nhanh kết hợp hoàn toàn** (*Fully Associative Cache*)

:Bộ nhớ đệm nhanh ánh xạ trực tiếp không đắt như các bộ đệm khác vì kịch bản ánh xạ không đòi hỏi bất kỳ sự tìm kiếm. Khi địa chỉ bộ nhớ chính được chuyển sang bộ nhớ đệm, CPU biết chính xác vị trí để tìm trong bộ đệm bằng cách kiểm tra đơn giản số bit trong các trường. Gần giống cuốn sổ địa chỉ các trang thường có chỉ mục theo alphabetic.

:Sử dụng ánh xạ tương đối địa chỉ bộ nhớ chính được chia ra làm hai phần: tag, word hình 6.8 trường word chứa ba bit nhưng trường tag là mười một bit. Khi bộ đệm được tìm kiếm, trường tag của bộ nhớ chính sẽ được so sánh với trường tag đúng của bộ đệm. Nếu không đúng ta sẽ có cache miss.

:Tạo bộ nhớ tương ứng: Bộ đệm tương đối nhanh, phức tạp nhưng nó rất đắt. Mặc dù ánh xạ trực tiếp không đắt nhưng nó rất hạn chế giới hạn bộ đệm sử dụng hỗ trợ chạy 1 chương trình sử dụng khối '0', khối '16' sau đó thực thi các câu lệnh. Bộ nhớ đệm nhanh kết hợp hoàn toàn cho phép một khối từ bộ nhớ chính có thể ở bất cứ đâu. Tuy nhiên nó yêu cầu thẻ lớn được chứa khối thêm vào đó yêu cầu phần cứng để tìm tất cả các khối của tạm thời.

* **Tạo bộ nhớ đệm nhanh tương ứng**
:Bộ nhớ đệm nhanh tương đối nhanh, phức tạp nhưng nó rất đắt. Mặc dù ánh xạ trực tiếp không đắt nhưng nó rất hạn chế giới hạn bộ đệm sử dụng hỗ trợ chạy một chương trình sử dụng khối '0', khối '16' sau đó thực thi các câu lệnh. Bộ nhớ đệm nhanh kết hợp hoàn toàn cho phép một khối từ bộ nhớ chính có thể ở bất cứ đâu. Tuy nhiên nó yêu cầu thẻ lớn được chứa khối thêm vào đó yêu cầu phần cứng để tìm tất cả các khối của tạm thời

:Ngoài ra còn chương trình ánh xạ thứ ba là *N-way set associative cache map-ping* kết hợp của hai phương pháp trên giống ánh xạ trực tiếp sử dụng địa chỉ để ánh xạ tới khối. Khác thay vì ánh xạ tới một khối đơn thì nó ánh xạ tới một tập các khối. Tất cả các khối phải có cùng kích cỡ

### Chính sách thay thế

Trong bộ đệm ánh xạ trực tiếp nếu có sự bất đồng giữa các khối đệm mà chỉ có một hành động có thể thực hiện. Khối đã tồn tại trong bộ đệm sẽ bị cho ra ngoài cache để tạo phòng cho khối mới. Tiến trình đó là sự thay thế. Với ánh xạ trực tiếp không cần chính sách thay thế vì việc cấp phát mỗi khối mới là xác định lại. Tuy nhiên với fully associative và tạo bộ đệm tương ứng thì cần có giả thuật thay thế để xác định khối bị loại khỏi cache.

### Thời gian truy cập hiệu quả

Hành động phân cấp bộ nhớ được tính bằng thời gian truy cập hiệu quả (EAT).
VD: thời gian truy cập cache là 10ns, và bộ nhớ chính là 200ns độ cache hit là 99%.

Công thức tính EAT:

H: cache access hit

AccessC: cache access time
 
AccessMM: main memory access time
 
Công thức này có thể mở rộng ra để áp dụng ở bộ nhớ tầng ba, tầng bốn.

### Khi nào bộ đệm bị hỏng

Khi có nhiều chương trình được thực thi thì bộ đệm sẽ làm việc rất tốt, tuy nhiên nếu có nhiều chương trình thực thi lỗi được chạy thì bộ đệm bị hỏng và việc phân cấp bộ nhớ rất chậm.
### Chính sách ghi bộ đệm

Để xác định khối để thay thế người thiết kề phải quyết định làm gì với những khối bẩn của bộ nhớ đệm hoặc là khối bị sửa. Khi tiến trình ghi tới bộ nhớ chính, dữ liệu có thể ghi vào bộ nhớ đệm Có hai chính sách ghi cơ bản: 
• Write-through: cập nhật cả bộ nhớ đệm và bộ nhớ chính mỗi lần ghi. Ghi chậm hơn write-back nhưng đảm bảo bộ đệm phù hợp với bộ chính không thuận lợi là phải truy cập tới bộ nhớ chính 
• Write- back: cập nhật những khối trong bộ nhớ chính khi những khối trong bộ nhớ đệm bị loại khỏi cache. Nhanh hơn write-throught do không tốn thời gian ghi ra bộ nhớ đệm. Không thuận lợi vì dữ liệu bộ đệm và bộ nhớ chính có thể không cùng giá trị khi một tiến trình bị hỏng trước khi ghi tới bộ nhớ chính thực thi xong, dữ liệu ở bộ đệm bị mất.

## Bộ nhớ ảo

Bộ nhớ ảo là bộ đệm trong máy tính giúp máy tính chạy nhanh hơn giống như bộ đệm. Nhờ bộ nhớ ảo mà RAM có thể sử dụng tốt hơn, chạy ứng dụng nặng. Phân trang trên 1 vùng đĩa cứng để lưu dữ liệu đã xử lý, giảm gánh nặng cho RAM. Ghi nhớ rằng địa chỉ của các thanh ghi phải được chuyển qua bộ đệm để CPU xử lý.

Một số thuật ngữ:
*Địa chỉ Ảo: Địa chỉ logic mà tiến trình dùng.
*Địa chỉ Vật lý: Địa chỉ thật sự trên RAM.
*Ánh xạ: Chuyển từ những địa chỉ ảo sang địa chỉ thật, gần giống với ánh xạ bộ nhớ đệm.
*Khung phân trang: Những trang kích thước bằng nhau được chia ra từ bộ nhớ chính.
*Trang: Những đoạn nhớ trong bộ nhớ ảo lưu trên đĩa cứng.
*Phân Trang: Tiến trình sao lưu trang ảo từ đĩa cứng vào khung trang trong bộ nhớ chính.
*Phân mảnh: Bộ nhớ trở nên không cần thiết.
*Sai sót trang: 1 sự kiện xảy ra khi trang yêu cầu không có trong bộ nhớ chính và phải copy từ đĩa cứng vào bộ nhớ chính.

### Phân Trang

Ý tưởng khá đơn giản: Khởi tạo vùng nhớ trên bộ nhớ vật lý để xử lý, lưu giữ thông tin trong một bảng. Mỗi tiến trình đều có một bảng riêng gồm N dòng, N là số trang ảo mà tiến trình cần. Mỗi trang có 2 thuộc tính: bit và số trang. Trang ảo cùng kích cỡ với trang vật lý. Bộ nhớ tiến trình được chia thành những trang cùng kích cỡ cố định lưu giữ thông tin tiến trình để xử lý. 
Các bước truy cập địa chỉ ảo:

*Trích số trang, offset từ địa chỉ ảo. Dịch số trang sang bộ nhớ thực bằng cách truy suất bảng trang.
*Tìm kiếm số trang trong bảng trang. 
*Kiểm tra bit của trang đó. Nếu bit = 0, hệ thống tự sinh ra 1 trang lỗi và hệ điều hành phải tìm được trang được đề nghị trên đĩa tron cây khung trang. 
*Sao lưu và cập nhật lại bảng trang trong bộ nhớ chính. 
*Nếu bit=1 tức là trang trong bộ nhớ chính. 
*Thay thế số trang ảo bằng số trang thực. 
*Truy xuất dữ liệu ở trang vậy lý thực và điền vào trang ảo Địa chỉ ảo gồm 8 bit và chia thành 2 trường. Bộ nhớ chính có 4 trang, bộ nhớ ảo ánh xạ lên bộ nhớ chính.

Các trang trong bảng trang được đánh dấu trong khung trang theo bit mà bộ nhớ ảo ánh xạ vào.

:Vd: bit 0 bộ nhớ ảo ánh xạ vào bit 2 bộ nhớ thực. Khung trang số 2 được điền vào bảng trang, do nó tồn tại trên bộ nhớ chính nên bit được ghi là 1. 3 bit đầu trong 8 bit bộ nhớ ảo dành cho số trang.  5 bit sau dành cho offset được tính theo số bù 2 được ghi vào thanh ghi cơ sở.
:Vd: 000 01101 = #13. Địa chỉ 0 của tiến trình chứa dữ liệu A được ánh xạ qua bộ nhớ chính tại bit thứ 4. CPU sẽ phải chuyển từ địa chỉ ảo 0 sang địa chỉ vật lý 4.

Bảng trang lưu khung trang được ánh xạ từ các bít địa chỉ từ bộ nhớ ảo sang bộ nhớ chính:
vd trang 0 ánh xạ sang trang 2,bit trong bảng trang là 1 (do trên bộ nhớ vật lý). Ánh xạ thanh ghi 4 bits từ bộ nhớ ảo sang bộ nhớ chính.

:Vd: 1010 trang thứ 6 trong bộ nhớ ảo sang khung trang thứ 3 trong bộ nhớ chính. 1 địa chỉ ảo có 13 bits, 3 bits đầu dành cho số trang và 10 bits sau cho offset. 1 địa chỉ thực có 12 bits, 2 bits đầu là khung trang trong bộ nhớ chính, 10 bits sau cho offset. Khung trang càng lớn thì bảng trang càng ít nhưng sẽ lãng phí bộ nhớ nếu quá lớn.

### Thời gian truy xuất phân trang

EAT = Effective Access Time. Chúng ta cần thanh ghi EAT khi sử dụng bộ nhớ ảo. Khi 2 vùng nhớ vật lý được truy suất, 1 tham chiếu tới bảng trang, 1 tham chiếu đến dữ liệu mong muốn. Giả sử bộ nhớ chính truy suất cần 200ns và tỷ lệ lỗi khung trang là 1%, 99% còn lại ta tìm được trang cần trong bộ nhớ. Cần 10ms để truy suất 1 trang không có trong bộ nhớ bao gồm chuyển trang, cập nhật trang và truy suất dữ liệu. EAT =.99(200ns + 200ns) +.01(10ms) = 13.960ns. Thậm chí nếu 100% trang ở trong bộ nhớ chính thì: EAT = 1.00(200ns + 200ns) = 400ns.

Truy xuất bảng trang phải chi phí thời gian truy suất bộ nhớ chính vì nó được lưu trên bộ nhớ chính Có thể làm tăng tốc độ nhờ tìm kiếm bảng trang nhờ bộ đệm chuyển đổi *[http://en.wikipedia.org/wiki/Translation_lookaside_buffer translation look-aside buffer]* – bộ đệm chuyển đổi.

Các bước là: tìm số trang, offset từ địa chỉ ảo, tìm số trang ảo trong TLB, nếu thấy thì điền offset vào khung trang vật lý và truy suất vùng nhớ. Nếu không thấy thì qua bảng trang tìm kiếm trong bộ nhớ chính, nếu không có trong bộ nhớ chính tạo trang lỗi và khởi động lại khi trang đó được tìm thấy.

### Kết hợp bộ đệm, tìm kiếm bộ đệm, phân trang

Bởi vì một bảng tìm kiếm bộ đệm có thể gây lẫn lộn, đưa nhiều thông tin gây nhầm lẫn. Giải pháp là tập hợp tất cả các phương pháp lại. Khi CPU tạo ra 1 địa chỉ nó là địa chỉ chương trình hoặc là địa chỉ ảo, địa chỉ ảo này phải được chuyển thành địa chỉ thật trước khi nó được sử dụng. Có 2 cách: sử dụng bảng dịch tìm kiếm bộ đệm để tìm khung trang mới được lưu trữ bao gồm số trang, khung trang. Nếu khung trang bị bỏ lỡ thì có thể dùng bảng trang để tìm khung trang tương ứng trong bộ nhớ chính. Số khung trang này sau đó sẽ được kết hợp với offset trong địa chỉ ảo để tạo ra địa chỉ thật.

Có hai khả năng để lấy dữ liệu:
# Tìm kiếm để xem có bộ nhớ cache dữ liệu.
# Trên một bộ nhớ cache bỏ lỡ, hãy vào phần chính của bộ nhớ vị trí khác để lấy lại dữ liệu (thường bộ nhớ đệm được cập nhật vào thời điểm này là tốt nhất).

### Thuận lợi, khó khăn của phân trang, bộ nhớ ảo

Trong Phần "Thời gian truy suất phân trang", chúng tôi đã thảo luận cách thức triển khai thực hiện thông qua bộ phân trang. Cho biết thêm một tham chiếu bộ nhớ khi truy cập vào dữ liệu. Tuy nhiên, ngay cả với một tỉ lệ cao nhấn trong bộ đệm chuyển đổi, quá trình này vẫn còn dịch phí.
Bất lợi khác của bộ nhớ ảo và phân trang là tiêu tốn tài nguyên hơn (bộ nhớ để lưu trữ trên trang bảng). Trong trường hợp (nhiều chương trình chạy 1 lúc), các bảng trang có thể mất một phần của bộ nhớ vật lý. Bộ nhớ ảo yêu cầu phần cứng và hệ điều hành hỗ trợ.

Lợi ích của sử dụng bộ nhớ ảo phải lớn hơn bất lợi trong việc sử dụng hệ thống máy tính.
Đơn giản là chương trình không còn bị giới hạn bởi các số lượng bộ nhớ vật lý có sẵn. Bộ nhớ ảo cho phép chúng ta chạy các chương trình cá nhân thứ mà địa chỉ ảo lớn hơn địa chỉ vật lý (Trong thực tế, một trong những quá trình này cho phép chia sẻ bộ nhớ vật lý với chính nó). Làm cho nó dễ dàng hơn nhiều để viết các chương trình do các lập trình viên không còn có thể lo lắng về các địa chỉ vật lý không gian hạn chế.

Bởi vì mỗi chương trình đòi hỏi ít bộ nhớ vật lý, bộ nhớ ảo cũng cho phép các chương trình cùng một lúc. Điều này cho phép chúng ta chia sẻ các máy tính trong quá trình có tổng số địa chỉ không gian kích thước vượt quá kích thước bộ nhớ vật lý, dẫn đến tăng sử dụng CPU và hệ thống thông qua bộ nhớ ảo.

### Phân đoạn

Phân trang là phương thức quản lý bộ nhớ phổ biến nhất nhưng vẫn còn các cách khác, tiêu biểu là phân đoạn. Thay vì chia địa chỉ ảo thành những trang kích thước bằng nhau, địa chỉ thật thành những khung trang, địa chỉ ảo được chia thành luận lý, đơn vị độ dài hoặc các đoạn.
Bộ nhớ vật lý không thật sự phân chia hoặc phân vùng. Khi 1 đoạn cần được đưa vào vùng nhớ chính, hệ điều hành sẽ tìm kiếm vùng nhớ trống đủ lớn để lưu thông tin phân đoạn đó. Mỗi phân đoạn có địa chỉ cơ sở, được tạo trong bộ nhớ, giới hạn kích cỡ.
Mỗi chương trình có thể có nhiều phân đoạn, bây giờ được kết hợp thành bảng phân đoạn thay bảng trang. Bảng phân đoạn đơn giản là tập hợp những cặp cơ sở cho mỗi phân đoạn. Bộ nhớ có thể truy xuất và phiên dịch bằng cách cung cấp một số vùng nhớ và offset trong phân đoạn. Kiểm tra lỗi được tổ chức để chắc chắn rằng Offset đảm bảo các giá trị ràng buộc. Nếu có, thì giá trị cơ sở cho phân đoạn
(được tìm thấy trong bảng phân đoạn) sẽ được điền vào phần bù, nhường cho địa chỉ vật lý thật.

Giống như phân trang, phân đoạn cũng có những vùng nhớ phân mảng. Phân trang tạo ra những vùng nhớ đó vì khung trang có thể khởi tạo 1 tiến trình mà không cần những thuộc tính của khung trang. Phân đoạn lại khác, chứa những phân mảnh ở ngoài. Những phân đoạn được tạo và hủy, những vùng nhớ được giải phóng và chuẩn hóa lại dẫn đến lỗi trong bộ nhớ. Thực tế có rất nhiều vùng nhớ nhỏ nhưng không đủ lớn để lưu các thuộc tính của phân đoạn.

Sự khác biệt giữa phân mảnh trong và ngoài là với phân mảng ngoài, có đủ không gian nhớ để lưu trữ cho tiến trình, nhưng không gian này không liền kề nhau mà là số lượng lớn của nhiều không gian nhỏ, những lỗ hổng không được sử dụng. Với phân mảnh trong, bộ nhớ đơn giản là không tồn tại bởi vì hệ thống đã khởi tạo quá nhiều vùng nhớ cho 1 tiến trình mà nó không cần thiết. Để loại bỏ phân mảnh ngoài, hệ thống sử dụng bộ thu dọn rác. Tiến trình này đơn giản loại bỏ những vùng nhớ chiếm đóng để chúng nhỏ hơn, phân mảnh lại thành lớn hơn và có tác dụng hơn.

Sự kết hợp giữa phân đoạn và phân trang rất tiện ích bởi vì nó cho phép các phân đoạn từ phía người dùng và phân trang từ phía hệ thống.

### Tổng quan bộ nhớ ảo

Bộ nhớ bao gồm: bộ đệm, bộ nhớ chính và bộ nhớ ảo trên đĩa cứng. Bộ đệm lưu trữ những thông tin thường xuyên sử dụng của vùng nhớ chính để CPU xử lý. Bộ đệm có thể dùng nhiều cách ánh xạ, theo cơ chế FIFO, LRU(rất tốt cho ứng dụng nhưng khó bổ sung). Một biện pháp thành công khác là dùng bộ nhớ ảo, bộ nhớ ảo cho phép chạy những chương trình mà địa chỉ ảo cần thiết lớn hơn địa chỉ thật. Cho phép nhiều tiến trình chạy cùng 1 lúc. Trong đó TLB được dùng để lưu trữ những cặp địa chỉ ảo/thật được sử dụng. Bộ nhớ ảo chuyển đổi từ địa chỉ ảo sang địa chỉ thật, xử lý những trang lỗi trên đĩa thay vì bộ nhớ chính. 
Mối quan hệ giữa bộ nhớ chính và bộ nhớ ảo gần giống với quan hệ giữa bộ nhớ chính và bộ đệm. Thực tế TLB là bộ đệm. Một điều quan trọng để nhận thấy là địa chỉ ảo phải được chuyển dịch sang địa chỉ vật lý trước khi làm bất cứ việc gì và đó là việc mà TLB làm. Mặc dù bộ đệm và phân trang vùng nhớ gần giống nhau nhưng các đối tượng lại khác nhau. Bộ đệm tăng khả năng truy suất bộ nhớ chính trong khi đó bộ nhớ ngoài tăng kích cỡ bộ nhớ chính.

## Một ví dụ thực tế về quản lý bộ nhớ

Bởi vì Pentium thể hiện những đặc điểm tiêu biểu của quản lý bộ nhớ hiện đại, chúng ta sẽ trình bày một cái nhìn khai quát về cách mà bộ xử lý giải quyết với bộ nhớ, Kiến trúc Pentium cho phép 32 bit địa chỉ ảo và 32 bit địa chỉ vật lý. Nó dùng hoặc 4 KB hoặc 4 MB kích thước trang khi sử dụng phân trang. Phân trang và phân khúc (segmentation) có thể áp dụng trong các kết hợp khác nhau, bao gồm unsegmented, paged memory; segmented, unpaged memory. Pentium có 2 cache L1 và L2, kích cỡ 32 byte. L1 ngay cạnh bộ xử lý, L2 thì giữa bộ xử lý và bộ nhớ. L1 cache thậm chí là 2 cache, Pentium chia L1 cache thành các cache nhỏ hơn được dùng để tổ chức lệnh (I-cache) và một cái để tổ chức dữ liệu (D-cache). Cả hai L1-cache sử dụng bit LRU cho các thoả thuận với khối thay thế. Mỗi L1 cache có 1 TLB(translation look-aside buffer – bộ đệm chuyển đổi - Phương thức tăng tốc độ tra cứu page table bằng cách lưu lại hầu hết giá trị tra cứu trang gần đây trong page table cache): D-cache TLB có 64 mục còn I-cache có 32 mục. Cả hai TLB đều có 4 cách cài đặt và sử dụng 1 LRU giả tạo thay thế. Cả hai L1 cache đều sử dụng 2 cách để thiết lập ánh xạ. Để quản lý truy cập tới bộ nhớ, I-cache và L2 cache sử dụng giao thức MESI. Mỗi dòng cache có 2 bit để lưu các trạng thái của MESI: M: modified thay đổi (cache khác với bộ nhớ chính), E: exclusive không chấp nhận(cache không bị thay đổi và giống bộ nhớ), S: shared (line/block có thể chia sẻ với line/block cache khác), I: invalid (line/block không có trong cache).

## Tổng kết

Bộ nhớ được sắp xếp theo kiểu phân cấp với bộ nhớ lớn hơn trở nên rẻ hơn, chậm hơn, bộ nhớ nhỏ hơn thì nhanh hơn, đắt hơn. Trong 1 bộ nhớ phân cấp đặc trưng ta có thể thấy 1 cache, bộ nhớ chính, bộ nhớ phụ(thường là ổ đĩa). Điều này giúp các lập trình viên cảm thấy ấn tượng với bộ nhớ lớn và nhanh mà không cần quan tâm thông tin truyền giữa các cấp độ khác nhau của hệ thống này.

Cache hoạt động như 1 bộ nhớ đệm. Để giữ các khối được sử dụng thường xuyên của bộ nhớ chính và ở gần CPU. Một mục tiêu của bộ nhớ phân cấp là giúp cho các bộ xử lý cảm thấy thời gian truy cập hiệu quả gần như thời gian truy cập cache. Mục tiệu này phụ thuộc vào các chương trình đang được thực hiện, kích cỡ và tổ chức của cache và các chính sách thay thế. Bộ xử lý liên quan được tìm thấy trong cache được gọi là cache hit(lượt truy cập), ngược lại cache miss. Trên một miss, dữ liệu bị mất được lấy lại từ bộ nhớ chính và toàn bộ khối có chứa dữ liệu sẽ được tải vào cache.

Tổ chức của cache quyết định phương thức CPU dùng để tìm kiếm cache cho nhiều địa chỉ bộ nhớ khác nhau. Cache được tổ chức theo nhiều cách: ánh xạ trực tiếp, kết hợp hoàn toàn, thiết lập kết hợp. Ánh xạ trực tiếp cache không cần thuật toán thay thế, tuy nhiên kết hợp hoàn toàn và thiết lập kết hợp phải sử dụng FIFO, LRU và các chính sách thay thế khác để quyết định khối nào bị xoá khỏi cache để có chỗ trống cho một khối mới, nếu như cache bị full. LRU cho khả năng hiệu quả cao nhưng khó thực thi.

Một mục tiêu khác của bộ nhớ phân cấp là mở rộng bộ nhớ chính bằng cách sử dụng đĩa cứng, gọi là bộ nhớ ảo. Bộ nhớ ảo cho phép chạy các chương trình trên các bộ nhớ địa chỉ ảo lớn hơn bộ nhớ vật lý. Nó cũng cho phép nhiều quá trình chạy đồng thời. Nhược điểm của bộ nhớ ảo với phân trang(bộ nhớ đệm) bao gồm tiêu tốn nhiều tài nguyên hơn(lưu trữ các bảng page) và truy cập bộ nhớ nhiều hơn(để truy cập đến bảng page). Bộ nhớ ảo cũng gánh thêm chức năng biên dịch để chuyển đổi địa chỉ ảo sang địa chỉ vật lý. Quan hệ giữa bộ nhớ ảo và bộ nhớ chính tương tự như quan hệ giữa bộ nhớ chính và cache. Khái niệm về bộ nhớ cache và TLB thường gây nhầm lẫn. Trong thực tế, TLB là một cache. Điều đó rất quan trọng để nhận ra rằng địa chỉ ảo phải được biên dịch sang địa chỉ vật lý trước khi thực hiện những việc khác, và đó chính là những gì TLB thực hiện. Cho dù cache và paged memory có vẻ giống nhau, nhưng vẫn có sự khác biệt: cache tăng hiệu quả thời gian truy cập tới bộ nhớ chính trong khi đó phân trang lại tăng kích cỡ bộ nhớ chính.

## Tham khảo

* '''Memory'''  - Chapter 6, *The Essentials of Computer Organization and Architecture*, Linda Null and Julia Lobur.