# Javaprogramm unter Linux auf bestimmten Kern starten/laufen lassen ?



## Toralfus (20. Sep 2010)

Halli Hallo,

ich bin Toralfus und hätte gleich eine kurze Frage, kann man Java-Programmen beim Starten unter Linux einen bestimmten Kern zuweisen ? Wenn man das fertig compilierte Programm mit java.main ausführt ?

So das es möglich wäre unterschiedliche Java-Programme auf unterschiedlichen Kernen laufen zu lassen ?

Gruß und Dank

Toralfus


----------



## Wildcard (20. Sep 2010)

Das ist Aufgabe des Schedulers des Betriebssystems und der wird nach Möglichkeit auch versuchen alle Resourcen gleichmäßig auszulasten.


----------



## Atze (20. Sep 2010)

meint er kerne (cpus) oder (linux-)kernel????


----------



## Wildcard (20. Sep 2010)

Atze hat gesagt.:


> meint er kerne (cpus) oder (linux-)kernel????



Letzteres macht irgendwie wenig Sinn, oder?


----------



## Toralfus (20. Sep 2010)

job CPU´s...

Nach meinen Informationen ist es möglich einzelnen Benutzern, verschiedene (begrenzte) Systemresourcen zur Verfügung zu stellen. Bei uns in der FH laufen auf 3/4 Kernen Prozesse und mit dem 4. dürfen sich die Studenten begnügen. Ich dachte nun das könnte man auch für einzelne Prozesse (Programme) hin bekommen.


----------



## Wildcard (20. Sep 2010)

Das steuert wie gesagt nicht der Prozess selbst, sondern der Scheduler.


----------



## Atze (20. Sep 2010)

Wildcard hat gesagt.:


> Letzteres macht irgendwie wenig Sinn, oder?



 ich meinte als unterscheidung, kernel a - führe dieses programm aus, bei kernel b - dieses.


----------



## Toralfus (20. Sep 2010)

> Das steuert wie gesagt nicht der Prozess selbst, sondern der Scheduler.



Also könnte ich die einzelnen Programme starten warten lassen und dann über den Sheduler über die einzelnen Kerne verteilen lassen ?


----------



## Atze (20. Sep 2010)

hat man denn per java kontrolle über den scheduler des os? man kann threads doch für den start vorsehen, aber wann dieser tatsächlich startet / auf welchem kern regelt das os doch eigenmächtig! wann halt zeit dafür ist. zumindest unter win, oder?


----------



## madboy (20. Sep 2010)

Atze hat gesagt.:


> hat man denn per java kontrolle über den scheduler des os? man kann threads doch für den start vorsehen, aber wann dieser tatsächlich startet / auf welchem kern regelt das os doch eigenmächtig!


Prinzipiell stimmt das, aber kann zumindest unter Linux auch manuell geregelt werden (Stichwort CPUSets): CPUSETS for Linux 2.6

Über /proc (oder /sys?) kann dann eingstellt werden, welcher Prozess wo laufen soll. Das funktioniert, die nötigen Rechte vorausgesetzt, dann auch über Java.


----------



## Toralfus (20. Sep 2010)

Kurze Zwischenfrage: Auch wenn es vieleicht nicht viel Sinn macht könnte man dann also auf einen Kern nen Server laufen lassen, während man auf den verbleibenen Kernen Clients laufen lässt. Welche über verschiedene Ports mit den Server komunizieren ?


----------



## madboy (20. Sep 2010)

Toralfus hat gesagt.:


> Kurze Zwischenfrage: Auch wenn es vieleicht nicht viel Sinn macht könnte man dann also auf einen Kern nen Server laufen lassen, während man auf den verbleibenen Kernen Clients laufen lässt. Welche über verschiedene Ports mit den Server komunizieren ?



Kann man


----------



## Atze (20. Sep 2010)

sollte gehen, wenn das auch auf einem kern mit nem server aufm lokalhost geht, warum dann nicht auch mit mehreren kernen?  aber verschiedene ports wohl nur, wenn der server mehrere sockets hat.
danke @ madboy, wußte ich nich!  nette sache


----------



## Toralfus (20. Sep 2010)

> aber verschiedene ports wohl nur, wenn der server mehrere sockets hat.



kommt es dann aber nicht zum Daten crash wenn 2 gleichzeitig auf einen Port senden wollen ? Oder Synchronisiert Java das ?


----------



## ice-breaker (20. Sep 2010)

Die Synchronisierung ist deine Aufgabe.

Aber das Aufteilen auf Kerne ist immernoch unsinnig. Dein Betriebssystem sorgt schon dafür, dass alles parallel wunderbar ausgeführt wird und keine CPU tausendmal effektiver ausnutzen, als wenn du das bestimmst.


