TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
--------------------
BÁO CÁO BÀI TẬP LỚN MÔN HỌC
NGUYÊN LÝ HỆ ĐIỀU HÀNH
Nhóm thực hiện: Nhóm 6 - Lớp KHMT3 – K9
Hà Nội ,ngày 18 tháng 3 năm 2016
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
ĐỀ TÀI: NGHIÊN CỨU TÌM HIỂU VỀ QUẢN LÝ BỘ
NHỚ NGOÀI TRONG HỆ ĐIỀU HÀNH LINUX
GV hướng dẫn: Thạc sĩ Nguyễn Tuấn Tú
Nhóm thực hiện: Vũ Tiến Long
Vương Quốc Huỳnh
Nguyễn Thanh Tú
Phạm Duy Đạt
Nguyễn Trung Huy
MỤC LỤC
Lời nói đầu
Linux là tên gọi của một hệ điều hành máy tính và cũng là tên hạt nhân của hệ điều hành. Nó có lẽ là
một ví dụ nổi tiếng nhất của phần mềm tự do và của việc phát triển mã nguồn mở.
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 của Đạ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. Mã nguồn mở của HDH và của các chương trình trên Linux là những 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 bài luận này, chúng ta sẽ tìm hiểu một phần quan trọng trong HDH Linux đó là: Quản lý bộ
nhớ ngoài trong Linux.
Giới thiệu sơ qua về Linux:
Linux là tên gọi của một hệ điều hành máy tính và cũng là tên hạt nhân của hệ điều hành. Nó có lẽ là
một ví dụ nổi tiếng nhất của phần mềm tự do và của việc phát triển mã nguồn mở.
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 của Đạ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.
Chim cánh cụt Tux ở trên, dựa trên một hình ảnh do Larry Ewing tạo ra vào năm 1996, biểu trưng và
vật may mắn của Linux.
Thông tin thêm:
Ubuntu là một hệ điều hành máy tính dựa trên Debian GNU/Linux, một bản phân phối Linux thông
dụng. Ubuntu thường được cài đặt trên máy tính mới, trước khi người sử dụng mua về và cài đặt hệ
điều hành khác.
Logo hệ điều hành Ubuntu.
Android là một hệ điều hành dựa trên nền tảng Linux được thiết kế dành cho các thiết bị di động có
màn hình cảm ứng như điện thoại thông minh và máy tính bảng. Ban đầu, Android được phát triển bởi
Tổng công ty Android, với sự hỗ trợ tài chính từ Google và sau này được chính Google mua lại vào
năm 2005. Android ra mắt vào năm 2007 cùng với tuyên bố thành lập Liên minh thiết bị cầm tay mở:
một hiệp hội gồm các công ty phần cứng, phần mềm, và viễn thông với mục tiêu đẩy mạnh các tiêu
chuẩn mở cho các thiết bị di động. Chiếc điện thoại đầu tiên chạy Android được bán vào tháng 10 năm
2008.
Logo hệ điều hành Android.
1. Các khái niệm cơ bản.
-Bộ nhớ:
+ Bộ nhớ là trung tâm để điều khiển hệ thống máy tính hiện đại.
+ CPU lấy các chỉ thị từ bộ nhớ dựa theo giá trị của thanh đếm chương trình.
-Bộ nhớ ngoài:
+ Gồm các thiết bị như: Thẻ nhớ, ổ cứng, đĩa mềm, đĩa CD/DVD…
-Lý do phải quản lý bộ nhớ ngoài: Khi cần lưu trữ các chương trình hoặc dữ liệu, các hệ thống máy
tính cần sử dụng bộ nhớ ngoài (đĩa từ, băng từ…). Nhiệm vụ chính của hệ điều hành phải đảm bảo
được các chức năng sau:
+ Quản lý không gian nhớ tự do trên bộ nhớ ngoài (Free space mange).
+ Cấp phát không gian nhớ tự do (Allocation methods).
+ Cung cấp các khả năng định vị bộ nhớ ngoài.
+ Lập lịch cho bộ nhớ ngoài (Disk scheduling).
- Sơ lược cấu trúc nguyên tắc hoạt động của đĩa từ:
Hình 1.1:Hình minh họa cấu trúc một đĩa từ.
+ Cấu tạo của đĩa từ: Xét cấu trúc vật lý của đĩa từ thì đĩa từ bao gồm 1 hay nhiều lá đĩa đặt
đồng trục. Mỗi mặt đĩa chia thành các rãnh đồng tâm gọi là track , một track được chia thành các cung
gọi là sector. Tập hợp các track cung thứ tự trên các mặt đĩa gọi là Cylinder. Trên mỗi mặt đĩa có một
đầu từ đọc hay ghi dữ liệu (read hay write heads). Để điều khiển đầu từ đọc hay ghi dữ liệu cần có một
trình để điều khiển đĩa (disk controler).
+ Thư mục thiết bị: Thông tin trên đĩa đĩa được tham chiếu bởi các thành phần: Ổ đĩa, mặt đĩa,
track, sector… Thư mục thiết bị cho biết đĩa gồm những thông tin gì, độ dài kiểu, người sở hữu, thời
điểm khởi tạo, vị trí, được phân bố không gian thế nào? Thư mục thiết được tạo ngay ở trên đĩa tại một
vùng nhớ trên đĩa.
2. Các phương pháp quản lý không gian nhớ tự do.
2.1. Phương pháp Bit vector.
Không gian đĩa được chia thành các khối (block) và được đánh số từ 0. . . max. Vd: Đĩa mềm 1.
44Mb, 2 mặt, 80 track/1mặt, 18 sector/1track được đánh số như sau:
Mỗi khối đĩa sử dụng 1bit để đánh dấu trạng thái. Khối đĩa nào đã sử dụng thì bit trạng thái có giá trị
bằng 1, chưa sử dụng thì có giá trị bằng 0.
Tập hợp các ký hiệu 0, 1 tạo thành 1 bit vector (bitmap). Đọc thông tin trong bitmap hệ điều hành có
thể xác định được không gian tự do trên đĩa.
Hình 2.1: Mô tả không gian đĩa từ.
Vd: Cho không gian đĩa từ như hình trên, các khối 2, 3, 4, 5, 8, 9, 10, 11, 12, 143, 17, 18, 25, 26, 27
là các khối đĩa tự do. Khi đó bitmap quản lý không gian nhớ tự do:
11000011000000111001111110001111…
- Ưu điểm: Phương pháp bitmap cài đặt đơn giản, dễ quản lý, dễ tìm kiếm những khối liên tục trên
đĩa.
- Nhược điểm: Tốn không gian lưu trữ dành cho bitmap (vì mỗi khối sẽ tốn 1 bit để lưu trạng thái của
khối).
2.2. Phương pháp liệt kê (List).
Trong phương pháp này, hệ thống sử dụng 1 danh sách móc nối để liệt kê các khối đĩa tự do. Con trỏ
đầu danh sách chỉ tới khối đĩa tự do đầu tiên, mỗi khối có 1 con trỏ để trỏ tới khối kế tiếp.
Ưu điểm của phương pháp này là tiết kiệm không gian nhớ nhưng nó lại làm tăng thời gian truy nhập
dữ liệu.
2.3. Phương pháp lập nhóm (Grouping).
Trong phương pháp này, hệ thống cho phép nhóm các khối đĩa tự do liên tiếp thành 1 nhóm. Khối đĩa
tự do đầu tiên trong nhóm lưu trữ địa chỉ của các khối đĩa tư do trong nhóm. Khối đĩa cuối cùng trong
nhóm lưu trũư địa chỉ của khối đĩa tự do đầu tiên của nhóm tiếp theo.
Theo hình, ta có bảng quản lý không gian nhớ tự do như sau:
Nhóm
Khối đầu
Khối cuối
I
2(2,3,4,5)
5(8)
II
8(8,9,10,11,12,13
13(17)
III
17(17,18)
18(25)
IV
25(25,26,27)
27(…)
2.4. Phương pháp đếm (Couting).
Phương pháp đếm là sự biến đổi của phương pháp lập nhóm.
Trong phương pháp này, hệ thống lập danh sách quản lý địa chỉ của các khối đĩa tự do đầu tiên và số
lượng các khối đĩa tự do liên tục kế tiếp các khối đĩa đó.
Vd: Theo hình, ta có danh sách quản lý không gian nhớ tự do như sau:
Danh sách
Số lượng
2
4
8
6
17
2
25
3
3.Cơ cấu quản lý bộ nhớ Linux.
"Quản lý bộ nhớ" hạn liên quan đến các cơ chế thực hiện bởi một hệ thống hoạt động để cung cấp
các ứng dụng với các dịch vụ liên quan đến bộ nhớ. Những dịch vụ này bao gồm việc sử dụng bộ nhớ
ảo (sử dụng của một đĩa cứng hoặc các phương tiện lưu trữ khác không-RAM cung cấp thêm bộ nhớ
chương trình), bảo vệ bộ nhớ (không bao gồm quyền truy cập vào một khu vực bộ nhớ của một quá
trình), và bộ nhớ chia sẻ (hợp tác xã tiếp cận với một khu vực của bộ nhớ bằng nhiều quy trình).
Các dịch vụ quản lý bộ nhớ trong Linux được xây dựng trên một nền tảng lập trình bao gồm một thiết
bị ngoại vi được gọi là đơn vị quản lý bộ nhớ (MMU). MMU dịch địa chỉ bộ nhớ vật lý đến các địa chỉ
tuyến tính được sử dụng bởi hệ điều hành, và yêu cầu một lỗi trang gián đoạn, khi CPU cố gắng truy
cập bộ nhớ rằng nó không có quyền.
Không phải tất cả các bộ xử lý có MMUs. Do đó, sự phân bố uClinux (Linux cho vi điều khiển) hỗ
trợ một không gian địa chỉ duy nhất hoạt động. Kiến trúc này không bảo vệ được cung cấp bởi MMU,
nhưng làm cho nó có thể cho Linux để chạy trên một lớp học của vi xử lý.
Để hiểu biết thêm về cấu trúc của các dịch vụ MM, chúng ta cần phải biết rằng một đơn vị cơ bản của
bộ nhớ trong Linux là trang, một khu vực không chồng chéo của bộ nhớ tiếp giáp. Tất cả các bộ nhớ có
sẵn vật lý được tổ chức vào các trang vào cuối của quá trình khởi động của hạt nhân. Kích thước trang
phụ thuộc vào kiến trúc vi xử lý. Thiết kế bộ vi xử lý thường cho phép có hai hoặc nhiều hơn, đôi khi
cùng một lúc, kích thước trang.
Kích thước trang truyền thống được sử dụng bởi Linux là 4096 byte.
Tuy nhiên, bằng cách sử dụng các trang bộ nhớ "như là" không phải là rất thuận tiện. Thông thường,
chúng ta cần phải phân bổ ít hơn một trang bộ nhớ. Có khả năng như vậy trong Linux:
-Trong hạt nhân, bạn có thể phân bổ một trong các đối tượng hạt nhân nhỏ bằng cách sử dụng cấp
phát sàn.
-Bạn có thể cấp phát một khối bộ nhớ bằng kmalloc, nhưng nó sẽ phân bổ chỉ có một khối kích thước
lớn hơn gần nhất mà nó có.
-Trong chế độ người dùng, bạn có thể bố trí bất kỳ số lượng bộ nhớ bằng cách sử dụng chức năng
quản lý đống thực hiện trong thư viện chuẩn C.
-Bạn có thể tạo quản lý heap riêng của bạn trên đầu trang của các cuộc gọi hệ thống hạt nhân Linux.
Để cung cấp một giao diện đơn giản để tương tác với đơn vị quản lý bộ nhớ và thực hiện tương tác
như vậy trong một cách cầm tay, trong Linux, hệ thống phụ phân bổ và phát hành bộ nhớ được chia
thành ba lớp. Các lớp này là:
-Bộ cấp phát Sàn.
-Bộ cấp phát Zone.
-Bộ cấp phát Buddy.
Đề án tổng thể của sự tương tác tất cả các lớp với mã chế độ người dùng và phần cứng trông như sau:
Hình 3.1: Sơ đồ tổng quát của quản lý bộ nhớ trong Linux.
Lưu ý rằng trong Linux, hầu hết các chương trình trực tiếp hoặc gián tiếp sử dụng quản lý đống tiêu
chuẩn GCC C được gọi là Thư viện glibc, nhưng bạn vẫn có thể viết quản lý heap riêng của bạn trên
đầu trang của các cuộc gọi hệ thống hạt nhân.
Như chúng ta có thể thấy trong hình, phân bổ, không gian người sử dụng luôn luôn dẫn đến phân bổ
hạt nhân. Bộ nhớ hạt nhân phân bổ bằng cách sử dụng chuỗi ba cấp phát hạt nhân và bản đồ phân bổ
các trang không gian địa chỉ của quá trình, trong đó có yêu cầu phân bổ.
4. Dịch vụ Quản lý bộ nhớ.
4.1. Hệ thống Buddy.
Bộ cấp phát Buddy chịu trách nhiệm cho việc quản lý phân bổ trang trong toàn bộ hệ thống. Mã này
quản lý danh sách các trang vật lý tiếp giáp và bản đồ chúng vào các bảng trang MMU để cung cấp các
hệ thống con hạt nhân khác với các phạm vi địa chỉ vật lý hợp lệ, khi các yêu cầu hạt nhân (lập bản đồ
địa chỉ vật lý ảo được xử lý bởi một lớp cao hơn của VM).
Bộ cấp phát Buddy chia bộ nhớ thành các cặp của các trang 2n trong đó n là trong phạm vi từ 0 đến
MAX_ORDER không đổi (được định nghĩa trong tập tin tiêu đề <linux/mmzone.h>), và lưu trữ thông
tin về các khối miễn phí của các trang trong mảng các danh sách như sau:
Hình 4.1: Mảng danh sách các trang bộ nhớ trong bộ cấp phát Buddy.
Mỗi danh sách bao gồm các khối miễn phí về thể chất tiếp giáp của các trang bộ nhớ 2i, trong đó i là
một số danh sách. Mỗi của các khối như vậy, ngoại trừ khối bao gồm 1 trang, có thể được chia thành
hai nửa và được sử dụng như là 2 khối có kích thước 1/2.
Vì vậy, nếu không có mục tồn tại trong danh sách được yêu cầu, một mục trong danh sách trên tiếp
theo được chia thành hai cụm riêng biệt và là một trong những trả lại cho người gọi trong khi một khác
được thêm vào danh sách thấp hơn kế tiếp.
Mặt khác, mỗi hai khối bộ nhớ có cùng kích thước, có biên giới chung (sắp xếp trong bộ nhớ tuần tự,
từ quan điểm của các địa chỉ vật lý), có thể được thống nhất vào khối duy nhất của kích thước lớn hơn.
Như vậy khối láng giềng được gọi là Buddies.
Khi phân bổ được trả lại cho bộ cấp phát Buddy, nó sẽ kiểm tra nếu bạn phân bổ là miễn phí, và nếu
nó là như vậy, Buddy cấp phát kết hợp họ lại thành khối lớn hơn. Hoạt động này được lặp đi lặp lại cho
đến khi bạn bè khối không được tìm thấy.
Ngoài ra, chúng ta nên lưu ý rằng bộ cấp phát Buddy có thể phân bổ khối duy nhất của kích thước
trong trang bằng 2 nâng lên một số điện.
Cấp phát Buddy cũng tương tác với các chủ đề hạt nhân kswapd và bdflush, chịu trách nhiệm cho
việc duy trì với vùng trao đổi.
Phạm vi khác nhau của các trang vật lý có thể có các thuộc tính khác nhau, cho các mục đích của hạt
nhân. Ví dụ, bộ nhớ truy cập trực tiếp có thể chỉ làm việc trong phạm vi cụ thể của các địa chỉ vật lý
trong kiến trúc x86. Mặt khác, PPC không có hạn chế này.
Để xử lý tình hình như vậy trong phần cứng một cách độc lập cấp phát Zone được tạo ra. Cấp phát
Zone được sử dụng để phân bổ các trang trong khu vực quy định. Hôm nay Linux kernel được hỗ trợ
ba khu vực bộ nhớ:
-DMA - Vùng này bao gồm bộ nhớ truy cập bộ nhớ trực tiếp cho các hoạt động của các thiết bị di sản
-NORMAL - Vùng này bao gồm các địa chỉ bộ nhớ được sử dụng bởi hạt nhân cho các cấu trúc dữ
liệu nội bộ cũng như các hệ thống khác và phân bổ không gian người dùng.
-HIGHMEM - Vùng này bao gồm tất cả các bộ nhớ được sử dụng dành riêng cho hệ thống phân bổ
(bộ đệm hệ thống tập tin, người dùng phân bổ không gian, vv).
Lưu ý rằng bộ cấp phát Zone cũng chỉ có thể thao tác với các trang bộ nhớ.
Kể từ khi chúng ta thường cần phải phân bổ các đối tượng có kích thước nhỏ hơn kích thước của một
trang, chúng ta cần một cái gì đó để đối phó với các trang và phân bổ khối bộ nhớ ít hơn đối với chúng
tôi.
Chúng ta biết các kích thước của hầu hết các đối tượng thường được phân bổ trong không gian hạt
nhân, do đó, chúng ta có thể tạo ra cấp phát mà sẽ nhận được các trang bộ nhớ từ bộ cấp phát Zone và
phân bổ các đối tượng nhỏ trong các trang bộ nhớ. Hệ thống con này được đặt tên là bộ cấp phát Sàn
(cấp phát bộ nhớ hạt nhân Một đối tượng Caching).
Cấp phát Sàn tổ chức bộ nhớ cache, bộ nhớ cache cho từng loại đối tượng, ví dụ như inode_cache,
dentry_cache, buffer_head, vm_area_struct. Cache mỗi bao gồm các tấm nhiều (thường là một trang
dài), và mỗi tấm có chứa nhiều đối tượng khởi tạo.Điều này có nghĩa rằng các nhà xây dựng của các
đối tượng được sử dụng chỉ cho tấm mới được giao và bạn nên khởi tạo đối tượng trước khi thả nó vào
bộ cấp phát Sàn.
Ngoài ra các cấp phát Sàn làm cho nó có thể phân bổ các bộ đệm bộ nhớ của một trong các kích
thước đặc biệt được xác định. Vùng đệm này có thể được nhận bằng cách sử dụng chức năng hạt nhân
kmalloc. Bạn xác định kích thước, phân bổ và kmalloc sẽ phân bổ khối kích thước lớn hơn, gần nhất
mà bạn yêu cầu. Kích thước của các khối bộ nhớ mà có thể được phân bổ theo kmalloc, có sẵn trong
các tập tin tiêu đề <linux/kmalloc_sizes.h>. Ngoài ra các hạt nhân có thể cấp phát bộ nhớ hầu như tiếp
giáp (bộ nhớ có địa chỉ ảo tiếp giáp, nhưng không tiếp giáp với các địa chỉ vật lý) bằng cách sử dụng
hàm vmalloc.
4.2. Sàn cấp phát: cấp phát bộ nhớ cho các đối tượng.
Rất nhiều các nhu cầu cấp phát bộ nhớ là không phải cho toàn bộ trang web hoặc các nhóm
trang nhưng đối với giao động của các đối tượng cụ thể. Việc phân bổ sàn Linux là một ví dụ về
một cấp phát bộ nhớ được thiết kế để quản lý các đối tượng hạt nhân năng động (ví dụ, Cột, bộ
đệm ổ cắm mạng). Mục tiêu thiết kế của bộ cấp phát sàn là preallocate vùng bộ nhớ tiếp giáp để
làm cho nó hiệu quả các yêu cầu phân bổ dịch vụ cho các đối tượng cụ thể.
Sàn là một khối bộ nhớ tiếp giáp lãnh hải, các trang thường nhau về kích thước. Mỗi tấm chịu
trách nhiệm xử lý các yêu cầu phân bổ cho các đối tượng có cùng kích thước. Bởi vì một sàn xử
lý các đối tượng có kích thước bằng nhau, không có vấn đề phân mảnh. Trong ngôn ngữ của bộ
cấp phát sàn, một bộ nhớ cache là một thuật ngữ cho một bộ sưu tập các tấm chịu trách nhiệm
cho một đối tượng cụ thể. Mỗi sàn có thể ở một trong ba trạng thái:
-Trống rỗng: tất cả các đối tượng trong phiến đá đều miễn phí. Điều này có nghĩa rằng bộ sưu
tập của các trang này phiến có thể, nếu cần thiết, được khai hoang bởi hệ điều hành cho các mục
đích khác.
-Full: tất cả các đối tượng trong phiến đá được sử dụng.
-Một phần: sàn có chứa cả hai đối tượng miễn phí và sử dụng.
Bộ cấp phát sàn là một danh sách liên kết của cache (kmem_cache). A, biến cache_chain điểm
bắt đầu của danh sách này. Mỗi bộ nhớ cache trong danh sách được xác định bởi các loại đối
tượng mà nó chịu trách nhiệm. Trong mỗi cấu trúc kmem_cache là ba con trỏ: một danh sách
đầy đủ của tấm, khác với một danh sách các tấm một phần, và một danh sách các sàn rỗng. Mỗi
của các đại diện cho một danh sách liên kết của các đối tượng sàn.
Một số hoạt động cơ bản trên một sàn là:
kmem_cache_create
Tạo ra một bộ nhớ cache mới. Hoạt động này thường được sử dụng khi hạt nhân khởi tạo hoặc
khi một mô-đun hạt nhân được nạp. Nó xác định tên của bộ nhớ cache và kích thước của các
đối tượng của nó. Lưu trữ riêng biệt cho các inodes, mục thư mục, ổ cắm TCP, vv Trên một hệ
thống Linux, bạn có thể xem tất cả các cấu hình các loại tấm và tình trạng phân bổ của họ trong
tập tin / proc / slabinfo.
kmem_cache_destroy
Tiêu diệt một bộ nhớ cache. Các trang được sử dụng bởi bộ nhớ cache được thu hồi do cấp
phát trang. Điều này thường được gọi là một module khi nó được dỡ xuống và các đối tượng cụ
thể được tạo ra bởi mô-đun đó sẽ không còn cần thiết.
kmem_cache_alloc / kmem_cache_free
Phân bổ một đối tượng từ một bộ nhớ cache được đặt tên. Nếu có không có tấm miễn phí
hoặc một phần, cấp phát sẽ gọi cache_alloc_refill thêm các trang bổ sung cho bê tông.
Kmem_cache_free chức năng đánh dấu các đối tượng như là miễn phí.
kmalloc / kfree
Điều này cũng tương tự như để kmem_cache_alloc ngoại trừ bộ nhớ cache không được quy
định cụ thể. Chức năng lặp thông qua danh sách các bộ nhớ cache cho đến khi nó tìm thấy một
trong đó có thể đáp ứng các kích thước yêu cầu. Linux cấu hình cấp phát sàn với cache chung
của một loạt các kích thước phổ biến (ví dụ, kmalloc-8, kmalloc-16, kmalloc-96, kmalloc-256).
Kfree chức năng đánh dấu các đối tượng được phân bổ như là miễn phí.
4.3. MMU -Tóm tắt thông tin.
Một đơn vị quản lý bộ nhớ hỗ trợ phân trang gây ra tất cả các địa chỉ logic (địa chỉ ảo) được dịch
sang một địa chỉ vật lý (thực tế địa chỉ) bằng cách dịch số trang hợp lý của địa chỉ một số khung trang
vật lý. Số trang bao gồm các bit cao của địa chỉ địa chỉ. Các bit thấp của hình thức địa chỉ bù đắp trong
trang (hoặc khung trang). Ví dụ, với một địa chỉ 64-bit, nếu một kích thước trang là 1 MB, sau đó 20
bit thấp nhất (địa chỉ 1 MB) hình thức bù đắp và 44 bit đầu hình thành số trang.
Trang dựa trên bộ nhớ ảo là mát mẻ. Nó làm giảm bớt các hệ điều hành phải tìm các khu vực tiếp
giáp của bộ nhớ đến nhà một quá trình, có thể được sử dụng bất kỳ các trang bộ nhớ có sẵn. Bảng trang
theo dõi của ánh xạ giữa các không gian địa chỉ ảo và vật lý. Mỗi quá trình có thể cảm thấy như nó sở
hữu không gian địa chỉ đầy đủ của bộ xử lý.
Các vấn đề của phân mảnh bên ngoài được loại bỏ hoàn toàn. Phân mảnh nội bộ tồn tại là không sử
dụng bộ nhớ trong một trang. Trang lớn hơn làm cho các bảng trang nhỏ hơn và sử dụng các TLB hiệu
quả hơn, nhưng tạo ra phân mảnh nội bộ hơn.
Bảng trang cũng cho phép hệ điều hành để quản lý bảo vệ bộ nhớ và xác định các trang cụ thể như
ghi hoặc chứa mã thực thi. Bởi vì mỗi quá trình cần có một bảng trang, hệ điều hành cần thiết lập một
trong những động khi lần đầu tiên tạo ra một quá trình. Sau đó, nó có thể chuyển đổi không gian địa chỉ
trong một bối cảnh chuyển đổi chỉ đơn giản bằng cách thay đổi đăng ký trang bảng cơ sở và nếu MMU
hỗ trợ nó, ID không gian địa chỉ đăng ký.
Cho một đơn vị quản lý bộ nhớ, mỗi tiến trình có thể có không gian địa chỉ riêng của mình. Cùng một
địa chỉ ảo có thể tham khảo hai khung trang khác nhau (vị trí bộ nhớ vật lý) cho hai quá trình khác
nhau bởi vì quá trình từng có bảng trang riêng của mình. Các hệ điều hành chịu trách nhiệm quản lý
bảng trang cho mỗi quá trình. Trong một bối cảnh chuyển đổi, hệ điều hành phải thông báo cho đơn vị
quản lý bộ nhớ của bộ vi xử lý mà nó đã sử dụng một bảng trang khác nhau. Nó làm điều này bằng
cách thay đổi bảng trang cơ sở đăng ký, đăng ký có chứa địa chỉ bắt đầu của bảng trang.
Hai tối ưu hóa thường xuất hiện trong các đơn vị quản lý bộ nhớ: một tối ưu hóa tra cứu thời gian và
tối ưu hóa không gian được sử dụng bởi bảng trang.
Nếu tất cả các dịch địa chỉ yêu cầu tra cứu trong một bảng trang sau đó truy cập bộ nhớ hiệu suất của
chúng tôi sẽ được hai lần như chậm kể từ khi chúng tôi cần phải đọc bảng trang ngoài việc truy cập vào
các vị trí bộ nhớ mà chúng tôi muốn. Chi phí này được giảm một bộ đệm lookaside dịch, hoặc TLB,
lưu trữ mục bảng trang thường xuyên được sử dụng trong bộ nhớ kết hợp của nó.
Bởi vì hầu hết các quá trình sử dụng chỉ một phần nhỏ của không gian địa chỉ ảo có sẵn, sẽ có các
khu vực lớn của một bảng trang sẽ chứa không có mục. Để giữ cho kích thước của một bảng trang dễ
quản lý hơn, một cấu trúc đa cấp thường được sử dụng. Các bit trang của một địa chỉ ảo được chia
thành hai phần: các bit cao xác định bù đắp vào một bảng chỉ số cấp cao nhất. Bảng chỉ số này có đăng
ký cơ sở cho các bảng trang một phần. Các bit thấp của các bit trang xác định bù đắp trong đó bảng
trang một phần.
III. Các phương pháp cấp phát không gian nhớ tự do.
1. Cấp phát liên tục (Contiguous).
Để phân bổ không gian nhớ cho một file, hệ thống chọn một đoạn liên tục các khối đĩa tự do để cấp
phát cho file đó. Với phương pháp này, để định vị file hệ thống chỉ cần biết địa chỉ của khối đĩa tự do
đầu tiên và số lượng khối (block) đã dùng.
Hình 4.2: Sơ đồ cấp phát liên tục.
- Ưu điểm:
+ Hỗ trợ cho phương pháp truy nhập tuần tự và truy nhập trực tiếp.
- Nhược điểm:
+ Phải chọn được thuật toán tối ưu để tìm được các vùng không gian tự do cấp phát cho file
(First Fit, Best Fit hoặc Worst Fit).
+ Có thể xảy ra trường hợp không đủ số khối đĩa tự do liên tiếp cần thiết để cấp phát cho file
(kích thước file lớn hơn vùng các khối đĩa liên tục lớn nhất).
+ Trong trường hợp các khối đĩa tự do nằm tản mạn sẽ không sử dụng được, gây lãng phí không
gian nhớ.
Các thuật toán tối ưu:
+ First fit: Cấp phát hole đầu tiên cái mà đủ lớn. Việc tìm kiếm có thể bắt đầu hoặc từ đầu tập
hole hoặc nơi mà tim kiếm firstfit trước đã kết thúc. Chúng ta có thể dừng việc tìm kiếm ngay khi
chúng ta tìm thấy một hole tự do đủ lớn.
+ Best fit: Cấp phát hole nhỏ nhất cái mà đủ lớn. Chúng ta phải tìm kiếm toàn bộ danh sách đó,
trừ khi danh sách đó được sắp sếp theo kích cỡ. Chiến lược này tạo ra một hole dưa thừa nhỏ nhất.
+ Worst fit: Cấp phát hole lớn nhất. Ngược lại, chúng ta phải tìm kiếm toàn bộ danh sách trừ khi
nó được sắp xếp theo kích thước. Chiến lược này tạo ra một hole dưa thừa lớn nhất, cái mà có thể hữu
ích hơn nhiều so với hole dưa thừa nhỏ hơn từ tiếp cận bestfit.
Những mô phỏng vừa trình bày thì cả first fit và best fit là tốt hơn worst fit trong việc giảm thời gian
và tận dụng lưu trữ.
4.4. Cấp phát liên kết (Linked).
Trong phương pháp này, mỗi file được định vị trong thư mục thiết bị bằng hai con trỏ, một cái trỏ tới
khối đĩa đầu tiên, một cái trỏ tới khối đĩa cuối cùng để cấp phát cho file. Trong mỗi khối đĩa đã cấp
phát cũng có một con trỏ để trỏ tới khối đĩa kế tiếp.
Ví dụ:
File F1 được cấp phát 5 khối đĩa có số hiệu 9, 16, 1, 11, 25; khối đầu là 9, khối cuối là 25.
- Ưu điểm:
+ Sử dụng được các khối đĩa tự do nằm tản mạn.
- Nhược điểm:
+ Chỉ hỗ trợ truy nhập tuần tự không hỗ trợ truy nhập trực tiếp, độ tin cậy không đảm bảo nếu bị
mất các con trỏ liên
Hình 4.3: Sơ đồ cấp phát liên tục.
4.5. Cấp phát theo chỉ số (Index).
Trong phương pháp này, để cấp phát không gian nhớ cho một file, hệ thống sử dụng một khối đĩa đặc
biệt gọi là khối địa chỉ số (index block) cho mỗi file. Trong khối đĩa chỉ số chứa địa chỉ của các khối
đĩa đã cấp phát cho file, trong thư mục thiết bị địa chỉ của các khối đĩa chỉ số. Khi một khối đĩa được
cấp phát cho file thì hệ thống loại bỏ địa chỉ của khối này khỏi danh sách các khối đĩa tự do và cập nhật
vào khối chỉ số của file.
Hình 4.4: Cấp phát theo chỉ số.
- Ưu điểm: Hỗ trợ truy nhập trực tiếp.
- Nhược điểm: Lãng phí không gian nhớ dành cho khối địa chỉ số.
5. Lập lịch cho đĩa (Disk-scheduling).
5.1. Khái niệm Disk-scheduling.
- Thời gian truy nhập đĩa phụ thuộc ba yếu tố:
+ Thời gian di chuyển đầu từ đọc ghi đến track or cylinder cần thiết (Seek time)
+ Thời gian định vị đầu từ đọc/ghi tại khối đĩa cần truy nhập (Latency-time)
+ Thời gian truy nhập dữ liệu (Transfer-time)
Mà Seek-time và Transfer-time thường cố định và phụ thuộc vào cấu trúc kỹ thuật của ổ đĩa nên hệ
điều hành quan tâm đến Latency-time khi muốn tăng tốc độ truy nhập đĩa.
- Như vậy chúng ta có thể định nghĩa rằng:
+ Lập lịch cho đĩa là xây dựng các thuật toán dịch chuyển đầu từ đọc/ghi sao cho thời gian truy
nhập đĩa là tối ưu nhất.
5.2. Một số phương pháp lập lịch.
a. First come first served (FCFS).
Để truy nhập tới 1 file, hệ thống sẽ tổ chức một hàng đợi các yêu cầu phục vụ các track (lưu trữ dữ
liệu của file cần truy nhập). Track nào có yều cầu phục vụ trước thì đầu từ đọc ghi sẽ dịch chuyển tới
đó trước.
VD: File F1 được phân bổ lần lượt tại các track có số thứ tự sau đây: 98, 183, 37, 122, 14, 124, 65,
67. Đầu từ đọc/ghi đang dịnh vị tại track có số thứ tự 53 thì sơ đồ dịch chuyển đầu từ đọc ghi theo thuật
toán FCFS được thể hiện như sau:
53 - 98 - 183 - 37 - 122 - 14 - 124 - 65 – 67
b. Shortest Seek Time First (SSTF).
Thuật toán SSTF sẽ chọn track nào có thời gian di chuyển đầu từ đọc ghi ngắn nhất thì ưu tiên phục
vụ track đó trước. VD:
53 - 65 - 67 - 37 - 14 - 98 - 122 - 124 – 183
c. Thuật toán Scan.
Trong thuật toán này đầu từ đọc/ghi quét từ track nhỏ nhất đến track lớn nhất sau đó quét ngược lại,
track nào có nhu cầu thì phục vụ.
d. Thuật toán C-Scan.
Thuật toán này tương tự như scan nhưng không quét chiều ngược lại.
e. Thuật toán Look.
Tương tự như thuật toán Scan nhưng trong thuật toán này đầu từ đọc/ghi chỉ quét trong phạm vi các
track có yêu cầu phục vụ, không quét tới track đầu tiên hoặc cuối cùng (nếu các track này không có nhu
cầu phục vụ).
f. Thuật toán C-Look
Tương tự như Look nhưng đầu từ đọc/ghi không phục vụ đường về.
Lưu ý: Thuật toán FCFS và SSFT là 2 thuật toán đang được sử dụng rất phổ biến.
6. Một số hệ thống file trong Linux.
6.1. Giới thiệu.
Hệ thống tập tin Linux được tổ chức theo dạng cây. Có một vị trí khởi điểm, gọi là root (gốc). Bất kỳ
một hệ thống Unix/Linux nào cũng có một thư mục đặc biệt gọi là thư mục gốc (root directory) kí hiệu
là dấu slash (“/”). Đây là điểm bắt đầu để gắn (mount point) tất cả các phần tử còn lại như hệ thống
disks, partitions, CD ROM… vào hệ thống Linux/Unix.
Hiện nay, các hệ thống file tiên tiến được sử dụng trong Linux như Ext2, Ext3, Ext4 có độ tin cậy cao
và có khả năng ghi nhớ quá trình thao tác trên dữ liệu (journaling).
Tên truy cập ô đĩa theo định dạng sau: /dev/xxyN
Trong đó: "dev” – là tên của thư mục chứa tất cả các tập tin thiết bị.
“xx” – chỉ ra kiểu của thiết bị mà phần chia nằm trên đó.
“Y” – Chỉ chữ cái này xác định thiết bị mà phần chia nằm trên đó.
“N” – Số cuối cùng biểu thị cho phần chia.
6.2. Hệ thống Ext 2.
Tính năng
Kích thước hệ thống file lớn nhất
Kích thước file lớn nhất
Chiều dài tối đa tên file
Kích thước block tuỳ biến
Minix
64 MB
64 MB
30 ký tự
Không
- Đặc trưng:
+ Hệ thống tập tin Ext2 hỗ trợ các kiểu tập tin Unix chuẩn.
EXT
2 GB
2 GB
255 ký tự
Không
EXT 2
4 TB
2 GB
255 ký tự
Có
+ Hệ thống tập tin Ext2 cung cấp tên tập tin dài.
+ Hệ thống tập tin Ext2 dự trữ một vài block cho super user (root).
+ Hệ thống tập tin Ext2 cho phép truy xuất đến các hệ thống khác như FAT, FAT32, MSDOS
trên Windows 9.x và DOS một cách dễ dàng và ngược lại.
Hình 6.1: Tổng quan về hệ thống tập tin EXT 2.
6.3. Hệ thống Ext 3.
Được xây dựng dựa trên cơ sở của hệ thống file chuẩn ext2 mà Linux đang sử dụng, ext3 đưa vào
thêm chức năng mới vô cùng quan trọng, journaling file system (JFS), giúp thao tác dữ liệu an toàn
hơn.
Ngoài ra, hệ thống ext còn có thêm cơ chế JBD (Journaling Block Device) để bảo vệ thông tin thao
tác trên dữ liệu, được đánh giá là tin cậy hơn so với các hệ thống chỉ thực hiện journaling trên chỉ mục
dữ liệu (journaling of metadata only) như Reiserfs, XFS hay JFS. Với cách bảo vệ hai lần như vậy thì
hiệu suất ghi dữ liệu có phần nào chậm hơn ext2; nhưng trong một vài trường hợp, nhờ thông tin trong
journal log mà đầu từ ổ cứng di chuyển hợp lý hơn, nên tốc độ thao tác dữ liệu nhanh hơn.
- Những ưu điểm của hệ thống tập tin Ext3:
+ Tính khả dụng: Khi bộ nguồn bị hỏng hay hệ thống đổ vỡ bất chợt, mỗi phân vùng định dạng
theo ext2 trên máy tính phải được kiểm tra việc đồng nhất của chúng bằng chương trình e2fsck. Việc
này cần khoảng thời gian để tiến hành làm thời gian khởi động hệ thống bị trễ đáng kể, đặc biệt là với
phân vùng lớn.Trong suốt thời gian này dữ liệu trên phân vùng không được dùng đến. Ext3 được đưa ra
để không cần phải thực hiện việc kiểm tra đó khi hệ thống máy tính bị tắt đột ngột, việc kiểm tra chỉ
xảy ra khi phần cứng bị hư hỏng, chẳng hạn như ổ đĩa cứng bị hư. Thời gian kiểm tra không phụ thuộc
vào dung lượng hay số lượng file của phân vùng.
+Tính toàn vẹn của dữ liệu: Hệ thống tập tin ext3 cung cấp việc bảo toàn dữ liệu trong việc hệ
thống tắt đột ngột, và cho phép ta chọn loại và mức độ bảo vệ dữ liệu. Mặc định là mức bảo vệ cao nhất
(high level).
+Tốc độ: Bất chấp việc ghi dữ liệu nhiều lần hay một lần, ext3 có số lượng dữ liệu đưa vào quá
trình ghi nhiều hơn hẳn so với ext2 bởi ext3 đã tối ưu hóa đầu đọc chuyển động của ở đĩa cứng. Ta có
thể chọn một trong ba mức để tối ưu tốc độ nhưng điều này có thể làm giảm tính toàn vẹn của dữ liệu.
+Dễ dàng chuyển đổi: Thật dễ dàng để ta chuyển đổi từ ext2 lên ext3 và đạt được những lợi ích
của một hệ thống tập tin mạnh mà không cần phải định dạng lại.
Để chuyển đổi từ ext2 sang ext3, đăng nhập bằng root và gõ lệnh:
/sbin/tune2fs –j /dev/hdbx
/dev/hdb : thay bằng tên thiết bị và x là số thứ tự của phân vùng cần chuyển đổi.
6.4. Hệ thống Ext 4.
Dung lượng 32 bit trong phiên bản 3 từng là nguyên nhân làm giới hạn kích thước hệ thống tập tin 16
TB hiện hành. Để mở rộng giới hạn của hệ thống tệp tin, phương pháp đơn giản là tăng dung lượng bit
được sử dụng để đại diện cho số lượng khối và sau đó sửa chữa tất cả các tham chiếu cho các dữ liệu và
các khối siêu dữ liệu. Ở phiên bản 4, thay vì mở rộng số lượng khối lên đến 64 bit, người phát triển
phiên bản 4 quyết định mở rộng bản đồ với số khối 48 bit. Nguyên do là vì nếu sử dụng 64 bit thì sẽ rất
khó để kiểm soát được trọn vẹn bộ nhớ khổng lồ.
Kể từ khi địa chỉ các khối thay đổi trong hệ thống tập tin được đăng trên tạp chí, khối lớp nhật kí
(JBD) cũng được yêu cầu để hỗ trợ các địa chỉ khối ít nhất là 48 bit. Vì thế, JBD phân nhánh thành
JBD2 để hỗ trợ số khối hơn 32 bit, cùng lúc đó thì phiên bản 4 cũng được chia hai. Mặc dù hiện tại chỉ
có phiên bản 4 là sử dụng JBD2, nó có thể cung cấp hỗ trợ ghi lại nhật kí chung của cả hai hệ thống tập
tin 32 bit và 64 bit.
-THE ENDNhóm thực hiện: Vũ Tiến Long
Vương Quốc Huỳnh
Nguyễn Thanh Tú
Phạm Duy Đạt
Nguyễn Trung Huy