Các kiểu bộ nhớ

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.

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.

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 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.

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.