1. Trang chủ
  2. » Luận Văn - Báo Cáo

IT6025.3(003) K15_nhóm số 4_Nghiên cứu tìm hiểu về quản lý Bộ Nhớ Trong trong HĐH Linux

34 2 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nghiên Cứu Tìm Hiểu Về Quản Lý Bộ Nhớ Trong Trong HĐH Linux
Tác giả Đặng Quang Trung, Nguyễn Thành Đạt, Lương Gia Hiệp, Đặng Minh Tiến, Nguyễn Văn Tuân
Người hướng dẫn Ths Nguyễn Tuấn Tú
Trường học Trường Đại Học Công Nghiệp Hà Nội
Chuyên ngành Nguyên Lí Hệ Điều Hành
Thể loại Bài Tập Lớn
Năm xuất bản 2022
Thành phố Hà Nội
Định dạng
Số trang 34
Dung lượng 1,13 MB

Cấu trúc

  • CHƯƠNG 1: GIỚI THIỆU VỀ HỆ ĐIỀU HÀNH LINUX (5)
    • 1.1. Hệ điều hành Linux (5)
    • 1.2. Tổng quan về quản lí bộ nhớ trong Linux (5)
  • CHƯƠNG 2 CƠ CHẾ QUẢN LÝ BỘ NHỚ CỦA LINUX (7)
    • 2.1. Một mô hình tóm tắt về bộ nhớ ảo (8)
    • 2.2. Lý do yêu cầu phải phân trang (10)
  • CHƯƠNG 3: VÙNG TRUNG GIAN (SWAPPING) (12)
  • CHƯƠNG 4: BỘ NHỚ ẢO DÙNG CHUNG (SHARED VIRTUAL MEMORY) (13)
  • CHƯƠNG 5: CACHES (15)
  • CHƯƠNG 6: CÁC BẢNG QUẢN LÝ TRANG TRONG LINUX (17)
    • 6.1. Việc phân phối và thu hồi trang (17)
    • 6.2. Việc phân phối trang (18)
    • 6.3. Thu hồi trang đã phân phối (19)
  • CHƯƠNG 7: VẤN ĐỀ ÁNH XẠ BỘ NHỚ (21)
    • 7.1. Yêu cầu đánh số trang (22)
    • 7.2. Vùng trang đệm của Linux (The Linux Page Cache) (24)
    • 7.3. Việc loại bỏ các trang và tráo đổi các trang ra ngoài (25)
      • 7.3.1. Phương pháp giảm kích thước các trang và các vùng bộ đệm (26)
      • 7.3.2. Phương pháp tráo đổi các trang nhớ dùng chung System V (28)
      • 7.3.3. Phương pháp tráo đổi và loại bỏ các trang (29)
    • 7.4. Việc tráo đổi các trang đã nạp (31)
  • Kết luận (33)

Nội dung

IT6025.3(003) K15_nhóm số 4_Nghiên cứu tìm hiểu về quản lý Bộ Nhớ Trong trong HĐH Linux

GIỚI THIỆU VỀ HỆ ĐIỀU HÀNH LINUX

Hệ điều hành Linux

Linux là một hệ điều hành mã nguồn mở miễn phí, thuộc họ UNIX, được phát triển bởi Linus Torvalds vào năm 1991 Hệ điều hành này nổi bật với khả năng đa nhiệm và đa người dùng, cho phép chạy trên nhiều nền tảng phần cứng khác nhau Với tính ổn định và linh hoạt, Linux ngày càng phổ biến trên các máy chủ và trạm làm việc trong môi trường mạng Hệ điều hành này cũng hỗ trợ tích hợp dễ dàng với các hệ điều hành khác như Windows, Novell và Apple Đặc biệt, tính năng mã nguồn mở của Linux mang đến khả năng tùy biến cao, phù hợp với các nhu cầu sử dụng đa dạng.

Tổng quan về quản lí bộ nhớ trong Linux

Bộ nhớ là một tài nguyên thiết yếu trong hệ thống máy tính, nhưng thường không đủ đáp ứng nhu cầu của người dùng Dù các máy tính cá nhân hiện nay đã được trang bị dung lượng bộ nhớ lớn, thậm chí các máy chủ server có thể sở hữu hàng gigabyte bộ nhớ, nhu cầu về bộ nhớ vẫn luôn gia tăng và chưa được thỏa mãn.

Có rất nhiều chiến lược quản lí bộ nhớ được nghiên cứu và áp dụng, trong đó chiến lược sử dụng bộ nhớ ảo là hiệu quả nhất.

Giống như các hệ điều hành khác, Linux sử dụng cơ chế bộ nhớ ảo để quản lí tài nguyên bộ nhớ trong máy tính.

Linux quản lý bộ nhớ một cách rõ ràng và hiệu quả, ngăn chặn các ứng dụng truy cập trực tiếp vào địa chỉ vật lý của bộ nhớ Hệ điều hành cung cấp cho các tiến trình một mô hình đánh địa chỉ phẳng, khác với kiểu segment:offset của DOS, giúp tối ưu hóa việc sử dụng bộ nhớ.

Mỗi tiến trình trong hệ điều hành UNIX được cấp phát một vùng không gian địa chỉ riêng biệt, giúp bảo vệ bộ nhớ hiệu quả Cơ chế này đảm bảo rằng không có tiến trình nào có thể ghi đè lên vùng nhớ của tiến trình khác hoặc vùng nhớ hệ thống Do đó, bộ nhớ mà hệ thống phân bổ cho một tiến trình không thể bị đọc hoặc ghi bởi bất kỳ tiến trình nào khác, từ đó giảm thiểu khả năng xung đột bộ nhớ.

