Chào mừng bạn đến với Vimentor!

Hỏi đáp
Đăng ký

Quản lý bộ nhớ

Trong các hệ thống ngày nay, đặc biết là với hệ thông Linux, phương thức quản lý bộ nhớ được sử dụng là hệ thống bộ nhớ ảo – Virtual Memory. Thế nhưng đã bao giờ các bạn có thắc mắc, tại sao phải cần bộ nhớ ảo, sao không truy cập luôn bộ nhớ vật lý mà phải truy cập thông qua bộ nhớ ảo?

Trong bài viết này, chúng ta sẽ cùng tìm hiểu nguyên nhân tại sao bộ nhớ ảo được ra đời bằng việc phân tích những nhược điểm khi chỉ dùng bộ nhớ vật lý.

Bộ nhớ vật lý – Physical Memory

Trong bất kì một hệ thống nào, để truy cập vào các thành phần trong hệ thống, CPU cần phải có địa chỉ của các thành phần đó. Với hệ thống 32 bit, CPU sẽ có không gian địa chỉ 4GB, và nó chỉ truy cập được tới các địa chỉ nằm trong dải địa chỉ từ 0 tới 4GB đó. Tất các các thành phần trong hệ thống bao gồm bộ nhớ RAM, các thiết bị ngoài như ổ cứng (trong trường hợp PC), flash, VGA, PCI … đều cần có địa chỉ trong không gian 4GB.

Quay trở lại với những hệ thống đơn giản trước đây, khi mà chưa có sự tồn tại của bộ nhớ ảo, toàn bộ hệ thống sẽ dùng chung một không gian địa chỉ, được mapping thẳng vào bộ nhớ vật lý RAM, vào các thiết bị ngoài như VGA, PCI… Chúng ta gọi hệ thống đó là hệ thống single address space – Hệ thống không gian địa chỉ chung.

Hình 1 mô tả một ví dụ về layout của bộ nhớ trong hệ thống 32 bit không gian địa chỉ chung. Ở kiểu hệ thống này, bộ nhớ RAM được map vào một phần trong không gian địa chỉ, các thiết bị ngoại vi được map vào một phần không gian địa chỉ… Các vị trí mapping (RAM bắt đầu từ 1MB, VGA từ 640KB…) được quy định bởi nhà sản xuất phần cứng. Như vậy, khi các chương trình chạy trên hệ thống, nó cần biết chính xác địa chỉ bộ nhớ mà nó cần truy cập.

Một vài hệ thống sử dụng không gian địa chỉ chung:

  • Các vi điều khiển thuộc dòng AVR
  • Các vi điều khiển 8 và 16 bit PIC
  • ARM CortexM
  • Hầu hết các hệ thống 8 và 16 bit.

                                          

Hình 1: Ví dụ về layout bộ nhớ vật lý

Những vấn đề gặp phải với hệ thống sử dụng bộ nhớ chung

Vấn đề 1: Hệ thống có bộ nhớ vật lý ít hơn không gian địa chỉ của nó

Ví dụ với hệ thống MIPS 32 bit, nó sẽ có không gian địa chỉ 4GB, có nghĩa khi các chương trình chạy trong hệ thống, chúng được quyền truy cập tới bất kì địa chỉ nào trong không gian địa chỉ 4GB.

Vậy điều gì sẽ xảy ra khi hệ thống MIPS 32 bit có không gian địa chỉ 4GB, nhưng bộ nhớ vậy lý thực tế chỉ có 1GB (30 bit)?

Hình 2: Không gian địa chỉ 4GB vs 1GB bộ nhớ vật lý

Có hai trường hợp xảy ra, người lập trình cần phải biết hệ thống chỉ có 1GB bộ nhớ, và sẽ viết chương trình mà không truy cập tới các địa chỉ nằm ngoài vùng 1GB. Trường hợp còn lại, người lập trình không có thông tin, chương trình có thể truy cập vào vùng nhớ ngoài 1GB, và hệ thống bị crash.

Đứng trên góc độ phát triển phần mềm, rất khó để chương trình biết được hệ thống đang thực sự có bao nhiêu GB bộ nhớ vật lý. Đặc biệt ngày nay, với việc phần mềm được phát triển độc lập và gần như không phụ thuộc vào phần cứng (game, ứng dụng…), hệ thống có bộ nhớ sử dụng chung sẽ không đáp ứng được. Chúng ta không thể viết một chương trình cho hệ thống 1GB, một chương trình khác giống hệt như thế cho một hệ thống 2GB bộ nhớ.

Vấn đề 2: Phân mảnh bộ nhớ chung.

