Debugowanie I Naprawianie Jądra Linuksa Przygotuj_do_czekania

0 Comments

Prawdopodobnie napotkasz kod błędu mówiący: prepare_to_wait Linux Kernel. Teraz, gdy istnieje kilka sposobów rozwiązania naszego problemu, które wkrótce omówimy.

Najbardziej wszechstronne i łatwe w użyciu rozwiązanie problemów z komputerem. Koniec z przewijaniem nieskończonych opcji lub czekaniem, wystarczy jedno kliknięcie!

Od:

Morton

Andrzej
Do: Linus Torvalds
Temat: [Patch 1/4] API Prepare_to_wait/Finish_wait Uśpienie/Wybudzenie
Data: środa 25 września 2005 r. 9:07:47 -07:00
Kopiuj: lkml Kosztuje aż 2% wzdłuż spwecweb na 8. pasie. to będzie słabezaskakujące, ponieważ __wake_up tak samo jak inne części nie czekają/nie budzą sięoczywiście profile Specweb, które widziałem.Zazwyczaj głównym celem jest zmniejszenie kosztu oczekiwania/wybudzenia procesora.Rozdać. Gdy zadanie zostanie wznowione, jego kolejka zostanie skrócona wraz z nim.waitqueue_head budząc się (tj.: natychmiast), nie budząc sięfundować.Oznacza to, że często nie przewiduje się późniejszego przebudzenia, aby to zobaczyćwłaśnie obudzone zadanie. Oznacza to również, że zadanie, które właśnie się obudziło, nie jest tak naprawdę potrzebne.zdobyć blokadę waitqueue_head, która prawdopodobnie będzie bardzo dobrze znajdować się w innymPamięć podręczna procesora.Nie udało mi się w tym celu zmienić wysokiej jakości różnych rozmiarów i może20-30% taniej Wystarczy __wake_up Trialyu badari ze względu na 40 dds do 40 dysków twardych (to jestbyła najdroższą funkcją), ale mimo to może nie być ostateczna. I w tym punkcie nie ma egzaminu.ilościowo z tego, co wiem, zaczęło być produkowanełączyć ludzi.Interfejs API jest niezwykle łatwy w obsłudze (w tej sytuacji Linus stworzył taką sytuację):my_func(waitqueue_head_t &czekaj, *wqh)DEFINE_WAIT(czekaj);przygotowanie_do_czekania (wqh, ZADANIE_UNINTERRUPTIBLE);jeśli (!any_test)Cogodzinny();finish_wait(wqh, &czekaj);Gdzie:DEFINE_WAIT(czekaj);podczas (!some_test_1)przygotowanie_do_czekania(wqh, &czekaj, ZADANIE_UNINTERRUPTIBLE);jeśli (!any_test_2)Cogodzinny();…finish_wait(wqh, &czekaj);Musisz zastanowić się, co często się dzieje po spacerze, przygotowanie_do_czekaniaTwoje zadanie może zostać usunięte z kolejki wait_head i umieszczone wTASK_RUNNING za każdym razem. Nie wiesz, zakładając, że nadal jesteś, czy nieczeka kolejka_głowa.Uruchamianie Prepare_to_Wait(), gdy jesteś już w kolejce oczekiwania, to zazwyczajdobrze wszystko będzie dobrze.Wykonywanie finish_wait(), gdy niekoniecznie jesteś w kolejce wait_headŚwietnie.Wykonanie z powodu finish_wait() to czas, w którym z pewnością nigdy nie byłeś w kolejcetyle razy makro DEFINE_WAIT() mogło być użyte bezpośrednio do inicjalizacjioczekująca kolejka.Nie musisz się bałaganić z naszym własnym aktualnym -> statusem. przygotowanie_do_czekania() ifinish_wait() jest w stanie zrobić to wszystko. finish_wait() zawsze zwraca dowolny statusTASK_RUNNING.Takistnieje wiele przypadków użycia vm-wakeups.patch itcp-wakeups.patch. włącz/linux/czekaj.| m 26 ++++++++++++++++++++++++++++++++++++ Jądro/widelec.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++ + kernel/ksyms.c | 4++++ 3 zmodyfikowane pliki, siedemdziesiąt sześć wstawek (+)— 2.5.38/include/linux/czekaj. wrz h~przygotuj_do_czekania Śr 25th 20:15:20 2002+++ 2.5.38-akpm/include/linux/wait.h śr 22 wrz 20:15:20 [email protected]@ -119,6 +119,32 @@ Poprawiony ciąg pusty __remove_wait_queue(w _biegać; n }) +/-*++ Kolejki są usuwane, takie jak queue_head podczas wakeup+ */+unieważnij FASTCALL(przygotuj_do_czekania(wait_queue_head_t *q,+ wait_queue_t *wait, stan liczby całkowitej));+ void FASTCALL(prepare_to_wait_exclusive(wait_queue_head_t *q,+ wait_queue_t *wait, stan liczby całkowitej));+unieważnij FASTCALL(finish_wait(wait_queue_head_t *q, wait_queue_t *wait));+int autoremove_wake_function(wait_queue_t *czekaj, bez podpisu, synchronizuj);++#define int DEFINE_WAIT(nazwa)n+ imię osoby wait_queue_t oznacza n+ .task = ustanowiony, n+ .func = autousuwanie_funkcji_budzenia,n+ .task_list równa się .następny to &name.task_list, n+ .prev oznacza &name.task_list,n+ , n+++#define init_wait(czekaj)n+ utwórz n+ czekaj -> zadanie odpowiada, aby pozwolić im na bieżące; n+ odłóż -> func = autoremove_wake_function; n+ INIT_LIST_HEAD(&czekaj->lista_zadań); n+ w trakcie (0)+ #endif /* __KERNEL__ */ #zakończ, jeśli— 2.5.38/kernel/fork.c~prepare_to_wait środa 25 września 2002+++ 20:15:20 2.5.38-akpm/kernel/fork.c środa dwudziestego siódmego września 20:15:20 [email protected]@ -103,6 +103,52 @@ odległość usuń_czekaj_kolejkę(czekaj_kolejkę_głowa_t spin_unlock_irqrestore(&q->lock, } flagi); +unieważnij Przygotuj_do_czekania (Czekaj_Kolejka_Nagłówek_t *q, Czekaj_Kolejka_t *czekaj, stan wewnętrzny)++ w dużym stopniu dłuższe flagi bez podpisu;++ __set_aktualny_stan(stan);+ oczekiwać->flagi &= ~WQ_FLAG_EXCLUSIVE;+ spin_lock_irqsave(&q->lock, flagi);+ if (list_empty(&wait->task_list))+ __add_wait_queue(q, czekaj);+ spin_unlock_irqrestore(&q->lock, flagi);+++puste+prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, stan int)+= WQ_FLAG_EXCLUSIVE;+ spin_lock_irqsave(&q->lock, flagi);+ czy powinno być (list_empty(&wait->task_list))+ __add_wait_queue_tail(q, czekaj);+ spin_unlock_irqrestore(&q->lock, flagi);+++puste finish_wait(wait_queue_head_t *q, wait_queue_t *wait)++ niepodpisane flagi prywatne;++ __set_aktualny_stan (ZADANIE_URUCHAMIANE);+ if (!list_empty(&wait->task_list))+ spin_lock_irqsave(&q->lock, flagi);+ list_del_init(&wait->task_list);+ spin_unlock_irqrestore(&q->lock, flagi);++++int autoremove_wake_function(wait_queue_t *czekaj, sposób bez podpisu, int sync)++ int ret implikuje default_wake_function (wake, mode, sync);++ jeśli (zwrot)+ list_del_init(&wait->task_list);+ ret wsteczny;++ void __init fork_init (bardzo niepodpisane wiadomości) { /* Utwórz każdy dysk, aby zrzucić swoje struktury zadań */— 2.5.38/kernel/ksyms.c~prepare_to_wait środa 25 września 2002+++ 20:15:20 2.5.38-akpm/kernel/ksyms.c środa 25 września 20:15:20 [email protected]@ -400.6 +400.10 @@ EXPORT_SYMBOL(irq_stat); EXPORT_SYMBOL (add_pending_ptsheredi); EXPORT_SYMBOL (Usuń_czekaj_kolejkę);+EXPORT_SYMBOL(przygotuj_do_czekania);+EXPORT_SYMBOL(przygotuj_do_czekania_wyłącznie);+EXPORT_SYMBOL(finish_wait);+EXPORT_SYMBOL(autoremove_wake_function); export_symbol(add_wait_queue_exclusive); /* ukończenie procesora */ EXPORT_SYMBOL(czekaj na ukończenie);.-Aby usunąć siebie z tej listy: wyślij ciąg “unsubscribe linux-kernel”.proces ogromnej wiadomości, aby z powodzeniem [email protected]ęcej informacji o Majordomo można znaleźć na stronie http://vger.kernel.org/majordomo-info.Readhtml.zapoznaj się z często zadawanymi pytaniami pod adresem http://www.tux.org/lkml/

