Memindahkan File Saat Sedang Digunakan - Bagaimana cara kerjanya?

31

Saya telah memperhatikan bahwa pada OS non-windows .... yaitu linux / mac saya dapat melakukan hal-hal seperti: - Kirim zip ke teman melalui tujuan - Hapus file saat sedang dalam transfer

Dan transfernya tidak gagal.

Atau, saya dapat melakukan operasi seperti .. - memulai film - menghapus file - film masih diputar hingga selesai (baca dari disk, tidak hanya buffered di memori)

Walaupun file-file itu "dihapus", seperti yang saya sebutkan, mereka sebenarnya dipindahkan ke lokasi yang berbeda pada sistem file ... yaitu direktori Tempat Sampah atau sesuatu. Jadi sepertinya saya seperti OS menggunakan pointer @ file yang diperbarui ketika bergerak daripada mengakses file secara langsung.

Adakah yang bisa menjelaskan bagaimana kemampuan AWESOME ini benar-benar diimplementasikan? Saya bahkan tidak yakin apa yang harus google pelajari lebih lanjut.

Terima kasih.

Mario Zigliotto
sumber
1
Secara teori saya kira ada 2 cara itu bisa terjadi. Keduanya adalah kenyataan. File ada di memori. Atau sistem file memiliki referensi ke file dan hanya referensi yang dihapus. Keduanya adalah kenyataan. Fakta rujukan adalah bagaimana program yang tidak dihapus dapat membatalkan penghapusan hal-hal. Gagasan bahwa file tersebut sebenarnya dihapus ketika semua program menutupnya, terdengar seperti omong kosong. Anda bisa mencari tentang daftar tertaut (struktur data pemrograman, untuk memahami konsep secara lebih mendalam). Atau Anda dapat mencari tentang sistem file tertentu.
barlop

Jawaban:

29

Entri direktori hanyalah sebuah penunjuk ke inode. Inode berisi meta-informasi tentang file (selain nama), dan menunjuk ke data file (jika ada). Ketika Anda mulai menyalin file, Anda dapat menangani inode.

Sistem operasi mempertahankan sejumlah referensi ke inode. Selama ada referensi ke inode, inode dan data file disimpan. Setelah semua referensi ke inode dihapus, inode adalah dan ruang yang dibutuhkan oleh file dilepaskan.

Karena Anda memiliki file yang terbuka untuk disalin, file itu akan disimpan hingga proses Anda menutup file. Ini harus terjadi ketika transfer file selesai, dan akan terjadi jika proses penyalinan gagal. Jika transfer file gagal sebagian dan Anda telah menghapus semua tautan keras ke file, Anda tidak akan dapat memulai kembali transfer dengan sukses.

EDIT: Seperti yang lain telah dicatat, pemindahan file pada perangkat yang sama dilakukan tanpa memindahkan data. Sebaliknya entri direktori baru dibuat di direktori tujuan, dan entri direktori asli dihapus.

Dimungkinkan untuk memiliki banyak entri direktori untuk file yang sama. Ini disebut tautan keras. Mereka dibuat dengan membuat entri direktori baru untuk file tanpa menghapus entri asli. Inode sistem file memiliki jumlah referensi untuk mencatat jumlah entri direktori yang menunjuk ke file.

EDIT2: Jika proses macet atau terbunuh, file akan dihapus dengan bersih karena jumlah akses dalam memori akan dikurangi menjadi nol. Ini adalah tindakan yang terjadi ketika program berakhir secara normal.

Dalam hal terjadi kegagalan daya atau shutdown sistem yang tidak teratur lainnya, disk akan memerlukan fsck(pemeriksaan sistem file) sebelum dapat sepenuhnya dipasang. Bergantung pada keadaan inode disk dan struktur direktori, ruang akan dipulihkan, file akan tetap di direktori, atau entri baru akan dibuat di lost+founddirektori. Hasil akan tergantung pada perubahan mana yang telah dibilas ke disk atau ditulis ke jurnal sistem file.

