Pytanie:
Dlaczego RTOS są uważane za deterministyczne?
ozgur
2015-11-25 19:22:15 UTC
view on stackexchange narkive permalink

Na komputerze (oczywiście OS) każdy program w C staje się nieokreślony pod względem czasu. Na przykład pętla trwa od 1,2 do 1,3 sekundy w zależności od tego, „jak szybko przesuwam kolejne okno”. Dzieje się tak, ponieważ system operacyjny sprawia, że ​​procesy (lub wątki) współdzielą moc obliczeniową.

Jeśli chodzi o RTOS (w systemie wbudowanym), kiedy piszemy aplikację wielowątkową, myślę, że to samo dzieje się w zależności od ile wątków jest wykonywanych jednocześnie.

Nie mam narzędzi do dokładnego przetestowania tego w systemie wbudowanym. Dlatego chciałem zapytać. Czy moje obawy są uzasadnione, czy brakuje mi czegoś bardzo podstawowego?

EDYTUJ : Podam przykład. mamy zadanie 1 (trwa 10 ms) i zadanie 2 (trwa 20 ms). Zaczęli w tym samym czasie w dwóch oddzielnych wątkach. Moje twierdzenie (również niepokojące, nie jestem pewien) jest takie, że zadanie 1 zajmuje więcej niż 10 ms, ponieważ dzielą one moc obliczeniową z zadaniem 2.

Determinizm obejmuje zestaw (i synchronizację) danych wejściowych
Brakuje * definicji * systemu RTOS.;-)
RTOS nie jest używany do uruchamiania poszczególnych zadań, które muszą spełniać indywidualne wymagania czasowe, służy do uruchamiania systemu, który jako całość musi spełniać wszystkie wymagania czasowe.Deterministyczny nie oznacza „niezależny od wszystkich okoliczności”, to znaczy „kiedy znam wystarczająco dobrze okoliczności (co zdecydowanie obejmuje zadania o wyższym priorytecie), mogę przewidzieć górną granicę”.
Pięć odpowiedzi:
DrFriedParts
2015-11-25 19:35:35 UTC
view on stackexchange narkive permalink

Jeśli chodzi o RTOS (w systemie osadzonym), kiedy piszemy aplikację wielowątkową, myślę, że to samo dzieje się w zależności od tego, ile wątków jest wykonywanych jednocześnie.

NIE!

Jeśli tak się stanie, to nie jest to system operacyjny czasu rzeczywistego (RTOS).

Krótka odpowiedź jest taka, że ​​definicja RTOS nie ma nic wspólnego z wielozadaniowością lub priorytetem. Po prostu wszystkie zadania mają gwarancje czasowe .

Reszta tego, co uważasz za cechy systemu operacyjnego RTOS (ustalanie priorytetów, ukończenie zadań itp.) to tylko konsekwencje (lub cechy) budowy systemu, w którym zadania muszą zakończyć się w określony przedział czasu.

Wielozadaniowość w RTOS jest koncepcyjnie prostsza niż w miękkim systemie operacyjnym, ponieważ wiele skomplikowanych skrajnych przypadków jest zasadniczo niedozwolonych.

