Tải bản đầy đủ (.docx) (26 trang)

Báo cáo đề tài quản lý bộ nhớ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1016.25 KB, 26 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
---oOo---

BÁO CÁO
Đề tài:

QUẢN LÍ BỘ NHỚ
Giáo viên hướng dẫn: Th.S Lương Ngọc Khánh

A. GIỚI THIỆU
Công việc quản lí bộ nhớ (memory management) đóng vai trò quan trọng trong hệ điều
hành và được sự quan tâm đặc biệt của các nhà thiết kế. Mục đích chính của quản lí bộ nhớ là
phân bố từng phần của bộ nhớ cho các chương trình theo yêu cầu sao cho hợp lí, đồng thời giải
phóng bộ nhớ để tái sử dụng. Hệ thống quản lí bộ nhớ chia thành hai dạng:
- Yêu cầu tất cả tiến trình luôn nằm trong bộ nhớ.
- Di chuyển tiến trình qua lại giữa bộ nhớ chính và đĩa cứng trong suốt quá trình thực thi.
Dạng đầu chỉ được sử dụng trong các hệ điều hành đơn giản. Dạng sau yêu cầu những
giải thuật hoán đổi (swapping) và phân trang (paging) sẽ được đề cập đến trong báo cáo.
Tuy bộ nhớ ảo cũng là một khía cạnh quan trọng trong quản lí bộ nhớ, báo cáo này chỉ
khái quát những mặt chung nhất của công việc quản lí chứ không đi sâu vào các thuật toán với
bộ nhớ ảo. Báo cáo sẽ trình bày các chiến lược quản lí bộ nhớ đồng thời chỉ ra ưu và nhược
điểm của chúng. Các giải thuật trong báo cáo thường có yêu cầu hỗ trợ về phần cứng, tuy nhiên
các hệ thống đây đều đã tích hợp phần cứng và hệ điều hành. Do đó trong thực tế chúng ta sẽ ít
gặp các trường hợp hệ thống không hỗ trợ cho hệ điều hành thực hiện một giải thuật nào đó.


Memory Management
B. NỘI DUNG BÁO CÁO

I. Khái niệm cơ sở - Không gian vật lý và không gian luận lý:



1. Cơ sở:
 Chương trình phải được mang vào trong bộ nhớ và được đặt trong một tiến trình để
được xử lý
 Input Queue – Một tập hợp của những tiến trình trên đĩa mà đang chờ để được mang
vào trong bộ nhớ để thực thi.
 User programs trải qua nhiều bước trước khi được xử lý.
 Quản lý bộ nhớ là công việc của hệ điều hành với sự hỗ trợ của phần cứng nhằm phân
phối, sắp xếp các process trong bộ nhớ sao cho hiệu quả.
 Mục tiêu cần đạt được là nạp càng nhiều process vào bộ nhớ càng tốt (gia tăng mức độ
đa chương)
 Trong hầu hết các hệ thống, kernel sẽ chiếm một phần cố định của bộ nhớ; phần còn lại
phân phối cho các process.
 Các yêu cầu đối với việc quản lý bộ nhớ
 Cấp phát bộ nhớ cho các process
 Tái định vị (relocation): khi swapping,…
 Bảo vệ: phải kiểm tra truy xuất bộ nhớ có hợp lệ không
 Chia sẻ: cho phép các process chia sẻ vùng nhớ chung
 Kết gán địa chỉ nhớ luận lý của user vào địa chỉ thực
2. Không gian vật lý và không gian luận lý:
 Địa chỉ vật lý (physical address - địa chỉ thực) là vị trí thực trong bộ nhớ chính.
 Địa chỉ luận lý (logical address) là một vị trí nhớ được diễn tả trong một chương trình
(còn gọi là địa chỉ ảo - virtual address)
– Các trình biên dịch (compiler) tạo ra mã lệnh chương trình mà trong đó mọi
tham chiếu bộ nhớ đều là địa chỉ luận lý
– Địa chỉ tương đối (relative address) (địa chỉ khả tái định vị, relocatable address)
là một kiểu địa chỉ luận lý trong đó các địa chỉ được biểu diễn tương đối so với
một vị trí xác định nào đó trong chương trình.
 Ví dụ: 12 byte so với vị trí bắt đầu chương trình,…
– Địa chỉ tuyệt đối (absolute address): địa chỉ tương đương với địa chỉ thực.

Một địa chỉ được tạo ra bởi CPU thường được gọi là địa chỉ luận lý (logical address),
ngược lại một địa chỉ được xem bởi đơn vị bộ nhớ-nghĩa là, một địa chỉ được nạp vào thanh
ghi địa chỉ bộ nhớ-thường được gọi là địa chỉ vật lý (physical address).
Các phương pháp liên kết địa chỉ thời điểm biên dịch và thời điểm nạp tạo ra địa chỉ
luận lý và địa chỉ vật lý xác định. Tuy nhiên, cơ chế liên kết địa chỉ tại thời điểm thực thi dẫn
đến sự khác nhau giữa địa chỉ luận lý và địa chỉ vật lý. Trong trường hợp này, chúng ta thường
gọi địa chỉ luận lý như là địa chỉ ảo (virtual address). Tập hợp tất cả địa chỉ luận lý được tạo ra
bởi chương trình là không gian địa chỉ luận lý ; tập hợp tất cả địa chỉ vật lý tương ứng địa chỉ
luận lý này là không gian địa chỉ vật lý. Do đó, trong cơ chế liên kết địa chỉ tại thời điểm thực
thi, không gian địa chỉ luận lý và không gian địa chỉ vật lý là khác nhau.
Việc ánh xạ tại thời điểm thực thi từ địa chỉ ảo tới địa chỉ vật lý được thực hiện bởi một
thiết bị phần cứng được gọi là bộ quản lý bộ nhớ MMU (memory-management unit). Chúng
ta có thể chọn giữa những phương pháp khác nhau để thực hiện việc ánh xạ.
2


Memory Management
Như được hiển thị trong hình bên,
phương pháp này yêu cầu sự hỗ trợ phần
cứng. Thanh ghi nền bây giờ được gọi là
thanh ghi tái định vị. Giá trị trong thanh
ghi tái định vị được cộng vào mỗi địa chỉ
được tạo ra bởi quá trình người dùng tại
thời điểm nó được gởi tới bộ nhớ.
Thí dụ, nếu giá trị nền là 14000, thì
việc cố gắng bởi người dùng để xác định
vị trí 0 được tự động tái định vị tới vị trí 14000; một truy xuất tới
địa chỉ
Hình
0-2 346 được ánh xạ tới

vị trí 14346.

Định vị tự động dùng thanh ghi tái định vị

II. Nạp chương trình vào bộ nhớ

 Bộ linker: kết hợp các object module thành một file nhị phân khả thực thi gọi là load
module.
 Bộ loader: nạp load module vào bộ nhớ chính

Cơ chế thực hiện linking

III. Liên kết địa chỉ
3


Memory Management
Thông thường, một chương trình nằm trên đĩa như một tập tin có thể thực thi dạng nhị
phân. Nó được mang vào trong bộ nhớ và được đặt trong một quá trình để được thực thi. Phụ
thuộc vào việc quản lý bộ nhớ đang dùng, quá trình có thể được di chuyển giữa đĩa và bộ nhớ
trong khi thực thi. Tập hợp các quá trình trên đĩa đang chờ được mang vào bộ nhớ để thực thi
hình thành một hàng đợi nhập (input queue).
Thủ tục thông thường là chọn một trong những quá trình trong hàng đợi nhập và nạp quá
trình đó vào trong bộ nhớ. Khi một quá trình được thực thi, nó truy xuất các chỉ thị và dữ liệu
từ bộ nhớ. Cuối cùng, một quá trình kết thúc và không gian bộ nhớ của nó được xác định là
trống.
Hầu hết các hệ thống cho phép một quá trình người dùng nằm ở bất cứ phần nào của bộ
nhớ vật lý. Do đó, mặc dù không gian địa chỉ của máy tính bắt đầu tại 00000, nhưng địa chỉ
đầu tiên của quá trình người dùng không cần tại 00000. Sắp xếp này ảnh hưởng đến địa chỉ mà
chương trình người dùng có thể dùng. Trong hầu hết các trường hợp, một chương trình người

