CHƯƠNG 4 : HỆ THỐNG FILE
4.6. QUẢN LÝ KHÔNG GIAN TRÊN ĐĨA
Không gian trên đĩa được cấp phát theo từng khối không phân chia. Để quản lý hiệu quả không gian trên đĩa, ngoài phương pháp cấp phát khối nhớ cho file, cần chú ý tới hai vấn đề: vấn đề lựa chọn kích thước cho khối, và cách quản lý những khối trống (hiện không cấp phát cho file nào).
4.6.1. Kích thước khối
Khối là đơn vị cấp phát nhỏ nhất của hệ điều hành, mỗi file bao gồm một số nguyên các khối nhớ. Trong trường hợp kích thước file khơng bằng bội số kích thước khối, khối cuối
cùng của file sẽ khơng được sử dụng hết và bị bỏ phí. Hiện tượng này gọi là phân mảnh trong (internal segmentation). Ví dụ, nếu kích thước khối là 1KB và file có kích thước 5,6KB thì file sẽ cần tất cả 6 khối, trong đó khối cuối cùng có 0,4KB khơng được sử dụng. Hệ thống file NTFS của Windows NT hoặc Windows thế hệ sau cho phép hiển thị kích thước chính xác của file cũng như kích thước mà file chiếm trên đĩa được tính dựa trên số khối cấp phát cho file.
Hình 4.11: Khối chỉ số nhiều mức
Việc lựa chọn kích thước khối ảnh hưởng trực tiếp tới hiệu quả lưu trữ và truy cập dữ liệu trên đĩa. Nếu chọn khối nhớ có kích thước lớn, khơng gian bị bỏ phí do phân mảnh trong sẽ tăng lên. Việc lựa chọn khối nhớ kích thước nhỏ cho phép tiết kiệm khơng gian nhờ giảm ảnh hưởng của phân mảnh trong. Tuy nhiên, kích thước khối nhỏ đồng nghĩa với việc mỗi file sẽ bao gồm nhiều khối hơn. Nếu các khối này nằm rải rác trên đĩa, thời gian cần thiết cho việc đọc/ghi file sẽ tăng lên. Ngoài ra, hệ điều hành sẽ phải dành nhiều không gian hơn để lưu thông tin quản lý khối.
Như vậy, yêu cầu về tránh phân mảnh trong mâu thuẫn với yêu cầu về tốc độ truy cập và đòi hỏi giải pháp dung hòa hai yêu cầu này. Đối với đĩa có dung lượng lớn, việc tiết kiệm khơng quan trọng bằng tốc độ nên có thể chọn khối kích thước lớn. Ngược lại, với đĩa dung lượng nhỏ, khối sẽ có kích thước nhỏ hơn. Hệ điều hành có thể lựa chọn kích thước khối tự động dựa trên dung lượng đĩa hoặc cho phép người dùng lựa chọn khi format đĩa.
Trên thực tế, kích thước khối vật lý (sector) nhỏ nhất thường được chọn bằng 512B và kích thước khối lơ gic là lũy thừa 2 của kích thước khối vật lý, thường nằm trong khoảng từ 512B tới 32KB. 4.6.2. Quản lý các khối trống Khối chỉ số Thuộc tính Địa chỉ trực tiếp . . . Gián tiếp mức 1 Gián tiếp mức 1 Gián tiếp mức 1 dữ liệu liÖu dữ liệu ... dữ liệu dữ liệu ... ... ... dữ liệu dữ liệu dữ liệu dữ liệu dữ liệu dữ liệu khối chỉ số gián tiếp mức 1 khối chỉ số gián tiếp mức 2 khối chỉ số gián tiếp mức 3 ... PTIT
Để có thể cấp phát khối nhớ trên đĩa cho file, hệ điều hành cần biết khối nào hiện đang trống. Các khối trống bao gồm những khối chưa được cấp phát lần nào hoặc cấp phát rồi nhưng đã được giải phóng. Để quản lý khối trống này, hệ điều hành thường sử dụng danh sách khối trống hoặc duy trì một kiểu bản đồ các khối trên đĩa. Khi cần thiết, các khối được lấy từ danh sách này và cấp phát cho file. Sau khi file bị xoá hoặc giảm kích thước, các khối được giải phóng lại được trả về danh sách khối trống. Sau đây là một số phương pháp thường dùng để lưu trữ danh sách hoặc bản đồ khối trống này.
Bảng bit. Bảng bit hay bản đồ bit (bit map) là một mảng một chiều. Mỗi ơ của mảng có
kích thước 1 bit và ứng với 1 khối nhớ trên đĩa. Khối đã được cấp phát có bit tương ứng là 0, khối chưa được cấp phát có bit tương ứng là 1 (hoặc ngược lại).
Ví dụ: Trong trường hợp sau, các khối 0, 1, 8, 9, 10 đã được cấp phát, các khối còn lại chưa bị sử dụng:
00111111000111111...
Do nhiều bộ vi xử lý cung cấp các lệnh cho phép tìm ra các bit đầu tiên có giá trị 1 hoặc 0 trong một từ nhớ (ví dụ vi xử lý Intel bắt đầu từ 80386 và Motorola bắt đầu từ 68020) nên việc tìm ra vùng các khối trống có thể thực hiện rất nhanh ở mức phần cứng. Hệ điều hành có thể chia vectơ bit thành các từ và kiểm tra xem từ đó có khác. Sau đó vị trí bit đầu tiên bằng 0 được xác định. Khối tương ứng chính là khối trống cần tìm.
Tuy nhiên, việc tìm kiếm như trên chỉ có thể thực hiện nếu tồn bộ vectơ bit được chứa trong bộ nhớ. Với những đĩa kích thước lớn, việc đọc toàn bộ vectơ bit vào bộ nhớ như vậy có thể địi hỏi khá nhiều bộ nhớ. Ví dụ một đĩa kích thước 8GB với nếu chia thành khối kích thước 1KB sẽ có vectơ bit tương ứng là 1Mb.
Danh sách kết nối. Tương tự như trong trường hợp sử dụng danh sách kết nối cho file,
các khối trống được liên kết với nhau thành danh sách. Mỗi khối trống chứa địa chỉ của khối trống tiếp theo. Địa chỉ khối trống đầu tiên trong danh sách này được lưu trữ ở một vị trí đặc biệt trên đĩa và được hệ điều hành giữ trong bộ nhớ khi cần làm việc với các file.
Giống như trường hợp danh sách kết nối cho file, việc sử dụng danh sách kết nối để quản lý khối trống đòi hỏi truy cập lần lượt các khối trống khi cần duyệt danh sách này. Tuy nhiên, trong đa số trường hợp, hệ điều hành ít khi phải duyệt danh sách mà có thể cấp phát ngay các khối ở đầu danh sách. Việc duyệt chỉ cần thiết khi cần tìm các khối trống nằm kề nhau như trong phương pháp cấp phát khối liên tiếp.
Danh sách vùng trống. Phương pháp này lợi dụng một đặc điểm là các khối nằm liền
nhau thường được cấp phát và giải phóng đồng thời. Do đó, thay vì lưu trữ địa chỉ từng khối trống, hệ điều hành lưu vị trí khối trống đầu tiên của vùng các khối trống liên tiếp và số lượng các khối trống nằm liền ngay sau đó. Hai thơng số này sau đó sẽ được lưu trong một danh sách riêng. Vì số lượng vùng trống ít hơn số lượng từng khối trống nên danh sách vùng trống có kích thước bé hơn danh sách từng khối trống rất nhiều.
Một số hệ thống file có thể khơng sử dụng các cấu trúc riêng nói trên để quản lý khối trống mà kết hợp luôn vào cấu trúc quản lý khơng gian trung của đĩa. Ví dụ, hệ thống file FAT của MS-DOS và Windows quản lý ngay khối trống trong FAT bằng cách đánh dấu các
khối này một cách đặc biệt: ô tương ứng với khối trống trong bảng FAT có giá trị 0. Khơng có cấu trúc dữ liệu nào được tạo riêng để quản lý khối trống nữa.