Bộ nhớ máy tính hoạt động như thế nào?
Từ những chiếc thẻ đục lỗ và vòng ferrite đến SRAM, DRAM, DDR5 và HBM
CPU tính rất nhanh, nhưng dữ liệu nằm ở đâu?
CPU có thể tính, nhưng các con số và lệnh để CPU xử lý được giữ ở đâu?
Ở khoá CPU, ta đã thấy CPU liên tục làm một vòng lặp:
lấy lệnh → hiểu lệnh → thực hiện lệnh.
Nhưng có một câu hỏi ta chưa trả lời:
Lệnh mà CPU lấy nằm ở đâu?
Và nếu lệnh bảo CPU cộng hai số, thì hai số đó nằm ở đâu trước khi được cộng?
Muốn tính 5 + 7, trước tiên phải nhớ được 5 và 7
Giả sử chương trình có ba dòng:
a = 5
b = 7
c = a + b
CPU có mạch để thực hiện phép cộng.
Nhưng bản thân mạch cộng không tự sinh ra số 5 và 7.
Trước khi phép cộng xảy ra, máy phải có chỗ giữ:
- lệnh
a = 5 - lệnh
b = 7 - lệnh
c = a + b - giá trị
5 - giá trị
7
Sau khi tính xong, nó còn phải giữ kết quả 12.
Nói cách khác:
CPU biết xử lý dữ liệu. Nhưng trước tiên dữ liệu phải được giữ ở đâu đó.
Chỗ giữ đó chính là bộ nhớ.
CPU cũng có bộ nhớ riêng
Ngay bên trong CPU có những ô nhớ cực nhỏ gọi là thanh ghi (register).
Thanh ghi nằm ngay cạnh các mạch tính toán, vì vậy CPU có thể sử dụng chúng cực nhanh.
Nhưng thanh ghi dùng để làm gì?
Thử cho CPU cộng 5 + 7. Bấm Bước tiếp theo và xem hai con số đi đâu.
Hai số 5 và 7 đang nằm trong bộ nhớ. Bấm Bước tiếp theo.
Thanh ghi là nơi CPU giữ những giá trị nó đang dùng ngay lúc này.
Trong lúc tính, CPU giữ những giá trị nó đang dùng trong các thanh ghi.
Nhưng số lượng thanh ghi rất ít. CPU không thể nhét cả chương trình vào đó.
Nó cần một nơi lớn hơn rất nhiều để chứa những thứ chưa cần dùng ngay.
Đó là RAM.
Càng gần CPU thì càng nhanh, nhưng càng ít
Máy tính hiện đại không chỉ có một loại nơi lưu dữ liệu.
Có thể hình dung đơn giản như thế này:
| Nơi giữ dữ liệu | Dung lượng | Tốc độ CPU truy cập |
|---|---|---|
| Thanh ghi | cực ít | cực nhanh |
| Cache | ít | rất nhanh |
| RAM | nhiều | chậm hơn |
| SSD | rất nhiều | chậm hơn nhiều |
CPU cố giữ thứ nó đang cần nhất ở gần mình.
Ví dụ, khi bạn mở một chương trình:
SSD
↓
RAM
↓
Cache
↓
Thanh ghi
↓
CPU tính toán
Chỉ cần nắm một ý:
CPU không thể giữ mọi thứ bên trong nó. Phần lớn lệnh và dữ liệu phải được lưu ở nơi khác rồi đưa đến CPU khi cần.
Nhưng điều này dẫn đến một câu hỏi thú vị hơn.
Một cỗ máy không có não.
Vậy “nhớ” một thứ thực sự nghĩa là gì?
Một công tắc cũng có thể “nhớ”
Hãy nhìn một công tắc đèn.
Bạn gạt nó sang bật rồi bỏ tay ra.
Một tiếng sau quay lại, công tắc vẫn ở vị trí bật.
Nó giữ lại trạng thái cuối cùng.
Ta có thể dùng hai vị trí đó để biểu diễn một bit:
Tắt → 0
Bật → 1
Muốn một vật dùng được làm bộ nhớ, nó cần làm được bốn việc:
- Có ít nhất hai trạng thái phân biệt rõ ràng.
- Có thể chuyển từ trạng thái này sang trạng thái kia.
- Có thể giữ nguyên trạng thái đủ lâu.
- Có thể đọc lại xem hiện tại nó đang ở trạng thái nào.
Công tắc đáp ứng cả bốn điều đó.
Vì vậy, về nguyên lý, một công tắc có thể nhớ một bit.
0 và 1 không nhất thiết là con số nằm trong máy
Đây là điểm rất quan trọng.
Bên trong máy tính không có những ký tự 0 và 1 tí hon nằm chờ CPU đọc.
0 và 1 chỉ là tên ta đặt cho hai trạng thái vật lý.
Tùy công nghệ, hai trạng thái ấy có thể là:
| Vật | Trạng thái 0 | Trạng thái 1 |
|---|---|---|
| Công tắc | tắt | bật |
| Tấm thẻ | không có lỗ | có lỗ |
| Nam châm | hướng này | hướng kia |
| Tụ điện | ít điện tích | có điện tích |
| Transistor | trạng thái điện này | trạng thái điện kia |
Mạch điện xung quanh chỉ cần phân biệt được hai trạng thái.
Sau đó con người quy ước:
trạng thái A = 0
trạng thái B = 1
Vậy nên:
Nhớ một bit nghĩa là giữ một vật ở một trong hai trạng thái, rồi có thể đọc lại trạng thái đó sau này.
Thử nhớ một bit
Trong mô phỏng dưới đây, hãy đổi công tắc giữa hai trạng thái.
Khi công tắc ở một vị trí:
0
Khi chuyển sang vị trí còn lại:
1
Điểm quan trọng không phải là việc bạn vừa bấm nút.
Điểm quan trọng là:
sau khi bạn ngừng bấm, trạng thái vẫn còn đó.
Đó chính là phần “nhớ”.
Một bit chỉ nhớ được hai khả năng
Một công tắc chỉ có thể biểu diễn:
0
hoặc:
1
Không thể dùng một công tắc duy nhất để biểu diễn trực tiếp số 5.
Nhưng nếu ghép nhiều công tắc lại, số trạng thái tăng rất nhanh.
Với bốn công tắc:
0 1 0 1
ta có thể quy ước đây là số:
0101₂ = 5
Tương tự:
0111₂ = 7
1100₂ = 12
Vậy phép tính lúc nãy có thể hình dung thành:
0101 ← 5
0111 ← 7
----
1100 ← 12
Mỗi chữ số nhị phân tương ứng với một trạng thái được nhớ.
Muốn giữ bốn bit, ta cần bốn phần tử nhớ.
Muốn giữ tám bit, ta cần tám phần tử nhớ.
Muốn giữ hàng tỷ bit, ta cần hàng tỷ phần tử nhớ.
RAM chính là hàng tỷ ô nhớ như vậy
Một thanh RAM 16 GB có thể giữ khoảng 137 tỷ bit.
Tất nhiên bên trong RAM không có 137 tỷ công tắc cơ học.
Các bit được tạo bằng những cấu trúc điện tử cực nhỏ nằm trên chip.
Nhưng nguyên lý vẫn giống công tắc:
ghi 0
↓
đưa ô nhớ về trạng thái A
ghi 1
↓
đưa ô nhớ về trạng thái B
đọc
↓
kiểm tra ô nhớ đang ở A hay B
Hàng tỷ ô như vậy kết hợp lại có thể giữ:
- số
- chữ
- hình ảnh
- âm thanh
- lệnh chương trình
Cuối cùng, tất cả đều trở thành những trạng thái vật lý mà máy có thể phân biệt thành 0 và 1.
Vậy dùng thứ gì để giữ hàng tỷ bit?
Công tắc cơ học có thể nhớ một bit.
Nhưng máy tính cần hàng tỷ bit.
Và những bit đó phải:
- cực nhỏ
- đổi trạng thái cực nhanh
- đọc được bằng điện
- hoạt động hàng tỷ lần mà không cần con người chạm vào
Ngày nay, ta làm điều đó bằng những linh kiện nằm trong chip.
Nhưng những máy tính đầu tiên xuất hiện trước cả transistor và chip nhớ hiện đại.
Người ta vẫn phải tìm cách giữ hàng nghìn bit bằng những công nghệ có sẵn lúc đó.
Vậy trước transistor và chip, máy tính đã dùng thứ gì để nhớ 0 và 1?