Tło:Czym różnią się układy w stosy od stacked coroutines?
Pytam, bo to obecnie mają aplikację z wielu setek (tysięcy) nici. Większość tych wątków jest bezużyteczna przez większą część czasu, czekając na elementy pracy, które mają zostać umieszczone w kolejce. Kiedy element pracy jest dostępny, jest on przetwarzany przez wywołanie dowolnego dowolnie złożonego istniejącego kodu. W niektórych konfiguracjach systemu operacyjnego aplikacja uderza w parametry jądra, które regulują maksymalną liczbę procesów użytkownika, dlatego chciałbym eksperymentować z metodami zmniejszania liczby wątków roboczych.
Moja Proponowane rozwiązanie:
Wydaje się podejściem współprogram oparte, gdzie zastąpi każdy wątek roboczy z współprogram, przyczyniłoby się do osiągnięcia tego celu. Mogę wtedy mieć kolejkę roboczą popartą pulą rzeczywistych wątków (kernel). Gdy element zostanie umieszczony w kolejce określonego programu do przetwarzania, wpis zostanie umieszczony w kolejce puli wątków. Następnie wznowiłby odpowiedni coroutine, przetworzył swoje kolejkowane dane, a następnie zawiesił je ponownie, uwalniając wątek roboczy, aby wykonać inną pracę.
szczegółyrealizacji:
W myśleć o tym, jak to zrobić, mam problemy ze zrozumieniem funkcjonalnych różnic pomiędzy Stackless i stackful współprogram. Mam pewne doświadczenie przy użyciu stosu coroutines przy użyciu biblioteki Boost.Coroutine. Uważam, że jest to stosunkowo łatwe do zrozumienia na poziomie konceptualnym: dla każdego z nich zachowuje kopię kontekstu i stosu procesora, a po przełączeniu się na współprowadzącego przełącza się do zapisanego kontekstu (podobnie jak harmonogram harmonogramu jądra).
To, co jest dla mnie mniej jasne, to to, jak różni się od nich stos pozbawiony stosu. W mojej aplikacji bardzo ważne jest obciążenie związane z wyżej opisanym kolejkowaniem elementów pracy. Większość implementacji, które widziałem, takich jak the new CO2 library, sugeruje, że stosy niewiążące się ze stosem zapewniają znacznie niższe przełączniki kontekstowe.
W związku z tym chciałabym lepiej zrozumieć różnice funkcjonalne między stosami bez stosu i stosu. Konkretnie, myślę, że z tych pytań:
References like this one sugerują, że różnica polega na którym można wydajność/CV w sposób stackful vs. Stackless współprogram. Czy tak jest? Czy istnieje prosty przykład czegoś, co mogę zrobić w stosie coroutine, ale nie w trybie stackless?
Czy są jakieś ograniczenia dotyczące korzystania z automatycznych zmiennych pamięci (tj. Zmiennych "na stosie")?
Czy istnieją jakiekolwiek ograniczenia dotyczące funkcji, które mogę wywoływać z nie stosującego się w stosie coroutine?
Jeśli nie ma zapisywania kontekstu stosu dla stosu niewiążącego w stos, gdzie zmienne automatycznej pamięci pojawiają się, gdy działa coroutine?
"Większość tych wątków jest bezużyteczna przez większą część czasu, czekając na elementy pracy, które mają zostać umieszczone w kolejce" - jeśli tak, to dlaczego istnieje tak wiele wątków? –
@MartinJames: Ze względów starszych. Nie twierdzę, że jest to dobry projekt, a więc moje pragnienie poprawy. Refaktoryzacja całej hurtowni aplikacji nie jest opcją krótkoterminową, dlatego na początku szukam stosunkowo prostych modernizacji. Potencjalnie komplikując dalej, wywołanie blokujące do kolejki jest zwykle wprowadzane na kilka poziomów w stos wywołań (tj. Nie jest to funkcja najwyższego poziomu wątku roboczego). * Myślę, że * to wykluczałoby użycie wątków bezsiadów w tym konkretnym kontekście. –