Apa yang terjadi ketika saya menulis cat /proc/cpuinfo
. Apakah itu pipa bernama (atau sesuatu yang lain) ke OS yang membaca info CPU dengan cepat dan menghasilkan teks itu setiap kali saya menyebutnya?
filesystems
kernel
proc
slm
sumber
sumber
Jawaban:
Setiap kali Anda membaca file di bawah
/proc
, ini meminta beberapa kode dalam kernel yang menghitung teks untuk dibaca sebagai konten file. Fakta bahwa konten dihasilkan dengan cepat menjelaskan mengapa hampir semua file dilaporkan waktunya seperti sekarang dan ukurannya dilaporkan sebagai 0 - di sini Anda harus membaca 0 sebagai “tidak tahu”. Tidak seperti filesystem biasa, filesystem yang di-mount/proc
, yang disebut procfs , tidak memuat data dari disk atau media penyimpanan lainnya (seperti FAT, ext2, zfs, ...) atau melalui jaringan (seperti NFS, Samba, ...) dan tidak memanggil kode pengguna (tidak seperti FUSE ).Procfs hadir di sebagian besar kesatuan non-BSD. Ini memulai kehidupannya di Bell Labs AT&T dalam edisi ke-8 UNIX sebagai cara untuk melaporkan informasi tentang proses (dan
ps
sering kali merupakan printer yang cukup untuk informasi yang dapat dibaca/proc
). Sebagian besar implementasi procfs memiliki file atau direktori yang dipanggil/proc/123
untuk melaporkan informasi tentang proses dengan PID 123. Linux memperluas sistem file proc dengan lebih banyak entri yang melaporkan keadaan sistem, termasuk contoh Anda/proc/cpuinfo
.Di masa lalu, Linux
/proc
mengakuisisi berbagai file yang menyediakan informasi tentang driver, tetapi penggunaan ini sekarang tidak lagi mendukung/sys
, dan/proc
sekarang berevolusi secara lambat. Entri menyukai/proc/bus
dan/proc/fs/ext4
tetap di tempatnya untuk kompatibilitas mundur, tetapi antarmuka serupa yang lebih baru dibuat di bawah/sys
. Dalam jawaban ini, saya akan fokus pada Linux.Titik masuk pertama dan kedua Anda untuk dokumentasi tentang
/proc
di Linux adalah:proc(5)
halaman manual ;/proc
file dalam dokumentasi kernel .Titik masuk ketiga Anda, ketika dokumentasi tidak membahasnya, sedang membaca sumbernya . Anda dapat mengunduh sumbernya di komputer Anda, tetapi ini adalah program yang sangat besar, dan LXR , referensi silang Linux, sangat membantu. (Ada banyak varian LXR; yang berjalan pada
lxr.linux.no
adalah yang terbaik sejauh ini tetapi sayangnya situs sering turun.) Sedikit pengetahuan tentang C diperlukan, tetapi Anda tidak perlu menjadi seorang programmer untuk melacak nilai misterius .Inti penanganan
/proc
entri ada difs/proc
direktori. Driver apa pun dapat mendaftarkan entri/proc
(meskipun seperti yang ditunjukkan di atas ini sekarang sudah tidak berlaku lagi/sys
), jadi jika Anda tidak menemukan apa yang Anda carifs/proc
, lihat di tempat lain. Fungsi panggilan driver dinyatakan dalaminclude/linux/proc_fs.h
. Versi kernel hingga 3,9 menyediakan fungsicreate_proc_entry
dan beberapa pembungkus (terutamacreate_proc_read_entry
), dan versi kernel 3,10 dan di atasnya hanya menyediakanproc_create
danproc_create_data
(dan beberapa lagi).Mengambil
/proc/cpuinfo
sebagai contoh, pencarian akan"cpuinfo"
mengarahkan Anda ke panggilanproc_create("cpuinfo, …")
masukfs/proc/cpuinfo.c
. Anda dapat melihat bahwa kode ini adalah kode boilerplate: karena sebagian besar file/proc
hanya membuang beberapa data teks, ada fungsi pembantu untuk melakukan itu. Hanya adaseq_operations
struktur, dan daging asli ada dicpuinfo_op
struktur data, yang bergantung pada arsitektur, biasanya didefinisikan dalamarch/<architecture>/kernel/setup.c
(atau kadang-kadang file yang berbeda). Mengambil x86 sebagai contoh, kita dituntun kearch/x86/kernel/cpu/proc.c
. Di sana fungsi utamanya adalahshow_cpuinfo
, yang mencetak konten file yang diinginkan; infrastruktur lainnya ada untuk memberi makan data ke proses membaca dengan kecepatan yang diminta. Anda dapat melihat data yang sedang dikumpulkan dengan cepat dari data dalam berbagai variabel di kernel, termasuk beberapa angka yang dihitung saat itu juga seperti frekuensi CPU .Sebagian besar
/proc
adalah informasi per proses di/proc/<PID>
. Entri-entri ini terdaftar difs/proc/base.c
dalamtgid_base_stuff
array ; beberapa fungsi yang terdaftar di sini didefinisikan dalam file lain. Mari kita lihat beberapa contoh bagaimana entri ini dihasilkan:cmdline
dihasilkan olehproc_pid_cmdline
dalam file yang sama. Ini menempatkan data te dalam proses dan mencetaknya.clear_refs
, tidak seperti entri yang kami lihat sejauh ini, dapat ditulis tetapi tidak dapat dibaca. Oleh karena ituproc_clear_refs_operations
struktur mendefinisikanclear_refs_write
fungsi tetapi tidak ada fungsi baca.cwd
adalah tautan simbolik (yang agak ajaib), dideklarasikan olehproc_cwd_link
, yang mencari direktori proses saat ini dan mengembalikannya sebagai konten tautan.fd
adalah subdirektori. Operasi pada direktori itu sendiri didefinisikan dalamproc_fd_operations
struktur data (mereka boilerplate kecuali untuk fungsi yang menyebutkan entriproc_readfd
,, yang menyebutkan file proses terbuka) sementara operasi pada entri berada di operasi `proc_fd_inode_ .Area penting lainnya
/proc
adalah/proc/sys
, yang merupakan antarmuka langsung kesysctl
. Membaca dari entri dalam hierarki ini mengembalikan nilai nilai sysctl yang sesuai, dan tulisan menetapkan nilai sysctl. Titik masuk untuk sysctl ada difs/proc/proc_sysctl.c
. Sysctl memiliki sistem registrasiregister_sysctl
dan teman mereka sendiri .sumber
Saat mencoba mendapatkan wawasan tentang jenis sihir apa yang terjadi di balik layar, sahabatmu itu
strace
. Belajar mengoperasikan alat ini adalah salah satu hal terbaik yang dapat Anda lakukan untuk mendapatkan penghargaan yang lebih baik atas apa yang terjadi dengan sihir gila di balik layar.Dari output di atas, Anda dapat melihat bahwa
/proc/cpuinfo
itu hanya file biasa, atau setidaknya akan muncul sebagai file biasa. Jadi mari kita gali lebih dalam.Menyelam lebih dalam
# 1 - dengan ls ..Melihat file itu sendiri tampaknya "hanya file".
Tapi lihat lebih dekat. Kami mendapatkan petunjuk pertama kami bahwa khusus, perhatikan ukuran file adalah 0 byte.
# 2 - dengan stat ..Jika sekarang kita melihat file menggunakan
jalankan # 1 jalankan # 2stat
kita bisa mendapatkan petunjuk selanjutnya bahwa ada sesuatu yang istimewa/proc/cpuinfo
.Perhatikan Akses, Ubah, & Ubah waktu? Mereka terus berubah untuk setiap akses. Ini sangat tidak biasa bahwa ketiganya akan berubah seperti itu. Kecuali jika atribut timestamp file yang diedit biasanya tetap sama.
# 3 - dengan file ..Namun petunjuk lain bahwa file ini adalah file biasa:
Jika itu adalah manifestasi dari pipa bernama itu akan menunjukkan mirip dengan salah satu file ini:
Jika kita menyentuh
# 4 - dengan mount ..emptyfile
,/proc/cpuinfo
tampaknya lebih seperti file daripada pipa:Jadi pada titik ini kita perlu mengambil langkah mundur dan memperkecil sedikit. Kami sedang melihat file tertentu, tetapi mungkin kita harus melihat sistem file tempat file ini berada. Dan untuk ini kita bisa menggunakan
mount
perintah.OK, jadi tipe sistem file adalah tipe
proc
. Begitu/proc
juga dengan tipe sistem file yang berbeda, itulah petunjuk kami bahwa file-file di bawah/proc
ini spesial. Mereka bukan hanya Anda menjalankan file pabrik. Jadi mari kita cari tahu lebih banyak info tentang apa yang membuat sistemproc
file istimewa.Lihatlah
mount
halaman manual:Dan jika kita melihat
proc
halaman manual:Sedikit lebih jauh di halaman manual yang sama:
Di bagian bawah halaman manual adalah referensi ke dokumen kernel yang dapat Anda temukan di sini, berjudul: THE / proc FILESYSTEM . Mengutip dari dokumen itu:
Kesimpulan
Jadi apa yang kita pelajari di sini? Baik diberikan yang
/proc
disebut sebagai sistem file semu dan juga "antarmuka ke struktur data internal" mungkin aman untuk menganggap bahwa item di dalamnya bukan file yang sebenarnya, tetapi lebih dari sekadar manifestasi yang dibuat terlihat seperti file, tetapi sebenarnya tidak.Saya akan menutup dengan kutipan ini yang tampaknya digunakan dalam versi sebelumnya
man 5 proc
dari sekitar tahun 2004 tetapi untuk alasan apa pun tidak lagi disertakan. CATATAN: Saya tidak yakin mengapa itu dihapus karena itu menjelaskan dengan sangat baik apa/proc
itu:Sumber: Sistem file pseudo proc
Referensi
sumber
strace -o catcpuproc.txt cat /proc/cpuinfo
Jawaban yang diberikan oleh @slm sangat komprehensif, tapi saya pikir penjelasan yang lebih sederhana mungkin berasal dari perubahan perspektif.
Dalam penggunaan sehari-hari kita dapat menganggap file sebagai hal-hal fisik, yaitu. potongan data yang disimpan pada beberapa perangkat. Ini membuat file seperti / proc / cpuinfo sangat misterius dan membingungkan. Namun, semuanya masuk akal jika kita menganggap file sebagai antarmuka ; cara untuk mengirim data masuk dan keluar dari beberapa program.
Program yang mengirim dan menerima data dengan cara ini adalah sistem file atau driver (tergantung pada bagaimana Anda mendefinisikan istilah-istilah ini, yang mungkin terlalu luas atau terlalu sempit definisi). Poin penting adalah bahwa beberapa program ini menggunakan perangkat perangkat keras untuk menyimpan dan mengambil data yang dikirim melalui antarmuka ini; tapi tidak semua.
Beberapa contoh filesystem yang tidak menggunakan perangkat penyimpanan (setidaknya secara langsung) adalah:
OS Plan9 ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs ) adalah contoh ekstrem menggunakan file sebagai antarmuka pemrograman umum.
sumber