Trong hầu hết các hệ thống Linux, con trỏ là một số nguyên 32 bit, cho phép truy cập đến một ô nhớ cụ thể Với kích thước 32 bit, hệ thống có khả năng đánh địa chỉ tối đa lên đến 4 GB.

Mô hình bộ nhớ GB với cấu trúc phẳng dễ dàng truy xuất và xử lý hơn so với mô hình phân đoạn segment:offset, đồng thời cho phép mở rộng không gian địa chỉ lên đến hàng Terabyte nhờ vào địa chỉ 64 bit Để tối ưu dung lượng bộ nhớ, Linux sử dụng chương trình phân trang đĩa, cho phép lưu trữ không gian hoán đổi trên đĩa, giúp hệ thống có thể xử lý các ứng dụng lớn và hỗ trợ nhiều người dùng cùng lúc Tuy nhiên, việc hoán đổi này chậm hơn so với bộ nhớ vật lý do thời gian truy cập đĩa Ngoài ra, kernel cũng triển khai khối bộ nhớ hợp nhất cho các chương trình và bộ đệm đĩa tạm thời, giúp giảm thiểu bộ nhớ trống khi xử lý các chương trình lớn.

CƠ CHẾ QUẢN LÝ BỘ NHỚ CỦA LINUX

Một mô hình tóm tắt về bộ nhớ ảo

Hình 1 Mô hình tóm tắt ánh xạ từ bộ nhớ ảo tới bản đồ địa chỉ bộ nhớ vật lý

Khi bộ vi xử lý thực hiện một chương trình, nó sẽ đọc và giải mã các lệnh từ bộ nhớ Trong quá trình giải mã, bộ vi xử lý sẽ truy xuất hoặc lưu trữ nội dung từ các ô nhớ trong bộ nhớ.

Bộ vi xử lý thực hiện lệnh và sau đó chuyển sang lệnh tiếp theo trong chương trình, đảm bảo rằng nó luôn truy cập bộ nhớ để nhận lệnh hoặc để nhận và lưu trữ dữ liệu.

Trong hệ thống bộ nhớ ảo, địa chỉ ảo được chuyển đổi thành địa chỉ vật lý bởi vi xử lý Quá trình này yêu cầu bộ nhớ ảo và bộ nhớ vật lý được chia thành các phần có kích thước hợp lý, được gọi là các trang.

(pages) Tất cả các trang này có kích thước giống hệt nhau.

VD: Linux trên các hệ thống Alpha AXP sử dụng các trang có dung lượng 8

Trên các hệ thống Intel x86, kích thước mỗi trang là 4 KB và mỗi trang được gán một số hiệu khung trang duy nhất.

Trong mô hình đánh số trang, địa chỉ ảo bao gồm hai phần: địa chỉ offset và số hiệu khung trang (PFN) Ví dụ, với kích thước trang 4 KB, các bit từ 0 đến 11 của địa chỉ ảo đại diện cho địa chỉ offset, trong khi các bit từ 12 trở đi chỉ định số hiệu khung trang ảo Khi bộ vi xử lý xử lý địa chỉ ảo, nó sẽ tách biệt địa chỉ offset và số hiệu khung trang, sau đó chuyển đổi số hiệu khung trang ảo thành số hiệu khung trang vật lý tương ứng, và truy cập vào địa chỉ offset trong trang vật lý thông qua bảng phân trang.

Mỗi một phần tử trong bảng phân trang gồm các thông tin sau:

- Valid flag: Cờ xác định tính hợp lệ, nhận giá trị 0 hoặc 1.

- Số hiệu khung trang vật lý mà phần tử này đang diễn tả.

Để chuyển đổi địa chỉ ảo sang địa chỉ vật lý, bộ vi xử lý cần tính toán số hiệu khung trang và địa chỉ offset trong trang ảo Với kích thước trang ảo là 1000h bytes (tương đương 4096 bytes), địa chỉ 1194h trong không gian địa chỉ ảo sẽ được chuyển đổi thành địa chỉ offset 0194h thuộc trang ảo có số hiệu khung trang là 1.

Nếu số hiệu khung trang ảo hợp lệ và không vượt quá chỉ số tối đa trong bảng phân trang, bộ vi xử lý sẽ nhận diện được số hiệu khung trang vật lý tương ứng với phần tử đó.

Khi chỉ số chỉ ra vùng không tồn tại trong bộ nhớ ảo, bộ vi xử lý sẽ chuyển quyền điều khiển cho hệ điều hành để sửa chữa địa chỉ Bộ vi xử lý thông báo rằng một tiến trình hợp lệ đã cố gắng truy cập địa chỉ ảo nhưng không thể chuyển đổi thành địa chỉ vật lý hợp lệ, dẫn đến sự cố hỏng trang Hệ điều hành được thông báo rằng địa chỉ ảo này không hợp lệ, gây ra lỗi trang.

Nếu phần tử cần tìm trong bảng phân trang hợp lệ, bộ vi xử lý sẽ lấy số hiệu khung trang vật lý và nhân với kích thước trang để tạo thành địa chỉ cơ sở.

