Bộ nhớ Cache làm việc như thế nào ?

Bộ nhớ Cache là bộ nhớ tốc độ cao có sẵn trong CPU với mục đích tăng tốc độ truy cập dữ liệu và những lệnh lưu trữ trong bộ nhớ RAM .
Giới thiệu

 Bộ nhớ Cache là bộ nhớ tốc độ cao có sẵn trong CPU với mục đích tăng tốc độ truy cập dữ liệu và những lệnh lưu trữ trong bộ nhớ RAM . Trong bài này chúng tôi giải thích nó làm việc như thế nào một cách dễ hiểu nhất .

 Máy tính hoàn toàn là đồ vứt đi nếu bạn không nói cho bộ vi xử lí ( CPU ) biết phải làm cái gì . Điều đó được thực hiện thông quan chương trình , trong đó có chữa danh sách những lệnh nói cho CPU biết phải làm những gì .

 CPU lấy những chương trình từ bộ nhớ RAM . Vấn đề với bộ nhớ RAM khi mà nguồn điện bị mất thì nội dung chứa bên trong nó bị mất – bộ nhớ RAM loại này hay cồn gọi là “Volatile” . Như vậy những chương trình và dữ liệu phải được lưu trữ trong những bộ nhớ kiểu Non-Volatile ( có nghĩa là nội dung chứa trong đó không bị mất khi bạn tắt nguồn điện ) như là ổ đĩa cứng , đĩa quang ( CDROM , DVD ROM ... ) .

 Khi bạn bấm đúp vào một Icon trong Windows để chạy chương trình , thông thường chương trình được lưu trữ trên ổ cứng của máy tính , nó sẽ được tải vào bộ nhớ RAM , và sau đó từ bộ nhớ RAM CPU tải chương trình qua mạch gọi là Bộ phận điều khiển bộ nhớ , mà nằm bên trong Chipset ( NorthBride ) với những bộ vi xử lí Intel hoặc bên trong CPU với những bộ vi xử lí của AMD .

 

\"/\" 

 

Hình 1 : Dữ liệu lưu trữ được truyền tới CPU như thế nào

 CPU không thể lấy dữ liệu trực tiếp từ những ổ đĩa cứng bởi vì chúng quá chậm , thậm trí ngay cả đối với những ổ cứng nhanh nhất hiện nay . Ngay bầy giờ cung cấp cho các bạn về khái niệm này như ổ đĩa cứng SATA 300  – kiểu ổ đĩa thông thường nhanh nhất hiện nay có khả năng truyền tốc độ dữ liệu là 300MB/s . Với một CPU chạy với tốc độ xung nhịp bên trong là 2GHz ví dụ với độ rộng đường dữ liệu bên trong là 64-bit thì tốc độ truyền dữ liệu bên trong là 16GB/s – gấp hơn 50 lần .

 Sự khác nhau về tốc độ chính là ở chỗ ổ đĩa cứng thông dụng hiện nay là những hệ thống thống cơ khí , chậm hơn rất nhiều so với những hệ thống điện tử .

 Và có vấn đề nữa xảy ra chính là bộ nhớ RAM nhanh nhất hiện nay không nhanh bằng tốc độ xử lí của CPU . Nếu có bộ nhớ DDR2-800 , có tốc độ truyền dữ liệu 6400MB/s tới 128000 MB/s nếu dùng với cấu hình Dual-Channel . Thậm trí mặc dù số này cũng gần bằng với tốc độ 16GB/s như ví dụ đã đề cập trước đó thì những CPU hiện nay có khả năng lấy trước dữ liệu từ bộ nhớ Cache L2 có độ rộng 128 hoặc 256-bit thì lúc đó chúng ta có tốc độ 32GB/s hoặc 64GB/s với CPU làm việc với tốc độ bên trong là 2GHz . Chúng tôi sẽ nói tới bộ nhớ Cache L2 sau này , nhưng nói tóm lại đó là những ví dụ để cho thấy bộ nhớ RAM có tốc độ chậm hơn CPU .

Tốc độ truyền dữ liệu được tính theo công thức

Tốc độ truyền = Độ rộng Bus nhớ x Tốc độ xung nhịp x Số dữ liệu truyền trong một chu kì xung nhịp / 8

 