BillThor
sumber
5
Persis. Saya sendiri tidak bisa membuatnya lebih baik. Kebetulan, trik umum, jika Anda memerlukan beberapa penyimpanan file awal dalam suatu program, adalah membuat file /tmp, dan segera unlink(2). Pada saat itu, tidak ada file di direktori (jadi tidak ada yang perlu dibersihkan saat keluar atau macet), tetapi proses Anda masih memiliki akses ke file tersebut, dan tidak ada proses lain yang bisa secara tidak sengaja atau sengaja mengacaukannya. Itu menggambarkan properti yang menarik.
Norman Gray
Apakah ini berarti bahwa jika file terbuka dihapus saat program menggunakannya dan terjadi kegagalan daya, data yang terdampar akan tetap berada di drive yang menempati ruang? Bagaimana jika proses menggunakan file crash atau terbunuh?
Jason C
1
@JasonC Saya telah memperbarui jawaban untuk menjawab pertanyaan Anda.
BillThor
6

Sebagaimana dijelaskan oleh Matt Jenkins, OS (sistem file) melacak file yang tetap dibuka oleh aplikasi. Selama suatu proses membuat file tetap terbuka, datanya tetap pada disk (meskipun telah dihapus dan tidak lagi terlihat atau dapat diakses oleh program lain.

Perhatikan bahwa konsekuensi dari ini adalah bahwa ruang yang ditempati oleh file hanya dapat direklamasi setelah proses terakhir menggunakannya telah menutupnya. Itu adalah FAQ untuk operasi sistem file Linux / Unix: "'df' perintah mengatakan partisi penuh, sementara 'du' melaporkan ruang kosong" (lihat misalnya http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html ). Jika Anda perlu mengosongkan ruang, itu tidak cukup untuk menghapus file besar (mis. File log), Anda juga harus memastikan tidak ada proses yang membuatnya tetap terbuka (biasanya masalah dengan file log).

sleske
sumber
Tidak benar jika OS X / HFS +: Anda dapat memindahkan file, mis. Ke Sampah, tetapi tidak melintasi partisi atau menghapusnya (mis. Mengosongkan Sampah).
Daniel Beck
2

Sebenarnya cukup sederhana. File memelihara daftar referensi - proses yang mengakses file. Ketika Anda menghapus file itu hanya menghapus daftar dari direktori tetapi bukan file itu sendiri. Program yang masih membuka file masih dapat mengaksesnya. File hanya dihapus ketika semua program yang mengaksesnya menutupnya.

Juga, dengan memindahkan file - jika berada dalam sistem file yang sama - file tersebut tidak benar-benar bergerak seperti itu, itu hanya mengubah pointer ke direktori file tersebut.

Majenko
sumber
"File menyimpan daftar referensi"?
Daniel Beck
Seharusnya "OS atau Explorer" bukan file.
Moab
2
Itu sebenarnya adalah sistem file.
JRobert
OS menggunakan sistem file untuk menyimpan referensi dalam file (nlink dalam struktur header file) - di sana - kami semua senang;)
Majenko
1
"Referensi" adalah kedua proses dengan pegangan terbuka ke file dan tautan keras (termasuk nama file pertama) ke file. Blok data tidak ditandai gratis dan tersedia untuk digunakan kembali sampai jumlah referensi menjadi nol.
mpez0
0

Dalam sistem file unix, file dapat memiliki satu atau lebih tautan keras ke sana. File tersebut hidup selama setidaknya ada satu. Ketika yang terakhir dihapus, ruang file dibebaskan. tautan di atas akan memberi Anda titik awal untuk lebih banyak membaca - lihat terutama bagian "Penghitung tautan".

JRobert
sumber
1
Benar, tapi bukan itu yang terjadi di sini. Intinya adalah bahwa bahkan setelah hardlink terakhir dihapus , file tersebut masih tetap sampai semua proses ditutup pegangan mereka.
sleske