Địa chỉ đầu của trang trong bộ nhớ vật lý được xác định bằng cách cộng địa chỉ cơ sở với địa chỉ offset, từ đó cho ra địa chỉ của lệnh hoặc dữ liệu cần truy cập.

VD: Số hiệu khung trang ảo của tiến trình là 1, tương ứng với số hiệu khung trang vật lý là 4 theo bảng phân trang Kích thước trang là 4Kb (1000h), do đó địa chỉ cơ sở của trang vật lý là 4000h (4 x 1000h) Khi cộng với địa chỉ offset 0194h, địa chỉ vật lý cuối cùng là 4194h.

Theo phương pháp trên, bộ nhớ ảo có thể ánh xạ vào các trang vật lý của hệ thống một cách bất kì.

Lý do yêu cầu phải phân trang

Khi không gian bộ nhớ vật lý hạn chế hơn bộ nhớ ảo, hệ điều hành cần tối ưu hóa việc sử dụng bộ nhớ Một cách để tiết kiệm bộ nhớ vật lý là thông qua việc yêu cầu trang, tức là chỉ nạp các trang bộ nhớ ảo mà chương trình đang sử dụng và truy cập.

Khi một tiến trình cố gắng truy cập vào địa chỉ ảo không có trong bộ nhớ, bộ vi xử lý sẽ không tìm thấy phần tử tương ứng trong bảng phân trang cho trang ảo đã được tham chiếu Ví dụ, nếu không có phần tử nào trong bảng phân trang cho khung trang ảo số 2, khi tiến trình X cố gắng đọc địa chỉ từ khung trang này, bộ vi xử lý sẽ không thể chuyển đổi địa chỉ ảo thành địa chỉ vật lý, dẫn đến việc thông báo lỗi trang cho hệ điều hành.

Nếu địa chỉ ảo không hợp lệ hoặc không tồn tại, hệ điều hành sẽ tự động kết thúc tiến trình đó nhằm bảo vệ các tiến trình khác trong hệ thống khỏi ảnh hưởng của tiến trình không rõ ràng này.

Khi địa chỉ ảo gặp lỗi nhưng vẫn hợp lệ, hệ điều hành cần nạp trang tương ứng từ đĩa vào bộ nhớ Việc truy cập đĩa tốn thời gian, do đó tiến trình phải chờ cho đến khi trang được nạp Sau khi trang ảo được nạp vào khung trang vật lý trống, bảng phân trang sẽ cập nhật chỉ số khung trang ảo với số hiệu trang vật lý mới Tiến trình sau đó trở lại trạng thái hoạt động để tiếp tục thực hiện lệnh bị tạm dừng do lỗi bộ nhớ Quá trình truy cập bộ nhớ ảo tiếp tục, với bộ vi xử lý chuyển đổi địa chỉ ảo thành địa chỉ vật lý để tiến trình tiếp tục thi hành.

Trong thời gian chờ nạp trang, hệ điều hành sẽ lựa chọn và cho thi hành một tiến trình khác nếu có.

Linux sử dụng kỹ thuật yêu cầu trang để nạp các trang thực thi vào bộ nhớ ảo, mở file chứa lệnh và ánh xạ nội dung vào bộ nhớ ảo thông qua sơ đồ bộ nhớ Chỉ phần đầu tiên của trang được đưa vào bộ nhớ vật lý, và khi lệnh được thi hành, hệ thống phát sinh lỗi trang Linux sẽ dựa vào sơ đồ bộ để xác định các phần cần nạp nhằm thực thi lệnh hiệu quả.

VÙNG TRUNG GIAN (SWAPPING)

Khi một tiến trình cần nạp một trang ảo vào bộ nhớ vật lý nhưng không có trang vật lý trống, hệ điều hành sẽ cấp phát bộ nhớ cho trang mới bằng cách loại bỏ một trang khác khỏi bộ nhớ vật lý Quá trình này được gọi là kỹ thuật đổi trang hay thay trang.

Nếu một trang đã được loại bỏ khỏi bộ nhớ vật lý và chưa từng thay đổi, thì không cần ghi lại trang này lên đĩa Để thay đổi trang, chỉ cần xóa trang đó, và khi tiến trình cần sử dụng lại, chỉ cần đưa trang trở lại bộ nhớ từ file ảnh hoặc dữ liệu.

Khi một trang trong hệ điều hành bị thay đổi, nó sẽ được lưu trữ để truy cập sau này, gọi là trang dirty Khi trang này bị di chuyển khỏi bộ nhớ, nó sẽ được ghi vào swap file, một loại file đặc biệt Việc truy cập swap file có ảnh hưởng lớn đến tốc độ của bộ vi xử lý và bộ nhớ vật lý trong hệ thống.

Nhiều thuật toán đã được áp dụng để giải quyết vấn đề loại bỏ hoặc quản lý swap file Tập hợp các trang mà tiến trình đang sử dụng được gọi là tập các trang đang làm việc (working set) Để đảm bảo hiệu quả, một lược đồ thuật toán hoán đổi cần phải đảm bảo rằng tất cả các tiến trình đều có working set được tối ưu trong bộ nhớ vật lý.

Linux sử dụng kỹ thuật LRU (Least Recently Used) để xác định các trang có thể bị loại bỏ khỏi bộ nhớ Mỗi trang trong hệ thống có một "tuổi" nhất định, và tuổi này thay đổi khi trang được truy cập Khi một trang được truy cập, tuổi của nó giảm, trong khi những trang ít được truy cập hơn sẽ có tuổi cao hơn Nếu một trang không được truy cập trong thời gian dài, nó có thể trở thành trang già nhất, làm cho chúng trở thành ứng cử viên lý tưởng cho quá trình hoán đổi.