dùng sẽ đi qua một số bước- một vài trong chúng có thể là tuỳ chọn-trước khi được thực thi.
Các địa chỉ có thể được hiện diện trong những cách khác trong bước này. Các địa chỉ trong
chương trình nguồn thường là những danh biểu. Một trình biên dịch sẽ liên kết các địa chỉ danh
biểu tới các địa chỉ có thể tái định vị (chẳng hạn như 14 bytes từ vị trí bắt đầu của module này).
Bộ soạn thảo liên kết hay bộ nạp sẽ liên kết các địa chỉ có thể tái định vị tới địa chỉ tuyệt đối
(chẳng hạn 74014). Mỗi liên kết là một ánh xạ từ một không gian địa chỉ này tới một không
gian địa chỉ khác

Hình 0-1 Xử lý nhiều bước của chương trình người dùng
Về truyền thống, liên kết các chỉ thị và dữ liệu tới các địa chỉ có thể được thực hiện tại
bất cứ bước nào theo cách sau đây:
• Thời gian biên dịch: nếu tại thời điểm biên dịch có thể biết quá trình nằm ở đâu trong
bộ nhớ thì mã tuyệt đối có thể được phát sinh. Thí dụ, nếu biết trước quá trình người
dùng nằm tại vị trí R thì mã trình biên dịch được phát sinh sẽ bắt đầu tại vị trí đó và mở
rộng từ đó. Nếu tại thời điểm sau đó, vị trí bắt đầu thay đổi thì sẽ cần biên dịch lại mã
này. Các chương trình định dạng .COM của MS-DOS là mã tuyệt đối giới hạn tại thời
điểm biên dịch.
• Thời điểm nạp: nếu tại thời điểm biên dịch chưa biết nơi quá trình sẽ nằm ở đâu
trong bộ nhớ thì trình biên dịch phải phát sinh mã có thể tái định vị. Trong trường hợp
này, liên kết cuối cùng được trì hoãn cho tới thời điểm nạp. Nếu địa chỉ bắt đầu thay
đổi, chúng ta chỉ cần nạp lại mã người dùng để hợp nhất giá trị được thay đổi này.

4


Memory Management
• Thời gian thực thi: nếu quá trình có thể được di chuyển trong thời gian thực thi từ
một phân đoạn bộ nhớ này tới một phân đoạn bộ nhớ khác thì việc liên kết phải bị trì
hoãn cho tới thời gian chạy. Phần cứng đặc biệt phải sẳn dùng cho cơ chế này để thực
hiện công việc. Hầu hết những hệ điều hành này dùng phương pháp này.

Phần chủ yếu của chương này được dành hết để hiển thị các liên kết khác nhau có thể
được cài đặt hữu hiệu trong một hệ thống máy tính và thảo luận sự hỗ trợ phần cứng tương
ứng.

IV. Liên kết động và các thư viện được chia sẻ

Một số hệ điều hành hỗ trợ chỉ liên kết tĩnh mà trong đó các thư viện ngôn ngữ hệ thống
được đối xử như bất kỳ module đối tượng khác và được kết hợp bởi bộ nạp thành hình ảnh
chương trình nhị phân. Khái niệm liên kết động là tương tự như khái niệm nạp động. Liên kết
bị trì hoãn hơn là việc nạp bị trì hoãn cho tới thời điểm thực thi. Đặc điểm này thường được
dùng với các thư viện hệ thống như các thư viện chương trình con của các ngôn ngữ. Không có
tiện ích này, tất cả chương trình trên một hệ thống cần có một bản sao thư viện của ngôn ngữ
của chúng (hay ít nhất thư viện được tham chiếu bởi chương trình) được chứa trong hình ảnh
có thể thực thi. Yêu cầu này làm lãng phí cả không gian đĩa và bộ nhớ chính. Với liên kết động,
một stub là một đoạn mã hiển thị cách định vị chương trình con trong thư viện cư trú trong bộ
nhớ hay cách nạp thư viện nếu chương trình con chưa hiện diện.
Khi stub này được thực thi, nó kiểm tra để thấy chương trình con được yêu cầu đã ở
trong bộ nhớ hay chưa. Nếu chưa, chương trình này sẽ nạp chương trình con vào trong bộ nhớ.
Dù là cách nào, stub thay thế chính nó với địa chỉ của chương trình con và thực thi chương
trình con đó. Do đó, thời điểm tiếp theo phân đoạn mã đạt được, chương trình con trong thư
viện được thực thi trực tiếp mà không gây ra bất kỳ chi phí cho việc liên kết động. Dưới cơ chế
này, tất cả các quá trình sử dụng một thư viện ngôn ngữ thực thi chỉ một bản sao của mã thư
viện.

5


Memory Management

V. Chuyển đổi địa chỉ


 Chuyển đổi địa chỉ: quá trình ánh xạ một địa chỉ từ không gian địa chỉ này sang không
gian địa chỉ khác.
 Biểu diễn địa chỉ nhớ
– Trong source code: symbolic (các biến, hằng, pointer,…)
– Thời điểm biên dịch: thường là địa chỉ khả tái định vị
 Ví dụ: a ở vị trí 14 bytes so với vị trí bắt đầu của module.
– Thời điểm linking/loading: có thể là địa chỉ thực. Ví dụ: dữ liệu nằm tại địa chỉ
bộ nhớ thực 2030

 Địa chỉ lệnh (instruction) và dữ liệu (data) được chuyển đổi thành địa chỉ thực có thể
xảy ra tại ba thời điểm khác nhau

Compile time: nếu biết trước địa chỉ bộ nhớ của chương trình thì có thể kết gán
địa chỉ tuyệt đối lúc biên dịch.

Ví dụ: chương trình .COM của MS-DOS

Khuyết điểm: phải biên dịch lại nếu thay đổi địa chỉ nạp chương trình

Load time: Vào thời điểm loading, loader phải chuyển đổi địa chỉ khả tái định
vị thành địa chỉ thực dựa trên một địa chỉ nền (base address).

Địa chỉ thực được tính toán vào thời điểm nạp chương trình ⇒ phải tiến
hành reload nếu địa chỉ nền thay đổi.
Sinh địa chỉ tuyệt đối vào thời điểm dịch

6



Memory Management
Sinh địa chỉ thực vào thời điểm nạp



Execution time: khi trong quá trình thực thi, process
chuyển từ segment này sang segment khác trong bộ nhớ
chuyển đổi địa chỉ được trì hoãn đến thời điểm thực thi

Cần sự hỗ trợ của phần cứng cho việc ánh xạ

Ví dụ: trường hợp địa chỉ luận lý là
thể dùng thanh ghi base và limit,…

Sử dụng trong đa số các OS đa dụng trong đó
swapping, paging, segmentation

có thể được di
thì quá trình
địa chỉ.
relocatable thì có
có các cơ chế

VI. Dynamic linking


Quá trình link đến một module ngoài (external module) được thực hiện sau khi đã tạo
xong load module (i.e. file có thể thực thi, executable)

Ví dụ trong Windows: module ngoài là các file .DLL còn trong Unix, các

module ngoài là các file .so (shared library)

Load module chứa các stub tham chiếu (refer) đến routine của external module.

Khi stub được thực thi lần đầu (do process gọi routine lần đầu), stub nạp routine
vào bộ nhớ, tự thay thế bằng địa chỉ của routine và routine được thực thi.

Các lần gọi routine sau sẽ xảy ra bình thường

Stub cần sự hỗ trợ của OS (như kiểm tra xem routine đã được nạp vào bộ nhớ chưa).

7


Memory Management
Ưu điểm của Dynamic linking

Thông thường, external module là một thư viện cung cấp các tiện ích của OS. Các
chương trình thực thi có thể dùng các phiên bản khác nhau của external module mà không
cần sửa đổi, biên dịch lại.

Chia sẻ mã (code sharing): một external module chỉ cần nạp vào bộ nhớ một lần. Các
process cần dùng external module này thì cùng chia sẻ đoạn mã của external module ⇒ tiết
kiệm không gian nhớ và đĩa.

Phương pháp dynamic linking cần sự hỗ trợ của OS trong việc kiểm tra xem một thủ
tục nào đó có thể được chia sẻ giữa các process hay là phần mã của riêng một process (bởi
vì chỉ có OS mới có quyền thực hiện việc kiểm tra này).

VII. Dynamic loading

