Cache (tin học)

Trong tin học, cache ( ) hoặc bộ nhớ đệm là một thành phần phần cứng hoặc phần mềm lưu trữ dữ liệu để các yêu cầu trong tương lai đối với dữ liệu đó có thể được phục vụ nhanh hơn; dữ liệu được lưu trữ trong cache có thể là kết quả của một phép tính trước đó hoặc một bản sao của dữ liệu được lưu trữ ở nơi khác. Một lần truy cập cache xảy ra khi dữ liệu được yêu cầu có thể được tìm thấy trong cache, trong khi một lần bỏ lỡ cache xảy ra khi không thể. Các lần truy cập cache được phục vụ bằng cách đọc dữ liệu từ cache, nhanh hơn so với việc tính toán lại kết quả hoặc đọc từ kho dữ liệu chậm hơn; do đó, càng có nhiều yêu cầu có thể được phục vụ từ cache, thì hệ thống càng hoạt động nhanh hơn

Để tiết kiệm chi phí, cache phải tương đối nhỏ. Tuy nhiên, cache có hiệu quả trong nhiều lĩnh vực điện toán vì các ứng dụng máy tính thông thường truy cập dữ liệu với mức độ tham chiếu cục bộ cao. Các mẫu truy cập như vậy thể hiện tính cục bộ theo thời gian, trong đó dữ liệu được yêu cầu đã được yêu cầu gần đây và tính cục bộ theo không gian, trong đó dữ liệu được yêu cầu được lưu trữ gần dữ liệu đã được yêu cầu.

== Động lực ==
Trong thiết kế bộ nhớ, có một sự đánh đổi cố hữu giữa dung lượng và tốc độ vì dung lượng lớn hơn ngụ ý kích thước lớn hơn và do đó khoảng cách vật lý lớn hơn để tín hiệu truyền đi gây ra độ trễ truyền. Ngoài ra còn có sự đánh đổi giữa các công nghệ hiệu suất cao như SRAM và các mặt hàng rẻ hơn, dễ sản xuất hàng loạt như DRAM, flash hoặc ổ cứng.

Một tài nguyên lớn hơn sẽ gây ra độ trễ đáng kể khi truy cập – ví dụ: có thể mất hàng trăm chu kỳ xung nhịp để bộ xử lý 4 GHz hiện đại tiếp cận DRAM. Điều này được giảm thiểu bằng cách đọc các khối lớn vào cache, với hy vọng rằng các lần đọc tiếp theo sẽ đến từ các vị trí gần đó và có thể được đọc từ cache. Có thể sử dụng dự đoán hoặc tìm nạp trước rõ ràng để đoán các lần đọc trong tương lai sẽ đến từ đâu và đưa ra yêu cầu trước thời hạn; nếu thực hiện tối ưu, độ trễ sẽ được bỏ qua hoàn toàn.

Việc sử dụng bộ nhớ đệm cũng cho phép thông lượng cao hơn từ tài nguyên cơ bản, bằng cách lắp ráp nhiều lần truyền dữ liệu chi tiết thành các yêu cầu lớn hơn, hiệu quả hơn. Trong trường hợp mạch DRAM, thông lượng bổ sung có thể đạt được bằng cách sử dụng bus dữ liệu rộng hơn.

== Cách vận hành ==
Phần cứng cài đặt cache như một nơi chứa dữ liệu tạm thời để có thể sử dụng lại. Bộ vi xử lý (CPU) và ổ đĩa cứng (HDD) thường xuyên sử dụng cache, tương tự trình duyệt web và máy chủ (server).

Cache gồm những thanh ghi, mỗi thanh chứa 1 bit để đánh dấu là đang lưu dữ liệu từ bộ nhớ hoặc chưa được sử dung, 1 nhãn (tag) để kiểm tra xem nó có phải là dữ liệu ứng với bộ nhớ hay không và 1 vùng để lưu trữ dữ liệu giống với bộ nhớ.