BỘ NHỚ ẢO DÙNG CHUNG (SHARED VIRTUAL MEMORY)

Việc sử dụng bộ nhớ ảo giúp các tiến trình chia sẻ bộ nhớ một cách hiệu quả Mỗi tiến trình có bảng phân trang riêng, cho phép truy cập bộ nhớ dễ dàng Để hai tiến trình có thể sử dụng chung một trang vật lý, số hiệu khung trang vật lý cần được đưa vào phần tử chung trong bảng phân trang của cả hai tiến trình.

VD: Hình 1 cho thấy tiến trình X có khung trang ảo 3 và tiến trình Y có khung trang ảo 1 dùng chung trang vật lý 2

*) Các kiểu địa chỉ vật lý và địa chỉ ảo

Hệ điều hành thường giới hạn việc sử dụng bộ nhớ ảo do chi phí tài nguyên cao liên quan đến việc duy trì các bảng phân trang lâu dài Mặc dù hầu hết các vi xử lý hiện đại đều hỗ trợ xử lý địa chỉ vật lý và địa chỉ ảo, nhưng việc quản lý bộ nhớ ảo vẫn cần được cân nhắc kỹ lưỡng để tối ưu hóa hiệu suất hệ thống.

Bộ vi xử lý Alpha AXP không có kiểu địa chỉ vật lý riêng biệt mà chia không gian nhớ thành nhiều vùng, trong đó có hai vùng được chỉ định để lưu trữ các địa chỉ ảo đã được ánh xạ vật lý Không gian địa chỉ này được gọi là không gian địa chỉ KSEG, bao gồm tất cả các địa chỉ tính từ.

Để thực thi mã đã liên kết trong KSEG hoặc truy cập dữ liệu tại đó, mã cần được thực thi ở chế độ hạt nhân Hạt nhân Linux trên kiến trúc Alpha bắt đầu thực thi từ địa chỉ 0xfffffc0000310000.

CACHES

Các phương pháp quản lý bộ nhớ hiện tại không đạt hiệu quả tối ưu, khiến các nhà thiết kế hệ điều hành và bộ vi xử lý phải nỗ lực cải thiện hiệu suất hệ thống Để nâng cao hiệu quả, việc duy trì các vùng nhớ đệm cho dữ liệu và thông tin hữu ích là rất quan trọng, giúp tăng tốc độ thao tác Trong hệ điều hành Linux, có nhiều loại vùng nhớ đệm cache được sử dụng để tối ưu hóa quá trình này.

Vùng bộ đệm (Buffer Cache): chứa các bộ đệm dữ liệu (data buffers) được sử dụng bởi các trình điều khiển thiết bị khối.

Các bộ đệm được thiết lập với dung lượng cố định, chẳng hạn như 512 bytes, lưu trữ các khối thông tin được đọc từ hoặc ghi tới thiết bị khối Thiết bị khối là những thiết bị chỉ cho phép truy cập thông qua việc đọc hoặc ghi các khối dữ liệu có kích thước quy định trước, ví dụ như tất cả các loại ổ đĩa đều thuộc loại thiết bị khối.

Vùng bộ đệm được đánh số thông qua việc định danh thiết bị và số hiệu khối, giúp tìm kiếm dữ liệu nhanh chóng Nếu dữ liệu có sẵn trong vùng bộ đệm, nó sẽ không cần phải đọc từ thiết bị khối vật lý, như đĩa cứng, điều này giúp tăng tốc độ truy cập dữ liệu do việc truy cập ổ đĩa vật lý thường tốn nhiều thời gian.

Vùng trang nhớ (Page Cache)

Vùng trang nhớ được sử dụng để tăng tốc độ truy cập các trang và dữ liệu trên đĩa.

Một trang nhớ là đơn vị lưu trữ các nội dung logic của một tệp tin, và trang này có thể được truy cập thông qua địa chỉ tệp và offset trong tệp Khi các trang được đọc từ đĩa để chuyển vào bộ nhớ, chúng sẽ được ghi vào vùng trang nhớ.

Vùng lưu trữ trung gian (Swap Cache)

Chỉ có các trang đã bị thay đổi (có kiểu dirty) mới được ghi vào file trung gian (swap file).

Nếu các trang không thay đổi sau khi đã được ghi vào file trung gian, thì trong lần truy cập sau, chúng không cần phải ghi lại Điều này cho phép loại bỏ trang đó, tiết kiệm nhiều thao tác không cần thiết với ổ đĩa.

Các vùng đệm phần cứng (Hardware Caches)

Một vùng đệm phần cứng thường được đặt trong bộ vi xử lý để lưu giữ các phần tử của bảng quản lý trang Bộ vi xử lý không trực tiếp đọc các trang từ bảng quản lý trang mà chuyển đổi giá trị trong bảng này để lấy địa chỉ trang cần thiết Hệ thống sử dụng các phần tử gọi là Translation Look-aside Buffers (TLB) để lưu trữ các bản sao của các phần tử bảng quản lý trang từ một hoặc nhiều tiến trình trong hệ thống.