Tak więc, jeśli zadanie 1 trwa 10 ms, a zadanie 2 zajmuje oddzielnie 20 ms.Gdyby działały w tym samym czasie (jako dwa oddzielne wątki), czy nadal byłyby kompletne odpowiednio w 10 ms i 20 ms?
@ozgur Nie, ponieważ jako minimum, niezależnie od tego, czy system operacyjny jest wielozadaniowym oprogramowaniem typu soft-RTOS, hard-RTOS czy nie-RTOS, każdy pojedynczy przełącznik zadań ma narzut.Ponadto, jeśli twój system nie ma wielu procesorów, jedynym sposobem na uzyskanie wyglądu zadań wykonywanych jednocześnie jest szybkie przełączanie się między nimi, co wprowadza wspomniane obciążenie przełączania zadań.Z tego powodu, bez względu na to, jak je podzielisz, zadanie 10 ms i zadanie 20 ms zawsze będzie wymagało więcej (choć miejmy nadzieję, że niewiele więcej) niż 30 ms.
@MichaelKjörling W rzeczywistości Twój komentarz zgadza się z moimi obawami.Nigdy nie możemy być pewni czasu wykonania zadania, o ile istnieje możliwość, że jednocześnie może działać inny wątek.Czy mam rację?
@ozgur Prawie celem RTOS jest determinizm.Jak ktoś inny zauważył, w aplikacjach czasu rzeczywistego zazwyczaj sam kontrolujesz cały wykonywany kod i możesz (i * robisz *) podejmować kroki, aby uniknąć nieprzewidywalności.Stąd, mówiąc ogólnie, * nie ma * „innego wątku, który może działać równolegle”, chyba że sam napisałeś ten kod bezpośrednio.
Pożyczanie z Wikipedii: „system operacyjny działający w czasie rzeczywistym jest ceniony bardziej ze względu na szybkość lub ** przewidywalność reakcji, niż na ilość pracy, jaką może wykonać w danym okresie **.”.https://en.wikipedia.org/wiki/Real-time_operating_system
Rzeczywiście, celem systemu RTOS jest wymuszenie, aby zadania o niskim priorytecie nie były uruchamiane jednocześnie z zadaniami o wysokim priorytecie.
„definicja RTOS nie ma nic wspólnego z wielozadaniowością lub priorytetem” +2 do tego!Szczególnie w świecie osadzonych wszystko, co może zapewnić pewien rodzaj wielozadaniowości, reklamuje się jako RTOS, co w rzeczywistości nie jest poprawne.
@pjc50 Zasadniczo chodzi o deterministyczny czas przydzielania lub uzyskiwania dostępu do * zasobów zarządzanych przez system operacyjny *.Obejmuje to czas procesora, a także np.alokacje pamięci lub dostęp do stałej pamięci masowej lub dowolnego innego elementu sprzętowego.
@pjc50 - Myślę, że twój komentarz jest punktem krytycznym, który może się zgubić.Pytanie zawiera zasadnicze nieporozumienie.Nie ma „zadanie 1 rozpoczęte i zadanie 2 rozpoczęte * w tym samym czasie *”;zadanie o wyższym priorytecie (T1) zatrzyma / wyprzedzi zadanie o niższym priorytecie (T2) do czasu zakończenia T1 lub zostanie poprzedzone zadaniem o jeszcze wyższym priorytecie (T0).Oczywiście żaden system operacyjny nie może w magiczny sposób uruchomić zadań, które wymagają więcej niż dostępne zasoby, aby spełnić ograniczenia czasowe, przestrzenne itp.
„Żaden system operacyjny nie może w magiczny sposób uruchomić zadań, które wymagają więcej niż dostępne zasoby” - w istocie nie może.Ale prawdziwy RTOS pozwoli ci powiedzieć * z wyprzedzeniem *, czy jest zagwarantowane, że wszystkie twoje ograniczenia zostaną spełnione.
@ozgur: Nie rozumiesz aplikacji działających w systemach RTOS.Zamiast dwóch zadań, które trwają 10 ms i 20 ms, zazwyczaj aplikacje w systemach RTOS mają zadania, które zajmują 0,01 ms każdy, ale zadanie 1 musi być wykonywane CO 10 ms, a zadanie 2 musi wykonywać CO 20 ms.Zwykle w aplikacjach czasu rzeczywistego nigdy nie pozwalamy na równoległe działanie wątków w celu współdzielenia mocy procesora.Zamiast tego uruchamiamy wątek przez najkrótszy możliwy czas, a następnie pozwalamy mu spać.Celem systemu RTOS jest to, że istnieją gwarancje, że kiedy poproszę go, aby obudził mnie za 10 ms, zrobi to zamiast 10,01 ms
Nick Johnson
2015-11-25 19:34:56 UTC
view on stackexchange narkive permalink

Nie jest prawdą, że zadania w systemie RTOS są automatycznie deterministyczne, ale można nałożyć znacznie ściślejsze ograniczenia dotyczące czasu i częstotliwości wykonywania zadań. RTOS zazwyczaj zapewnia twarde priorytety zadań; w dowolnym momencie uruchomione jest gotowe zadanie o najwyższym priorytecie. Autor kodu ma również całkowitą kontrolę nad tym, jaki zestaw zadań jest wykonywanych; możesz rozsądnie oczekiwać, że nie ma zadań w tle o wysokim priorytecie, które mogłyby przerwać twój kod, powiedzmy, zamienić dane na dysk, chyba że je napisałeś.