Cơ chế: chỉ khi nào cần được gọi đến thì một thủ tục mới được nạp vào bộ nhớ chính
⇒ tăng độ hiệu dụng của bộ nhớ (memory utilization) bởi vì các thủ tục không được gọi đến sẽ
không chiếm chỗ trong bộ nhớ.

Rất hiệu quả trong trường hợp tồn tại khối lượng lớn mã chương trình có tần
suất sử dụng thấp, không được sử dụng thường xuyên (ví dụ các thủ tục xử lý lỗi).

Hỗ trợ từ hệ điều hành.

Thông thường, user chịu trách nhiệm thiết kế và hiện thực các chương trình có
dynamic loading.

Hệ điều hành chủ yếu cung cấp một số thủ tục thư viện hỗ trợ, tạo điều kiện dễ
dàng hơn cho lập trình viên.
Trong thảo luận gần đây, toàn bộ chương trình và dữ liệu của một quá trình phải ở trong
bộ nhớ vật lý để quá trình thực thi. Kích thước của quá trình bị giới hạn bởi kích thước của bộ
nhớ vật lý. Để đạt được việc sử dụng không gian bộ nhớ tốt hơn, chúng ta có thể sử dụng nạp
động (dynamic loading). Với nạp động, một thủ tục không được nạp cho tới khi nó được gọi.
Tất cả thủ tục được giữ trên đĩa trong định dạng nạp có thể tái định vị. Chương trình chính
được nạp vào bộ nhớ và được thực thi. Khi một thủ tục cần gọi một thủ tục khác, thủ tục gọi
trước hết kiểm tra để thấy thủ tục khác được nạp hay không. Nếu không, bộ nạp liên kết có thể
tái định vị được gọi để nạp thủ tục mong muốn vào bộ nhớ và cập nhật các bảng địa chỉ của
chương trình để phản ánh thay đổi này. Sau đó, điều khiển này được truyền tới thủ tục mới
được nạp.
Thuận lợi của nạp động là ở đó một thủ tục không được dùng thì không bao giờ được
nạp. Phương pháp này đặc biệt có ích khi lượng lớn mã được yêu cầu quản lý các trường hợp
xảy ra không thường xuyên, chẳng hạn như các thủ tục lỗi. Trong trường hợp này, mặc dù kích
thước toàn bộ chương trình có thể lớn, nhưng phần được dùng (và do đó được nạp) có thể nhỏ
hơn nhiều.
Nạp động không yêu cầu hỗ trợ đặc biệt từ hệ điều hành. Nhiệm vụ của người dùng là

thiết kế các chương trình đạt được sự thuận lợi đó. Tuy nhiên, hệ điều hành có thể giúp người
lập trình bằng cách cung cấp các thủ tục thư viện để cài đặt nạp tự động.

VIII. Cơ chế phủ lắp (overlay)
 Tại mỗi thời điểm, chỉ giữ lại trong bộ nhớ những lệnh hoặc dữ liệu cần thiết, giải phóng các
lệnh/dữ liệu chưa hoặc không cần dùng đến.
 Cơ chế này rất hữu dụng khi kích thước một process lớn hơn không gian bộ nhớ cấp cho
process đó
 Cơ chế này được điều khiển bởi người sử dụng (thông qua sự hỗ trợ của các thư viện lập trình)
chứ không cần sự hỗ trợ của hệ điều hành
Để cho phép một quá trình lớn hơn lượng bộ nhớ được cấp phát cho nó, chúng ta sử
dụng cơ chế phủ lắp (overlays). Ý tưởng phủ lắp là giữ trong bộ nhớ những chỉ thị và dữ liệu
được yêu cầu tại bất kỳ thời điểm nào được cho. Khi những chỉ thị đó được yêu cầu, chúng
được nạp vào không gian được chiếm trước đó bởi các chỉ thị mà chúng không còn cần nữa.
8


Memory Management
Xét trình dịch hợp ngữ hai lần (twopass assembler). Trong suốt
lần thứ nhất, nó xây dựng bảng danh biểu; sau
đó, trong lần thứ 2, nó tạo ra
mã máy. Có thể phân chia trình dịch hợp ngữ
thành mã lần 1, mã lần 2, bảng
danh biểu, và những thủ tục hỗ trợ chung được
dùng bởi lần 1 và lần 2. Giả sử
kích thước của các thành phần này như sau:
• Lần 1: 70 KB
• Lần 2: 80 KB
• Bảng danh biểu: 20 KB
• Các thủ tục chung: 30 KB

Để nạp mọi thứ một lần, chúng ta cần 200KB bộ nhớ. Nếu chỉ có 150KB sẳn có, chúng
ta không thể chạy quá trình của chúng ta. Tuy nhiên, chú ý rằng lần 1 và lần 2 không cần ở
trong bộ nhớ cùng một lúc. Do đó, chúng ta định nghĩa hai phủ lắp. Phủ lắp A là bảng danh
biểu, các thủ tục chung, lần 1, và phủ lắp B là bảng biểu tượng, các thủ tục chung và lần 2.
Chúng ta bổ sung trình điều khiển phủ lắp (10 KB) và bắt đầu với phủ lắp A trong bộ
nhớ. Khi kết thúc lần 1, chúng ta nhảy tới trình điều khiển phủ lắp, trình điều khiển này sẽ đọc
phủ lắp B vào trong bộ nhớ, viết chồng lên phủ lắp B và sau đó chuyển điều khiển tới lần 2.
Phủ lắp A chỉ cần 120KB, ngược lại phủ lắp B cần 130KB. Bây giờ chúng ta có thể chạy trình
hợp ngữ trong 150 KB bộ nhớ. Nó sẽ nạp nhanh hơn vì rất ít dữ liệu cần được chuyển trước khi
việc thực thi bắt đầu. Tuy nhiên, nó sẽ chạy chậm hơn do nhập/xuất phụ đọc mã mã cho phủ
lắp A qua mã cho phủ lắp B.

Hình 0-3- Cách phủ lắp cho một bộ hợp ngữ dịch hai lần
Mã cho phủ lắp A và mã cho phủ lắp B được giữ trên đĩa như những hình ảnh bộ nhớ
tuyệt đối, và được đọc bởi trình điều khiển phủ lắp khi cần. Tái định vị đặc biệt và các giải
thuật liên kết được yêu cầu xây dựng các phủ lắp.

IX. Cơ chế hoán vị (swapping)
Một process có thể tạm thời bị swap ra khỏi bộ nhớ chính và lưu trên một hệ thống lưu
trữ phụ. Sau đó, process có thể được nạp lại vào bộ nhớ để tiếp tục quá trình thực thi.
Swapping policy: hai ví dụ
- Round-robin: swap out P1 (vừa tiêu thụ hết quantum của nó), swap in P2, thực thi P3
- Roll out, roll in: dùng trong cơ chế định thời theo độ ưu tiên
Process có độ ưu tiên thấp hơn sẽ bị swap out nhường chỗ cho process có độ ưu tiên cao
hơn mới đến được nạp vào bộ nhớ để thực thi
 Hiện nay, ít hệ thống sử dụng cơ chế swapping trên

9



Memory Management

