[Pytania egzaminacyjne]
1. Które z poniższych zdań dotyczących algorytmu szeregowania O(1) są prawdziwe?
a) | Wymiana priorytetów zadań sprowadza się do zamiany wskaźników na tablicę aktywną i przeterminowaną | TAK | |
---|---|---|---|
Wymiana „starych” priorytetów na „nowe” sprowadza się wyłącznie do wymiany wskaźników na tablicę aktywną i przeterminowaną. (Wykład 3) | |||
b) | Priorytet każdego zadania jest ustalany wyłącznie na podstawie jego poziomu interaktywności | NIE | |
Priorytet każdego „zwykłego” zadania jest ustalany na podstawie priorytetu statycznego, jakim jest poziom uprzejmości oraz na podstawie stopnia interaktywności procesu. (Wykład 3) | |||
c) | Promowane są zadania o wysokim stopniu interaktywności | TAK | |
Jądro Linuksa promuje zadania o dużym stopniu interaktywności. (Wykład 3) | |||
d) | Mechanizm szeregowania dokonuje zrównoważenia obciążenia procesorów wyłącznie wtedy, kiedy kolejka zadań jednego z nich jest pusta | NIE | |
W systemach wieloprocesorowych zadania są kojarzone z poszczególnymi procesorami, ale czasem może zajść potrzeba zrównoważenia pracy systemu, wówczas część zadań z kolejki procesów gotowych procesora może zostać przeniesiona do kolejek innych procesorów lub odwrotnie. Mogą być dwie przyczyny takiego zdarzenia. Pierwsza zachodzi wtedy, kiedy w kolejce któregoś z procesorów nie ma żadnych zdań, wówczas mogą one być przeniesione z kolejek innych procesorów. Druga to wywołanie load_balance() za pomocą przerwania zegarowego. W tym przypadku zadanie równoważenia obciążenia jest bardziej skomplikowane. W skrócie polega ono na znalezieniu najbardziej obciążonej kolejki (ponad 25% obciążenia wszystkich kolejek w systemie) i rozłożeniu tego obciążenia na pozostałe procesory. (Wykład 3) | |||
e) | Kwanty czasu dla poszczególnych zadań są przeliczane dopiero wówczas, gdy ostatnie z zadań znajdujących się w tablicy priorytetów aktywnych wyczerpie swój kwant czasu | NIE | |
Kwanty czasu zadań są przeliczane zaraz po ich wyczerpaniu przez zadanie i zanim zadanie trafi do tablicy przeterminowanej. (Wykład 3) |
2. Które z twierdzeń dotyczących obsługi przerwań w Linuxie 2.6 są prawdziwe?
a) | Obsługa przerwań jest podzielona na górną połówkę i dolną połówkę | TAK | |
---|---|---|---|
Z tego powodu kod obsługi przerwań jest podzielony na dwie części zwane górną połówką i dolną połówką.(Wykład 5) | |||
b) | Procedury obsługi przerwań mogą być wykonywane dowolnie długo | NIE | |
Procedura obsługi przerwania wywoływana jest w sposób asynchroniczny i dlatego ważnym jest, aby jej wykonanie zostało zakończone w jak najkrótszym czasie (Wykład 5) | |||
c) | Do linii przerwania o określonym numerze może być przypisanych kilka procedur obsługi przerwań | TAK | |
SA_SHIRQ – określa możliwość współdzielenia linii przerwania z innymi procedurami obsługi przerwań (Wykład 5) | |||
d) | W procedurach obsługi przerwań można wywołać funkcje, które ulegają blokowaniu | NIE | |
Procedury obsługi przerwań są wywoływane w kontekście przerwania, co oznacza, że nie są dozwolone w nich wywołania funkcji blokujących oraz nie jest ważna wartość (ang. invalid) zwracana przez makrodefinicję current. (Wykład 5) | |||
e) | Procedury obsługi przerwań korzystają ze stosu jądra, który ma nieograniczony rozmiar | NIE | |
Procedury obsługi przerwania muszą wykonywać się szybko, aby nie blokować kolejnych zgłoszeń przerwania na tej samej linii. Korzystają one ze stosu jądra, który jest ograniczony do 8KB w 32 – bitowych architekturach PC i do 16KB w 64 – bitowych architekturach Alpha. (Wykład 5) |
3. Określ które ze zdań dotyczące szeregowania procesów w Linuxie 2.6 są prawdziwe?
a) | Linux realizuje wielozadaniowość wyłącznie w oparciu o kooperacje | NIE | |
---|---|---|---|
Istnieją dwa typy systemów wielozadaniowych: systemy wielozadaniowe z kooperacją (bez wywłaszczania) i systemy wielozadaniowe z wywłaszczaniem. W systemach pierwszego typu proces zawsze dobrowolnie zrzeka się procesora i oddaje sterowanie do systemu operacyjnego. Drugi typ systemów kontroluje wykorzystanie procesora przez realizowane zadania i może przerywać ich działanie. Zapobiega to sytuacji, w której pojedynczy proces mógłby zmonopolizować dostęp do procesora. Linux jak większość współczesnych systemów operacyjnych realizuje wielozadaniowość z wywłaszczaniem. (Wykład 3) | |||
b) | Działanie planisty O(1) oparte jest na schemacie kolejek ze sprzężeniem zwrotnym | TAK | |
Schemat szeregowania jaki zastosowano w tym systemie opiera się na schemacie wielopoziomowych kolejek ze sprzężeniem zwrotnym. (Wykład 3) | |||
c) | Zadania interaktywne otrzymują od planisty O(1) mniejszy kwant czasu niż zadania nieinteraktywne | NIE | |
Jądro Linuksa promuje zadania o dużym stopniu interaktywności. Takie zadania po wykorzystaniu swojego kwantu czasu nie trafiają od razu do tablicy przeterminowanej, ale otrzymują drugą szansę i są umieszczane w tablicy aktywnej, na końcu tej samej listy, na której były poprzednio (dostają ten sam kwant czasu, co przed wykonaniem) (Wykład 3) | |||
d) | Główną strukturą danych planisty CFS jest drzewo czerwono-czarne | TAK | |
W planiście CFS tablice priorytetów zostały zastąpione drzewem czerwono-czarnym. (Wykład 3) | |||
e) | Linux nie jest rygorystycznym systemem czasu rzeczywistego | TAK | |
4. Które ze zdań dotyczących kolejek prac są prawdziwe?
a) | Czynności odroczone wykonywane w ramach kolejek prac są wykonywane w kontekście przerwania | NIE | |
---|---|---|---|
Dzięki tym mechanizmom czynności czasochłonne nie są wykonywane bezpośrednio w procedurze obsługi przerwania, ale są odraczane do czasu kiedy system będzie mniej obciążony (najczęściej zaraz po odblokowaniu przerwań). (Wykład 7) | |||
b) | Kolejki prac zastąpiły mechanizm dolnych połówek znany jako „kolejki zadań”, który był wykorzystywany we wcześniejszych wersjach jądra Linuksa | TAK | |
W jądrze Linuksa w wersji 2.6 istnieją cztery mechanizmy będące częściami systemu dolnych połówek: przerwania programowe i tasklety, które wyparły mechanizm BH5 oraz kolejki prac (ang. work queue), które wyparły kolejki zadań (ang. task queue). (Wykład 7) - Przerwania programowe i tasklety wyparły mechanizm BH (dolnych połówek) - Kolejki prac wyparły kolejki zadań |
|||
c) | Mechanizm kolejek prac pozwala na określenie czasu po upływie którego dana czynność może się rozpocząć | TAK | |
Istnieje również mechanizm liczników, które pozwalają odroczyć czynności na określony czas, ale ich opis zostanie przełożony na później. (…) Dolne połówki gwarantują przełożenie wykonania złożonych czynności związanych z obsługą przerwania na później, ale nie określają kiedy dokładnie to wykonanie nastąpi (…) Niektóre mechanizmy dolnych połówek pozwalają określić po jakim czasie powinny być wykonane zlecone im czynności, ale nie gwarantują dokładności. | |||
d) | Jądro systemu Linux zawiera specjalną funkcję, której wywołanie pozwala na opróżnienie domyślnej kolejki prac | TAK | |
Czasem konieczne może się okazać wymuszenie opróżnienia domyślnej kolejki prac. Dokonujemy tego za pomocą funkcji flush_scheduled_work(). (Wykład 7) | |||
e) | Jeśli w jądrze tworzona jest nowa kolejka prac, to jest równocześnie dla niej tworzony nowy, odrębny wątek roboczy | TAK | |
Nowe kolejki prac tworzone są za pomocą create_workqueue(). Dla każdej utworzonej w ten sposób kolejki tworzony jest również osobny wątek roboczy. (Wykład 7) |
5. Które z poniższych twierdzeń dotyczących środków synchronizacji w jądrze Linuksa 2.6 są prawdziwe?
a) | Wątek wykonania, który przetrzymuje semafor nie może równocześnie przetrzymywać rygla pętlowego | TAK | |
---|---|---|---|
Semafory nie mogą być przetrzymywane przez wątki, które już przetrzymują rygle pętlowe. (Wykład 8) | |||
b) | Blokady sekwencyjne pozwalają ustalić, czy operacja odczytu nie została przepleciona z operacją zapisu | TAK | |
Blokady sekwencyjne w prosty sposób pozwalają określić czy operacja odczytu nie została przepleciona z operacją zapisu. (Wykład 8) | |||
c) | Blokada BKL jest blokadą gruboziarnistą | TAK | |
Blokada BKL (ang. Big Kernel Lock) miała być rozwiązaniem przejściowym, które miało być zastąpione blokadami o mniejszej ziarnistości. (Wykład 8) | |||
d) | Blokada BKL nie jest rekurencyjna | NIE | |
Ponadto BKL jest rekurencyjna, wyłącza wywłaszczanie jądra i można wykorzystywać ją jedynie w kontekście procesu. (Wykład 8) | |||
e) | Rygle pętlowe nie są używane w systemach jednoprocesorowych w jądrze, które nie wywłaszcza wątków | TAK | |
Należy również pamiętać, że rygle nie są rekurencyjne i nie są stosowane w systemach jednoprocesorowych (kompilator wstawia w ich miejsce puste instrukcje lub jeśli podczas kompilacji włączona jest opcja wywłaszczania jądra zastępuje je funkcjami włączającymi i wyłączającymi wywłaszczanie jądra, opisanymi niżej). (Wykład 8) |
6. Poniżej umieszczono zdania dotyczące obsługi przerwań przez Linuksa 2.6. Które z nich są prawdziwe?
a) | Częstotliwości pojawiania się wszystkich przerwań są wykorzystywane do inicjalizowania generatora liczb losowych | NIE | |
---|---|---|---|
b) | Numery przerwań mogą być przydzielane niektórym urządzeniom dynamicznie | TAK | |
W komputerach kompatybilnych z IBM PC część przerwań jest na stałe przypisana pewnym urządzeniom, a część – w szczególności dla tych urządzeń, które są podłączone z systemem przez magistralę PCI lub nowsze szyny, takie jak PCI-Express, USB – jest przydzielana w sposób dynamiczny. (Wykład 6) | |||
c) | Aby procedura obsługi przerwania mogła być wywołana, musi zostać wcześniej zarejestrowana | TAK | |
Każda procedura obsługi przerwania musi zostać zarejestrowana za pośrednictwem funkcji request_irq, która kojarzy funkcję z przerwaniem i uaktywnia daną linię (Wykład 6) | |||
d) | Procedury obsługi przerwania mogą korzystać z wartości zwracanej przez makrodefinicję „current” | NIE | |
Procedury obsługi przerwań są wywoływane w kontekście przerwania, co oznacza, że nie są dozwolone w nich wywołania funkcji blokujących oraz nie jest poprawna (ang. invalid) wartość zwracana przez makrodefinicję current. (Wykład 6) | |||
e) | Nie jest wymagane, aby funkcje obsługi przerwań były wielobieżne | TAK | |
Funkcje obsługi przerwań są definiowane według następującego prototypu (…) Nie wymaga się, aby funkcje te były wielobieżne, gdyż wywołanie funkcji powoduje zablokowanie linii z nią związanej. (Wykład 6) |
7. Które ze zdań dotyczących synchronizacji są prawdziwe?
a) | Niektóre operacje niepodzielne mogą być zrealizowane jako pojedyncze rozkazy procesora | TAK | |
---|---|---|---|
Operacje niepodzielne (atomowe) na zmiennych prostych typów są zazwyczaj realizowane za pomocą instrukcji maszynowych właściwych dla architektury procesora. (Wykład 8) | |||
b) | Przeplot operacji jest przyczyną występowania problemu sekcji krytycznej | NIE | |
c) | W systemie Linux w przestrzeni użytkownika wywłaszczenie procesu może zajść tylko w ściśle określonym momencie jego działania | NIE | |
d) | Zadanie nigdy nie może być wywłaszczone po zakończeniu obsługi przerwania | NIE | |
e) | Dostęp do zmiennych lokalnych wątków wykonania nie musi podlegać synchronizacji | TAK | |
W przypadkach gdy trzeba chronić dane, które są widziane przez jeden procesor przed dostępem współbieżnym można zrezygnować z rygli pętlowych i zastosować zwykłe zablokowanie wywłaszczania. |
8. Które ze stwierdzeń dotyczących wywołań systemowych w Linuksie 2.6 są prawdziwe?
a) | Dodawanie nowych wywołań systemowych nie jest zalecanym przez twórców jądra sposobem dodawania nowej funkcjonalności | TAK | |
---|---|---|---|
Dodanie do jądra nowych wywołań systemowych jest kuszącym pomysłem, jednakże wśród twórców jądra Linuksa panuje silna tendencja, aby tego nie robić. Po dokładnych rozważaniach można określić następującą listę wad i zalet tworzenia nowych wywołań jądra (Wykład 5) | |||
b) | Każde wywołanie systemowe zwraca wartość typu „long” | TAK | |
Każde wywołanie systemowe zwraca wartość typu long, która stanowi kod błędu. Najczęściej poprawne zakończenie wywołania sygnalizowane jest wartością zero, a wykonanie błędne wartością ujemną. (Wykład 5) | |||
c) | Każde wywołanie systemowe musi przyjmować co najmniej jeden argument wywołania | NIE | |
Wywołania systemowe podobnie jak zwykłe funkcje mogą przyjmować pewną liczbę argumentów wywołania, lub nie przyjmować ich w ogóle. (Wykład 5) | |||
d) | Wszystkie funkcje ze standardowej biblioteki języka C korzystają z wywołań systemowych | NIE | |
e) | Funkcja realizująca wywołanie systemowe musi być w całości napisana w assemblerze | NIE | |
Zadania użytkownika nie wywołują najczęściej bezpośrednio wywołań systemowych lecz robią to za pomocą podprogramów języka wysokiego poziomu. (Wykład 5) |
9. Które twierdzenia odnośnie wątków i procesów w systemie Linux są prawdziwe?
a) | Za szeregowanie wątków odpowiada inny mechanizm jądra niż za szeregowanie procesów | NIE | |
---|---|---|---|
W przeciwieństwie do wielu innych systemów operacyjnych Linux obsługuje wątki, ale nie odróżnia ich od zwykłych procesów. (Wykład 2) | |||
b) | Każdy wątek jądra posiada swoją odrębną przestrzeń adresową | NIE | |
Wątki jądra nie mają własnej przestrzeni adresowej, działają w obrębie przestrzeni jądra. (Wykład 2) | |||
c) | Makrodefinicja „current” pozwala na szybki dostęp do deskryptora bieżącego procesu | TAK | |
W jądrze zdefiniowana jest makrodefinicja o nazwie „current”, która pozwala na szybki dostęp do deskryptora bieżącego procesu. (Wykład 2) | |||
d) | Proces macierzysty, którego proces potomny się zakończył przechodzi w stan TASK_ZOMBIE | NIE | |
Jeśli proces macierzysty zakończy się przed procesem potomnym, to ten ostatni pozostanie w stanie zombie.(…) TASK_ZOMBIE – proces zakończył się, w systemie został jednak jego deskryptor, który jest usuwany przez proces macierzysty poprzez wywołanie o nazwie „wait4()”,(Wykład 2) | |||
e) | Deskryptory procesów powiązane są w listę | TAK | |
Deskryptory procesów s powi zane ze sob w dwukierunkową listę procesów. (Wykład 2) |
10. Określ które twierdzenia dot. zażądania czasem w Linkusie są prawdziwe?
a) | Stała HZ dla architektury i386 wynosi 1000 | NIE | |
---|---|---|---|
b) | Zawartość zegara czasu rzeczywistego jest odczytywana przez jądro co pewien określony przedział czasu | NIE | |
Jądro obsługuje również mechanizm zegara czasu rzeczywistego (RTC) z którego pracy korzystają głównie aplikacje użytkowników. Zegar ten przechowuje i aktualizuje informacje o bieżącej dacie i godzinie. Jego zawartość jest odczytywana i umieszczana w zmiennej xtime podczas rozruchu systemu. Jądro nie odczytuje już więcej zawartości zegara czasu rzeczywistego, ale samo aktualizuje zawartość tej zmiennej i ewentualnie może aktualizować zawartość samego RTC. (Wykład 9) | |||
c) | Zmienna jiffies jest nałożona na starsze 32 bity zmiennej „jiffies_64” | NIE | |
Kiedy od jądra 2.4 zaczęto stosować stałą HZ=1000, to okres ten skrócił się do 49,7 dnia, dlatego też twórcy jądra zastosowali rozwiązanie polegające na „nałożeniu” 32 – bitowej zmiennej jiffies na zmienną jiffies_64, która ma rozmiar 64 – bitów. Odwołanie się więc do zmiennej jiffies w architekturach 32 – bitowych daje wartość jej młodszego słowa, w architekturach 64 – bitowych jej pełną wartość. (Wykład 9) | |||
d) | Liczniki dynam. ze względu na zbyt mała precyzje nie mogą być wykorzystywane w zadaniach czasu rzeczyw. | TAK | |
Liczniki, zwane licznikami dynamicznymi lub licznikami jądra pozwalają opóźnić wykonanie określonych czynności o ustaloną ilość czasu począwszy od chwili bieżącej. Nie jest to mechanizm precyzyjny i mogą zdarzać się niedokładności rzędu rozmiaru okresu, więc nie powinny one być stosowane do zadań czasu rzeczywistego, niemniej większości przypadków nadają się one do zastosowania. (Wykład 9) | |||
e) | Listy liczników nie są przez system sortowane | TAK | |
Aby uniknąć sortowania listy liczników i kosztownego przeglądania jest ona podzielona na pięć grup, pod względem czasu po jakim trzeba będzie wywołać funkcje zgromadzonych na niej liczników. Wykład 9) |
11. Brak pytania
a) | Zmienna typu „atomic_T” jest 32 bitowa. | TAK | |
---|---|---|---|
atomic_t, mimo, że zbudowany jest na typie „int” (32 – bitowym) pozwala na przechowywanie wartości 24-bitowych (3 bajty). (Wykład 8) | |||
b) | Wszystkie architektury, które obsługuje Linux dostarczają rozkazów maszynowych realizujących operacje niepodzielne na wartościach będących liczbami całkowitymi. | NIE | |
Oprócz operacji niepodzielnych na liczbach całkowitych jądro dostarcza funkcji realizujących niepodzielne operacje na pojedynczych bitach. (Wykład 8) | |||
c) | Rygle pętlowe mogą być stosowane we fragmentach kodu wykonywujących się w kontekście przerwania. | TAK | |
Rygle pętlowe mogą być używane w procedurach obsługi przerwań, ale tylko wraz z wyłączeniem lokalnego systemu przerwań, aby uniknąć zakleszczeń. (Wykład 8) | |||
d) | Rygle R-W stosujemy w zagadnieniach typu problem czytelników i pisarzy, gdzie faworyzowani są pisarze. | NIE | |
Jeśli problem, który chcemy rozwiązać sprowadza się do problemu pisarzy i czytelników, a ściślej do wersji tego problemu, gdzie faworyzowani są czytelnicy, to możemy zastosować rygle pętlowe R-W. | |||
e) | Zmienne sygnałowe są uproszczoną wersją semaforów. | TAK | |
Zmienne sygnałowe służą do synchronizacji pracy zadań i są uproszczoną wersją semaforów. (Wykład 8) |