du übergibst da gar nichts an diese Dateien, sondern, soweit ich die Erklärung in der Datei verstanden habe liest du aus der /proc/<pid>/pagemap die PFN (Page Frame Number) und dieser Nummer ist der index in der /proc/kpagecount und /proc/kpageflag für den entsprechenden eintrag für die PFN
Das steht auch so in der verlinkten Datei...
Hallo,
jetzt glaub ich hab ichs verstanden: Der Mutex ist nur dazu da den Zugriff auf die Condition-Variable abzusichern, das ist alles. Das Warten hab ich jetzt mit barrier realisiert (aber ohne den hauptthread mitrechnen zu lassen):
void *thread_function(void *arg)
{
while(arg->run)
{
process_data(arg->data, arg->start, arg->len);
pthread_barrier_wait(arg->barrier);
pthread_mutex_lock(arg->mutex);
pthread_cond_wait(arg->cond, arg->mutex);
pthread_mutex_unlock(arg->mutex);
}
pthread_exit(NULL);
}
void do_something(threaddata_t *threads)
{
if(!threads->created) {
pthread_barrier_init(&threads->barrier,NULL,threads->N+1);
pthread_cond_init(&threads->cond,NULL);
pthread_mutex_init(&threads->mutex,NULL);
for(int i=0;i<threads->N;i++) {
threads->threads_arg[i].cond = &threads->cond;
threads->threads_arg[i].mutex = &threads->mutex;
threads->threads_arg[i].barrier = &threads->barrier;
threads->threads_arg[i].data = threads->data;
threads->threads_arg[i].start = (threads->data_len/threads->N)*i;
threads->threads_arg[i].len = (threads->data_len/threads->N);
threads->threads_arg[i].run = 1;
pthread_create(&threads->thread[i], &threads->attr, thread_function, &threads->threads_arg[i]);
}
threads->created=1;
}
else {
pthread_cond_broadcast(&threads->cond);
}
/* soll hier warten bis alle Threads wieder pthread_cond_wait erreicht haben */
pthread_barrier_wait(&threads->barrier);
}
Es funktioniert bis jetzt problemlos und die Geschwindigkeit hat sich bei 4 threads auf einem dual-core mit Hyperthreading mehr als verdoppelt, ich denke damit scheint die Umsetzung auch ganz gut zu sein.
Die Berechnung führen alle Threads auf genau dem gleichen Objekt zu, schreiben tun sie aber in unterschiedliche Bereiche (beim Lesen gibt es z.T überschneidungen, aber das ist ja kein Problem). Grundsätzlich ist der Lese- und Schreibbereich getrennt, das heißt in einem Teil wird nur gelesen, in einem anderen nur geschrieben.
Vielen Dank!
Ich würde das ganz einfach nicht machen. Abhängigkeiten zu erfüllen ist das kleine 1x1 für jeden der unter Linux Code selber compiliert. Und wenn du noch ein fertiges Paket für die Paketverwaltungen gängiger Distributionen anbietest, dann kann selbst ein DAU damit dein Programm installieren.
Hallo zusammen!
Ich möchte ein einfachen Sniffer über Raw Socket in Linux ,
ähnlich zu libpcap basteln. Fragt bitte nicht wieso ich den pcap nicht benützen will. Bezüglich Raw Sockets, habe ich die Frage, wenn ich den socket anlege, und
alle Pakete von bestimmter Device fange, "verschwinden" dann die von System? Und andere Anwendung, z.B. ein Browser, kriegt die nicht oder doch?
Oder gibt es besindere socket Optionen die das steuern können ?
Kann man ein Raw Socket zu einem USB- DEvice anlegen?
WICHTIGER LINK
Manpages, Manpages, Manpages!
Ich bin immer noch der Ansicht, dass das ein Job für rsync ist. Ansonsten sei angemerkt, dass
cp -RpT "$ii" "$ii-2"
macht, was du willst, ohne irgendwelche Expansionsprobleme zu haben. Das lässt sich mit anderen Tools kombinieren, etwa
find . -mindepth 1 -maxdepth 1 -type d -exec cp -RpT '{}' '{}-2' \;
um Verzeichisse herauszupicken.
So oder so musst du damit umgehen, dass du auf die Dauer Verzeichnisse der Form foo-2-2-2-2 bekommst, deren Inhalt nicht trivial vorhersagbar ist.
Es gibt eine Bibliothek, die dir Funktionen für den Zugriff auf die /etc/shadow Einträge gibt. Siehe http://tldp.org/HOWTO/Shadow-Password-HOWTO-8.html für nen Beispiel.
Hier runterladen: http://sourceforge.net/projects/boost/files/boost/1.49.0/boost_1_49_0.zip/download
Dann über die Konsole ins entpackte Verzeichnis wechseln und bootstrap.bat ausführen (bin mir nich sicher, aber kann sein, dass du MinGW brauchst).
Dann einfach b2.exe bzw. bjam.exe ausführen und den Anweisungen folgen
LG
Du öffnest zwei Sockets zum Konverter. Über den einen sendest und empfängst du die Daten. Über den anderen konfigurierst du den Konverter. Die Ports und die Befehle sollten im Handbuch stehen.
Hallo,
bei Paging gibt es ja nur bei der letzten Seite eines Prozesses eine interne Fragmentierung. Die Frage ist, wie groß kann diese maximal sein?
Angenommen, eine Seite ist m Byte groß, dann stellt sich mir die Frage, wie groß die minimale Belegung einer Seite ist. Da nur byteweise adressiert wird, ist die minimale Belegung 1 Byte. Folglich ist die max. Fragmentierung m - 1 Byte. Liege ich damit richtig?
L. G.
Steffo
Median schrieb:
Grad noch mal zum Verständnis : Mit system ruf ich über die Shell irgendein Programm auf.
Vor allem wird von system eine vollständige neue Subshell gestartet, was fast nie ist, was man möchte.
Was ist der Grund, wieso anschließend sämtliche cout nicht auf der Konsole erscheinen ?
Werde konkret, ich habe keine Ahnung, wovon du redest.
Ne, die Mutexe dürfen nicht in gleicher Reihenfolge gelockt werden.
trylock: Hatte ich vorher auch versucht, aber ich kam nicht auf die richtige Lösung. Jetzt habe ich sie, danke.
L. G.
Steffo
Es gibt im POSIX-Standard ein paar als veraltet gekennzeichnete Funktionen, die kooperatives Multitasking ermöglichen. Als veraltet sind sie deshalb markiert, weil sie ein Feature von C89 benutzen, das in C99 für veraltet erklärt wurde.
Allerdings ist die Position der POSIX-Overlords...naja, ich zitier einfach mal:
It was felt inventing new ISO C standard-compatible interfaces that describe what can be done with the XSH, Issue 5 functions and then converting applications to use them would cause more difficulty than just converting applications that use them to use threads instead.
Kooperatives Multitasking hat man in der UNIX-Welt nie wirklich ernsthaft betrieben - zur Prozessverwaltung hatte man von Anfang an präemptives Multitasking (UNIX war als Mehrbenutzersystem ausgelegt; kooperatives Multitasking wäre da dem blanken Wahnsinn gleichgekommen), und als in den Neunzigern die Idee der Parallelität innerhalb eines Prozesses an Popularität gewann, konnte man die vorhandene Technik recht zügig dazu umbiegen, echte Threads zur Verfügung zu stellen (auch wenn es bis zur Standardisierung seine Zeit brauchte). Inzwischen hat das präemptive Multitasking das kooperative in einem solchen Ausmaß verdrängt, dass Fibers auch in der Windows-Welt nahezu in Vergessenheit geraten sind. Wirklich benutzt wird dieser Kram heute von fast niemandem mehr.
ja das stimmt das ist wegen den ("") es muss let product=3*9 heißen und in zeile 31 product=$((3*9)).
Und der fehler war das ich den sh-Interpreter definiert habe. Also jetzt funktionierts, dankeschön.