Hình 0-4- Hoán vị hai quá trình dùng đĩa như là backing store
Một quá trình cần ở trong bộ nhớ để được thực thi. Tuy nhiên, một quá trình có thể
được hoán vị (swapped) tạm thời khỏi bộ nhớ tới vùng lưu trữ phụ backing store, sau đó mang
trở lại bộ nhớ để việc thực thi được tiếp tục. Thí dụ, giả sử một môi trường đa chương với giải
thuật lập thời biểu CPU round-robin. Khi định mức thời gian hết, bộ quản lý bộ nhớ sẽ bắt đầu
swap out vùng lưu trữ phụ quá trình vừa mới kết thúc và swap in một quá trình khác tới không
gian bộ nhớ được trống . Do đó, bộ định thời biểu CPU sẽ cấp những phần thời gian tới những
quá trình khác trong bộ nhớ. Lý tưởng, bộ quản lý sẽ hoán vị các quá trình đủ nhanh để một vài
quá trình sẽ ở trong bộ nhớ, sẳn sàng thực thi, khi bộ định thời CPU muốn định thời lại CPU.
Định mức cũng phải đủ lớn để phù hợp lượng tính toán được thực hiện giữa các hoán vị.
Một biến thể của chính sách hoán vị này được dùng cho các giải thuật định thời trên cơ
sở ưu tiên. Nếu một quá trình có độ ưu tiên cao hơn đến và muốn phụ vụ, bộ quản lý bộ nhớ có
thể hoán vị ra quá trình có độ ưu tiên thấp hơn để mà nó có thể nạp và thực thi quá trình có độ
ưu tiên cao hơn. Khi quá trình có độ ưu tiên cao hơn kết thúc, quá trình có độ ưu tiên thấp hơn
có thể được hoán vị vào trở lại và được tiếp tục. Biến thể của hoán vị này thường được gọi là
roll out, và roll in.
Thông thường, một quá trình được hoán vị ra sẽ được hoán vị trở lại vào cùng không
gian bộ nhớ mà nó đã chiếm trước đó. Sự giới hạn này được sai khiến bởi phương pháp liên kết
địa chỉ. Nếu liên kết địa chỉ được thực hiện tại thời điểm hợp dịch hay nạp thì quá trình không
thể được di chuyển vào không gian bộ nhớ khác vì các địa chỉ vật lý được tính trong thời gian
thực thi.
Hoán vị yêu cầu một vùng lưu trữ phụ (backing store). Vùng lưu trữ phụ này thường
là một đĩa tốc độ cao. Nó phải đủ lớn để chứa các bản sao của tất cả hình ảnh bộ nhớ cho tất cả
người dùng và nó phải cung cấp truy xuất trực tiếp tới các hình ảnh bộ nhớ này. Hệ thống này
duy trì một hàng đợi sẵn sàng chứa các quá trình mà các hình ảnh bộ nhớ của nó ở trong vùng
lưu trữ phụ hay trong bộ nhớ sẵn sàng để thực thi. Bất cứ khi nào bộ định thời CPU quyết định
thực thi một quá trình, nó gọi bộ phân phát (dispacher). Bộ phân phát kiểm tra để thấy có quá
trình tiếp theo trong hàng đợi ở trong bộ nhớ không. Nếu không, và không có vùng bộ nhớ

trống, bộ phân phát swap out một quá trình hiện hành trong bộ nhớ và swap in một quá trình
mong muốn. Sau đó, nó nạp lại các thanh ghi và chuyển điều khiển tới quá trình được chọn.
Trong các hệ hoán vị, thời gian chuyển đổi giữa các tác vụ cần được quan tâm. Mỗi quá
trình cần được phân chia một khoảng thời gian sử dụng CPU đủ lớn để không thấy rõ sự chậm
trễ do các thao tác hoán vị gây ra. Nếu không, hệ thống sẽ dùng phần lớn thời gian để hoán vị
các quá trình vào ra bộ nhớ chính. Như vậy, CPU sẽ không được sử dụng hiệu quả.
Hoán vị cũng bị ràng buộc bởi yếu tố khác. Nếu chúng ta muốn hoán vị một quá trình,
chúng ta phải đảm bảo rằng nó hoàn toàn rỗi. Quan tâm đặc biệt là việc chờ nhập/xuất. Một
quá trình có thể đang chờ thao tác nhập/xuất khi chúng ta hoán vị quá trình đó tới nơi trống bộ
nhớ của nó. Tuy nhiên, nếu nhập/xuất đang truy xuất không đồng bộ bộ nhớ người dùng cho
10


Memory Management
nhập/xuất vùng đệm, thì quá trình không thể được hoán vị. Giả sử rằng thao tác nhập/xuất đang
xếp hàng chờ vì thiết bị đang bận. Sau đó, nếu chúng ta hoán vị quá trình P 1 ra và hoán vị P2
vào thì thao tác nhập/xuất có thể cố gắng sử dụng bộ nhớ hiện thuộc về quá trình P 2. Hai giải
pháp chủ yếu cho quá trình này là không bao giờ hoán vị quá trình đang chờ nhập/xuất hay
thực thi các thao tác nhập/xuất chỉ ở trong vùng đệm của hệ điều hành. Chuyển giữa các vùng
đệm của hệ điều hành và bộ nhớ quá trình thì chỉ xảy ra khi quá trình được hoán vị

X. Cấp phát bộ nhớ liên tục

Bộ nhớ chính phải cung cấp cho cả hệ điều hành và các quá trình người dùng khác nhau.
Do đó, chúng ta cần cấp phát những phần khác nhau của bộ nhớ chính trong những cách hiệu
quả nhất có thể. Phần này chúng ta giải thích một phương pháp thông dụng, cấp phát bộ nhớ
liên tục.
Bộ nhớ thường được phân chia thành hai phân khu, một cho hệ điều hành định vị và một
cho các quá trình người dùng. Chúng ta có thể đặt hệ điều hành ở bộ nhớ cao hay bộ nhớ thấp.
Yếu tố quan trọng ảnh hưởng tới quyết định này là vị trí vector ngắt. Vì vector ngắt thường ở

trong bộ nhớ thấp nên các lập trình viên thường đặt hệ điều hành trong bộ nhớ thấp. Do đó,
trong giáo trình này chúng ta sẽ thảo luận chỉ trường hợp hệ điều hành định vị trong bộ nhớ
thấp. Phát triển của trường hợp khác là tương tự.
Chúng ta thường muốn nhiều quá trình người dùng định vị trong bộ nhớ tại cùng thời
điểm. Do đó, chúng ta cần xem xét cách cấp phát bộ nhớ trống tới những quá trình ở trong
hàng đợi nhập đang chờ được mang vào bộ nhớ. Trong cấp phát bộ nhớ liên tục, mỗi quá trình
được chứa trong một phần bộ nhớ liên tục.

XI. Mô hình quản lý bộ nhớ


Trong chương này, mô hình quản lý bộ nhớ là một mô hình đơn giản, không có bộ nhớ

ảo.


Một process phải được nạp hoàn toàn vào bộ nhớ thì mới được thực thi (ngoại trừ khi
sử dụng cơ chế overlay).

Các cơ chế quản lý bộ nhớ sau đây rất ít (hầu như không còn) được dùng trong các hệ
thống hiện đại

Phân chia cố định (fixed partitioning)

Phân chia động (dynamic partitioning)

Phân trang đơn giản (simple paging)

Phân đoạn đơn giản (simple segmentation)
Phân mảnh

Phân mảnh bộ nhớ có thể là phân mảnh trong hoặc phân mảnh ngoài. Xét cơ chế cấp
phát nhiều phân khu với một lỗ trống có kích thước 18,464 bytes. Giả sử rằng quá trình tiếp
theo yêu cầu 18,462 bytes. Nếu chúng ta cấp phát chính xác khối được yêu cầu, chúng ta để lại
một lỗ trống có kích thước 2 bytes. Chi phí để giữ vết của lỗ này sẽ lớn hơn kích thước của lỗ
trống. Tiếp cận thông thường là chia bộ nhớ vật lý thành những khối có kích thước cố định, và
cấp phát bộ nhớ dựa theo đơn vị của kích thước khối. Với tiếp cận này, bộ nhớ được cấp phát
tới một quá trình có thể là lớn hơn một chút so với khối được yêu cầu. Sự chênh lệnh giữa hai
số này là phân mảnh trong-bộ nhớ bị phân mảnh trong đối với một phân khu thì không thể
được dùng.
Một giải pháp đối với phân mảnh ngoài là kết lại thành khối (compaction). Mục tiêu là
di chuyển nội dung bộ nhớ để đặt tất cả bộ nhớ trống với nhau trong một khối lớn. Kết khối
không phải luôn thực hiện được. Nếu việc tái định vị là tĩnh và được thực hiện tại thời điểm
hợp dịch và nạp thì việc kết khối là không thể thực hiện được. Kết khối chỉ có thể thực hiện
được chỉ nếu tái định vị là động và được thực hiện tại thời điểm thực thi. Nếu địa chỉ được tái
định vị động, tái định vị yêu cầu chỉ di chuyển chương trình và dữ liệu, sau đó thay đổi thanh
ghi nền để phản ánh địa chỉ nền mới. Khi kết khối là có thể, chúng ta phải xác định chi phí của
nó. Giải thuật kết khối đơn giản nhất là di chuyển tất cả quá trình tới cuối bộ nhớ; tất cả lỗ
trống di chuyển theo hướng ngược lại, tạo ra một lỗ trống lớn của bộ nhớ sẳn dùng. Cơ chế này
có thể đắt.
11