Khi cache client (vi xử lý,trình duyệt web...) cần truy cập đến dữ liệu ở bộ nhớ,nó sẽ kiểm tra cache. Nếu 1 thanh ghi có nhãn tương ứng với dữ liệu mong muốn thì cache client sẽ sử dụng dữ liệu trên thanh ghi đó.Tình huống này được gọi là cache-hit. Ngược lại, nếu không tìm được thanh ghi tương ứng, thì tình huống này gọi là cache miss. Lúc này CPU sẽ truy cập vào bộ nhớ, lấy dữ liệu cần truy cập,đồng thời lưu dữ liệu đó vào 1 thanh ghi nào đó.

Trong trường hợp cache miss, CPU sẽ loại bỏ một số thanh ghi để dọn chỗ cho dữ liêu không nằm trong cache. Việc loại bỏ thanh ghi phải tuân thủ các quy định về thay thế,thông dụng nhất là "least
recently used" (LRU), tức là loại bỏ những cache ít được sử dụng nhất.

=== Nguyên tắc ghi của hệ thống (Writing policies) ===
Khi CPU ghi dữ liệu vào Cache, cần phải có một số quy tắc ghi dữ liệu đó vào bộ nhớ.

Có 2 cách tiếp cận:

- "Write-through": ghi ngay lập tức dữ liệu lên cả cache và bộ nhớ(DRAM)

-"Write-back:" ghi cho cache trước, việc ghi lên bộ nhớ bị trì hoãn đến khi có dữ liệu mới cần đặt lên vùng lưu trữ đó.

Một write-back cache được cài đặt khá phức tạp. Nó đánh dấu những thanh ghi có dữ liệu thay đổi,đánh dấu chúng là có thể ghi đè ("dirty"), khi thanh ghi bị thay thế, dữ liệu trên(được đánh dấu) sẽ được ghi vào bộ nhớ. Do đó,khi read-miss trên write-back cache,mất 2 lần truy cập,một là để ghi dữ liệu bị thay đổi vào bộ nhớ, hai là để lấy dữ liệu cần dùng và ghi lên cache.

Khi write-miss (xảy ra cache-miss), có 2 cách xử lý:

-"Write allocate:" dữ liệu sẽ được ghi lên cache, một thanh ghi sẽ bị thay thế. Cách này tương tự read-miss

-"No-write allocate:" dữ liệu sẽ được ghi vào bộ nhớ nhưng không ghi trên cache

Cả write-through và write-back đều sử dụng 2 cách trên khi write-miss, nhưng phổ biến chúng được ứng với từng cách:

-Write-back cache sử dụng write allocate giúp ghi đè dữ liệu trên cache hiệu quả hơn

-Write-through cache sử dụng no-write allocate và việc ghi dư liệu không được lưu trữ trong cache không có hiệu quả.

== Ứng dụng ==
=== Bộ nhớ đệm CPU ===
Bộ nhớ đệm được sử dụng bởi đơn vị xử lý trung tâm (CPU) của máy tính để giảm thiểu thời gian trung bình trong việc truy cập dữ liệu trong bộ nhớ chính. Bộ nhớ đệm nhỏ hơn, nhanh hơn trong việc lưu trữ dữ liệu sao chép từ vùng bộ nhớ chính được sử dụng thường xuyên nhất. Hầu hết CPU sở hữu những bộ nhớ đệm độc lập khác biệt nhau, bao gồm lệnh và bộ nhớ đệm dữ liệu, nơi mà bộ nhớ đệm dữ liệu thường được thiết lập như một hệ thống cấp bậc của nhiều hơn các cấp bộ nhớ đệm.

===Bộ nhớ đệm của vi xử lý đồ họa===
Các phiên bản trước của vi xử lý đồ họa (GPUs) không có (các) bộ nhớ đệm cứng; tuy nhiên, khi GPUs chuyển sang vi xử lý không mang tính đồ họa, chúng lại sử dụng các bộ nhớ đệm lớn. Chẳng hạn như GT200 không có bộ đệm L2, trong khi bộ đệm của Fermi lại có 768 KB (0,75 MB), của Kepler là 1536 KB (1,5 MB) và của Maxwell có 2048KB (2 MB).

