Hello semua, hari ini mari kita bercakap tentang teknologi sifar salinan Linux. Kami akan menggunakan panggilan sistem fail hantar sebagai titik masuk untuk meneroka secara mendalam prinsip asas teknologi salinan sifar. Idea teras teknologi salinan sifar adalah untuk meminimumkan penyalinan data antara kenangan dan meningkatkan kecekapan dan prestasi penghantaran data dengan mengoptimumkan laluan penghantaran data.
Teknologi salinan sifar Linux ialah teknologi yang digunakan untuk mengoptimumkan penghantaran data Ia meningkatkan kecekapan penghantaran data dengan mengurangkan bilangan salinan data antara mod kernel dan mod pengguna.
Semasa proses penghantaran data, biasanya diperlukan untuk menyalin data dari penimbal kernel ke penimbal aplikasi, dan kemudian dari penimbal aplikasi ke penimbal peranti rangkaian sebelum penghantaran boleh diselesaikan.
Kelebihan teknologi sifar salinan ialah ia boleh menghantar data secara terus tanpa memerlukan langkah penyalinan pertengahan, yang membantu meningkatkan kecekapan penghantaran data.
Pelaksanaan teknologi salinan sifar Linux:
Panggilan sistem fail hantar boleh memindahkan data fail terus dalam ruang kernel Ia melakukan ini dengan menyalin data daripada satu deskriptor fail ke penimbal hantar deskriptor fail yang lain. Dengan cara ini, data boleh dihantar terus melalui timbunan protokol rangkaian, mengelakkan operasi penyalinan data yang kerap antara ruang pengguna dan ruang kernel.
Ini mengelakkan penyalinan data antara kernel dan ruang pengguna dan meningkatkan kecekapan penghantaran.
prototaip fungsi panggilan sistem fail:
#include ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); 参数说明: out_fd:目标文件描述符,用于发送数据。 in_fd:源文件描述符,从该文件读取数据。 offset:指定从源文件的哪个位置开始读取数据,可以为NULL表示从当前位置开始。 count:要传输的字节数。 返回值: 成功:返回写入out_fd文件的字节数。 失败:返回-1,并设置errno。
Untuk menghantar fail melalui soket menggunakan kaedah tradisional, kita perlu melaksanakan laluan yang agak panjang.
Laluan: Cakera->Cache Halaman Fail->Penimbal Pengguna->Penimbal Soket->Kad Rangkaian.
Situasi penukaran konteks dan salinan memori adalah seperti berikut:
Gambar
Gunakan fail hantar untuk menghantar fail, keseluruhan laluan akan menjadi lebih pendek.
Laluan: Cakera->Cache Halaman Fail->Penimbal Soket->Kad Rangkaian.
Situasi penukaran konteks dan salinan memori adalah seperti berikut:
Suis konteks: 2 kali (hantar panggilan fail, hantar fail kembali)
Salinan DMA: 2 kali
Salinan CPU: 1 kali (Cache Halaman Fail -> Penampan Soket)
Gambar
Inti pelaksanaan fail hantar ialah paip, yang digunakan secara meluas dalam sistem Linux, seperti komunikasi antara proses melalui paip.
Apabila data fail perlu disalin ke penimbal soket, paip (penampan cincin) akan dibuat buat sementara waktu, data fail akan disalin ke paip terlebih dahulu, dan kemudian data paip akan dipindahkan ke penimbal soket bukan salinan data, tetapi arahkan penunjuk ke alamat memori.
Gambar
Dengan menggunakan fail hantar untuk menghantar fail, kami boleh mengurangkan dua suis konteks dan satu salinan CPU Jika senario aplikasi sebenar kami memerlukan penghantaran sejumlah besar fail, menggunakan fail hantar boleh meningkatkan prestasi sistem dengan ketara.
Apakah itu saluran paip?
Sebuah paip sebenarnya adalah penimbal cincin, yang melaluinya data boleh disalin dari satu fail ke fail yang lain.Paip ditakrifkan oleh struktur struct pipe_inode_info Struktur data ini mempunyai 4 ahli penting:
Penimbal paip ditakrifkan oleh struct pipe_buffer, yang mempunyai 3 ahli penting:
Nilai sama ada paip sudah penuh atau kosong?
Penghakiman bahawa saluran paip sudah penuh:
kepala – ekor >= saiz cincin, menandakan paip sudah penuh.
Penghakiman jika paip kosong:
kepala == ekor, menandakan paip kosong.
Atas ialah kandungan terperinci Enam gambar menerangkan teknologi salinan sifar Linux dengan jelas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!