Memory Management
Một giải pháp khác cho vấn đề phân mảnh ngoài là cho phép không gian địa chỉ của
một quá trình là không liên tục, do đó cho phép một quá trình được cấp phát bộ nhớ vật lý bất
cứ đâu sau khi sẳn dùng. Hai kỹ thuật bù trừ để đạt giải pháp này là phân trang và phân đoạn.
Có 2 loại phân mảnh:

Phân mảnh ngoại (external fragmentation)


Kích thước không gian nhớ còn trống đủ để thỏa mãn một yêu cầu cấp phát, tuy
nhiên không gian nhớ này không liên tục ⇒ có thể dùng cơ chế kết khối (compaction)
để gom lại thành vùng nhớ liên tục.

Phân mảnh nội (internal fragmentation)

Kích thước vùng nhớ được cấp phát có thể hơi lớn hơn vùng nhớ yêu cầu.

Ví dụ: cấp một khoảng trống 18,464 bytes cho một process yêu cầu
18,462 bytes.

Hiện tượng phân mảnh nội thường xảy ra khi bộ nhớ thực được chia thành các
khối kích thước cố định (fixed-sized block) và các process được cấp phát theo đơn vị
khối. Ví dụ: cơ chế phân trang (paging).
a) Phân mảnh nội

b) Fixed partitioning

Khi khởi động hệ thống, bộ nhớ chính được chia thành nhiều phần rời nhau
gọi là các partition có kích thước bằng nhau hoặc khác nhau

Process nào có kích thước nhỏ hơn hoặc bằng kích thước partition thì có thể
được nạp vào partition đó.

Nếu chương trình có kích thước lớn hơn partition thì phải dùng cơ chế
overlay.

Nhận xét: Không hiệu quả do bị phân mảnh nội: một chương trình dù lớn
hay nhỏ đều được cấp phát trọn một partition.
c) Chiến lược placement


Partition có kích thước bằng nhau

Nếu còn partition trống ⇒ process mới sẽ được nạp vào
partition đó

Nếu không còn partition trống, nhưng trong đó có process đang
bị blocked ⇒ swap process đó ra bộ nhớ phụ nhường chỗ cho process
mới.

Partition có kích thước không bằng nhau: giải pháp 1

Gán mỗi process vào partition nhỏ nhất phù hợp với nó

Có hàng đợi cho mỗi partition

Giảm thiểu phân mảnh nội

Vấn đề: có thể có một số hàng đợi trống không (vì không có
process với kích thước tương ứng) và hàng đợi dày đặc

Partition có kích thước không bằng nhau: giải pháp 2

Chỉ có một hàng đợi chung cho mọi partition

Khi cần nạp một process vào bộ nhớ chính ⇒ chọn partition
nhỏ nhất còn trống
12



Memory Management
d) Dynamic partitioning

Số lượng partition không cố định và partition có thể có kích thước khác nhau

Mỗi process được cấp phát chính xác dung lượng bộ nhớ cần thiết

Gây ra hiện tượng phân mảnh ngoại

e) Chiến lược placement
 Dùng để quyết định cấp phát khối bộ nhớ trống nào cho một process
 Mục tiêu: giảm chi phí compaction
 Các chiến lược placement

Best-fit: chọn khối nhớ trống nhỏ nhất

First-fit: chọn khối nhớ trống phù hợp đầu tiên kể từ đầu bộ nhớ

Next-fit: chọn khối nhớ trống phù hợp đầu tiên kể từ vị trí cấp phát cuối cùng

Worst-fit: chọn khối nhớ trống lớn nhất

13


Memory Management

XII. Cấp phát không liên tục

XII.1. Cơ chế phân trang (Paging)

1. Định nghĩa:
Không gian địa chỉ là tập hợp tất cả các địa chỉ ảo phát sinh bởi một chương trình.
Không gian vật lý là tập hợp tất cả các địa chỉ vật lý tương ứng với các địa chỉ ảo.
Phân trang là cơ chế quản lý bộ nhớ cho phép không gian địa chỉ vật lý của quá trình có
thể không kề nhau, cho phép truy xuất dữ liệu từ vùng lưu trữ phụ. Tiến trình được phân phối
bộ nhớ vật lý bất kỳ lúc nào khi bộ nhớ sẵn có. Bộ nhớ vật lý được chia thành các khối (block)
có kích thước cố định và bằng nhau, gọi là khung trang (page frame). Không gian địa chỉ cũng
được chia thành các khối có cùng kích thước được gọi là các trang (pages). Khi cần nạp một
tiến trình để xử lý, các trang của tiến trình sẽ được nạp vào những khung trang còn trống. Một
tiến trình kích thước N trang sẽ yêu cầu N khung trang tự do.
MMU (memory-management unit) là một cơ chế phần cứng được sử dụng để thực hiện
việc biên dịch (translate) địa chỉ ảo thành địa chỉ vật lý vào thời điểm xử lý. Người ta thiết lập
một bảng trang, trong đó mỗi phần tử cho biết các địa chỉ bắt đầu của vị trí lưu trữ trang tương
ứng trong bộ nhớ vật lý (số hiệu khung trang trong bộ nhớ vật lý đang chứa trang ).
2. Chuyển đổi địa chỉ
Mỗi địa chỉ phát sinh bởi CPU được chia thành hai phần:
+ Số hiệu trang - Page number (p):
chứa địa chỉ cơ sở của mỗi trang trong bộ
nhớ vật lý, được sử dụng như chỉ mục đến
phần tử tương ứng trong bảng trang.
+ Địa chỉ tương đối trang - Offset
(d): kết hợp với địa chỉ cơ sở để tạo ra địa chỉ
vật lý mà trình quản lý bộ nhớ sử dụng.

14


Memory Management
Ví dụ:


Kích thước của trang do phần cứng qui định. Để dễ phân tích địa luận lí thành số hiệu
trang và địa chỉ tương đối, kích thước của một trang thông thường là một lũy thừa của 2, từ
512 bytes đến 16MB trên trang (phụ thuộc vào kiến trúc máy tính). Nếu kích thước không gian
địa chỉ là 2m, và kích thước trang là 2n đơn vị địa chỉ (byte hay word) thì m-n bits cao của địa
chỉ luận lý sẽ biểu diễn số hiệu trang, và n bits thấp cho biết địa chỉ tương đối trong trang.

3. Cài đặt bảng trang
Cách đơn giản nhất để cài đặt một bảng trang là sử dụng các thanh ghi có tính logic tốc
độ cao để thực hiện việc dịch địa chỉ trang một cách hiệu quả. Tuy nhiên việc sử dụng thanh
ghi chỉ phù hợp với các bảng trang có kích thước nhỏ (có dưới 256 mục từ), nếu bảng trang có
kích thước lớn, nó phải được lưu trữ trong bộ nhớ chính.
- Thanh ghi cơ sở bảng trang (page-table base register - PTBR): lưu địa chỉ bắt đầu
lưu trữ bảng trang
- Thanh ghi độ dài bảng trang (page-table length register - PTLR): lưu kích thước
bảng trang

Theo cách tổ chức này, mỗi truy xuất đến dữ liệu hay chỉ thị đều đòi hỏi hai lần truy
xuất bộ nhớ: một cho truy xuất đến bảng trang và một cho bản thân dữ liệu, dẫn đến giảm tốc
độ xử lí mỗi tiến trình. Có thể né tránh vấn đề này bằng cách sử dụng vùng nhớ cache có tốc độ

15


Memory Management
truy xuất cao và cho phép tìm kiếm song song – được gọi là bộ nhớ kết hợp (associative
memory) – hay vùng đệm hỗ trợ chuyển đổi (translation look-aside buffers - TLB).
Mỗi thanh ghi trong TLB gồm một từ khóa (số hiệu trang) và một giá trị (địa chỉ bắt
đầu của mỗi frame). Khi đưa đến bộ nhớ kết hợp một đối tượng cần tìm, đối tượng này sẽ được
so sánh cùng lúc với các từ khóa trong bộ nhớ kết hợp để tìm ra phần tử tương ứng. Nhờ đặc
tính này mà việc tìm kiếm trên bộ nhớ kết hợp được thực hiện rất nhanh, nhưng chi phí phần

cứng lại cao.

