Mengapa tidak ada syscall penyisipan file

11

Untuk pemahaman saya, untuk memanipulasi file hanya ada sys_write syscall di Linux, yang menimpa konten file (atau memperluasnya, jika pada akhirnya).

Mengapa tidak ada syscalls untuk menyisipkan atau menghapus konten dalam file di Linux?

Karena semua sistem file saat ini tidak memerlukan file untuk disimpan dalam blok memori berkelanjutan, implementasi yang efisien harus dimungkinkan. (File akan terfragmentasi.)

Dengan fitur sistem file sebagai "copy on write" atau "kompresi file transparan", cara saat memasukkan konten tampaknya sangat tidak efisien.

dercolamann
sumber
4
Seperti semua operasi file mewah, operasi seperti itu jauh lebih tidak berguna dalam praktiknya daripada yang tampak. Penggunaan utama untuk hal semacam itu adalah aplikasi yang sangat khusus, seperti basis data, emulator, dan semacamnya. Cara Anda biasanya "mengedit" file adalah dengan membuat file baru dan dan memiliki operasi "simpan" oleh pengguna, ganti nama file baru ke yang lama.
Mosvy
3
@mosvy, tetapi apakah konsep "buat file baru, lalu ganti nama" digunakan karena baik, atau karena sistem tidak menyediakan cara yang lebih baik? Terutama pada operasi file teks seperti "modifikasi baris ini (mengubah panjang)" atau "masukkan baris ini di sini" agak umum, sehingga orang dapat menganggap bahwa operasi sistem file untuk fungsi-fungsi yang tepat akan digunakan jika mereka ada di sana. Tentu saja, tidak memiliki mereka membuat implementasi fs jauh lebih sederhana ...
ilkkachu
1
@meuh OpenVMS masih melakukannya, melalui RMS (Record Management Services).
RonJohn
1
UNIX mulai bergerak menjauh dari menyediakan sistem manajemen catatan dalam sistem file.
user207421
1
@ilkkachu itu bagus, tidak diragukan lagi ;-) Bahkan, jika inode tidak dapat diubah, itu akan membuat implementasi block sharing, versi, dan hampir semuanya jauh lebih efisien (dan lebih mudah untuk dipikirkan). Pikirkan dengan analogi bagaimana semua bahasa skrip beralih ke string yang tidak dapat diubah - tetapi saya akan memotongnya di sini; sulit untuk berbicara tentang filesystem dan tidak terdengar seperti dukun ;-)
mosvy

Jawaban:

22

Pada sistem Linux baru-baru ini yang sebenarnya mungkin, tetapi dengan blok (4096 sebagian besar waktu), tidak byte granularity, dan hanya pada beberapa sistem file (ext4 dan xfs).

Mengutip dari halaman fallocate(2)manual:

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

[...]

Menyempitkan ruang file

Menentukan FALLOC_FL_COLLAPSE_RANGEflag (tersedia sejak Linux 3.15) dalam modemenghapus rentang byte dari file, tanpa meninggalkan lubang. Rentang byte yang akan diciutkan dimulai pada offsetdan berlanjut untuk len byte. Pada penyelesaian operasi, isi file mulai dari lokasi offset+lenakan ditambahkan di lokasi offset, dan file akan lebih lenkecil byte.

[...]

Meningkatkan ruang file

Menentukan FALLOC_FL_INSERT_RANGEflag (tersedia sejak Linux 4.1) dalam modemeningkatkan ruang file dengan memasukkan lubang di dalam ukuran file tanpa menimpa data yang ada. Lubang akan dimulai pada offsetdan berlanjut untuk lenbyte. Saat memasukkan lubang di dalam file, isi file mulai dari offsetakan digeser ke atas (yaitu, ke file offset yang lebih tinggi) oleh lenbyte. Memasukkan lubang di dalam file meningkatkan ukuran file dengan lenbyte.

mosvy
sumber
1
"tetapi dengan blok (4096), bukan byte granularity" - blok 4KiB sangat umum di ext4, tapi itu tidak dijamin. Ext4 mendukung ukuran blok 1KiB, 2KiB dan 4KiB ; dan saya ingat dari ext2 hari bahwa pada prosesor Alpha, 8KiB didukung juga. Anda tidak bisa hanya menganggap blok 4KiB, saya khawatir.
marcelm
1
4k (yang merupakan default) adalah kelipatan dari 1k dan 2k, jadi tidak ada masalah dengan asumsi 4k dengan ext4. Sementara xfs akan default ke 4k juga, itu seharusnya mendukung bs lebih besar dari 4k - hingga 64k, tapi saya hanya bisa membuat fs - pemasangan itu gagal tanpa ENOSYS. Dan lagi pula, Anda tidak dapat berasumsi apa pun - fitur ini tidak didukung pada semua fs, jadi lebih baik hanya mengatakan blok = 4096, sehingga pembaca memiliki rasa proporsi, daripada membiarkannya mengambang dan membiarkan orang itu bisa apa saja, atau lebih buruk, itu 512 byte atau entah bagaimana terkait dengan ukuran halaman vm.
Mosvy
Setelah Anda mengedit (di mana Anda mengatakan itu biasanya 4KiB), saya sepenuhnya setuju! Masalah saya adalah bahwa sebelumnya mudah dibaca sebagai "blok selalu 4KiB" , yang dapat menyebabkan orang membuat asumsi itu dan menulis kode kereta.
marcelm
9

Karena semua sistem file saat ini tidak memerlukan file untuk disimpan dalam blok memori berkelanjutan,

Filesystem mungkin tidak memerlukan file untuk disimpan dalam area kontinu (dan itu akan sangat tidak fleksibel), tetapi biasanya file disimpan dalam blok ukuran tetap (atau urutan blok yang berdekatan). Melakukannya dengan cara menyederhanakan implementasi, dan blok biasanya kelipatan dari ukuran blok perangkat yang mendasarinya.

Jadi, menerapkan sisipan blok dengan panjang sewenang-wenang akan membuat format dan implementasi sistem file menjadi lebih kompleks atau membutuhkan pemindahan sejumlah besar data yang berpotensi. Tidak satu pun dari itu yang benar-benar bagus, dan struktur data yang kompleks dapat dibangun di userspace di atas API sistem file.

ilkkachu
sumber