Câu trả lời ngắn: Số lượng địa chỉ khả dụng bằng với địa chỉ nhỏ hơn:
- Kích thước bộ nhớ tính bằng byte
- Số nguyên không dấu lớn nhất có thể được lưu trong từ máy của CPU
Câu trả lời dài và giải thích về những điều trên:
Bộ nhớ bao gồm các byte (B). Mỗi byte bao gồm 8 bit (b).
1 B = 8 b
1 GB RAM thực sự là 1 GiB (gibibyte, không phải gigabyte). Sự khác biệt là:
1 GB = 10^9 B = 1 000 000 000 B
1 GiB = 2^30 B = 1 073 741 824 B
Mỗi byte bộ nhớ có địa chỉ riêng, bất kể từ máy CPU lớn đến đâu. Ví dụ. CPU Intel 8086 là 16 bit và nó được xử lý theo bộ nhớ theo byte, do đó, CPU 32 bit và 64 bit hiện đại cũng vậy. Đó là nguyên nhân của giới hạn đầu tiên - bạn không thể có nhiều địa chỉ hơn byte bộ nhớ.
Địa chỉ bộ nhớ chỉ là một số byte mà CPU phải bỏ qua từ đầu bộ nhớ để đến địa chỉ mà nó đang tìm kiếm.
- Để truy cập byte đầu tiên, nó phải bỏ qua 0 byte, vì vậy địa chỉ của byte đầu tiên là 0.
- Để truy cập byte thứ hai, nó phải bỏ qua 1 byte, vì vậy địa chỉ của nó là 1.
- (và kể từ đó trở đi...)
- Để truy cập byte cuối cùng, CPU bỏ qua 1073741823 byte, vì vậy địa chỉ của nó là 1073741823.
Bây giờ bạn phải biết 32-bit thực sự có nghĩa là gì. Như tôi đã đề cập trước đây, đó là kích thước của một từ máy.
Từ máy là lượng bộ nhớ CPU sử dụng để giữ số (trong RAM, bộ đệm hoặc các thanh ghi bên trong). CPU 32 bit sử dụng 32 bit (4 byte) để giữ số. Địa chỉ bộ nhớ cũng là số, vì vậy trên CPU 32 bit, địa chỉ bộ nhớ bao gồm 32 bit.
Bây giờ hãy nghĩ về điều này: nếu bạn có một bit, bạn có thể lưu hai giá trị trên đó: 0 hoặc 1. Thêm một bit nữa và bạn có bốn giá trị: 0, 1, 2, 3. Trên ba bit, bạn có thể lưu tám giá trị : 0, 1, 2 ... 6, 7. Đây thực sự là một hệ thống nhị phân và nó hoạt động như thế:
Decimal Binary
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
Nó hoạt động chính xác như bổ sung thông thường, nhưng chữ số tối đa là 1, không phải 9. Số thập phân 0 là 0000
, sau đó bạn thêm 1 và nhận 0001
, thêm một lần nữa và bạn có 0010
. Điều gì xảy ra ở đây cũng giống như có số thập phân 09
và thêm một: bạn thay đổi 9 thành 0 và tăng chữ số tiếp theo.
Từ ví dụ trên, bạn có thể thấy rằng luôn có một giá trị tối đa bạn có thể giữ trong một số có số bit không đổi - bởi vì khi tất cả các bit là 1 và bạn cố gắng tăng giá trị lên 1, tất cả các bit sẽ trở thành 0, do đó phá vỡ con số. Nó được gọi là tràn số nguyên và gây ra nhiều vấn đề khó chịu, cho cả người dùng và nhà phát triển.
11111111 = 255
+ 1
-----------
100000000 = 0 (9 bits here, so 1 is trimmed)
- Trong 1 bit, giá trị lớn nhất là 1,
- 2 bit - 3,
- 3 bit - 7,
- 4 bit - 15
Số lớn nhất có thể luôn là 2 ^ N-1, trong đó N là số bit. Như tôi đã nói trước đây, một địa chỉ bộ nhớ là một số và nó cũng có giá trị tối đa. Đó là lý do tại sao kích thước của từ máy cũng là một giới hạn cho số lượng địa chỉ bộ nhớ khả dụng - đôi khi CPU của bạn không thể xử lý số lượng đủ lớn để giải quyết nhiều bộ nhớ hơn.
Vì vậy, trên 32 bit, bạn có thể giữ các số từ 0 đến 2 ^ 32-1 và đó là 4 294 967 295. Nó không chỉ là địa chỉ lớn nhất trong RAM 1 GB, do đó, trong trường hợp cụ thể, lượng RAM của bạn sẽ là yếu tố giới hạn.
Giới hạn RAM cho CPU 32 bit về lý thuyết là 4 GB (2 ^ 32) và đối với CPU 64 bit là 16 EB (exabyte, 1 EB = 2 ^ 30 GB). Nói cách khác, CPU 64 bit có thể xử lý toàn bộ Internet ... 200 lần;) (ước tính bởi WolframAlpha ).
Tuy nhiên, trong các hệ điều hành đời thực, CPU 32 bit có thể giải quyết khoảng 3 GiB RAM. Đó là do kiến trúc bên trong của hệ điều hành - một số địa chỉ được dành riêng cho các mục đích khác. Bạn có thể đọc thêm về cái gọi là rào cản 3 GB trên Wikipedia . Bạn có thể nâng giới hạn này với Tiện ích mở rộng địa chỉ vật lý .
Nói về địa chỉ bộ nhớ, có vài điều tôi nên đề cập: bộ nhớ ảo , phân đoạn và phân trang .
Bộ nhớ ảo
Như @Daniel R Hicks đã chỉ ra trong một câu trả lời khác, các hệ điều hành sử dụng bộ nhớ ảo. Điều đó có nghĩa là các ứng dụng thực sự không hoạt động trên các địa chỉ bộ nhớ thực, nhưng các ứng dụng được cung cấp bởi HĐH.
Kỹ thuật này cho phép hệ điều hành di chuyển một số dữ liệu từ RAM sang cái gọi là Pagefile (Windows) hoặc Swap (* NIX). HDD chậm hơn vài lần so với RAM, nhưng nó không phải là vấn đề nghiêm trọng đối với dữ liệu hiếm khi được truy cập và nó cho phép HĐH cung cấp cho ứng dụng nhiều RAM hơn so với thực tế bạn đã cài đặt.
Phân trang
Những gì chúng ta đã nói về cho đến nay được gọi là sơ đồ địa chỉ phẳng.
Phân trang là một lược đồ địa chỉ thay thế cho phép giải quyết nhiều bộ nhớ hơn mà bạn thường có thể với một từ máy trong mô hình phẳng.
Hãy tưởng tượng một cuốn sách chứa đầy những từ 4 chữ cái. Giả sử có 1024 số trên mỗi trang. Để giải quyết một số, bạn phải biết hai điều:
- Số lượng trang mà từ đó được in.
- Từ nào trên trang đó là từ bạn đang tìm kiếm.
Bây giờ, đó chính xác là cách CPU x86 hiện đại xử lý bộ nhớ. Nó được chia thành 4 trang KiB (mỗi trang 1024 từ) và những trang đó có số. (thực tế các trang cũng có thể là 4 MiB lớn hoặc 2 MiB với PAE ). Khi bạn muốn đánh địa chỉ ô nhớ, bạn cần số trang và địa chỉ trong trang đó. Lưu ý rằng mỗi ô nhớ được tham chiếu bởi chính xác một cặp số, đó sẽ không phải là trường hợp phân đoạn.
Phân khúc
Chà, cái này khá giống với phân trang. Nó được sử dụng trong Intel 8086, chỉ để nêu tên một ví dụ. Các nhóm địa chỉ hiện được gọi là phân đoạn bộ nhớ, không phải trang. Sự khác biệt là các phân đoạn có thể chồng lấp và chúng trùng nhau rất nhiều. Ví dụ, trên 8086, hầu hết các ô nhớ đều có sẵn từ 4096 phân đoạn khác nhau.
Một ví dụ:
Giả sử chúng ta có 8 byte bộ nhớ, tất cả đều giữ các số 0 trừ byte thứ 4 bằng 255.
Minh họa cho mô hình bộ nhớ phẳng:
_____
| 0 |
| 0 |
| 0 |
| 255 |
| 0 |
| 0 |
| 0 |
| 0 |
-----
Minh họa cho bộ nhớ phân trang với các trang 4 byte:
PAGE0
_____
| 0 |
| 0 |
| 0 | PAGE1
| 255 | _____
----- | 0 |
| 0 |
| 0 |
| 0 |
-----
Minh họa cho bộ nhớ được phân đoạn với các phân đoạn 4 byte được dịch chuyển bởi 1:
SEG 0
_____ SEG 1
| 0 | _____ SEG 2
| 0 | | 0 | _____ SEG 3
| 0 | | 0 | | 0 | _____ SEG 4
| 255 | | 255 | | 255 | | 255 | _____ SEG 5
----- | 0 | | 0 | | 0 | | 0 | _____ SEG 6
----- | 0 | | 0 | | 0 | | 0 | _____ SEG 7
----- | 0 | | 0 | | 0 | | 0 | _____
----- | 0 | | 0 | | 0 | | 0 |
----- ----- ----- -----
Như bạn có thể thấy, byte thứ 4 có thể được xử lý theo bốn cách: (địa chỉ từ 0)
- Phân đoạn 0, bù 3
- Phân đoạn 1, bù 2
- Phân đoạn 2, bù 1
- Phân đoạn 3, bù 0
Nó luôn luôn là cùng một ô nhớ.
Trong các triển khai thực tế, các phân đoạn được thay đổi hơn 1 byte (đối với 8086, nó là 16 byte).
Điều tồi tệ về phân khúc là nó phức tạp (nhưng tôi nghĩ bạn đã biết điều đó;) Điều tốt là bạn có thể sử dụng một số kỹ thuật thông minh để tạo các chương trình mô-đun.
Ví dụ: bạn có thể tải một số mô-đun vào một phân đoạn, sau đó giả vờ phân khúc đó nhỏ hơn thực tế (chỉ đủ nhỏ để giữ mô-đun), sau đó chọn phân đoạn đầu tiên không trùng với phân đoạn giả nhỏ hơn và tải mô-đun tiếp theo , và như thế. Về cơ bản những gì bạn nhận được theo cách này là các trang có kích thước thay đổi.