Podstawy programowania komputerów

Podobne dokumenty
IV. Programowanie współbieżne

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wstęp do programowania

Przekazywanie argumentów wskaźniki

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Wstęp do programowania 2

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Programowanie współbieżne Wykład 2. Iwona Kochańska

Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Podstawy programowania skrót z wykładów:

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

4. Procesy pojęcia podstawowe

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Co nie powinno być umieszczane w plikach nagłówkowych:

Programowanie współbieżne i rozproszone

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Wstęp do programowania

Język C++ zajęcia nr 2

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Zmienne, stałe i operatory

enum nazewnik {lista elementów} lista zmiennych; typedef enum nazewnik (lista elementów) nazwa typu;

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Język C zajęcia nr 11. Funkcje

Inżynieria Wytwarzania Systemów Wbudowanych

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Kompilator języka C na procesor 8051 RC51 implementacja

Język C - podstawowe informacje

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Programowanie w elektronice: Podstawy C

Programowanie strukturalne i obiektowe

4. Procesy pojęcia podstawowe

Wykład 8: klasy cz. 4

Język ludzki kod maszynowy

Podstawy programowania w języku C++

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Podstawy programowania w języku C++

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

IX. Wskaźniki.(3 godz.)

1 Podstawy c++ w pigułce.

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Tablice, funkcje - wprowadzenie

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

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ć

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Funkcja (podprogram) void

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Lab 9 Podstawy Programowania

Język C, tablice i funkcje (laboratorium, EE1-DI)

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Java EE produkcja oprogramowania

Wskaźniki w C. Anna Gogolińska

Podstawy programowania w języku C++

PMiK Programowanie Mikrokontrolera 8051

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

dr inż. Konrad Sobolewski Politechnika Warszawska Informatyka 1

Wykład 4: Klasy i Metody

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?

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Wykład 1

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie strukturalne język C - wprowadzenie

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

Programowanie w języku C++ Podstawowe paradygmaty programowania

Wstęp do programowania. Wykład 1

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Tworzenie aplikacji rozproszonej w Sun RPC

4. Procesy pojęcia podstawowe

Podstawy programowania C. dr. Krystyna Łapin

Programowanie obiektowo zorientowane. Mirosław Głowacki Wykład w języku C++

PARADYGMATY PROGRAMOWANIA Wykład 4

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład: 6. Tablice statyczne. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Równoległość i współbieżność

Równoległość i współbieżność

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Stałe i zmienne znakowe. Stała znakowa: znak

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

ZASADY PROGRAMOWANIA KOMPUTERÓW

zastępować zarezerwowane słowa lub symbole innymi,

Transkrypt:

Podstawy programowania komputerów Wykład 14: Programowanie współbieżne w C

Definicja programowania współbieżnego Programowanie współbieżne jest tworzeniem programów, których wykonanie powoduje uruchomienie pewnej liczby procesów współbieżnych (zazwyczaj procesy te są zależne). Dwa procesy nazywamy współbieżnymi, jeżeli każdy z nich rozpoczął się przed zakończeniem drugiego procesu. W różnych kontekstach używane są następujące określenia: współbieżny (concurrent), równoległy (parallel), rozproszony (distributed). Pierwsze dwa używane są zamiennie, przy czym częściej określenie równoległy oznacza wykonywany współbieżnie na tym samym komputerze. Określenie rozproszony oznacza wykonywany współbieżnie na oddzielnych komputerach połączonych w sieć.

Dlaczego współbieżność? Klasyczne programy współbieżne są wykonywane na maszynach wieloprocesorowych. Celem zastosowania równoległych komputerów i równoległych programów jest zmniejszenie czasu rozwiązywania zadania. Na komputerze jednoprocesorowym nie można liczyć na zwiększenie prędkości obliczeń pseudo-współbieżnych, bo oprócz kodu zadań procesor musi wykonywać pewien kod związany z ich przełączaniem. W rzeczywistości częste są sytuacje, gdy większość czasu pracy zadania nie jest zużywana na pracę procesora. Np. podczas wolnych operacji na pamięci zewnętrznej procesor mógłby równocześnie wykonywać inną pracę lub można wyeliminować częściowo czekanie przez zadanie na dane wprowadzane przez użytkownika z klawiatury.