=== Bộ đệm chuyển đổi ===
Đơn vị quản lý dữ liệu (MMU): tìm nạp những lối vào của trang bảng từ bộ nhớ chính sở hữu bộ nhớ đệm đặc biệt, được sử dụng để ghi lại kết quả của địa chỉ ảo đến địa chỉ vật lý. Bộ nhớ đệm đặc biệt này được gọi là Bộ Đệm Chuyển Đổi

=== Bộ nhớ đệm Web (Web Cache) ===
Trình duyệt web và Máy chủ Web sử dụng Bộ nhớ đệm Web để chứa các phản hồi từ hệ thống máy chủ, chẳng hạn như hình ảnh và các trang web.

Bộ nhớ đệm Web giảm thiểu thông tin cần được truyền bằng mạng, bởi vì thông tin được chứa trong bộ nhớ đệm có thể được tái sử dụng. Điều này giúp giảm băng thông và nhận được yêu cầu dữ liệu từ máy chủ nhanh hơn, đồng thời cải thiện tốc độ phản hồi của người dùng trên mạng.

Các trình duyệt web sử dụng bộ nhớ đệm liền, một số nhà cung cấp mạng hay tổ chức lại thích dùng máy chủ đệm để bộ nhớ đệm được chia sẻ cho tất cả người dùng trong hệ thống đó.

Một dạng khác của bộ nhớ đệm là P2P (peer to peer). Nó giúp các tập tin được các ứng dụng P2P tìm kiếm nhiều nhất và còn giúp tăng tốc chuyển dữ liệu P2P. Tương tự, các vùng tương đương sẽ xuất hiện, điều này giúp cộng đồng thực hiện các nhiệm vụ vận chuyển P2P chẳng hạn như Corelli.

=== Sự khác biệt giữa buffer và bộ nhớ cache ===
Hai từ ngữ "buffer" và "cache" không bao gồm nhau; thậm chí, có sự khác biệt cơ bản trong ý nghĩa giữa các quá trình của bộ nhớ cache và các quá trình của buffer.

Về cơ bản, bộ nhớ đệm nhận ra một sự gia tăng hiệu suất cho việc lấy đi lấy lại dữ liệu nhiều lần. Trong khi cache có thể nhận ra một sự gia tăng hiệu suất ngay từ ban đầu của một dữ liệu, quá trình tăng hiệu suất xảy ra trong hệ thống bộ nhớ đệm.

Với đọc cache, một mục dữ liệu phải được lấy từ vị trí gốc của nó ít nhất một lần để cho sau này đọc liên tiếp dữ liệu nhiều lần để thấy một sự gia tăng hiệu suất bằng hiệu lực của việc có thể lưu trữ trung gian của bộ nhớ cache nhanh hơn của dữ liệu gốc. Với ghi cache, một sự gia tăng hiệu suất của việc viết một dữ liệu có thể được nhận ra khi viết lần đầu tiên của các dữ liệu bằng hiệu lực của các dữ liệu được lưu trữ ngay trên bộ nhớ cache, trì hoãn việc chuyển giao các dữ liệu về sau hay nói cách khác nó xảy ra như là một tiến trình nền. Trái với đệm nghiêm ngặt, một quá trình trong bộ nhớ đệm phải tuân thủ một (phân phối tiềm năng) bộ nhớ cache giao thức mạch lạc để duy trì sự thống nhất giữa lưu trữ trung gian của bộ nhớ cache và vị trí nơi chứa dữ liệu. Buffering, mặt khác,

+ làm giảm số lượng các quá trình chuyển dữ liệu giữa quá trình giao tiếp, mà tối ưu trên không đề cập đến những truy cập một dữ liệu ít lần.

+ cung cấp quá trình giao tiếp trung gian

+ đảm bảo một kích thước dữ liệu tối thiểu hoặc đại diện theo yêu cầu của ít nhất một trong các quá trình giao tiếp liên quan đến việc truy cập.