Giả sử, chúng ta có đầy đủ 4GB bộ nhớ vật lý trong hệ thống. Chúng ta có 3 chương trình chạy trong hệ thống, với thứ tự bộ nhớ cần thiết cho mỗi chương trình là:

Chương trình A cần 1GB, chương trình B cần 2GB, chương trình C cần 2GB.

 

  

Hình 3: Hệ thống 4GB với 3 chương trình

Thứ tự các chương trình khi chạy trong hệ thống

  1. Chương trình A chạy, chiếm 1GB bộ nhớ, hệ thống còn 3GB bộ nhớ trống.
  2. Chương trình B chạy, chiếm 2GB bộ nhớ, hệ thống còn 1GB bộ nhớ trống.
  3. Chương trình A kết thúc, giải phóng 1GB bộ nhớ. Hệ thống còn 2GB bộ nhớ trống, còn đủ cho chương trình C chạy.
  4. Chương trình C muốn chạy, hệ thống còn đủ 2GB bộ nhớ trống, nhưng bộ nhớ bị phân mảnh, do đó C không thể tìm ra đủ 2GB bộ nhớ liền mạch => C không thể chạy.

Như vậy, việc phân mảnh bộ nhớ trong trong quá trình chương trình chạy cũng là một vấn đề đối với hệ thống dùng chung không gian địa chỉ.

Vấn đề 3: Vấn đề nhiều chương trình trong hệ thống sử dụng chung bộ nhớ

Trong một hệ thống sử dụng chung bộ nhớ, tất cả các chương trình đều có thể truy cập tới mọi địa chỉ trong không gian bộ nhớ, dẫn đến việc hệ thống sẽ không có cơ chế bảo vệ việc truy cập những phần không gian bộ nhớ sử dụng chung giữa các chương trình.

Việc sử dụng bộ nhớ chung giữa các chương trình có thể giải thích dễ hiểu hơn bằng ví dụ sau:

Hình 4: Hai chương trình cùng ghi vào một địa chỉ bộ nhớ

Chúng ta có chương trình A và chương trình B cùng chạy đồng thời trong hệ thống. A thực hiện ghi giá trị 10 vào ô nhớ có địa chỉ 1024, sau đó B cũng thực hiện việc ghi giá trị 11 vào ô nhớ có địa chỉ 1024.

Kết thúc quá trình trên, chương trình B đã thay đổi giá trị bộ nhớ tại địa chỉ 1024, điều này ảnh hưởng trực tiếp thay đổi quá trình thực thi của chương trình A. Trong một hệ thống thực tế, chương trình A có thể bị chạy sai do bộ nhớ bị corrupted hoặc thậm chí là crash.

Vấn đề 4: Toàn bộ hệ thống có thể bị crash vì chỉ một chương trình chạy sai

Như chúng ta thấy trong các hệ thống ngày nay, một chương trình ứng dụng chạy bị lỗi, crash, toàn bộ hệ thống vẫn có thể tiếp tục chạy một cách bình thường. Tuy nhiên, với hệ thống bộ nhớ sử dụng chung, chương trình ứng dụng khi chạy (ví dụ game) cũng có thể truy cập vào vùng nhớ của các chương trình hệ thống (ví dụ phần vùng nhớ của hệ điều hành – kernel), điều này dẫn tới việc nếu chương trình ứng dụng đó thực thi lỗi, nó có thể gây crash cho cả hệ thống.

Cả bốn vấn đề trên đòi hỏi cần có một phương thức quản lý bộ nhớ khác, để đảm bảo các chương trình chạy trong hệ thống có thể hoạt động hiệu quả, đảm bảo tính an toàn dữ liệu (tránh việc truy cập bộ nhớ lẫn nhau của các chương trình), đảm bảo tính an toàn của hệ thống (đảm bảo các chương trình hệ thống – kernel không bị can thiệp bởi các chương trình ở tần user space).

Kết bài

Như vậy, với một hệ thống phức tạp hơn, cần thực thi nhiều tác vụ hơn (ví dụ như máy tính cá nhân PC), chúng ta không thể sử dụng phương thức quản lý bộ nhớ bằng cách sử dụng không gian địa chỉ chung, mapping thẳng vào bộ nhớ vật lý được.

Bộ nhớ ảo – virtual memory được ra đời để giải quyết những vấn đề mà chúng ta đã đề cập. Trong bài tiếp theo, chúng ta sẽ tìm hiểu cách thức bộ nhớ ảo hoạt động, làm thế nào bộ nhớ ảo giải quyết được những vấn đề trong hệ thống sử dụng không gian địa chỉ chung.

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải