Thảo luận Bộ nhớ Cache

Một máy tính sẽ hoàn toàn vô dụng nếu bạn không bắt bộ vi xử lý (CPU) thực hiện một nhiệm vụ nào đó. Công việc sẽ được thực hiện thông qua một chương trình, chương trình này lại gồm rất nhiều các chỉ lệnh để ra lệnh cho CPU làm việc.

 

CPU lấy các chương trình từ bộ nhớ RAM. Tuy nhiên có một vấn đề với bộ nhớ RAM đó là khi nguồn nuôi của nó bị cắt thì các thành phần dữ liệu được lưu trong RAM cũng sẽ bị mất – chính điều này nên một số người nói rằng bộ nhớ RAM là một môi trường “dễ bay hơi”. Các chương trình và dữ liệu như vậy phải được lưu trên môi trường không “dễ bay hơi” sau khi tắt máy tính (giống như các ổ đĩa cứng hay các thiết bị quang như đĩa CD và DVD).

 

Khi kích đúp vào một biểu tượng trong Windows để chạy một chương trình nào đó. Các chương trình thông thường được lưu trên ổ đĩa cứng của máy tính, khi được gọi nó sẽ được nạp vào bộ nhớ RAM sau đó từ bộ nhớ RAM, CPU nạp chương trình thông qua một mạch có tên gọi là memory controller, thành phần này được đặt bên trong chipset (north bridge chip- chíp cực bắc) trên các bộ vi xử lý Intel hoặc bên trong CPU trên các bộ vi xử lý AMD.

 

CPU không thể tìm nạp dữ liệu trực tiếp từ các ổ đĩa cứng vì tốc độ truy suất dữ liệu của ổ đĩa cứng là quá thấp với nó, thậm chí nếu nếu bạn có cả ổ đĩa cứng với tốc độ truy suất lớn nhất. Hãy lấy một số ví dụ làm dẫn chứng cho điều này, ổ cứng SATA-300 – một loại ổ đĩa cứng có tốc độ nhanh nhất hiện đang được cung cấp ngày nay đến phần lớn người dùng – có tốc độ truyền tải theo lý thuyết là 300 MB/s. Một CPU chạy với tốc độ 2GHz với đường dữ liệu* 64-bit sẽ truyền tải dữ liệu bên trong với tốc độ 16GB/s – như vậy là lớn gấp 50 lần.

 

- Đường dữ liệu: Các đường giữa các mạch bên trong CPU. Chỉ cần một phép toán đơn giản bạn cũng có thể biết được rằng mỗi CPU có một số đường dữ liệu khác nhau bên trong, mỗi một đường trong chúng lại có chiều dài khác nhau. Ví dụ với các bộ vi xử lý AMD thì đường dữ liệu giữa L2 memory cache và L1 memory cache có độ rộng 128-bit, trong khi đó của Intel là 256-bit. Đây chỉ là giải thích con số mà chúng tôi đã công bố trong đoạn trên không cố định, nhưng dẫu sao CPU luôn nhanh hơn rất nhiều so với các ổ đĩa cứng.

 

Sự khác nhau trong tốc độ cũng bắt nguồn từ một thực tế đó là các ổ đĩa cứng còn bao gồm cả hệ thống cơ khí, các hệ thống cơ khí này bao giờ cũng chậm hơn hệ thống điện tử thuần túy, các thành phần cơ khí phải chuyển động để dữ liệu mới có thể được đọc ra (điều này chậm hơn rất nhiều so với việc chuyển động của điện tử). Hay nói cách khác, bộ nhớ RAM là 100% điện tử, có nghĩa là nó sẽ nhanh hơn tốc độ của ổ đĩa cứng và quang.

 

Tuy nhiên đây chính là vấn đề, thậm chí bộ nhớ RAM nhanh nhất cũng không nhanh bằng CPU. Nếu bạn sử dụng các bộ nhớ DDR2-800, chúng truyền tải dữ liệu ở tốc độ 6.400 MB/s – 12.800 MB/s nếu sử dụng chế độ hai kênh. Thậm chí con số này còn có thể lên đến 16GB/s trong ví dụ trước, vì các CPU hiện nay còn có thể tìm nạp dữ liệu từ L2 memory cache ở tốc độ 128- bit hay 256-bit, chúng ta đang nói về 32 GB/s hoặc 64 GB/s nếu CPU làm việc bên trong với tốc độ 2GHz. Bạn không nên lo lắng về những vấn đề với “L2 memory cache”, chúng tôi sẽ giải thích vấn đề này sau. Tất cả những gì bạn cần nhớ là bộ nhớ RAM chậm hơn CPU

 

