Rumah Tutorial sistem LINUX Artifak dalam Linux: Prinsip dan Aplikasi eventfd

Artifak dalam Linux: Prinsip dan Aplikasi eventfd

Feb 13, 2024 pm 08:30 PM
Kemahiran Pesanan overflow

Linux ialah sistem pengendalian berkuasa yang menyediakan banyak mekanisme komunikasi antara proses yang cekap, seperti paip, isyarat, baris gilir mesej, memori dikongsi, dsb. Tetapi adakah cara yang lebih mudah, lebih fleksibel dan lebih cekap untuk berkomunikasi? Jawapannya ya, itulah eventfd. eventfd ialah panggilan sistem yang diperkenalkan dalam Linux versi 2.6 Ia boleh digunakan untuk melaksanakan pemberitahuan acara, iaitu, untuk menyampaikan acara melalui deskriptor fail. eventfd mengandungi pembilang integer tidak bertanda 64-bit yang diselenggara oleh kernel Proses ini boleh membaca/menukar nilai pembilang dengan membaca/menulis deskriptor fail ini untuk mencapai komunikasi antara proses. Apakah kelebihan eventfd? Ia mempunyai ciri-ciri berikut:

Artifak dalam Linux: Prinsip dan Aplikasi eventfd

  • eventfd tidak perlu mencipta sebarang fail atau ruang memori tambahan, ia hanya memerlukan deskriptor fail
  • eventfd boleh digunakan bersama dengan mekanisme pemultipleksan seperti pilih, tinjauan pendapat dan epoll untuk mencapai pengaturcaraan dipacu acara yang cekap
  • eventfd boleh ditetapkan kepada mod bukan sekatan atau semaphore, memberikan semantik komunikasi yang berbeza
  • eventfd boleh merentas proses atau sempadan benang untuk mencapai tahap komunikasi yang berbeza.

Jadi, bagaimana eventfd berfungsi? Apakah senario aplikasi yang ada padanya? Artikel ini akan memperkenalkan eventfd artifak dari dua aspek: prinsip dan aplikasi.

Secara umumnya: Terdapat lima penyelesaian utama untuk komunikasi antara proses Linux: paip, baris gilir mesej, semafor, memori dikongsi dan soket.
Saya tidak begitu biasa dengan paip. Saya hanya tahu tentang batasan paip umum dan hubungan antara proses ibu bapa dan anak. Saya menolaknya pada mulanya kerana apa yang saya mahu lakukan adalah komunikasi antara proses yang bebas terhad kepada proses ibu bapa dan anak, tetapi dalam keadaan kernel Tidak pasti cara menggunakannya.
Saya tidak faham Baris Mesej langsung.
Inti semaphore ialah operasi atom pembolehubah kernel, tetapi antara muka hanya dicerminkan dalam keadaan pengguna, dan operasi PV semaphore nampaknya lebih kepada pengecualian bersama, dan bukannya mekanisme bangun pemberitahuan yang saya mahukan. .
Memori yang dikongsi lebih menyusahkan Antara muka hanya dalam mod pengguna Jika anda ingin berkongsi memori antara mod kernel dan mod pengguna, anda perlu menulis fail itu sendiri dan kemudian menyediakan antara muka mmap.
Soket hanya digunakan dengan tcp/udp af_inet dan dgram af_unix sebelum ini. Kernel tidak menyediakan antara muka yang jelas Walaupun anda boleh memanggilnya sendiri menggunakan fungsi seperti sock->ops->recvmsg Lagipun, anda perlu membina sendiri parameter input, yang masih terasa tidak selamat.

Satu-satunya perkara yang tinggal nampaknya ialah netlink Soket ini dengan jelas menyediakan fungsi penghantaran paket kernel, kerana ia mengeksport dengan jelas fungsi netlink_kernel_create, jadi fungsi keadaan kernel boleh menggunakan sock ini untuk menghantar paket. Tetapi satu ialah mod pengguna perlu mendaftarkan fungsi menerima paket, dan satu lagi ialah mod kernel masih perlu memasang skb untuk menghantar paket Ia masih terlalu rumit bagi saya yang hanya mahu bangun dengan pemberitahuan.

Jadi saya mencari lagi dan menemui artifak eventfd Antara komunikasi antara KVM dan Qemu, eventfd digunakan dengan hebat oleh Daniel Selepas menganalisis kod sumber dengan teliti, saya mendapati bahawa perkara ini adalah seperti namanya, semata-mata untuk pemberitahuan .
Sebagai fail (ada apa-apa dalam Linux yang bukan fail~~), struktur data_peribadi eventfd_ctx hanya mempunyai empat pembolehubah yang menyedihkan.

