GNU/Linux >> Belajar Linux >  >> Linux

Apakah buffer akan secara otomatis dibilas ke disk saat proses keluar?

Jika aplikasi tidak memiliki cache internal, perubahan akan segera ditulis ke file. Hal yang sama untuk contoh Anda. File tersebut adalah entitas logis dalam memori yang akan segera diperbarui. Setiap operasi selanjutnya pada file akan melihat perubahan yang dibuat oleh program.

Namun , ini tidak berarti perubahan ditulis ke disk fisik. Perubahan mungkin tertinggal di cache sistem file OS atau cache perangkat keras. Untuk menghapus buffer sistem file, gunakan sync perintah.

Saya ingin membaca file tepat setelah perintah keluar, tetapi saya tidak ingin membaca file kosong.

Anda seharusnya tidak mengalami masalah praktis apa pun di sini.


Ada banyak lapisan buffer/cache yang terlibat.

  1. Cache CPU.

    Data disatukan byte demi byte, dan disimpan dalam cache CPU. Jika cache CPU penuh dan data belum diakses untuk sementara waktu, blok yang berisi data kita dapat ditulis ke memori utama. Ini, sebagian besar, tersembunyi dari pemrogram aplikasi.

  2. Buffer dalam proses.

    Ada beberapa memori yang disisihkan dalam proses pengumpulan data sehingga kami perlu membuat permintaan sesedikit mungkin ke OS, karena itu relatif mahal. Proses menyalin data ke buffer ini, yang juga didukung oleh cache CPU, sehingga tidak ada jaminan bahwa data akan disalin ke memori utama. Aplikasi perlu menghapus buffer ini secara eksplisit, misalnya menggunakan fclose(3) atau fsync(3). Fungsi exit(3) juga melakukan ini sebelum proses dihentikan, sedangkan fungsi _exit(2) tidak , itulah sebabnya ada peringatan besar di halaman manual agar fungsi tersebut memanggilnya hanya jika Anda tahu apa yang Anda lakukan.

  3. Kernel buffer

    OS kemudian menyimpan cache-nya sendiri, untuk meminimalkan jumlah permintaan yang perlu dikirim ke disk. Cache ini bukan milik proses tertentu, jadi data di sana mungkin milik proses yang sudah selesai, dan karena semua akses lewat sini, program selanjutnya akan melihat data jika sudah sampai di sini. Kernel akan menulis data ini ke disk ketika memiliki waktu untuk melakukannya atau ketika diminta secara eksplisit.

  4. Cache drive

    Disk drive itu sendiri juga menyimpan cache untuk mempercepat akses. Ini ditulis dengan cukup cepat, dan ada perintah untuk menulis data yang tersisa di cache dan melaporkannya setelah selesai, yang digunakan OS saat dimatikan untuk memastikan tidak ada data yang tertinggal sebelum dimatikan.

Untuk aplikasi Anda, cukup untuk mendaftarkan data di buffer kernel (data aktual mungkin masih ada di cache CPU saat ini, dan mungkin belum ditulis ke memori utama):proses "echo" berakhir, yang mana berarti bahwa semua buffer dalam proses harus telah dibilas dan data diserahkan ke OS, dan saat Anda memulai proses baru, dijamin OS akan mengembalikan data yang sama saat diminta.


Apakah buffer akan secara otomatis dibilas ke disk saat proses keluar?

Secara umum jawabannya adalah tidak .

Itu tergantung pada perintah. Seperti yang disebutkan oleh jawaban lain, jika perintah tidak menyangga data secara internal, semua data akan tersedia saat perintah diakhiri.

Namun sebagian besar, jika tidak semua, pustaka I/O standar bisa buffer stdout secara default (sampai batas tertentu), dan memberikan jaminan berbeda tentang pembilasan otomatis buffer saat aplikasi ditutup.

C menjamin bahwa jalan keluar yang normal akan membersihkan buffer. “Keluar normal” berarti exit dipanggil — baik secara eksplisit, atau dengan kembali dari main . Namun, keluar yang tidak normal dapat menghindari panggilan ini (dan karenanya meninggalkan buffer yang tidak terisi).

Berikut contoh sederhananya:

#include <signal.h>
#include <stdio.h>

int main() {
    printf("test");
    raise(SIGABRT);
}

Jika Anda mengkompilasi ini dan menjalankannya, test akan tidak harus ditulis ke stdout.

Bahasa pemrograman lain bahkan memberikan lebih sedikit jaminan:Java, misalnya, tidak auto-flush setelah penghentian program. Jika buffer keluaran berisi baris yang tidak diakhiri, maka mungkin akan hilang, kecuali System.out.flush() dipanggil secara eksplisit.

Meskipun demikian, badan pertanyaan Anda menanyakan sesuatu yang sedikit berbeda:jika data tiba di file sama sekali , itu harus dilakukan segera setelah perintah berakhir (tunduk pada peringatan yang dijelaskan dalam jawaban lain).


Linux
  1. Disk sistem dan disk data FAQ

  2. Cara Menentukan Proses Yang Menulis ke Disk di Linux

  3. Proses apa yang menggunakan semua IO disk saya

  1. Apa yang terjadi ketika sebuah benang bercabang?

  2. Apakah ada distro Linux atau tambalan kernel yang menghapus ruang memori proses setelah proses keluar?

  3. Kapan saya tidak boleh membunuh -9 proses?

  1. Linux – Kapan Saya Tidak Harus Membunuh -9 Proses?

  2. Kode Keluar Default Saat Proses Dihentikan?

  3. Buat salinan disk/disk lebih lambat