Tại sao không có tòa nhà chèn tập tin


11

Theo hiểu biết của tôi, để thao tác các tệp chỉ có sys_write syscall trong Linux, ghi đè lên nội dung tệp (hoặc mở rộng nó, nếu ở cuối).

Tại sao không có các tòa nhà để chèn hoặc xóa nội dung trong các tệp trong Linux?

Vì tất cả các hệ thống tệp hiện tại không yêu cầu tệp được lưu trữ trong một khối bộ nhớ liên tục, nên có thể thực hiện hiệu quả. (Các tập tin sẽ bị phân mảnh.)

Với các tính năng của hệ thống tệp là "sao chép khi ghi" hoặc "nén tệp trong suốt", cách chèn nội dung hiện tại dường như rất không hiệu quả.


4
Như với tất cả các hoạt động tập tin ưa thích, một hoạt động như vậy trong thực tế ít hữu ích hơn nhiều so với nó xuất hiện. Việc sử dụng chính cho một điều như vậy là các ứng dụng rất chuyên biệt, như cơ sở dữ liệu, trình giả lập và như vậy. Cách bạn thường "chỉnh sửa" tệp bằng cách tạo tệp mới và có thao tác "lưu" bằng cách người dùng đổi tên tệp mới thành tệp cũ.
mosvy

3
@mosvy, nhưng khái niệm "tạo tệp mới, sau đó đổi tên" được sử dụng bởi vì bản thân nó tốt hay chính xác là vì hệ thống không cung cấp cách nào tốt hơn? Đặc biệt là trên các hoạt động của tệp văn bản như "sửa đổi dòng này (thay đổi độ dài)" hoặc "chèn các dòng này vào đây" là khá phổ biến, do đó, người ta có thể cho rằng các hoạt động của hệ thống tệp cho các chức năng chính xác đó sẽ được sử dụng nếu chúng ở đó. Tất nhiên, không có chúng làm cho việc thực hiện fs đơn giản hơn nhiều ...
ilkkachu

1
@meuh OpenVMS vẫn vậy, thông qua RMS (Dịch vụ quản lý hồ sơ).
RonJohn

1
UNIX đã bắt đầu một bước đi từ việc cung cấp các hệ thống quản lý hồ sơ bên trong hệ thống tệp.
dùng207421

1
@ilkkachu Bản thân nó cũng tốt, hoàn toàn không có gì phải nghi ngờ ;-) Thậm chí, nếu inodes là bất biến, điều đó sẽ giúp thực hiện chia sẻ khối, phiên bản và hầu hết mọi thứ hiệu quả hơn (và đơn giản hơn nhiều để lý do). Hãy suy nghĩ bằng cách tương tự như thế nào tất cả các ngôn ngữ script đã chuyển sang các chuỗi bất biến - nhưng tôi sẽ cắt ngắn nó ở đây; thật khó để nói về
khuynh hướng

Câu trả lời:


22

Trên các hệ thống Linux gần đây thực sự có thể, nhưng với khối (4096 hầu hết thời gian), không phải là độ chi tiết byte và chỉ trên một số hệ thống tệp (ext4 và xfs).

Trích dẫn từ fallocate(2)trang chủ:

int fallocate(int fd, int mode, off_t offset, off_t len);

[...]

Thu gọn không gian tập tin

Chỉ định FALLOC_FL_COLLAPSE_RANGEcờ (có sẵn từ Linux 3.15) trong việc modeloại bỏ phạm vi byte khỏi tệp mà không để lại lỗ hổng. Phạm vi byte được thu gọn bắt đầu tại offsetvà tiếp tục cho len byte. Khi hoàn thành thao tác, nội dung của tệp bắt đầu tại vị trí offset+lensẽ được thêm vào vị trí offsetvà tệp sẽ có lenbyte nhỏ hơn.

[...]

Tăng dung lượng tập tin

Chỉ định FALLOC_FL_INSERT_RANGEcờ (có sẵn từ Linux 4.1) để modetăng không gian tệp bằng cách chèn một lỗ trong kích thước tệp mà không ghi đè bất kỳ dữ liệu hiện có nào. Lỗ sẽ bắt đầu tại offsetvà tiếp tục cho lenbyte. Khi chèn lỗ bên trong tệp, nội dung của tệp bắt đầu từ offsetsẽ được dịch chuyển lên trên (nghĩa là bù vào tệp cao hơn) theo lenbyte. Chèn một lỗ bên trong tệp làm tăng kích thước tệp theo lenbyte.


1
"nhưng với khối (4096), không phải độ chi tiết byte" - Các khối 4KiB rất phổ biến trong ext4, nhưng điều đó không được đảm bảo. Ext4 hỗ trợ kích thước khối 1KiB, 2KiB và 4KiB ; và tôi nhớ từ những ngày ext2 mà trên bộ xử lý Alpha, 8KiB cũng được hỗ trợ. Bạn không thể giả sử các khối là 4KiB, tôi sợ.
marcelm

1
4k (là mặc định) là bội số của 1k và 2k, vì vậy không có vấn đề gì khi giả sử 4k với ext4. Mặc dù xfs cũng sẽ mặc định là 4k, nhưng nó được cho là hỗ trợ bs lớn hơn 4k - lên tới 64k, nhưng tôi chỉ có thể tạo một fs như vậy - việc cài đặt không thành công khi không có ENOSYS. Và dù sao, bạn không thể giả sử bất cứ điều gì - tính năng này không được hỗ trợ trên tất cả các fs, vì vậy tốt hơn là chỉ nói block = 4096, vì vậy người đọc có một số ý nghĩa về tỷ lệ, thay vì để nó nổi và để mọi người có thể là bất cứ điều gì, hoặc tệ hơn, đó là 512 byte hoặc bằng cách nào đó có liên quan đến kích thước trang vm.
mosvy

Sau khi bạn chỉnh sửa (nơi bạn nói thường là 4KiB), tôi hoàn toàn đồng ý! Vấn đề của tôi là trước đây nó dễ dàng được đọc là "các khối luôn là 4KiB" , điều này có thể khiến mọi người đưa ra giả định đó và viết mã lỗi.
marcelm

9

Vì tất cả các hệ thống tệp hiện tại không yêu cầu tệp được lưu trữ trong một khối bộ nhớ liên tục,

Các hệ thống tệp có thể không yêu cầu các tệp được lưu trữ trong một khu vực liên tục (và điều đó thực sự rất không linh hoạt), nhưng thông thường các tệp được lưu trữ trong các khối có kích thước cố định (hoặc chuỗi các khối liền kề). Làm theo cách đó đơn giản hóa việc thực hiện và các khối thường là bội số của kích thước khối của thiết bị bên dưới.

Vì vậy, việc thực hiện chèn các khối với độ dài tùy ý sẽ làm cho định dạng và thực hiện hệ thống tệp trở nên phức tạp hơn hoặc yêu cầu di chuyển một lượng lớn dữ liệu xung quanh. Cả hai đều không thực sự tốt và các cấu trúc dữ liệu phức tạp có thể được xây dựng trong không gian người dùng trên API của hệ thống tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.