docx21 trang | Chia sẻ: oanh_nt | Lượt xem: 1332 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Thảo luận Bộ nhớ Cache, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
NHÓM X : Nguyễn Tiến Long Đinh Quang Sáng Dương Mai Hương Trần Tiến Mạnh Phạm Tiến Dự Phạm Huy Hùng ĐHKHTN - ĐHQGHN Cách làm việc  Một máy tính sẽ hoàn toàn vô dụng nếu bạn không bắt bộ vi xử lý (CPU) thực hiện một nhiệm vụ nào đó. Công việc sẽ được thực hiện thông qua một chương trình, chương trình này lại gồm rất nhiều các chỉ lệnh để ra lệnh cho CPU làm việc.  CPU lấy các chương trình từ bộ nhớ RAM. Tuy nhiên có một vấn đề với bộ nhớ RAM đó là khi nguồn nuôi của nó bị cắt thì các thành phần dữ liệu được lưu trong RAM cũng sẽ bị mất – chính điều này nên một số người nói rằng bộ nhớ RAM là một môi trường “dễ bay hơi”. Các chương trình và dữ liệu như vậy phải được lưu trên môi trường không “dễ bay hơi” sau khi tắt máy tính (giống như các ổ đĩa cứng hay các thiết bị quang như đĩa CD và DVD).  Khi kích đúp vào một biểu tượng trong Windows để chạy một chương trình nào đó. Các chương trình thông thường được lưu trên ổ đĩa cứng của máy tính, khi được gọi nó sẽ được nạp vào bộ nhớ RAM sau đó từ bộ nhớ RAM, CPU nạp chương trình thông qua một mạch có tên gọi là memory controller, thành phần này được đặt bên trong chipset (north bridge chip- chíp cực bắc) trên các bộ vi xử lý Intel hoặc bên trong CPU trên các bộ vi xử lý AMD.  CPU không thể tìm nạp dữ liệu trực tiếp từ các ổ đĩa cứng vì tốc độ truy suất dữ liệu của ổ đĩa cứng là quá thấp với nó, thậm chí nếu nếu bạn có cả ổ đĩa cứng với tốc độ truy suất lớn nhất. Hãy lấy một số ví dụ làm dẫn chứng cho điều này, ổ cứng SATA-300 – một loại ổ đĩa cứng có tốc độ nhanh nhất hiện đang được cung cấp ngày nay đến phần lớn người dùng – có tốc độ truyền tải theo lý thuyết là 300 MB/s. Một CPU chạy với tốc độ 2GHz với đường dữ liệu* 64-bit sẽ truyền tải dữ liệu bên trong với tốc độ 16GB/s – như vậy là lớn gấp 50 lần.  - Đường dữ liệu: Các đường giữa các mạch bên trong CPU. Chỉ cần một phép toán đơn giản bạn cũng có thể biết được rằng mỗi CPU có một số đường dữ liệu khác nhau bên trong, mỗi một đường trong chúng lại có chiều dài khác nhau. Ví dụ với các bộ vi xử lý AMD thì đường dữ liệu giữa L2 memory cache và L1 memory cache có độ rộng 128-bit, trong khi đó của Intel là 256-bit. Đây chỉ là giải thích con số mà chúng tôi đã công bố trong đoạn trên không cố định, nhưng dẫu sao CPU luôn nhanh hơn rất nhiều so với các ổ đĩa cứng.  Sự khác nhau trong tốc độ cũng bắt nguồn từ một thực tế đó là các ổ đĩa cứng còn bao gồm cả hệ thống cơ khí, các hệ thống cơ khí này bao giờ cũng chậm hơn hệ thống điện tử thuần túy, các thành phần cơ khí phải chuyển động để dữ liệu mới có thể được đọc ra (điều này chậm hơn rất nhiều so với việc chuyển động của điện tử). Hay nói cách khác, bộ nhớ RAM là 100% điện tử, có nghĩa là nó sẽ nhanh hơn tốc độ của ổ đĩa cứng và quang.  Tuy nhiên đây chính là vấn đề, thậm chí bộ nhớ RAM nhanh nhất cũng không nhanh bằng CPU. Nếu bạn sử dụng các bộ nhớ DDR2-800, chúng truyền tải dữ liệu ở tốc độ 6.400 MB/s – 12.800 MB/s nếu sử dụng chế độ hai kênh. Thậm chí con số này còn có thể lên đến 16GB/s trong ví dụ trước, vì các CPU hiện nay còn có thể tìm nạp dữ liệu từ L2 memory cache ở tốc độ 128- bit hay 256-bit, chúng ta đang nói về 32 GB/s hoặc 64 GB/s nếu CPU làm việc bên trong với tốc độ 2GHz. Bạn không nên lo lắng về những vấn đề với “L2 memory cache”, chúng tôi sẽ giải thích vấn đề này sau. Tất cả những gì bạn cần nhớ là bộ nhớ RAM chậm hơn CPU.  Bằng cách đó, tốc độ truyền tải có thể được tính bằng sử dụng công thưc dưới đây (trong tất cả các ví dụ từ đầu tới giờ, “dữ liệu trên một clock” vẫn được tính bằng “1”):  [Tốc độ truyền tải] = [Độ rộng (số lượng bít)] x [tốc độ clock] x [dữ liệu trên một clock] / 8  Vấn đề không chỉ dừng lại ở tốc độ truyền tải mà còn cả độ trễ. Độ trễ (thời gian truy cập) là lựợng thời gian mà bộ nhớ giữ chậm trong việc chuyển ngược trở lại dữ liệu mà CPU đã yêu cầu trước đó – điều này không thể thực hiện được ngay lập tức. Khi CPU yêu cầu chỉ lệnh (hoặc dữ liệu) được lưu tại một địa chỉ nào đó thì bộ nhớ sẽ giữ chậm một khoảng thời gian để phân phối lệnh này (hoặc dữ liệu) trở ngược lại. Trên các bộ nhớ hiện nay, nếu nó được dán nhãn có CL bằng 5 (CAS Latency, đây chính là độ trễ mà chúng ta đang nói đến) thì điều đó có nghĩa rằng bộ nhớ sẽ cung cấp dữ liệu đã được yêu cầu sau 5 chu kỳ clock nhớ - nghĩa là CPU sẽ phải chờ đợi.  Việc chờ đợi sẽ làm giảm hiệu suất của CPU. Nếu CPU phải đợi đến 5 chu kỳ clock để nhận được chỉ lệnh hoặc dữ liệu mà nó đã yêu cầu thì hiệu suất của nó sẽ chỉ còn 1/5 so với hiệu suất sử dụng bộ nhớ có khả năng cung cấp dữ liệu tức thời. Nói theo cách khác, khi truy cập bộ nhớ DDR2-800 với CL5 thì hiệu suất của CPU bằng với hiệu suất của CPU làm việc với bộ nhớ 160 MHz (800 MHz / 5) với khả năng cung cấp dữ liệu tức thời. Trong thế giới thực, việc giảm hiệu suất không nhiều vì các bộ nhớ làm việc dưới chế độ có tên gọi là chế độ truyền loạt (burst mode), ở nơi mà dữ liệu được tập trung lần thứ hai có thể được cung cấp một cách ngay lập tức, nếu dữ liệu này được lưu trên một địa chỉ nối tiếp nhau (thường thì chỉ lệnh của chương trình nào đó được lưu trong các địa chỉ liên tục). Điều này được diễn tả bằng công thức “x-1-1-1” (có nghĩa “5-1-1-1” là cho bộ nhớ dùng trong ví dụ của chúng ta), có nghĩa là dữ liệu đầu tiên được cung cấp sau 5 chu kỳ xung clock, nhưng từ dữ liệu thứ hai trở đi thì chúng được cung cấp chỉ trong một chu kỳ clock – nếu nó được lưu trên địa chỉ liên tiếp giống như những gì chúng ta đã nói.  RAM động và Ram tĩnh  Có hai kiểu bộ nhớ RAM đó là RAM động (DRAM) và RAM tĩnh (SRAM). Bộ nhớ RAM đã sử dụng trên các máy tính là loại RAM động. Kiểu RAM này, mỗi bit dữ liệu được lưu bên trong chip nhớ bằng một tụ điện nhỏ, các tụ điện này là thành phần rất nhỏ, nghĩa là có đến hàng triệu tụ điện trên một vùng diện tích mạch điện nhỏ, điều này vẫn được người ta gọi là “mật độ cao”. Các tụ điện này có thể bị mất điện áp tích tụ sau một thời gian, chính vì vậy các bộ nhớ động cần phải có quá trình nạp lại, quá trình này vẫn thường được chúng ta gọi là “làm tươi” (refresh). Trong suốt chu kỳ này dữ liệu không thể được đọc ra hoặc được ghi vào. Bộ nhớ động rẻ hơn so với bộ nhớ tĩnh và cũng tiêu thụ ít năng lượng hơn bộ nhớ tĩnh. Tuy nhiên như chúng ta đã biết, trên RAM động, dữ liệu không được cung cấp một cách sẵn sàng và nó có thể không làm việc nhanh bằng CPU.  Với bộ nhớ tĩnh, đây là kiểu bộ nhớ có thể làm việc nhanh bằng CPU, vì mỗi bit dữ liệu đều được lưu trên một mạch có tên gọi flip-flop (F-F), mỗi một F-F này lại có thể cung cấp dữ liệu với độ trễ rất nhỏ, vì các F-F không yêu cầu đến chu trình làm tươi. Vấn đề ở đây là các F-F này lại yêu cầu một số transistor, có kích thước to hơn so với một tụ điện trên RAM động. Điều này có nghĩa là trên cùng một diện tích giống nhau, nơi mà ở bộ nhớ tĩnh chỉ có một F-F tồn tại thì trên bộ nhớ động sẽ có đến hàng trăm tụ điện. Chính vì vậy các bộ nhớ tĩnh thường có mật độ thấp hơn – các chíp có dung lượng thấp hơn. Hai vấn đề khác với bộ nhớ tĩnh nữa là: nó thường đắt hơn nhiều và tiêu tốn nhiều năng lượng hơn (do đó nóng hơn) so với bộ nhớ tĩnh.  Mặc dù Ram tĩnh có tốc độ nhanh hơn RAM động nhưng những nhược điểm của nó vẫn ngăn cản nó trở thành RAM chính.  Giải pháp đã tìm thấy để giảm sự ảnh hưởng trong việc sử dụng bộ nhớ RAM chậm hơn CPU là sử dụng một số lượng nhỏ các RAM tĩnh giữa CPU và bộ nhớ RAM. Công nghệ này được gọi là bộ nhớ Cache và ngày nay có một số lượng nhỏ bộ nhớ tĩnh này được đặt bên trong CPU.  Bộ nhớ Cache copy hầu hết các dữ liệu đã được truy cập gần đây từ bộ nhớ RAM vào bộ nhớ tĩnh và đoán dữ liệu gì CPU sẽ hỏi tiếp theo, tải chúng đến bộ nhớ tĩnh trước khi CPU yêu cầu thực sự. Mục đích là làm cho CPU có thể truy cập vào bộ nhớ Cache thay vì truy cập trực tiếp vào bộ nhớ RAM, vì nó có thể truy vấn dữ liệu từ bộ nhớ Cache một cách tức thời hoặc cũng hầu như ngay lập tức thay vì phải đợi khi truy cập vào dữ liệu được đặt trong RAM. CPU càng truy cập vào Cache nhớ thay cho RAM nhiều hơn thì hệ thống sẽ càng hoạt động nhanh hơn. Cũng theo đó, chúng ta sẽ sử dụng hoán đổi hai thuật ngữ “dữ liệu” và “chỉ lệnh” cho nhau vì những gì được lưu bên trong mỗi địa chỉ nhớ không có gì khác biệt đối với bộ nhớ.  Khối tìm nạp của CPU sẽ tìm kiếm chỉ lệnh kế tiếp để được thực thi trong Cache chỉ lệnh L1. Nếu không có ở đó thì nó sẽ tìm kiếm trên Cache L2. Sau khi đó nếu cũng không có thì nó sẽ phải truy cập vào bộ nhớ RAM để nạp chỉ lệnh.  Chúng tôi gọi là một “hit” khi CPU nạp một chỉ lệnh đã được yêu cầu hoặc dữ liệu từ Cache, và gọi là một “miss” nếu chỉ lệnh hoặc dữ liệu được yêu cầu không có ở đó và CPU cần phải truy cập trực tiếp vào bộ nhớ RAM để lấy dữ liệu này.  Rõ ràng khi bạn mới bật máy tính thì Cache là hoàn toàn trống rỗng, vì vậy hệ thống sẽ phải truy cập vào bộ nhớ RAM – đây là một miss đối với Cache không thể tránh. Tuy nhiên sau khi chỉ lệnh đầu tiên được nạp, thì quá trình này sẽ bắt đầu.  Khi CPU nạp một chỉ lệnh từ một vị trí nhớ nào đó thì mạch đã gọi bộ điều khiển Cache nhớ sẽ nạp vào trong Cache nhớ một khối dữ liệu nhỏ bên dưới vị trí hiện hành mà CPU vừa mới nạp. Do các chương trình thường được thực hiện theo cách tuần tự nên vị trí nhớ tiếp theo mà CPU sẽ yêu cầu có thể là vị trí ngay bên dưới vị trí nhớ mà nó vừa nạp. Cũng do bộ điều khiển Cache nhớ đã nạp một số dữ liệu bên dưới vị trí đầu tiên được đọc bởi CPU rồi nên dữ liệu kế tiếp sẽ có thể nằm ở bên trong Cache nhớ, chính vì vậy CPU không cần phải truy cập vào RAM để lấy dữ liệu trong đó: nó đã được nạp vào bên trong Cache nhớ nhúng trong CPU, điều này làm cho nó có thể truy cập với tốc độ clock bên trong.  Lượng dữ liệu này được gọi là dòng và nó thường có chiều dài 64 byte.  Bên cạnh việc nạp một số lượng nhỏ dữ liệu này, bộ điều khiển nhớ cũng luôn tìm cách đoán xem những gì CPU sẽ yêu cầu tiếp theo. Một mạch có tên gọi là mạch tìm nạp trước, sẽ nạp nhiều dữ liệu được đặt sau 64 byte đầu tiên hơn từ RAM vào Cache nhớ. Nếu chương trình tiếp tục nạp chỉ lệnh và dữ liệu từ các vị trí nhớ theo cách tuần tự như vậy thì các chỉ lệnh và dữ liệu mà CPU sẽ hỏi tiếp theo đã được nạp vào trong Cache nhớ từ trước rồi.  Chúng ta có thể tóm tắt cách Cache nhớ làm việc như sau:  1. CPU yêu cầu chỉ lệnh hoặc dữ liệu đã được lưu tại địa chỉ “a”.  2. Do nội dung từ địa chỉ “a” không có bên trong Cache nhớ nên CPU phải tìm nạp nó trực tiếp từ RAM.  3. Bộ điều khiển Cache sẽ nạp một dòng (thường là 64 byte) bắt đầu từ địa chỉ “a” vào Cache nhớ. Nó sẽ nạp nhiều hơn dữ lượng dữ liệu mà CPU yêu cầu, chính vì vậy nếu chương trình tiếp tục chạy tuần tự (nghĩa là yêu cầu địa chỉ a +1) thì chỉ lệnh hoặc dữ liệu kế tiếp mà CPU sẽ hỏi đã được nạp trong Cache nhớ từ trước đó rồi.  4. Mạch có tên gọi là tìm nạp trước sẽ nạp nhiều dữ liệu được đặt sau dòng này, có nghĩa là bắt đầu việc nạp các nội dung từ địa chỉ a + 64 trở đi vào Cache. Để cho bạn một ví dụ thực tế là các CPU của Pentium 4 có bộ tìm nạp trước 256-byte, chính vì vậy nó có thể nạp được 256byte kế tiếp sau dòng dữ liệu đã được nạp vào trong Cache.  Nếu chương trình chạy một cách tuần tự thì CPU sẽ không cần phải tìm nạp dữ liệu bằng cách truy cập trực tiếp vào bộ nhớ RAM, ngoại trừ nạp mỗi chỉ lệnh đầu tiên – vì các chỉ lệnh và dữ liệu được yêu cầu bởi CPU sẽ luôn nằm bên trong Cache nhớ trước khi CPU yêu cầu đến chúng.  Mặc dù các chương trình không chạy luôn giống như vậy, đôi khi chúng có thể nhảy từ một vị trí nhớ này sang vị trí nhớ khác. Thách thức chính của bộ điều khiển Cache chính là việc đoán những địa chỉ gì mà CPU sẽ nhảy đến, và từ đó nạp những nội dung của địa chỉ này vào trong Cache nhớ trước khi CPU yêu cầu để tránh trường hợp CPU phải truy cập vào bộ nhớ RAM là giảm hiệu suất của hệ thống. Nhiệm vụ này được gọi là dự đoán rẽ nhánh và tất cả các CPU hiện đại đều có tính năng này.  Các CPU hiện đại có tốc độ hit ít nhất cũng là 80%, nghĩa là 80% của thời gian CPU không truy cập trực tiếp vào bộ nhớ RAM, mà thay vào đó là Cache nhớ.  II. Tổ chức Cache nhớ  Cache nhớ được chia thành các dòng bên trong, mỗi một dòng dữ từ 16 đến 128byte, phụ thuộc vào CPU. Đối với đại đa số các CPU hiện hành thì Cache nhớ được tổ chức theo các dòng 64byte (512bit), chính vì vậy chúng tôi sẽ xem xét đến Cache nhớ đang sử dụng dòng 64byte trong các ví dụ xuyên suốt từ đầu hướng dẫn này. Phần dưới chúng tôi sẽ trình bày các chi tiết kỹ thuật chính của Cache nhớ cho tất cả các CPU hiện đang có trên thị trường.  Cache nhớ 512 KB L2 được chia thành 8.192 dòng. Bạn nên lưu ý rằng 1KB là 2^10 hay 1.024 byte chứ không phải là 1.000byte, chính vì vậy 524.288 / 64 = 8.192. Chúng ta sẽ xem xét đến CPU một lõi có Cache nhớ 512 KB L2 trong các ví dụ. Trên hình 5 chúng tôi mô phỏng cách tổ chức bên trong của Cache nhớ này.  Hình 5: Cách tổ chức Cache nhớ L2 512 KB Cache nhớ có thể làm việc dưới ba kiểu cấu hình khác nhau: bản đồ hóa trực tiếp, liên kết toàn bộ và tập liên kết (theo nhiều dòng).  Bản đồ hóa trực tiếp  Bản đồ hóa trực tiếp là cách đơn giản nhất để tạo một Cache nhớ. Trong cấu hình này, bộ nhớ RAM chính được chia thành các dòng bằng nhau nằm bên trong Cache nhớ. Nếu chúng ta có một hệ thống 1GB RAM thì 1GB này sẽ được chia thành 8.192 khối (giả dụ rằng Cache nhớ sử dụng cấu hình mà chúng ta đã mô tả ở trên), mỗi một khối có 128KB (1.073.741.824 / 8.192 = 131.072 – lưu ý rằng 1GB là 2^30 bytes, 1 MB là 2^20 byte và 1 KB sẽ là 2^10 byte). Nếu hệ thống của bạn có 512MB thì bộ nhớ cũng sẽ được chia thành 8.192 khối nhưng mỗi một khối này chỉ có 64 KB. Chúng tôi có minh chứng cách tổ chức này trong hình 6 bên dưới.  Hình 6: Cách bản đồ hóa trực tiếp các làm việc của Cache Ưu điển của phương pháp bản đồ hóa trực tiếp là nó là cách đơn giản nhất.  Khi CPU yêu cầu một địa chỉ nào đó từ bộ nhớ RAM (ví dụ địa chỉ 1.000) thì bộ điều khiển Cache sẽ nạp một dòng (64byte) từ bộ nhớ RAM và lưu dòng này trên Cache nhớ (nghĩa là từ địa chỉ 1.000 đến 1.063, giả dụ rằng chúng ta đang sử dụng lược đồ địa chỉ 8 bit). Vì vậy nếu CPU lại yêu cầu các nội dung của địa chỉ này hoặc của một số địa chỉ tiếp theo sau đó (nghĩa là các địa chỉ từ 1.000 đến 1.063) thì chúng sẽ được nằm sẵn bên trong Cache.  Vấn đề ở đây là nếu CPU cần đến hai địa chỉ được bản đồ hóa đến cùng một dòng Cache giống nhau, thì lúc này một miss sẽ xuất hiện (vấn đề này được gọi là hiện tượng xung đột). Tiếp tục ví dụ của chúng ta, nếu CPU yêu cầu địa chỉ 1.000 và sau đó yêu cầu địa chỉ 2.000 thì một miss cũng sẽ xuất hiện vì hai địa chỉ này đều nằm trong cùng một khối 128KB, và những gì bên trong Cache là một dòng bắt đầu từ địa chỉ 1.000. Chính vì vậy bộ điều khiển Cache sẽ nạp một dòng từ địa chỉ 2.000 và lưu nó trên dòng đầu tiên của Cache nhớ, xóa các nội dung trước đó, trong trường hợp của chúng ta thì đó là dòng từ địa chỉ 1.000.  Cũng một vấn đề nữa. Nếu chương trình có một vòng lặp nhiều hơn 64 bytes thì lúc này cũng có một miss xuất nhiện trong toàn bộ khoảng thời gian của vòng lặp.  Ví dụ, nếu vòng lặp thực hiện từ địa chỉ 1.000 đến địa chỉ 1.100 thì CPU sẽ phải nạp tất cả các chỉ lệnh trực tiếp từ bộ nhớ RAM trong suốt khoảng thời gian của vòng lặp. Vấn đề này sẽ xảy ra vì Cache sẽ có nội dung từ các địa chỉ 1.000 đến 1.063 và khi CPU yêu cầu các nội dung từ địa chỉ 1.100 thì nó sẽ phải vào bộ nhớ RAM để lấy dữ liệu, và sau đó bộ điều khiển Cache sẽ nạp các địa chỉ từ 1.100 đến 1.163. Khi CPU yêu cầu lại địa chỉ 1.000 thì nó sẽ phải quay trở lại bộ nhớ RAM, vì lúc này Cache sẽ không có các thành phần dữ liệu từ địa chỉ 1.000. Nếu vòng lặp này được thực thi 1.000 lần thì CPU sẽ phải vào bộ nhớ RAM để nạp dữ liệu cũng 1.000 lần.  Đó chính là lý do tại sao việc bản đồ hóa trực tiếp Cache nhớ lại ít hiệu quả và ít được sử dụng nữa.  Sự liên kết toàn bộ  Cấu hình liên kết toàn bộ, hay nói theo cách khác là không có sự khó khăn trong việc liên kết giữa các dòng của Cache nhớ và vị trí của bộ nhớ RAM. Bộ điều khiển Cache có thể lưu bất kỳ địa chỉ nào. Như vậy các vấn đề đã được nói ở trên sẽ không xảy ra. Cấu hình này là cấu hình hiệu quả nhất (nghĩa là cấu hình có tốc độ hit cao nhất).  Nói theo cách khác, mạch điều khiển sẽ phức tạp hơn nhiều, vì nó cần phải giữ được việc kiểm tra xem các vị trí nhớ nào được nạp bên trong Cache nhớ. Điều này là lý do cho ra đời một giải pháp lai – có tên gọi là tập liên kết – được sử dụng rộng rãi ngày nay Bộ nhớ Cache là kiểu bộ nhớ tốc độ cao có bên trong CPU để tăng tốc độ truy cập cho dữ liệu và các chỉ lệnh được lưu trong bộ nhớ RAM. III. Cấu trúc Cache Các Cache có hai đặc trưng quan trọng là cấu trúc đọc (Read architecture) và cách ghi (Write policy). Cấu trúc đọc có thể là “Look Aside” hoặc “Look Through”. Cách ghi có thể là “Write-Back” hoặc “Write-Through”. Cả hai loại cấu trúc đọc có thể sử dụng cùng một trong hai cách ghi tùy vào thiết kế. A. Cấu trúc đọc : 3.1 Cấu trúc đọc “Look Aside” Hình 2 Cấu trúc đọc Look Aside Trong cấu trúc này, bộ nhớ chính có vị trí đối diện với giao diện hệ thống. Đặc điểm dễ nhận thấy của đơn vị cache (SRAM) này là nó nằm song song với bộ nhớ chính. Điều quan trọng cần chú ý là cả bộ nhớ chính và bộ nhớ cache đều nhìn thấy một chu kỳ bus trong cùng một thời điểm. vì vậy mới có tên “Look Aside”, tạm dịch là "nhìn một bên." - Cấu trúc này không phân cách bus của CPU với bus hệ thống. - Khi CPU bắt đầu 1 chu kỳ bus thì tất cả thiết bị trong hệ thống đều cảm nhận được giống như khi không có cache. Riêng bộ phận điều khiển giám sát các yêu cầu của CPU và xem cache có chứa 1 bản sao của thông tin đang cần không? Bộ phận điều khiển cache kết thúc chu kỳ bus nếu tác vụ là trúng tủ à thông báo cho bộ nhớ chính, bỏ qua yêu cầu vì đã tìm thấy thông tin trong cache rồi. Còn nếu tác vụ là miss à thì chu kỳ bus hoàn thành theo bình thường từ bộ nhớ chính. CPU CACHE Main Memory Bus Master 1 Bus Master 2 Bus Master 3 Ưu điểm của Cache look - aside: - Ít tốn thời gian trong các chu kỳ cache miss so với cấu trúc look - through do bus hệ thống được nối thẳng với Cache và bộ nhớ chính. - Thiết kế đơn giản ( trong khi đó thiết kế look - through phải giao diện với cả bus của CPU và bus hệ thống). - Do đơn giản à giá thành cài đặt thấp. - Tốc độ cao trong chương trình ứng dụng chạy độc lập (Stand - alone). Nhược điểm: - Việc sử dụng bus hệ thống không được giảm nhẹ đi (Vì mỗi truy xuất dẫn đến cả cache và bộ nhớ chính). - Tất cả các yêu cầu dù là hít hay miss đều gây ra sự khởi đầu của 1 chu kỳ làm việc trong bộ nhớ chính à tức là khởi đầu 1 chu kỳ nạp điện lại (Precharge) à Điều này ngăn cản không cho các thiết bị khác truy xuất bộ nhớ chính cho tới khi thời gian nạp lại đã quá hạn. - Các thao tác đồng thời không thể xảy ra vì tất cả các bộ phận điều khiển bus chỉ nằm trên cùng 1 bus. - Không thích hợp cho máy quản gia có nhiều bộ phận quản lý bus. Sau đây là một ví dụ về Cache có cấu trúc “Look Aside”, khi một CPU bắt đầu một chu kỳ đọc, Cache sẽ kiểm tra xem có địa chỉ làm “Cache hit” hay không. • HIT: Nếu Cache chứa vị trí bộ nhớ cần truy xuất thì nó sẽ đáp ứng chu kỳ đọc và kết thúc chu kỳ bus. • MISS: Nếu Cache không chứa vị trí bộ nhớ cần truy xuất thì bộ nhớ chính sẽ đáp ứng cho CPU và kết thúc chu kỳ bus. Cache sẽ snarf dữ liệu, vì vậy nếu CPU tiếp tục yêu cầu dữ liệu này thì sẽ có “Cache hit”. Cache có cấu trúc Look Aside ít phức tạp nên giá thành thấp. Cấu trúc này cung cấp một đáp ứng tốt hơn đối với trường hợp “Cache miss” do cả DRAM và Cache (trong hình là SRAM) cùng “nhìn thấy” một chu kỳ bus trong cùng một thời điểm. Nhưng, qua hình vẽ ta thấy rằng CPU không thể truy cập Cache nếu có một Bus master (Bus chủ - thành phần có quyền điều khiển bus hệ thống) khác đang truy cập bộ nhớ chính. 3.2. Cấu trúc đọc “Look Through” Hình 3 Cấu trúc đọc Look Through Bộ nhớ chính vẫn có vị trí đối diện với giao diện hệ thống. Ta dễ nhận ra là đơn vị Cache này là nó nằm giữa CPU và bộ nhớ chính. Điều quan trọng cần chú ý là Cache nằm giữa CPU và bộ nhớ chính và nó “thấy” chu kỳ bus CPU trước khi cho phép đi tiếp đến bus hệ thống. Sau đây là ví dụ về cấu trúc đọc “Look Through”, CPU bắt đầu truy cập bộ nhớ và Cache kiểm tra xem có địa chỉ “Cache hit” hay không. • HIT: Cache đáp ứng yêu cầu của CPU mà không có một truy cập nào đến bộ nhớ chính. • MISS: Cache đưa chu kỳ bus đến bus hệ thống. Bộ nhớ chính đáp ứng yêu cầu của vi xử lý. Cache snarf dữ liệu nên nếu có yêu cầu từ vi xử lý đối với dữ liệu này thì sẽ có “Cache hit”. Như vậy : - Cache hit à Lấy thông tin giữ lại ngay cho CPU với zero wait state. Ở đây các yêu cầu của CPU không tự động chuyển đến bus hệ thống à bus hệ thống rảnh rỗi để các hệ thống quản lý bus khác có thể sử dụng bus được. - Chỉ khi có 1 cache miss thì yêu cầu mới được chuyển đến bus hệ thống. Trong cấu trúc này cache phân cách bus cục bộ và bus hệ thống à Vì vậy có thể cho phép thực hiện đồng thời 2 tác vụ trên bus cục bộ và trên bus hệ thống. Cấu trúc này cho phép CPU chạy với Cache trong khi Bus master khác vẫn truy cập bộ nhớ chính, khi đó CPU tách riêng khỏi phần còn lại của hệ thống. Tuy nhiên, cấu trúc Cache này phức tạp hơn do phải kiểm soát các truy cập phần đến phần còn lại của hệ thống. Điều này làm tăng giá thành sản phẩm. Một điểm yếu khác là sự truy cập bộ nhớ khi “Cache miss” sẽ chậm hơn vì bộ nhớ chính sẽ không được truy cập cho đến khi Cache kiểm tra xong. Điều này sẽ không là vấn đề nếu Cache có tỷ lệ (hay tốc độ) HIT cao và các truy cập bộ nhớ chính là của các Bus master khác. Từ đây có thể kết luận rằng : Ưu điểm: - Giảm nhẹ việc sử dụng bus hệ thống vì hầu hết các truy xuất ô nhớ của CPU đều tới Cache. Bus hệ thống rảnh rỗi cho các bộ phận quản lý giao diện bus quản lý. - Cho phép truy xuất đồng thời cả CPU và 1 bộ phận quản lý bus khác cùng thực hiện. - Hoàn tất các tác vụ ghi trong zero wait state khi sử dụng các tác vụ ghi sau (Posted Write) (nó ghi vào cache và thực hiện ghi sau vào bộ nhớ chính). - Hiệu suất toàn diện của Look - through cao hơn look - aside. Nhược điểm: - Trong trường hợp cache miss qua việc tìm kiếm rồi mới truy xuất trên bus hệ thống tới bộ nhớ chính sẽ lâu hơn cấu trúc look - aside. - Phức tạp và khó thiết kế cũng như cài đặt hơn look - aside. - Giá thành cao B) Các chiến lược ghi (writing policies) Cache là bản sao của 1 phần dữ liệu trong bộ nhớ chính, nếu nội dung mới cập nhật vào cache mà trong bộ nhớ lại không thì sẽ làm cho việc lấy thông tin sai lệch nhau, mất tính nhất quán. Do đó phải đảm bảo duy trì tính thống nhất giữa cache và bộ nhớ. Nguyên nhân gây không thống nhất: Cache được cập nhật còn bộ nhớ chính thì không Bộ nhớ chính được cập nhật còn cache thì không Để khắc phục cần có các chiến lược ghi sao cho thông tin giữa cache và bộ nhớ là thống nhất, ko có thông tin lỗi thời. Có 2 chiến lược ghi chính: write-through, write-back 3.3 Chiến lược ghi write-through (cập nhật ghi tức thời) Với chiến lược ghi này, mỗi khi cpu thực hiện 1 tác vụ ghi trên 1 ô nhớ của bộ nhớ chính mà đã có thông tin tương ứng trong cache (cache hit) thì cả thông tin trong bộ nhớ chính và trên cache đều sẽ được cập nhật (ghi đè). Còn nếu ô nhớ của bộ nhớ chính chưa có thông tin tương ứng trong cache (cache miss) thì thông tin sẽ được cập nhật vào bộ nhớ chính. Chiến lược ghi này đảm bảo được tính nhất quán giữa bộ nhớ và cache nhưng hiệu suất rất kém vì mỗi thao tác ghi đều phải truy suất đến bộ nhớ chính =>chậm chạp. 3.2 Chiến lược ghi write-back với chiến lược ghi này, mỗi khi cần thực hiện tác vụ ghi lên 1 ô nhớ của bộ nhớ chính mà đã có thông tin tương ứng trên cache (cache hit), dữ liệu mới sẽ chỉ được cập nhật lên cache mà ko ghi ngay lên bộ nhớ chính. Vị trí cache đó sẽ được “đánh dấu” (như ở sơ đồ trên thì nó được dán nhãn là “dirty”) để ghi nhớ là dữ liệu tại đó mới chỉ nằm trên cache mà chưa được ghi vào bộ nhớ chính. Sau đó, nếu như cpu cần truy cập thông tin trùng khớp với vị trí đánh dấu đó (cache hit) thì nó sẽ được sử dụng ngay (vẫn chưa cần ghi vào bộ nhớ chính). Chỉ khi mà vị trí cache đó cần được sử dụng để lưu thông tin từ 1 ô nhớ khác trên bộ nhớ chính thì thông tin trên vị trí “đánh dấu” đó mới được ghi ngược vào bộ nhớ chính, nhường lại vị trí đó cho thông tin mới. Bằng cách này, dữ liệu trên bộ nhớ chính sẽ chỉ được cập nhật khi cần thiết do đó cải thiện được hiệu suất của máy. Bus hệ thống rảnh rỗi để phục vụ cho cpu và các bộ phận quản lý bus khác hoạt động. Nhược điểm của phương pháp này là việc thiết kế phức tạp hơn nhiều so với write-through vì nó phải biết khi nào thì phải cập nhật bộ nhớ.

Các file đính kèm theo tài liệu này:

  • docxword_chung_9184.docx
Tài liệu liên quan