Poza tym niektóre systemy RTOS zapewniają współpracę wielozadaniową. W przeciwieństwie do wielozadaniowości z wywłaszczaniem, w przypadku wielozadaniowości opartej na współpracy zadanie będzie kontynuowane, dopóki dobrowolnie nie zrezygnuje z kontroli nad procesorem.

pjc50
2015-11-25 20:03:39 UTC
view on stackexchange narkive permalink

RTOS zwykle nie gwarantuje przepustowości , zamiast tego pozwala zagwarantować opóźnienie .

Zwykle jest to osiągane przez system priorytetowy, takie jak tutaj w FreeRTOS:

Harmonogram FreeRTOS zapewnia, że ​​zadania w stanie Gotowe lub Uruchomione będą zawsze miały przypisany czas procesora (CPU) zamiast zadań niższy priorytet, które również są w stanie gotowości. Innymi słowy, zadanie umieszczone w stanie Uruchomione ma zawsze najwyższy priorytet, które można uruchomić.

Załóżmy, że masz zadanie o priorytecie 1, które zajmuje 10 ms, aby obsłużyć zdarzenie. zadanie o priorytecie 2, które zajmuje 100 ms, aby obsłużyć inne zdarzenie, i zadanie o priorytecie 3 w tle. Jeśli spodziewasz się jednego zdarzenia o priorytecie 1 nie częściej niż co sekundę, możesz powiedzieć, że najgorszy przypadek do obsługi zdarzenia o priorytecie 2 to 10 ms + 100 ms. Zadanie o priorytecie 3 może zostać arbitralnie spowolnione przez zdarzenia, ale nie przejmujesz się - ponieważ ma niski priorytet.

W twoim przykładzie, czy zadanie z priorytetem 1 i zadanie z priorytetem 2 są uruchomione w tym samym czasie (dwa wątki uruchomione w tym samym czasie)?
Potencjalnie tak lub priorytet 1 rozpoczyna się, gdy działa priorytet 2.W tym przykładzie przyjęto założenie pojedynczego procesora.Zwróć uwagę, że przykładowa specyfikacja ogranicza również ilość zadania P1, które można uruchomić - jeśli zdarzenie P1 otrzymujesz co 10 ms, a jego obsługa zajmie 10 ms, * nic innego nie będzie działać *.
OK, oto moje pytanie.zadanie1 (10ms) rozpoczęło się w tym samym czasie uruchomione zadanie2 (100ms).Uważam, że zadanie 1 zajmuje więcej niż 10 ms, ponieważ dzielą one moc obliczeniową z zadaniem 2. Mam nadzieję, że wyraziłem się jasno.
Myślę, że chodzi o to, że harmonogram nie uruchomi zadania 1 i 2 w tym samym czasie.Najpierw uruchomi zadanie 1 (o wyższym priorytecie) i umieści w kolejce zadanie 2. 10 ms później, po zakończeniu zadania 1, uruchomi zadanie 2.
Tak, nie będzie przeplatać wykonania zadania task1 i task2.Jeśli zadanie P1 można uruchomić, żadne zadania P2 nie zostaną zaplanowane, dopóki nie zostanie ukończone.Jeśli zadanie P2 jest już uruchomione, zostanie wycofane i wstrzymane aż do zakończenia wszystkich prac P1.
Dunk
2015-11-25 21:49:28 UTC
view on stackexchange narkive permalink

Wolałbym, żeby to był komentarz, ale wymaga to zbyt wielu znaków. W każdym razie, ozgur, sądząc po pytaniach w twoich odpowiedziach na komentarze, wydaje się, że nie rozumiesz, że nie możesz po prostu powiedzieć, że mój wątek trwa tak długo i oczekuje, że magicznie zadziała w połączeniu z innymi wątkami, a wszystko to dzięki systemowi operacyjnemu. Musisz zaprojektować swoje wątki i przeanalizować je pod kątem wydajności w najgorszym przypadku. Jeśli najgorszy przypadek nie spełnia Twoich wymagań, musisz przeprojektować swoje wątki.

Więc zamiast po prostu powiedzieć, że wątek 1 zajmuje 10 ms, a wątek 2 20 ms, musisz też powiedzieć, że wątek 1 musi być wykonywany co 15 ms. wątek 2 musi być wykonywany co 40 ms. wątek 3 musi być wykonywany co 500 ms, wątek N musi być wykonywany co 1500 ms. Następnie przydzielasz czas, jak długo może trwać wykonanie każdego wątku w najgorszym przypadku. Składasz to wszystko razem, identyfikujesz najgorsze możliwe scenariusze, a następnie musisz upewnić się, że każdy wątek spełnia wymagania czasowe. Ta analiza jest również miejscem, w którym można zidentyfikować, czy niektóre wątki muszą mieć wyższy priorytet niż inne, aby spełnić wymagania czasowe.

