![]() |
Hallo und herzlich Willkommen aus den Vereinigten Staaten, die UNIX-und Linux-Foren! Vielen Dank für Ihren Besuch und die Teilnahme an unserem Global Community.
|
|
Google unix.com
|
|||||||
| Foren | Registrieren | Forum-Regeln | Links | Alben | FAQ | Benutzerliste | Kalender | Suche | Die heutige Beiträge | Alle Foren als gelesen markieren |
| High-Level-Programmierung Post Fragen zu C, C + +, Java, SQL, und andere Programmiersprachen hier. |
Mehr UNIX-und Linux-Forum Themen Vielleicht finden Sie hilfreiche
|
||||
| Faden | Thread Starter | Forum | Antworten | Last Post |
| Semaphore | raguramtgr | UNIX for Dummies Questions & Answers | 7 | 06-15-2009 10:39 AM |
| Semaphore | Jaken | Shell Programmierung und Scripting | 2 | 04-04-2009 06:10 PM |
| dmidecode, RAM-Geschwindigkeit \u003d "Aktuelle Geschwindigkeit: Unbekannt" | Santi | Dateisysteme, Festplatten und Memory | 0 | 02-16-2006 06:16 AM |
| Semaphore | vjsony | UNIX for Dummies Questions & Answers | 3 | 04-07-2003 03:06 PM |
| Semaphore | yls177 | UNIX for Dummies Questions & Answers | 1 | 10-09-2002 12:18 AM |
![]() |
|
|
LinkBack | Thread Tools | Suche diesen Thread |
Bewertung:
|
Anzeige-Modi |
|
|
|
||||
|
Follow-up auf otheus-Code
Vielen Dank für den Code ein, wenn ich es lief ich dieses:
2.6.9/Xeon/3.2 MHz (3 Läufe) 129.186,76 semop / s (8784700/68) [100] 129.367,65 semop / s (8797000/68) [100] 129.257,35 semop / s (8789500/68) [100] SCO/Xeon/3.2 MHz (3 Läufe) 527.641,18 semop / s (8969900/17) [100] 564.212,50 semop / s (9027400/16) [100] 535.800,00 semop / s (9108600/17) [100] Ich sehe SCO ist in der Lage, etwa 3 mal mehr semop / s als Linux. Übrigens, die H / W identisch ist, ich glaube, ich habe es die in diesem Thread looong. Für Linux, werde ich wieder hier s / w-Versionen: Fedora 2.6.9 gcc - ver.3.4.3 ldd - Ver. 2.3.5 glibc - Version 2.3.5 |
|
||||
|
helfen mir, den Code
Dies ist ein wenig off-topic, aber ich fürchte, ich kann nicht ganz verstehen, den Code.
Mein Verständnis für die Zwecke der ersten Schleife Zitat:
Nächster, Wir haben zwei Schleifen: erste Lauf 8750000 mal, da die maxloop Wert 1000000, Dann laufen wir Schleife bis zu 1250000 mal, wo jeder 100. Iteration wir prüfen, ob und, wenn Zweitrundeneffekte geändert, wir brechen aus Zitat:
Ihre Klarstellung wird gebeten. |
|
|||||
|
Ich habe die Kerne. Es wurden größere Änderungen im Jahre 1995 (vor Version 2.0), 1998 (vor Version 2.4), und dann wieder mit der Einführung des "O (1) Scheduler" (nicht sicher). Hier ist der Code - unverändert seit 2.4 -, das semctl (GETALL):
Code:
sma = sem_lock(semid);
/* check condition omitted */
nsems = sma->sem_nsems;
err=-EIDRM;
if (sem_checkid(sma,semid)) goto out_unlock;
err = -EACCES;
if (ipcperms (&sma->sem_perm, (cmd==SETVAL||cmd==SETALL)?S_IWUGO:S_IRUGO))
goto out_unlock;
case GETALL: {
ushort __user *array = arg.array;
int i;
if(nsems > SEMMSL_FAST) {
/* omitted code -- relevant only when nsems > 256 */
}
for (i = 0; i < sma->sem_nsems; i++)
sem_io[i] = sma->sem_base[i].semval;
sem_unlock(sma);
err = 0;
if(copy_to_user(array, sem_io, nsems*sizeof(ushort)))
err = -EFAULT;
goto out_free;
Code:
case GETALL:
if (ipcperms (ipcp, S_IRUGO)) return -EACCES;
switch (cmd) {
/* ommitted irrelevant code */
case GETALL:
array = arg.array;
i = verify_area (VERIFY_WRITE, array, nsems*sizeof(ushort));
if (i)
return i;
}
break;
/* skipping case statements */
if (semary[id] == IPC_UNUSED || semary[id] == IPC_NOID)
return -EIDRM;
/* the next line provides the sem_checkid() call from 2.4/2.6 code */
if (sma->sem_perm.seq != (unsigned int) semid / SEMMNI)
return -EIDRM;
switch (cmd) {
case GETALL:
if (ipcperms (ipcp, S_IRUGO))
return -EACCES;
for (i = 0; i < sma->sem_nsems; i++)
sem_io[i] = sma->sem_base[i].semval;
memcpy_tofs (array, sem_io, nsems*sizeof(ushort));
break;
|
|
|||||
|
Migurus,
Ich mailte die Verantwortlichen des Codes. Dies ist eine Antwort, die ich zurück von Alan "Maddog" Cox (mit Genehmigung, um hier): Zitat:
Code:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <time.h>
#define NSEMS 2
const static long maxseconds = 1000;
main(int argc, char *argv[])
{
struct timeval tod_start,tod_stop;
long int start,stop;
long int maxloop = 5000000;
long int i;
int sid;
key_t key;
ushort vals[NSEMS] = { 0, 0 };
if (argc > 1)
maxloop = atol(argv[1]);
i = maxloop;
key = ftok("/tmp",99);
gettimeofday(&tod_start, NULL);
while (--i) {
if ((sid = semget(key, NSEMS, IPC_CREAT | 0777)) == -1) {
perror("Can Not Get Semaphore ID");
}
if (semctl(sid, NSEMS, GETALL, vals) == -1) {
perror("Can Not Get Semaphore Values");
}
}
gettimeofday(&tod_stop,NULL);
start = 1000*1000*(tod_start.tv_sec - maxseconds) + tod_start.tv_usec;
stop = 1000*1000*(tod_stop.tv_sec - maxseconds) + tod_stop.tv_usec;
printf("%.2f semop/s (%ld/%ld)\n",
(double)maxloop/(stop-start)*1000*1000, maxloop, stop-start);
}
|
|
||||
|
Otheus, habe ich nie mit der Berichterstattung über Bugzilla, so scheint es ti mir nicht ganz erfüllen und ich fürchte, ich werde nach etwas nicht relevant, so dass, wenn Sie damit einverstanden, es zu tun haben, hier sind die Ergebnisse ab dem 2. Version Ihre "gettimeofday auf" Code, den ich wieder laufen 4-mal zu bekommen Durchschnitt:
SCO $ Tmx2 575.108,94 semop / s (5000000/8694005) $ Tmx2 575.215,00 semop / s (5000000/8692402) $ Tmx2 575.183,63 semop / s (5000000/8692876) $ Tmx2 559.832,49 semop / s (5000000/8931243) Linux: $ ./tmx2 129.363,77 semop / s (5000000/38650699) $ ./tmx2 129.428,22 semop / s (5000000/38631452) $ ./tmx2 129.601,55 semop / s (5000000/38579786) $ ./tmx2 129.511,76 semop / s (5000000/38606534) Wie Sie sehen, kein Unterschied von der früheren Tests. Nur für meine Klarstellung: irgendwie Leute, die an dieser Diskussion über unix.com formuliert sowie auf KernelTrap und anderen Orten waren sehr besorgt, mit 2 Dinge, die in meiner Sicht sind irrelevant für das Thema dieses Threads: Zeit Messgenauigkeit und Beteiligung der Betrieb mehrere Prozesse / shells etc, die die Ergebnisse schlammig. Ich möchte von ganzem Herzen zustimmen, wenn SCO vs Linux Ergebnisse waren vergleichbar. Aber das ist hier nicht der Fall. SCO ist drei mal schneller, egal wir meine Methode oder gettimeofday sehr genaue Methode. Mit all den Overhead ungefähr ähnlich, ich denke, wir waren irgendwie zu schlagen um den heißen Brei herum, wenn wir versuchen zu erreichen, haben in der Mess-Genauigkeit (das tut nicht weh, natürlich!), Aber es machte den Thread aufgebläht. Auch dank Otheus für Ihre Vorschläge, zu diesem Punkt, den ich den Kernel-Code, den Sie genau zeigt, dass Multi-CPU-Fähigkeit fügt eine Schicht von Komplexität und es hilft nicht die Geschwindigkeit. Ihre und die strcmp (KernelTrap Forum) Empfehlungen zur Verbesserung der Linux-Kernel sind gut getroffen. migurus |
|
||||
|
Nur für den Kontrast auf einem modernen Intel-Prozessor SMP Linux 2.6.18 ich mehr
als einer Million Operationen / Sek. Auf dieser Basis bin ich nicht glaube, das gilt als Fehler .. mehr einer wachsenden Schmerzen. Linux war schon immer ein Projekt in der Vorwärtsbewegung. Sie haben entweder bestätigen oder leiden. Linus ist kurz zu entschuldigen für dieses Modell, dass ich je gesehen habe. Code:
1402465.14 semop/s (5000000/3565151) 1409187.85 semop/s (5000000/3548143) 1448182.72 semop/s (5000000/3452603) Intel (R) Celeron (R) CPU 2.00GHz (1999,94 MHz-CPU-686-Klasse) Code:
501281.02 semop/s (5000000/9974445) 500868.00 semop/s (5000000/9982670) 450727.95 semop/s (5000000/11093166) Zuletzt bearbeitet von ramen_noodle; am 10-08-2008 02:43 PM.. Grund: Tippfehler auf Kernel-Version |
![]() |
| Lesezeichen |
| Thread Tools | Suche diesen Thread |
| Anzeige-Modi | Rate this thread |
|
|