Heim System-Tutorial LINUX Artefakt unter Linux: Prinzipien und Anwendungen von eventfd

Artefakt unter Linux: Prinzipien und Anwendungen von eventfd

Feb 13, 2024 pm 08:30 PM
技巧 命令 overflow

Linux ist ein leistungsstarkes Betriebssystem, das viele effiziente Mechanismen für die prozessübergreifende Kommunikation bereitstellt, wie z. B. Pipes, Signale, Nachrichtenwarteschlangen, gemeinsam genutzten Speicher usw. Aber gibt es eine einfachere, flexiblere und effizientere Art der Kommunikation? Die Antwort ist ja, das ist eventfd. eventfd ist ein Systemaufruf, der in Linux Version 2.6 eingeführt wurde. Er kann zur Implementierung von Ereignisbenachrichtigungen verwendet werden, d. h. zur Übermittlung von Ereignissen über einen Dateideskriptor. eventfd enthält einen vom Kernel verwalteten 64-Bit-Ganzzahlzähler ohne Vorzeichen. Der Prozess kann den Zählerwert lesen/ändern, indem er diesen Dateideskriptor liest/schreibt, um eine Kommunikation zwischen Prozessen zu erreichen. Was sind die Vorteile von eventfd? Es verfügt über folgende Funktionen:

Artefakt unter Linux: Prinzipien und Anwendungen von eventfd

  • eventfd muss keine zusätzlichen Dateien oder Speicherplatz erstellen, es benötigt nur einen Dateideskriptor
  • eventfd kann in Verbindung mit Multiplex-Mechanismen wie Select, Poll und Epoll verwendet werden, um eine effiziente ereignisgesteuerte Programmierung zu erreichen
  • eventfd kann auf den nicht blockierenden oder den Semaphor-Modus eingestellt werden und bietet so unterschiedliche Kommunikationssemantiken
  • eventfd kann Prozess- oder Threadgrenzen überschreiten, um unterschiedliche Kommunikationsebenen zu erreichen.

Also, wie funktioniert eventfd? Welche Anwendungsszenarien gibt es? In diesem Artikel wird das Artefakt eventfd aus zwei Aspekten vorgestellt: Prinzip und Anwendung.

Allgemein gesagt: Es gibt fünf Hauptlösungen für die prozessübergreifende Kommunikation unter Linux: Pipes, Nachrichtenwarteschlangen, Semaphoren, gemeinsam genutzter Speicher und Sockets.
Ich kenne mich nur mit den Einschränkungen allgemeiner Pipes und der Beziehung zwischen übergeordneten und untergeordneten Prozessen aus, da ich keine unabhängige Kommunikation zwischen Prozessen durchführen möchte auf übergeordnete und untergeordnete Prozesse beschränkt sein, aber im Kernel-Status nicht sicher, wie man es verwendet.
Ich verstehe Message Queue überhaupt nicht.
Der Kern des Semaphors ist eine atomare Operation von Kernelvariablen, aber die Schnittstelle spiegelt sich nur im Benutzerstatus wider, und die PV-Operation des Semaphors scheint eher ein gegenseitiger Ausschluss zu sein als der von mir gewünschte Benachrichtigungsweckmechanismus .
Noch problematischer ist die Schnittstelle im Benutzermodus. Wenn Sie den Speicher zwischen Kernelmodus und Benutzermodus teilen möchten, müssen Sie die Datei selbst schreiben und dann die mmap-Schnittstelle bereitstellen.
Sockets wurden bisher nur mit af_inets tcp/udp und af_unix's dgram verwendet. Der Kernel bietet zwar keine klare Schnittstelle, Sie können sie jedoch selbst aufrufen Schließlich müssen Sie die Eingabeparameter selbst erstellen, was sich immer noch unsicher anfühlt.

Das Einzige, was noch übrig ist, scheint Netlink zu sein. Dieser Socket stellt eindeutig die Paketsendefunktion des Kernels bereit, da er eindeutig die Funktion netlink_kernel_create exportiert, sodass die Kernel-Statusfunktion diesen Socken zum Senden von Paketen verwenden kann. Aber zum einen muss der Benutzermodus eine Paketempfangsfunktion registrieren, zum anderen muss der Kernelmodus immer noch skb zusammenstellen, um Pakete zu senden. Für mich, die einfach nur durch Benachrichtigung aufwachen möchte, ist das immer noch zu kompliziert.

