Hệ điều hành - Quản lý bộ nhớ

Quản lý bộ nhớ là chức năng của hệ điều hành xử lý hoặc quản lý bộ nhớ chính và di chuyển các quá trình qua lại giữa bộ nhớ chính và đĩa trong quá trình thực thi. Quản lý bộ nhớ theo dõi từng vị trí bộ nhớ, bất kể nó được cấp phát cho một số quy trình hay nó miễn phí. Nó kiểm tra lượng bộ nhớ được cấp cho các tiến trình. Nó quyết định tiến trình nào sẽ nhận được bộ nhớ vào thời điểm nào. Nó theo dõi bất cứ khi nào một số bộ nhớ được giải phóng hoặc không được phân bổ và tương ứng nó sẽ cập nhật trạng thái.

Hướng dẫn này sẽ dạy bạn các khái niệm cơ bản liên quan đến Quản lý bộ nhớ.

Xử lý không gian địa chỉ

Không gian địa chỉ tiến trình là tập hợp các địa chỉ logic mà một tiến trình tham chiếu trong mã của nó. Ví dụ, khi sử dụng địa chỉ 32 bit, các địa chỉ có thể nằm trong khoảng từ 0 đến 0x7fffffff; nghĩa là, 2 ^ 31 số có thể, với tổng kích thước lý thuyết là 2 gigabyte.

Hệ điều hành sẽ xử lý ánh xạ địa chỉ logic thành địa chỉ vật lý tại thời điểm cấp phát bộ nhớ cho chương trình. Có ba loại địa chỉ được sử dụng trong một chương trình trước và sau khi bộ nhớ được cấp phát:

SN Địa chỉ bộ nhớ & Mô tả
1

Symbolic addresses

Các địa chỉ được sử dụng trong mã nguồn. Tên biến, hằng số và nhãn lệnh là những phần tử cơ bản của không gian địa chỉ tượng trưng.

2

Relative addresses

Tại thời điểm biên dịch, trình biên dịch chuyển đổi các địa chỉ tượng trưng thành địa chỉ tương đối.

3

Physical addresses

Bộ nạp tạo ra các địa chỉ này tại thời điểm một chương trình được tải vào bộ nhớ chính.

Địa chỉ ảo và địa chỉ vật lý giống nhau trong các lược đồ ràng buộc địa chỉ thời gian biên dịch và thời gian tải. Địa chỉ ảo và địa chỉ vật lý khác nhau trong lược đồ ràng buộc địa chỉ thời gian thực thi.

Tập hợp tất cả các địa chỉ logic được tạo ra bởi một chương trình được gọi là logical address space. Tập hợp tất cả các địa chỉ vật lý tương ứng với các địa chỉ logic này được gọi làphysical address space.

Ánh xạ thời gian chạy từ địa chỉ ảo sang địa chỉ thực được thực hiện bởi đơn vị quản lý bộ nhớ (MMU) là một thiết bị phần cứng. MMU sử dụng cơ chế sau để chuyển đổi địa chỉ ảo thành địa chỉ vật lý.

  • Giá trị trong thanh ghi cơ sở được thêm vào mọi địa chỉ được tạo ra bởi quá trình người dùng, được coi là giá trị bù vào thời điểm nó được gửi đến bộ nhớ. Ví dụ: nếu giá trị thanh ghi cơ sở là 10000, thì nỗ lực của người dùng để sử dụng vị trí địa chỉ 100 sẽ được phân bổ lại động cho vị trí 10100.

  • Chương trình người dùng xử lý các địa chỉ ảo; nó không bao giờ nhìn thấy các địa chỉ vật lý thực.

Tải tĩnh so với tải động

Sự lựa chọn giữa Tải tĩnh hoặc Tải động sẽ được thực hiện tại thời điểm chương trình máy tính đang được phát triển. Nếu bạn phải tải chương trình của mình một cách tĩnh, thì tại thời điểm biên dịch, các chương trình hoàn chỉnh sẽ được biên dịch và liên kết mà không để lại bất kỳ sự phụ thuộc vào chương trình hoặc mô-đun bên ngoài nào. Trình liên kết kết hợp chương trình đối tượng với các mô-đun đối tượng cần thiết khác thành một chương trình tuyệt đối, chương trình này cũng bao gồm các địa chỉ logic.

Nếu bạn đang viết một chương trình được tải động, thì trình biên dịch của bạn sẽ biên dịch chương trình và đối với tất cả các mô-đun mà bạn muốn bao gồm động, chỉ các tham chiếu sẽ được cung cấp và phần còn lại sẽ được thực hiện tại thời điểm thực thi.

Tại thời điểm tải, với static loading, chương trình tuyệt đối (và dữ liệu) được tải vào bộ nhớ để bắt đầu thực thi.

Nếu bạn đang sử dụng dynamic loading, các quy trình động của thư viện được lưu trữ trên đĩa ở dạng có thể định vị lại và chỉ được tải vào bộ nhớ khi chúng được chương trình cần đến.

Liên kết tĩnh và liên kết động