Khi bộ vi xử lý xử lý địa chỉ ảo, nó sẽ tìm kiếm một phần tử TLB phù hợp Nếu tìm thấy, địa chỉ ảo sẽ được chuyển đổi trực tiếp thành địa chỉ vật lý để thực hiện thao tác dữ liệu Nếu không, một tín hiệu lỗi LTB sẽ được gửi đến hệ điều hành, nơi sẽ tạo ra một phần tử TLB mới để ánh xạ địa chỉ và xóa phần tử lỗi Sau đó, bộ vi xử lý sẽ tiếp tục chuyển đổi địa chỉ ảo sang địa chỉ vật lý và thực hiện thao tác đọc/ghi dữ liệu với bộ nhớ.

Việc sử dụng các vùng đệm trong Linux có những hạn chế, bao gồm việc yêu cầu nhiều lần sử dụng và chiếm dụng không gian nhớ để duy trì chúng Nếu các vùng đệm này gặp lỗi, hệ thống có thể bị treo.

CÁC BẢNG QUẢN LÝ TRANG TRONG LINUX

Việc phân phối và thu hồi trang

Hệ thống yêu cầu quản lý các trang vật lý hiệu quả, trong đó khi một trang được nạp vào bộ nhớ, hệ điều hành sẽ phân phối các trang này Các trang trở nên tự do khi các tiến trình hoàn thành, dẫn đến việc loại bỏ chúng khỏi hệ thống Các kỹ thuật và cấu trúc dữ liệu được áp dụng cho việc phân phối và thu hồi trang đóng vai trò quan trọng trong việc duy trì hiệu quả của hệ thống quản lý bộ nhớ ảo.

Việc phân phối trang

Linux sử dụng thuật toán Buddy để quản lý việc phân phối và thu hồi các khối trang, nhằm tối ưu hóa việc sử dụng bộ nhớ Thuật toán này phân phối các khối với số lượng trang là lũy thừa của 2, chẳng hạn như 1, 2, hoặc 4 trang, miễn là số lượng này không vượt quá số trang tự do trong hệ thống Hệ thống sử dụng mảng free_area để lưu trữ các khối trang và sẽ duyệt qua mảng này để tìm kiếm khối phù hợp với yêu cầu.

Mỗi phần tử trong free_area bao gồm sơ đồ các khối đã được phân phối và các khối còn trống, cùng với kích thước của các khối được tính theo đơn vị trang.

Thuật toán quản lý bộ nhớ sử dụng sơ đồ để mô tả các khối tự do và đã cấp phát, mỗi khối gồm 4 trang Đầu tiên, nó tìm kiếm các khối có kích thước phù hợp với số trang yêu cầu Nếu không tìm thấy khối tự do nào đủ kích thước, thuật toán sẽ kiểm tra các khối lớn hơn, gấp đôi số trang yêu cầu Quá trình này tiếp tục cho đến khi duyệt hết các phần tử trong free_area hoặc tìm được khối phù hợp Nếu khối tìm thấy lớn hơn yêu cầu, nó sẽ được tách thành các khối nhỏ hơn cho đến khi đạt kích thước mong muốn Các khối tự do được xếp vào hàng đợi, trong khi các khối đã phân phối và trang của chúng được trả về cho đối tượng yêu cầu.

Hình 3 Cấu trúc dữ liệu free_area

Khi yêu cầu một khối gồm 2 trang, nếu khối đầu chỉ có 1 phần tử, nó sẽ bị bỏ qua Khối thứ 2 có kích thước 4 trang sẽ được chọn, bắt đầu từ khung trang số 4, và sẽ được tách thành 2 khối, mỗi khối 2 trang Khối đầu tiên từ khung trang số 4 sẽ được trả về cho đối tượng gọi khi các trang này được phân phối, trong khi khối thứ 2 bắt đầu từ khung trang số 6 sẽ được xếp thành một khối 2 trang vào phần tử 1 của mảng free_area.

Thu hồi trang đã phân phối

Phân phối các khối nhớ lớn có thể gây ra tình trạng phân mảnh bộ nhớ, vì các khối nhớ tự do thường có kích thước lớn hơn yêu cầu Để khắc phục vấn đề này, mã lệnh thu hồi trang sẽ kết hợp các khối nhớ nhỏ thành các khối lớn hơn, nhằm tối ưu hóa việc sử dụng bộ nhớ.

Khi một khối gồm các trang tự do được kiểm tra, nó sẽ xem xét khối liền kề có kích thước tương tự để xác định xem các trang trong đó có tự do hay không Nếu khối liền kề cũng tự do, chúng sẽ được gộp lại thành một khối mới với số lượng trang lớn gấp đôi Mỗi lần hai khối được kết hợp, mã thu hồi trang sẽ cố gắng tạo ra một khối lớn hơn, giúp các khối tự do ngày càng lớn hơn và cuối cùng có thể hình thành một khối nhớ duy nhất.

Khi khung trang số 1 được giải phóng và trở thành tự do, nó sẽ kết hợp với khung trang số 0 đã tự do trước đó, tạo thành một khối gồm 2 trang và được xếp vào phần tử số 1 của mảng free_area.

VẤN ĐỀ ÁNH XẠ BỘ NHỚ

Yêu cầu đánh số trang

Khi một file thực thi được ánh xạ vào bộ nhớ ảo của tiến trình, nó có thể bắt đầu quá trình thi hành Ngay khi file được nạp vào bộ nhớ, nó sẽ truy cập vào một vùng bộ nhớ ảo không nằm trong bộ nhớ vật lý Nếu tiến trình cố gắng truy cập một địa chỉ ảo mà không có phần tử hợp lệ trong bảng quản lý trang, bộ vi xử lý sẽ thông báo cho hệ điều hành Linux về một lỗi trang.

