Hình 1: Xử lý nhiều bước của chương trình người dùngVề 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ựchiện tại bất cứ bước nào theo cách sau đây: Thời gian
Quản lý thiết bị lưu trữ hệ điều hành
Kiến thức chung
Một chương trình thường được lưu trữ trên đĩa dưới dạng tập tin thực thi nhị phân Khi được đưa vào bộ nhớ, chương trình sẽ được khởi tạo trong một quá trình để thực thi Tùy thuộc vào cách quản lý bộ nhớ, quá trình này có thể di chuyển giữa đĩa và bộ nhớ trong suốt quá trình thực thi Các quá trình đang chờ trên đĩa để được đưa vào bộ nhớ sẽ tạo thành một hàng đợi nhập.
Quy trình thông thường bắt đầu bằng việc chọn một trong những tác vụ trong hàng đợi nhập, sau đó nạp quá trình đó vào bộ nhớ Khi quá trình được thực thi, nó sẽ truy xuất các chỉ thị và dữ liệu từ bộ nhớ Cuối cùng, khi quá trình kết thúc, không gian bộ nhớ của nó sẽ được đánh dấu là trống.
Hầu hết các hệ thống cho phép người dùng truy cập vào bất kỳ vị trí nào trong bộ nhớ vật lý Điều này có nghĩa là không gian địa chỉ của máy tính có thể bắt đầu từ bất kỳ điểm nào.
Địa chỉ đầu tiên trong quá trình thực thi của người dùng không nhất thiết phải là địa chỉ khởi đầu Sắp xếp này ảnh hưởng đến cách mà chương trình người dùng sử dụng địa chỉ Thông thường, một chương trình sẽ trải qua nhiều bước, trong đó một số bước có thể là tùy chọn, trước khi được thực thi Các địa chỉ trong chương trình nguồn thường được biểu diễn dưới dạng danh biểu Trình biên dịch sẽ liên kết các danh biểu này với các địa chỉ có thể tái định vị, ví dụ như 14 bytes từ vị trí bắt đầu của module Bộ soạn thảo liên kết hoặc bộ nạp sẽ chuyển đổi các địa chỉ có thể tái định vị thành địa chỉ tuyệt đối, chẳng hạn như 74014 Mỗi quá trình liên kết là một ánh xạ giữa các không gian địa chỉ khác nhau.
Hình 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 ảnh hưởng đến việc phát sinh mã tuyệt đối, đặc biệt khi biết vị trí của quá trình trong bộ nhớ Nếu quá trình người dùng nằm tại vị trí R, mã trình biên dịch sẽ bắt đầu từ đó và mở rộng Tuy nhiên, nếu vị trí này thay đổi sau đó, mã cần được biên dịch lại Các chương trình định dạng COM của MS-DOS là ví dụ điển hình cho mã tuyệt đối giới hạn tại thời điểm biên dịch.
Khi biên dịch, nếu chưa xác định được vị trí trong bộ nhớ, trình biên dịch sẽ tạo mã có thể tái định vị Điều này dẫn đến việc trì hoãn liên kết cuối cùng cho đến khi nạp mã Nếu địa chỉ bắt đầu thay đổi, chỉ cần nạp lại mã người dùng để cập nhật giá trị thay đổi.
Thời gian thực thi là yếu tố quan trọng trong quá trình di chuyển giữa các phân đoạn bộ nhớ, nơi việc liên kết phải được trì hoãn cho đến khi chạy Để thực hiện cơ chế này, cần có phần cứng đặc biệt Hầu hết các hệ điều hành hiện nay áp dụng phương pháp này Chương này sẽ tập trung vào việc trình bày các loại liên kết khác nhau có thể được cài đặt hiệu quả trong hệ thống máy tính và thảo luận về sự hỗ trợ phần cứng tương ứng.
1.1.2 Không gian địa chỉ luận lý và không gian địa chỉ vật lý
Địa chỉ luận lý (logical address) là địa chỉ được tạo ra bởi CPU, trong khi địa chỉ vật lý (physical address) là địa chỉ mà đơn vị bộ nhớ nhận diện, được nạp vào thanh ghi địa chỉ bộ nhớ.
Các phương pháp liên kết địa chỉ tại thời điểm biên dịch và 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 biệt giữa địa chỉ luận lý (hay còn gọi là địa chỉ ảo) và địa chỉ vật lý Tập hợp tất cả địa chỉ luận lý do chương trình tạo ra được gọi là không gian địa chỉ luận lý, trong khi tập hợp tất cả địa chỉ vật lý tương ứng là không gian địa chỉ vật lý Do đó, không gian địa chỉ luận lý và không gian địa chỉ vật lý là hai khái niệm khác nhau trong cơ chế liên kết địa chỉ tại thời điểm thực thi.
Bộ quản lý bộ nhớ (MMU) là thiết bị phần cứng thực hiện ánh xạ từ địa chỉ ảo sang địa chỉ vật lý tại thời điểm thực thi Có nhiều phương pháp khác nhau để thực hiện quá trình ánh xạ này.
Hình 2: Memory management unit (MMU).
Phương pháp này cần hỗ trợ phần cứng, trong đó thanh ghi nền được gọi là thanh ghi tái định vị Giá trị trong thanh ghi này sẽ được cộng vào mỗi địa chỉ do người dùng tạo ra khi gửi tới bộ nhớ Ví dụ, địa chỉ được tự động tái định vị tới vị trí 14000; khi truy xuất địa chỉ 346, nó sẽ được ánh xạ tới vị trí 14346.
Hình 3: Định vị tự động dùng thanh ghi tái định vị
Trong quá trình thảo luận gần đây, chúng ta đã đề cập đến việc toàn bộ chương trình và dữ liệu cần phải được lưu trữ trong bộ nhớ vật lý để thực thi Kích thước của quá trình bị giới hạn bởi dung lượng bộ nhớ vật lý Để tối ưu hóa việc sử dụng bộ nhớ, nạp động (dynamic loading) là một giải pháp hiệu quả Với nạp động, một thủ tục chỉ được nạp khi nó được gọi, và tất cả các thủ tục được lưu trữ trên đĩa dưới dạng có thể tái định vị Chương trình chính được nạp vào bộ nhớ và thực thi Khi một thủ tục cần gọi một thủ tục khác, nó sẽ kiểm tra xem thủ tục đó đã được nạp hay chưa; nếu chưa, bộ nạp liên kết sẽ được gọi để nạp thủ tục vào bộ nhớ và cập nhật bảng địa chỉ của chương trình Sau đó, điều khiển được chuyển đến thủ tục mới được nạp.
Nạp động mang lại lợi ích lớn vì chỉ những thủ tục cần thiết mới được nạp vào bộ nhớ, giúp tiết kiệm tài nguyên Phương pháp này rất hữu ích khi quản lý mã cho các tình huống hiếm gặp, như các thủ tục xử lý lỗi Mặc dù kích thước tổng thể của chương trình có thể lớn, nhưng phần mã thực sự được nạp sẽ nhỏ hơn nhiều.
Nạp động không cần sự hỗ trợ đặc biệt từ hệ điều hành, và người dùng cần thiết kế chương trình của mình để tận dụng điều này Tuy nhiên, hệ điều hành có thể hỗ trợ lập trình viên bằng cách cung cấp các thủ tục thư viện giúp cài đặt nạp tự động hiệu quả.
1.1.4 Liên kết động và các thư viện được chia sẻ
Một số hệ điều hành chỉ hỗ trợ liên kết tĩnh, trong đó thư viện ngôn ngữ hệ thống được xử lý như các module đối tượng và được kết hợp vào hình ảnh chương trình nhị phân Liên kết động, tương tự như nạp động, cho phép trì hoãn việc nạp thư viện cho đến khi thực thi Điều này giúp tiết kiệm không gian đĩa và bộ nhớ, vì không cần mỗi chương trình có một bản sao thư viện Với liên kết động, một đoạn mã gọi là stub giúp định vị chương trình con trong thư viện và nạp nó vào bộ nhớ khi cần Khi stub được thực thi, nó kiểm tra xem chương trình con đã có trong bộ nhớ chưa; nếu chưa, nó sẽ nạp chương trình con vào bộ nhớ và thay thế chính nó bằng địa chỉ của chương trình con để thực thi Nhờ cơ chế này, tất cả các quá trình sử dụng một thư viện ngôn ngữ chỉ cần thực thi một bản sao duy nhất của mã thư viện.
Cấp phát bộ nhớ liên tục
Bộ nhớ chính cần phục vụ cho hệ điều hành và các tiến trình người dùng khác nhau, vì vậy việc cấp phát bộ nhớ một cách hiệu quả là rất quan trọng Trong phần này, chúng tôi sẽ giải thích phương pháp phổ biến là cấp phát bộ nhớ liên tục.
Bộ nhớ thường được chia thành hai phân khu: một cho hệ điều hành và một cho các quá trình người dùng Hệ điều hành có thể được đặt ở bộ nhớ cao hoặc thấp, nhưng vị trí của vector ngắt, thường nằm trong bộ nhớ thấp, là yếu tố quyết định chính Do đó, trong giáo trình này, chúng ta sẽ chỉ thảo luận về trường hợp hệ điều hành được định vị trong bộ nhớ thấp, trong khi phát triển trường hợp khác sẽ tương tự.
Chúng ta thường có nhu cầu giữ nhiều quá trình người dùng trong bộ nhớ đồng thời Vì vậy, cần xem xét cách phân bổ bộ nhớ trống cho các quá trình đang chờ trong hàng đợi nhập Trong phương pháp cấp phát bộ nhớ liên tục, mỗi quá trình sẽ được lưu trữ trong một khối bộ nhớ liên tục.
Trước khi xem xét việc cấp phát bộ nhớ, cần thảo luận về vấn đề bảo vệ bộ nhớ, bao gồm bảo vệ hệ điều hành khỏi các quá trình người dùng và bảo vệ các quá trình lẫn nhau Để đảm bảo an toàn cho bộ nhớ, chúng ta có thể sử dụng thanh ghi tái định vị.
Thanh ghi tái định vị chứa giá trị địa chỉ vật lý tối thiểu, trong khi thanh ghi giới hạn lưu trữ dãy các địa chỉ luận lý Ví dụ, nếu thanh ghi tái định vị là 100040 và thanh ghi giới hạn là 74600, thì mỗi địa chỉ luận lý phải nhỏ hơn giá trị trong thanh ghi giới hạn MMU thực hiện việc ánh xạ địa chỉ luận lý động bằng cách cộng giá trị trong thanh ghi tái định vị, và địa chỉ đã được tái định vị này sẽ được gửi tới bộ nhớ.
Hình 5: Hỗ trợ phần cứng cho các thanh ghi tái định vị và các giới hạn
Khi bộ định thời CPU lựa chọn một quá trình để thực thi, bộ phân phát sẽ nạp thanh ghi tái định vị và giới hạn với các giá trị chính xác, điều này diễn ra trong quá trình chuyển đổi ngữ cảnh.
CPU kiểm tra mọi địa chỉ phát sinh dựa trên các thanh ghi, giúp bảo vệ hệ điều hành cùng với các chương trình và dữ liệu người dùng khỏi sự sửa đổi bởi các quá trình đang chạy.
Cơ chế sử dụng thanh ghi tái định vị cho phép hệ điều hành thay đổi kích thước một cách linh hoạt, điều này rất hữu ích trong nhiều tình huống Chẳng hạn, khi một trình điều khiển thiết bị không được sử dụng thường xuyên, việc giữ mã và dữ liệu của nó trong bộ nhớ là không cần thiết, và không gian này có thể được sử dụng cho các mục đích khác Những mã này, được gọi là mã hệ điều hành tạm thời, có thể được nạp và giải phóng theo yêu cầu, giúp hệ điều hành điều chỉnh kích thước trong quá trình thực thi chương trình.
Phân mãnh bộ nhớ có thể được chia thành hai loại: phân mãnh trong và phân mãnh ngoài Khi có một lỗ trống kích thước 18,464 bytes và quá trình tiếp theo yêu cầu 18,462 bytes, việc cấp phát chính xác khối yêu cầu sẽ để lại lỗ trống 2 bytes Chi phí quản lý lỗ trống này thường cao hơn giá trị của nó Phương pháp truyền thống là chia bộ nhớ vật lý thành các khối kích thước cố định và cấp phát bộ nhớ theo đơn vị kích thước khối Với cách tiếp cận này, bộ nhớ cấp phát cho một quá trình có thể lớn hơn một chút so với khối yêu cầu, dẫn đến sự lãng phí bộ nhớ, gọi là phân mãnh trong.
Một giải pháp cho vấn đề phân mãnh ngoài là kết lại thành khối (compaction), nhằm di chuyển nội dung bộ nhớ để gom tất cả bộ nhớ trống thành một khối lớn Tuy nhiên, kết khối không phải lúc nào cũng khả thi; nếu tái định vị là tĩnh và diễn ra trong quá trình hợp dịch và nạp, việc kết khối sẽ không thể thực hiện Kết khối chỉ khả thi khi tái định vị là động và xảy ra trong thời gian thực thi Khi tái định vị động, chỉ cần di chuyển chương trình và dữ liệu, sau đó cập nhật các thanh ghi nền để phản ánh địa chỉ mới Khi kết khối khả thi, cần xác định chi phí của nó; thuật toán kết khối đơn giản nhất là di chuyển tất cả quá trình về cuối bộ nhớ, trong khi các lỗ trống di chuyển ngược lại, tạo ra một lỗ trống lớn cho bộ nhớ sẵn có Tuy nhiên, cơ chế này có thể tốn kém.
Một giải pháp hiệu quả cho vấn đề phân mãnh ngoài là cho phép không gian địa chỉ luận lý của quá trình không liên tục, từ đó giúp quá trình có thể được cấp phát bộ nhớ vật lý ở bất kỳ vị trí nào khi có sẵn Hai kỹ thuật chính để thực hiện giải pháp này là phân trang và phân đoạn.
Phân trang
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 không cần liên tục, giúp tránh vấn đề đặt vừa khít nhóm bộ nhớ có kích thước thay đổi vào vùng lưu trữ phụ Khi mã và dữ liệu được hoán vị ra khỏi bộ nhớ, không gian cần được tìm thấy trên vùng lưu trữ phụ Vấn đề phân mãnh liên quan đến bộ nhớ chính cũng phổ biến như với vùng lưu trữ phụ, nhưng với tốc độ truy xuất thấp hơn, khiến việc kết khối trở nên khó khăn Nhờ những lợi ích vượt trội so với các phương pháp trước, phân trang đã trở thành phương pháp phổ biến trong hầu hết các hệ điều hành hiện nay.
Truyền thống quản lý hỗ trợ phân trang chủ yếu dựa vào phần cứng Gần đây, các thiết kế mới đã tích hợp chặt chẽ phần cứng và hệ điều hành để thực hiện phân trang, đặc biệt là trên các bộ vi xử lý 64-bit.
Hình 6: Phần cứng phân trang
Bộ nhớ vật lý được chia thành các khối cố định gọi là khung (frames), trong khi bộ nhớ luận lý cũng được chia thành các trang (pages) có kích thước tương đương Khi một quá trình được thực thi, các trang của nó sẽ được nạp vào các khung bộ nhớ sẵn có từ vùng lưu trữ phụ Vùng lưu trữ phụ cũng được phân chia thành các khối có kích thước cố định, tương ứng với kích thước của các khung bộ nhớ.
Hỗ trợ phần cứng cho phân trang cho phép mỗi địa chỉ do CPU tạo ra được chia thành hai phần: số trang (p) và độ dời trang (d) Số trang được sử dụng làm chỉ mục vào bảng trang, nơi chứa địa chỉ nền của mỗi trang trong bộ nhớ vật lý Địa chỉ nền này kết hợp với độ dời trang để xác định địa chỉ bộ nhớ vật lý mà dữ liệu được gửi đến đơn vị bộ nhớ.
Kích thước trang (giống như kích thước khung) được định nghĩa bởi phần cứng.
Kích thước trang điển hình thường là luỹ thừa của 2, dao động từ 512 bytes đến 16MB, tùy thuộc vào kiến trúc máy tính Việc chọn kích thước trang là luỹ thừa 2 giúp đơn giản hóa quá trình dịch địa chỉ luận lý thành số trang và độ dời trang Nếu không gian địa chỉ là 2^m và kích thước trang là 2^n đơn vị địa chỉ, thì m-n bits cao của địa chỉ luận lý sẽ xác định chỉ số trang, trong khi n bits thấp sẽ chỉ độ dời trang.
Do đó, địa chỉ luận lý như sau: page number page offset p d m -n n ở đây p là chỉ mục trong bảng trang và d là độ dời trong trang
Hình 7: Mô hình phân trang của bộ nhớ luận lý và vật lý
Bộ nhớ trong được trình bày trong hình 7 với kích thước trang 4 bytes và bộ nhớ vật lý 32 bytes (gồm 8 trang) cho thấy cách ánh xạ bộ nhớ của người dùng tới bộ nhớ vật lý Địa chỉ luận lý 0 tương ứng với trang 0 và độ dời 0, được chỉ mục trong bảng trang cho thấy trang 0 nằm trong khung 5 Do đó, địa chỉ luận lý 0 ánh xạ tới địa chỉ vật lý 20 Tương tự, địa chỉ luận lý 3 (trang 0, độ dời 3) ánh xạ tới địa chỉ vật lý 23 Địa chỉ luận lý 4 thuộc trang 1 với độ dời 0, và theo bảng trang, trang 1 được ánh xạ tới khung 6, dẫn đến địa chỉ luận lý 4 ánh xạ tới địa chỉ 24 Cuối cùng, địa chỉ luận lý 13 ánh xạ tới địa chỉ vật lý 9.
Phân trang là hình thức tái định vị động, trong đó mỗi địa chỉ luận lý được ánh xạ tới địa chỉ vật lý thông qua phần cứng phân trang Việc sử dụng phân trang tương tự như việc sử dụng một bảng các thanh ghi nền, với mỗi thanh ghi đại diện cho một khung bộ nhớ.
Khi sử dụng cơ chế phân trang, không có phân mãnh bên ngoài, cho phép cấp phát khung trống cho các quá trình cần thiết Tuy nhiên, có thể xảy ra tình huống phân mãnh bên trong Các khung được cấp phát như những đơn vị riêng lẻ, và nếu yêu cầu bộ nhớ của một quá trình không nằm trọn trong giới hạn của trang, khung cuối cùng có thể không được sử dụng hoàn toàn Ví dụ, với kích thước trang là 2048 bytes, một quá trình có kích thước 72,766 bytes sẽ cần 35 trang.
Khi một quá trình yêu cầu n trang cộng thêm 1 byte, nó sẽ được cấp phát n+1 khung, dẫn đến phân mãnh trong gần như toàn bộ khung, với kích thước phân mãnh trong là 962 bytes Nếu kích thước quá trình không phụ thuộc vào kích thước trang, thì phân mãnh trung bình mong muốn là ẵ trang trên mỗi quá trình, điều này cho thấy kích thước trang nhỏ là lý tưởng Tuy nhiên, chi phí liên quan đến mỗi mục trong bảng trang giảm khi kích thước trang tăng, làm cho việc nhập/xuất đĩa hiệu quả hơn với lượng dữ liệu lớn hơn Thông thường, kích thước trang đã tăng lên theo thời gian khi các quá trình và dữ liệu trở nên lớn hơn, với các kích thước điển hình hiện nay từ 4 KB đến 8 KB, trong khi một số hệ thống hỗ trợ kích thước lớn hơn Ví dụ, Solaris hỗ trợ kích thước trang 8 KB và 4 MB tùy thuộc vào dữ liệu được lưu trữ Các nhà nghiên cứu hiện đang phát triển hỗ trợ cho nhiều kích thước trang khác nhau.
Mỗi mục từ bảng trang có kích thước cơ bản là 4 bytes, nhưng có thể thay đổi tùy thuộc vào cấu hình Một mục từ 32-bit có khả năng chỉ tới một khung trang vật lý lên đến 2^32.
4 KB, thì hệ thống với những mục từ 4 bytes có thể đánh địa chỉ cho 244 bytes (hay
16 TB) bộ nhớ vật lý.
Khi một quá trình được đưa vào hệ thống để thực thi, kích thước của nó, được thể hiện qua số lượng trang, sẽ được xem xét Mỗi trang của quá trình yêu cầu một khung riêng biệt để hoạt động hiệu quả.
Khi một quá trình yêu cầu n trang, ít nhất n khung bộ nhớ phải có sẵn Nếu có đủ n khung, chúng sẽ được cấp phát cho quá trình mới Trang đầu tiên sẽ được nạp vào một trong các khung đã cấp phát, và số khung này sẽ được ghi vào bảng trang của quá trình Tiếp theo, trang thứ hai sẽ được nạp vào một khung khác, và số khung của nó cũng sẽ được cập nhật vào bảng trang Ví dụ, với n=2 và m=4, bộ nhớ 32-byte và các trang 4-byte.
Hình 8: Thí dụ phân trang cho bộ nhớ 32 bytes với các trang có kích thức 4 bytes
Phân trang đóng vai trò quan trọng trong việc tạo ra sự phân chia rõ ràng giữa tầm nhìn bộ nhớ của người dùng và bộ nhớ vật lý thực tế Người dùng nhìn nhận bộ nhớ như một không gian liên tục chỉ chứa một chương trình, trong khi thực tế, chương trình đó được phân bổ khắp bộ nhớ vật lý và đồng thời quản lý nhiều quá trình khác nhau.
Sự khác biệt giữa tầm nhìn bộ nhớ của người dùng và bộ nhớ vật lý được đảm bảo tương thích thông qua phần cứng dịch địa chỉ, trong đó địa chỉ logic được chuyển đổi thành địa chỉ vật lý Quá trình ánh xạ này được ẩn giấu khỏi người dùng và được quản lý bởi hệ điều hành.
Quá trình người dùng không thể truy cập bộ nhớ mà nó không sở hữu, vì vậy không có cách nào để định địa chỉ bộ nhớ bên ngoài bảng trang của nó Bảng trang chỉ chứa những trang mà quá trình đó sở hữu.
Phân đoạn
Một khía cạnh quan trọng trong quản lý bộ nhớ là sự phân trang, tạo ra sự khác biệt giữa tầm nhìn bộ nhớ của người dùng và bộ nhớ vật lý thực tế Tầm nhìn bộ nhớ của người dùng không giống với bộ nhớ vật lý, mà được ánh xạ vào bộ nhớ vật lý Quá trình ánh xạ này cho phép phân biệt giữa bộ nhớ logic và bộ nhớ vật lý.
Người dùng thường không coi bộ nhớ như một mảng tuyến tính của các byte, mà thay vào đó, họ thích nhìn nhận bộ nhớ như một tập hợp các phân đoạn có kích thước khác nhau Các phân đoạn này không cần phải được sắp xếp theo thứ tự, điều này cho phép người dùng dễ dàng hình dung và quản lý dữ liệu và lệnh trong bộ nhớ.
Khi viết một chương trình, chúng ta hình dung nó như một hệ thống chính bao gồm nhiều chương trình con, thủ tục, hàm và module Các cấu trúc dữ liệu như bảng, mảng, ngăn xếp và biến đóng vai trò quan trọng, với mỗi module hoặc thành phần dữ liệu được xác định và truy cập thông qua tên riêng của nó.
Trong lập trình, chúng ta thường sử dụng các thuật ngữ như “bảng danh biểu”, “hàm sqrt” và “chương trình chính” mà không cần quan tâm đến địa chỉ bộ nhớ mà các phần tử này chiếm Thứ tự lưu trữ của bảng danh biểu và hàm sqrt không ảnh hưởng đến chức năng của chúng Mỗi phân đoạn trong chương trình có chiều dài khác nhau, được xác định bởi mục đích sử dụng của nó Các phần tử trong mỗi phân đoạn được xác định dựa trên độ dời từ điểm bắt đầu của phân đoạn, chẳng hạn như lệnh đầu tiên của chương trình hay mục từ thứ mười bảy trong bảng danh biểu.
Hình 17: Tầm nhìn chương trình của người dùng
Phân đoạn là cơ chế quản lý bộ nhớ giúp người dùng có cái nhìn rõ ràng về không gian địa chỉ Không gian địa chỉ logic bao gồm các phân đoạn, mỗi phân đoạn được xác định bởi tên và chiều dài Địa chỉ logic được xác định bằng hai thành phần: tên phân đoạn và độ dời trong phân đoạn Điều này khác với cơ chế phân trang, nơi người dùng chỉ cần chỉ định một địa chỉ đơn và phần cứng sẽ chia thành các trang và độ dời Để đơn giản hóa cài đặt, các phân đoạn được đánh số và tham chiếu bằng số phân đoạn thay vì tên, dẫn đến địa chỉ logic bao gồm một cặp giá trị.
Chương trình người dùng thường được biên dịch, với trình biên dịch tự động tạo ra các phân đoạn phản ánh nội dung của chương trình Ví dụ, một chương trình Pascal có thể tạo ra các phân đoạn riêng biệt.
2) Ngăn xếp gọi thủ tục, để lưu trữ các tham số và trả về các địa chỉ;
3) Phần mã của mỗi thủ tục hay hàm;
4) Các biến cục bộ của mỗi thủ tục và hàm
Một trình biên dịch có khả năng tạo ra các phân đoạn riêng biệt cho từng khối chung, cho phép các mảng được gán cho các phân đoạn riêng Bộ nạp có thể thu thập tất cả các phân đoạn này và gán cho chúng một số phân đoạn cụ thể.
Mặc dù người dùng có thể tham chiếu đến các đối tượng trong chương trình qua địa chỉ hai chiều, bộ nhớ vật lý thực tế là một chuỗi một chiều các byte Để ánh xạ địa chỉ hai chiều do người dùng định nghĩa vào địa chỉ vật lý một chiều, cần phải thiết lập một bảng phân đoạn Mỗi mục trong bảng phân đoạn bao gồm nền phân đoạn (segment base) và giới hạn phân đoạn (segment limit) Nền phân đoạn chứa địa chỉ vật lý bắt đầu, xác định vị trí của phân đoạn trong bộ nhớ, trong khi giới hạn phân đoạn xác định chiều dài của phân đoạn.
Bảng phân đoạn, như hình 18, chứa hai phần trong địa chỉ luận lý: số phân đoạn s và độ dời d Số phân đoạn đóng vai trò chỉ mục trong bảng, trong khi độ dời d phải nằm trong khoảng từ 0 đến giới hạn của đoạn Nếu độ dời vượt quá giới hạn, hệ thống sẽ gặp lỗi và chuyển đến hệ điều hành Khi độ dời hợp lệ, nó sẽ được cộng với giá trị nền của phân đoạn để tạo ra địa chỉ vật lý của byte cần truy cập Vì vậy, bảng phân đoạn thực chất là một mảng chứa các cặp thanh ghi nền và giới hạn.
Hình 18: Phần cứng phân đoạn
Xét trường hợp như hình 19 Chúng ta có năm phân đoạn được đánh số từ 0 đến
4 Các phân đoạn được lưu trong bộ nhớ vật lý như được hiển thị Bảng phân đoạn có một mục từ riêng cho mỗi phân đoạn, cho địa chỉ bắt đầu của phân đoạn trong bộ nhớ vật lý (hay nền) và chiều dài của phân đoạn đó (hay giới hạn) Thí dụ, phân đoạn 2 dài
Một tham chiếu byte 53 của phân đoạn 2 được ánh xạ tới vị trí 4353, trong khi tham chiếu tới byte 852 của phân đoạn 3 được ánh xạ tới vị trí 3200 cộng với 852 Ngoài ra, tham chiếu byte 1222 của phân đoạn 0 dẫn đến một trap tới hệ điều hành do phân đoạn này chỉ dài 1000 bytes.
Hình 19: Thí dụ về phân đoạn
1.4.3 Bảo vệ và chia sẻ
Phân đoạn trong kiến trúc máy tính có vai trò quan trọng trong việc bảo vệ bộ nhớ, với các phân đoạn được phân loại thành chỉ thị và dữ liệu Các chỉ thị không tự hiệu chỉnh, cho phép phân đoạn chỉ đọc hoặc chỉ thực thi Phần cứng ánh xạ bộ nhớ kiểm tra các bits bảo vệ liên quan đến từng mục từ trong bảng phân đoạn, ngăn chặn các truy xuất không hợp lệ như việc ghi vào phân đoạn chỉ đọc Khi thay thế một mảng trong phân đoạn, phần cứng quản lý bộ nhớ tự động xác minh tính hợp lệ của các chỉ số, giúp phát hiện nhiều lỗi chương trình trước khi gây ra hậu quả nghiêm trọng.
Một lợi ích quan trọng của việc chia sẻ mã và dữ liệu là mỗi quá trình có bảng phân đoạn riêng, giúp bộ phân phát xác định phân đoạn phần cứng khi cấp CPU Sự chia sẻ này xảy ra khi các mục trong bảng phân đoạn của hai quá trình khác nhau trỏ tới cùng một vị trí vật lý.
Hình 20: Chia sẻ các phân đoạn trong một hệ thống bộ nhớ được phân đoạn
Chia sẻ thông tin diễn ra ở cấp độ phân đoạn, nghĩa là bất kỳ thông tin nào được xác định là một phân đoạn đều có thể được chia sẻ Một số phân đoạn có khả năng chia sẻ, vì vậy một chương trình được cấu thành từ nhiều phân đoạn cũng có thể được chia sẻ.
Trong hệ thống chia thời, việc sử dụng một trình soạn thảo văn bản hoàn chỉnh có thể rất lớn và được tạo thành từ nhiều phân đoạn có thể chia sẻ giữa tất cả người dùng Thay vì cần nhiều bản sao của trình soạn thảo, chỉ cần một bản sao duy nhất Tuy nhiên, mỗi người dùng vẫn cần các phân đoạn riêng biệt để lưu trữ các biến cục bộ, và những phân đoạn này sẽ không được chia sẻ.
Kết hợp phân đoạn với phân trang
Cả phân đoạn và phân trang đều có những ưu điểm và nhược điểm riêng Hai bộ vi xử lý phổ biến hiện nay là dòng Motorola 68000, được thiết kế dựa trên không gian địa chỉ phẳng, và dòng Intel 80x86 cùng Pentium, dựa trên cơ sở phân đoạn Cả hai mô hình bộ nhớ này đều hướng tới việc kết hợp giữa phân trang và phân đoạn, cho phép chúng ta kết hợp hai phương pháp để tận dụng tối đa những lợi ích của chúng.
Kết cấu của Intel 386 thể hiện sự kết hợp hoàn hảo, trong khi phiên bản IBM OS/2 32-bit là hệ điều hành hoạt động trên nền tảng kiến trúc Intel.
Intel 386 sử dụng kỹ thuật phân đoạn kết hợp với phân trang để quản lý bộ nhớ hiệu quả Mỗi quá trình có thể có tối đa 16KB phân đoạn, với kích thước tối đa của mỗi phân đoạn lên đến 64KB.
Bài viết này không đi sâu vào mô tả chi tiết về cấu trúc quản lý bộ nhớ của Intel 386, mà chỉ nêu ra những ý tưởng quan trọng liên quan đến kích thước trang 4 KB và dung lượng bộ nhớ 4GB.
Không gian địa chỉ luận lý của quá trình được chia thành hai phân khu: phân khu thứ nhất chứa 8 KB các phân đoạn riêng biệt cho quá trình, trong khi phân khu thứ hai chứa 8 KB các phân đoạn được chia sẻ giữa tất cả các quá trình Thông tin về phân khu thứ nhất được lưu trữ trong bảng mô tả cục bộ (Local Descriptor Table - LDT), còn thông tin về phân khu thứ hai được lưu trong bảng mô tả toàn cục (Global Descriptor Table - GDT) Mỗi mục trong LDT và GDT có kích thước 8 bytes, chứa thông tin chi tiết về vị trí nền và chiều dài của phân đoạn Địa chỉ luận lý được biểu diễn dưới dạng một cặp (bộ chọn, độ dời), trong đó bộ chọn là một số 16-bit.
Trong hệ thống, s đại diện cho số phân đoạn, g chỉ định phân đoạn trong GDT hoặc LDT, và p đảm nhiệm việc bảo vệ Độ dời là một số 32-bit xác định vị trí của byte hoặc từ trong phân đoạn.
Máy Intel 386 có 6 thanh ghi cho phép xác định 6 phân đoạn tại bất kỳ thời điểm nào, với 6 thanh ghi vi chương trình 8-byte để quản lý bộ mô tả từ LDT hoặc GDT Điều này giúp tránh việc đọc bộ mô tả từ bộ nhớ cho mỗi lần tham chiếu Địa chỉ vật lý trên 386 dài 32 bits, được hình thành từ thanh ghi đoạn chỉ tới mục tương ứng trong LDT hay GDT Thông tin nền và giới hạn phân đoạn được sử dụng để tạo ra địa chỉ tuyến tính, trong đó giới hạn kiểm tra tính hợp lệ của địa chỉ Nếu địa chỉ không hợp lệ, lỗi bộ nhớ sẽ xảy ra và dẫn đến trap tới hệ điều hành Nếu hợp lệ, độ dời sẽ được cộng vào giá trị nền, tạo ra địa chỉ tuyến tính 32-bit, sau đó được dịch thành địa chỉ vật lý.
Mỗi phân đoạn trong hệ thống được phân trang với kích thước 4 KB, cho phép bảng trang chứa tối đa 1 triệu mục từ Mỗi mục từ chiếm 4 bytes, do đó, mỗi quá trình cần khoảng 4 MB không gian địa chỉ vật lý cho bảng trang của mình.
Chúng ta không muốn cấp phát bảng trang liên tục trong bộ nhớ, do đó Intel 386 đã áp dụng cơ chế phân trang 2 cấp Địa chỉ tuyến tính được chia thành số trang 20 bits và độ dời trang 12 bits Việc phân trang bảng trang cho phép số trang được chia nhỏ thành con trỏ thư mục trang 10-bit và con trỏ bảng trang 10-bit, tạo ra địa chỉ luận lý hiệu quả.
Cơ chế dịch địa chỉ cho kiến trúc này tương tự như cơ chế được trình bày trong hình 12 Hình 21 dưới đây cung cấp thông tin chi tiết hơn về quá trình dịch địa chỉ của Intel.
Để cải thiện hiệu quả sử dụng bộ nhớ vật lý, bảng trang của Intel 386 có khả năng được hoán vị tới đĩa Mỗi bit trong mục từ thư mục trang sẽ chỉ ra vị trí của bảng trong bộ nhớ hoặc trên đĩa Nếu bảng nằm trên đĩa, hệ điều hành sẽ sử dụng 31 bit còn lại để xác định vị trí của bảng trên đĩa, và sau đó bảng có thể được tải vào bộ nhớ khi cần thiết.
BỘ NHỚ ẢO
Kiến thức chung
Khi xem xét các chương trình thực thi, chúng ta nhận thấy rằng trong nhiều trường hợp, toàn bộ chương trình không phải lúc nào cũng cần thiết Thậm chí, ngay cả khi toàn bộ chương trình được yêu cầu, không phải tất cả các phần của chương trình đều cần thiết phải được thực hiện cùng một lúc.
Khả năng thực thi chương trình chỉ một phần chương trình ở trong bộ nhớ có nhiều lợi điểm:
Chương trình sẽ không bị giới hạn bởi không gian bộ nhớ vật lý hiện có, cho phép người dùng viết mã với không gian địa chỉ ảo rộng lớn, từ đó đơn giản hóa quy trình lập trình.
Việc cho phép nhiều chương trình sử dụng ít bộ nhớ vật lý hơn đồng nghĩa với việc có thể thực thi nhiều chương trình cùng lúc Điều này không chỉ gia tăng hiệu suất sử dụng CPU mà còn nâng cao thông lượng, mặc dù thời gian đáp ứng không bị ảnh hưởng.
Yêu cầu giảm thiểu việc nhập/xuất giúp nạp hoặc hoán vị các chương trình người dùng trong bộ nhớ hiệu quả hơn, từ đó nâng cao tốc độ chạy cho mỗi chương trình.
Do đó, chạy một chương trình mà nó không nằm hoàn toàn trong bộ nhớ có lợi cho cả người dùng và hệ thống.
Bộ nhớ ảo tách biệt bộ nhớ luận lý và bộ nhớ vật lý, cho phép cung cấp một lượng lớn bộ nhớ ảo cho lập trình viên mặc dù bộ nhớ vật lý có hạn Sự tách biệt này giúp lập trình viên dễ dàng hơn trong việc lập trình, vì họ không cần lo lắng về dung lượng bộ nhớ vật lý có sẵn hay mã nào sẽ bị thay thế Trên các hệ thống hỗ trợ bộ nhớ ảo, vấn đề phủ lắp gần như không còn tồn tại.
Hình 22: Lưu đồ minh hoạ bộ nhớ ảo lơn hơn bộ nhớ vật lý
Việc tách biệt bộ nhớ luận lý và bộ nhớ vật lý, cùng với bộ nhớ ảo, giúp cho các tập tin và bộ nhớ có thể được chia sẻ giữa các quá trình khác nhau thông qua cơ chế chia sẻ trang Điều này không chỉ cải thiện khả năng quản lý bộ nhớ mà còn nâng cao hiệu suất khi khởi tạo các quá trình mới.
Bộ nhớ ảo thường được cài đặt bởi phân trang theo yêu cầu (demand paging).
Cơ chế phân đoạn có thể được cài đặt trong hệ thống phân trang, trong đó các phân đoạn được chia thành các trang, giúp người dùng nhìn thấy phân đoạn trong khi hệ điều hành quản lý chúng qua phân trang Phân đoạn theo yêu cầu cũng hỗ trợ bộ nhớ ảo, như được áp dụng trong các hệ thống máy tính của Burrough Tuy nhiên, các thuật toán thay thế đoạn phức tạp hơn so với thuật toán thay thế trang do kích thước của các đoạn thay đổi Nội dung về phân đoạn theo yêu cầu không được đề cập trong giáo trình này.
Phân trang theo yêu cầu
Hệ thống phân trang theo yêu cầu hoạt động tương tự như hệ thống phân trang với hoán vị, trong đó các quá trình định vị trong bộ nhớ phụ, thường là đĩa Khi cần thực thi một quá trình, thay vì hoán vị toàn bộ vào bộ nhớ, chúng ta sử dụng bộ hoán vị lười, chỉ hoán vị trang khi cần thiết Việc xem một quá trình như chuỗi các trang thay vì không gian địa chỉ liên tục khiến hoán vị không còn phù hợp kỹ thuật Trong khi bộ hoán vị xử lý toàn bộ quá trình, bộ phân trang (pager) tập trung vào các trang riêng lẻ, do đó, bộ phân trang được sử dụng kết hợp với phân trang theo yêu cầu.
Hình 23: Chuyển bộ nhớ được phân trang tới không gian đĩa liên tục
Để phân biệt giữa các trang trong bộ nhớ và trên đĩa, cần một số phần cứng hỗ trợ, trong đó cơ chế bit hợp lệ-không hợp lệ là rất quan trọng Khi bit được đặt "hợp lệ", nó cho thấy trang được tham chiếu đang ở trong bộ nhớ Ngược lại, nếu bit được đặt "không hợp lệ", điều này có nghĩa là trang không ở trong không gian địa chỉ của quá trình hoặc mặc dù hợp lệ nhưng hiện đang ở trên đĩa Các mục trong bảng trang cho các trang không có trong bộ nhớ sẽ được đánh dấu là không hợp lệ hoặc chứa địa chỉ của trang trên đĩa, như minh họa trong hình 24.
Hình 24: Bảng trang khi một số trang không ở trong bộ nhớ chính
Việc đánh dấu một trang là “không hợp lệ” sẽ không ảnh hưởng nếu quá trình không truy xuất trang đó Nếu tất cả các trang cần thiết đều đã được lưu trong bộ nhớ, quá trình sẽ hoạt động giống như khi tất cả các trang được đưa vào bộ nhớ Khi quá trình thực thi và truy xuất trang diễn ra trong bộ nhớ, việc thực thi sẽ diễn ra bình thường.
Khi cố gắng truy xuất một trang không được mang vào bộ nhớ, hệ thống sẽ gặp phải lỗi trang (page-fault trap) Phần cứng phân trang sẽ phát hiện bit không hợp lệ và gửi tín hiệu đến hệ điều hành để xử lý Thay vì gặp lỗi địa chỉ không hợp lệ do sử dụng địa chỉ bộ nhớ sai, hệ điều hành sẽ cố gắng mang trang mong muốn vào bộ nhớ với chi phí chuyển đĩa tối thiểu Việc quản lý lỗi trang này không phức tạp và có thể được thực hiện theo một quy trình rõ ràng.
1) Chúng ta kiểm tra bảng bên trong (thường được giữ với khối điều khiển quá trình) cho quá trình này, để xác định tham chiếu là truy xuất bộ nhớ hợp lệ hay không hợp lệ.
2) Nếu tham chiếu là không hợp lệ, chúng ta kết thúc quá trình Nếu nó là hợp lệ, nhưng chúng ta chưa mang trang đó vào bộ nhớ, bây giờ chúng ta mang trang đó vào.
3) Chúng ta tìm khung trống (thí dụ, bằng cách mang một trang từ danh sách khung trống).
4) Chúng ta lập thời biểu thao tác đĩa để đọc trang mong muốn vào khung trang vừa mới được cấp phát.
5) Khi đọc đĩa hoàn thành, chúng ta sửa đổi bảng bên trong với quá trình và bảng trang để hiển thị rằng trang bây giờ ở trong bộ nhớ.
6) Chúng ta khởi động lại chỉ thị mà nó bị ngắt bởi trap địa chỉ không hợp lệ Bây giờ quá trình có thể truy xuất trang mặc dù nó luôn ở trong bộ nhớ.
Khi xảy ra lỗi trang, hệ điều hành lưu lại trạng thái của quá trình, bao gồm thanh ghi, mã điều kiện và bộ đếm chỉ thị lệnh, cho phép khởi động lại quá trình tại đúng vị trí và trạng thái Điều này cho phép thực thi quá trình ngay cả khi một số phần chưa được tải vào bộ nhớ Khi quá trình cố gắng truy xuất các vị trí không có trong bộ nhớ, phần cứng sẽ thông báo cho hệ điều hành về lỗi trang Hệ điều hành sau đó sẽ đọc trang yêu cầu vào bộ nhớ và khôi phục quá trình như thể trang đã luôn có sẵn trong bộ nhớ.
Trong trường hợp xấu nhất, khi bắt đầu thực thi một quá trình mà không có trang nào trong bộ nhớ, hệ điều hành sẽ chỉ định con trỏ đến chỉ thị đầu tiên Nếu chỉ thị này nằm trên trang không có trong bộ nhớ, quá trình sẽ báo lỗi Sau khi trang được đưa vào bộ nhớ, quá trình tiếp tục thực thi và sẽ báo lỗi cho đến khi tất cả các trang cần thiết được tải vào Khi tất cả các trang đã có trong bộ nhớ, quá trình sẽ thực thi mà không gặp lỗi Cơ chế này được gọi là thuần phân trang yêu cầu (pure demand paging), tức là chỉ mang trang vào bộ nhớ khi có yêu cầu.
Trong lý thuyết, một số quá trình có thể truy xuất nhiều trang mới của bộ nhớ cho mỗi lần thực thi chỉ thị, dẫn đến khả năng xảy ra lỗi nhiều trang trên chỉ thị Tình huống này có thể làm giảm hiệu suất hệ thống một cách nghiêm trọng Tuy nhiên, phân tích các quá trình thực thi cho thấy hành vi này không hoàn toàn xảy ra, vì các chương trình thường có xu hướng tham chiếu cục bộ, từ đó nâng cao khả năng hiệu quả của việc phân trang.
Phần cứng hỗ trợ phân trang theo yêu cầu là tương tự như phần cứng phân trang và hoán vị.
Bảng trang có khả năng đánh dấu các mục từ không hợp lệ thông qua việc sử dụng bit hợp lệ-không hợp lệ, cùng với giá trị đặc biệt của các bit bảo vệ.
Bộ nhớ phụ là loại bộ nhớ quản lý các trang không có mặt trong bộ nhớ chính, thường được lưu trữ trên đĩa tốc độ cao Nó hoạt động như một thiết bị hoán vị, và phần không gian trên đĩa được sử dụng cho mục đích này được gọi là không gian hoán vị.
Phần mềm cần xem xét các yêu cầu liên quan đến ràng buộc kiến trúc, trong đó quan trọng nhất là khả năng khởi động lại bất kỳ chỉ thị nào sau khi xảy ra lỗi trang Yêu cầu này thường dễ dàng được đáp ứng, vì lỗi trang có thể xảy ra tại bất kỳ tham chiếu bộ nhớ nào Khi lỗi trang xảy ra trong quá trình lấy chỉ thị, chúng ta có thể khởi động lại bằng cách lấy lại chỉ thị đó Ngược lại, nếu lỗi trang xảy ra trong khi lấy toán hạng, chúng ta cần thực hiện lại việc lấy và giải mã chỉ thị trước khi lấy toán hạng.
Hiệu suất của phân trang theo yêu cầu
Phân trang theo yêu cầu có ảnh hưởng đáng kể đến hiệu suất của hệ thống máy tính Thời gian truy xuất hiệu quả cho bộ nhớ phân trang theo yêu cầu, ký hiệu là ma, thường dao động từ 10 đến
Thời gian truy xuất hiệu quả là 200 nano giây, giả sử không có lỗi trang Tuy nhiên, khi xảy ra lỗi trang, chúng ta cần đọc trang từ đĩa trước khi thực hiện truy xuất dữ liệu mong muốn.
Gọi p là xác suất của lỗi trang (0 < p < 1 ) Chúng ta mong đợi p gần bằng 0; nghĩa là chỉ có một vài lỗi trang Thời gian truy xuất hiệu quả là:
Thời gian truy xuất hiệu quả được tính bằng công thức: (1 - p) x ma + p x thời gian lỗi trang Để xác định thời gian này, cần biết thời gian phục vụ cho một lỗi trang Để đảm bảo hệ thống hoạt động với độ trễ chấp nhận được do phân trang, việc duy trì tỷ lệ lỗi trang ở mức thấp là rất quan trọng.
Thay thế trang
Thay thế trang thực hiện tiếp cận sau khi không còn khung trống Nếu không có khung trống, chúng ta sẽ tìm một khung không được sử dụng và giải phóng nó Khi giải phóng khung, nội dung của nó sẽ được ghi vào không gian hoán vị và bảng trang sẽ được cập nhật để phản ánh rằng trang không còn trong bộ nhớ Sau khi giải phóng, khung đó có thể được sử dụng để quản lý trang cho quá trình bị lỗi Chúng ta cũng cần sửa đổi thủ tục phục vụ lỗi trang để bao gồm việc thay thế trang.
1) Tìm vị trí trang mong muốn trên đĩa
2) Tìm khung trang trống a) Nếu có khung trống, dùng nó. b) Nếu không có khung trống, dùng một giải thuật thay thế trang để chọn khung “nạn nhân” c) Viết trang “nạn nhân” tới đĩa; thay đổi bảng trang và khung trang tương ứng.
3) Đọc trang mong muốn vào khung trang trống; thay đổi bảng trang và khung trang.
4) Khởi động lại quá trình.
Để cài đặt phân trang theo yêu cầu, chúng ta cần giải quyết hai vấn đề chính: phát triển giải thuật cấp phát khung và giải thuật thay thế trang Khi có nhiều quá trình trong bộ nhớ, việc quyết định số khung cấp phát cho mỗi quá trình là rất quan trọng Đồng thời, khi cần thay thế trang, chúng ta cũng phải lựa chọn các khung để thay thế một cách hợp lý Thiết kế các giải thuật hiệu quả cho những vấn đề này là cần thiết, vì nhập/xuất đĩa tốn kém và ngay cả một cải tiến nhỏ trong phân trang theo yêu cầu cũng có thể tạo ra sự gia tăng lớn về năng lực hệ thống.
Có nhiều thuật toán thay thế trang khác nhau, và mỗi hệ điều hành đều có cơ chế riêng cho việc này Khi lựa chọn thuật toán thay thế trang, mục tiêu chính của chúng ta là tìm ra thuật toán có tỷ lệ lỗi trang thấp nhất.
Để đánh giá một giải thuật, chúng ta chạy nó trên một chuỗi tham chiếu bộ nhớ cụ thể và tính số lượng lỗi trang Chuỗi tham chiếu này có thể được tạo ra ngẫu nhiên, tạo ra dữ liệu lớn với tốc độ khoảng 1 triệu địa chỉ mỗi giây Để giảm thiểu lượng dữ liệu này, có hai phương pháp Thứ nhất, thay vì xem xét toàn bộ địa chỉ, chúng ta chỉ cần xem chỉ số trang, vì kích thước trang thường được cố định bởi phần cứng hoặc hệ thống Thứ hai, nếu đã có một tham chiếu tới trang p, các tham chiếu ngay sau đó tới trang p sẽ không gây lỗi trang, vì trang p sẽ vẫn nằm trong bộ nhớ sau tham chiếu đầu tiên.
Giải thuật FIFO (First In, First Out) là phương pháp thay thế trang đơn giản nhất, trong đó mỗi trang được gán một thời gian khi được đưa vào bộ nhớ Khi cần tải một trang mới vào bộ nhớ, trang đó sẽ được chèn vào cuối hàng đợi, đảm bảo rằng trang đã ở trong bộ nhớ lâu nhất sẽ được thay thế đầu tiên.
Trong ví dụ về chuỗi tham khảo, ba khung ban đầu rỗng và ba tham khảo đầu tiên (7, 0, 1) gây ra lỗi trang, được mang vào các khung này Tham khảo tiếp theo (2) thay thế trang 7, vì trang 7 đã được mang vào trước Khi tham khảo 0 xuất hiện, nó không gây lỗi vì đã có trong bộ nhớ Tham khảo đến 3 dẫn đến việc trang 0 bị thay thế, làm cho 0 trở thành trang đầu tiên trong bộ nhớ (0, 1, 2) được mang vào Sự thay thế này dẫn đến lỗi khi tham khảo tiếp theo là 0 Sau đó, trang 1 bị thay thế bởi trang 0, và quá trình này tiếp tục, với tổng cộng 15 lỗi xảy ra, như được minh họa trong hình 27.
Hình 27: Giải thuật thay thế trang FIFO
Giải thuật thay thế trang FIFO dễ hiểu và dễ lập trình, nhưng hiệu suất của nó không phải lúc nào cũng tốt Khi trang được chọn để thay thế có thể chứa dữ liệu cần thiết và thường xuyên được sử dụng, việc chuyển trang đó ra bộ nhớ phụ sẽ dẫn đến lỗi trang Để minh họa vấn đề của FIFO, chúng ta xem chuỗi tham khảo: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 Hình 28 cho thấy số lỗi trang tăng lên khi so sánh giữa 4 khung (10 lỗi) và 3 khung (9 lỗi) Hiện tượng này được gọi là nghịch lý Belady, khi tỷ lệ lỗi trang có thể tăng khi số khung cấp phát tăng Mặc dù chúng ta mong rằng việc cấp thêm bộ nhớ cho một quá trình sẽ cải thiện hiệu suất, nhưng nghiên cứu trước đây cho thấy giả thuyết này không phải lúc nào cũng đúng, dẫn đến việc phát hiện sự không bình thường của Belady.
Hình 28: Đường cong lỗi trang cho thay thế FIFO trên chuỗi tham khảo 2.4.2 Thay thế trang tối ưu hoá
Kết quả phát hiện sự nghịch lý của Belady dẫn đến việc phát triển một giải thuật thay thế trang tối ưu, được gọi là OPT hay MIN Giải thuật này có tỉ lệ lỗi trang thấp nhất trong tất cả các giải thuật và không bao giờ gặp phải sự nghịch lý của Belady Nguyên tắc hoạt động của nó là thay thế trang mà không được sử dụng trong thời gian dài nhất Việc áp dụng giải thuật thay thế trang này đảm bảo tỉ lệ lỗi trang nhỏ nhất cho một số lượng khung cố định.
Trong một chuỗi tham khảo mẫu, thuật toán thay thế trang tối ưu có thể tạo ra 9 lỗi trang, như minh họa trong hình 29, với lỗi đầu tiên gây ra vấn đề trong việc điền thông tin.
Trong hệ thống quản lý bộ nhớ với 3 khung trống, việc tham khảo trang 2 để thay thế trang 7 là cần thiết, vì trang 7 không thể sử dụng cho đến khi trang 18 được tham khảo Ngược lại, trang 0 có thể được sử dụng tại trang 5, và trang 1 tại trang 14 Khi trang 1 trở thành trang cuối cùng trong bộ nhớ, trang 3 sẽ thay thế trang 1 Với chỉ 9 lỗi trang, phương pháp thay thế tối ưu cho thấy hiệu quả vượt trội so với giải thuật FIFO, với 15 lỗi Nếu loại trừ 3 lỗi đầu mà tất cả các giải thuật đều gặp phải, thay thế tối ưu sẽ tốt gấp đôi so với FIFO Thực tế, không có giải thuật nào có thể xử lý chuỗi tham khảo trong 3 khung với ít hơn 9 lỗi.
Giải thuật thay thế trang tối ưu khó cài đặt do yêu cầu kiến thức về chuỗi tham khảo trong tương lai Vì vậy, giải thuật tối ưu chủ yếu được sử dụng cho nghiên cứu so sánh Ví dụ, một giải thuật không tối ưu có thể nằm trong 12.3% của tối ưu được coi là tệ, trong khi 4.7% được xem là trung bình.
Hình 29: Giải thuật thay thế trang tối ưu 2.4.3 Thay thế trang LRU
Nếu giải thuật tối ưu không khả thi, một xấp xỉ có thể được áp dụng Sự khác biệt chính giữa giải thuật FIFO và OPT là FIFO dựa vào thời gian trang được đưa vào bộ nhớ, trong khi OPT dựa vào thời gian trang được sử dụng Bằng cách sử dụng dữ liệu quá khứ gần đây làm cơ sở cho tương lai gần, chúng ta có thể thay thế trang không được sử dụng lâu nhất Phương pháp này chính là giải thuật ít được dùng gần đây nhất (LRU).
Hình 30: Giải thuật thay thế trang LRU
Chiến lược thay thế trang LRU (Least Recently Used) dựa trên thời gian sử dụng cuối cùng của mỗi trang Khi cần thay thế một trang, LRU sẽ chọn trang không được sử dụng lâu nhất Phương pháp này được coi là giải thuật thay thế trang tối ưu vì nó tìm kiếm theo hướng lùi thời gian Tỉ lệ lỗi trang cho giải thuật OPT trên chuỗi tham khảo S tương tự như tỉ lệ lỗi trang cho giải thuật OPT trên trình tự ngược SR Tương tự, tỉ lệ lỗi trang của giải thuật LRU trên S cũng giống như tỉ lệ lỗi trang của LRU trên SR.
Kết quả ứng dụng thay thế LRU đối với chuỗi tham khảo điển hình cho thấy giải thuật LRU tạo ra 12 lỗi, trong đó 5 lỗi đầu tiên tương tự như thay thế tối ưu Khi tham chiếu tới trang 4, LRU thay thế trang 2, mặc dù trang này được sử dụng gần đây nhất Sau khi gây ra lỗi với trang 2, LRU tiếp tục thay thế trang 3, vì trang 3 ít được sử dụng gần đây nhất trong bộ nhớ {0, 3, 4} Mặc dù gặp phải một số vấn đề, nhưng thay thế LRU với 12 lỗi vẫn hiệu quả hơn so với thay thế FIFO với 15 lỗi.