Như đã giải thích ở trên, khi liên kết tĩnh được sử dụng, trình liên kết kết hợp tất cả các mô-đun khác mà một chương trình cần thiết thành một chương trình thực thi duy nhất để tránh bất kỳ sự phụ thuộc nào vào thời gian chạy.

Khi liên kết động được sử dụng, không bắt buộc phải liên kết mô-đun hoặc thư viện thực tế với chương trình, thay vào đó, tham chiếu đến mô-đun động được cung cấp tại thời điểm biên dịch và liên kết. Thư viện liên kết động (DLL) trong Windows và Đối tượng dùng chung trong Unix là những ví dụ điển hình về thư viện động.

Hoán đổi

Hoán đổi là một cơ chế trong đó một tiến trình có thể được hoán đổi tạm thời ra khỏi bộ nhớ chính (hoặc di chuyển) sang bộ nhớ phụ (đĩa) và làm cho bộ nhớ đó khả dụng cho các tiến trình khác. Vào một thời điểm sau, hệ thống sẽ hoán đổi quá trình từ bộ nhớ phụ sang bộ nhớ chính.

Mặc dù hiệu suất thường bị ảnh hưởng bởi quá trình hoán đổi nhưng nó giúp chạy song song nhiều quy trình lớn và lớn và đó là lý do Swapping is also known as a technique for memory compaction.

Tổng thời gian thực hiện bằng quá trình hoán đổi bao gồm thời gian cần thiết để di chuyển toàn bộ quá trình sang đĩa phụ và sau đó sao chép quá trình trở lại bộ nhớ, cũng như thời gian quá trình lấy lại bộ nhớ chính.

Chúng ta hãy giả sử rằng quy trình của người dùng có kích thước 2048KB và trên đĩa cứng tiêu chuẩn nơi quá trình hoán đổi sẽ diễn ra có tốc độ truyền dữ liệu khoảng 1 MB mỗi giây. Việc chuyển thực tế quá trình 1000K đến hoặc từ bộ nhớ sẽ mất

2048KB / 1024KB per second
= 2 seconds
= 2000 milliseconds

Bây giờ xem xét thời gian trong và ngoài, sẽ mất 4000 mili giây hoàn thành cộng với các chi phí khác trong đó quá trình cạnh tranh để lấy lại bộ nhớ chính.

Cấp phát bộ nhớ

Bộ nhớ chính thường có hai phân vùng -

  • Low Memory - Hệ điều hành nằm trong bộ nhớ này.

  • High Memory - Các quy trình của người dùng được lưu giữ trong bộ nhớ cao.

Hệ điều hành sử dụng cơ chế cấp phát bộ nhớ sau.

SN Phân bổ & Mô tả Bộ nhớ
1

Single-partition allocation

Trong kiểu phân bổ này, lược đồ thanh ghi tái định cư được sử dụng để bảo vệ các tiến trình của người dùng với nhau và khỏi việc thay đổi mã và dữ liệu của hệ điều hành. Thanh ghi chuyển vị trí chứa giá trị của địa chỉ vật lý nhỏ nhất trong khi thanh ghi giới hạn chứa dải địa chỉ logic. Mỗi địa chỉ logic phải nhỏ hơn thanh ghi giới hạn.

2

Multiple-partition allocation

Trong kiểu cấp phát này, bộ nhớ chính được chia thành một số phân vùng có kích thước cố định trong đó mỗi phân vùng chỉ được chứa một tiến trình. Khi một phân vùng trống, một tiến trình được chọn từ hàng đợi đầu vào và được tải vào phân vùng miễn phí. Khi quá trình kết thúc, phân vùng sẽ có sẵn cho một quá trình khác.

Phân mảnh

Khi các tiến trình được tải và xóa khỏi bộ nhớ, không gian bộ nhớ trống bị chia thành nhiều phần nhỏ. Điều đó xảy ra sau khi đôi khi các tiến trình không thể được cấp phát cho các khối bộ nhớ vì kích thước nhỏ của chúng và các khối bộ nhớ vẫn chưa được sử dụng. Vấn đề này được gọi là Phân mảnh.

Phân mảnh có hai loại -

SN Phân mảnh & Mô tả
1

External fragmentation

Tổng dung lượng bộ nhớ đủ để đáp ứng một yêu cầu hoặc để chứa một tiến trình trong đó, nhưng nó không liền kề, vì vậy nó không thể được sử dụng.

2

Internal fragmentation

Khối bộ nhớ được gán cho quá trình lớn hơn. Một số phần của bộ nhớ không được sử dụng vì nó không thể được sử dụng bởi một quá trình khác.

Sơ đồ sau đây cho thấy cách phân mảnh có thể gây lãng phí bộ nhớ và một kỹ thuật nén có thể được sử dụng để tạo thêm bộ nhớ trống từ bộ nhớ bị phân mảnh -

Sự phân mảnh bên ngoài có thể được giảm thiểu bằng cách nén hoặc xáo trộn nội dung bộ nhớ để đặt tất cả bộ nhớ trống lại với nhau trong một khối lớn. Để làm cho việc lu lèn khả thi, việc di dời cần phải linh hoạt.