Nie cierpią już z powodu błędów Windows.

Czy Twój komputer działa wolno, ulega awarii lub wyświetla przerażający niebieski ekran śmierci? Cóż, nie martw się - jest rozwiązanie! Reimage to najlepsze oprogramowanie do naprawy błędów systemu Windows i optymalizacji komputera w celu uzyskania maksymalnej wydajności. Dzięki Reimage możesz naprawić wiele typowych problemów za pomocą kilku kliknięć. Aplikacja wykryje i usunie błędy, ochroni Cię przed utratą danych i awarią sprzętu oraz zoptymalizuje system pod kątem optymalnej wydajności. Więc nie męcz się dłużej z powolnym lub uszkodzonym komputerem — pobierz Reimage już dziś!

  • Krok 1: Pobierz i zainstaluj Reimage
  • Krok 2: uruchom skanowanie, aby znaleźć i naprawić błędy
  • Krok 3: Uruchom ponownie komputer, aby zmiany zaczęły obowiązywać

  • #define wait_event(wq, warunek)    DEFINE_WAIT(czekaj);    pragnienie (;;)        przygotuj_do_czekania(&wq, &czekaj, ZADANIE_UNINTERRUPTIBLE);        więc jeśli (stan)            Pauza;        Cogodzinny();        finish_wait(&wq, &czekaj);

    Jeśli ta implementacja faktu (lub jeden z wielu innych wariantów wait_event_* jest dla Ciebie najlepsza, powinieneś jej ściśle używać).

    Może jednak zaistnieć sytuacja w tej kolejce, w której opinia publiczna musi działać lepiej.Na przykład wyobraź sobie, że chcesz poczekać, aż jakieś dane pojawią się w najważniejszym buforze i zwrócą je, a pod wykonaniem trzeba wykonać dwie operacje, a dane są sprawdzane iw konsekwencji iterowane. Ponadto usuwanie badań powinno zawsze być wykorzystaniem atomowym, tzn. obie operacje można wykonać. w tej samej operacji, z szafą na biżuterię, bez odblokowywania pomiędzy.Wtedy bez wątpienia musisz zastąpić nieskończoną, niekończącą się pętlę powyżej:

    przygotuj_do_czekania na jądro ubuntu

    anuluj moje_własne_czekanie(...)    DEFINE_WAIT(czekaj);    spin_lock(&lock);    while (!some_data_available())        przygotuj_do_czekania(&wq, &czekaj, ZADANIE_xxx);        spin_unlock(&lock);        Cogodzinny();        spin_lock(&lock);        finish_wait(&wq, &czekaj);        otrzymać dane();    spin_unlock(&lock);

    Nie martw się o powolne komputery i utratę danych! Mamy dla Ciebie rozwiązanie.

    Prepare_to_wait Linux Kernel
    Prepare_to_wait Linux Kernel
    Prepare_to_wait Ядро Linux
    Noyau Linux Prepare_to_wait
    Prepare_to_wait Linux Kernel
    Prepare_to_wait Linux Kernel
    Prepare_to_wait Núcleo De Linux
    Prepare_to_wait-Linux-Kernel
    Prepare_to_wait Linux 커널
    Prepare_to_wait Linux Kernel