Quản lý bộ nhớ ảo | Bài tập lớn kết thúc học phần Hệ điều hành | Trường Đại học Phenikaa

Linux có khả năng hỗ trợ bộ nhớ ảo, điều này có nghĩa là nó có thể sử dụng một phần của đĩa như là RAM để mở rộng dung lượng bộ nhớ. Kernel sẽ tự động ghi nội dung của các phần bộ nhớ không sử dụng lên đĩa cứng, giải phóng bộ nhớ cho các mục đích khác. Khi cần thiết, những nội dung này có thể được đọc trở lại vào bộ nhớ. Linux có khả năng sử dụng một tệp thông thường trong hệ thống tệp hoặc một phân vùng riêng để thực hiện không gian hoán đổi. Tài liệu giúp bạn tham khảo, ôn tập và đạt kết quả cao. Mời bạn đón xem.

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC PHENIKAA
BÁO CÁO BÀI TẬP LỚN
HỌC PHẦN HỆ ĐIỀU HÀNH
TÊN ĐỀ TÀI
Nguyễn Văn A
Mã sinh viên:
1234455
Ngành học:
Công nghệ thông tin/...
Khóa:
K14/K15/....
Tên lớp:
CNTT1/CNTT2/...
Hà Nội, Năm 2023
MỤC LỤC
LỜI MỞ ĐẦU……………………………………………………………………1
Chương I: QUẢN LÝ BỘ NHỚ ẢO, KHÔNG GIAN HOÁN ĐỔI
I. Khái niệm bộ nhớ ảo, không gian hoán đổi ................................................ 4
II. Mô hình bộ nhớ ảo ....................................................................................... 4
III. Tạo không gian hoán đổi ........................................................................... 8
IV. Sử dụng không gian hoán đổi .................................................................. 10
V. Định vị không gian hoán đổi ...................................................................... 11
Tài liệu tham khảo……………………………………………………………...11
LỜI MỞ ĐẦU
Trong những năm gần đây, Linux đã tạo ra một cuộc cách mạng đáng kể trong
lĩnh vực máy tính. Sự tiến triển và những đóng góp mà nó mang lại cho máy tính
là đáng kinh ngạc: một hệ điều hành đa nhiệm và đa người dùng. Linux có khả
năng hoạt động trên nhiều bộ xử lý khác nhau như Intel, Motorola, MC68K, Dec
Alpha, và tương tác tốt với các hệ điều hành như Apple, Microsoft và Novell.
Không tình cờ mà ngành công nghệ thông tin Việt Nam đã lựa chọn Linux làm hệ
điều hành cơ sở cho các ứng dụng chủ đạo trong lĩnh vực kinh tế và quốc phòng.
Với mã nguồn mở, việc sử dụng Linux mang lại sự an toàn cao hơn so với các
ứng dụng Windows. Linux cung cấp lợi ích kinh tế bằng cách cung cấp nhiều
phần mềm miễn phí. Mã nguồn mở của hệ điều hành và các chương trình trên
Linux là tài nguyên quý giá để nâng cao kỹ năng lập trình, điều mà không phải là
điều có sẵn đối với ứng dụng Windows.
Trong dự án này, chúng ta sẽ tìm hiểu về một khía cạnh quan trọng của hệ điều
hành Linux, đó là quản lý bộ nhớ. Một hệ điều hành muốn hoạt động ổn định cần
phải có một cơ chế quản lý bộ nhớ hiệu quả. Chi tiết về cơ chế này sẽ được trình
bày trong dự án, đi kèm với các ví dụ minh họa.
CHƯƠNG I: CƠ CHẾ QUẢN LÝ BỘ NHỚ ẢO TRONG LINUX
I. Khái niệm bộ nhớ ảo, không gian hoán đổi
Linux có khả năng hỗ trợ bộ nhớ ảo, điều này có nghĩa là nó có thể sử dụng
một phần của đĩa như là RAM để mở rộng dung lượng bộ nhớ. Kernel sẽ tự động
ghi nội dung của các phần bộ nhớ không sử dụng lên đĩa cứng, giải phóng bộ nhớ
cho các mục đích khác. Khi cần thiết, những nội dung này có thể được đọc trở lại
vào bộ nhớ.
Dù việc sử dụng bộ nhớ ảo giúp tăng dung lượng sẵn có mà không làm ảnh
hưởng đến trải nghiệm người sử dụng và chương trình chạy, tuy nhiên, cần lưu ý
rằng việc đọc và ghi dữ liệu lên đĩa cứng chậm hơn nhiều so với sử dụng bộ nhớ
thực tế, với mức chậm khoảng một nghìn lần. Phần không gian trên đĩa cứng được
sử dụng như là không gian hoán đổi.
Linux có khả năng sử dụng một tệp thông thường trong hệ thống tệp hoặc
một phân vùng riêng để thực hiện không gian hoán đổi. Một phân vùng swap có
thể mang lại hiệu suất nhanh hơn, nhưng nó cũng đồng nghĩa với việc thay đổi
kích thước của nó có thể phức tạp hơn so với việc chỉnh sửa một tệp swap.
Khi bạn đã biết dung lượng không gian hoán đổi cần thiết, bạn có thể quyết
định bắt đầu tạo một phân vùng swap. Tuy nhiên, nếu bạn chưa chắc chắn về dung
lượng cần thiết, việc sử dụng một tệp swap trước là một giải pháp khôn ngoan.
Thay vào đó, bạn có thể sử dụng hệ thống trong khoảng thời gian để đảm bảo rằng
bạn đã xác định đúng dung lượng không gian hoán đổi cần thiết, sau đó mới quyết
định tạo phân vùng swap.
II. Mô hình bộ nhớ ảo
Trước khi chúng ta khám phá các phương thức mà Linux sử dụng để hỗ trợ
bộ nhớ ảo, hãy đặt tầm quan trọng vào mô hình trừu tượng của hệ điều hành này.
Khi một chương trình được thực hiện, bộ xử lý đọc một lệnh từ bộ nhớ và tiến
hành giải mã. Trong quá trình giải mã này, bộ xử lý có thể cần truy cập bộ nhớ để
lấy dữ liệu hoặc lưu trữ nó tại một vị trí cụ thể. Sau đó, bộ xử lý tiếp tục thực hiện
lệnh và di chuyển đến lệnh tiếp theo trong chương trình. Do đó, việc truy cập bộ
nhớ để đọc lệnh hoặc thực hiện thao tác lưu trữ dữ liệu là một quá trình liên tục và
không ngừng.
Đối với hệ điều hành Linux, tất cả các địa chỉ trong bộ nhớ ảo đều là địa chỉ
ảo, không phải địa chỉ vật lý. Bộ xử lý thực hiện quá trình chuyển đổi này bằng
cách sử dụng thông tin từ các bảng quản lý được tạo và duy trì bởi hệ điều hành.
Để tạo điều kiện thuận lợi cho quá trình chuyển đổi này, bộ nhớ ảo và bộ nhớ
vật lý được chia thành các đơn vị gọi là trang, mỗi trang có kích thước đồng đều.
Điều này giúp quản lý bộ nhớ hiệu quả và giảm độ phức tạp của quá trình chuyển
đổi địa chỉ. Ví dụ, trên hệ thống Alpha AXP, Linux sử dụng trang kích thước
8Kbyte, trong khi trên hệ thống Intel x86, trang thường có kích thước 4Kbyte.
Mỗi trang được liên kết với một số khung trang duy nhất (PFN - Page Frame
Number) để xác định vị trí vật lý tương ứng trong bộ nhớ.
Mô hình trừu tượng của sự ánh xạ từ địa chỉ ảo đến địa chỉ vật lý
Mô hình này sử dụng địa chỉ ảo để quản lý bộ nhớ và thực hiện việc chuyển đổi từ
địa chỉ ảo sang địa chỉ vật lý. Địa chỉ ảo được chia thành hai phần: địa chỉ offset
và số khung trang ảo. Kích thước trang được xác định là 4Kbyte, do đó, từ bit 0
đến bit 11 của địa chỉ ảo chứa địa chỉ offset, còn từ bit 12 trở lên là số khung trang
ảo.
Khi bộ xử lý gặp một địa chỉ ảo, nó phải trích xuất địa chỉ offset và số khung
trang ảo. Để thực hiện việc này, bộ xử lý sử dụng bảng trang. Bảng trang giúp ánh
xạ từ số khung trang ảo sang số khung trang vật lý. Sau khi xác định được số
khung trang vật lý, bộ xử lý sẽ truy cập vào vị trí tương ứng trong trang vật lý đó,
sử dụng địa chỉ offset.
Quá trình này giúp bộ xử lý ảo hóa bộ nhớ, cho phép mỗi tiến trình có thể hoạt
động với bộ nhớ ảo của riêng mình mà không cần biết về bộ nhớ vật lý thực sự.
Bảng trang đóng vai trò quan trọng trong việc quản lý ánh xạ giữa địa chỉ ảo và
địa chỉ vật lý.
Hình trên chỉ ra không gian địa chỉ ảo của hai tiến trình X và Y, mỗi tiến trình có
một bảng trang riêng. Các bảng trang này ánh xạ trang ảo của mỗi tiến trình vào
trang vật lý trong bộ nhớ. Khung trang áo số 0 của tiến trình X được ánh xạ vào
bộ nhớ tại khung trang vật lý số 1 và khung trang ảo số 1 của tiên trình Y được
ánh xạ vào khung trang vật lý số 4. Mỗi mục trong bàng trang theo lý thuyết là
chứa những thông tin sau :
Cờ Hợp Lệ (Valid Bit): Đây là một bit đánh dấu xem mục trong bảng trang
có hợp lệ hay không. Nếu cờ này được đặt là 1, nghĩa là mục đó là hợp lệ và có
thể sử dụng để ánh xạ địa chỉ ảo. Ngược lại, nếu cờ này là 0, mục đó không hợp lệ
và không thể sử dụng.
Số Khung Trang Vật Lý (Physical Frame Number): Đây là thông tin quan
trọng nhất, xác định số khung trang vật lý mà mục này ánh xạ đến trong bộ nhớ.
Khi cần truy cập dữ liệu tại một địa chỉ ảo, số khung trang vật lý này sẽ được sử
dụng để xác định vị trí trong bộ nhớ vật lý.
Thông Tin Điều Khiển Truy Cập (Access Control Information): Thông tin
này mô tả cách mà trang được sử dụng. Nó bao gồm các thuộc tính như:
1. Quyền Ghi (Write Permission): Cho biết liệu trang có thể được ghi hay
không. Nếu được đặt là 1, nghĩa là trang có thể được ghi. Ngược lại, nếu là 0,
trang chỉ có quyền đọc.
2. Chứa Đoạn Mã Thực Thi (Executable): Xác định xem trang có chứa đoạn
mã thực thi hay không. Nếu là 1, trang có thể chứa mã thực thi, và nếu là 0, trang
không chứa mã thực thi.
Thông tin này giúp bộ xử lý quản lý quyền truy cập và kiểm soát việc truy cập
vào các trang trong không gian địa chỉ ảo của các tiến trình.
Khi bảng trang được truy cập, số khung trang ảo thường được sử dụng như một
địa chỉ offset để xác định vị trí cụ thể trong bảng. Trong trường hợp này, nếu
khung trang ảo số 5 được sử dụng, nó sẽ tương ứng với phần tử số 6 của bảng
trang (bắt đầu từ 0), với giả định rằng số khung trang ảo được sử dụng như là địa
chỉ offset.
Điều này giúp bộ xử lý nhanh chóng xác định được mục trong bảng trang tương
ứng với địa chỉ ảo mà nó đang xử lý, từ đó có thể trích xuất thông tin cần thiết
như số khung trang vật lý và các thuộc tính khác để thực hiện ánh xạ địa chỉ ảo
sang địa chỉ vật lý trong bộ nhớ.
Để chuyển từ địa chỉ ảo sang địa chỉ vật lý, bộ xử lý trước hết tiến hành xử lý số
khung trang ảo và địa chỉ offset trong trang ảo tương ứng. Trong bối cảnh của Mô
hình trừu tượng phía trên và giả định kích thước trang là 0x2000 byte, giả sử có
một địa chỉ ảo là 0x2194 thuộc không gian địa chỉ ảo của tiến trình Y. Bộ xử lý sẽ
chuyển địa chỉ này thành địa chỉ offset 0x194 vào khung trang áo số 1.
Bộ xử lý sử dụng số khung trang ảo như một chỉ số để truy xuất vào bảng trang
của tiến trình. Nếu mục tương ứng trong bảng trang, tại địa chỉ offset đó, là hợp
lệ, bộ xử lý sẽ lấy số khung trang vật lý từ mục này. Trái lại, nếu mục này không
hợp lệ, tiến trình sẽ cố truy cập vào một vùng bộ nhớ ảo không tồn tại. Trong tình
huống này, bộ xử lý không thể xử lý địa chỉ này và chuyển quyền điều khiển cho
hệ điều hành để xử lý lỗi.
Bộ xử lý thông báo lỗi trang cho hệ điều hành khi một tiến trình cố gắng truy cập
vào địa chỉ ảo không hợp lệ. Hệ điều hành sau đó được thông báo về địa chỉ ảo
gây ra lỗi và nguyên nhân của lỗi trang.
Nếu địa chỉ ảo là hợp lệ, bộ xử lý sẽ lấy số khung trang vật lý tương ứng và nhân
nó với kích thước trang để xác định địa chỉ của trang cơ sở trong bộ nhớ vật lý.
Sau đó, bộ xử lý cộng thêm địa chỉ offset để có được địa chỉ vật lý cuối cùng cho
lệnh hoặc dữ liệu cần truy cập.
Ví dụ, với khung trang áo số 1 của tiến trình Y ánh xạ đến khung trang vật lý số 4,
bắt đầu từ địa chỉ 0x8000 (4 x 0x2000). Khi cộng thêm địa chỉ offset 0x194, ta có
địa chỉ vật lý cuối cùng là 0x8194.
Cách ánh xạ địa chỉ ảo và địa chỉ vật lý này cho phép bộ nhớ ảo được ánh xạ vào
bộ nhớ vật lý của hệ thống theo bất kỳ thứ tự nào. Ví dụ, trong Hình 3, khung
trang ảo số 0 của tiến trình X ánh xạ đến khung trang vật lý số 1, trong khi khung
trang ảo số 7 ánh xạ đến khung trang vật lý số 0, mặc dù nó có địa chỉ ảo cao hơn
khung trang ảo số 0 trong bộ nhớ ảo. Điều này làm rõ một điểm thú vị về bộ nhớ
ảo: các trang trong bộ nhớ ảo không theo một thứ tự cố định nào khi được hiển thị
trong bộ nhớ vật lý.
III. Tạo không gian hoán đổi
Một tệp swap được xem xét như một tệp thông thường đối với kernel, không
có đặc điểm nổi bật. Điều duy nhất quan trọng là nó không chứa bất kỳ vùng
trồng nào, điều này là quan trọng để đảm bảo tính hiệu quả khi sử dụng hàm
mkswap(). Tệp swap thường cần tồn tại trên đĩa cục bộ để đáp ứng yêu cầu của hệ
thống và kernel khi thực hiện các hoạt động swap.
Bit về các vùng trống là vô cùng quan trọng. Tệp swap đặc biệt dành không
gian trên đĩa để giúp kernel nhanh chóng đưa trang ra ngoài mà không cần thực
hiện mọi bước tìm kiếm disk sector cho một tệp. Sự hiện diện của vùng trồng
trong một tệp swap có ý nghĩa là không có disk sector được đặt riêng biệt, từ đó
kernel không thể sử dụng tệp đó.
Để tạo một tệp swap mà không có vùng trống, bạn có thể sử dụng lệnh sau:
$ dd if=/dev/zero of=/extra-swap bs=1024 count=1024
1024+0 records in
1024+0 records out
Trong đó, /extra-swap là tên của tệp swap và kích thước được xác định bởi tham
số count=. Đối với kích thước tốt nhất, bạn nên chọn một bội số của 4, vì kernel
thường ghi trang nhớ với kích thước 4 Kbyte. Nếu kích thước không phải là bội
số của 4, có thể có những phần nhỏ không được sử dụng cuối cùng của tệp swap.
Một phân vùng swap thông thường cũng không có gì đặc biệt. Bạn có thể tạo
nó giống như các phân vùng khác, nhưng điều khác biệt là nó được sử dụng như
một phân vùng thô, không chứa bất kỳ tệp hệ thống nào. Phân vùng swap thường
được đánh dấu với loại 82 (Linux swap), điều này không làm thay đổi cách kernel
hoạt động, nhưng giúp việc liệt kê phân vùng trở nên rõ ràng hơn khi bạn kiểm tra
thông tin phân vùng trên hệ thống.
Sau khi bạn tạo một phân vùng swap hoặc một tệp swap, bước tiếp theo là ghi
một chữ ký lên nơi bắt đầu của nó. Chữ ký này chứa thông tin quản lý quan trọng
được sử dụng bởi kernel. Bạn có thể thực hiện điều này bằng cách sử dụng hàm
mkswap(), như sau: $ mkswap /extra-swap 1024
Setting up swapspace, size = 1044480 bytes
$
Lưu ý rằng không gian hoán đổi vẫn chưa được sử dụng ngay sau khi bạn thực
hiện lệnh này; nó tồn tại nhưng kernel chưa sử dụng nó để cung cấp bộ nhớ ảo.
Cần chú ý khi sử dụng hàm mkswap(), vì nó không kiểm tra xem tệp hoặc
phân vùng này đã được sử dụng hay chưa. Việc này có thể dẫn đến việc ghi đè lên
thông tin quan trọng hoặc phân vùng quan trọng nếu bạn không cẩn thận. Do đó,
bạn nên chỉ sử dụng hàm này khi cài đặt lên hệ thống của mình.
Giới hạn kích thước cho mỗi không gian hoán đổi trong Linux thường được
giới hạn là 127MB, tuy nhiên, bạn có thể sử dụng đồng thời tới 8 không gian hoán
đổi, nâng tổng kích thước lên đến 1GB. Tuy nhiên, thông tin này có thể đã thay
đổi với các phiên bản kernel mới hơn, vì vậy, giới hạn cụ thể có thể thay đổi tùy
thuộc vào cấu hình cụ thể của kernel. Ví dụ, trên bộ xử lý i386, giới hạn có thể là
2GB.
IV. Sử dụng không gian hoán đổi
Sau khi tạo một không gian hoán đổi, để sử dụng nó, bạn cần thông báo cho
kernel thông qua lệnh swapon. Đường dẫn đến không gian hoán đổi được chuyển
làm đối số.
Ví dụ, để bắt đầu sử dụng một tệp swap tạm thời, bạn có thể sử dụng lệnh:
$ swapon /extra-swap
Không gian hoán đổi cũng có thể được tự động sử dụng bằng cách liệt kê chúng
trong tệp /etc/fstab. Dưới đây là một ví dụ về cách khai báo một phân vùng swap
trong tệp /etc/fstab:
/extra-swap none swap sw 0 0
Lệnh swapon -a được sử dụng trong quá trình khởi động để bắt đầu hoán đổi trên
tất cả các không gian hoán đổi được liệt kê trong tệp /etc/fstab. Do đó, lệnh
swapon thường chỉ được sử dụng khi cần thêm không gian hoán đổi.
Để quản lý việc sử dụng không gian hoán đổi, bạn có thể sử dụng lệnh free. Lệnh
này hiển thị tổng số không gian hoán đổi, không gian đã sử dụng, và không gian
còn trống. $ free
total used free shared buff/cache available
Mem: 15152 14896 256 2528 12404 12404
Swap: 32452 6684 25768
Để loại bỏ một không gian hoán đổi, bạn có thể sử dụng lệnh swapoff. Tuy nhiên,
cần lưu ý rằng không nên sử dụng lệnh này trừ khi bạn chắc chắn rằng không gian
hoán đổi không còn được sử dụng. Điều này có thể kiểm tra bằng lệnh free để
đảm bảo có đủ bộ nhớ vật lý trống trước khi loại bỏ không gian hoán đổi.
Tất cả các không gian hoán đổi được sử dụng tự động bằng lệnh swapon -a
có thể được loại bỏ đồng thời bằng lệnh swapoff -a. Lệnh này tự động tìm kiếm
thông tin trong tệp /etc/fstab để xác định và loại bỏ các không gian hoán đổi. Các
không gian hoán đổi được quản lý thủ công vẫn có thể được loại bỏ bình thường.
Đôi khi, có thể có nhiều không gian hoán đổi được sử dụng mặc dù có đủ bộ nhớ
vật lý trống. Điều này có thể xảy ra nếu có nhu cầu hoán đổi tạm thời, nhưng sau
đó một tiến trình lớn giải phóng nhiều bộ nhớ vật lý. Dữ liệu đã đưa ra sẽ không
được đưa vào ngay lập tức, dẫn đến việc bộ nhớ vật lý còn trống một thời gian
dài. Mặc dù có thể không cần phải lo lắng về điều này, bạn nên hiểu rõ cách hoạt
động để hiểu tình trạng hệ thống của mình.
V. Định vị không gian hoán đổi
Khi xác định kích thước không gian hoán đổi, quá trình này không chỉ là về
việc đặt một con số gấp đôi bộ nhớ vật lý. Dưới đây là một phân tích chi tiết để
xác định kích thước không gian hoán đổi một cách hiệu quả:
1. Dự đoán tổng bộ nhớ cần thiết:
Sử dụng lệnh free để theo dõi tình trạng bộ nhớ và đảm bảo bạn hiểu rõ mức
tiêu thụ bộ nhớ bởi các quá trình đang chạy.
Sử dụng lệnh ps để xem thông tin chi tiết về từng quá trình, bao gồm bộ nhớ
được sử dụng.
Ước lượng tổng bộ nhớ cần cho các ứng dụng và dịch vụ mà bạn dự kiến
chạy cùng một lúc.
2. Thêm một lượng dự phòng:
Dựa trên kinh nghiệm và sự hiểu biết về các yếu tố không dự kiến, thêm một
phần nhỏ vào ước lượng từ bước 1. Điều này giúp đảm bảo không gian hoán đổi
có thể chứa đựng các hoạt động bất ngờ mà không gây ra sự cạn kiệt bộ nhớ.
3. Tính tổng kích thước không gian hoán đổi:
Sử dụng tổng bộ nhớ dự kiến từ bước 2 và trừ đi bộ nhớ vật lý trên hệ thống.
Kết quả sẽ là kích thước không gian hoán đổi cần thiết.
4. Kiểm tra và điều chỉnh:
Nếu kích thước không gian hoán đổi tính toán lớn hơn hai lần bộ nhớ vật lý,
đây có thể là dấu hiệu của việc sử dụng quá mức không gian hoán đổi. Trong
trường hợp này, nên xem xét việc nâng cấp RAM để cải thiện hiệu suất hệ
thống.
5. Dựa trên hiệu suất thực tế:
Sử dụng công cụ giám sát như vmstat để theo dõi hiệu suất hệ thống thực tế,
đặc biệt là các hoạt động liên quan đến không gian hoán đổi.
Dựa vào thông tin này để điều chỉnh kích thước không gian hoán đổi nếu cần
thiết.
Tóm lại, việc xác định kích thước không gian hoán đổi là một quá trình động và
yêu cầu sự hiểu biết vững về yêu cầu của hệ thống cũng như môi trường chạy các
ứng dụng và dịch vụ.
Tài Liệu Tham Khảo
1. Linux Kernel - Đỗ Duy Việt, Nguyễn Hoàng Thanh
2. https://vi.wikipedia.org/wiki/Bộ_nhớ_ảo
3. https://en.wikipedia.org/wiki/Linux_kernel
4. https://en.wikipedia.org/wiki/ Manual_memory_management
5. tailieuxanh_quan_ly_bo_nho_trong_linux
| 1/13