Buffer là một vị trí bộ nhớ tạm thời thường được sử dụng vì các CPU instruction không thể trực tiếp truy cập các dữ liệu được lưu trữ trong các thiết bị ngoại vi. Như vậy, bộ nhớ địa chỉ được sử dụng như là một giai đoạn trung gian. Ngoài ra, một buffer như vậy có thể khả thi khi một khối lượng lớn các dữ liệu được lắp ráp hoặc tháo rời (theo yêu cầu của một thiết bị lưu trữ), hoặc khi dữ liệu có thể được gửi theo một thứ tự khác nhau hơn là trong đó nó được tạo ra. Ngoài ra, một bộ đệm toàn bộ dữ liệu thường được chuyển tuần tự (ví dụ vào đĩa cứng), vì vậy chính buffer đôi khi làm tăng hiệu suất truyền tải hoặc làm giảm sự biến đổi hoặc sự rối loạn của độ trễ việc chuyển giao như trái ngược với bộ nhớ đệm mà mục đích là để giảm độ trễ. Những lợi ích này có mặt ngay cả khi dữ liệu buffer được ghi vào buffer một lần và đọc từ bộ đệm một lần.

Một bộ nhớ cache cũng làm tăng hiệu suất truyền tải. Một phần của sự gia tăng tương tự xuất phát từ khả năng rằng nhiều giao dịch chuyển nhỏ sẽ kết hợp thành một khối lớn. Nhưng chính hiệu-được xảy ra bởi vì có một cơ hội tốt mà cùng một dữ liệu sẽ được đọc từ bộ nhớ cache nhiều lần, hoặc số liệu bằng văn bản sẽ sớm được đọc. Mục đích duy nhất của một bộ nhớ cache là để giảm truy cập vào kho chậm hơn nằm bên dưới. Bộ nhớ cache cũng thường là một lớp trừu tượng được thiết kế để có thể nhìn thấy từ quan điểm của các lớp lân cận.

===Bộ nhớ đệm đĩa (Disk Cache)===
Bộ nhớ đệm đĩa là một bộ phận để cải thiện thời gian đọc từ đĩa cứng hoặc ghi lên đĩa cứng. Hiện nay, bộ nhớ đệm đĩa thường được xem như một phần của đĩa cứng. Bộ nhớ đệm đĩa cũng có thể là một phần riêng biệt của RAM. Nó chứa dữ liệu đã được đọc gần đây và những vùng dữ liệu gần kề có thể được kết nối trong thời gian tới.Việc viết bộ nhớ đệm cũng được hộ trỡ bởi một số bộ nhớ đệm đĩa.

=== Một số bộ nhớ đệm khác ===
Những cỗ máy tìm kiếm (như Google, Yahoo...) thường dùng
bộ nhớ đệm để lưu giữ những trang web đã được tìm kiếm. Ví dụ, Google sẽ cung cấp một đường link bên cạnh kết quả tìm kiếm trỏ đến bộ nhớ đệm đối với những trang
web đã được tìm kiếm trước đó. Điều này trở nên hữu ích khi những trang web từ một máy chủ nào đó trở nên khó truy cập trong thời gian ngắn hoặc lâu dài.

Một loại bộ nhớ đệm khác sẽ được dùng để lưu giữ những kết quả
tính toán mà có thể sẽ được sử dụng trở lại. Ví dụ, cache là một chương trình tạo ra bộ nhớ đệm cho đầu ra của trình biên dịch để tăng tốc độ biên dịch cho
những lần biên dịch sau.

Việc tạo bộ nhớ đệm cho cơ sở dữ liệu có thể cải thiện đáng
kể khả năng vận hành của những ứng dụng cơ sở dữ liệu, như trong vận hành các đề mục, dữ liệu từ điển, hay những dạng thông dụng khác của dữ liệu.

== Đọc thêm ==
- "What Every Programmer Should Know About Memory" by Ulrich Drepper
- "Caching in the Distributed Environment"