Pseudo-współbieżne wykonywanie funkcji w C Język C nie zawiera mechanizmów umożliwiających programowanie współbieżne (porównaj z Ada). Pseudo-współbieżne wykonywanie funkcji realizowane jest nie na poziomie systemu operacyjnego lecz na poziomie programu w C z wykorzystaniem jedynie elementów języka standardowego. Kiedy zadania (funkcje, programy) wykonywane są w sposób współbieżny na jednym procesorze, to w rzeczywistości na zmianę wykonywane są pewne małe fragmenty tych zadań - minimum jedna instrukcja (ang. statement) języka C. Kod pseudo-współbieżny C jest przenośny zarówno na różne kompilatory jak i różne platformy sprzętowe.

Bufor typu jmp_buf W pliku nagłówkowym setjmp.h znajduje się deklaracja typu jmp_buf który definiuje strukturę do przechowywania informacji o stanie programu: typedef struct { unsigned j_sp, j_ss, unsigned j_flag, j_cs; unsigned j_ip, j_bp; unsigned j_di, j_es; unsigned j_si, j_ds; } jmp_buf[1];

Funkcje setjmp i longjmp W pliku nagłówkowym setjmp.h znajdują się również deklaracje funkcji które służą do zapamiętania, a następnie odtworzenia stanu programu. : int setjmp(jmp_buf); void longjmp(jmp_buf,int); Funkcja longjmp umożliwia wykonanie skoku do jakiegoś miejsca, w którym stan programu został wcześniej zapamiętany przy pomocy funkcji setjmp. Jak wskazuje sama nazwa funkcji, jest to skok daleki, nie ograniczony do wnętrza funkcji (jak skok goto).

Funkcje setjmp i longjmp, cd. Wywołanie funkcji setjmp powoduje zapamiętanie w zmiennej typu jmp_buf, przekazanej do niej jako argument, informacji o stanie programu. Funkcja zwraca wartość 0. Funkcję longjmp wywołuje się z dwoma argumentami: pierwszym jest zmienna, w której wcześniej zapamiętano stan programu przy pomocy funkcji setjmp, drugi argument jest liczbą całkowitą. Wywołanie funkcji longjmp powoduje odtworzenie stanu programu jaki został zapamiętany w zmiennej typu jmp_buf, program znajdzie się w punkcie powrotu z funkcji setjmp, przy czym wartość zwracana przez funkcję setjmp jest równa drugiemu argumentowi funkcji longjmp (lub 1 jeżeli drugi argument był równy 0). Na podstawie wartości funkcji setjmp, program jest w stanie odróżnić czy została ona normalnie wywołana przy zinterpretowaniu kolejnej instrukcji, czy też nastąpił skok przy pomocy funkcji longjmp.

Funkcje setjmp i longjmp, cd. Przykładowy kod z wykorzystaniem instrukcji warunkowej: if(setjmp(buf)) {/* ciąg instrukcji */ } /*... */ longjmp(buf,3); Objaśnienia: 1. Po wywołaniu setjmp (zwróci 0) warunek nie będzie spełniony i ciąg instrukcji nie zostanie wykonany. 2. W efekcie wywołania funkcji longjmp w innej części programu, sterowanie zostanie przekazane do miejsca powrotu z funkcji setjmp. Tym razem zostanie zwrócona wartość 3, a więc warunek będzie spełniony i ciąg instrukcji zostanie wykonany.

Funkcje setjmp i longjmp, cd. Ponieważ po "powrocie" funkcja setjmp zwraca wartość przekazaną jako argument funkcji longjmp, nic nie stoi na przeszkodzie, żeby przy pomocy różnych funkcji longjmp przekazywać różne wartości i na ich postawie identyfikować miejsce, z którego nastąpił daleki skok. Przykład wykorzystania instrukcji switch: switch(setjmp(buf)) {case 1 : /* z punktu 1 */ break; } case 2 : /* z punktu 2 */ break; case 3 : /* z punktu 3 */ break;