Trong kỹ thuật phân trang, TLB được sử dụng để lưu trữ các trang bộ nhớ được truy
cập gần hiện tại nhất. Khi CPU phát sinh một địa chỉ, số hiệu trang của địa chỉ sẽ được so sánh
với các phần tử trong TLB, nếu có trang tương ứng trong TLB, thì sẽ xác định được ngay số
hiệu khung trang tương ứng, nếu không mới cần thực hiện thao tác tìm kiếm trong bảng trang.
4. Thời gian truy cập hiệu quả
Thời gian tìm kiếm ở thanh ghi kết hợp = ε (đơn vị thời gian)
- Thời gian truy cập bộ nhớ = n (đơn vị thời gian)
- Hit ratio = α: Số phần trăm (%) địa chỉ trang được tìm thấy ở các thanh ghi kết
hợp/TLB
- Thời gian truy cập hiệu quả (EAT):
EAT = (n + ε) α + (2n + ε)(1 – α) = (2 - α)n + ε (đơn vị thời gian)
5. Cấu trúc bảng trang:
5.1. Bảng trang phân cấp:
Bảng trang đã đề cập ở trên chỉ được sử dụng trong các hệ thống có dung lượng bộ nhớ
nhỏ. Ngày nay, các bộ nhớ trong thường có dung lượng lớn dẫn đến bảng trang thường rất dài
và gồm rất nhiều mục. Ví dụ không gian địa chỉ lớn 2 32, kích thước trang nhớ là 4K (2 12) =>
bảng phân trang có 232/212=220=1M mục. Như vậy, việc dò tìm một chỉ số trang nào đó trong
bảng phân trang sẽ tốn thời gian rất lớn, ảnh hưởng trực tiếp đến việc xử lý của máy tính.
Để xử lí vấn đề này, người ta đặt ra một giải pháp là chia bảng trang thành những thành
phần nhỏ hơn, từ đó tạo thành bảng phân trang hai cấp.

Xem lại ví dụ máy 32 bit có không gian bộ nhớ trong 2 32 và kích thước trang 4K, địa
chỉ luận lí được chia thành số trang chứa 20 bit và độ dời trang chứa 12 bit (d). Sau khi áp
16


Memory Management
dụng giải thuật phân trang hai cấp, số trang lại được chia thành số trang 10 bit (P1) và độ dời

trang 10 bit (P2).

Dịch địa chỉ trong phân trang hai cấp:

Cơ chế dịch địa chỉ: p1 sẽ được sử dụng để dò đến vị trí của bảng phân trang cấp 2 (là
một mục trong bảng phân trang cấp 1), p2 được dùng để dò đến vị trí của chỉ số trang trong
bảng phân trang cấp 2. Lúc này, địa chỉ tương đối (offset) d mới được dùng để dò đến địa chỉ
vật lí cần sử dụng.
Tùy theo yêu cầu về bộ nhớ, người ta sẽ phân trang thành nhiều cấp độ hơn: kiến trúc
SPARC hỗ trợ cơ chế phân trang 3 cấp trong khi kiến trúc Motorola 68030 hỗ trợ phân trang 4
cấp, thậm chí kiến trúc UltraSPARC còn yêu cầu phân trang đến 7 cấp.
5.2. Bảng trang được băm:
Để quản lí không gian địa chỉ lớn hơn 32 bit, người ta còn dùng bảng trang được băm
(hashed page table), giá trị băm là số trang ảo. Mỗi mục từ trong bảng trang chứa một danh
sách liên kết của các phần tử. Danh sách này được băm ở cùng vị trí (để quản lý đụng độ). Mỗi
phần tử chứa ba trường:
- số trang ảo (a),
- giá trị frame được ánh xạ (b),
- con trỏ chỉ tới phần tử kế tiếp trong danh sách liên kết.
17


Memory Management
Cơ chế dịch địa chỉ: số trang ảo trong địa chỉ ảo được băm tới bảng băm. Số trang ảo
được so sánh tới trường (a) trong phần tử đầu tiên của danh sách liên kết. Nếu có phần tử trùng
khớp, địa chỉ frame tương ứng (trường (b)) được dùng để hình thành địa chỉ vật lí. Nếu không
có phần tử nào trùng khớp, các mục từ tiếp theo trong danh sách liên kết sẽ được tìm kiếm số
trang ảo trùng khớp.

5.3. Bảng trang nghịch đảo:

Một trong những khó khăn của phương pháp bảng trang là mỗi bảng trang có thể chứa
hàng triệu mục từ. Các bảng này có thể tiêu tốn lượng lớn bộ nhớ vật lý. Do đó, người ta sử
dụng thêm một giải thuật nữa là bảng trang nghịch đảo (inverted page table).
Bảng trang đảo được sử dụng chung cho tất cả các process. Bảng này có một mục từ
cho mỗi frame của bộ nhớ. Mỗi mục từ chứa địa chỉ ảo của trang được lưu trong vị trí bộ nhớ
thật và thông tin về tiến trình sử dụng trang đó. Do đó, chỉ có một bảng trang trong hệ thống và
nó chỉ có một mục từ cho mỗi trang của bộ nhớ vật lý.

Ví dụ: cài đặt bảng trang đảo dùng trong IBM RT. Mỗi địa chỉ ảo trong hệ thống chứa
bộ ba:
Mỗi mục từ bảng trang đảo là một cặp , ở đây processid đảm bảo vai trò định danh không gian địa chỉ. Khi có tham chiếu bộ nhớ, một phần
của địa chỉ ảo, gồm , xuất hiện trong hệ thống bộ nhớ. Sau
đó, phần địa chỉ này được dò tìm trong bảng trang đảo. Nếu tìm thấy tại mục từ i thì địa
chỉ vật lý <i, offset> được tạo ra. Nếu không tìm thấy thì hệ thống sẽ thử thực hiện truy
xuất không hợp lệ.
Phương pháp này giúp giảm dung lượng bộ nhớ để lưu các bảng trang, nhưng lại tăng
thời gian tìm trong bảng khi cần tham chiếu đến một trang. Do đó, người ta sử dụng bảng băm

18


Memory Management
để hạn chế số lần tìm kiếm các phần tử trong bảng trang. Để cải tiến tốc độ thực hiện, các nhà
thiết kế cho phép hệ thống tìm trong TLB trước khi tra cứu vào bảng băm.
6. Bảo vệ:
Bảo vệ bộ nhớ trong môi trường phân trang được thực hiện bởi các bit bảo vệ gán liền
với mỗi khung trang. Thông thường, các bit này được giữ trong bảng trang. Một bit có thể định
nghĩa một trang để đọc-viết (read-write) hay chỉ đọc (read-only). Mỗi tham chiếu tới bộ nhớ sẽ
tìm khắp bảng trang để xác định số khung tương ứng. Tại cùng thời điểm địa chỉ vật lý được
tính, các bit bảo vệ có thể được kiểm tra để thẩm định rằng không có thao tác write nào đang

được thực hiện tới trang read-only. Cố gắng write tới một trang read-only gây ra một trap phần
cứng tới hệ điều hành (hay xung đột bộ nhớ bảo vệ).
Ngoài ra, có thể tạo phần cứng để cung cấp bảo vệ chỉ đọc, đọc viết, chỉ thực thi. Bằng
cách cung cấp các bit bảo vệ riêng cho mỗi loại truy xuất, chúng ta có thể cho phép bất cứ kết
hợp của các truy xuất này; các cố gắng không hợp lệ sẽ được trap tới hệ điều hành.

Một bit nữa thường được gán tới mỗi mục từ trong bảng trang: một bit hợp lệ-không
hợp lệ (valid-invalid). Khi bit này được đặt là “hợp lệ” thì trang được gán trong không gian địa
chỉ luận lý bộ nhớ là trang hợp lệ. Nếu bit này được đặt là “không hợp lệ”, trang đó không ở
trong không gian địa chỉ luận lý của quá trình. Các địa chỉ không hợp lệ được trap bằng cách
sử dụng bit hợp lệ-không hợp lệ. Hệ điều hành thiết lập bit này cho mỗi trang để cho phép hay
không cho phép truy xuất tới trang này.
7. Chia sẻ trang nhớ:
Xét ví dụ trên hình vẽ, cả ba quá trình P 1, P2, P3 đều sử dụng bộ soạn thảo giống nhau.
Giả sử bộ soạn thảo kích thước 150 KB, phần data kích thước 50 KB, để cung cấp tài nguyên
cho 50 người dùng ta cần đến 10000 KB bộ nhớ. Tuy nhiên, khi mã là mã tái sử dụng
(reentrant code), dữ liệu có thể được chia sẻ.