Also habe ich erneut gesucht und das Artefakt eventfd zwischen KVM und Qemu gefunden. Nach sorgfältiger Analyse des Quellcodes habe ich festgestellt, dass dieses Ding nur für Benachrichtigungen geeignet ist .
Als Datei (gibt es unter Linux etwas, das keine Datei ist~~) hat ihre private_data-Struktur eventfd_ctx nur vier erbärmliche Variablen.

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).
Nach dem Login kopieren

Tatsächlich wird es klarer, wenn Sie sich den Code ansehen

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;
}  
Nach dem Login kopieren

Die Essenz besteht darin, einmal aufzuwachen, ohne zu lesen oder zu schreiben. Der Unterschied zu eventfd_write besteht darin, dass es keine Blockierung gibt

Hier ist meine spezifische Verwendung:

Der Kernel-Status ist ein Modul, das ein anderes Gerät registriert und einen funktionierenden Kernel-Thread erstellt (der Parameter ist die Datei -> private_Daten des Moduls). Stellen Sie eine ioctl-Schnittstelle für den Benutzermodusprozess bereit, um den von seinem eigenen eventfd erstellten fd zu liefern und ihn in file->private_data zu speichern, auf den der Kernel-Thread zugreifen kann.
Wenn der Kernel-Status den Benutzerstatus benachrichtigen möchte, wird eventfd_signal direkt verwendet. Zu diesem Zeitpunkt muss sich der Benutzerstatus-Thread zuerst auf eventfd_ctx->wqh platzieren. Es gibt zwei Lösungen: Eine besteht darin, read aufzurufen, und die andere darin Umfrage aufrufen. Wenn es sich um einen Lesevorgang handelt, wird eventfd_ctx->count später gelöscht und kann beim nächsten Mal blockiert werden. Wenn poll jedoch verwendet wird, wird der Zähler danach nicht gelöscht, was dazu führt, dass poll sofort zurückkehrt, auch wenn beim erneuten Polling kein eventfd_signal im Kernel-Status vorhanden ist.
Es ist etwas aufwändiger, den Kernel-Status über den Benutzerstatus zu benachrichtigen. Zuerst müssen Sie ein EventFD erstellen und es dann an file->private_data senden (der Vorgang ist hier derselbe wie oben). Erstellen Sie ein iotcl im Modul, das für den Benutzerstatus verantwortlich ist, um den Kernelstatus zu benachrichtigen. Der Kernelstatusthread muss zuerst auf eventfd_ctx->wqh platziert werden eine Abfrage im Kernel-Status selbst durchführen (scheint wieder mühsam zu sein).

Dieser Artikel stellt eventfd vor, ein Artefakt in Linux. Es ist ein einfacher, flexibler und effizienter Kommunikationsmechanismus zwischen Prozessen. Wir haben die Erstellung, das Lesen und Schreiben sowie die Flag-Bits von eventfd unter prinzipiellen Aspekten analysiert und entsprechende Codebeispiele gegeben. Wir haben auch die Verwendung von eventfd in Szenarien wie Benutzermodus- und Kernelmodus-Kommunikation, Timern und Ereignisauslösern aus der Anwendungsperspektive vorgestellt und entsprechende Codebeispiele gegeben. Durch das Studium dieses Artikels können wir die grundlegende Verwendung von Eventfd beherrschen und Eventfd in der tatsächlichen Entwicklung flexibel verwenden, um unterschiedliche Kommunikationsanforderungen zu erfüllen. Ich hoffe, dieser Artikel ist hilfreich für Sie!

Das obige ist der detaillierte Inhalt vonArtefakt unter Linux: Prinzipien und Anwendungen von eventfd. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Der jüngste Preis für Bitcoin in den Jahren 2018-2024 USD Der jüngste Preis für Bitcoin in den Jahren 2018-2024 USD Feb 15, 2025 pm 07:12 PM