Przełączanie zadań Aby dokonać przełączenia procesora pomiędzy dwiema funkcjami potrzebujemy dla każdego procesu jednej zmiennej typu jmp_buf służącej do zapamiętania stanu programu w momencie przekazania sterowania do drugiego procesu. Obie zmienne muszą być globalne, aby obie funkcje mogły się do nich odwołać. jmp_buf buf1,buf2; W celu wykonania skoku do funkcji f1 używamy wywołania: longjmp(buf1,1); do funkcji f2: longjmp(buf2,1);

Przełączanie zadań, cd. Przed wykonaniem skoku do drugiego procesu, każda funkcja musi wywołać funkcję: setjmp(buf); Zapamiętane przez tę funkcję informacje o stanie programu będą mogły być wykorzystane do powrotu do miejsca, w którym działanie funkcji zostało zawieszone. Sekwencje przełączające zadania będą wyglądały tak: if(setjmp(buf1)==0)longjmp(buf2,1); // w f1 if(setjmp(buf2)==0)longjmp(buf1,1); // w f2 Objaśnienie: Funkcja longjmp zostanie wywołana tylko wtedy, gdy setjmp zwróci wartość zero. Nastąpi to więc po wywołaniu setjmp w celu zapamiętania kontekstu programu, a nie nastąpi po powrocie w to miejsce przy pomocy dalekiego skoku.

Przełączanie przy nie znanej ilości procesów Dla obsługi nie znanej z góry ilości procesów trzeba: zdefiniować bufor typu jmp_buf dla każdej funkcji, umożliwić określenie następnej funkcji w "łańcuszku struct el { jmp_buf buf; struct el *next; };//lista jednokierunkowa Objaśnienia: Każdą funkcja będzie posiadała własny element typu struct el. W polu buf tego elementu będzie zapamiętywany kontekst tej funkcji w chwili przełączania sterowania do kolejnego zadania. Pole next struktury będzie wskazywało element typu struct el skojarzony z funkcją, do której ma być przekazane sterowanie.

Przełączanie przy nie znanej ilości procesów, cd. Do pełnej manipulacji listą jednokierunkową potrzebne są co najmniej dwie zmienne, wskazujące na dwa kolejne węzły listy: struct el *cur,*last; cur wskaźnikiem na węzeł odpowiadający aktywnej funkcji last -na węzeł odpowiadający poprzedniej funkcji. Sekwencja przełączania zadań zapisana przy użyciu tych zmiennych będzie wyglądała następująco: if(setjmp(cur->buf)==0) longjmp((last=cur,cur=(cur->next))->buf,1); Po zakończeniu działania procesu trzeba go usunąć z listy: cur=last->next=cur->next; longjmp(cur->buf,1);//sterowanie do kolejnego procesu

Zapis praktyczny Stosując definicje preprocesora można zapisać sekwencje przełączające w sposób czytelniejszy: #define BEGIN if(setjmp(cur->buf)==0)return; #define END cur=last->next=cur->next; \ longjmp(cur->buf,1); #define _ if(setjmp(cur->buf)==0) \ longjmp((last=cur,cur=(cur->next))->buf,1); Makrodefinicje BEGIN oraz END umieszcza się odpowiednio na początku i na końcu funkcji. Ostatnie makro jest właściwą sekwencją przełączającą zadania. Nazwa makro _ (podkreślenie) robi go mniej widocznym w kodzie.

Zapis praktyczny, cd. Do rozróżniania czy funkcja jest wykonywana współbieżnie czy nie, można użyć lokalnej zmiennej is_a a_process: #define BEGIN { \ static char is_a_process; \ if((is_a_process=be_a_process)!=0) \ if(setjmp(cur->buf)==0)return; #define END if(is_a_process!=0) \ { \ cur=last->next=cur->next; \ longjmp(cur->buf,1); \ } \ } /* zamyka nawias otwarty w BEGIN */ #define _ if(is_a_process!=0) \ if(setjmp(cur->buf)==0) \ longjmp((last=cur,cur=(cur->next))->buf,1);