Na przykład, uruchomiony wątek5 zostaje przerwany przez wątek 4, który zostaje przerwany przez wątek 3, który zostanie przerwany przez threadN może być jednym z najgorszych scenariuszy. Umieszczasz to wszystko na osi czasu i sprawdzasz, czy nawet w tym najgorszym przypadku każdy wątek spełnia swoje wymagania czasowe. Możesz zapewnić, że wątki ukończą ten najgorszy scenariusz w sposób deterministyczny, używając harmonogramu i priorytetów w systemie operacyjnym czasu rzeczywistego. To determinizm jest tym, co tworzy system operacyjny czasu rzeczywistego.

Jeśli nadasz wątkom ten sam priorytet, stracisz część (jeśli nie całość) tego determinizmu, ponieważ harmonogram może mieć swobodę wyboru dowolnego wątku chce biec następny.

W systemie operacyjnym takim jak Windows nie tylko nie możesz określić, kiedy będzie uruchamiany każdy wątek, ale nie możesz nawet zagwarantować, że aplikacja będzie działać w dowolnym momencie. System operacyjny może zatrzymać aplikację i uruchomić niektóre usługi w tle, kiedy tylko zechce. Innymi słowy, nie ma determinizmu. Dlatego Windows nie jest systemem operacyjnym czasu rzeczywistego. Chociaż, jeśli twoje wymagania czasowe są duże, na przykład (wątek 1 działa co 10 sekund, wątek 2 uruchamia się co 15 sekund), możesz zasadniczo traktować system Windows jak system operacyjny czasu rzeczywistego, o ile uwzględnisz błąd i mniej więcej co 10 lub 15 sekund (daj lub weź kilkaset milisekund i sporadyczne pominięte okno) jest wystarczająco dobre.

Guill
2015-11-27 14:47:31 UTC
view on stackexchange narkive permalink

Chociaż w innych odpowiedziach stwierdzono, że w „prawdziwym świecie” Twój scenariusz nie jest możliwy, aby móc odpowiedzieć na Twoje pytanie, musimy zbudować hipotetyczny system.

Nasz system składa się z pistoletu, który strzela piłkami w stałym tempie, dwóch pudełek, które „łapią” piłki i przesuwają się o jeden krok z każdą złapaną piłką. Pistolet można przełączyć, aby strzelał do jednej ze skrzynek, ale za każdym razem traci jedną kulkę. Pierwsze pudełko będzie wymagało 1000 kroków (piłek), aby dotrzeć do końca, a pudełko 2 będzie wymagało 2000.

Scenariusz 1 (zadania jedno po drugim):
- broń strzela 1000 piłek do pudełka 1, przełącza (kosztuje 1 piłkę) i strzela 2000 piłek do pudełka 2, co daje w sumie 3001 piłek .

Scenariusz 2 (zadania " jednoczesne ”):
- pistolet strzela 5 piłkami do jednego pudełka, przełącza się i strzela 5 piłkami do drugiego pudełka, aby uzyskać wrażenie jednoczesności . Koszt zmiany to (1000/5 x 2 =) 400 kulek. Tak więc, po wystrzeleniu 2400 piłek, pudełko 1 dotrze do końca, a pudełko 2 będzie potrzebować dodatkowych 1000 piłek, aby dotrzeć do końca, co daje w sumie 3400 piłek .

Stosując te wyniki do scenariusza, Zadanie 1 i pierwsza połowa Zadania 2 zakończyłyby się po 24 ms, a druga połowa Zadania 2 zajęłaby dodatkowe 10 ms, łącznie 34 ms. To wyraźnie pokazuje, że czas wymagany do wykonania zadań wydłuża się z powodu czasu straconego na przełączanie się między zadaniami . Te wyniki są również równoważne wykonaniu Zadania 1 trwającego 12 ms i Zadania 2 22 ms.

Głosowano za.To wyjaśnienie uczyniło moje pytanie jaśniejszym, a odpowiedź jest oczywista.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...