none
IcmpSendEcho2 simultan in multithreading ausführen RRS feed

  • Frage

  • Hallo NG,

    ich hätte eine Frage, vielleicht weiß jemand Bescheid und kann ich mir das Testprogramm ersparen. Es geht um die Fu. IcmpSendEcho2, die in mehreren Threads (ggf. mehr als 20) mit untersidlichen Adressen aufgerufen wird. Der Aufruf ist immer synchron, also ohne Event oder Callback-Fu., mit 1000 ms als timeout.

    Die Frage ist: Werden Die Aufrufe die Funktion IcmpSendEcho tatsächlich gleichzeitig ausgeführt oder findet intern im BS eine Serialisierung der Aufrufe?

    Das Zeitverhalten unser Programm, wenn viele Adressen nicht erreichbar sind, deutet auf eine Serialisierung.

    MfG,

    KS


    Konrad Schiemert

    Mittwoch, 10. August 2016 07:19

Antworten

  • Hallo NG,

    das Problem hat sich erledigt. Die Fragestellung war falsch, also falscher Alarm. Die Serialisierung der IcmpSendEcho2-calls war in unserer Quellcode seit langer Zeit eingebaut um irgendeine HW-Probleme zu lösen.

    @Elmar: Danke für die Antworten.

    MfG,

    KS

    Konrad Schiemert

    Freitag, 12. August 2016 11:11

Alle Antworten

  • Hallo Konrad,

    um die IcmpSendEcho2 asynchron auszuführen ist ein Event bzw. Callback notwendig:

    If the Event parameter is specified, the IcmpSendEcho2 function is called asynchronously. The event specified in the Event parameter is signaled whenever an ICMP response arrives. Use the CreateEvent function to create this event object.

    If the ApcRoutine parameter is specified, the IcmpSendEcho2 function is called asynchronously. The ApcRoutine parameter should point to a user-defined callback function. The callback function specified in the ApcRoutine parameter is called whenever an ICMP response arrives. The invocation of the callback function specified in the ApcRoutine parameter is serialized.

    Wobei eine Serialisierung beim Senden des ICMP Pakets auf Treiberebene erfolgen dürfte, denn schließlich muss jedes Paket für sich versendet werden, nur die Antwort könnte in beliebiger Reihenfolge erfolgen.

    Ein Beispiel für ein asynchrones Versenden findet sich u. a. in  how to implement icmpsendecho2 asynchronous with callback example vc.

    Gruß Elmar

    Mittwoch, 10. August 2016 08:30
  • Hallo Elmar,

    die Doku habe ich auch gelesen. Meine Frage bezieht sich aber auf den synchronen Aufruf. Ich habe das Verdacht, dass die synchronen Aufrufe intern serialisiert werden. Also der erste Thread ruft die Fu. auf und solange diese nicht zurückkehrt (bei mir max. 1000 ms), der Aufruf aus dem zweiten Thread nicht durchgeführt wird. Meine Frage ist also: Ist das so oder nicht so?

    MfG,

    KS


    Konrad Schiemert

    Mittwoch, 10. August 2016 08:47
  • Hallo Konrad,

    dass die Aufrufe über mehrere Threads serialisiert werden, kann ich mir nicht vorstellen.

    Jedoch könnte der Eindruck entstehen, da ein blockierender Aufruf die verbleibende Zeitscheibe des Threads nicht automatisch freigibt. Durch die Anzahl der Kerne und der verfügbaren Netzwerkkarten (oft nur eine bzw. weniger als Kerne) es zu einer Limitation der gleichzeitig ausführenden Aufrufe führt. Treiberseitig dürfte es auf Kernelebene ähnlich ablaufen, wie es bei I/OCompletion Ports beschrieben ist. Dauern die Rücklaufzeiten ähnlich lang, kann dadurch der Eindruck entstehen, es liefe synchron ab. Zugegeben sind das einige Annahmen, aber ohne genaue Kenntnisse zur Kernel und Treiber-Implementation würde ich davon ausgehen.

    Um die Annahmen zu testen, könnte man einen Langläufer-Adresse mit Kurzläufern kombinieren. Auch würde ich auf jeden Fall einen asynchronen Ansatz probieren. Der kann zudem mit weniger Threads auskommen, womit dort der interne Verwaltungsaufwand reduziert wird.

    Gruß Elmar

    Mittwoch, 10. August 2016 13:04
  • Hallo NG,

    das Problem hat sich erledigt. Die Fragestellung war falsch, also falscher Alarm. Die Serialisierung der IcmpSendEcho2-calls war in unserer Quellcode seit langer Zeit eingebaut um irgendeine HW-Probleme zu lösen.

    @Elmar: Danke für die Antworten.

    MfG,

    KS

    Konrad Schiemert

    Freitag, 12. August 2016 11:11