Trong lĩnh vực tin học, cache (/ˈkæʃ/ KASH) là bộ nhớ đệm dùng để lưu trữ tạm thời các dữ liệu, chờ các yêu cầu từ ứng dụng hoặc phần cứng. Các dữ liệu trong cache có thể là kết quả của các thuật toán đã thực hiện hoặc các bản sao dữ liệu được lưu ở nhiều nơi khác nhau.
Nguyên lý hoạt động
Phần cứng sử dụng cache như một khu vực lưu trữ tạm thời để dễ dàng truy cập lại sau này. Các vi xử lý (CPU) và ổ đĩa cứng (HDD) thường xuyên sử dụng cache, cũng như các trình duyệt web và máy chủ (server).
Cache bao gồm các thanh ghi. Mỗi thanh ghi có một bit để đánh dấu xem dữ liệu có được lưu từ bộ nhớ hay không, một nhãn (tag) để kiểm tra tính chính xác của dữ liệu so với bộ nhớ, và một khu vực để lưu trữ dữ liệu giống như bộ nhớ.
Khi cache client (như vi xử lý, trình duyệt web,...) cần truy cập dữ liệu từ bộ nhớ, nó sẽ kiểm tra trong cache trước. Nếu một thanh ghi có nhãn phù hợp với dữ liệu cần tìm, cache client sẽ sử dụng dữ liệu trong thanh ghi đó, được gọi là cache-hit. Nếu không tìm thấy, gọi là cache miss, và CPU sẽ truy cập bộ nhớ để lấy dữ liệu, đồng thời lưu dữ liệu đó vào một thanh ghi.
Khi xảy ra cache miss, CPU sẽ loại bỏ một số thanh ghi để tạo không gian cho dữ liệu mới. Việc loại bỏ thanh ghi tuân theo các quy tắc thay thế, phổ biến nhất là 'least recently used' (LRU), tức là loại bỏ những thanh ghi ít được sử dụng nhất.
Nguyên tắc ghi dữ liệu (Writing policies)
Khi CPU ghi dữ liệu vào Cache, có một số quy tắc cần tuân theo để ghi dữ liệu vào bộ nhớ một cách chính xác.
Có hai phương pháp chính:
- Write-through: ghi dữ liệu đồng thời vào cả cache và bộ nhớ chính (DRAM) ngay lập tức.
- Write-back: ghi dữ liệu vào cache trước, việc ghi vào bộ nhớ sẽ được trì hoãn cho đến khi có dữ liệu mới cần ghi vào vùng lưu trữ đó.
Một hệ thống write-back cache thường phức tạp hơn. Nó đánh dấu các thanh ghi có dữ liệu thay đổi là 'dirty' (có thể ghi đè). Khi một thanh ghi bị thay thế, dữ liệu đã được đánh dấu sẽ được ghi vào bộ nhớ. Vì vậy, khi gặp read-miss trên write-back cache, cần hai lần truy cập: một để cập nhật bộ nhớ với dữ liệu đã thay đổi và một để lấy dữ liệu cần thiết và ghi vào cache.
Khi xảy ra write-miss (trường hợp cache-miss), có hai cách xử lý:
- Write allocate: dữ liệu sẽ được ghi vào cache và một thanh ghi sẽ bị thay thế. Phương pháp này tương tự như xử lý read-miss.
- No-write allocate: dữ liệu chỉ được ghi vào bộ nhớ chính mà không ghi vào cache.
Cả hai phương pháp write-through và write-back đều áp dụng một trong hai cách xử lý khi xảy ra write-miss, nhưng chúng thường được kết hợp như sau:
- Cache kiểu write-back sử dụng phương pháp write allocate để ghi đè dữ liệu hiệu quả hơn trên cache.
- Cache kiểu write-through sử dụng phương pháp no-write allocate, dẫn đến việc ghi dữ liệu không hiệu quả nếu không lưu trữ trong cache.
Ứng dụng
Bộ nhớ đệm CPU
Bộ nhớ đệm được sử dụng bởi CPU của máy tính để giảm thời gian truy cập dữ liệu từ bộ nhớ chính. Nó nhỏ hơn và nhanh hơn, lưu trữ các dữ liệu thường xuyên được truy cập từ bộ nhớ chính. Hầu hết các CPU hiện đại có nhiều loại bộ nhớ đệm, bao gồm cả bộ nhớ đệm lệnh và bộ nhớ đệm dữ liệu, với bộ nhớ đệm dữ liệu thường được tổ chức theo hệ thống nhiều cấp.
Bộ nhớ đệm của vi xử lý đồ họa
Các thế hệ trước của vi xử lý đồ họa (GPUs) không trang bị bộ nhớ đệm, nhưng các phiên bản mới hơn đã tích hợp bộ nhớ đệm lớn. Ví dụ, GT200 không có bộ đệm L2, trong khi bộ nhớ đệm của Fermi đạt 768KB, Kepler là 1536KB, và Maxwell có 2048KB.
Bộ đệm chuyển đổi
Đơn vị quản lý bộ nhớ (MMU) sử dụng một bộ nhớ đệm đặc biệt để lưu trữ kết quả ánh xạ từ địa chỉ ảo sang địa chỉ vật lý. Bộ nhớ đệm này 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 để lưu trữ các phản hồi từ máy chủ, như hình ảnh và trang web.
Bộ nhớ đệm web giúp giảm lượng dữ liệu cần truyền qua mạng bằng cách tái sử dụng thông tin đã được lưu trữ. Điều này giảm băng thông và làm cho các yêu cầu dữ liệu từ máy chủ được xử lý 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 thường sử dụng bộ nhớ đệm cục bộ, trong khi một số nhà cung cấp dịch vụ mạng hoặc tổ chức chọn sử dụng máy chủ đệm để chia sẻ bộ nhớ đệm cho toàn bộ người dùng trong hệ thống.
Một loại bộ nhớ đệm khác là P2P (peer-to-peer). Loại này giúp tăng tốc quá trình tìm kiếm các tập tin được chia sẻ qua các ứng dụng P2P và cải thiện tốc độ truyền dữ liệu. Nó cũng giúp cộng đồng thực hiện các nhiệm vụ liên quan đến P2P, chẳng hạn như Corelli.
Sự khác biệt giữa bộ đệm và bộ nhớ cache
Thuật ngữ 'buffer' và 'cache' không thể thay thế cho nhau; chúng có những điểm khác biệt cơ bản trong cách hoạt động. Bộ nhớ cache và bộ đệm đều có vai trò riêng trong việc quản lý và cải thiện hiệu suất dữ liệu.
Bộ nhớ đệm chủ yếu giúp nâng cao hiệu suất khi truy xuất dữ liệu nhiều lần. Ngược lại, bộ nhớ cache có thể mang lại sự cải thiện hiệu suất ngay từ lần truy cập đầu tiên và tiếp tục tối ưu hóa quá trình xử lý dữ liệu.
Đối với việc đọc dữ liệu từ bộ nhớ cache, một mục dữ liệu cần phải được truy xuất từ vị trí gốc ít nhất một lần. Sau đó, các lần truy cập tiếp theo có thể thấy sự cải thiện hiệu suất nhờ vào việc lưu trữ tạm thời dữ liệu trong bộ nhớ cache, nhanh hơn so với việc lấy dữ liệu từ vị trí gốc. Trong trường hợp ghi dữ liệu vào cache, hiệu suất ghi có thể được cải thiện khi dữ liệu được lưu trực tiếp vào bộ nhớ cache ngay lần đầu tiên, trong khi việc ghi dữ liệu về sau có thể được trì hoãn hoặc xử lý nền. Khác với bộ đệm nghiêm ngặt, bộ nhớ đệm yêu cầu tuân thủ các giao thức nhất quán để duy trì sự đồng bộ giữa dữ liệu lưu trữ tạm thời và vị trí gốc. Bộ đệm, ngược lại,
+ giảm số lượng các quá trình truyền dữ liệu giữa các quá trình giao tiếp, tối ưu hóa hiệu suất mà không cần lưu ý đến việc truy xuất dữ liệu ít lần.
+ cung cấp sự trung gian trong quá trình giao tiếp
+ đảm bảo kích thước dữ liệu tối thiểu hoặc yêu cầu cho ít nhất một trong các quá trình giao tiếp liên quan đến truy xuất.
Buffer là vùng nhớ tạm thời thường dùng khi các lệnh CPU không thể truy cập trực tiếp dữ liệu từ các thiết bị ngoại vi. Do đó, bộ nhớ đệm đóng vai trò như một giai đoạn trung gian. Buffer cũng hữu ích khi dữ liệu cần được gom lại hoặc phân tách (theo yêu cầu của thiết bị lưu trữ), hoặc khi dữ liệu cần được truyền theo thứ tự khác so với cách nó được tạo ra. Thêm vào đó, khi dữ liệu được truyền toàn bộ một cách tuần tự (ví dụ như vào đĩa cứng), bộ đệm có thể cải thiện hiệu suất truyền tải hoặc giảm biến động và độ trễ, ngược lại với bộ nhớ đệm nhằm giảm độ trễ. Những lợi ích này vẫn tồn tại ngay cả khi dữ liệu chỉ được ghi vào buffer một lần và đọc ra từ buffer một lần.
Bộ nhớ cache cũng giúp nâng cao hiệu suất truyền tải dữ liệu. Phần lớn sự cải thiện này đến từ việc nhiều giao dịch nhỏ có thể được gộp lại thành khối lớn hơn. Thêm vào đó, hiệu suất được cải thiện do khả năng cao rằng cùng một dữ liệu sẽ được truy cập từ bộ nhớ cache nhiều lần, hoặc dữ liệu tương tự sẽ được đọc sớm. Mục tiêu chính của bộ nhớ cache là giảm thiểu số lần truy cập vào các kho lưu trữ chậm hơn nằm ở dưới. Thường thì, bộ nhớ cache hoạt động như một lớp trừu tượng giúp người dùng thấy từ góc độ của các lớp gần kề.
Bộ nhớ đệm đĩa
Bộ nhớ đệm đĩa là một giải pháp nhằm cải thiện tốc độ đọc và ghi dữ liệu từ hoặc lên đĩa cứng. Hiện tại, bộ nhớ đệm đĩa thường được tích hợp trực tiếp vào đĩa cứng, nhưng nó cũng có thể là một phần của RAM riêng biệt. Bộ nhớ đệm này lưu trữ dữ liệu đã được truy cập gần đây cùng với các vùng dữ liệu gần gũi, giúp truy cập nhanh hơn trong tương lai. Một số bộ nhớ đệm đĩa còn hỗ trợ cả việc ghi dữ liệu.
Các loại bộ nhớ đệm khác
Các công cụ tìm kiếm như Google, Yahoo,... thường sử dụng bộ nhớ đệm để lưu trữ các trang web đã được tìm kiếm. Chẳng hạn, Google cung cấp liên kết bên cạnh kết quả tìm kiếm dẫn đến bản sao lưu của các trang web đã được tìm kiếm trước đó. Điều này rất hữu ích khi các trang web từ một máy chủ nào đó trở nên khó truy cập trong một khoảng thời gian ngắn hoặc lâu dài.
Một dạng bộ nhớ đệm khác được sử dụng để lưu trữ các kết quả tính toán có thể được sử dụng lại sau này. Ví dụ, các chương trình như cache thường tạo bộ nhớ đệm cho đầu ra của trình biên dịch, giúp tăng tốc độ biên dịch cho các lần sau.
Việc sử dụng bộ nhớ đệm cho cơ sở dữ liệu có thể làm tăng hiệu suất hoạt động của các ứng dụng cơ sở dữ liệu đáng kể, như trong việc xử lý các mục, dữ liệu từ điển, hoặc các dạng dữ liệu phổ biến khác.
Xem thêm
- 'Những Điều Mọi Lập Trình Viên Nên Biết Về Bộ Nhớ' của Ulrich Drepper
- 'Bộ Nhớ Đệm Trong Môi Trường Phân Tán'
