Nowe posty

Autor Wątek: libfuse i wielowątkowość  (Przeczytany 3886 razy)

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 111
    • Zobacz profil
libfuse i wielowątkowość
« dnia: 2023-10-30, 14:11:06 »
Zależy mi na napisaniu własnego systemu plików, co byłby interaktywny (coś, jakby KIO-Polkit czy UAC).

Problem jest taki, że python3-pyfuse ma problemy z obsługą wątków w niektórych implementacjach Pythona. W OpenSUSE akurat ma.
Są też inne moduły pythona dla fuse, ale są inne problemy, np. nie mogą być równocześnie zainstalowane z python-pyfuse.

Stąd postanowienie o przepisaniu na C. I stąd moje pytanie - jak wygląda kwestia wielowątkowości lub asynchroniczoności. Szukałem w dokumentacji i jest np. id sesji, ale do jego otrzymania, trzeba podać obiekt fuse, który nie jest przekazywany do funkcji-operacji-fuse.

Zależałoby mi czymś takim:

void callback_fuse(int identyfikator_żądania) {
    int fd = wywołujemy_helpera_przekazując_np_ścieżkę_do_pliku
   dodaj_deskryptor_pliku_i_id_żądania_do_pętli(fd, identyfikator_żądania)
}

// Pętla główna
while (1) {
   poll(deskryptory_plików_poll, ilość_deksryptorów, -1);
   int i;
  for (i = 0; i < ilość_deskryptorów; ++i) {
      if (deskryptory_plików_poll[i].revents) {
         int result = obsłuż_helpera(deskryptory_plików[i],&deskryptory_plików_poll[i])
         zwróć_resultat(id_żądań, result);
      }
   }

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3062
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: libfuse i wielowątkowość
« Odpowiedź #1 dnia: 2023-10-30, 16:07:51 »
Fuse nie jest dostosowany do osadzania go w innych aplikacjach (mam wrażenie, że to chcesz uzyskać). Ma własną, zamkniętą pętlę obsługi eventów. Filesystem serwowany z Fuse jest zamkniętą, samodzielną aplikacją.

1. Fuse sam z siebie obsługuje MT: zamieniasz  fuse_loop() na odpowiednie fuse_loop_mt_XX() i wtedy handlery wykonywane są współbieżnie na puli wątków. Jak twórcy piszą: "z pętlą MT cieszysz się wykonaniem współbieżnym oraz dodatkowo wyścigami i zakleszczeniami". Wszystkie handlery muszą być bezpieczne wątkowo.

2. Każde zapytanie Fuse jest zasadniczo samodzielnym bytem. Jeżeli potrzeba kontekstu, jest on globalny dla danej aplikacji realizującej Fuse.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 111
    • Zobacz profil
Odp: libfuse i wielowątkowość
« Odpowiedź #2 dnia: 2023-12-29, 21:23:15 »
Fuse nie jest dostosowany do osadzania go w innych aplikacjach (mam wrażenie, że to chcesz uzyskać). Ma własną, zamkniętą pętlę obsługi eventów. Filesystem serwowany z Fuse jest zamkniętą, samodzielną aplikacją.

1. Fuse sam z siebie obsługuje MT: zamieniasz  fuse_loop() na odpowiednie fuse_loop_mt_XX() i wtedy handlery wykonywane są współbieżnie na puli wątków. Jak twórcy piszą: "z pętlą MT cieszysz się wykonaniem współbieżnym oraz dodatkowo wyścigami i zakleszczeniami". Wszystkie handlery muszą być bezpieczne wątkowo.

2. Każde zapytanie Fuse jest zasadniczo samodzielnym bytem. Jeżeli potrzeba kontekstu, jest on globalny dla danej aplikacji realizującej Fuse.

Niby działa, przynajmniej otwieranie plików jest współbieżne. Problemem jest tworzenie plików, co mogę zrozumieć - kernel musi przeciwdziałać sytuacji, gdy wiele programów będzie chcieć utworzyć plik o tej samej nazwie. Nie wiem, czy chcę rozwiązywać ten problem. Sprawdzę jeszcze, czy tworzenie plików o różnych nazwach działa, ale z tego, co pamiętam, to nie, co przydałoby się rozwiązać.

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 111
    • Zobacz profil
Odp: libfuse i wielowątkowość
« Odpowiedź #3 dnia: 2023-12-30, 14:23:20 »
Współbieżne tworzenie plików  o różnych ścieżkach działa.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3062
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: libfuse i wielowątkowość
« Odpowiedź #4 dnia: 2023-12-30, 17:36:38 »
Pamiętaj, że (jeżeli nie masz mechanizmów równoważących transfer na kilka nośników) wszystko w końcu schodzi się na jednym drucie do dysku (czy SATA czy PCIe), który jest cholernie wkurzająco jednowątkowy... Twoje wielowątkowe zabawy to tylko żonglerka w cache'u systemowym.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 111
    • Zobacz profil
Odp: libfuse i wielowątkowość
« Odpowiedź #5 dnia: 2024-02-11, 13:37:22 »
Sorry, za robienie bałaganu. Zapomniałem o tym wątku. Jeżeli można, to proszę o ewentualne połączenie obecnego wątku, a także tego: https://forum.linux.pl/index.php/topic,26861.0.html .