19


Memory Management

Mã tái sử dụng (hay thuần mã-pure code) là mã không thay đổi bởi chính nó. Nếu mã là
tái sử dụng thì nó không bao giờ thay đổi trong quá trình thực thi. Do đó, hai hay nhiều quá
trình có thể thực thi cùng mã tại cùng thời điểm. Mỗi quá trình có bản sao thanh ghi của chính
nó và lưu trữ dữ liệu để quản lý dữ liệu cho việc thực thi của quá trình.
Sau khi dùng mã tái sử dụng để cung cấp tài nguyên cho 50 người dùng, người ta chỉ
cần 2500 KB lưu trữ dữ liệu và 150 KB chứa bộ soạn thảo.
Nhận xét:

• Kỹ thuật phân trang loại bỏ được hiện tượng phân mảnh ngoại vi: mỗi khung trang đều
có thể được cấp phát cho một tiến trình nào đó có yêu cầu. Tuy nhiên hiện tượng phân
mảnh nội vi vẫn có thể xảy ra khi kích thước của tiến trình không đúng bằng bội số của
kích thước một trang, khi đó, trang cuối cùng sẽ không được sử dụng hết.
• Một khía cạnh tích cực rất quan trọng khác của kỹ thuật phân trang là sự phân biệt rạch
ròi góc nhìn của người dùng và của bộ phận quản lý bộ nhớ vật lý:
- Góc nhìn của người sử dụng: một tiến trình của người dùng nhìn thấy bộ nhớ như là
một không gian liên tục, đồng nhất và chỉ chứa duy nhất bản thân tiến trình này.
- Góc nhìn của bộ nhớ vật lý: một tiến trình của người sử dụng được lưu trữ phân tán
khắp bộ nhớ vật lý, trong bộ nhớ vật lý đồng thời cũng chứa những tiến trình khác.
• Thế nhưng sự phân trang không phản ánh đúng cách thức người sử dụng cảm nhận về
bộ nhớ. Người sử dụng nhìn thấy bộ nhớ như một tập các đối tượng của chương trình
(segments, các thư viện...) và một tập các đối tượng dữ liệu (biến toàn cục, stack, vùng
nhớ chia sẻ...). Vấn đề đặt ra là cần tìm một cách thức biễu diễn bộ nhớ sao cho có thể
cung cấp cho người dùng một cách nhìn gần với quan điểm logic của họ hơn và đу là
kỹ thuật phân đoạn
XII.2. Cơ chế phân đoạn (Segmentation)
Với phương pháp phân trang, tầm nhìn người dùng vào tổ chức bộ nhớ máy tính không
đồng nhất với bộ nhớ vật lí thật sự. Tầm nhìn người dùng được ánh xạ vào bộ nhớ vật lí. Do đó
có sự khác nhau giữa bộ nhớ luận lí và bộ nhớ vật lí.
1. Phương pháp xây dựng:
Trong thuật toán phân đoạn bộ nhớ, một chương trình được xem như một tập hợp các chương
trình con, thủ tục, hàm hay các module; chúng có thể có cấu trúc dữ liệu khác nhau như bảng,
mảng, ngăn xếp, biến, … Những thành phần ấy chỉ được tham chiếu đến bởi tên mà không cần
quan tâm đến địa chỉ trong bộ nhớ của chúng. Các phân đoạn này có chiều dài thay đổi, tùy
20


Memory Management
thuộc vào mục đích của phân đoạn trong

chương trình. Các phần tử trong phân đoạn
được định nghĩa bằng độ dời của chúng so với
điểm bắt đầu của phân đoạn.
Địa chỉ luận lí gồm 2 thành phần: số phân đoạn, độ dời>
2. Cài đặt bảng phân đoạn:
Bảng phân đoạn (segment table): tương
tự bảng phân trang, nội dung mỗi mục trong
bảng phân đoạn gồm có:
- Base: chứa địa chỉ vật lý đầu tiên của
đoạn trong bộ nhớ.
- Limit: xác định độ dài của đoạn.
Số phân đoạn (s) trong địa chỉ luận lí được dùng để trỏ đến các mục trong phân đoạn.
Độ dời (d) của địa chỉ luận lí có giá trị từ 0 đến giới hạn phân đoạn (limit). Nếu địa chỉ luận lí
vượt quá điểm cuối của phân đoạn sẽ xuất hiện trap tới hệ điều hành; nếu ngược lại, độ dời (d)
được cộng thêm giá trị nền của phân đoạn để tạo ra địa chỉ trong bộ nhớ vật lí.

21


Memory Management

Ví dụ về phân đoạn.
Xét ví dụ phân đoạn trên hình sau, chương trình được chia thành 5 phân đoạn đánh số
từ 0 đến 4. Chúng được bố trí vào bộ nhớ vật lí như hình trên. Bảng phân đoạn gồm giới hạn
phân đoạn (limit) và địa chỉ bắt đầu phân đoạn (base). Ví dụ, phân đoạn 4 dài 1000 bytes và bắt
đầu tại vị trí 4700. Địa chỉ (3,55) sẽ ánh xạ tới vị trí 3200 + 55 = 3255; trong đó 3200 là giá trị
nền của phân đoạn 3,55 là độ dời trong phân đoạn. Tham chiếu đến byte 500 của phân đoạn 2
sẽ làm xuất hiện trap tới hệ điều hành, do phân đoạn 2 chỉ dài 400 bytes
3. Bảo vệ và chia sẻ:

Phân đoạn có ưu điểm lớn là bảo vệ được gắn liền với mỗi đoạn. Do phân đoạn biểu
diễn một phần hay một module của chương trình, tất cả các mục của phân đoạn được dùng
chung một mục đích; điều đó dẫn đến một số phân đoạn là dữ liệu, một số phân đoạn khác lại
là chỉ thị. Trong kiến trúc hiện đại, những chỉ thị không chỉnh sửa hay thay đổi chính nó, do đó
22


Memory Management
chúng có thể được thiết lập là chỉ đọc hay chỉ thực thi. Bit bảo vệ được gắn với mỗi mục từ
trong bảng phân đoạn, vì thế khi ánh xạ, các bit ấy sẽ được kiểm tra để chắc chắn rằng không
có truy cập không hợp lệ nào vào bộ nhớ. Do đó, nhiều lỗi của chương trình có thể được phát
hiện sớm trước khi chúng gây ra tác hại lớn.
Ưu điểm khác của phân đoạn là chia sẻ mã hay dữ liệu. Các phân đoạn được chia sẻ khi
các mục từ trong bảng phân đoạn của hai quá trình cùng chỉ đến một vị trí vật lí.

Chia sẻ xảy ra tại cấp phân đoạn. Do đó, bất cứ thông tin nào cũng có thể được chia sẻ
nếu nó được định nghĩa là một phân đoạn. Một số phân đoạn có thể được chia sẻ vì thế một
chương trình được hình thành từ nhiều phân đoạn có thể được chia sẻ. Ví dụ: một chương trình
soạn thảo văn bản được xây dựng từ nhiều phân đoạn được chia sẻ giữa nhiều người dùng.
Giới hạn địa chỉ vật lí phải hỗ trợ nhiều tác vụ soạn thảo văn bản. Thay vì dùng n bản sao của
trình soạn thảo văn bản, hệ thống chỉ cần một bản sao. Các phân đoạn riêng lưu trữ những biến
cục bộ của người dùng sẽ không được chia sẻ.
• Kỹ thuật phân đoạn thỏa mãn được nhu cầu thể hiện cấu trúc logic của chương trình
nhưng nó dẫn đến tình huống phải cấp phát các khối nhớ có kích thước khác nhau cho
các phân đoạn trong bộ nhớ vật lý. Điều này làm rắc rối vấn đề hơn rất nhiều so với
việc cấp phát các trang có kích thước tĩnh. Một giải pháp dung hoà là kết hợp cả hai kỹ
thuật phân trang và phân đoạn : chúng ta tiến hành phân trang các phân đoạn.
XII.3. Phân trang kết hợp phân đoạn (Segmentation with Paging)
Do từng phương pháp phân trang và phân đoạn đều có những nhược điểm riêng, người
ta phải tìm ra một giải pháp tốt hơn cho việc quản lí và ánh xạ địa chỉ luận lí sang địa chỉ vật lí.