Preview text:


BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC PHENIKAA
BÁO CÁO BÀI TẬP LỚN
HỌC PHẦN HỆ ĐIỀU HÀNH TÊN ĐỀ TÀI
Họ và tên sinh viên: Nguyễn Văn A
Mã sinh viên: 1234455
Ngành học: Công nghệ thông tin/... Khóa: K14/K15/....
Tên lớp: CNTT1/CNTT2/... Hà Nội, Năm 2023 MỤC LỤC
LỜI MỞ ĐẦU……………………………………………………………………1
Chương I: QUẢN LÝ BỘ NHỚ ẢO, KHÔNG GIAN HOÁN ĐỔI
I. Khái niệm bộ nhớ ảo, không gian hoán đổi ................................................ 4
II. Mô hình bộ nhớ ảo ....................................................................................... 4
III. Tạo không gian hoán đổi ........................................................................... 8
IV. Sử dụng không gian hoán đổi .................................................................. 10
V. Định vị không gian hoán đổi ...................................................................... 11
Tài liệu tham khảo……………………………………………………………...11 LỜI MỞ ĐẦU
Trong những năm gần đây, Linux đã tạo ra một cuộc cách mạng đáng kể trong
lĩnh vực máy tính. Sự tiến triển và những đóng góp mà nó mang lại cho máy tính
là đáng kinh ngạc: một hệ điều hành đa nhiệm và đa người dùng. Linux có khả
năng hoạt động trên nhiều bộ xử lý khác nhau như Intel, Motorola, MC68K, Dec
Alpha, và tương tác tốt với các hệ điều hành như Apple, Microsoft và Novell.
Không tình cờ mà ngành công nghệ thông tin Việt Nam đã lựa chọn Linux làm hệ
điều hành cơ sở cho các ứng dụng chủ đạo trong lĩnh vực kinh tế và quốc phòng.
Với mã nguồn mở, việc sử dụng Linux mang lại sự an toàn cao hơn so với các
ứng dụng Windows. Linux cung cấp lợi ích kinh tế bằng cách cung cấp nhiều
phần mềm miễn phí. Mã nguồn mở của hệ điều hành và các chương trình trên
Linux là tài nguyên quý giá để nâng cao kỹ năng lập trình, điều mà không phải là
điều có sẵn đối với ứng dụng Windows.
Trong dự án này, chúng ta sẽ tìm hiểu về một khía cạnh quan trọng của hệ điều
hành Linux, đó là quản lý bộ nhớ. Một hệ điều hành muốn hoạt động ổn định cần
phải có một cơ chế quản lý bộ nhớ hiệu quả. Chi tiết về cơ chế này sẽ được trình
bày trong dự án, đi kèm với các ví dụ minh họa.
CHƯƠNG I: CƠ CHẾ QUẢN LÝ BỘ NHỚ ẢO TRONG LINUX
I. Khái niệm bộ nhớ ảo, không gian hoán đổi
Linux có khả năng hỗ trợ bộ nhớ ảo, điều này có nghĩa là nó có thể sử dụng
một phần của đĩa như là RAM để mở rộng dung lượng bộ nhớ. Kernel sẽ tự động
ghi nội dung của các phần bộ nhớ không sử dụng lên đĩa cứng, giải phóng bộ nhớ
cho các mục đích khác. Khi cần thiết, những nội dung này có thể được đọc trở lại vào bộ nhớ.
Dù việc sử dụng bộ nhớ ảo giúp tăng dung lượng sẵn có mà không làm ảnh
hưởng đến trải nghiệm người sử dụng và chương trình chạy, tuy nhiên, cần lưu ý
rằng việc đọc và ghi dữ liệu lên đĩa cứng chậm hơn nhiều so với sử dụng bộ nhớ
thực tế, với mức chậm khoảng một nghìn lần. Phần không gian trên đĩa cứng được
sử dụng như là không gian hoán đổi.
Linux có khả năng sử dụng một tệp thông thường trong hệ thống tệp hoặc
một phân vùng riêng để thực hiện không gian hoán đổi. Một phân vùng swap có
thể mang lại hiệu suất nhanh hơn, nhưng nó cũng đồng nghĩa với việc thay đổi
kích thước của nó có thể phức tạp hơn so với việc chỉnh sửa một tệp swap.
Khi bạn đã biết dung lượng không gian hoán đổi cần thiết, bạn có thể quyết
định bắt đầu tạo một phân vùng swap. Tuy nhiên, nếu bạn chưa chắc chắn về dung
lượng cần thiết, việc sử dụng một tệp swap trước là một giải pháp khôn ngoan.
Thay vào đó, bạn có thể sử dụng hệ thống trong khoảng thời gian để đảm bảo rằng
bạn đã xác định đúng dung lượng không gian hoán đổi cần thiết, sau đó mới quyết
định tạo phân vùng swap.
II. Mô hình bộ nhớ ảo
Trước khi chúng ta khám phá các phương thức mà Linux sử dụng để hỗ trợ
bộ nhớ ảo, hãy đặt tầm quan trọng vào mô hình trừu tượng của hệ điều hành này.
Khi một chương trình được thực hiện, bộ xử lý đọc một lệnh từ bộ nhớ và tiến
hành giải mã. Trong quá trình giải mã này, bộ xử lý có thể cần truy cập bộ nhớ để
lấy dữ liệu hoặc lưu trữ nó tại một vị trí cụ thể. Sau đó, bộ xử lý tiếp tục thực hiện
lệnh và di chuyển đến lệnh tiếp theo trong chương trình. Do đó, việc truy cập bộ
nhớ để đọc lệnh hoặc thực hiện thao tác lưu trữ dữ liệu là một quá trình liên tục và không ngừng.
Đối với hệ điều hành Linux, tất cả các địa chỉ trong bộ nhớ ảo đều là địa chỉ
ảo, không phải địa chỉ vật lý. Bộ xử lý thực hiện quá trình chuyển đổi này bằng
cách sử dụng thông tin từ các bảng quản lý được tạo và duy trì bởi hệ điều hành.
Để tạo điều kiện thuận lợi cho quá trình chuyển đổi này, bộ nhớ ảo và bộ nhớ
vật lý được chia thành các đơn vị gọi là trang, mỗi trang có kích thước đồng đều.
Điều này giúp quản lý bộ nhớ hiệu quả và giảm độ phức tạp của quá trình chuyển
đổi địa chỉ. Ví dụ, trên hệ thống Alpha AXP, Linux sử dụng trang kích thước
8Kbyte, trong khi trên hệ thống Intel x86, trang thường có kích thước 4Kbyte.
Mỗi trang được liên kết với một số khung trang duy nhất (PFN - Page Frame
Number) để xác định vị trí vật lý tương ứng trong bộ nhớ.
Mô hình trừu tượng của sự ánh xạ từ địa chỉ ảo đến địa chỉ vật lý
Mô hình này sử dụng địa chỉ ảo để quản lý bộ nhớ và thực hiện việc chuyển đổi từ
địa chỉ ảo sang địa chỉ vật lý. Địa chỉ ảo được chia thành hai phần: địa chỉ offset
và số khung trang ảo. Kích thước trang được xác định là 4Kbyte, do đó, từ bit 0
đến bit 11 của địa chỉ ảo chứa địa chỉ offset, còn từ bit 12 trở lên là số khung trang ảo.
Khi bộ xử lý gặp một địa chỉ ảo, nó phải trích xuất địa chỉ offset và số khung
trang ảo. Để thực hiện việc này, bộ xử lý sử dụng bảng trang. Bảng trang giúp ánh
xạ từ số khung trang ảo sang số khung trang vật lý. Sau khi xác định được số
khung trang vật lý, bộ xử lý sẽ truy cập vào vị trí tương ứng trong trang vật lý đó,
sử dụng địa chỉ offset.
Quá trình này giúp bộ xử lý ảo hóa bộ nhớ, cho phép mỗi tiến trình có thể hoạt
động với bộ nhớ ảo của riêng mình mà không cần biết về bộ nhớ vật lý thực sự.
Bảng trang đóng vai trò quan trọng trong việc quản lý ánh xạ giữa địa chỉ ảo và địa chỉ vật lý.
Hình trên chỉ ra không gian địa chỉ ảo của hai tiến trình X và Y, mỗi tiến trình có
một bảng trang riêng. Các bảng trang này ánh xạ trang ảo của mỗi tiến trình vào
trang vật lý trong bộ nhớ. Khung trang áo số 0 của tiến trình X được ánh xạ vào
bộ nhớ tại khung trang vật lý số 1 và khung trang ảo số 1 của tiên trình Y được
ánh xạ vào khung trang vật lý số 4. Mỗi mục trong bàng trang theo lý thuyết là
chứa những thông tin sau :
Cờ Hợp Lệ (Valid Bit): Đây là một bit đánh dấu xem mục trong bảng trang
có hợp lệ hay không. Nếu cờ này được đặt là 1, nghĩa là mục đó là hợp lệ và có
thể sử dụng để ánh xạ địa chỉ ảo. Ngược lại, nếu cờ này là 0, mục đó không hợp lệ và không thể sử dụng.
Số Khung Trang Vật Lý (Physical Frame Number): Đây là thông tin quan
trọng nhất, xác định số khung trang vật lý mà mục này ánh xạ đến trong bộ nhớ.
Khi cần truy cập dữ liệu tại một địa chỉ ảo, số khung trang vật lý này sẽ được sử
dụng để xác định vị trí trong bộ nhớ vật lý.
Thông Tin Điều Khiển Truy Cập (Access Control Information): Thông tin
này mô tả cách mà trang được sử dụng. Nó bao gồm các thuộc tính như:
1. Quyền Ghi (Write Permission): Cho biết liệu trang có thể được ghi hay
không. Nếu được đặt là 1, nghĩa là trang có thể được ghi. Ngược lại, nếu là 0,
trang chỉ có quyền đọc.
2. Chứa Đoạn Mã Thực Thi (Executable): Xác định xem trang có chứa đoạn
mã thực thi hay không. Nếu là 1, trang có thể chứa mã thực thi, và nếu là 0, trang không chứa mã thực thi.
Thông tin này giúp bộ xử lý quản lý quyền truy cập và kiểm soát việc truy cập
vào các trang trong không gian địa chỉ ảo của các tiến trình.
Khi bảng trang được truy cập, số khung trang ảo thường được sử dụng như một
địa chỉ offset để xác định vị trí cụ thể trong bảng. Trong trường hợp này, nếu
khung trang ảo số 5 được sử dụng, nó sẽ tương ứng với phần tử số 6 của bảng
trang (bắt đầu từ 0), với giả định rằng số khung trang ảo được sử dụng như là địa chỉ offset.
Điều này giúp bộ xử lý nhanh chóng xác định được mục trong bảng trang tương
ứng với địa chỉ ảo mà nó đang xử lý, từ đó có thể trích xuất thông tin cần thiết
như số khung trang vật lý và các thuộc tính khác để thực hiện ánh xạ địa chỉ ảo
sang địa chỉ vật lý trong bộ nhớ.
Để chuyển từ địa chỉ ảo sang địa chỉ vật lý, bộ xử lý trước hết tiến hành xử lý số
khung trang ảo và địa chỉ offset trong trang ảo tương ứng. Trong bối cảnh của Mô
hình trừu tượng phía trên và giả định kích thước trang là 0x2000 byte, giả sử có
một địa chỉ ảo là 0x2194 thuộc không gian địa chỉ ảo của tiến trình Y. Bộ xử lý sẽ
chuyển địa chỉ này thành địa chỉ offset 0x194 vào khung trang áo số 1.
Bộ xử lý sử dụng số khung trang ảo như một chỉ số để truy xuất vào bảng trang
của tiến trình. Nếu mục tương ứng trong bảng trang, tại địa chỉ offset đó, là hợp
lệ, bộ xử lý sẽ lấy số khung trang vật lý từ mục này. Trái lại, nếu mục này không
hợp lệ, tiến trình sẽ cố truy cập vào một vùng bộ nhớ ảo không tồn tại. Trong tình
huống này, bộ xử lý không thể xử lý địa chỉ này và chuyển quyền điều khiển cho
hệ điều hành để xử lý lỗi.
Bộ xử lý thông báo lỗi trang cho hệ điều hành khi một tiến trình cố gắng truy cập
vào địa chỉ ảo không hợp lệ. Hệ điều hành sau đó được thông báo về địa chỉ ảo
gây ra lỗi và nguyên nhân của lỗi trang.
Nếu địa chỉ ảo là hợp lệ, bộ xử lý sẽ lấy số khung trang vật lý tương ứng và nhân
nó với kích thước trang để xác định địa chỉ của trang cơ sở trong bộ nhớ vật lý.
Sau đó, bộ xử lý cộng thêm địa chỉ offset để có được địa chỉ vật lý cuối cùng cho
lệnh hoặc dữ liệu cần truy cập.
Ví dụ, với khung trang áo số 1 của tiến trình Y ánh xạ đến khung trang vật lý số 4,
bắt đầu từ địa chỉ 0x8000 (4 x 0x2000). Khi cộng thêm địa chỉ offset 0x194, ta có
địa chỉ vật lý cuối cùng là 0x8194.
Cách ánh xạ địa chỉ ảo và địa chỉ vật lý này cho phép bộ nhớ ảo được ánh xạ vào
bộ nhớ vật lý của hệ thống theo bất kỳ thứ tự nào. Ví dụ, trong Hình 3, khung
trang ảo số 0 của tiến trình X ánh xạ đến khung trang vật lý số 1, trong khi khung
trang ảo số 7 ánh xạ đến khung trang vật lý số 0, mặc dù nó có địa chỉ ảo cao hơn
khung trang ảo số 0 trong bộ nhớ ảo. Điều này làm rõ một điểm thú vị về bộ nhớ
ảo: các trang trong bộ nhớ ảo không theo một thứ tự cố định nào khi được hiển thị trong bộ nhớ vật lý.
III. Tạo không gian hoán đổi
Một tệp swap được xem xét như một tệp thông thường đối với kernel, không
có đặc điểm nổi bật. Điều duy nhất quan trọng là nó không chứa bất kỳ vùng
trồng nào, điều này là quan trọng để đảm bảo tính hiệu quả khi sử dụng hàm
mkswap(). Tệp swap thường cần tồn tại trên đĩa cục bộ để đáp ứng yêu cầu của hệ
thống và kernel khi thực hiện các hoạt động swap.
Bit về các vùng trống là vô cùng quan trọng. Tệp swap đặc biệt dành không
gian trên đĩa để giúp kernel nhanh chóng đưa trang ra ngoài mà không cần thực
hiện mọi bước tìm kiếm disk sector cho một tệp. Sự hiện diện của vùng trồng
trong một tệp swap có ý nghĩa là không có disk sector được đặt riêng biệt, từ đó
kernel không thể sử dụng tệp đó.
Để tạo một tệp swap mà không có vùng trống, bạn có thể sử dụng lệnh sau:
$ dd if=/dev/zero of=/extra-swap bs=1024 count=1024 1024+0 records in 1024+0 records out
Trong đó, /extra-swap là tên của tệp swap và kích thước được xác định bởi tham
số count=. Đối với kích thước tốt nhất, bạn nên chọn một bội số của 4, vì kernel
thường ghi trang nhớ với kích thước 4 Kbyte. Nếu kích thước không phải là bội
số của 4, có thể có những phần nhỏ không được sử dụng cuối cùng của tệp swap.
Một phân vùng swap thông thường cũng không có gì đặc biệt. Bạn có thể tạo
nó giống như các phân vùng khác, nhưng điều khác biệt là nó được sử dụng như
một phân vùng thô, không chứa bất kỳ tệp hệ thống nào. Phân vùng swap thường
được đánh dấu với loại 82 (Linux swap), điều này không làm thay đổi cách kernel
hoạt động, nhưng giúp việc liệt kê phân vùng trở nên rõ ràng hơn khi bạn kiểm tra
thông tin phân vùng trên hệ thống.
Sau khi bạn tạo một phân vùng swap hoặc một tệp swap, bước tiếp theo là ghi
một chữ ký lên nơi bắt đầu của nó. Chữ ký này chứa thông tin quản lý quan trọng
được sử dụng bởi kernel. Bạn có thể thực hiện điều này bằng cách sử dụng hàm
mkswap(), như sau: $ mkswap /extra-swap 1024
Setting up swapspace, size = 1044480 bytes $
Lưu ý rằng không gian hoán đổi vẫn chưa được sử dụng ngay sau khi bạn thực
hiện lệnh này; nó tồn tại nhưng kernel chưa sử dụng nó để cung cấp bộ nhớ ảo.
Cần chú ý khi sử dụng hàm mkswap(), vì nó không kiểm tra xem tệp hoặc
phân vùng này đã được sử dụng hay chưa. Việc này có thể dẫn đến việc ghi đè lên
thông tin quan trọng hoặc phân vùng quan trọng nếu bạn không cẩn thận. Do đó,
bạn nên chỉ sử dụng hàm này khi cài đặt lên hệ thống của mình.
Giới hạn kích thước cho mỗi không gian hoán đổi trong Linux thường được
giới hạn là 127MB, tuy nhiên, bạn có thể sử dụng đồng thời tới 8 không gian hoán
đổi, nâng tổng kích thước lên đến 1GB. Tuy nhiên, thông tin này có thể đã thay
đổi với các phiên bản kernel mới hơn, vì vậy, giới hạn cụ thể có thể thay đổi tùy
thuộc vào cấu hình cụ thể của kernel. Ví dụ, trên bộ xử lý i386, giới hạn có thể là 2GB.
IV. Sử dụng không gian hoán đổi
Sau khi tạo một không gian hoán đổi, để sử dụng nó, bạn cần thông báo cho
kernel thông qua lệnh swapon. Đường dẫn đến không gian hoán đổi được chuyển làm đối số.
Ví dụ, để bắt đầu sử dụng một tệp swap tạm thời, bạn có thể sử dụng lệnh: $ swapon /extra-swap
Không gian hoán đổi cũng có thể được tự động sử dụng bằng cách liệt kê chúng
trong tệp /etc/fstab. Dưới đây là một ví dụ về cách khai báo một phân vùng swap trong tệp /etc/fstab: /extra-swap none swap sw 0 0
Lệnh swapon -a được sử dụng trong quá trình khởi động để bắt đầu hoán đổi trên
tất cả các không gian hoán đổi được liệt kê trong tệp /etc/fstab. Do đó, lệnh
swapon thường chỉ được sử dụng khi cần thêm không gian hoán đổi.
Để quản lý việc sử dụng không gian hoán đổi, bạn có thể sử dụng lệnh free. Lệnh
này hiển thị tổng số không gian hoán đổi, không gian đã sử dụng, và không gian còn trống. $ free
total used free shared buff/cache available
Mem: 15152 14896 256 2528 12404 12404 Swap: 32452 6684 25768
Để loại bỏ một không gian hoán đổi, bạn có thể sử dụng lệnh swapoff. Tuy nhiên,
cần lưu ý rằng không nên sử dụng lệnh này trừ khi bạn chắc chắn rằng không gian
hoán đổi không còn được sử dụng. Điều này có thể kiểm tra bằng lệnh free để
đảm bảo có đủ bộ nhớ vật lý trống trước khi loại bỏ không gian hoán đổi.
Tất cả các không gian hoán đổi được sử dụng tự động bằng lệnh swapon -a
có thể được loại bỏ đồng thời bằng lệnh swapoff -a. Lệnh này tự động tìm kiếm
thông tin trong tệp /etc/fstab để xác định và loại bỏ các không gian hoán đổi. Các
không gian hoán đổi được quản lý thủ công vẫn có thể được loại bỏ bình thường.
Đôi khi, có thể có nhiều không gian hoán đổi được sử dụng mặc dù có đủ bộ nhớ
vật lý trống. Điều này có thể xảy ra nếu có nhu cầu hoán đổi tạm thời, nhưng sau
đó một tiến trình lớn giải phóng nhiều bộ nhớ vật lý. Dữ liệu đã đưa ra sẽ không
được đưa vào ngay lập tức, dẫn đến việc bộ nhớ vật lý còn trống một thời gian
dài. Mặc dù có thể không cần phải lo lắng về điều này, bạn nên hiểu rõ cách hoạt
động để hiểu tình trạng hệ thống của mình.
V. Định vị không gian hoán đổi
Khi xác định kích thước không gian hoán đổi, quá trình này không chỉ là về
việc đặt một con số gấp đôi bộ nhớ vật lý. Dưới đây là một phân tích chi tiết để
xác định kích thước không gian hoán đổi một cách hiệu quả:
1. Dự đoán tổng bộ nhớ cần thiết:
• Sử dụng lệnh free để theo dõi tình trạng bộ nhớ và đảm bảo bạn hiểu rõ mức
tiêu thụ bộ nhớ bởi các quá trình đang chạy.
• Sử dụng lệnh ps để xem thông tin chi tiết về từng quá trình, bao gồm bộ nhớ được sử dụng.
• Ước lượng tổng bộ nhớ cần cho các ứng dụng và dịch vụ mà bạn dự kiến chạy cùng một lúc.
2. Thêm một lượng dự phòng:
Dựa trên kinh nghiệm và sự hiểu biết về các yếu tố không dự kiến, thêm một
phần nhỏ vào ước lượng từ bước 1. Điều này giúp đảm bảo không gian hoán đổi
có thể chứa đựng các hoạt động bất ngờ mà không gây ra sự cạn kiệt bộ nhớ.
3. Tính tổng kích thước không gian hoán đổi:
• Sử dụng tổng bộ nhớ dự kiến từ bước 2 và trừ đi bộ nhớ vật lý trên hệ thống.
Kết quả sẽ là kích thước không gian hoán đổi cần thiết.
4. Kiểm tra và điều chỉnh:
• Nếu kích thước không gian hoán đổi tính toán lớn hơn hai lần bộ nhớ vật lý,
đây có thể là dấu hiệu của việc sử dụng quá mức không gian hoán đổi. Trong
trường hợp này, nên xem xét việc nâng cấp RAM để cải thiện hiệu suất hệ thống.
5. Dựa trên hiệu suất thực tế:
• Sử dụng công cụ giám sát như vmstat để theo dõi hiệu suất hệ thống thực tế,
đặc biệt là các hoạt động liên quan đến không gian hoán đổi.
• Dựa vào thông tin này để điều chỉnh kích thước không gian hoán đổi nếu cần thiết.
Tóm lại, việc xác định kích thước không gian hoán đổi là một quá trình động và
yêu cầu sự hiểu biết vững về yêu cầu của hệ thống cũng như môi trường chạy các ứng dụng và dịch vụ.
Tài Liệu Tham Khảo
1. Linux Kernel - Đỗ Duy Việt, Nguyễn Hoàng Thanh
2. https://vi.wikipedia.org/wiki/Bộ_nhớ_ảo
3. https://en.wikipedia.org/wiki/Linux_kernel
4. https://en.wikipedia.org/wiki/ Manual_memory_management
5. tailieuxanh_quan_ly_bo_nho_trong_linux