Sự phân mảnh nội bộ có thể được giảm bớt bằng cách gán hiệu quả phân vùng nhỏ nhất nhưng đủ lớn cho quá trình.

Phân trang

Một máy tính có thể giải quyết nhiều bộ nhớ hơn dung lượng được cài đặt vật lý trên hệ thống. Bộ nhớ bổ sung này thực sự được gọi là bộ nhớ ảo và nó là một phần của ổ cứng được thiết lập để mô phỏng RAM của máy tính. Kỹ thuật phân trang đóng một vai trò quan trọng trong việc thực hiện bộ nhớ ảo.

Phân trang là một kỹ thuật quản lý bộ nhớ trong đó không gian địa chỉ quy trình được chia thành các khối có cùng kích thước được gọi là pages(kích thước là lũy thừa của 2, từ 512 byte đến 8192 byte). Kích thước của quá trình được đo bằng số trang.

Tương tự, bộ nhớ chính được chia thành các khối nhỏ có kích thước cố định của bộ nhớ (vật lý) được gọi là frames và kích thước của khung được giữ nguyên như kích thước của một trang để sử dụng tối ưu bộ nhớ chính và tránh phân mảnh bên ngoài.

Dịch địa chỉ

Địa chỉ trang được gọi là logical address và được đại diện bởi page numberoffset.

Logical Address = Page number + page offset

Địa chỉ khung được gọi là physical address và được đại diện bởi một frame numberoffset.

Physical Address = Frame number + page offset

Một cấu trúc dữ liệu được gọi là page map table được sử dụng để theo dõi mối quan hệ giữa một trang của quy trình với một khung trong bộ nhớ vật lý.

Khi hệ thống phân bổ khung cho bất kỳ trang nào, nó sẽ chuyển địa chỉ logic này thành địa chỉ vật lý và tạo mục nhập vào bảng trang để sử dụng trong suốt quá trình thực thi chương trình.

Khi một tiến trình được thực thi, các trang tương ứng của nó sẽ được tải vào bất kỳ khung bộ nhớ có sẵn nào. Giả sử bạn có một chương trình 8Kb nhưng bộ nhớ của bạn chỉ có thể chứa 5Kb tại một thời điểm nhất định, khi đó khái niệm phân trang sẽ xuất hiện. Khi máy tính hết RAM, hệ điều hành (OS) sẽ di chuyển các trang bộ nhớ không hoạt động hoặc không mong muốn sang bộ nhớ phụ để giải phóng RAM cho các tiến trình khác và đưa chúng trở lại khi chương trình cần.

Quá trình này tiếp tục diễn ra trong toàn bộ quá trình thực thi chương trình, trong đó HĐH tiếp tục xóa các trang không hoạt động khỏi bộ nhớ chính và ghi chúng vào bộ nhớ phụ và đưa chúng trở lại khi chương trình yêu cầu.

Ưu điểm và nhược điểm của phân trang

Dưới đây là danh sách những ưu điểm và nhược điểm của phân trang -

  • Phân trang làm giảm phân mảnh bên ngoài, nhưng vẫn bị phân mảnh bên trong.

  • Phân trang rất đơn giản để thực hiện và được coi là một kỹ thuật quản lý bộ nhớ hiệu quả.

  • Do kích thước của các trang và khung bằng nhau, việc hoán đổi trở nên rất dễ dàng.

  • Bảng trang yêu cầu thêm dung lượng bộ nhớ, do đó có thể không tốt cho hệ thống có RAM nhỏ.

Phân đoạn

Phân đoạn là một kỹ thuật quản lý bộ nhớ, trong đó mỗi công việc được chia thành nhiều phân đoạn có kích thước khác nhau, một phân đoạn cho mỗi mô-đun chứa các mảnh thực hiện các chức năng liên quan. Mỗi phân đoạn thực sự là một không gian địa chỉ logic khác nhau của chương trình.

Khi một tiến trình được thực thi, phân đoạn tương ứng của nó được tải vào bộ nhớ không liền kề mặc dù mọi phân đoạn được tải vào một khối liền kề của bộ nhớ khả dụng.

Quản lý bộ nhớ phân đoạn hoạt động rất giống với phân trang nhưng ở đây các phân đoạn có độ dài thay đổi trong khi các trang phân trang có kích thước cố định.

Một đoạn chương trình chứa chức năng chính của chương trình, các chức năng tiện ích, cấu trúc dữ liệu, v.v. Hệ điều hành duy trì mộtsegment map tablecho mọi quy trình và danh sách các khối bộ nhớ trống cùng với số phân đoạn, kích thước của chúng và vị trí bộ nhớ tương ứng trong bộ nhớ chính. Đối với mỗi phân đoạn, bảng lưu trữ địa chỉ bắt đầu của phân đoạn và độ dài của phân đoạn. Tham chiếu đến vị trí bộ nhớ bao gồm một giá trị xác định một đoạn và một phần bù.