Echtzeit-Bitcoin-USD-Preis Faktoren, die den Bitcoin -Preis beeinflussen Indikatoren für die Vorhersage zukünftiger Bitcoin -Preise Hier finden Sie einige wichtige Informationen zum Preis von Bitcoin in den Jahren 2018-2024:

Ist die H5-Seitenproduktion eine Front-End-Entwicklung? Ist die H5-Seitenproduktion eine Front-End-Entwicklung? Apr 05, 2025 pm 11:42 PM

Ja, die H5-Seitenproduktion ist eine wichtige Implementierungsmethode für die Front-End-Entwicklung, die Kerntechnologien wie HTML, CSS und JavaScript umfasst. Entwickler bauen dynamische und leistungsstarke H5 -Seiten auf, indem sie diese Technologien geschickt kombinieren, z. B. die Verwendung der & lt; canvas & gt; Tag, um Grafiken zu zeichnen oder JavaScript zu verwenden, um das Interaktionsverhalten zu steuern.

Wie kann man das Größensymbol durch CSS anpassen und es mit der Hintergrundfarbe einheitlich machen? Wie kann man das Größensymbol durch CSS anpassen und es mit der Hintergrundfarbe einheitlich machen? Apr 05, 2025 pm 02:30 PM

Die Methode zur Anpassung der Größe der Größe der Größe der Größe in CSS ist mit Hintergrundfarben einheitlich. In der täglichen Entwicklung begegnen wir häufig Situationen, in denen wir die Details der Benutzeroberfläche wie Anpassung anpassen müssen ...

Warum sind die Inline-Block-Elemente falsch ausgerichtet? Wie löst ich dieses Problem? Warum sind die Inline-Block-Elemente falsch ausgerichtet? Wie löst ich dieses Problem? Apr 04, 2025 pm 10:39 PM

In Bezug auf die Gründe und Lösungen für falsch ausgerichtete Darstellung von Inline-Block-Elementen. Beim Schreiben von Webseitenlayout stoßen wir oft auf einige scheinbar seltsame Anzeigenprobleme. Vergleichen...

Wie steuern Sie die obere und das Ende der Seiten in den Browser -Druckeinstellungen über JavaScript oder CSS? Wie steuern Sie die obere und das Ende der Seiten in den Browser -Druckeinstellungen über JavaScript oder CSS? Apr 05, 2025 pm 10:39 PM

So verwenden Sie JavaScript oder CSS, um die obere und das Ende der Seite in den Druckeinstellungen des Browsers zu steuern. In den Druckeinstellungen des Browsers gibt es eine Option, um zu steuern, ob das Display ist ...

Wie verwendet ich das Clip-Pfad-Attribut von CSS, um den 45-Grad-Kurveneffekt des Segmenters zu erreichen? Wie verwendet ich das Clip-Pfad-Attribut von CSS, um den 45-Grad-Kurveneffekt des Segmenters zu erreichen? Apr 04, 2025 pm 11:45 PM

Wie kann man den 45-Grad-Kurveneffekt des Segmenters erreichen? Bei der Implementierung des Segmenters verwandeln Sie den rechten Rand in eine 45-Grad-Kurve, wenn Sie auf die linke Schaltfläche klicken, und der Punkt ...

Der Text unter Flex -Layout wird weggelassen, aber der Behälter wird geöffnet? Wie löst ich es? Der Text unter Flex -Layout wird weggelassen, aber der Behälter wird geöffnet? Wie löst ich es? Apr 05, 2025 pm 11:00 PM

Das Problem der Containeröffnung aufgrund einer übermäßigen Auslassung von Text unter Flex -Layout und Lösungen werden verwendet ...

Wie kann man Segmentierungseffekt mit einer 45 -Grad -Kurvenrandung erreichen? Wie kann man Segmentierungseffekt mit einer 45 -Grad -Kurvenrandung erreichen? Apr 04, 2025 pm 11:48 PM

Tipps zur Implementierung von Segmentierereffekten im Design der Benutzeroberfläche sind Segmentierer ein gemeinsames Navigationselement, insbesondere in mobilen Anwendungen und reaktionsschnellen Webseiten. ...

See all articles