Ist das da korrekt und schneller als pthread_mutex_(un)lock(·)?

Achtung: Es geht jetzt um die Version in der Ergänzung mit dem usleep(1) (ich darf die Frage nicht mehr ändern und mag auch keine neue stellen...)...

Aus man-pages habe ich mir zum Spaß ein Lock-Unlock-Funktionen-Paar gebastelt. Es funktioniert beim ersten Test auch. Ich weiß aber nicht, ob meine Idee überhaupt korrekt ist. Ich weiß auch nicht, ob es schneller als pthread_mutex_lock(·) und pthread_mutex_unlock(·) ist...

Meine beiden gehen jedenfalls bei niedriger Konkurrenz um die Sperre fast nie in den Kernel (dieses FUTEX_WAIT und FUTEX_WAKE braucht man dann fast nie...). Die rufen immer nur „lock cmpxchgl“ vom user space auf...

static _Atomic(uint32_t) lcked(0); // not locked
static _Atomic(uint32_t) lckC(0); // number of interested threads
const uint32_t lckM = 20;
static long futex(const int futex_op, const uint32_t val) {
  return syscall(SYS_futex,&lcked,futex_op,val,0,0,0);
}
static void L() {
  std::__atomic_val_t<uint32_t> val(lckC);
  for (;!atomic_compare_exchange_strong(&lckC,&val,val+1);)
    assert(val<lckM);
  assert(val<lckM);
  for (;;) {
    val=0;
    if (atomic_compare_exchange_strong(&lcked,&val,1))
      return;
    if (futex(FUTEX_WAIT,1)==-1 && errno!=EAGAIN)
      exit(1);
  }
}
static void U() {
  std::__atomic_val_t<uint32_t> val(1);
  if (!atomic_compare_exchange_strong(&lcked,&val,0))
    exit(1);
  for (val=lckC;
       !atomic_compare_exchange_strong(&lckC,&val,val-1); )
    assert(val<=lckM);
  assert(val>0 && val<=lckM);
  if (val>1 && futex(FUTEX_WAKE,1)==-1) exit(1);
}

void * worker(void * arg) {
  for (int i=0; i<3; i++) {
    L();
    printf("%u %08X i:%d\n",(int)arg,pthread_self(),i);
    sleep(1);
    U();
  }
  printf("%u %08X done\n",(int)arg,pthread_self());
  return 0;
}
Ja, geht und zwar schneller als pthread_mutex 50%
Sonstiges 50%
Ja, geht, aber pthread_mutex ist schneller, weil: ... 0%
Ja, geht und pthread_mutex... 0%
Nein, das geht nicht, denn: ... (siehe Antwort) 0%
Nein (ohne Begründung) 0%
Sperre, Algorithmus, kernel
Cinnamon läuft derzeit ohne Video-Hardware-Beschleunigung?

Vorneweg, ich weiß, dass es zu diesem Thema schon tausende Threads und Fragen im Internet gibt, jedoch konnte ich damit nichts anfangen, da mein Problem ja mal wieder am Ende doch ein kleines Bisschen anders sein muss als normal.

Ein paar Daten:

Komplette Fehlermeldung:

Cinnamon läuft derzeit ohne Video-Hardware-Beschleunigung und daraus resultierend kann die CPU-Auslastung wesentlich höher sein. Es könnte ein Problem mit Ihren Treibern oder eine andere Fehlerursache geben.

inxi -F ausgabe (gekürzt):

System:
 Host: LinuxMintJ Kernel: 5.3.0-28-generic x86_64 bits: 64 
 Desktop: Cinnamon 4.4.8 Distro: Linux Mint 19.3 Tricia 
CPU:
 Topology: Quad Core model: Intel Core i5-3470 bits: 64 
