Saya telah mempelajari beberapa implementasi Linux dan sebuah pertanyaan muncul di benak saya.

Sejauh yang saya tahu, ada sedikit yang menandai file sebagai file sementara. Ketika proses yang menghasilkan file itu mati, bagaimana kernel menghapusnya? Saya berpikir bahwa itu mungkin terkait dengan tabel deskriptor file, tetapi saya tidak yakin sama sekali.

Jika seseorang bisa memberikan penjelasan langkah demi langkah, itu akan berguna!

1
Adrisui3 15 Januari 2020, 00:58

2 jawaban

Jawaban Terbaik

Tidak ada sedikit pun yang menandai file sebagai file sementara.

Setiap inode memiliki bidang link count, yang merupakan jumlah entri direktori yang merujuk ke file. Setiap kali Anda membuat tautan keras ke file, jumlah ini bertambah, dan ketika Anda menghapus nama, jumlahnya berkurang; ketika hitungan menjadi nol, file dihapus (inode ditandai sebagai tersedia, dan semua blok data dimasukkan ke dalam daftar gratis).

Ketika sebuah file dibuka dalam suatu proses, salinan inode disimpan di tabel file kernel, dan jumlah pegangan file yang merujuk padanya ditambahkan ke dalam hitungan tautan dalam salinan ini. Ketika suatu proses menutup deskriptor filenya, jumlah tautan dikurangi. File tidak benar-benar dihapus sampai jumlah tautan dalam memori ini turun ke nol. Inilah yang menyimpan file di disk saat terbuka, bahkan jika semua nama dihapus.

Jadi ketika Anda membuat file sementara, ia melakukan langkah-langkah berikut:

  1. Membuat file. Jumlah tautan inode pada disk = 1.
  2. Membuka file. Jumlah tautan inode kernel = 2.
  3. Menghapus nama file. Jumlah tautan inode kernel = 1.

Pada titik ini, proses dapat tetap menggunakan file sementara, tetapi tidak dapat dibuka oleh proses lain karena tidak memiliki nama.

Saat proses menutup pegangan file, jumlah tautan menjadi 0, dan file dihapus.

Versi terbaru Linux memiliki tanda O_TMPFILE ke open(2) yang mengotomatiskan ini. Alih-alih menentukan nama file, Anda cukup menentukan direktori, yang hanya digunakan untuk menemukan sistem file untuk menyimpan data file. Ketika ini digunakan, ini secara efektif melakukan semua 3 langkah di atas dalam satu panggilan, tetapi tidak pernah benar-benar membuat nama file di mana pun (sehingga kondisi balapan dan konflik nama dihindari).

4
Barmar 15 Januari 2020, 21:28

Saya telah melakukan riset tentang topik tersebut dan saya menemukan beberapa info tambahan untuk melengkapi jawaban yang diberikan Barmar.

Saya membaca tentang panggilan sistem tmpfile() . Panggilan sistem ini membuat file sementara dan mengembalikan deskriptor aliran.

Masalahnya adalah tmpfile membuat panggilan untuk memutuskan tautan secara internal. Dengan demikian mengurangi jumlah tautan. Meskipun tautan ini adalah yang terakhir, jika file telah dibuka oleh proses apa pun, itu tetap ada sampai ditutup. Saya tidak 100% yakin tentang bagaimana prosedur ini bekerja secara internal, tetapi saya pikir itu karena urutan algoritma iPut memverifikasi jumlah referensi dan jumlah tautan. Saya telah melihat beberapa implementasi iPut dan, pertama-tama, ia memeriksa apakah jumlah referensi sama dengan nol, dan jika demikian, maka ia pergi ke hitungan tautan, membatalkan alokasi semua blok yang ditetapkan ke file jika sama dengan nol.

Jadi dalam situasi ini, kita akan memiliki referensi count==1, karena kita masih memiliki proses untuk membuka file, tetapi jumlah link akan menjadi nol. Jadi iput tidak akan melepaskan i-node sampai proses menutup file.

0
Adrisui3 18 Januari 2020, 01:46