EVA-KATHARINA KUNST, JÜRGEN QUADE. informacje, korzystają z funkcji asynchronicznych.
|
|
- Sylwia Wilk
- 8 lat temu
- Przeglądów:
Transkrypt
1 Technika jądrowa KNOW HOW Nowe jądro programowanie jądra i sterowników TECHNIKA JĄDROWA W pierwszych trzech odcinkach Techniki jądrowej pisaliśmy o samodzielnym tworzeniu modułów jądra dla sterowników, których funkcje będą wywoływane przez aplikacje. Teraz zajmiemy się przetwarzaniem asynchronicznym. Dzięki niemu funkcje w jądrze mogą pracować niezależnie od procesów obszaru użytkownika. EVA-KATHARINA KUNST, JÜRGEN QUADE Kontekst: kontekst (otoczenie) określa, do jakich usług i zasobów dany fragment kodu ma dostęp. Kontekst użytkownika: kod aplikacji jest wykonywany w tak zwanym kontekście użytkownika. Ma do dyspozycji usługi systemu operacyjnego, określone w interfejsie funkcji systemowych. Konteks jądra: kod jądra systemu operacyjnego jest uruchamiany w kontekście jądra. W kontekście jądra wyróżnia się kontekst procesu i kontekst przerwania. Kontekst procesu: zwykłe otoczenie, w którym wykonuje się kod jądra, nazywa się kontekstem procesu. Są w nim do dyspozycji wszystkie funkcje jądra systemu, łącznie z przetwarzaniem kodu opóźnienia na określony czas (oczekiwania) oraz przesyłaniem Automatyczne wykonywanie procesów w jądrze to oszczędność czasu. Dowiódł tego zintegrowany z jądrem 2.4 serwer WWW khttpd, znany też jako Tux. Zanikł on w jądrze 2.6 lecz technika wykonywania poszczególnych funkcji, a nawet całych aplikacji w jądrze, została rozwinięta i udoskonalona. Programiści, którzy muszą zaimplementować ściśle czasowo zaplanowane procedury lub cyklicznie przetwarzać dane, tworzyć statystyki lub przesyłać informacje, korzystają z funkcji asynchronicznych. Porządki Linus Torvalds w wersji 2.6 położył kres panującej w wersji 2.4 dzikiej rozbudowie funkcji jądra. Oprócz przedstawionych w ostatnim odcinku Techniki jądrowej [1] przerwań (IRQ sprzętowych), istnieją obecnie inne techniki podstawowe: IRQ programowe i wątki jądra. Pojęcia z jądrowego świata danych między obszarami pamięci aplikacji i jądra. Wywoływane przez aplikacje funkcje sterownika urządzeń (np. DriverRead ()), wywołania funkcji systemowych, wątki jądra oraz kolejki robocze są przetwarzane w kontekście procesu. Na czym polegają różnice? Podczas przetwarzania sprzętowych IRQ z reguły nie są dopuszczalne dalsze przerwania na tym samym procesorze. Programowe IRQ i wątki jądra mogą natomiast być same przerywane przez przerwania. IRQ programowe są wykonywane w tak zwanym kontekście przerwania, zaś wątki jądra w kontekście procesu (zobacz Ramka Pojęcia z jądrowego świata ). Rozróżnienie to jest kluczowe dla programisty jądra, gdyż niektóre Kontekst przerwania: w kontekście przerwania nie są dostępne wszystkie usługi jądra. Funkcje w tym kontekście nie mogą spać. Nie wolno im też wywoływać funkcji typu kmalloc (), gdyż te procedury w pewnych okolicznościach wymagają wprowadzania sztucznych opóźnień. Dostęp do obszarów pamięci aplikacji (np. poprzez funkcję copy_from_user ()) jest całkowitym tabu. Przetwarzanie w kontekście przerwania powinno trwać jak najkrócej, aby nie zakłócało zwykłych procesów obliczeniowych. Procedury, które wykonują się w kontekście przerwania, to tak zwane procedury obsługi przerwania (ISR), programowe IRQ, tasklety i czasomierze. Obszar jądra: jako obszar jądra określa się te obszary pamięci, do których procedury wewnątrz jądra mogą uzyskiwać bezpośredni dostęp (przez wskaźnik), nie korzystając przy tym ze specjalnych funkcji. Tylko jądro ma dostęp do obszaru jądra. Dostęp do obszaru użytkownika dają mu funkcje copy_to_user (), copy_from_user (), put_user () i get_user () ale tylko do pamięci aktywnego w danym momencie procesu obliczeniowego. Obszar użytkownika: obszary pamięci, do których aplikacja ma bezpośredni dostęp, na przykład przez wskaźnik, nazywamy obszarem użytkownika. Do obszaru jądra aplikacja nie ma dostępu, nawet z prawami superużytkownika. NUMER 17 CZERWIEC
2 KNOW HOW Technika jądrowa Rysunek 1: Asynchroniczne przetwarzanie w jądrze jest możliwe przy użyciu wielu technik. Programowe IRQ i wątki jądra mają trzy różne warianty. Listing 1: Moduł taskletu 01 #include <linux/version.h> 02 #include <linux/module.h> 03 #include <linux/init.h> 04 #include <linux/interrupt.h> MODULE_LICENSE("GPL"); static void TaskletFunctionU ( unsigned long data ) 09 { 10 printk("taskletu called...\n"); 11 } DECLARE_TASKLET( TlDescr,U TaskletFunction, 0L ); static int init ModInit(void) 16 { 17 printk("modinitu called\n"); 18 tasklet_scheduleu ( &TlDescr );// Tasklet wywołaću jak najszybciej 19 return 0; 20 } static void exit ModExit(void) 23 { 24 printk("modexit called\n"); 25 tasklet_kill( &TlDescr ); 26 } module_init( ModInit ); 29 module_exit( ModExit ); funkcje jądra są niedostępne w kontekście przerwania. Techniki podstawowe, czyli IRQ programowe i wątki jądra, występują w różnych odmianach. Tak więc IRQ programowe dzieli się na IRQ programowe, tasklety i czasomierze. Natomiast wątki jądra dzielą się na wątki jądra, kolejki robocze i kolejki robocze zdarzeń. Programiści jądra powinni w miarę możności unikać IRQ programowych i zamiast nich używać taskletów i czasomierzy. Tasklet przejmuje dłużej trwające zadania procedury obsługi przerwania (ISR). Czasomierz jest przydatny do wykonywania zadań w określonym momencie lub w określonych odstępach w czasie. Gdy w grę wchodzą złożone zadania, programiści sięgają po wątki jądra. Jako kolejka robocza wątek może wywoływać funkcje przez jądro systemu operacyjnego. Jeszcze mniej pracy mamy w wypadku predefiniowanej kolejki roboczej zdarzeń; należy jednak przynajmniej dokładnie określić położenie zadania w tej kolejce. Przerwania programowe i tasklety Programowe IRQ lądują jako pierwsze w kolejce po przetworzeniu wszystkich procedur obsługi przerwań sprzętowych. Na 32 możliwe typy w źródłach jądra (linux/interrupt.h) wymienionych jest sześć wstępnie zdefiniowanych typów programowych IRQ. Dla programistów sterowników interesujące są tam tasklety i czasomierze. Tasklety przejmują złożone zadania od procedur obsługi przerwań sprzętowych. Wykonywanie długich procedur tego rodzaju prowadzi do zwiększania czasów oczekiwania na obsługę przerwań. Z tego względu należy tego unikać. Większy sens ma podział takich procedur na dwie części. Pierwsza przeprowadza kluczowe (pod względem czasowym) operacje, gdy przerwania są zablokowane. Pozostałe obliczenia mają miejsce w drugiej części, po powrocie z przerwania. Do realizacji tej części, zwanej dawniej dolną połową (ang. bottom half; zobacz R amka Większa przenośność ), nadają się właśnie tasklety. Jądro zapewnia, że w danym momencie wykonuje się maksymalnie jeden tasklet. Dotyczy to także systemów wieloprocesorowych. Można jednak korzystać z różnych taskletów jednocześnie. Ponieważ tasklety należą do grupy programowych IRQ, mają w systemie drugi co do wysokości priorytet, bezpośrednio po przerwaniach sprzętowych. Mimo to tasklety mają dwa poziomy priorytetu. Zawsze po kolei Tasklety z wysokim priorytetem wchodzą jako pierwsze programowe IRQ do kolejki, bezpośrednio za przerwaniami sprzętowymi. Jako ostatnie wstawiane są tasklety z niskim priorytetem. Zaleca się, aby programiści w miarę możliwości korzystali z wariantów o niskim priorytecie. Aby wskazać tasklet, w procedurze obsługi przerwania należy podać dwie informacje: adres funkcji, która ma wywołać jądro, oraz parametr, który jądro przekaże w momencie wywołania funkcji. Obydwie dane znajdują się w strukturze struct tasklet_struct. Makro DECLARE_TASKLET ułatwia podanie zawartości tej struktury danych. 60 NUMER 17 CZERWIEC
3 Technika jądrowa KNOW HOW Listing 2: Funkcje czasomierza Rysunek 2: Przerwania programowe i sprzętowe mają wysokie priorytety. Dopiero kiedy wszystkie przerwania zostaną przetworzone, przychodzi kolej na procesy obliczeniowe, do których zaliczają się także wątki jądra. Jądro rozpoznaje tasklet po funkcji tasklet_schedule (). Ta funkcja musi zostać wykonana we właściwym momencie, najczęściej w ramach procedury obsługi przerwania sprzętowego. Jasny i kompletny przykład znajduje się na Listingu 1, gdzie kod wywołuje funkcję schedule taskletu już w czasie inicjacji modułu w wierszu 18. Uwaga: sytuacja wyścigu Tasklety grożą uwikłaniem w sytuację wyścigu. Po usunięciu modułu z pamięci (rmmod), a następnie wywołaniu przez jądro zaplanowanego przez ten moduł taskletu procesor powinien przetwarzać kod, który już nie istnieje. To jednak niemożliwe. Jądro reaguje komunikatem o błędzie. Twórca sterownika musi zadbać o to, żeby jego moduł przed usunięciem skasował wszystkie tasklety, których nie przetwarzało jeszcze jądro. Służy do tego funkcja tasklet_kill (). Sterownik może ją bezpiecznie wykonywać, nawet jeśli tasklet jeszcze nie został zaplanowany do wykonania. Po skompilowaniu i załadowaniu [2] modułu z Listingu 1 w dzienniku syslog [4] powinien pojawić się komunikat Tasklet called... Do śledzenia zawartości dzienników systemowych świetnie nadaje się polecenie tail -f plik dziennika. A więc: otwieramy kolejne okno z interpreterem poleceń i wpisujemy tail -f /var/log/messages lub coś w tym stylu. Zadeklarowana w 13 wierszu struktura TlDescr wskazuje funkcję TaskletFunction () jako punkt wejścia taskletu. W wierszu 18 funkcja tasklet_schedule () zapewnia, że jądro będzie przetwarzać tasklet jako IRQ programowe z niskim priorytetem. Aby użyć programowego IRQ z wysokim priorytetem, stosujemy funkcję tasklet_hi_schedule (). 01 #include <linux/module.h> 02 #include <linux/version.h> 03 #include <linux/timer.h> 04 #include <linux/sched.h> 05 #include <linux/init.h> MODULE_LICENSE("GPL"); static struct timer_list MyTimer; static void IncCount (unsignedu long arg) 12 { 13 printk("inccount calledu (%ld)...\n", 14 MyTimer.expires); 15 MyTimer.expires = jiffies +U (2*HZ); // 2 sekundy 16 add_timer( &MyTimer ); 17 } static int init ktimerinitu (void) 20 { 21 init_timer( &MyTimer ); 22 MyTimer.function = IncCount; 23 MyTimer.data = 0; 24 MyTimer.expires = jiffies +U (2*HZ); // 2 sekundy 25 add_timer( &MyTimer ); 26 return 0; 27 } static void exit ktimerexitu (void) 30 { 31 if( del_timer_sync(&mytimer)) 32 printk("active timeru deactivated.\n"); 33 else 34 printk("no timeru active.\"); 35 } module_init( ktimerinit ); 38 module_exit( ktimerexit ); Licznik jiffy Równie ważne jak tasklety są czasomierze, druga odmiana programowych IRQ. Za ich pomocą programista żąda wykonania przez jądro funkcji w określonym momencie. Jądro mierzy te momenty czasowe nie bezwzględnie, lecz względnie od chwili włączenia komputera. Jako podstawa służy liczba cyklicznych przerwań zegarowych, które wystąpiły od chwili włączenia komputera: jądro mierzy je za pomocą zmiennej jiffies. Aby wywołać funkcję w określonym momencie, moduł musi zdefiniować strukturę NUMER 17 CZERWIEC
4
5 Technika jądrowa KNOW HOW Rysunek 3: Moduł czasomierza co dwie sekundy zapisuje wynik w dzienniku systemowym. Po wartości w nawiasach można rozpoznać, że w jądrze minęło już 2000 tyknięć zegara. danych typu struct timer_list i zainicjować ją funkcją init_timer (). Następnie należy określić adresy funkcji do przetwarzania (pole function), moment przetwarzania (expires) i dane wejściowe funkcji (data). Moment określa się bezwzględnie jako wartość jiffies. Gdy moduł ma wyzwolić funkcję w określonym momencie, musi rozwiązać proste zadanie arytmetyczne: zsumować aktualną chwilę i wartość względną. Gdy czasomierz jest zdefiniowany w postaci struktury danych i zainicjowany, funkcja add_timer () przekazuje wynik do jądra. Kiedy tylko nastąpi lub zostanie przekroczony moment wskazany w polu Expires, jądro wywołuje określoną funkcję, dokładnie raz. Jeśli ma wykonywać funkcję cyklicznie, musi zainicjować jej strukturę timer_list, wstawiając do niej następny moment wywołania, a potem znowu przekazać do jądra. Cykliczne wyniki Na Listingu 2 wiersz 24 zapewnia, że jądro wykona funkcję IncCount() dwie sekundy później. Wiersz 15 powtarza to, aby funkcja była wykonywana cyklicznie co dwie sekundy. Dowodem wykonania funkcji jest wynik w dzienniku systemowym. Uwaga: żądanie wielokrotnego przetworzenia jednego obiektu czasomierza przez jądro doprowadzi do załamania systemu. Doświadczony czytelnik z pewnością zauważy, że również w czasomierzach występuje fragment krytyczny. Moduł może być usunięty z pamięci tylko wtedy, gdy w systemie nie ma już realizowanej funkcji czasomierza. Rozwiązanie: funkcja del_timer_sync () usuwa funkcję jako przywiązaną do czasomierza. Wątki jądra W przeciwieństwie do taskletów i czasomierzy, wątki jądra mogą i muszą w czasie wykonywania stosować funkcje opóźniania. Wątek jądra odpowiada jednemu wątkowi poziomu użytkownika, z tą różnicą, że wykonuje się całkowicie w przestrzeni jądra. Jest on, jak każdy inny proces obli- Listing 3. Wątek jądra 01 #include <linux/module.h> 02 #include <linux/version.h> 03 #include <linux/init.h> 04 #include <linux/completion.h> MODULE_LICENSE("GPL"); static int ThreadID=0; 09 static wait_queue_head_t wq; 10 static DECLARE_COMPLETION( OnExit ); static int ThreadCode( void *data ) 13 { 14 unsigned long timeout; 15 int i; daemonize("mykthread"); 18 allow_signal( SIGTERM ); // funkcja od wersji printk("threadcode startet...\n"); 20 for( i=0; i<\<>10; i++ ) { 21 timeout=hz; // jedna sekunda 22 timeout=wait_event_interruptible_timeout( 23 wq, (timeout==0), timeout); 24 printk("threadcode: woke up...\n"); 25 if( timeout==-erestartsys ) { 26 printk("got signal, break\n"); 27 ThreadID = 0; 28 break; 29 } 30 } 31 complete_and_exit( &OnExit, 0 ); 32 } static int init kthreadinit(void) 35 { 36 init_waitqueue_head(&wq); 37 ThreadID=kernel_thread(ThreadCode, NULL,U CLONE_KERNEL ); 38 if( ThreadID==0 ) 39 return -EIO; 40 return 0; 41 } static void exit kthreadexit(void) 44 { 45 kill_proc( ThreadID, SIGTERM, 1 ); 46 wait_for_completion( &OnExit ); 47 } module_init( kthreadinit ); 50 module_exit( kthreadexit ); NUMER 17 CZERWIEC
6 KNOW HOW Technika jądrowa ThreadID = kernel_thread( ThreadCode, NULL, CLONE_KERNEL); Po utworzeniu nowy wątek musi przeprowadzić inicjację. Najpierw funkcją daemonize() zwalnia wszystkie zasoby w obszarze użytkownika, które mu standardowo przekazało jądro. Rysunek 4: Polecenie ps auxw pokazuje oprócz procesów użytkownika także wątki jądra. Te ostatnie są na liście zadań wyróżnione nawiasami kwadratowymi. czeniowy, reprezentowany przez strukturę zadania i pojawia się po wydaniu polecenia ps auxw także na liście zadań (zobacz Rysunek 4). Moment przetwarzania wątku jądra jest ustalany przez program szeregujący zadania. Wątki te tworzy się w prosty sposób. Wystarcza wywołanie funkcji kernel_thread(). Funkcja ma trzy parametry: adres funkcji, którą ma wywołać program szeregujący zadania przy pierwszej aktywacji; argument dla wywoływanej funkcji i pole bitowe określające sposób tworze- nia procesu obliczeniowego przez jądro. Z reguły w polu bitowym wystarcza wpis CLONE_KERNEL; wówczas tworzenie wątku jest bardzo wydajne. Jądro nie musi kopiować ani tworzyć informacji o systemie plików (CLONE_FS), deskryptorów plików (CLONE_FILES) oraz żadnych procedur obsługi sygnałów (CLONE_SI- GHAND). Wartością zwrotną funkcji jest identyfikator nowego procesu (PID). Jest on potrzebny później, do usunięcia wątku jądra. Wartość zwrotna 0 oznacza, że utworzenie wątku nie udało się. Przemiana w demona Funkcja daemonize oczekuje jako pierwszego parametru nazwy nowego wątku. Interpretuje ją podobnie jak printf () jako ciąg formatowany; odnośne parametry są zawarte na liście argumentów. Z ciągu formatowanego funkcja tworzy nazwę wątku jądra. Jej maksymalna długość to 16 znaków. Resztę funkcja daemonize () obcina. Wątek jądra musi się zakończyć na czas lub zostać uśpiony. W przeciwnym razie odbierze cały czas procesora innym procesom, zwłaszcza aplikacjom użytkownika. Jak pokazaliśmy w trzecim odcinku techniki jądrowej [2], pomaga tu kolejka oczekiwania. Na Listingu 3 w wierszu 22 wątek jądra jest usypiany za pomocą kolejki oczekiwania: wait_event_interruptible_timeout(). W praktyce istnieją lepsze kryteria dla usypiania i budzenia wątków jądra: na przykład oczekiwanie na dane nadchodzące przez połączenie TCP/IP. Listing 4. Kolejka robocza 01 #include <linux/version.h> 02 #include <linux/module.h> 03 #include <linux/init.h> 04 #include <linux/workqueue.h> MODULE_LICENSE("GPL"); static struct workqueue_struct *wq; static void WorkQueueFunction( void *data ) 11 { 12 printk("workqueuefunction<\\>n"); 13 } static DECLARE_WORK( work, WorkQueueFunction, NULL ); static int init ModInit(void) 18 { 19 wq = create_workqueue( "DrvrSmpl" ); 20 if( queue_work( wq, &work ) ) 21 printk("work has been queued...\n"); 22 else 23 printk("queue_work failed...\n"); 24 return 0; 25 } static void exit ModExit(void) 28 { 29 pr_debug("modexit called\n"); 30 if( wq ) { 31 destroy_workqueue( wq ); 32 printk("workqueue destroyed\n"); 33 } 34 } module_init( ModInit ); 37 module_exit( ModExit ); 64 NUMER 17 CZERWIEC
7 Technika jądrowa KNOW HOW W poszukiwaniu końca Problemem jest zakończenie wątku. Wszystkie procesy obliczeniowe, czy to w obszarze użytkownika, czy to wątki jądra, z reguły dochodzą do końca. Kiedy jeden proces chce zakończyć inny, przesyła mu sygnał. Jednak funkcja daemonize() zablokowała wszystkie sygnały. Wątek jądra musi dopiero znowu je dopuścić. W tym celu wywołuje funkcję allow_signal(). To, czy w stanie uśpienia nadszedł sygnał, wskazuje wartość zwrotna makra wait_event_interruptible_timeout (). Wiersz 25 służy do sprawdzania, czy odpowiada ona wartości -ERESTARTSYS, oznaczającej zakończyć wątek. Także funkcja signal_pending () stwierdza, czy sygnał nadszedł, czy też nie. Zmienna globalna current wskazuje na aktywny wątek. if( signal_pending(current) ) { // nadszedł sygnał } else { // brak sygnału } Wątek jądra kończy się przez opuszczenie instrukcją return wcześniej uruchomionej funkcji wątku. Sygnał można wysłać na przykład w interpreterze poleceń poleceniem kill lub wewnątrz jądra funkcją kill_proc (). W obydwu wypadkach wątek jest wybierany identyfikatorem PID. Obiekt Completion I znowu pojawia się ryzyko, że powstanie niechroniony, krytyczny fragment kodu. Tak jak w pozostałych metodach programista musi zapewnić, że wątek jądra zakończy się przed usunięciem modułu. Wymaganie zakończenia jest realizowane w prosty sposób funkcją kill_proc(). Ponieważ proces kończy się sam, moduł musi poczekać teraz na faktyczne zakończenie. Ochrona tego krytycznego fragmentu dodatkowo komplikuje się w systemach wieloprocesorowych, gdzie kod usuwania modułu z pamięci może być wykonywany na innym procesorze niż wątek jądra. Z tego powodu społeczność programistów pod wodzą Torvalda opracowała obiekt Completion. Moduł jądra musi go globalnie zdefiniować makrem DECLARE_COM- PLETION (wiersz 10 na Listingu 3). Po zakończeniu wątku wywołuje on funkcję complete_and_exit () (wiersz 31). Jej parametrami są adresy obiektu Completion i kod zakończenia wątku. Moduł funkcji usuwania wybiera funkcja wait_for_completion() (wiersz 46), która jako parametr otrzymuje adres obiektu Completion. Zwraca ona sterowania dopiero wtedy, gdy zostanie wywołana pasująca funkcja complete_and_exit(). Nawet jeśli moduł uruchomi wiele wątków jądra, wystarcza tylko jeden obiekt Completion. Każde wywołanie wait_for_completion () w module musi mieć pokrycie w wywołaniu funkcji complete_and_exit () w wątku. Gdy moduł oczekuje na dwa wątki jądra, wówczas w funkcji usuwania dwukrotnie wywołuje funkcję wait_for_completion (). W obydwu wątkach jeden raz musi zostać wywołana funkcja complete_and_exit (). Kolejka robocza zamiast snu Usypianie wątku łączy się z pewnym kosztem. Zamiast wywoływać funkcję z niskim priorytetem w kontekście procesu, często lepiej wykorzystać kolejkę roboczą. Tego rodzaju wątek jądra przyjmuje adresy funkcji, aby je potem przetwarzać. Są do tego wymagane dwa obiekty: struct work_queue_struct odnosi się do kolejki roboczej; struct work_struct opisuje funkcję do przetwarzania. Pamięć obiektu kolejki roboczej jest tworzona przez funkcję jądra create_workqueue () (Listing 4, wiersz 19). Jej jedynym parametrem jest nazwa kolejki roboczej, względnie wątku jądra. Uwaga: nazwa może mieć długość maksymalnie dziesięciu znaków. Pamięć obiektu roboczego udostępnia sam moduł. Do definiowania i inicjacji stosuje się w nim makro DECLARE_WORK (wiersz 15). Jego trzema parametrami są nazwa obiektu roboczego, adres wywoływanej funkcji oraz wartość parametru zwracana przez kolejkę roboczą do funkcji. Funkcja queue_work() (wiersz 20) przenosi obiekt roboczy do kolejki roboczej. Jej parametry określają adres kolejki roboczej oraz adres obiektu roboczego. Przy następnej okazji kolejka robocza wywołuje określoną w obiekcie roboczym funkcję. Do jednej kolejki roboczej można wstawić dowolnie wiele funkcji (obiektów roboczych). Każdy obiekt jest wywoływany dokładnie raz, a następnie usuwany. Obiekt roboczy nie może sam wstawić się do kolejki roboczej, gdyż wówczas zostałby bezpośrednio ponownie wywołany. Wniosek: Listing 5: Kolejka robocza zdarzeń 01 #include <linux/version.h> 02 #include <linux/module.h> 03 #include <linux/init.h> 04 #include <linux/workqueue.h> MODULE_LICENSE("GPL"); static struct work_struct work; static void WorkQueueFunction( void *data ) 11 { 12 printk("workqueuefunction\n"); 13 } static DECLARE_WORK( work, WorkQueueFunction, NULL ); static int init ModInit(void) 18 { 19 if( schedule_work( &work )==0 ) 20 printk("schedule_work not successful...\n"); 21 else 22 printk("schedule_work successful...\n"); 23 return 0; 24 } static void exit ModExit(void) 27 { 28 flush_scheduled_work(); 29 } module_init( ModInit ); 32 module_exit( ModExit ); NUMER 17 CZERWIEC
8 KNOW HOW Technika jądrowa system jeszcze przetwarza tę jedną funkcję. Podana w obiekcie roboczym funkcja powinna także nie przechodzić w stan uśpienia: cały wątek kolejki roboczej zostałby uśpiony, a zatem opóźnione zostałyby wszystkie pozostałe funkcje, które się w niej znajdują. Opóźnianie pracy Jeśli funkcja musi być wykonana nie od razu, lecz z pewnym opóźnieniem, wówczas świetnym rozwiązaniem są kolejki robocze. Do ich obsługi używamy funkcji queue_delayed_work() zamiast queue_work(). Jako dodatkowy parametr przyjmuje ona limit czasowy (liczony w jiffy). Także kolejki robocze należy likwidować przed usunięciem sterownika z pamięci: destroy_workqueue(). Ta funkcja oczekuje na przetworzenie wszystkich obiektów roboczych w kolejce. Programista musi się zatroszczyć o to, aby żaden egzemplarz jego sterownika nie wstawił ponownie obiektu roboczego do kolejki, co potencjalnie mogłoby sprawić nieprzewidziane problemy. Po skompilowaniu kodu z Listingu 4 i załadowaniu wygenerowanego modułu można odkryć wątek jądra kolejki roboczej w tabeli procesów. Kolejka nosi nazwę DrvrSmpl (wiesz 1, Rysunek 4) i wyświetla się jako [DrvrSmpl/0]. Jeszcze jedna wskazówka: kolejki robocze można wykorzystywać w rozszerzeniach jądra wyłącznie pod warunkiem, że podlegają one licencji GPL lub BSD. Dla rozszerzeń prawnie ograniczonych pod względem modyfikacji i dystrybucji te możliwości są niedostępne. Zakres zdarzeń Na zakończenie należy wspomnieć jeszcze o kolejce roboczej zdarzeń (zobacz Listing 5). Jądro domyślnie dla każdego procesora tworzy taką kolejkę. Występuje ona zamiast znanego z wcześniejszych wersji demona keventd. Jej zaleta: odpada uciążliwe ustawianie kolejki roboczej. Dzięki kolejce roboczej zdarzeń programista za pomocą funkcji schedule_work () (wiersz 19) może bez ograniczeń przekazywać funkcje do przetwarzania w jądrze. Funkcja schedule_work () jako jedyny parametr przyjmuje adres obiektu roboczego. Funkcja schedule_delayed_work () uruchamia funkcję z opóźnieniem w czasie. Do prac porządkowych służy zaś funkcja flush_scheduled_work () (wiersz 28). Popycha ona naprzód przetwarzanie kolejki roboczej zdarzeń i czeka na zakończenie jej pracy. W następnym odcinku Wszystkie odcinki Techniki jądrowej wskazują na pewne szczególne wymaganie: unikanie sytuacji wyścigów i ochrona krytycznych fragmentów kodu. W następnym odcinku rzucimy okiem na służące do tego celu metody w jądrze 2.6. (fjl) INFO [1] Eva-Katharina Kunst i Jürgen Quade: Technika jądrowa, odcinek 1, Linux Magazine nr 12 ze stycznia 2005 [2] Eva-Katharina Kunst i Jürgen Quade Technika jądrowa, odcinek 2, Linux Magazine nr 13 z lutego 2005 [3] Eva-Katharina Kunst i Jürgen Quade Technika jądrowa, odcinek 3, Linux Magazine nr 16 z maja 2005 AUTORZY Eva-Katharina Kunst, dziennikarka i Jürgen Quade, profesor w Hochschule Niederrhein, należą od czasu powstania Linuksa do fanów oprogramowania Open Source. Pomoc przy przenoszeniu Ważne różnice między jądrami 2.4 i 2.6 Bottom Half: nie istnieją już tak zwane dolne połówki. Zamiast nich w użycie wchodzą tasklety. Programista może wybrać wersję z wysokim lub niskim priorytetem. Może być pewien, że tasklet w danym momencie jest aktywny tylko jeden raz, bez względu na to, jaką ustawił częstość wykonywania. Tasklety są wykonywane jak dolne połówki w kontekście przerwania. Kolejka zadań: czasy kolejek zadań minęły. Programiści najczęściej używali trzech ich wariantów: tq_immediate, tq_timer i tq_scheduler. Kolejka zadań tq_immediate może być zastąpiona przez tasklet. Zamiast tq_timer używa się obiektu czasomierza; jako moment na platformie x86 można teraz podawać dziesiętne wartości jiffy. Zamiast tq_scheduler można użyć kolejki roboczej zdarzeń. Keventd: demon zdarzeń jądra keventd już nie istnieje. Zamiast niego używa się kolejki roboczej zdarzeń. Jiffy: zmienna globalna jiffies była w poprzednich wersjach jądra wartością 32-bitową. Wniosek: na platformie x86 w normalnych okolicznościach po 407 dniach następowało przepełnienie licznika. Teoretycznie mogło wówczas dojść do niespójnego stanu systemu dla programistów systemów wbudowanych nie była to szczególnie kusząca perspektywa. Jądro 2.6 zawiera trzy zmiany. Po pierwsze zmienna jiffies_64 to rozszerzony, 64-bitowy licznik. Po drugie, podwyższono częstotliwość taktów zegara, która zwiększa wartość licznika, ze 100 Hz do 1000 Hz. Po trzecie, licznik jest tak wstępnie inicjowany, że po pięciu minutach się przepełnia. W ten sposób programiści szybciej dostrzegają konsekwencję i mogą w takim wypadku usunąć błędy z kodu. Daemonize: funkcja daemonize () była w jądrze 2.4 bezparametryczna. Wątek jądra, z którego ta funkcja była wywoływana, sam ustawiał nazwę wątku. W jądrze 2.6 funkcja daemonize otrzymuje nazwę jako parametr i przejmuje zadanie ustawiania nazwy wątku. Rysunek 5: Techniki przetwarzania synchronicznego w starym i nowym jądrze są odmienne. Każda możliwość ma jednak zastępnik. 66 NUMER 17 CZERWIEC
Laboratorium 6: Tasklety i kolejki prac (jedne zajęcia) dr inż. Arkadiusz Chrobot
Laboratorium 6: Tasklety i kolejki prac (jedne zajęcia) dr inż. Arkadiusz Chrobot 10 kwietnia 2017 Spis treści Wprowadzenie 1 1. Tasklety 1 1.1. Opis API............................................. 1
Laboratorium 7: Liczniki czasu (jedne zajęcia) dr inż. Arkadiusz Chrobot
Laboratorium 7: Liczniki czasu (jedne zajęcia) dr inż. Arkadiusz Chrobot 22 kwietnia 2017 Spis treści Wprowadzenie 1 1. Liczniki czasu niskiej rozdzielczości 1 1.1. Opis API.............................................
Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1
Wątki 1. Wątki - wprowadzenie Wątkiem nazywamy sekwencyjny przepływ sterowania w procesie, który wykonuje dany program np. odczytywanie i zapisywanie plików Program Javy jest wykonywany w obrębie jednego
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
TECHNIKA JĄDROWA. Sterowniki sprzętowe stanowią sporą. Nowe jądro 2.6 programowanie jądra i sterowników odcinek 6
Nowe jądro 2.6 programowanie jądra i sterowników odcinek 6 TECHNIKA JĄDROWA Do nowości w jądrze 2.6 należy model urządzeń i system plików sys. Pokażemy, jak wykorzystać je we własnych modułach jądra. EVA-KATHARINA
Wątki jądra. Maciej Szwaja
Wątki jądra Maciej Szwaja Czym są wątki jądra? Lekkie procesy, działające asynchronicznie w przestrzeni jądra (podobnie jak zwykłe wątki w przestrzeni użytkownika), niezwiązane z żadnym procesem użytkownika
pod adres portu przekazany jako drugi parametr.
Technika jądrowa KNOW HOW Jądro 2.6 programowanie jądra i sterowników TECHNIKA JĄDROWA W ostatnim odcinku Techniki jądrowej omawialiśmy znakowe sterowniki urządzeń wirtualnych. W dzisiejszym odcinku pokazujemy,
Embedded Systems Programming
Embedded Systems Programming Device drivers - interrupts and timers Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG April 7, 2019 Przerwania Przerwanie - sygnał powodujacy zmianę przepływu
Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego
Wątki Wątek - definicja Ciąg instrukcji (podprogram) który może być wykonywane współbieżnie (równolegle) z innymi programami, Wątki działają w ramach tego samego procesu Współdzielą dane (mogą operować
Mechanizmy pracy równoległej. Jarosław Kuchta
Mechanizmy pracy równoległej Jarosław Kuchta Zagadnienia Algorytmy wzajemnego wykluczania algorytm Dekkera Mechanizmy niskopoziomowe przerwania mechanizmy ochrony pamięci instrukcje specjalne Mechanizmy
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w obrębie skryptu. Wyrażenia include() i require() są niemal
Prezentacja systemu RTLinux
Prezentacja systemu RTLinux Podstawowe założenia RTLinux jest system o twardych ograniczeniach czasowych (hard real-time). Inspiracją dla twórców RTLinux a była architektura systemu MERT. W zamierzeniach
1. Tworzenie nowego projektu.
Załącznik do Instrukcji 1. Tworzenie nowego projektu. Wybieramy opcję z menu głównego New->QNX C Project. Wprowadzamy nazwę przechodzimy do następnego kroku NEXT. Wybieramy platformę docelową oraz warianty
Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)
Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi) Ćwiczenie drugie (jedne zajęcia) Temat: Procesy i sygnały w Linuksie. Opracowanie: mgr in ż. Arkadiusz Chrobot Wprowadzenie 1. Budowa procesu
SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)
(opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX) W informatyce występują ściśle obok siebie dwa pojęcia: sprzęt (ang. hardware) i oprogramowanie
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Metody obsługi zdarzeń
SWB - Przerwania, polling, timery - wykład 10 asz 1 Metody obsługi zdarzeń Przerwanie (ang. Interrupt) - zmiana sterowania, niezależnie od aktualnie wykonywanego programu, spowodowana pojawieniem się sygnału
C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów
Adresowanie obiektów Bit - stan pojedynczego sygnału - wejście lub wyjście dyskretne, bit pamięci Bajt - 8 bitów - wartość od -128 do +127 Słowo - 16 bitów - wartość od -32768 do 32767 -wejście lub wyjście
Zmienne, stałe i operatory
Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe
Tablice (jedno i wielowymiarowe), łańcuchy znaków
Tablice (jedno i wielowymiarowe), łańcuchy znaków wer. 8 z drobnymi modyfikacjami! Wojciech Myszka Katedra Mechaniki i Inżynierii Materiałowej 2017-04-07 09:35:32 +0200 Zmienne Przypomnienie/podsumowanie
Automatyzowanie zadan przy uz yciu makr języka Visual Basic
Automatyzowanie zadan przy uz yciu makr języka Visual Basic Jeśli użytkownik nie korzystał nigdy z makr, nie powinien się zniechęcać. Makro jest po prostu zarejestrowanym zestawem naciśnięć klawiszy i
Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?
Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać
MatLab część III 1 Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać komentarze poprzedzone znakiem % Skrypty
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Budowa systemów komputerowych
Budowa systemów komputerowych Krzysztof Patan Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski k.patan@issi.uz.zgora.pl Współczesny system komputerowy System komputerowy składa
Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak
Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego
Użycie Visual Basic for Applications ("VBA")
Użycie Visual Basic for Applications ("VBA") Przegląd SEE z modułem VBA Developer SEE używa języka programowania Visual Basic for Applications (VBA) pozwalającego tworzyć krótkie programy zwane "makrami".
Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)
Uwagi dotyczące notacji kodu! Wyrazy drukiem prostym -- słowami języka VBA. Wyrazy drukiem pochyłym -- inne fragmenty kodu. Wyrazy w [nawiasach kwadratowych] opcjonalne fragmenty kodu (mogą być, ale nie
Wykład 5: Klasy cz. 3
Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu
Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.
Procesy Proces (zwany też zadaniem) jest jednostką aktywną, kontrolowaną przez system operacyjny i związaną z wykonywanym programem. Proces ma przydzielone zasoby typu pamięć (segment kodu, segment danych,
Temat zajęć: Tworzenie i obsługa wątków.
Temat zajęć: Tworzenie i obsługa wątków. Czas realizacji zajęć: 180 min. Zakres materiału, jaki zostanie zrealizowany podczas zajęć: Tworzenie wątków, przekazywanie parametrów do funkcji wątków i pobieranie
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą
4. Procesy pojęcia podstawowe
4. Procesy pojęcia podstawowe 4.1 Czym jest proces? Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
Argumenty wywołania programu, operacje na plikach
Temat zajęć: Argumenty wywołania programu, operacje na plikach Autor: mgr inż. Sławomir Samolej Zagadnienie 1. (Zmienne statyczne) W języku C można decydować o sposobie przechowywania zmiennych. Decydują
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Co to jest NODE.JS? Nowoczesne środowisko programistyczne
Node.js Co to jest NODE.JS? Nowoczesne środowisko programistyczne Środowisko programistyczne w sensie zestawu gotowych klas i metod których można używać do przygotowania własnych skalowalnych i wydajnych
Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie
Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których
5. Model komunikujących się procesów, komunikaty
Jędrzej Ułasiewicz str. 1 5. Model komunikujących się procesów, komunikaty Obecnie stosuje się następujące modele przetwarzania: Model procesów i komunikatów Model procesów komunikujących się poprzez pamięć
Wykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB
Wykład 3 Procesy i wątki Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB Pojęcie procesu Program = plik wykonywalny na dysku Proces = uruchomiony i wykonywany program w pamięci
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane
Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody
Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,
Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1
Współbieżność i równoległość w środowiskach obiektowych Krzysztof Banaś Obliczenia równoległe 1 Java Model współbieżności Javy opiera się na realizacji szeregu omawianych dotychczas elementów: zarządzanie
Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1 Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie
Inżynieria oprogramowania
Inżynieria oprogramowania Wykład 8 Inżynieria wymagań: analiza przypadków użycia a diagram czynności Patrz: Stanisław Wrycza, Bartosz Marcinkowski, Krzysztof Wyrzykowski, Język UML 2.0 w modelowaniu systemów
Programowanie w języku Python. Grażyna Koba
Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i
Struktura i funkcjonowanie komputera pamięć komputerowa, hierarchia pamięci pamięć podręczna. System operacyjny. Zarządzanie procesami
Rok akademicki 2015/2016, Wykład nr 6 2/21 Plan wykładu nr 6 Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia niestacjonarne I stopnia Rok akademicki 2015/2016
Listy powiązane zorientowane obiektowo
Listy powiązane zorientowane obiektowo Aby zilustrować potęgę polimorfizmu, przeanalizujmy zorientowaną obiektowo listę powiązaną. Jak zapewne wiesz, lista powiązana jest strukturą danych, zaprojektowaną
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby
Część XI C++ W folderze nazwisko36 program za każdym razem sprawdza oba warunki co niepotrzebnie obciąża procesor. Ten problem można rozwiązać stosując instrukcje if...else Instrukcja if wykonuje polecenie
1.1 Definicja procesu
1 Procesy pojęcia podstawowe 1 1.1 Definicja procesu Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
Podstawy Programowania 2
Podstawy Programowania 2 Laboratorium 7 Instrukcja 6 Object Pascal Opracował: mgr inż. Leszek Ciopiński Wstęp: Programowanie obiektowe a programowanie strukturalne. W programowaniu strukturalnym, któremu
Diagnostyka pamięci RAM
Diagnostyka pamięci RAM 1 (Pobrane z slow7.pl) Uszkodzenie pamięci RAM jest jednym z najczęściej występujących problemów związanych z niestabilnym działaniem komputera. Efektem uszkodzenia kości RAM są
Ćwiczenie 1. Kolejki IBM Message Queue (MQ)
Ćwiczenie 1. Kolejki IBM Message Queue (MQ) 1. Przygotowanie Przed rozpoczęciem pracy, należy uruchomić "Kreator przygotowania WebSphere MQ" oraz przejść przez wszystkie kroki kreatora, na końcu zaznaczając
Python wstęp. Michał Bereta www.michalbereta.pl
Python wstęp Michał Bereta www.michalbereta.pl Wprowadzenie... 1 Źródła wiedzy... 1 Uruchomienie interpretera Pythona... 2 Python jako kalkulator użycie interaktyne... 2 Uruchamianie skryptów z plików...
System operacyjny Linux
Paweł Rajba pawel.rajba@continet.pl http://kursy24.eu/ Zawartość modułu 6 Język bash Pierwszy skrypt Rozwinięcia parametryczne Bloki instrukcji Dwa przydatne polecenia Tablice Sprawdzanie warunków Instrukcje
4. Procesy pojęcia podstawowe
4. Procesy pojęcia podstawowe 4.1 Czym jest proces? Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
Systemy operacyjne. System operacyjny Linux - wstęp. Anna Wojak
Systemy operacyjne System operacyjny Linux - wstęp Anna Wojak 1 1 Wstęp Linux jest systemem z rodziny Unix. Pierwsza wersja systemu została opracowana w 1969 roku przez K.Thompsona i D.Ritchie Jest to
Rozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Podstawy programowania C. dr. Krystyna Łapin http://www.mif.vu.lt/~moroz/c/
Podstawy programowania C dr. Krystyna Łapin http://www.mif.vu.lt/~moroz/c/ Tematy Struktura programu w C Typy danych Operacje Instrukcja grupująca Instrukcja przypisania Instrukcja warunkowa Struktura
Jak posługiwać się edytorem treści
Jak posługiwać się edytorem treści Edytor CKE jest bardzo prostym narzędziem pomagającym osobom niezaznajomionym z językiem HTML w tworzeniu interaktywnych treści stron internetowych. Razem z praktyka
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE
WSKAŹNIKI KLASOWE Wskaźniki klasowe Każdy obiekt zajmuje fragment pamięci i wszystkie obiekty tego samego typu zajmują fragmenty pamięci tej samej długości początek miejsca w pamięci zajmowanego przez
W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :
Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : class nazwa_klasy prywatne dane i funkcje public: publiczne dane i funkcje lista_obiektów;
Instrukcja konfiguracji programu Fakt z modułem lanfakt
Instrukcja konfiguracji programu Fakt z modułem lanfakt (wersja 2016.04) Fakt Dystrybucja Sp. z o. o. 81-552 Gdynia, ul. Wielkopolska 21/2 www.fakt.com.pl serwis@fakt.com.pl Spis treści 1.Moduł lanfakt...
Przerwania, polling, timery - wykład 9
SWB - Przerwania, polling, timery - wykład 9 asz 1 Przerwania, polling, timery - wykład 9 Adam Szmigielski aszmigie@pjwstk.edu.pl SWB - Przerwania, polling, timery - wykład 9 asz 2 Metody obsługi zdarzeń
Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.
Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float
Programowanie obiektowe
Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć
Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1
Programowanie równoległe i rozproszone Monitory i zmienne warunku Krzysztof Banaś Programowanie równoległe i rozproszone 1 Problemy współbieżności Problem producentów i konsumentów: jedna grupa procesów
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
Wykład 6 Planista procesora funkcja schedule. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB
Wykład 6 Planista procesora funkcja schedule Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB Typowe punkty wywołania planisty Procedura sleep_on (usypanie procesu). Powrót z wywołania
Algorytm. a programowanie -
Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik
ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje
Funkcje (podprogramy) Mianem funkcji określa się fragment kodu, który może być wykonywany wielokrotnie z różnych miejsc programu. Ogólny zapis: typ nazwa(argumenty) ciało funkcji typ określa typ danych
SOE Systemy Operacyjne Wykład 8 Pamięć wirtualna dr inż. Andrzej Wielgus
SOE Systemy Operacyjne Wykład 8 Pamięć wirtualna dr inż. Andrzej Wielgus Instytut Mikroelektroniki i Optoelektroniki WEiTI PW Pamięć wirtualna Stronicowanie na żądanie większość współczesnych systemów
RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )
III RPC Zdalne wywoływanie procedur (ang. Remote Procedure Calls ) 1. Koncepcja Aplikacja wywołanie procedury parametry wyniki wykonanie procedury wynik komputer klienta komputer serwera Zaletą takiego
Układy VLSI Bramki 1.0
Spis treści: 1. Wstęp... 2 2. Opis edytora schematów... 2 2.1 Dodawanie bramek do schematu:... 3 2.2 Łączenie bramek... 3 2.3 Usuwanie bramek... 3 2.4 Usuwanie pojedynczych połączeń... 4 2.5 Dodawanie
Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR
Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR Zadanie polega na napisaniu pierwszego programu w języku C, jego poprawnej kompilacji i wgraniu na mikrokontroler. W tym celu należy zapoznać
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
ArtPlayer oprogramowanie do odtwarzania plików video sterowane Artnet/DMX V1.0.1
Instrukcja obsługi ArtPlayer oprogramowanie do odtwarzania plików video sterowane Artnet/DMX V1.0.1 1 ArtPlayer to proste oprogramowanie umożliwiające odtwarzanie plików video i ich wybór poprzez protokół
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Multimedia JAVA. Historia
Multimedia JAVA mgr inż. Piotr Odya piotrod@sound.eti.pg.gda.pl Historia 1990 rozpoczęcie prac nad nowym systemem operacyjnym w firmie SUN, do jego tworzenia postanowiono wykorzystać nowy język programowania
1. Timery i zdarzenia
Sygnały 1 1. Timery i zdarzenia 1.1 Funkcje i programowanie timerów Jedną z najczęściej spotykanych funkcji systemu jest generowanie zdarzeń które w ustalonym czasie uruchomić mają określone akcje systemu.
Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.
Kod szkolenia: Tytuł szkolenia: PS/LINUX Programowanie systemowe w Linux Dni: 5 Opis: Adresaci szkolenia Szkolenie adresowane jest do programistów tworzących aplikacje w systemie Linux, którzy chcą poznać
1 Moduł Modbus ASCII/RTU 3
Spis treści 1 Moduł Modbus ASCII/RTU 3 1.1 Konfigurowanie Modułu Modbus ASCII/RTU............. 3 1.1.1 Lista elementów Modułu Modbus ASCII/RTU......... 3 1.1.2 Konfiguracja Modułu Modbus ASCII/RTU...........
Każde wykonanie bloku instrukcji nazywamy pojedynczym przebiegiem lub iteracją pętli.
Część XIII C++ Czym jest pętla? Pętla jest blokiem instrukcji, które wykonywane są w kółko (czyli po wykonaniu ostatniej instrukcji z bloku komputer wykonuje ponownie pierwszą instrukcję, później drugą
Przed rozpoczęciem pracy otwórz nowy plik (Ctrl +N) wykorzystując szablon acadiso.dwt
Przed rozpoczęciem pracy otwórz nowy plik (Ctrl +N) wykorzystując szablon acadiso.dwt Zadanie: Utwórz szablon rysunkowy składający się z: - warstw - tabelki rysunkowej w postaci bloku (według wzoru poniżej)
Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada
Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada Spis treści 1 Wprowadzenie 1 2 Dane i kod 2 3 Wyrażenia 2 3.1 Operacje arytmetyczne i logiczne.................. 2 3.2 Podstawowe
Działanie systemu operacyjnego
Budowa systemu komputerowego Działanie systemu operacyjnego Jednostka centralna dysku Szyna systemowa (magistrala danych) drukarki pamięci operacyjnej I NIC sieci Pamięć operacyjna Przerwania Przerwania
Pośredniczy we współpracy pomiędzy procesorem a urządzeniem we/wy. W szczególności do jego zadań należy:
Współpraca mikroprocesora z urządzeniami zewnętrznymi Urządzenia wejścia-wyjścia, urządzenia których zadaniem jest komunikacja komputera z otoczeniem (zwykle bezpośrednio z użytkownikiem). Do najczęściej
Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.
Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice
SYSTEMY OPERACYJNE I laboratorium 3 (Informatyka stacjonarne 2 rok, semestr zimowy)
Procesy i shell. Polecenia ps, sleep, exit, jobs, bg, fg, top, kill, bash, tcsh, which, type, whereis, touch. Metaznak & i >>. Dowiązania miękkie i twarde. Proces jest programem, który jest wykonywany
Wyjątki (exceptions)
Instrukcja laboratoryjna nr 6 Programowanie w języku C 2 (C++ poziom zaawansowany) Wyjątki (exceptions) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp Wyjątki (ang.
OBIEKTY TECHNICZNE OBIEKTY TECHNICZNE
OBIEKTY TECHNICZNE Klawisze skrótów: F7 wywołanie zapytania (% - zastępuje wiele znaków _ - zastępuje jeden znak F8 wyszukanie według podanych kryteriów (system rozróżnia małe i wielkie litery) F9 wywołanie
Funkcja (podprogram) void
Funkcje Co to jest funkcja? Budowa funkcji Deklaracja, definicja i wywołanie funkcji Przykłady funkcji definiowanych przez programistę Przekazywanie argumentów do funkcji Tablica jako argument funkcji