CHƯƠNG 3 : QUẢN LÝ BỘ NHỚ
3.5. PHÂN ĐOẠN BỘ NHỚ
Trong phần này, ta sẽ xem xét một kỹ thuật cấp phát bộ nhớ khác, trong đó mỗi tiến trình được cấp phát những vùng nhớ không nhất thiết nằm liền nhau.
3.5.1 Khái niệm
Mỗi chương trình bao gồm một số thành phần có ý nghĩa khác nhau: dữ liệu, lệnh, hàm, ngăn xếp.v.v. , Tuy nhiên, khi phân trang, chương trình được chia thành các trang kích thước đều nhau, không quan tâm đến tổ chức lôgic và ý nghĩa các thành phần. Bộ nhớ được coi như một khối duy nhất các byte hoặc các từ.
Một cách tổ chức khác cho phép tính tới tổ chức lơgic của chương trình là phân đoạn
(segmentation). Chương trình được chia thành những phần kích thước khác nhau gọi là đoạn
(segment) tuỳ theo ý nghĩa của chúng. Chẳng hạn, ta có thể phân biệt:
- Đoạn chương trình, chứa mã tồn bộ chương trình, hay một số hàm hoặc thủ tục của chương trình.
- Đoạn dữ liệu, chứa các biến toàn cục, các mảng.
- Đoạn ngăn xếp, chứa ngăn xếp của tiến trình trong q trình thực hiện.
Khơng gian địa chỉ lơgic của tiến trình khi đó sẽ gồm tập hợp các đoạn. Mỗi đoạn tương ứng với không gian địa chỉ riêng, được phân biệt bởi tên và độ dài của mình. Ngồi cách dùng tên, đoạn cũng có thể được đánh số để phân biệt. Mỗi địa chỉ lơgic do CPU sinh ra khi đó sẽ gồm hai phần: số thứ tự của đoạn và độ dịch trong đoạn.
Việc chia chương trình thành các đoạn có thể do người lập trình thực hiện, chẳng hạn khi lập trình bằng assembly, hoặc do chương trình dịch tự của ngơn ngữ bậc cao tự động chia. Người lập trình khi đó cần biết kích thước tối đa được phép của đoạn, ví dụ để khơng khai báo mảng vượt kích thước tối đa này.
Phân đoạn bộ nhớ giống với phân chương động ở chỗ bộ nhớ được cấp phát theo từng vùng kích thước thay đổi. Tuy nhiên, khác với phân chương động, mỗi chương trình có thể chiếm những đoạn bộ nhớ không nằm liền kề nhau. Mỗi khi có yêu cầu cấp phát bộ nhớ cho các đoạn, thuật toán cấp phát first-fit hoặc best-fit như phân chương động sẽ được sử dụng.
Cũng như phân chương động, phân đoạn không sinh phân mảnh trong nhưng lại tạo phân mảnh ngồi. Mức độ phân mảnh ngồi phụ thuộc vào kích thước trung bình của đoạn. Đoạn càng nhỏ thì phân mảnh ngồi càng giảm. Trường hợp đặc biệt, nếu kích thước đoạn là một byte hay một từ tức là bằng đơn vị thông tin nhỏ nhất được đánh địa chỉ của bộ nhớ thì sẽ hồn tồn khơng có phân mảnh ngồi. Tuy nhiên, số lượng đoạn tăng làm tăng kích thước của bảng phân đoạn và tăng thời gian quản lý các đoạn. Kích thước đoạn thường phụ thuộc kích thước bộ nhớ. Bộ nhớ càng lớn thì kích thước đoạn cũng được chọn càng lớn. Nhìn chung, phân mảnh ngoài khi phân đoạn nhỏ hơn phân chương động do tiến trình đã được chia thành các đoạn kích thước nhỏ hơn.
3.5.2. Ánh xạ địa chỉ và chống truy cập trái phép
Địa chỉ. Khi sử dụng phân đoạn, không gian nhớ lô gic sẽ bao gồm không gian nhớ của
các đoạn. Do vậy, địa chỉ lô gic bao gồm hai thành phần, chỉ rõ hai thông tin: địa chỉ thuộc đoạn nào, và độ dịch từ đầu đoạn là bao nhiêu. Hai thông tin này cần được người lập trình cung cấp rõ ràng, khác với trường hợp phân trang, trong đó tiến trình cung cấp duy nhất một địa chỉ và phần cứng có nhiệm vụ tách địa chỉ này thành số trang và độ dịch.
Đối với đoạn được đánh số, địa chỉ lơ gic sẽ có hai thành phần, được cấu trúc như sau:
< số thứ tự đoạn (s), độ dịch trong đoạn (o) >
Đối với trường hợp chương trình viết trên ngơn ngữ bậc cao, địa chỉ lô gic với hai thành phần như vậy được chương trình dịch sinh ra trong quá trình dịch để thể hiện cấu trúc và ý nghĩa các đoạn của chương trình nguồn.
Ánh xạ địa chỉ. Địa chỉ lô gic cần phải được biến đổi thành địa chỉ vật lý để xác định ô
nhớ cụ thể của máy tính. Tương tự như trong trường hợp phân trang, việc ánh xạ được thực hiện dựa trên bảng đoạn(segment table). Mỗi ô của bảng đoạn chứa địa chỉ cơ sở và giới hạn của đoạn. Địa chỉ cơ sở là vị trí bắt đầu của đoạn trong bộ nhớ máy tính, cịn giới hạn đoạn chính là độ dài đoạn và sẽ được sử dụng để chống truy cập trái phép ra ngồi đoạn. Mỗi tiến trình có một bảng như vậy.
Bảng đoạn được sử dụng kết hợp với một cơ chế phần cứng cho phép biến đổi từ địa chỉ lô gic sang địa chỉ tuyệt đốinhư minh họa trên hình 3.14. Trước hết, phần s trong địa chỉ được sử dụng để tìm tới ơ thứ s trong bảng đoạn và truy cập hai giá trị giới hạn và cơ sở chứa
trong ô này. Tiếp theo, phần độ dịch o của địa chỉ được so sánh với phần giới hạn chứa trong ô. Nếu o nhỏ hơn giới hạn thì đây là truy cập hợp lệ, ngược lại nếu o lớn hơn hoặc bằng giới hạn thì địa chỉ này vượt ra ngoài phạm vi của đoạn và do vậy sẽ bị báo lỗi truy cập. Trong trường hợp truy cập hợp lệ, phần độ dịch o được cộng với địa chỉ cơ sở để tạo ra địa chỉ vật lý. CPU s o Bộ nhớ vật lý s Bảng đoạn Giới hạn Cơ sở < Đúng + Lỗi địa chỉ Sai
Hình 3.14. Cơ chế ánh xạ địa chỉ khi phân đoạn
Việc chống truy cập trái phép được thực hiện nhờ các bit bảo vệ chứa trong khoản mục
của bảng phân đoạn. Các đoạn được gắn bit bảo vệ dựa theo ý nghĩa của đoạn đó. Chẳng hạn, các đoạn chứa lệnh sẽ khơng cho phép ghi mà chỉ cho phép đọc. Trong trường hợp hai hoặc nhiều tiến trình có chung một đoạn thì các bảng đoạn của các tiến trình này sẽ có một ô với giá trị giới hạn và cơ sở giống nhau, tức là trỏ vào cùng một vùng bộ nhớ vật lý.
3.5.3. Kết hợp phân đoạn với phân trang
Để kết hợp các ưu điểm của phân doạn với các ưu điểm của phân trang, các hệ thống tính tốn hiện đại thường kết hợp cả hai phương pháp tổ chức bộ nhớ này. Tiến trình bao gồm nhiều đoạn. Mỗi đoạn lại được phân trang. Như vậy mỗi tiến trình có một bảng phân đoạn riêng và mỗi đoạn lại có bảng phân trang riêng của mình.
+ Độ dài đoạn Cơ sở bảng trang d
p o f d’ ≥ s d Địa chỉ bắt đầu bảng đoạn đúng sai lỗi f + Bảng đoạn Bộ nhớ Địa chỉ vật lý
Bảng trang cho đoạn
Hình 3.15. Ánh xạ địa chỉ kết hợp phân đoạn với phân trang
Để định vị ô nhớ trong phương pháp này, địa chỉ phải gồm ba phần (s,p,o). Phần thứ nhất s là số thứ tự đoạn. s cho phép xác định khoản mục ứng với đoạn trong bảng chia đoạn. Khoản mục chứa con trỏ tới bảng chia trang cho đoạn đó. Số thứ tự trang p cho phép xác định khung trang tương ứng. Độ dịch o sẽ được cộng vào địa chỉ khung để tính ra địa chỉ vật lý.