struct eventfd_ctx {
  struct kref kref;  /* 这个就不多说了,file计数用的,用于get/put */
  wait_queue_head_t wqh; /* 这个用来存放用户态的进程wait项,有了它通知机制才成为可能 */
/*
\* Every time that a write(2) is performed on an eventfd, the
\* value of the __u64 being written is added to "count" and a
\* wakeup is performed on "wqh". A read(2) will return the "count"
\* value to userspace, and will reset "count" to zero. The kernel
\* side eventfd_signal() also, adds to the "count" counter and
\* issue a wakeup.
*/
  __u64 count;  /* 这个就是一个技术器,应用程序可以自己看着办,read就是取出然后清空,write就是把value加上 */
  unsigned int flags;  /* 所有的file都有的吧,用来存放阻塞/非阻塞标识或是O_CLOEXEC之类的东西 */
};
  我之所以选用它是因为它有 eventfd_signal 这个特地为内核态提供的接口,下面的是注释。
 \* This function is supposed to be called by the kernel in paths that do not
 \* allow sleeping. In this function we allow the counter to reach the ULLONG_MAX
 \* value, and we signal this as overflow condition by returining a POLLERR to poll(2).
Salin selepas log masuk

Malah, akan lebih jelas jika anda melihat kod tersebut

int eventfd_signal(struct eventfd_ctx *ctx, int n)
{
  unsigned long flags;

  if (n return -EINVAL;
  spin_lock_irqsave(&ctx->wqh.lock, flags);
  if (ULLONG_MAX - ctx->count count);
  ctx->count += n;
  if (waitqueue_active(&ctx->wqh))
    wake_up_locked_poll(&ctx->wqh, POLLIN);
  spin_unlock_irqrestore(&ctx->wqh.lock, flags);

  return n;
}  
Salin selepas log masuk

Intinya bangun sekali, tanpa membaca atau menulis Bezanya eventfd_write ialah tiada blocking

Ini penggunaan khusus saya:
Keadaan kernel ialah modul yang mendaftarkan peranti misc dan mencipta benang kernel untuk berfungsi (parameternya ialah fail modul->private_data). Sediakan antara muka ioctl untuk proses mod pengguna untuk menyampaikan fd yang dicipta oleh eventfdnya sendiri, dan simpan dalam fail->data_pribadi yang boleh diakses oleh utas kernel.
Apabila keadaan kernel ingin memberitahu keadaan pengguna, eventfd_signal digunakan secara langsung Pada masa ini, urutan keadaan pengguna perlu meletakkan dirinya pada eventfd_ctx->wqh Terdapat dua penyelesaian, satu ialah memanggil baca untuk memanggil tinjauan pendapat. Jika ia adalah bacaan, eventfd_ctx->count akan dikosongkan kemudian dan boleh disekat kali seterusnya. Walau bagaimanapun, jika tinjauan pendapat digunakan, kiraan tidak dibersihkan selepas itu, menyebabkan tinjauan pendapat kembali serta-merta walaupun tiada eventfd_signal dalam keadaan kernel semasa mengundi lagi.
Memaklumkan keadaan kernel dari keadaan pengguna adalah sedikit lebih menyusahkan Pertama, anda perlu membuat eventfd dan kemudian menghantarnya ke file->private_data (operasi di sini adalah sama seperti di atas). iotcl dalam modul, yang bertanggungjawab untuk keadaan pengguna untuk memberitahu keadaan kernel , eventfd_signal dilakukan dalam fungsi Benang keadaan kernel perlu diletakkan pada eventfd_ctx->wqh terlebih dahulu dalam keadaan kernel sendiri (nampaknya menyusahkan lagi).

Artikel ini memperkenalkan eventfd, artifak dalam Linux Ia adalah mekanisme komunikasi antara proses yang mudah, fleksibel dan cekap. Kami menganalisis penciptaan, membaca dan menulis, dan membenderakan bit eventfd dari aspek prinsip, dan memberikan contoh kod yang sepadan. Kami juga memperkenalkan penggunaan eventfd dalam senario seperti mod pengguna dan komunikasi mod kernel, pemasa dan pencetus peristiwa dari perspektif aplikasi, dan memberikan contoh kod yang sepadan. Melalui kajian artikel ini, kita boleh menguasai penggunaan asas eventfd, dan boleh menggunakan eventfd secara fleksibel dalam pembangunan sebenar untuk mencapai keperluan komunikasi yang berbeza. Semoga artikel ini dapat membantu anda!

Atas ialah kandungan terperinci Artifak dalam Linux: Prinsip dan Aplikasi eventfd. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Harga Bitcoin sejak kelahirannya 2009-2025 Ringkasan paling lengkap harga sejarah BTC Harga Bitcoin sejak kelahirannya 2009-2025 Ringkasan paling lengkap harga sejarah BTC Jan 15, 2025 pm 08:11 PM

Sejak penubuhannya pada tahun 2009, Bitcoin telah menjadi peneraju dalam dunia mata wang kripto dan harganya telah mengalami turun naik yang besar. Untuk memberikan gambaran keseluruhan sejarah yang komprehensif, artikel ini menyusun data harga Bitcoin dari 2009 hingga 2025, meliputi peristiwa pasaran utama, perubahan dalam sentimen pasaran dan faktor penting yang mempengaruhi pergerakan harga.

Gambaran keseluruhan harga sejarah Bitcoin sejak kelahirannya Koleksi lengkap trend harga sejarah Bitcoin. Gambaran keseluruhan harga sejarah Bitcoin sejak kelahirannya Koleksi lengkap trend harga sejarah Bitcoin. Jan 15, 2025 pm 08:14 PM

Bitcoin, sebagai mata wang kripto, telah mengalami turun naik pasaran yang ketara sejak penubuhannya. Artikel ini akan memberikan gambaran keseluruhan harga sejarah Bitcoin sejak kelahirannya untuk membantu pembaca memahami arah aliran harga dan detik pentingnya. Dengan menganalisis data harga sejarah Bitcoin, kami dapat memahami penilaian pasaran terhadap nilainya, faktor yang mempengaruhi turun naiknya, dan menyediakan asas untuk keputusan pelaburan masa hadapan.

Senarai harga sejarah sejak kelahiran carta Trend Harga Sejarah Bitcoin BTC (Ringkasan Terkini) Senarai harga sejarah sejak kelahiran carta Trend Harga Sejarah Bitcoin BTC (Ringkasan Terkini) Feb 11, 2025 pm 11:36 PM

Sejak penciptaannya pada tahun 2009, harga Bitcoin telah mengalami beberapa turun naik utama, meningkat kepada $ 69,044.77 pada November 2021 dan jatuh ke $ 3,191.22 pada Disember 2018. Sehingga Disember 2024, harga terkini telah melebihi $ 100,204.

Harga terbaru Bitcoin pada 2018-2024 USD Harga terbaru Bitcoin pada 2018-2024 USD Feb 15, 2025 pm 07:12 PM

Harga USD Bitcoin masa nyata Faktor yang menjejaskan harga bitcoin Petunjuk untuk meramalkan harga bitcoin masa depan Berikut adalah beberapa maklumat penting mengenai harga Bitcoin pada 2018-2024:

Bagaimana untuk menyesuaikan simbol saiz semula melalui CSS dan menjadikannya seragam dengan warna latar belakang? Bagaimana untuk menyesuaikan simbol saiz semula melalui CSS dan menjadikannya seragam dengan warna latar belakang? Apr 05, 2025 pm 02:30 PM

Kaedah penyesuaian simbol saiz semula dalam CSS bersatu dengan warna latar belakang. Dalam perkembangan harian, kita sering menghadapi situasi di mana kita perlu menyesuaikan butiran antara muka pengguna, seperti menyesuaikan ...

Adakah pengeluaran halaman H5 adalah pembangunan front-end? Adakah pengeluaran halaman H5 adalah pembangunan front-end? Apr 05, 2025 pm 11:42 PM

Ya, pengeluaran halaman H5 adalah kaedah pelaksanaan penting untuk pembangunan front-end, yang melibatkan teknologi teras seperti HTML, CSS dan JavaScript. Pemaju membina halaman H5 yang dinamik dan berkuasa dengan bijak menggabungkan teknologi ini, seperti menggunakan & lt; kanvas & gt; Tag untuk menarik grafik atau menggunakan JavaScript untuk mengawal tingkah laku interaksi.

Teks di bawah susun atur flex ditinggalkan tetapi bekas dibuka? Bagaimana menyelesaikannya? Teks di bawah susun atur flex ditinggalkan tetapi bekas dibuka? Bagaimana menyelesaikannya? Apr 05, 2025 pm 11:00 PM

Masalah pembukaan kontena kerana peninggalan teks yang berlebihan di bawah susun atur flex dan penyelesaian digunakan ...

Bagaimana cara menggunakan atribut clip-path CSS untuk mencapai kesan lengkung 45 darjah segmen? Bagaimana cara menggunakan atribut clip-path CSS untuk mencapai kesan lengkung 45 darjah segmen? Apr 04, 2025 pm 11:45 PM

Bagaimana untuk mencapai kesan lengkung 45 darjah segmen? Dalam proses melaksanakan segmen, bagaimana membuat sempadan yang betul berubah menjadi lengkung 45 darjah ketika mengklik butang kiri, dan titik ...

See all articles