Trong hệ điều hành Linux, khi xảy ra lỗi trang, hệ thống cần xác định cấu trúc dữ liệu vm_area_struct để mô tả vùng nhớ liên quan Nếu không tìm thấy cấu trúc vm_area_struct cho địa chỉ ảo đó, tiến trình sẽ bị xác nhận là đã truy cập một địa chỉ không hợp lệ Hệ điều hành sẽ gửi một tín hiệu tới tiến trình, và nếu tiến trình không phản hồi hợp lệ, nó sẽ bị kết thúc.

Linux kiểm tra xem lỗi trang xảy ra có phù hợp với các kiểu truy cập hợp lệ của vùng nhớ ảo hay không Nếu một tiến trình cố gắng truy cập theo cách không hợp lệ, chẳng hạn như ghi vào vùng nhớ chỉ được phép đọc, sẽ dẫn đến lỗi bộ nhớ.

Nếu Linux đã xác định lỗi trang là lỗi hợp lệ, nó sẽ bắt đầu xử lý lỗi.

Nếu phần tử trong bảng phân trang không hợp lệ nhưng không rỗng, điều này xảy ra khi một trang do phần tử này quản lý đang được lưu trữ trong file swap Cụ thể, các phần tử này có bit valid bằng 1, nhưng trường PFN lại có giá trị khác 0 Trong tình huống này, trường PFN sẽ cung cấp thông tin về vị trí lưu trữ của trang trong file swap.

Không phải mọi cấu trúc dữ liệu vm_area_struct đều đi kèm với các thao tác bộ nhớ ảo, và một số cấu trúc dữ liệu có thể không bao gồm thao tác nopage.

Khi xảy ra thao tác nopage cho vùng bộ nhớ ảo, Linux sẽ sử dụng nó Nếu thao tác này không khả thi, hệ thống sẽ tạo ra một trang nhớ vật lý mới cùng với một phần tử bảng phân trang hợp lệ.

Thao tác nopage trong Linux được áp dụng cho các tệp thực thi đã được ánh xạ vào bộ nhớ, sử dụng các vùng đệm để nạp các trang cần thiết vào bộ nhớ vật lý.

Khi trang được yêu cầu và đưa vào bộ nhớ vật lý, các bảng quản lý trang cần được cập nhật, đặc biệt khi bộ vi xử lý chuyển đổi địa chỉ để truy cập bộ đệm dự trữ Nguyên nhân lỗi trang được xác định và xử lý, sau đó tiến trình được kích hoạt lại để tiếp tục thực hiện lệnh đang chạy khi bộ nhớ ảo gặp lỗi.

Vùng trang đệm của Linux (The Linux Page Cache)

Hình 5 Vùng trang đệm của Linux

Vùng trang đệm của Linux đóng vai trò quan trọng trong việc tăng tốc độ truy cập file trên đĩa bằng cách lưu trữ các file đã ánh xạ bộ nhớ Các file này được đọc theo từng trang và được lưu trong vùng trang đệm Vùng trang đệm sử dụng một vector gọi là page_hash_table, chứa các con trỏ dẫn đến các cấu trúc dữ liệu mem_map_t.

Trong Linux, mỗi file được xác định bởi một cấu trúc dữ liệu VFS inode, với mỗi VFS inode là duy nhất và chỉ mô tả một file cụ thể Chỉ số trong bảng quản lý trang được lấy từ VFS inode của file cùng với địa chỉ offset trong file.

Khi một trang được đọc từ file đã ánh xạ bộ nhớ, nó cần được đưa vào bộ nhớ khi được yêu cầu thông qua vùng trang đệm Nếu trang đã có trong vùng trang đệm, một con trỏ tới cấu trúc dữ liệu mem_map_t sẽ được trả về cho mã xác định lỗi trang Nếu không, trang phải được nạp vào bộ nhớ từ hệ thống file lưu trữ, và Linux sẽ phân phối một trang vật lý để đọc trang từ file trên đĩa.

Khi có khả năng, Linux sẽ bắt đầu đọc trang tiếp theo trong tệp Nếu tiến trình đang truy cập vào chuỗi các trang trong tệp, trang tiếp theo sẽ được lưu sẵn trong bộ nhớ để chờ tiến trình xử lý.

Theo thời gian, vùng bộ đệm sẽ mở rộng khi các trang được đọc và thực thi Để giảm kích thước của vùng bộ đệm, các trang sẽ bị xóa bỏ khi chúng đạt “tuổi” lớn nhất.

Việc loại bỏ các trang và tráo đổi các trang ra ngoài

Khi bộ nhớ vật lý giảm, hệ thống quản lý bộ nhớ của Linux cần giải phóng các trang nhớ đang lưu trữ dữ liệu Nhiệm vụ này được thực hiện bởi trình tiện ích tráo đổi của nhân Linux, gọi là kswapd.

Trình tiện ích tráo đổi của hạt nhân là một loại tiến trình đặc biệt trong hệ điều hành, hoạt động trong không gian địa chỉ vật lý mà không sử dụng bộ nhớ ảo Nó chỉ chuyển các trang cần thiết ra swap file của hệ thống, đảm bảo rằng có đủ trang tự do để hệ điều hành có thể quản lý và sử dụng bộ nhớ một cách hiệu quả.

