Hệ thống con bộ nhớ trên bộ xử lý hiện đại bị hạn chế truy cập bộ nhớ ở mức độ chi tiết và căn chỉnh kích thước từ của nó; đây là trường hợp vì một số lý do.
Tốc độ
Bộ xử lý hiện đại có nhiều cấp bộ nhớ đệm mà dữ liệu phải được kéo qua; hỗ trợ các lần đọc byte đơn sẽ làm cho thông lượng của hệ thống con bộ nhớ bị ràng buộc chặt chẽ với thông lượng của đơn vị thực thi (còn gọi là giới hạn cpu); tất cả đều gợi nhớ đến cách chế độ PIO bị DMA vượt qua vì nhiều lý do tương tự trong các ổ đĩa cứng.
CPU luôn đọc ở kích thước từ của nó (4 byte trên bộ xử lý 32 bit), vì vậy khi bạn thực hiện truy cập địa chỉ không được phân bổ - trên bộ xử lý hỗ trợ nó - bộ xử lý sẽ đọc nhiều từ. CPU sẽ đọc từng từ của bộ nhớ mà địa chỉ yêu cầu của bạn đứng. Điều này gây ra sự khuếch đại lên tới 2 lần số lượng giao dịch bộ nhớ cần thiết để truy cập dữ liệu được yêu cầu.
Bởi vì điều này, có thể rất dễ dàng để đọc chậm hơn hai byte so với bốn. Ví dụ: giả sử bạn có cấu trúc trong bộ nhớ trông như thế này:
struct mystruct {
char c; // one byte
int i; // four bytes
short s; // two bytes
}
Trên bộ xử lý 32 bit, rất có thể nó sẽ được căn chỉnh như hiển thị ở đây:
Bộ xử lý có thể đọc từng thành viên này trong một giao dịch.
Giả sử bạn đã có một phiên bản đóng gói của struct, có thể từ mạng nơi nó được đóng gói cho hiệu quả truyền dẫn; nó có thể trông giống như thế này:
Đọc byte đầu tiên sẽ giống nhau.
Khi bạn yêu cầu bộ xử lý cung cấp cho bạn 16 bit từ 0x0005, nó sẽ phải đọc một từ từ 0x0004 và dịch chuyển sang trái 1 byte để đặt nó vào thanh ghi 16 bit; một số công việc phụ, nhưng hầu hết có thể xử lý việc đó trong một chu kỳ.
Khi bạn yêu cầu 32 bit từ 0x0001, bạn sẽ nhận được khuếch đại 2X. Bộ xử lý sẽ đọc từ 0x0000 vào thanh ghi kết quả và dịch chuyển sang trái 1 byte, sau đó đọc lại từ 0x0004 sang thanh ghi tạm thời, chuyển sang phải 3 byte, sau đó chuyển sang OR
thanh ghi kết quả.
Phạm vi
Đối với bất kỳ không gian địa chỉ đã cho nào, nếu kiến trúc có thể giả sử rằng 2 LSB luôn bằng 0 (ví dụ: máy 32 bit) thì nó có thể truy cập bộ nhớ gấp 4 lần (2 bit được lưu có thể biểu thị 4 trạng thái riêng biệt) hoặc cùng một lượng của bộ nhớ với 2 bit cho một cái gì đó như cờ. Việc loại bỏ 2 LSB khỏi một địa chỉ sẽ cho bạn căn chỉnh 4 byte; cũng được gọi là một sải chân của 4 byte. Mỗi khi một địa chỉ được tăng lên, nó sẽ tăng bit 2 một cách hiệu quả, chứ không phải bit 0, tức là, 2 bit cuối cùng sẽ luôn tiếp tục 00
.
Điều này thậm chí có thể ảnh hưởng đến thiết kế vật lý của hệ thống. Nếu bus địa chỉ cần ít hơn 2 bit, có thể có ít hơn 2 chân trên CPU và 2 dấu vết ít hơn trên bảng mạch.
Nguyên tử
CPU có thể hoạt động trên một từ bộ nhớ được căn chỉnh nguyên tử, có nghĩa là không có lệnh nào khác có thể làm gián đoạn hoạt động đó. Điều này rất quan trọng đối với hoạt động chính xác của nhiều cấu trúc dữ liệu không khóa và các mô hình tương tranh khác .
Phần kết luận
Hệ thống bộ nhớ của bộ xử lý khá phức tạp và liên quan nhiều hơn so với mô tả ở đây; một cuộc thảo luận về cách một bộ xử lý x86 thực sự giải quyết bộ nhớ có thể giúp ích (nhiều bộ xử lý hoạt động tương tự nhau).
Có nhiều lợi ích hơn khi tuân thủ sự liên kết bộ nhớ mà bạn có thể đọc tại bài viết này của IBM .
Sử dụng chính của máy tính là để chuyển đổi dữ liệu. Các kiến trúc và công nghệ bộ nhớ hiện đại đã được tối ưu hóa trong nhiều thập kỷ để tạo điều kiện nhận được nhiều dữ liệu hơn, vào, ra và giữa các đơn vị thực thi nhanh hơn và nhanh hơn theo cách rất đáng tin cậy.
Tiền thưởng: Bộ nhớ cache
Một căn chỉnh khác cho hiệu năng mà tôi đã đề cập trước đây là căn chỉnh trên các dòng bộ đệm (ví dụ, trên một số CPU) 64B.
Để biết thêm thông tin về mức độ hiệu suất có thể đạt được bằng cách tận dụng bộ nhớ cache, hãy xem Thư viện hiệu ứng bộ đệm của bộ xử lý ; từ câu hỏi này về kích thước dòng bộ đệm
Hiểu về các dòng bộ đệm có thể quan trọng đối với một số loại tối ưu hóa chương trình. Ví dụ: căn chỉnh dữ liệu có thể xác định liệu một thao tác có chạm vào một hoặc hai dòng bộ đệm hay không. Như chúng ta đã thấy trong ví dụ trên, điều này có thể dễ dàng có nghĩa là trong trường hợp sai, hoạt động sẽ chậm hơn hai lần.