Một vấn đề tiếp theo không chỉ liên quan tới tốc độ truyền dữ liệu mà chính là thời gian trễ . Thời gian trễ ( hay còn gọi là thời gian truy cập – Latency ) là thời gian bao lâu mà bộ nhớ trì hoãn cung cấp dữ liệu lại với những yêu cầu của CPU – điều đó có nghĩa là không phải xảy ra ngay lập tức . Khi CPU yêu cầu lệnh hoặc dữ liệu mà lưu trữ tại một địa chỉ xác định , thì bộ nhớ sẽ trì hoãn một thời gian nào đó để cung cấp quay trở lại lệnh hoặc dữ liệu . Với bộ nhớ hiện thời , nếu trên nhãn có ghi là CL ( CAS Latency ) là 5 , thì có nghĩa là bộ nhớ sẽ cấp phát dữ liệu yêu cầu sau 5 chu kì xung nhịp của bộ nhớ - điều này có nghĩa là CPU sẽ phải chờ .

 Việc chờ đợi sẽ làm giảm hiệu suất hoạt động của CPU . Nếu CPU phải chờ 5 chu kì xung nhịp của bộ nhớ để nhận lệnh hoặc dữ liệu nó yêu cầu thì hiệu suất làm việc của nó chỉ bằng 1/5 hiệu suất làm việc với bộ nhớ mà cung cấp dữ liệu yêu cầu ngay lập tức . Nói một cách khác , khi truy cập bộ nhớ DDR2-800 với CL5 thì hiệu suất làm việc của CPU nhận được bằng với tốc độ 160MHz ( 800 MHz / 5 ) . Trên thực tế hiệu suất làm việc không giảm nhiều đến như vậy bởi vì bộ nhớ có kiểu làm việc gọi là “Burst Mode” . Với kiểu “Burst Mode” thì dữ liệu thứ hai trong luồng dữ liệu được cấp phát ngay lập tức nếu nó được lưu trữ theo địa chỉ kề nhau ( thông thường những lệnh của chương trình được lưu trữ theo những địa chỉ liên tiếp .

 Ví dụ với bộ nhớ có ghi 5-1-1-1 thì có nghĩa là dữ liệu đầu tiên được cấp phát sau 5 chu kì xung nhịp của bộ nhớ và từ dữ liệu thứ hai trong luồng dữ liệu sẽ được cấp phát chỉ với 1 chu kì xung nhịp – nếu nó lưu trữ theo địa chỉ liền kề .

 RAM động và RAM tĩnh

  Có hai kiểu RAM cho bộ nhớ hiện nay : động ( Dynamic RAM – DRAM ) và tĩnh ( Static RAM – SRAM ) . Bộ nhớ RAM dùng cắm trên Motherboard hiện nay là RAM động . Kiểu bộ nhớ này mỗi Bit dữ liệu được lưu trữ trong Chip nhớ trong tụ điện nhỏ . Những tụ điện này là những linh kiện rất nhỏ , nghĩa là hàng triệu tụ điện trên một vùng có diện tích nhỏ - gọi là mật độ cao . Những tụ điện này sẽ mất điện tích trong một thời gian nào đó , có nghĩa là dữ liệu lưu trong đó bị mất , vì thế bộ nhớ động cần một quá trình nạp lại điện gọi là Refresh , mà thường xảy ra liên tục theo mỗi chu kì nhất định . Trong thời gian Refresh dữ liệu không có thể Đọc hoặc Ghi được . Bộ nhớ động rẻ hơn bộ nhớ tĩnh và mức độ tiêu thụ năng lượng ít hơn . Nhưng như chúng ta đã nói , dữ liệu bộ nhớ RAM động không sẵn sàng ngay lập tứ và nó làm việc chậm hơn so với CPU .

 Bộ nhớ tĩnh ( SRAM ) có thể làm việc với tốc độ nhanh bằng tốc độ của CPU , bởi vì mỗi Bit dữ liệu được lưu trữ trong một mạch lật ( Flip-Flop ) , mà nó có thể cấp phát dữ liệu với thời gian trễ bằng 0 hoặc rất nhỏ , bởi vì mạch lật không yêu cầu chu kì Refresh . Nhưng có một vấn đề xảy ra đó là để sản xuất ra một mạch lật lại phải dùng tới vài Transistor , điều đó cũng đồng nghĩa với nó có kích thước lớn hơn so với DRAM . Như vậy SRAM sẽ có mật độ thấp . Vì thế có hai vấn đề xảy ra với SRAM đó là vô cùng đắt và tiêu thụ nhiều năng lượng – như vậy chạy sẽ nóng hơn .

 Bảng bên dưới tóm tắt sự khác nhau chính giữa DRAM và SRAM

  

 

DRAM

SRAM

Mạch lưu trữ

Tụ điện

Mạch lật

Tốc độ truyền dữ liệu

Chậm hơn CPU

Tương tự như CPU

Thời gian trễ

Cao

Thấp

Mật độ

Cao

Thấp

Công suất tiêu thụ

Thấp

Cao

Giá thành

Rẻ

Đắt

 

 Mặc dù SRAM nhanh hơn DRAM , nhưng những bất lợi của nó không cho phép dùng làm bộ nhớ chính trên Motherboard .

 Giải pháp tìm ra để giảm ảnh hưởng của bộ nhớ RAM chậm hơn CPU đó là dùng số lượng SRAM nhỏ giữa CPU và bộ nhớ RAM . Kỹ thuật này gọi là bộ nhớ Cache và hiện nay một số lượng bộ nhớ SRAM nhỏ nằm bên trong bộ vi xử lí .

 Bộ nhớ Cache sẽ copy hầu hết dữ liệu truy cập từ RAM tới bộ nhớ SRAM và cố gắng dự đoán trước những dữ liệu nào mà CPU sẽ cần đến tiếp theo để tải chúng tới SRAM trước khi CPU yêu cầu cần đến nó . Với mục đích để làm cho CPU truy cập tới bộ nhớ Cache thay thế cho việc truy cập trực tiếp tới bộ nhớ RAM , khi đó nó có thể tìm lại được dữ liệu từ bộ nhớ Cache ngay lập tức hoặc gần ngay lập tức . CPU truy cập vào bộ nhớ Cache càng nhiều thay vì truy cập tới RAM chính thì hệ thống sẽ càng nhanh .

Lịch sử của Bộ nhớ Cache trong PC

 Trong phần này chỉ chú trọng tới lịch sử của bộ nhớ Cache . Nếu không quan tâm bạn có thể bỏ qua .

 Bộ nhớ Cache ban đầu được dùng cho những máy tính với những bộ vi xử lí 386DX . Lúc đó CPU không có bộ nhớ Cache bên trong và phải cần mạch điện hỗ trợ - có nghĩa là Chipset có bộ phận điều khiển bộ nhớ Cache . Như vậy lúc đó bộ nhớ Cache là phần mở rộng và là một sự lựa chọn và như vậy nhà sản xuất Motherboard có thể thêm nó hoặc không . Nếu Motherboard không có bộ nhớ Cache sẽ chậm hơn PC có chứa mạch điện này . Tổng số dung lượng Cache lúc đó là thay đổi được tùy thuộc vào kiểu của Motherboard , vào thời gian đó thông thường là 64KB hoặc 128KB . Khi đó Bộ phận điều khiển bộ nhớ Cache sử dụng cấu trúc là “Write-Through” , là một hoạt động Ghi – có nghĩa là khi CPU muốn lưu dữ liệu vào bộ nhớ - thì Bộ phận điều khiển bộ nhớ Cache sẽ cập nhật bộ nhớ RAM ngay lập tức .

 Với bộ vi xử lí 486DX , Intel thêm số lượng nhỏ ( 8KB ) bộ nhớ Cache bên trong CPU . Bộ nhớ Cache bên trong này đã được gọi là L1 ( Level 1 ) hoặc “bên trong – Internal” , trong khi đó bộ nhớ Cache bên ngoài đã được gọi là L2 ( Level 2 ) hoặc “ bên ngoài – External”  . Tổng số bộ nhớ Cache L2 lúc đó phụ thuộc vào kiểu của Motherboard . Thông thường trong thời gian đó nó có dung lượng là 128KB hoặc 256KB . Những Model về sau của 486 thêm cấu trúc Cache gọi là “ Write-Back “ , mà được dùng cho tới ngày nay . Với cấu trúc “Write-Back” những phép Ghi bộ nhớ RAM không được cập nhật ngay lập tức , CPU lưu trữ dữ liệu vào bộ nhớ Cache và Bộ phận điều khiển bộ nhớ cập nhật bộ nhớ RAM chỉ khi “Cache Miss” xảy ra . Cache Miss là lúc CPU không tìm thấy dữ liệu cần thiết trong bộ nhớ Cache mà phải lấy trực tiếp từ bộ nhớ RAM .

 Sau đó với những bộ vi xử lí Pentium đầu tiên , Intel tạo ra hai bộ nhớ Cache bên trong riêng biệt , một cho những lệnh và một cho dữ liệu ( vào thời điểm đó chỉ có 8KB cho mỗi kiểu ) . Cấu trúc này vẫn còn được dùng cho tới ngày nay , và đó là tại sao đôi khi bạn nhìn thấy bộ nhớ Cache L1 có ghi 64KB + 64KB - điều đó có nghĩa là bộ nhớ Cache L1 có dung lượng 128KB chia ra làm hai mỗi phần 64KB . Tất nhiên chúng tôi sẽ giải thích sau về sự khác nhau giữa hai phần đó . Vào thời điểm đó bộ nhớ Cache L2 vẫn tiếp tục được gắn trên Motherboard và dung lượng của nó phụ thuộc vào kiểu Motherboard và thông thường là 256KB và 512KB

 

\"/\"

 

Hình 2 : Vị trí của bộ nhớ Cache L2 trên Motherboard

 Với những bộ vi xử lí AMD như dòng K5, K6 và K6-2 dùng cùng cấu trúc như trên , nhưng với K6-III có bộ nhớ Cache thứ 3 ( L3 , Level 3 ) .

 Có một vấn đề với bộ nhớ Cache L2 cắm ngoài đó là truy cập vào nó với tốc độ thấp hơn . Ví dụ từ bộ vi xử lí 486DX2 thì tốc độ bên trong của CPU khác với tốc độ bên ngoài của CPU . Trong khi Pentium-200 làm việc với tốc độ bên trong là 200MHz , nó truy cập bộ nhớ Cache L2 với tốc độ là 66MHz .

 Sau đó với cấu trúc P6 , Intel đã chuyển bộ nhớ Cache từ Motherboard vào bên trong CPU - điều đó cho phép CPU truy cập nó với tốc độ bên trong của CPU - ngoại trừ Pentium II . Với dòng Pentium II bộ nhớ Cache L2 không nằm bên trong CPU nhưng nó lại nằm trên cùng bảng mạch in mà CPU được hàn lên đó ( bảng mạch in này được gói vào chung một vỏ ) , chạy với tốc độ bằng ½ tốc độ bên trong của CPU , và trên Celeron-266 và Celeron-300 không có bộ nhớ Cache này .

 

\"/\" 

 

Hình 3 : 03 linh kiện hàn phía sau lưng CPU chính là bộ nhớ Cache L2

 
Ngày nay bộ nhớ Cache L1 và L2 được tích hợp bên trong CPU và chạy với tốc độ bằng với tốc độ bên trong của CPU . Do đó số lượng bộ nhớ Cache phụ thuộc vào kiểu CPU , không có cách nào tăng tổng số dung lượng Cache ngoại trừ thay thế một CPU khác .
Bộ nhớ Cache

 

Hình dưới là sơ đồ khối của CPU Single-Core thông thường đơn giản

  \"/\"

Hình 4 : Sơ đồ khối cơ bản của CPU

 Những đường gạch là bên trong của bộ vi xử lí , bộ nhớ RAM nằm bên ngoài CPU . Đường dữ liệu giữa bộ nhớ RAM và CPU thông thường là 64-bit ( hoặc 128-bit với cấu hình Dual-Channel ) chạy với tốc độ của bộ nhớ hoặc tốc độ bên ngoài của CPU ( tốc độ Bus nhớ trong trường hợp là bộ vi xử lí của AMD ) thấp hơn . Chúng ta đã đề cập tới cách tính toán tốc độ trong phần trước .

 Tất cả mạch bên trong đường gạch nối chạy với tốc độ bên trong của CPU . Phụ thuộc vào CPU mà sẽ có một số phần bên trong chạy với tốc độ cao hơn . Cũng như vậy đường dữ liệu giữa những bộ phận bên trong CPU có thể rộng hơn , có nghĩa là truyền hơn 64-bít hoặc 128-bit trong một chu kì xung nhịp . Ví dụ , đường dữ liệu giữa bộ nhớ Cache L2 và Cache lệnh L1 trong những bộ vi xử lí mới nhất thông thường có độ rộng là 256-bit . Đường dữ liệu giữa Cache lệnh L1 với Fetch Unit - Bộ phận mang dữ liệu về - của CPU phụ thuộc vào kiểu CPU và thông thường là 128-bit  . Với số Bit cao hơn được truyền trong một chu kì xung nhịp thì có nghĩa là tốc độ truyền cao hơn .

 Tóm tại , tất cả những CPU mới bây giờ đều có 03 bộ nhớ Cache : L2 , lớn hơn và vị trí nằm giữa bộ nhớ RAM và Cache lệnh L1 , lưu giữ cả những lệnh và dữ liệu ; Cache lệnh L1 , để lưu trữ những lệnh để CPU thực hiện ; và Cache dữ liệu L1 , được dùng để lưu trữ dữ liệu để ghi quay trở lại bộ nhớ .

 L1 và L2 có nghĩa là “Mức 1 “ và “Mức 2” ám chỉ tới khoảng cách giữa chúng tới nhân CPU ( Execution Unit - Bộ phận thực hiện lệnh ) . Tại sao lại tách riêng bộ nhớ Cache ra làm ba phần như vậy ( Cache dữ liệu L1 , Cache lệnh L1 và Cache L2 ) .

 Thách thức lớn nhất chính là làm cho thời gian trễ của bộ nhớ tĩnh SRAM là 0 , đặc biệt với những CPU chạy với tốc độ xung nhịp rất cao . Khi đó việc sản xuất ra những bộ nhớ SRAM với thời gian trễ gần bằng 0 là vô cùng khó khăn , những nhà sản xuất chỉ có thể thực hiện việc đó với bộ nhớ Cache L1 . Bộ nhớ Cache L2 dùng SRAM không nhanh như bộ nhớ dùng trong Cache L1 , bởi vì nó sẽ có thời gian trễ , như vậy sẽ chậm hơn một chút so với bộ nhớ Cache L1 .

 Chú ý trong hình 4 và bạn sẽ nhìn thấy Cache lệnh L1 làm việc như “ Cache đầu vào “ , trong khi Cache dữ liệu L1 làm việc như “Cache đầu ra” . Cache lệnh L1 , thông thường nhỏ hơn Cache L2 – là tác động đặc biệt khi chương trình bắt đầu lặp lại những phần nhỏ trong đó , bởi vì những lệnh yêu cầu sẽ gần với Fetch Unit - Bộ phận mang dữ liệu về -  hơn .

 Điều này ít khi đề cập tới , nhưng Cache lệnh L1 cũng được dùng để lưu trữ dữ liệu khác bên cạnh những lệnh đã được giải mã . Phụ thuộc vào CPU nó có thể được dùng để lưu trữ một số dữ liệu được giải mã trước và những thông tin rẽ nhánh ( tóm lại , dữ liệu điều khiển sẽ tăng tốc độ xử lí giải mã )  và đôi khi Cache lệnh L1 lớn hơn số lượng được thông báo , bởi vì nhà sản xuất không công bố những phần Cache được thêm vào cho những thông tin đặc biệt .

 Trên những phần nói về đặc tính kỹ thuật của CPU có thể thấy một số kiểu khác nhau . Một số nhà sản xuất đưa ra danh sách hai bộ nhớ Cache L1 riêng biệt ( đôi khi gọi Cache lệnh là “I” và Cache dữ liệu là “D”) hoặc đôi khi gộp cả hai bộ nhớ Cache này là một như kiểu “128KB , riêng biệt “ điều đó có nghĩa là 64KB Cache lệnh và 64KB Cache dữ liệu . Ngoại trừ những CPU dựa trên vi cấu trúc Netburst như : Pentium 4 , Pentium D , Xeon dựa trên cấu trúc Pentium 4 và những Celeron dựa trên Pentium 4 .

 Những bộ vi xử lí dựa trên vi cấu trúc Netburst không có Cache lệnh L1 , thay vào đó chúng có Cache với tên gọi Trace Execute , bộ nhớ Cache này nằm giữa bộ phận giải mã ( Decode Unit ) và bộ phận thực hiện lệnh ( Execution Unit ) , những lệnh lưu trữ đã được giải mã .. Do đó Cache lệnh L1 ở vị trí đó , những với tên gọi khác và nằm ở vị trí khác . Chúng tôi đề cập tới vấn đề như vậy bởi vì những nhầm lẫn khi nghĩ rằng những bộ vi xử lí Pentium 4 không có Cache lệnh L1 . Do đó khi so sánh Pentium 4 với những CPU khác nhiều người sẽ nghĩ rằng Cache L1 của nó nhỏ hơn bởi vì chỉ có có 8KB Cache dữ liệu L1 . Cache với tên gọi Trace Execution của những CPU dựa trên cấu trúc Netburst có dung lượng là 150KB .

 Bộ nhớ Cache L2 trong những CPU nhiều lõi ( Multi-Core )

 Trong những CPU có nhiều hơn một lõi thì có nhiều cấu trúc Cache L2 khác nhau phụ thuộc vào CPU .

 Những bộ vi xử lí Pentium D và AMD Dual-Core dựa trên cấu trúc K8 thì mỗi lõi CPU có bộ nhớ Cache L2 riêng biệt . Do đó mỗi lõi làm việc độc lập với nhau .

 Những CPU của Intel Dual-Core dựa trên vi cấu trúc Core và vi cấu trúc Pentium M , chỉ có Cache L2 được làm việc chia xẻ giữa hai lõi .

 Intel nói rằng cấu trúc chia xẻ như vậy là tốt hơn , bởi vì việc sử dụng Cache riêng biệt sẽ xảy ra trường hợp một lúc nào đó một lõi đã dùng hết bộ nhớ Cache L2 trong khi một lõi khác lại dùng không hết bộ nhớ Cache L2 . Khi điều đó xảy ra , lõi đầu tiên có thể phải lấy dữ liệu từ bộ nhớ RAM , thậm trí nó nghĩ rằng bộ nhớ Cache L2 của lõi thứ hai vẫn còn chỗ trống để lưu trữ dữ liệu và ngăn chặn việc truy cập tới bộ nhớ RAM , điều đó làm cho hiệu suất hệ thống giảm xuống . Do đó những bộ vi xử lí Core 2 Duo với bộ nhớ Cache L2 4MB thì một lõi có thể làm việc với 3.5MB trong khi lõi khác làm việc với dung lượng 512KB , ngược lại việc chia cố định 50%-50% dùng trong những bộ vi xử lí Dual-Core khác .

 Nói một cách khác những CPU Quad-Core củ Intel hiện nay như Core 2 Extreme QX và Core 2 Quad dùng hai Chip Dual-Core , có nghĩa là việc chia xẻ bộ nhớ Cache chỉ xảy ra giữa lõi 1&2 và 3&4 . Trong tương lai Intel có kế hoạch tung ra CPU Quad-Core dùng trên cùng một tấm Silicon . Khi đó bộ nhớ Cache L2 sẽ được dùng chung chia xẻ cho 04 lõi một cách linh hoạt .

 

\"/\" 

 

Hình 5 : So sánh giữa giải pháp Cache L2 hiện thời trong những CPU Multi-Core

 Những CPU của AMD dựa trên cấu trúc K10 sẽ có bộ nhớ Cache L3 chia xẻ bên trong bộ vi xử lí , lai ghép giữa hai phương pháp trên . Kích thước của Cache sẽ phụ thuộc vào kiểu của CPU như đã từng xảy ra đối với Cache L2 .

 

 \"/\"

 Hình 6 : Cấu trúc Cache K10

 Bạn bấm vào đây để xem tiếp phần cuối

\"\"\"\"