Từ đó, giải pháp phân đoạn với phân trang đã ra đời.
1. Segmentation with paging có những đặc điểm gì?
a) Khai thác những đặc điểm có lợi của phân trang
- Không bị phân mảnh ngoại
- Định vị nhanh hơn
b) Khai thác những đặc điểm có lợi của phân đoạn
- Chia sẻ
- Bảo vệ
c) Chi phí thực hiện thấp
23


Memory Management
d) Tồn tại nhiều biến đổi
2. Cơ chế:
Trong hệ thống phân đoạn với phân trang, không gian địa chỉ được chia thành số lượng
đoạn tùy thích theo ý ngưới lập trình. Mỗi đoạn lại được phân thành một số lượng trang đồng
kích thước (bằng với kích cỡ frame của bộ nhớ chính). Có trường hợp mỗi đoạn lại có kích
thước ngắn hơn một trang, lúc ấy đoạn đó xem như chỉ chiếm giữ 1 trang. Từ góc nhìn của
người lập trình, một địa chỉ luận lí vẫn gồm chỉ số đoạn (segment number) và độ dời tương đối
trong đoạn (segment offset). Từ góc nhìn của hệ thống, địa chỉ tương đối trong mỗi đoạn gồm
chỉ số trang (page number) và độ dời tương đối trong trang (page offset) ở mỗi đoạn tương
ứng.

Process nào cũng có bảng phân đoạn và số bảng trang (mỗi đoạn có một bảng trang).
Khi process chạy, thanh ghi giữ địa chỉ bắt đầu của bảng phân đoạn. Sau khi nhận một địa chỉ
ảo, bộ xử lí sẽ dùng chỉ số phân đoạn để dò trong bảng phân đoạn và tìm đến bảng phân trang
cho đoạn đó. Sau đó, chỉ số trang trong địa chỉ ảo sẽ được dùng để dò đến bảng trang rồi tìm ra
chỉ số frame ở bộ nhớ vật lí.
Mỗi mục của bảng phân đoạn chứa kích thước của từng đoạn. Trong các mục cũng

chứa một vùng cơ sở, vùng ấy trỏ đến một bảng trang. Những present bit (cho biết là mục
trong bảng trang có được sử dụng để dịch địa chỉ hay không) và modified bit (cho biết nếu có
thay đổi gì đó ở trang từ khi nó được nạp vào bộ nhớ) không cần thiết nữa vì chúng sẽ được
giải quyết ở cấp độ trang. Những bit điều khiển khác có thể được sử dụng cho mục đích chia sẻ
và bảo vệ. Mỗi mục trong bảng trang về căn bản thì tương tự như hệ thống phân trang. Mỗi chỉ
số trang được ánh xạ đến một chỉ số frame khi trang được đưa vào bộ nhớ chính.

XIII. Tóm tắt – Kết luận

Các giải thuật quản lý bộ nhớ cho hệ điều hành đa chương trải dài từ tiếp cận hệ thống
người dùng đơn tới phân đoạn được phân trang. Yếu tố quyết định lớn nhất của phương pháp
được dùng trong hệ thống cụ thể là phần cứng được cải thiện. Mỗi địa chỉ bộ nhớ được tạo ra
bởi CPU phải được kiểm tra hợp lệ và có thể được ánh xạ tới một địa chỉ vật lý. Kiểm tra

24


Memory Management
không thể được cài đặt (hữu hiệu) bằng phần mềm. Do đó, chúng ta bị ràng buộc bởi tính sẵn
dùng phần cứng.
Các giải thụât quản lý bộ nhớ được thảo luận (cấp phát liên tục, phân trang, phân đoạn,
và sự kết hợp của phân trang và phân đoạn) khác nhau trong nhiều khía cạnh. Trong so sánh
các chiến lược quản lý bộ nhớ, chúng ta nên sử dụng các xem xét sau:
 Hỗ trợ phần cứng: thanh ghi nền hay cặp thanh ghi nền và thanh ghi giới hạn là đủ cho cơ
chế phân khu đơn và đa, ngược lại phân trang và phân đoạn cần bảng ánh xạ để xác định
ánh xạ địa chỉ.
 Năng lực: khi giải thuật quản lý bộ nhớ trở nên phức tạp hơn thì thời gian được yêu cầu để
ánh xạ địa chỉ luận lý tới địa chỉ vật lý tăng. Đối với các hệ thống đơn giản, chúng ta chỉ
cần so sánh hay cộng địa chỉ luận lý - các thao tác này phải nhanh. Phân trang và phân
đoạn có thể nhanh như nếu bảng được cài đặt trong các thanh ghi nhanh. Tuy nhiên, nếu

bảng ở trong bộ nhớ thì về thực chất truy xuất bộ nhớ của người dùng có thể bị giảm. Một
TLB có thể hạn chế việc giảm năng lực tới mức có thể chấp nhận.
 Phân mảnh: một hệ thống đa chương sẽ thực hiện hiệu quả hơn nếu nó có cấp độ đa
chương cao hơn. Đối với một tập hợp quá trình được cho, chúng ta có thể tăng cấp độ đa
chương chỉ bằng cách đóng gói nhiều quá trình hơn trong bộ nhớ. Để hoàn thành tác vụ
này, chúng ta phải giảm sự lãng phí hay phân mảnh bộ nhớ. Các hệ thống với các đơn vị
cấp phát có kích thước cố định, như cơ chế đơn phân khu và phân trang, gặp phải sự phân
mảnh trong. Các hệ thống với đơn vị cấp phát có kích thước thay đổi như cơ chế đa phân
khu và phân đoạn, gặp phải sự phân mảnh ngoài.
 Tái định vị: một giải pháp cho vấn đề phân mảnh ngoài là cô đặc, có liên quan đến việc
chuyển dịch một chương trình trong bộ nhớ không chú ý những thay đổi của chương trình.
Xem xét này yêu cầu địa chỉ luận lý được tái định vị động tại thời điểm thực thi. Nếu địa
chỉ được tái định vị tại thời điểm nạp, chúng ta không thể lưu trữ dạng cô đặc.
 Hoán vị: bất cứ giải thuật có thể có hoán vị được thêm tới nó. Tại những khoảng thời gian
được xác định bởi hệ điều hành, thường được mô tả bởi các chính xác định thời, các quá
trình được chép từ bộ nhớ chính tới vùng lưu trữ phụ và sau đó được chép trở lại tới bộ nhớ
chính. Cơ chế này cho phép nhiều quá trình được chạy hơn là có thể đặt vào bộ nhớ tại
cùng một thời điểm.
 Chia sẻ: một phương tiện khác để gia tăng cấp độ đa chương là chia sẻ mã và dữ liệu giữa
các người dùng khác nhau. Thường việc chia sẻ yêu cầu phân trang hay phân đoạn được
dùng, để cung cấp những gói thông tin nhỏ (các trang hay các đoạn) có thể được chia sẻ.
Chia sẻ là một phương tiện chạy nhiều quá trình với lượng bộ nhớ giới hạn nhưng các
chương trình và dữ liệu được chia sẻ phải được thiết kế cẩn thận.
 Bảo vệ: nếu phân trang hay phân đoạn được cung cấp, các phần khác nhau của chương
trình người dùng có thể được khai báo chỉ thực thi, chỉ đọc, hay đọc-viết. Sự hạn chế này là
cần thiết với mã và dữ liệu được chia sẻ và thường có ích trong bất cứ trường hợp nào để
cung cấp việc kiểm tra tại thời gian thực thi cho các lỗi lập trình thông thường.
C. TÀI LIỆU THAM KHẢO
[1] [Jean Bacon & Tim Harris], Operating Systems, Addison-Wesley, 2003.
[2] [Nguyễn Hoàng Việt], Bài giảng Hệ Điều Hành, Khoa CNTT-ĐH Cần Thơ, 1998

[3] [Silberschatz, Galvin, Gagne], Operating System Concepts, John Wiley & Sons, 2003
[4] [Lê Khắc Nhiên Ân, Hoàng Kiếm], Giáo trình Nhập môn hệ điều hành, Đại học Khoa học
Tự nhiên, 2003.
[5] [Trần Hạnh Nhi, Hoàng Kiếm], Giáo trình hệ điều hành nâng cao, Đại học Khoa học Tự
nhiên,1999.

25


×