Graphics:
 Device-1: NVIDIA GF108 [GeForce GT 630] driver: nvidia v: 390.132 
 Display: x11 server: X.Org 1.20.5 driver: nvidia 
 unloaded: fbdev,modesetting,nouveau,vesa 
 resolution: 1280x1024~60Hz, 1920x1080~60Hz 
 OpenGL: renderer: llvmpipe (LLVM 9.0 256 bits) v: 3.3 Mesa 19.2.8  
Drives:
 Local Storage: total: 2.71 TiB used: 537.61 GiB (19.4%) 
 ID-1: /dev/sda vendor: Samsung model: SSD 860 EVO 250GB size: 232.89 GiB 
 ID-2: /dev/sdb vendor: Seagate model: ST1500DL003-9VT16L size: 1.36 TiB 
 ID-3: /dev/sdc vendor: ExcelStor model: J8160S size: 153.39 GiB 
 ID-4: /dev/sdd type: USB vendor: Generic model: STORAGE DEVICE 
 size: 59.48 GiB 
 ID-5: /dev/sde type: USB vendor: Western Digital model: WD10JPVX-22JC3T0 
 size: 931.51 GiB 
Sensors:
 System Temperatures: cpu: 40.0 C mobo: 27.0 C gpu: nvidia temp: 38 C 
 Fan Speeds (RPM): cpu: 0 fan-1: 0 fan-2: 1044 gpu: nvidia fan: 52% 

Das Problem an sich ist, dass ich keine anderen GraKa Treiber installieren kann, da die Treiberverwaltung, beim Versuch einen anderen Treiber als den ausgewählten zu installieren, ein Problem findet.

Dieses Problem habe ich seit dem Kernelupdate auf 5.3.0-28-generic.

Versuche ich die Treiber über das Terminal zu installieren, bekomme ich die Fehlermeldung, dass die Pakete von Paketen abhängen, welche nicht installiert werden sollen.

Leider wird der Platzt knapp, ich hoffe, ihr könnt ansatzweise mein Problem verstehen.

Vielen Dank schon mal für eure Mühe!

Bild zu Frage
Computer, Technik, Linux, Ubuntu, Linux Mint, Technologie, Treiber, kernel, Treiberproblem, Spiele und Gaming
Eigenes OS programmieren

Moin moin,

ich möchte mir ein eigenes OS programmieren! Bevor Bevor nun gleich irgendein Gemecker kommt will ich erstmal behaupten das es nicht viel können soll, fürs erste ein Kernel mit einer einfachen Textausgabefunktion. Ich habe Vorkenntnisse in C und C++ (ein paar Jahre), welche wahrscheinlich nicht schlecht sein werden. Nun will ich als Bootloader GRUB benutzen, zumindest fürs erste und der Kernel soll in Assembler geschrieben werden. Hab im Internet jede Menge darüber gefunden Kernel in C und so weiter aber ich denke in Assembler macht das ganze am meisten Sinn. Dazu muss ich wohl leider sagen das ich so gut wie gar keine Erfahrung mit Assembler habe und die meisten Tutorials die man dazu findet behandel gleich irgendwelche Windows Programmierungssachen welche mich ja nun nicht interessieren. Daher wäre meine ersten Frage ob mir jemand ein paar Assembler Tutorials zeigen die mir weiterhelfen... Die zweite Frage gilt allen anderen Tutorials, möglicherweise sogar ( ich weiß das klingt bescheuert ) einer Schriott für Schritt Erklärung über einen so einfachen Kernel. Ich kann mir nicht vorstellen das da so sonderlich viel Code hinter steckt.

Vielleicht gibt es ja auch noch andere Leute, die sich damit gerne mal ausseinander setzen wollen und genauso wenig Ahnung wie ich haben dann könnte man sich vllt mal über ICQ, Facebook oder sonstwas unterhalten ;)

Ich bin dankbar für jede Antwort!

MfG Inv151673 ;)

Betriebssystem, programmieren, selber, Assembler, CPP, OS, Bootloader, kernel

Meistgelesene Fragen zum Thema Kernel