BÀI TẬP LỚN
NGUYÊN LÝ HỆ ĐIỀU HÀNH
ĐỀ TÀI: NGHIÊN CỨU TÌM HIỂU VỀ QUẢN LÝ BỘ NHỚ TRONG
TRONG HỆ ĐIỀU HÀNH LINUX
GIÁO VIÊN HƯỚNG DẪN: NGUYỄN TUẤN TÚ
LỚP: KHOA HỌC MÁY TÍNH 4 – K9
NHÓM SỐ 4
SINH VIÊN THỰC HIỆN:
1.
2.
3.
4.
5.
NGUYỄN THỊ DỊU
ĐỖ TUẤN ANH
TRẦN THỊ KIỀU HOA
VI THÙY DƯƠNG
LÊ THỊ CẨM LINH
Hà Nội, ngày 21 tháng 03năm 2016.
MỤC LỤC
MỤC LỤC................................................................................................................................................2
LỜI NÓI ĐẦU...........................................................................................................................................1
CHƯƠNG I: TỔNG QUAN VỀ BỘ NHỚ TRONG CỦA HỆ ĐIỀU HÀNH CỦA LINUX......................................2
1.1.GIỚI THIỆU VỀ HỆ ĐIỀU HÀNH LINUX...........................................................................................2
1.2.: TỔNG QUAN VỀ BỘ NHỚ TRONG LINUX.....................................................................................3
CHƯƠNG II: CƠ CHẾ QUẢN LÝ BỘ NHỚ ẢO............................................................................................4
2.1.: CÁC KHÁI NIỆM BỘ NHỚ ẢO, KHÔNG GIAN HOÁN ĐỔI..............................................................4
2.2.: TẠO KHÔNG GIAN HOÁN ĐỔI ( CƠ CHẾ Swapping )...................................................................5
2.3.: SỬ DỤNG KHÔNG GIAN HOÁN ĐỔI............................................................................................7
CHƯƠNG III: CƠ CHẾ PHÂN TRANG PHÂN ĐOẠN.................................................................................10
3.1.: CƠ CHẾ PHÂN ĐOẠN.................................................................................................................10
3.2.: CƠ CHẾ PHÂN TRANG...............................................................................................................10
CHƯƠNG IV: CƠ CHẾ QUẢN LÝ BỘ NHỚ VẬT LÝ, ÁNH XẠ BỘ NHỚ.....................................................15
4.1.: BỘ ĐỊNH VÙNG.........................................................................................................................15
4.2.: CÁC VÙNG.................................................................................................................................15
LỜI NÓI ĐẦU
Linux là tên gọi của một hệ điều hành máy tính mã nguồn mở và cũng là tên hạt
nhân của hệ điều hành.
Phiên bản linux đầu tiên do linus torvalds viết vào năm 1991, lúc ông còn là một
sinh viên đại học Helsinki tại Phần Lan. Ông làm việc một cách hăng say trong
vòng 3 năm liên tục và cho ra đời phiên bản Linux 1.0 vảo năm 1994. Bộ phận
chủ yếu này được phát triển và tung ra trên thị trường dưới bản quyền GNU
General Public License. Do đó mà bất cứ ai cũng có thể tải và xem mã nguồn
của Linux.
Vài năm qua, Linux đã thực sự tạo ra một cuộc cách mạng trong lĩnh vực máy
tính. Sự phát triển và những gì chúng mang lại cho máy tính thật đáng kinh
ngạc: một hệ điều hành đa nhiệm, đa người dùng. Linux có thể chạy trên nhiều
bộ vi xử lý khác nhau như: Intel, Motorola, MC68K, Dec Alpha. Nó tương tác
tốt với các hệ điều hành:Apple, Mcrosoft và Novell. Không phải ngẫu nhiên mà
ngành công nghê thông tin Việt Nam trong Linux làm hệ điều hành nền cho các
chương trình ứng dụng chủ đạo về kinh tế và quốc phòng. Với mã nguồn mở, sử
dụng Linux an toàn hơn các ứng dụng Windows. Linux đem đến cho chúng ta
lợi ích về kinh tế với rất nhiều phần mềm miễn phí. Mã nguồn mở của hệ điều
hành và cac chương trình trên Linux là tài liệu vô giá để chúng ta học hỏi về kỹ
thuật lập trình vốn là những tài liệu không được công bố đối với các ứng dụng
Windows. Trong đồ án này, chúng ta sẽ tìm hiểu một phần rất quan trọng trong
hệ điều hành Linux đó là: quản lý bộ nhớ trong Linux. Một hệ điều hành muốn
chạy ổn định thì phải có một cơ chế quản lý bộ nhớ hiệu quả. Cơ chế này sẽ
được trình bày một cách chi tiết trong đồ án và có kèm theo các chương trình
minh họa.
Trong quá trình tìm bài tuy có nhiều cố gắng nhưng không thể tránh được những
sai sót, nhóm em hy vọng nhận được những nhận xét của thầy để đề tài được
hoàn thành tốt hơn.
13
CHƯƠNG I: TỔNG QUAN VỀ BỘ NHỚ TRONG CỦA HỆ ĐIỀU HÀNH
CỦA LINUX.
1.1.GIỚI THIỆU VỀ HỆ ĐIỀU HÀNH LINUX
Linux là một hệ điều hành dạng Unix (Unix – Like Operating System) chạy
trên máy PC với bộ vi điều khiển trung tâm Intel 80386 trở lên hay các bộ vi xử
lý trung tâm tương thích AMD, Cyric. Phiên bản Linux đầu tiên do Linus
Torvalds viết vào năm 1991, phiên bản Linux 1.0 ra đời vào 3 năm sau, năm
1994. Bộ phần chủ yếu này được phát triển và tung ra trên thị trường dưới bản
quyền GNU General Public License. Do đó mà bất cứ ai cũng có thể tải và xem
mã nguồn của Linux.
Khởi đầu, Linux được phát triển cho dòng vi xử lý 386, hiện nay hệ điều
hành hỗ trợ một số lượng lớn các kiến trúc vi xử lý, và được sử dụng trong nhiều
ứng dụng khác nhau, từ máy tính cá nhân cho đến các siêu máy tính, netbook và
các thiết bị nhúng ví dụ như: máy điện thoại di động.
Hình 1.1: Các thuộc tính và các phân khúc của Linux được tập trung vào
SHELL
Hình 1.2: Các thành phần chính của Linux.
UTILITIES
APPLICATION
PROGRAMS
KERNEL
↓
HARDWARE
13
Hiện nay, Linux đã có được sự hỗ trợ bởi các công ty lớn như IBM, Hewlett
– Packard, đồng thời nó cũng bắt kịp các phiên bản Unix độc quyền và thậm chí
là một thách thức đối với sự thống nhất của Microsoft, Windows trong một số
lĩnh vực.
Tuy nhiên, hiện tại số lượng phần cứng được hỗ trợ bởi Linux vẫn còn rất
khiêm tốn so với Windows vì các trình điều khiển thiết bị tương thích với
Windows nhiều hơn Linux. Nhưng trong tương lai số lượng phần cứng được hỗ
trợ cho Linux sẽ tăng lên.
1.2.: TỔNG QUAN VỀ BỘ NHỚ TRONG LINUX
Trong hệ thống máy tính, bộ nhớ là một tái nguyên hữu hạn. Do vậy, nhu cầu
tổ chức, quản lý bộ nhớ là một trong những nhiệm vụ cơ bản của hệ điều hành.
Bộ nhớ được tổ chức như mảng một chiều các từ nhớ (word), mỗi từ nhớ có một
địa chỉ.
Hệ điều hành chịu trách nhiệm cấp phát không gian nhớ cho các tiến trình khi
có yêu cầu.
Cho dù có bao nhiêu bộ nhớ đi chăng nữa thì vẫn không đáp ứng đủ nhu cầu
của người sử dụng. Các máy tính c nhân hiện nay đã trang bị ít nhất 1GB bộ
nhớ. Các máy chủ server có thể lên đến hàng GB bộ nhớ. Thế nhưng nhu cầu bộ
nhớ vẫn được thỏa mãn.
Linux có cách tiếp cận vào quản lý bộ nhớ rất rõ ràng. Các ứng dụng trên
Linux không bao giờ được phép truy cập trực tiếp vào địa chỉ vật lý của bộ nhớ.
Linux cung cấp cho các chương trình chạy dưới hệ điều hành – còn gọi là tiến
trình – một mô hình đánh địa chỉ phẳng không phân đoạn segment: offset như
DOS. Mỗi tiến trình chỉ thấy được một vùng không gian địa chỉ của riêng nó.
Hầu hết tất cả các phiên bản Unix đều cung cấp cách bảo vệ bộ nhớ theo cơ chế
bảo đảm 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
đang hoạt động hoặc vùng nhớ của hệ thống. Nói chung, bộ nhớ mà hệ thống
cấp phát cho một tiến trình không thể nào đọc hoặc ghi bởi một tiến trình khác.
Trong hầu hết các hệ thống Linux và Unix, con trỏ được sử dụng là một số
32 bit trở lên đến một ô nhớ cụ thể. Với 32 bit, hệ thống có thể đánh địa chỉ lên
đến 4GB bộ nhớ. Mô hình bộ nhớ phẳng này dễ truy xuất và xử lý hơn bộ nhớ
phân đoạn segment: offset.
Ngoài ra, một vài hệ thống còn sử dụng mô hình địa chỉ 64 bit, như vậy,
không gian địa chỉ có thể mở rộng ra đến tearabyte.
Các sơ đồ quản lý bộ nhớ trong là: sơ đồ phân hoạch cố định, sơ đồ phân
hoạch động, sơ đồ hoán đổi (swapping), sơ đồ phân trang, sơ đồ phân đoạn, sơ
đồ kết hợp phân trang phân đoạn. Trong đó, Linux sử dụng sơ đồ hoán đổi
(swapping), phân trang, phân đoạn và bộ nhớ ảo để quản lý bộ nhớ trong. Chúng
ta sẽ tìm hiểu những cơ chế đó trong những chương sau để hiểu rõ hơn quá trình
quản lý bộ nhớ trong trong hệ điều hành Linux.
13
CHƯƠNG II: CƠ CHẾ QUẢN LÝ BỘ NHỚ ẢO
2.1.: CÁC KHÁI NIỆM BỘ NHỚ ẢO, KHÔNG GIAN HOÁN ĐỔI.
• Khái niệm bộ nhớ ảo.
Trong hệ thống máy tính, bộ nhớ ảo (virtual memory) là một kỹ thuật cho
phép bộ xử lý một tiến trình được nạp toàn bộ vào bộ nhớ vật lý. Bộ nhớ ảo mô
hình hóa bộ nhớ như một bảng lưu trữ rất lớn và đồng nhất, tách biệt hẳn khái
niệm không gian địa chỉ và không gian vật lý. Người sử dụng chỉ nhìn thấy và
làm việc trong không gian địa chỉ ảo, việc chuyển đổi sang không gian vật lý do
hệ điều hành thực hiện với sự trợ giúp của các cơ chế phần cứng cụ thể.
Linux hỗ trợ bộ nhớ ảo, nghĩa là nó sử dụng một phần của đĩa như là
RAM để tăng kích thước của bộ nhớ. Kernel sẽ ghi nội dung của một khối nhớ
hiện không sử dụng lên đĩa cứng để bộ nhớ được sử dụng cho mục đích khác.
Việc đọc và ghi trên đĩa thì chậm hơn ( khoảng 1 nghìn lần ) so với sử dụng bộ
nhớ thật, vì vậy chương trình chạy không nhanh.
• Không gian hoán đổi
Phần đĩa cứng được sử dụng như là bộ nhớ ảo được gọi là không gian hoán
đổi.
Khi máy tính cần chạy những chương trình lớn hơn khả năng có thể của bộ
nhớ vật lý, hệ điều hành sẽ sử dụng thuật toán swapping. Swapping sẽ dùng đến
những mảng bộ nhớ tạm được lưu trên đĩa cứng, trong khi phần dữ liệu khác vẫn
được chuyển vào RAM để tăng hiệu năng sử dụng.
Linux chia bộ nhớ vật lý thành các pages, swapping là một tiến trình thực
hiện việc copy một page của bộ nhớ đến một không gian được cấu hình trước
trên đĩa để giải phóng các page của bộ nhớ. Có 2 loại swap page: swap partition
và swap file.
2.1: MÔ HÌNH BỘ NHỚ ẢO
Để cho sự chuyển đổi dễ dàng hơn thì bộ nhớ ảo và bộ nhớ vật lý được chia
thành nhiều khúc gọi là trang. Linux trên hệ thống Alpha AXP sử dụng trang 8
KB. Mỗi trang được cung cấp một số duy nhất gọi là số phân trang ( PFN: Page
Frame Number ).
13
Hình 2.2.1: Mô hình trừu tượng của sự ánh xạ từ địa chỉ ảo đến địa chỉ vật lý.
Trong mô hình này, một địa chỉ ảo bao gồm 2 phần: địa chỉ offset và số
khung trang ảo. Nếu kích thước trang là 4KB (tương ứng địa chỉ offset từ
0→4095) thì từ bit 11 đến bit 0 của chỉ ảo chứa địa chỉ offset, còn từ bit 12 trở
lên là số khung trang ảo. Mỗi lần bộ xử lý bắt gặp một địa chỉ ảo, nó sẽ lấy địa
chỉ offset và số khung trang ảo ra. Bộ xử lý phải chuyển từ số khung trang ảo
sang số khung trang vật lý và sau đó truy cập vào địa chỉ offset trong trang vật lý
đó. Để làm được điều này thì bộ xử lý xử dụng bảng trang.
Bộ xử lý số khung trang ảo như là chỉ mục vào bảng trang các tiến trình để
truy xuất vào từng mục của bảng trang. Nếu mục của bảng trang tại địa chỉ
offset đó là hợp lệ thì bộ xử lý sẽ lấy số khung trang vật lý từ mục này. Nếu mục
này không hợp lệ thì tiến trình sẽ truy cập vào một vùng không tồn tại của bộ
nhớ ảo. Trong trường hợp này, bộ xử lý sẽ không thể làm việc với địa chỉ này
mà chuyển điều khiển cho hệ điều hành để khắc phục lỗi đó.
Bằng cách ánh xạ địa chỉ ảo và địa chỉ vật lý như thế này, bộ nhớ ảo có thể
đượ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 2.2.1 ở trên.
2.2.: TẠO KHÔNG GIAN HOÁN ĐỔI ( CƠ CHẾ Swapping )
Khi máy tính cần chạy những chương trình lớn hơn bộ nhớ vật lý (RAM) có
sẵn, hầu hết các hệ điều hành ngày nay sử dụng công nghệ hoán đổi có tên gọi là
swapping. Đây là công nghệ mà trong đó một phần bộ nhớ tạm thời được lưu
trên ở cứng (đĩa cứng) trong khi các dữ liệu khác vẫn được chuyển vào trong
không gian bộ nhớ vật lý (RAM). Công nghệ này giúp ta quản lý việc hoán đổi
(swapping) tốt hơn cũng như tăng hiệu năng sử dụng.
Linux chia bộ nhớ vật lý (RAM) thành cac pages. Swapping là một tiến trình
thực hiện việc copy một page của bộ nhớ đến một không gian đã được cấu hình
13
trước trên đĩa cứng (gọi là swap space), để giải phóng các page của bộ nhớ.
Tổng dung lượng RAM và không gian hoán đổi (swap space) chính là bộ nhớ ảo
(virtual memory).
Có 2 lý do quan trọng mà cần phải thực hiện việc hoán đổi. Trước tiên, khi
hệ thống yêu cầu bộ nhớ lớn hơn bộ nhớ vật lý hiện tại đang có thì nhân hệ
thống sẽ được chuyển sang các trang được sử dụng ít hơn và nhường bộ nhớ cho
các ứng dụng đang cần sử lý ngay. Thứ hai, số lượng các trang quan trọng được
sử dụng ở một ứng dụng trong suốt giai đoạn khởi động có thể chỉ được dùng để
khởi tạo rồi sau đó không dùng lại nữa. Hệ thống có thể chuyển đổi giữa các
trang này và giải phóng bộ nhớ cho các ứng dụng khác hay thậm chí cho cả
cache lưu trữ ổ.
Một file swap là một file thông thường, không có gì đặc biệt đối với kernel.
Điều duy nhất mà nó có nghĩa đối với kernel là nó không có vùng trống. Nó
được chuẩn bị để sử dụng với hàm mkswap(), nó phải thường trú trên đĩa cục
bộ.
Một phân cùng swap cũng không có gì đăc biệt. Ta tạo nó giống như các
phân vùng khác. Sự khác nhau duy nhất là nó được sử dụng như là một phân
vùng thô, nó sẽ không chứa bất kỳ file hệ thống nào. Phân vùng swap được đánh
dấu là loại 82 (Linux swap), điều này giúp cho việc liệt kê sự phân vùng rõ ràng
hơn mặc dù nó không hoàn toàn cần thiết đối với kernel. Sau khi ta tạo một phân
vùng, ta cần ghi một chữ ký lên nơi bắt đầu của nó. Chữ ký này được sử dụng
bởi kernel và chứa một số thông tin về việc quản lý. Đoạn lệnh để làm việc này
là hàm mkswap(), được sử dụng như sau:
$ mkswap/extra-swap 1024
Setting up swapspace, size = 1044480
Bytes $
Chú ý là không gian hoán đổi vẫn chưa được sử dụng nó tồn tại nhưng kernel
không sử dụng nó để cung cấp bộ nhớ nào.
Tuy nhiên việc hoán đổi cũng không hoàn toàn tốt. So với bộ nhớ, các ổ chạy
rất chậm. Tốc độ bộ nhớ có thể được đo bằng nano giây (ns) trong khi tốc độ ổ
bằng mili giây (ms), do đó truy cập chậm hơn hàng chục nghìn lần truy cập vào
bộ nhớ vật lý (RAM). Càng thực hiện hoán đổi nhiều thì hệ thống càng chậm.
Đôi khi hoán đổi quá mức hoặc nhiều lần liên tiếp sẽ xảy ra ở một trang được
chuyển ra rồi ngay lập tức lại được chuyển vào rồi lại chuyển ra cứ thế tiếp tục.
Trong mỗi trường hợp thì hệ thống sẽ tìm ra các vùng nhớ trống và cùng lúc đưa
vào chạy ứng dụng. Trường hợp này chỉ cần thêm RAM.
Ta nên cẩn thận khi sử dụng hàm mkswap() bởi vì nó không kiểm tra file hay
phân vùng này sử dụng chưa. Ta có thể dễ dàng ghi đè lên file hay phân vùng
quan trọng với hàm mkswap(). Tốt hơn hết là ta chỉ nên sử dụng hàm này khi cài
đặt hệ thống của bạn.
13
2.3.: SỬ DỤNG KHÔNG GIAN HOÁN ĐỔI
Linux sử dụng hai loại không gian hoán đổi là partition hoán đổi và tập tin
hoán đổi.
a : Partition hoán đổi.
Partition hoán đổi là môt phần đọc lập của ổ cứng được sử dụng chỉ để hoán
đổi không một tập tin nào khác được lưu trữ ở đây.
Để biết được dung lượng không gian hoán đổi mà ta có, ta sử dụng lệnh
swapon-s. Ta thực hiện kết quả như sau:
Filename
/dev/sda5
Type
Partition
Size
859436
Used
0
Priority
-1
Mỗi dòng liệt kê một không gian hoán đổi riêng được sử dụng bởi hệ thống.
ở đây, trường “Type” chỉ ra rằng không gian hoán đổi này là Partition chứ
không phải là file, và tại trường “ Filename” ta thấy rằng hoán đổi xảy ra ở ổ đĩa
sda5. “Size” hiển thị dạng kilobyte và trường “Used” cho biết số lượng kilobyte
không gian hoán đổi đã sử dụng (trường hợp này là 0). “Priority” cho Linux biết
không gian hoán đổi nào được sử dụng đầu tiên một điều tiện lợi khi Linux hoán
đổi hệ thống con là nếu ta có 2 hay nhiều không gian hoán đổi (trên hai thiết bị
khác nhau) với cùng một độ ưu tiên, thì Linux sẽ xen kẽ hoán chuyển các hoạt
động giữa chúng, do đó có thể nâng tốc độ thực thi.
Để thêm các Partition hoán đổi vào hệ thống trước hết ta cần phải chuẩn bị:
∗ Đảm bảo các Partition đó được đánh dấu như Partition hoán đổi.
∗ Tạo các hoán đổi tập tin hệ thông. Để kiểm tra Partiton đã được đánh dấu
chưa ta cần chạy lệnh:
Fdisk-l/dev/hdb
Thay thế /dev/hdb bằng thiết bị của ổ cứng trên hệ thống của ta với Partittion
hoán đổi trên nó. Kết quả như sau:
Device Boot
Start
End
Blocks
Id
/dev/hdb1
2328
2434
859446 82
System
Linux swap/Solaris
Nếu Partition chưa được đánh dấu thì ta phải sửa lại nó bằng cách chay fdisk
và dùng tùy chọn ‘t’. Hãy cẩn thận khi làm việc với các Partition. Ta không
muốn xóa đi những Partittion quan trọng bởi bị lỗi hay thay đổi ID của Partition
khi hệ thống mắc lỗi trong việc hoán đổi. Tất cả các dữ liệu trên một Partition
hoán đổi sẽ bị mất do đó hãy kiểm tra lại thay đổi ta tạo ra. Đồng thời chú ý rằng
Solaris sử dụng cùng ID giống không gian hoán đổi Linux, phải cẩn thận để
không xóa các Partition Solaris đó.
13
Ngay khi Partition được đánh dấu hoán đổi, ta hãy dùng lệnh mkswap (make
swap) như sau:
Mkswap /dev/hdb1
Nếu không có lỗi xảy ra thì hoán đổi của bạn đã sẵn sàng được sử dụng. Để
kích hoạt hãy nhập:
Swapon /dev/hdb1
Ta có thể kiểm tra bằng lệnh swapon-s. Để cài đặt không gian hoán đổi tự
động khi khởi động ta cần thêm một entry cho /etc/fstab file, nơi chứa một danh
sách các tập tin hệt thống và các không gian hoán đổi cần cài đặt tại thời gian
khởi động. Mỗi dòng có định dạng như sau:
<file system>
<mount point>
<type>
<options> <dump>
Khi không gian hoán đổi là một loại đặc biệt của tập tin hệ thống thì rất nhiều
các tham số không tương đương. Đối với không gian hệ thống, hãy thêm:
/dev/hdb1
Swap
none
sw
0
0
Trong đó dev/hdb là một ngăn hoán đổi. Ngăn này không có điểm lắp đặt cố
định, do đó ta có none. Loại hoán đổi với tùy chọn sw và hai tham số cuối cùng
không được sử dụng nên chúng có giá trị là 0. Để kiểm tra xem không gian hoán
đổi đã được tự động cài đặt mà không cần phải khởi động lại thì bạn có thể dùng
lệnh: swapoff – a (tắt các không gian hoán đổi) rồi sau đó dùng lênh : swapon –
a (cài đặt tất cả mọi không gian hoán đổi liệt kê tại tập tin /etc/fstab) rồi kiểm tra
lại bằng lệnh swapon – s.
Một không gian hoán đổi đã khởi tạo sẽ lấy được để sử dụng nhờ lệnh
swapon. Lệnh này bào cho kernel bằng không gian hoán đổi có thể sử dụng.
Đường dẫn đến không gian hoán đổi được cấp như là đổi số, vì vậy để bắt đầu
hoán đổi trên một file swap tạm thời, ta có thể sử dụng đoạn lệnh sau:
$ swapon/extra-swap $
Không gian hoán đổi có thể được sử dụng tự động bằng cách liệt kê chũng
trong file /etc/fstab.
/dev/hda5 none swap sw 0 0
/swapfile none swap sw 0 0
Đoạn mã khởi động sẽ chạy lệnh swapon – a, lệnh này sẽ bắt đầu thực hiện
hoán đổi trên tất cả các không gian hoán đổi được liệt kê trong file /etc/fstab. Do
đó lệnh swapon chỉ thường được sử dụng khi cần hoán đổi thêm.
13
b : Tập tin hoán đổi
Cũng giống như Partition hoán đổi, Linux hỗ trợ cho bạn tạo được một tập
tin hoán đổi, chuẩn bị và lắp đặt cùng kiểu với Partition hoán đổi. Lợi ích của
các tập tin hoán đổi đó là ta không cần phải tìm kiếm một Partititon trống hay
phân chia lại ổ để thêm vào các không gian hoán đổi.
Để tạo một tập tin hoán đổi, trước tiên hãy dùng lệnh dd để tạo một tập tin
rỗng. Ví dụ, tạo một tập tin 1GB, nhập:
dd if=/dev/zero of=/swapfile bs=1024 count=1048576
/swapfile là tên của tập tin hoán đổi và 1048576 là kích cỡ tính bằng kilobyte
(ví dụ 1GB).
Chuẩn bị tập tin hoán đổi ta dùng mkswap như khi tạo Partition, nhưng ở đây
dùng tên của tập hoán đổi:
mkswap/swapfile
và tương tự, cài đặt tập tin hoán đổi dùng lệnh swapon: swapon /swapfile.
Đầu vào /etc/fstab của một tập tin hoán đổi có dạng như sau:
/swapfile
none swap sw
0
0
2.2: ĐỊNH VỊ KHÔNG GIAN HOÁN ĐỔI
Người ta thường nói rằng ta nên định vị không gian hoán đổi gấp đôi bộ nhớ
vật lý, nhưng đây không phải là một quy luật đúng. Ta hãy xem cách làm đúng
sau đây:
∗ Dự đoán tổng bộ nhớ mà ta cần. Đây là số lượng bộ nhớ lớn nhất mà ta
cần tại một thời điểm nào đó, là tổng bộ nhớ cần thiết cho tất cả các
chương trình mà ta muốn chạy cùng một lúc.
∗ Cộng thêm một ít vào dự đoán ở bước trên, bởi vì dự đoán về kích thước
các chương trình có thể sai do ta quên một số chương trình mà ta muốn
chạy và để chắc chắn ta nên chuẩn bị một không gian phụ để khi cần.
∗ Dựa theo những tính toán trên, ta biết sẽ cần tổng cộng bao nhiêu bộ nhớ.
Vì vậy, để định vị không gian hoán đổi, ta chỉ cần lấy tổng bộ nhớ sẽ
dùng trừ cho bộ nhớ vật lý.
∗ Nếu không gian hoán đổi mà ta đã tính lớn hơn 2 lần bộ nhớ vật lý thì ta
nên mua thêm RAM, nếu không hiệu năng của máy sẽ thấp.
Tốt hơn hết là nên có một vài không gian hoán đổi cho dù theo sự tính toán
của ta là không cần.
13
CHƯƠNG III: CƠ CHẾ PHÂN TRANG PHÂN ĐOẠN
3.1.: CƠ CHẾ PHÂN ĐOẠN
Quan niệm không gian địa chỉ là một tập các phân đoạn (segments). Ở các phân
đoạn là những phần bộ nhớ kích thước khác nhau và có liên quan logic với nhau.
Mỗi phân đoạn có một tên gọi (số hiệu phân đoạn) và một độ dài.
∗ Linux sử dụng cơ chê phân đoạn để phân tách các vùng nhớ đã cấp phát cho
hạt nhân và các tiên trình. Hai phân đoạn liên quan đến 3GB đầu tiên (từ
0→0xBFFF FFFF) của không gian địa chỉ tiến trình và các nội dung của chúng
có thể được đọc và chỉnh sửa trong chế độ người dùng và trong chế độ kernel.
Hai phân đoạn liên quan đến GB thứ 4 (từ 0xC000 0000 → 0xFFFF FFFF) của
không gian địa chỉ tiến trình và nội dung của nó có thể được đọc và chỉnh sửa
duy nhất trong chế độ kernel. Theo cách này, dữ liệu và mã kernel được bảo vệ
khỏi sự truy cập không hợp lý của các tiến trình chế độ người dùng.
Hình 3.1.1: Kernel/Used Linear addresses
3.2.: CƠ CHẾ PHÂN TRANG
• NHU CẦU PHÂN TRANG
Vì có quá ít bộ nhớ vật lý so với bộ nhớ ảo nên HĐH phải chú trọng làm sao
để không lãng phí bộ nhớ vật lý. Để tiết kiệm bộ nhớ vật lý thì chỉ load những
trang ảo mà đang được sử dụng bởi một chương trình đang thực thi. Việc mà chỉ
load những trang ảo vào bộ nhớ khi chúng được truy cập dẫn đến nhu cầu phân
trang.
13
• TRANG LƯU TRỮ (PAGE CACHE)
Cache là tầng nằm giữa phần quản lý bộ nhớ kernel và phần vào ra của đĩa.
Các trang mà kernel hoán đổi không được ghi trực tiếp lên đĩa mà được ghi vào
cache. Khi cần vùng nhớ trống thì kernel mới ghicacs trang từ cache ra đĩa.
Đặc tính chung của các trang trong danh sách theo chuẩn LRU (Least
Recently Used) là:
∗ Active_list: Là những trang có page → age > 0, chứa hoặc không
chứa dữ liệu, và có thể được ánh xạ bởi một mục trong một trang
tiến trình.
∗ Inactive_dirty_list: Là những trang có page → age == 0, chứa hoặc
không chứa dữ liệu, và không được ánh xạ bởi bất cứ mục nào
trong bảng tiến trình
∗ Inactive_clean_list: Mỗi vùng có inactive_dirty_list của riêng
nó,chứa các trang clean với page == 0, và không được ánh xạ bởi
bất kì một mục nào trrong bảng trang tiến trình. Trong khi quản lý
lỗi trang, kernel sẽ tìm kiếm các trang lỗi trong page cache. Nếu lỗi
được tìm thấy thì nó được đưa đến active_list để đưa ra thông báo.
Vòng đời của một User Page
Trang P được đọc từ đĩa vào ở nhớ và được lưu vào page cache. Có thể xảy
ra một trong nhưng trường hợp sau:
Tiến trình A muôn truy cập vào trang P. Nó sẽ được trình quản lý lỗi trang
kiểm tra xem có tương ứng với file đã được ánh xạ không. Sau đó nó
được lưu vào page cache vầ bảng tên tiến trình. Từ đây vòng đời của trang
bắt đầu trên active_list, nơi mà nó vẫn được lưu trữ kể cả khi đang được
sử dụng.
Trang P được đọc suốt quá trình hoạt động của đầu đọc hoán đổi và được
lưu vào page. Một loạt các trang tiếp nhau trên đĩa sẽ được đọc mà không
cần biết các trang này có cần hay không và cũng không cần quan tâm đến
việc thông báo cho các trang này vì chũng có thể khôi phục ngay lập tức
cho dù không còn được tham chiếu đến nữa.
Trang P được đọc trong suốt quá trình hoạt động của cluster ánh xạ bộ
nhớ.
Trang P được ghi bởi các tiến trình do đó có chứa dữ liệu (dirty). Lúc này
trang P vẫn ở trên active_list.
13
Trang P không được sử dụng trong một thời gian. Sự kích hoạt định kỳ của
hàm kswap() (kernel swap daemon) sẽ giảm dần biến đếm page → age. Hàm
kswapd() sẽ hoạt động nhiều hơn khi nhu cầu về bộ nhớ tăng. Thời gian tồn tại
trang P sẽ giảm dần xuống 0 (age == 0) nếu nó không còn được tham chiếu, dẫn
đến sự kích hoạt của hàm re_fill inactive().
Nếu bộ nhớ đầy, hàm swap_out sẽ được gọi bởi hàm kswaps() để cố gằng lấy
lại các trang từ không gian địa chỉ ảo của tiến trình A. Vì trang P không còn
được tham chiếu và có age == 0, nên các mục trong bảng trang sẽ bị xóa. Nhờ
vào page cache và cơ chế swap mà trang sẽ đảm bảo được ghi lên đĩa khi cần.
Thời gian xử lý ít hay nhiều là tùy thuộc vào nhu cầu sử dụng bộ nhớ.
Tiếp theo, hàm refill_inactive_scan() tìm các trang mà có thể đưa đến
inactive_dirty list. Từ khi trang P không được ánh xạ bởi một tiến trình nào và
có age == 0 thì nó được đưa từ active_list đến inactive_dirty list.
Tiến trình A truy cập vào trang P, nhưng nó hiện không có trong bộ nhớ ảo
tiến trình các mục trong bảng trang đã bị xóa bởi hàm swap_out(). Trình điều
chỉnh lỗi gọi hàm find_page_nolock() để xác định địa chỉ trang P trong page
cache. sau khi tìm thấy, các mục trong bảng trang sẽ được phục hồi ngay lập tức
và trang P được đưa đến active_list.
Quá trình này mất nhiều thời gian do hàm swap_out() xóa các mục trong
bảng trang của tiến trình A, hàm refill_inactive_scan() vô hiệu hóa trang P, nó
đưa đến inactive_dirty list. Việc tốn nhiều thời gian sẽ làm cho bộ nhớ trở lên
chậm.
Hàm page_launder() được kích hoạt để làm sạch các trang dirty và thực hiện
để tìm các trang không sử dụng và clean, đưa chúng đến inactive_clean_list. Khi
hàm page_launder thực sự quyết định ghi lên trang thì sẽ thực hiện các bước
sau:
Khóa trang.
Gọi phương thức writepage để kích hoạt một vài đoạn mã đặc biệt để thực
hiện ghi lên đĩa (không đồng bộ) với trang đã bị khóa.
Hàm page_launder() được gọi lại để tìm trang clean để đưa nó đến
inactive_clean_list.
Giả sử cần một trang trống riêng lẻ. Điều này có thể thực hiện bằng cách có
thể lấy lại một trang inactive_clean, trang P sẽ được chọn. Hàm reclaim_page()
loại bỏ trang P ra khỏi pagecache (điều này bảo đảm rằng không có tiến trình
13
nào khác tham chiếu đến nó trong quá trình quany lý lỗi của trang), và nó được
đưa cho lời gọi như là một trang trống.
• BẢNG TRANG (PAGE TABLE)
Hình 3.2.1: Mức bảng trang
Linux giả sử rằng có 3 mức bảng trang. Mỗi bảng trang chứa số khung
trang của bảng trang ở mức tiếp theo. Hình 3.2.1 chỉ ra cách mà địa chỉ được
chia thành các trường. Mỗi trường cung cấp một địa chỉ offset đến một bảng
trang cụ thể. Để chuyển địa chỉ ảo thành địa chỉ vật lý, bộ xử lý phải lấy nội
dung của các trường rồi chuyển thành địa chỉ offset đến trang vật lý chứa bảng
trang và đọc số khung trang của bảng trang ở mức tiếp theo. Việc này lập lại 3
lần cho đến khi khung trang của trang vật lý chứa địa chỉ ảo được tìm ra. Bây
giờ, trường cuối cùng trong địa chỉ ảo được sử dụng để tìm kiếm dữ liệu trong
trang.
• ĐỊNH VỊ VÀ GIẢI PHÓNG TRANG
Định vị trang
Linux sử dụng thuật toán buddy để dinh vị và giải phóng một cách hiệu quả
các khối của trang. Đoạn đã định vị trang xác định một khối của một hay nhiều
trang vật lý. Những trang được định vị trong khối có kích thước là lũy thừa của
13
2. Khi có đủ số trang trống trong hệ thống để cấp cho một yêu cầu, đoạn mã
định vị sẽ tìm trong free_area một khối các trang có kích thước như yêu cầu.
Mỗi phần tử của free_area ánh xạ đến các khối trang trống có kích thước tương
ứng. Ví dụ, phần tử thứ 2 của ánh xạ đến các khổi gồm 4 trang trống đã được
định vị/
Hình 3.2.2: Cấu trúc dữ liệu của free-area.
Ví dụ, trong hình 3.2.2 , nếu một hình khối gồm 2 trang được yêu cầu thì 4 khối
trang thứ nhất (bắt đầu ở khung trang số 4) sẽ được chia thành 2 khối 2 trang. Khối thứ
nhất (bắt đầu ở khung trang số 4) sẽ được cung cấp cho lời gọi và khối thứ 2 (bắt đầu ở
khung trang số 6) sẽ được đưa vào hàng đợi như là một khối 2 trang trống ở phần tử
thứ nhất của mảng free_area.
Giải phóng trang
Việc định vị các khối trang làm cho bộ nhớ bị phân mảnh do các khối trang lớn bị
chia nhỏ. Đoạn mã giải phóng trang kết hợp các trang lại thành một khối lớn các trang
trống bất kỳ khi nào có thể. Khi có một khối trang trống thì các khối lân cận có cùng
kích thước được kiểm tra xem có trống không. Nếu có thì chúng được kết hợp với
nhau để tạo ra một khối trang có kích thước gấp đôi. Đoạn mã giải phóng trang lại tìm
cách kết hợp khối mới này với một khối khác. Theo cách này, khối khác các trang
trống sẽ lớn dần.
13
CHƯƠNG IV: CƠ CHẾ QUẢN LÝ BỘ NHỚ VẬT LÝ, ÁNH XẠ BỘ NHỚ
4.1.: BỘ ĐỊNH VÙNG
Các bảng trang kernel ánh xạ tối đa bộ nhớ vật lý vào dãy địa chỉ bắt đầu tại
page_offset. Các trang vật lý chiếm bởi đoạn mã và dữ liệu kernel sẽ được làm
riêng và sử dụng cho bất kỳ mục đích nào khác. Các trang vật lý khác được định
vị cho bộ nhớ ảo tiến trình, bộ nhớ đệm, bộ nhớ ảo kernel,... khi cần. Để làm
được điều này, chúng ta có cách theo dõi trang vật lý nào được sử dụng và sư
dụng bởi ai.
Bộ định vùng (zone allocator) quản lý bộ nhớ vật lý. Bất kỳ mã kernel nào
đều có thể gọi tới bộ định vùng thông qua hàm alloc_pages() và được cấp một
khối gồm 2n trang được canh trên một đường bien tương ứng. Chúng ta cũng có
thể chuyển khối các trang này lại cho bộ định vùng nhờ hàm free_pages(). Số
mũ n được gọi là thứ tự của sự định vùng. Các khối không cần phải được giải
phóng giống cách mà chúng được xác định, nhưng phải được giải phóng chính
xác, và khung trang đầu tiên của khối phải có một số tham chiếu khác 0. Ví dụ,
khi bạn yêu cầu một khối 8 trang, sau đó giải phóng 1 khối 2 trang trong khối 8
trang đó, muốn làm điều này trước hết ta phải tăng biến tham chiếu của trang
đầu tiên trong khối 2 trang. Lý do là vì khi ta định vị một khối 8 trang, chỉ có
biến tham chiếu của trang đầu tiên trong khối được tăng, mặt khác đoạn mã giải
phóng trang sẽ không giải phóng một trang có biến chiếu là 0, nên biến tham
chiếu của các trang khác phải điều khiển bằng tay. Việc tăng tất cả các biến
tham chiếu của các trang trong khối là không cần thiết đồng thời làm tăng kích
thước đoạn mã giải định vị trang.
4.2.: CÁC VÙNG.
Các dãy trang vật lý khác nhau thì có các thuộc tính khác nhau, phục vụ cho
các mục địch của kernel. Ví dụ, DMA (Direct Memory Access) cho phép các
thiết bị ngoại vi đọc và viết dữ liệu trực tiếp lên RAM mà không có sự can thiệp
của CPU, chỉ có thể làm việc với địa chỉ vật lý nhỏ hơn 16MB.
Một vài hệ thống có bộ nhớ vật lý nhiều hơn có thể được ánh xạ giữa
page_offset và 4GB, những trang vật lý này không thể truy cập trực tiếp đến
kernel, vì vậy chúng ta phải được quản lý theo cách khác. Bộ định vùng quản lý
những sự khác nhau như vậy bằng cách chia bộ nhớ thành các vùng và xem mỗi
vùng là một đơn vị cho sự định vị.
Cấu trúc dữ liệu root được quản lý bởi bộ định vùng là zone_struct, gồm tập
hợp tất cả dữ liệu liên quan đến việc quản lý một vùng cụ thế. Zonelist_struct
bao gồm một mảng các con trỏ zone_struct và một gfp_mask chỉ ra cơ chế định
13
vị nào có thể sử dụng zone_list. Zone_struct offset chỉ ra địa chỉ offset của nơi
bắt đầu 1 vùng trong bộ nhớ vật lý.
13