8.1 Bộ nhớ RAM
Bộ nhớ RAM (Random Access Memory, RAM) của máy tính là một mảng các ô nhớ, mỗi ô có địa chỉ duy nhất. Những ô này có thể lưu trữ các dữ liệu khác nhau như số, ký tự và con trỏ. Khi chương trình chạy, nó sẽ đặt dữ liệu và chỉ dẫn của mình vào bộ nhớ này để truy cập nhanh.
Ví dụ về các ô nhớ:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
Mỗi ô nhớ có số thứ tự riêng, còn được gọi là địa chỉ ô nhớ hoặc đơn giản là địa chỉ. Nếu máy tính của bạn có 8 GB bộ nhớ, thì nó có 8 tỷ ô nhớ như vậy, trong đó có thể lưu trữ những gì hữu ích.
Bit và byte
Mỗi ô nhớ có thể chứa một byte thông tin. Mỗi byte bao gồm 8 bit, và mỗi bit có thể chỉ chứa 0 hoặc 1. Ví dụ (đối với số nguyên dương):
Số | Biểu diễn bit | Làm tròn đến byte |
---|---|---|
0 | 0 | 00000000 |
1 | 1 | 00000001 |
100 | 1100100 | 01100100 |
1000 | 1111101000 | 00000011-11101000 |
1000 000 000 | 111011100110101100101000000000 | 00111011-10011010-11001010-00000000 |
Biến càng chiếm nhiều byte, càng có thể lưu trữ nhiều giá trị trong đó. Ví dụ:
- 1 byte — 256 giá trị duy nhất
- 2 byte — 65 nghìn giá trị duy nhất
- 3 byte — 16 triệu
- 4 byte — 4 tỷ
8.2 Làm thế nào dữ liệu được biểu diễn trong bộ nhớ
Kiểu dữ liệu và biểu diễn của chúng
Dữ liệu số bên trong bộ xử lý và trong bộ nhớ
- Số nguyên: được lưu trữ ở dạng nhị phân. Kích thước có thể thay đổi (1 byte, 2 byte, 4 byte).
- Số thực: được lưu trữ ở định dạng dấu phẩy động (ví dụ như định dạng IEEE 754 cho số 4-byte và 8-byte).
x = 42 # Số nguyên
y = 3.14 # Số thực
Quan trọng! Trong Python, các kiểu dữ liệu int
và float
tích hợp sẵn là các lớp đầy đủ chức năng có thể thực hiện các phép tính phức tạp với các số có độ dài vô hạn. Tuy nhiên, nếu bạn sử dụng các thư viện cho tính toán khoa học hoặc AI, bạn sẽ phải đối mặt với chính định dạng dữ liệu mà tôi đã giải thích ở trên.
Dữ liệu ký tự trong bộ nhớ máy tính
Ký tự và chuỗi được lưu trữ trong bộ nhớ dưới dạng chuỗi byte. Ví dụ, trong mã hóa ASCII
mỗi ký tự chiếm 1 byte, trong mã hóa UTF-8
có thể chiếm từ 1 đến 4 byte.
Trong Python 3.x, định dạng mặc định cho chuỗi là mã hóa UTF-8
, nhưng bạn có thể đọc các tập tin mà văn bản được lưu trữ ở định dạng khác hoặc gửi dữ liệu qua mạng không ở mã hóa UTF-8
.
Ví dụ:
char = 'A' # Ký tự
string = "Hello, world!" # Chuỗi
Các ký tự riêng lẻ trong Python không có kiểu riêng — chúng cũng sử dụng kiểu str
. Tuy nhiên, trong bộ nhớ, các chuỗi này được lưu trữ theo từng ký tự. Một ký tự thường chiếm 1—4 byte.
Con trỏ
Con trỏ lưu trữ địa chỉ của ô nhớ khác
. Chúng cho phép các chương trình làm việc với các cấu trúc dữ liệu động và quản lý bộ nhớ hiệu quả hơn.
Ví dụ:
list = [1, 2, 3, 4] # Danh sách
list_pointer = id(list) # Con trỏ tới đầu danh sách
8.3 Ví dụ về biểu diễn dữ liệu trong bộ nhớ RAM
1. Biểu diễn số nguyên
Số nguyên được lưu trữ trong bộ nhớ dưới dạng số nhị phân (bit). Tùy thuộc vào kiểu dữ liệu, chúng có thể chiếm dung lượng khác nhau. Ví dụ, int
thường chiếm 4 byte (32 bit).
Đây là cách số 42 được biểu diễn trong bộ nhớ:
00000000 | 00000000 | 00000000 | 00101010 |
2. Biểu diễn số thực (dấu phẩy động)
Số thực (ví dụ như kiểu float) được lưu trữ trong bộ nhớ dưới dạng dấu phẩy động, thường theo tiêu chuẩn IEEE 754
. float
thường chiếm 4 byte (32 bit), còn double
chiếm 8 byte (64 bit).
Quan trọng! Đây là các kiểu dữ liệu tiêu chuẩn, liên kết với bộ nhớ và bộ xử lý. Kiểu float
trong Python tương ứng với kiểu double
thông dụng và chiếm 8 byte.
Đây là cách số 3.14 được biểu diễn trong bộ nhớ:
01000000 | 01001000 | 11110110 | 01100110 |
3. Biểu diễn ký tự và chuỗi
Ký tự (ví dụ như kiểu char) được lưu trữ trong bộ nhớ dưới dạng chuỗi byte. Chuỗi là một mảng ký tự. Trong ngôn ngữ C/C++, chuỗi kết thúc bằng byte null (\0), nhưng trong Python thì không như vậy.
Đây là cách chuỗi Hello
được biểu diễn trong bộ nhớ:
'H' | 'e' | 'l' | 'l' | 'o' |
Điều này lần lượt sẽ được biểu diễn dưới dạng 0 và 1:
01001000 | 01100101 | 01101100 | 01101100 | 01101111 |
8.4 Địa chỉ hóa bộ nhớ động
Bộ nhớ động được cấp phát và giải phóng trong thời gian chạy chương trình, khi cần thiết. Tất cả các đối tượng mà bạn tạo trong Python đều được tạo trong bộ nhớ này.
Nó được chia thành 2 loại:
Heap: Vùng nhớ mà các đối tượng động được cấp phát. Quản lý bộ nhớ này được thực hiện thông qua các hàm cấp phát (ví dụ, malloc trong C) và giải phóng (ví dụ, free trong C).
Stack: Vùng nhớ được sử dụng để lưu trữ các biến cục bộ và dữ liệu lời gọi hàm. Bộ nhớ được cấp phát và giải phóng tự động khi ra vào hàm.
Một lần nữa, tôi không thể đưa ra ví dụ trên ngôn ngữ Python, vì nó quá cấp cao cho những hành động này. Tôi có thể cho một ví dụ bằng ngôn ngữ C:
// Cấp phát động bộ nhớ cho mảng 10 số nguyên
int *dynamic_var = (int *)malloc(sizeof(int) * 10);
// Giải phóng bộ nhớ
free(dynamic_var);
Địa chỉ hóa bộ nhớ — đó là quá trình xác định địa chỉ duy nhất cho mỗi ô nhớ. Mỗi địa chỉ chỉ đến một vị trí cụ thể trong bộ nhớ, nơi có thể chứa dữ liệu hoặc chỉ thị.
Các loại địa chỉ hóa
Địa chỉ hóa vật lý: truy cập trực tiếp đến địa chỉ vật lý của các ô nhớ. Được quản lý bởi phần cứng (ví dụ như bộ điều khiển bộ nhớ).
Địa chỉ hóa ảo: sử dụng cơ chế quản lý bộ nhớ, như bộ nhớ trang hay bộ nhớ phân đoạn, để cung cấp cho các quá trình không gian địa chỉ cách ly và bảo vệ.
GO TO FULL VERSION