----------



## madboy (20. Sep 2010)

Atze hat gesagt.:


> aber verschiedene ports wohl nur, wenn der server mehrere sockets hat.


???:L
Ich glaube, da verwechselst du was. Ein Socket ist im Allgemeinen die Kombination aus IP-Adresse und Portnummer. Wenn also eine IP am Server, dann ist ein Port einem Socket äquivalent.



Toralfus hat gesagt.:


> kommt es dann aber nicht zum Daten crash wenn 2 gleichzeitig auf einen Port senden wollen ? Oder Synchronisiert Java das ?


Du kannst einen Socket (siehe oben) nicht zwei Mal verwenden. Java bzw. das Betriebssystem wirft dir dann eine Fehlermeldung.


----------



## madboy (20. Sep 2010)

ice-breaker hat gesagt.:


> Die Synchronisierung ist deine Aufgabe.
> 
> Aber das Aufteilen auf Kerne ist immernoch unsinnig. Dein Betriebssystem sorgt schon dafür, dass alles parallel wunderbar ausgeführt wird und keine CPU tausendmal effektiver ausnutzen, als wenn du das bestimmst.



Kommt drauf an, was man will. Will man die CPUs optimal ausnutzen, dann hast du natürlich recht. Will man aber eine möglichst gute Antwortzeit von einem Prozess, kann es durchaus sinnvoll sein, den Prozess allein auf eine CPU zu packen.


----------



## ice-breaker (20. Sep 2010)

madboy hat gesagt.:


> Kommt drauf an, was man will. Will man die CPUs optimal ausnutzen, dann hast du natürlich recht. Will man aber eine möglichst gute Antwortzeit von einem Prozess, kann es durchaus sinnvoll sein, den Prozess allein auf eine CPU zu packen.


Im Gegenteil 
Da dein Betriebsystem auch noch viele weitere Prozesse auf die Cores zuteilt, muss dein fest eingestellter Core zwischen den Prozessen geteilt werden und du hast auch wieder ein Scheduling 
Was du ansprichst entspricht viel eher dem Nice-Wert eines Prozess in Linux, du kannst sagen, dass der Prozess eine sehr hohe Priorität und wird deshalb vom Betriebssystem immer vorrangig ausgeführt, DAS kann zu besseren Antwortzeiten führen.
Wobei ich mal behaupten würde, dass die Antwortzeiten auch erst nachlassen, wenn alle Kerne voll ausgelastet sind.


----------



## madboy (20. Sep 2010)

Das geht jetzt zwar am Thema vorbei, aber sagt dir der Begriff "Prozesswechsel-Latenz" bzw. Process switching latency - Wikipedia, the free encyclopedia was? Wenn nur ein Prozess auf einem Prozessor ausgeführt wird, müssen diverse Dinge nicht gemacht werden (Contextwechsel, also Kopieren der Prozessinformationen aus den CPU-Registern in einen Cache etc.), was wiederum die Antwortzeit dieses Prozesses erhöht.

EDIT: natürlich erhöht sich die Antwortzeit nicht, sondern sie verringert sich


----------



## planetenkiller (20. Sep 2010)

ne, ice-breaker hat recht.

Nur weil du einem Prozess einen festen Kern(/Prozessor) zuweist, heisst das nicht, das dieser Prozess den Kern(/Prozessor) exklusiv bekommt. Das OS wird auch weiterhin Contextwechsel machen, um andere Prozesse auch zum Zuge kommen zu lassen.


----------



## Atze (20. Sep 2010)

madboy hat gesagt.:


> ???:L
> Ich glaube, da verwechselst du was. Ein Socket ist im Allgemeinen die Kombination aus IP-Adresse und Portnummer. Wenn also eine IP am Server, dann ist ein Port einem Socket äquivalent.



was anderes hab ich ja auch nicht gesagt!


----------



## Toralfus (21. Sep 2010)

Danke für eure Antworten.


----------



## madboy (21. Sep 2010)

planetenkiller hat gesagt.:


> ne, ice-breaker hat recht.
> 
> Nur weil du einem Prozess einen festen Kern(/Prozessor) zuweist, heisst das nicht, das dieser Prozess den Kern(/Prozessor) exklusiv bekommt. Das OS wird auch weiterhin Contextwechsel machen, um andere Prozesse auch zum Zuge kommen zu lassen.



Das kommt darauf an, was man mit den anderen Prozessen macht 
Ich ging davon aus, dass man die anderen Prozesse über CPUSets auf die anderen CPUs verteilt und nur der gewünschte Prozess exklusiv eine physikalische CPU bekommt.

Wer Java programmiert wird aber wahrscheinlich sowieso kein Problem mit Kontextwechselzeiten und Ähnlichem haben ;-)


----------