Kswap được khởi tạo tại thời điểm khởi động hệ thống và thực hiện việc tráo đổi trang theo định kỳ nhờ bộ swap timer của hạt nhân.

Kswapd theo dõi số lượng trang nhớ tự do trong hệ thống và quyết định giải phóng trang khi cần thiết Nếu số trang tự do vẫn trong giới hạn cho phép, kswapd sẽ không thực hiện hành động nào và chờ đến lần kiểm tra tiếp theo Để đánh giá tình hình, kswapd theo dõi tổng số trang đang được ghi vào swap file, với giá trị này tăng lên khi có trang được xếp hàng và giảm khi việc ghi vào thiết bị swap hoàn tất Khi số trang tự do thấp hơn mức cho phép, kswapd sẽ tìm cách giảm số trang vật lý đang được sử dụng trong hệ thống.

- Giảm kích thước của bộ đệm và các vùng trang đệm.

- Sử dụng các trang nhớ dùng chung

- Loại bỏ và tráo đổi các trang nhớ.

Khi số lượng trang nhớ tự do trong hệ thống giảm thấp, hệ điều hành sẽ nỗ lực giải phóng 6 trang nhớ trước khi thực hiện lần chạy tiếp theo Nếu không đủ, nó sẽ cố gắng giải phóng 3 trang Quá trình này sẽ tiếp tục cho đến khi đạt được số trang nhớ tự do cần thiết Kswap sẽ ghi nhớ phương pháp giải phóng trang nhớ đã sử dụng gần nhất và sẽ ưu tiên áp dụng phương pháp đó trong các lần chạy tiếp theo.

Sau khi có đủ trang nhớ tự do, kswapd sẽ trở lại trạng thái sẵn sàng cho đến khi số đếm thời gian về không Nếu số trang tự do trong hệ thống quá thấp, kswapd chỉ duy trì trạng thái sẵn sàng trong một khoảng thời gian bằng một nửa thời gian bình thường Khi số trang tự do tăng lên, kswapd sẽ trở lại trạng thái bình thường.

7.3.1 Phương pháp giảm kích thước các trang và các vùng bộ đệm

Các trang trong vùng trang đệm và vùng bộ đệm là ứng viên lý tưởng để trở thành các trang tự do trong vector free_area Vùng trang đệm lưu trữ các trang của các file đã ánh xạ bộ nhớ, bao gồm cả những trang không còn cần thiết, gây lãng phí bộ nhớ hệ thống Tương tự, vùng bộ đệm cho việc đọc hoặc ghi dữ liệu tới thiết bị vật lý cũng có thể chứa các bộ đệm dữ liệu không còn sử dụng.

Khi bộ nhớ vật lý trong hệ thống đầy, việc loại bỏ các trang khỏi vùng đệm trở nên dễ dàng hơn vì không cần ghi vào thiết bị vật lý, điều này giúp hệ thống hoạt động nhanh hơn Tuy nhiên, việc này cũng làm giảm hiệu suất của tất cả các tiến trình Kswapd liên tục cố gắng giảm kích thước các vùng đệm đã sử dụng bằng cách kiểm tra các trang trong mem_map page vector để xác định những trang có thể được giải phóng Nếu kswapd thực hiện tráo đổi mạnh, kích thước khối tính theo trang sẽ lớn, đặc biệt khi số lượng trang tự do trong hệ thống giảm xuống mức nguy hiểm.

Các khối trang được kiểm tra theo kiểu xoay vòng, với mỗi lần kiểm tra các trang khác nhau nhằm tối thiểu hóa ánh xạ bộ nhớ Thuật toán được sử dụng trong quá trình này là thuật toán clock Đồng thời, một số trang trong toàn bộ vector mem_map sẽ được kiểm tra cùng lúc.

Nếu một trang đã được kiểm tra trước đó, nó sẽ được kiểm tra lại nếu nằm trong vùng bộ đệm Ngược lại, nếu trang không thuộc cả hai vùng này, hệ thống sẽ kiểm tra trang tiếp theo trong vector mem_map.

Khi tất cả các bộ đệm được giải phóng, các trang chứa chúng cũng sẽ được giải phóng Những trang đã được kiểm tra và thuộc vùng trang đệm của Linux sẽ bị loại bỏ khỏi vùng này và trở thành các trang tự do.

Khi hệ thống có đủ trang tự do, kswapd sẽ chờ đến lần chạy tiếp theo để kích hoạt lại Nếu không có trang nào được giải phóng và vẫn thuộc bộ nhớ ảo (các trang đã được lưu trữ), bảng quản lý trang sẽ không được cập nhật.

Nếu không có đủ các trang đã lưu trữ dữ liệu để loại bỏ thì nó sẽ cố gắng tráo đổi một vài trang dùng chung.

7.3.2 Phương pháp tráo đổi các trang nhớ dùng chung System V

Bộ nhớ dùng chung System V là một phương pháp giao tiếp giữa các tiến trình, cho phép hai hoặc nhiều tiến trình chia sẻ bộ nhớ ảo để trao đổi thông tin hiệu quả.

Mỗi vùng nhớ dùng chung trong System V được mô tả bởi cấu trúc dữ liệu shmid_ds, bao gồm con trỏ tới danh sách các cấu trúc vm_area_struct tương ứng với tiến trình chia sẻ vùng nhớ Các cấu trúc vm_area_struct này lưu trữ vị trí của vùng bộ nhớ chia sẻ System V trong bộ nhớ ảo của tiến trình.

