Kỹ thuật cache

Khi sử dụng các thiết bị và chương trình máy tính, chắc chắn ai cũng nghe qua thuật ngữ cache, ví dụ như trong web browser, trong setting của các thiết bị android, hay trong các thông số kỹ thuật của chiêc máy tính của bạn. Vậy cache là gì, và tại sao phải sử dụng cache?
 
Cache là gì? Về bản chất, cache là một thiết bị lưu trữ dữ liệu, giống với ổ đĩa và RAM máy tính, tuy nhiên cache có kích thước lưu trữ nhỏ hơn, với tốc độ truy xuất, ghi và đọc nhanh hơn (hình 1).
 
Cache được sử dụng như thế nào? Về cơ bản, cache có thể xem là một kỹ thuật nhằm tăng tốc độ xử lý của toàn hệ thống, hay nói cách khác là giảm độ trễ khi xử lý (latency). Cache có thể được sử dụng ở nhiều nơi, ví dụng như trong các thiết bị phần cứng máy tính, trong web browser, trong database, hay trong ổ đĩa cứng,... Cùng xét một trường hợp đơn giản của cache trong web browser để hiểu cách cache tác động đến toàn hệ thống như thế nào.
 
Đầu tiên, cần phải hiểu cách làm việc của web browser, một phần trong hệ thống World Wide Web mà chúng ta vẫn sử dụng hàng ngày. Các thông tin, văn bản, hình ảnh, video,... hiển thị trên màn hình web browser của bạn thực chất được lưu trữ ở một máy tính khác, được gọi là máy chủ (server), và web browser của bạn được gọi là máy khách (client). Mỗi lần bạn cần xem thông tin gì, thì client sẽ gửi một yêu cầu (request) đến server để hỏi xin những thông tin đó, sau đó server gửi trả lời (response) đến client, kèm bên trong là dữ liệu bạn cần. Đó là cách WWW vận hành.
 
Tuy nhiên, khi bạn vào một trang web, hay thực hiện một cú click, thì không chỉ một mà rất nhiều request được gửi đến server. Mà thực tế thì tốc độ truyền dữ liệu trên Internet là rất chậm, nếu so với việc truyền dữ liệu trên máy tính của bạn. Tốc độ truyền dữ liệu từ cao đến thấp được xếp theo thứ tự sau:
1. Tốc độ xử lý dữ liệu của processor.
2. Tốc độ xử lý dữ liệu trên bộ nhớ chính, hay còn gọi là main memory, RAM.
3. Tốc độ xử lý dữ liệu trên bộ nhớ phụ, hay còn gọi là mass memory, chính là ổ đĩa cứng, USB, ổ đĩa mềm,...
4. Tốc độ truyền dữ liệu trên Internet.
 
 
Do đó, nếu web browser phải gửi tất cả request trên đến server và đợi server response để hiển thị kết quả cho người dùng thì độ trễ là rất lớn, nghĩa là người dùng phải chờ đợi lâu hơn. Đây là lúc cache vào cuộc.
 
Thay vì gửi tất cả request đến server như trong trường hợp trên, thì người ta mới nghĩ ra cách đặt một bộ nhớ nhỏ, với tốc độ phản hồi nhanh, ở ngay cạnh client, để client request vào đấy. Đặc điểm của bộ nhớ nhỏ này là có dung lượng nhỏ, tốc độ xử lý dữ liệu nhanh, tốc độ phản hồi (response) request nhanh, và lưu trữ bản copy của một số dữ liệu trên server. Bộ nhớ nhỏ được nói đến ở đây chính là cache. Khi client cần data, nó sẽ request đến cache trước để xem data có ở đó hay không. Nếu có thì lấy về dùng (trường hợp này được gọi là cache hit), còn nếu không có (cache miss) thì phải request đến server để lấy dữ liệu về, đồng thời lưu một bản copy của dữ liệu đó vào trong cache. Do đó, các dữ liệu thường xuyên được request sẽ ưu tiên được lưu trong cache. Hệ thống có tỉ lệ cache hit càng cao, thì latency càng thấp. 
 
Tương tự như trong cách một chiêc máy tính hoạt động. Toàn bộ các công việc xử lý tính toán dữ liệu đều do CPU phụ trách. Mà dữ liệu được lưu trong ổ cứng, vốn có tốc độ truy xuất chậm. Vì vậy để tăng tốc hệ thống, người ta đặt RAM, vốn có tốc độ ghi đọc dữ liệu nhanh, vào giữa. Khi CPU cần dữ liệu để tính toán, RAM sẽ load từng block dữ liệu ở ổ cứng lên, và CPU chỉ việc đọc dữ liệu trong RAM. Trong trường hợp này có thể coi RAM chính là cache của ổ cứng. Không dừng lại ở đó, vì muốn chiếc máy tính được nhanh hơn nữa, người ta tiếp tục đặt các cache L1, L2, thậm chí là L3 vào giữa CPU và RAM, với nguyên lý tương tự như trên, và tạo ra hệ thống với cache nhiều lớp.
 
Tới đây có 2 câu hỏi thường được đặt ra. Thứ nhất là liệu dữ liệu trong cache có khả năng bị cũ (stale) so với dữ liệu thực tế trên database. Đây là một thách thức mà các hệ thống cache phải đối mặt, thường được biết đến với cái tên Cache Invalidation. Nhiệm vụ của các kỹ sư là phải xác định khi nào thì nên cập nhật dữ liệu trong cache, phải biết được nếu một row dữ liệu trên database bị thay đổi, thì tất cả các dữ liệu trên cache liên quan đến row đó đều phải bị invalidate.
 
Câu hỏi thứ hai là tại sao không thiết kế một chiếc máy tính với toàn bộ bộ nhớ đều có tốc độ truy xuất của L1, khi đó thì không phải thiết kế máy tính một cách phức tạp nữa. Câu trả lời ở đây chính là giá thành. Các bộ nhớ có tốc độ xử lý càng nhanh thì giá thành càng cao, vì vậy để tạo ra một chiêc máy tính lí tưởng như trên thì chi phí là rất đắt đỏ. Mục đính chính của việc sử dụng cache là để làm sao có thể tăng tốc cả một hệ thống lớn bằng một tác động nhỏ, với chi phí cực kì hợp lí. Trong lĩnh vực máy tính cũng như nhiều lĩnh vực khác, có một khái niệm được gọi là Locality of Reference. Khái niệm này phát biểu trong một chương trình lớn hoạt động, thì chỉ có một phần nhỏ trong đó được sử dụng. Việc của các kỹ sư là phải xác định được phần nhỏ đó, bỏ ra chi phí để tối ưu nó, và việc tối ưu đó thậm chí đạt được 95% độ hiệu quả so với việc tối ưu toàn hệ thống. Có thể thấy, thay vì tạo ra một chiếc máy tính hay hệ thống được tối ưu tất cả mọi thành phần với chi phí đắt đỏ, thì việc tạo ra một hệ thống có sử dụng cache và đạt hiệu năng gần như tương đương, với chi phí rẻ hơn nhiều, là một chiến lược khôn ngoan hơn.

Comments

Popular posts from this blog

[Kiến trúc máy tính] Phần 1: Từ tín hiệu sóng điện từ đến phần mềm máy tính

Chặng đường thứ nhất: Toán học và khát khao

Hợp và tan