Cấu trúc dữ liệu vm_area_struct trong bộ nhớ chia sẻ System V được liên kết với nhau thông qua các con trỏ vm_next_shared và vm_prev_shared Ngoài ra, cấu trúc shmid_ds cũng bao gồm danh sách các phần tử trong bảng quản lý trang, mô tả các trang nhớ vật lý được ánh xạ bởi trang nhớ ảo.

Kswap sử dụng thuật toán clock khi tráo đổi các trang nhớ dùng chung system

V Nó ghi nhớ các trang thuộc vùng bộ nhớ ảo dùng chung mà nó đã tráo đổi gần đây nhất bằng cách giữ 2 chỉ số, chỉ số đầu tiên là một chỉ số so sánh trong tập các cấu trúc dữ liệu shmid_ds, chỉ số thứ 2 là một chỉ số trong danh sách các phần tử trong bảng quản lý trang cho vùng bộ nhớ chia sẻ system V này.

Việc tráo đổi các trang đã nạp

Các trang kiểu dirty trong swap file có thể cần được truy cập lại khi một ứng dụng ghi vào vùng bộ nhớ ảo mà nội dung trước đó đã được lưu trữ trong trang vật lý đã bị trao đổi ra ngoài Lỗi trang xảy ra khi cố gắng truy cập một trang thuộc bộ nhớ ảo không có trong bộ nhớ vật lý.

Mã xử lý lỗi trang tìm kiếm phần tử trong bảng quản lý trang đối với địa chỉ ảo lỗi là một quá trình quan trọng trong hệ điều hành Linux Khi phần tử được tìm thấy cho biết trang đã bị tráo đổi ra ngoài bộ nhớ, Linux sẽ cần tráo đổi trang này trở lại bộ nhớ vật lý Để thực hiện điều này, Linux cần thông tin về vị trí của tệp swap chứa phần tử cần tìm, nhằm nạp lại trang vào bộ nhớ vật lý một cách hiệu quả.

Nó phân phối một trang vật lý tự do và tải lại trang đã bị trao đổi từ tệp swap vào bộ nhớ Thông tin về vị trí của trang trong tệp swap được lấy từ phần tử quản lý trang có thuộc tính không hợp lệ trong bảng quản lý trang.

Khi việc truy cập với thao tác ghi gây ra lỗi trang, trang sẽ bị bỏ lại trong vùng đệm tráo đổi và phần tử quản lý trang đó sẽ mất quyền ghi Nếu trang này được ghi lại sau đó, một lỗi trang khác sẽ xảy ra, khiến trang được đánh dấu là dirty và phần tử quản lý nó bị đẩy khỏi vùng đệm tráo đổi Nếu trang không được ghi tới và cần được tráo đổi lần nữa, Linux có khả năng ngăn chặn việc ghi trang này vào swap file do trang đã tồn tại trong swap file.

Khi truy cập bằng thao tác ghi, trang sẽ được nạp lại từ file swap, dẫn đến việc nó bị di chuyển khỏi vùng đệm tráo đổi Phần tử quản lý trang trong bảng quản lý sẽ được đánh dấu là dirty và sẽ được cấp quyền ghi file.

Ngày đăng: 14/07/2022, 19:49

HÌNH ẢNH LIÊN QUAN

2.1. Một mơ hình tóm tắt về bộ nhớ ảo - IT6025.3(003) K15_nhóm số 4_Nghiên cứu tìm hiểu về quản lý Bộ Nhớ Trong trong HĐH Linux
2.1. Một mơ hình tóm tắt về bộ nhớ ảo (Trang 8)
VD: Hình 1 cho thấy tiến trình X có khung trang ảo 3 và tiến trìn hY có khung trang ảo 1 dùng chung trang vật lý 2. - IT6025.3(003) K15_nhóm số 4_Nghiên cứu tìm hiểu về quản lý Bộ Nhớ Trong trong HĐH Linux
Hình 1 cho thấy tiến trình X có khung trang ảo 3 và tiến trìn hY có khung trang ảo 1 dùng chung trang vật lý 2 (Trang 13)
CHƯƠNG 6: CÁC BẢNG QUẢN LÝ TRANG TRONG LINUX - IT6025.3(003) K15_nhóm số 4_Nghiên cứu tìm hiểu về quản lý Bộ Nhớ Trong trong HĐH Linux
6 CÁC BẢNG QUẢN LÝ TRANG TRONG LINUX (Trang 17)
Hình 3. Cấu trúc dữ liệu free_area - IT6025.3(003) K15_nhóm số 4_Nghiên cứu tìm hiểu về quản lý Bộ Nhớ Trong trong HĐH Linux
Hình 3. Cấu trúc dữ liệu free_area (Trang 19)
Hình 4. Các vùng của bộ nhớ ảo - IT6025.3(003) K15_nhóm số 4_Nghiên cứu tìm hiểu về quản lý Bộ Nhớ Trong trong HĐH Linux
Hình 4. Các vùng của bộ nhớ ảo (Trang 21)
Hình 5. Vùng trang đệm của Linux - IT6025.3(003) K15_nhóm số 4_Nghiên cứu tìm hiểu về quản lý Bộ Nhớ Trong trong HĐH Linux
Hình 5. Vùng trang đệm của Linux (Trang 24)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w