otazky Flashcards
Proč se programy v C rozdělují do hlavičkových souborů (.h) a zdrojových souborů (.c)?
- kvůli přehlednosti - nemusím v každém souboru .c definovat jednu funkci stále znovu, stačí její deklaraci uvést v inkludovaném souboru .h
- kvůli kompilátoru (je třeba dopředu znát deklarace funkcí a jejich návratovou hodnotu)
Jaký význam má hlavičkový soubor zdrojových souborů programu v C?
- jsou v něm popisy funkcí, funkce samotné a také proměnné, které se sdílejí napříč soubory
- hlavičkový soubor je includovaný v mainu (je třeba znát pouze použití, ne jejich přímou implementaci)
Jak probíhá překlad a linkování (sestavení) programu v C?
- preprocesor (dosazuje kusy kódu za includy, # makra, vyhazuje komentáře, spojuje řádky dohromady když tam je /). Pokud chceme spustit pouze fázi preprocessingu, přidáme přepínač -E do kompilace.
- kompilace (kompiluje – převede programátorem napsaný zdrojový kód do spustitelné .o (binární) podoby. To jsou soubory, které již obsahují binární kód. Tento kód ale není spustitelný, protože nemá vyřešené závislosti na jiné části programu (například volání funkce, která je v jiném .c souboru). Je třeba znát deklarace, vkládá jen relativní adresy.
- linkování (vkládají se absolutní hodnoty adres – proměnné a funkce, výsledkem je spustitelný program). Při kompilování do objektových souborů kompilátor neví, zda volaná funkce existuje a kde je. Použití správných adres v paměti řeší linker.
Vysvětlete rozdíl mezi překladem zdrojových souborů a linkováním programu?
- překlad vkládá jen relativní adresy, kdežto linkování vkládá již absolutní adresy
Co je to preprocesor a jaká je jeho funkce při překladu zdrojového souboru v jazyce C?
- počítačový program, který zpracovává vstupní data
- dosazuje kusy kódu a hlídá, jestli nebyl nějaký kus dosazen dvakrát (to
nelze)
Jaké znáte překladače jazyka C?
gcc, clang, tcc, icc
Jak zajistíme, že se hlavičkový soubor programu v C nevloží při překladu vícekrát?
- pomocí tzv. head guard (hlavičkového strážce)
#ifndef PRG #define PRG ...kod #endif
Popište proces vytvoření spustitelného programu ze zdrojových souborů jazyka C.
viz 3.
Jak zajistíte možnost ovlivnit výslednou podobu programu při překladu? Např. Velikost bufferu definovanou symbolickou konstantou?
- přidat přepínač -Dbufsize=1234 ( obecne : -D name=definition ) + v kódu mít něco jako #ifndef bufsize #define bufsize 4321 //vychozi hodnota #endif
Jak při překladu programu kompilátorem GCC nebo Clang rozšíříme seznam prohledávaných adresářů s hlavičkovými soubory?
- I
- gcc -Idir [options ..]
- gcc -Iproj/src myfile.c -o myfile
Záleží u kompilace programu kompilátorem GCC nebo Clang při specifikaci adresářů s hlavičkovými soubory na jejich pořadí?
- ano, např. kdybychom linkovali více knihoven.
Co způsobí definování makra preprocesoru NDEBUG v souvislosti s používáním funkce assert?
- dojde k tomu, že si přestane všímat funkce assert, tudíž program nespadne v pripade nesplneni podminky ve výrazu assert(condition)
Jaký tvar má hlavní funkce programu v C, která se spustí při spuštění programu prostředí s operačním systémem?
int main(){}
int main(int argc, char *argv[]){}
main ( int argc, char **argv ) { // code return 0; // Indicates that everything went well. }
Jakou návratovou hodnotou programu v C indikujete úspěšné vykonání a ukončení programu? Proč zvolíte právě tuto hodnotu?
- return 0;
- nula je jen jedna a také protože to značí 0 chyb
- Je taky možné použít EXIT_SUCCESS a EXIT_FAILURE ktere jsou
definované v stdlib.h
Jak předáváme parametry programu implementovanému v jazyce C?
- argumenty
- pomocí příkazové řádky (zvýší se hodnota argc a zapíše se to do argv pole)
Existuje nějaká jiná možnost jak předat uživatelské parametry programu jinak než jako argument programu?
- ano, například načíst ze standardního vstupu pomocí příkazu scanf (nebo podobných)
Jaký je rozdíl mezi staticky a dynamicky linkovaným programem implementovaným v jazyce C?
- staticky – každá část se zkompiluje samostatně a pak se spojí do jednoho
- dynamicky – operační systém si je zavolá až v momentě, kde je bude potřebovat v tom souboru, nejsou přímo zakompilované v binárce
- staticky linked program = lépe přenosný
Linkují ve výchozím nastavení překladače GCC nebo Clang statické nebo dynamické binární spustitelné soubory?
- standardní knihovny se linkují dynamicky a mé vlastní knihovny staticky
Jak vkládáme do zdrojového souboru programu v C hlavičkové soubory jiných modulů nebo knihoven?
#include (pro standardní knihovny) #include “...” (nejčastěji se používá pro vlastni knihovny)
Jaký rozdíl mezi použitím #include a #include “soubor.h”?
#include #include “hledá jak ve standardních knihovnách, tak u mě ve složce ”
Popište rozdíl mezi deklarací a definicí funkce v jazyce C?
- deklarací pouze řekneme, že zde tato funkce bude (zadáme spolu s parametry) ; Musíme určit jméno funkce, vstupní parametry a návratovou hodnotu.
– definice už je přímo celá funkce – {}
Jak jsou předávány parametry funkci v jazyce C?
- hodnota či reference se zkopíruje na stack (reference – hodnota pointeru) 2 možnosti : Pass by Value a Pass by Reference = neexistuje v cecku, pouze pass by value (pointer = integer s adresou)
Co je to literál a co tímto pojmem označujeme?
int a = 5 –> 5 je literál
Jak lze v jazyce C realizovat předání parametru funkci odkazem?
- ccko je striktně pass by value, takže nijak
- pass by reference jen emulováno pomocí ukazatelů
- Obecně: Ukazatele jsou proměnné, které uchovávají adresu ukazující do paměti počítače, kde je uložená konkretní proměnná.
Jak lze v jazyce C omezit viditelnost funkce pouze v rámci jednoho modulu (souboru .c)?
static názevfunkce
Je možné v jazyce C volat funkci ze sebe sama (rekurze)?
ano
Při volání funkce v jazyce C jsou předávány argumenty funkce, které se stanou lokálními proměnnými. V jaké části paměti jsou tyto lokální proměnné při běhu programu uloženy?
- na stacku
- Stack se používá pro staticky allokovanou paměť -> lokální proměnné, pote co je funkce dokončená, tak je místo vyhrazené pro lokální proměnné uvolněno.
Jaké znáte kategorie proměnných z hlediska jejich umístění v paměti?
- lokální proměnné, argumenty funkce a návratové hodnoty jsou na stacku;
- dynamicky alokované proměnné na heapu;
- globální a statické proměnné na static data (pak případně ještě literály mají
svou paměť)
Je součástí jazyka C přímá podpora (tj. klíčové/á slovo jazyka) dynamická alokace paměti?
- ne přímo v jazyce C, ale v knihovně stdlib.h, která je součástí standardního C
Jak v jazyce C dynamicky alokovat paměť za běhu programu?
- pomocí příkazu malloc() - případně calloc() a realloc() - a free()
int p = malloc(4sizeof(int)); // array of 4 int
Je v jazyce C nutné uvolňovat dynamicky alokovanou paměť? Pokud ano, jak to uděláte?
- ano, pomoci příkazu free()
Jak zjistíme velikost reprezentace datových typů v jazyce C?
- pomocí příkazu sizeof()
Je vždy v jazyce C velikost proměnné typu int 32 bitů?
- ne, závisí na kompilátoru a na počítači
Kdy je velikost ukazatele v jazyce C 32-bitů a kdy 64-bitů?
- závisí na architektuře počítače
- 64-bitový systém by měl používat 64-bitů, 32-bitový 32 bitu apod.
Jak funguje modifikátor static při použití v definici lokální proměnné funkce v jazyce C?
- i po ukončení funkce zůstane proměnná na poslední hodnotě uložená na static data
Jak funguje modifikátor extern při definici globální proměnné v jazyce C?
- tato proměnná bude vidět ve všech modulech
Jaké znáte základní znaménkové celočíselné typy v jazyce C?
- int, long, long long, short
- signed char (-128 až 127)
Rozlišuje jazyk C znaménkové a neznaménkové celočíselné typy? Pokud ano, co z toho plyne?
- ano (unsigned a signed)
- při aritmetice se počítá jen s kladnými čísly
Jaké znáte neceločíselné typy v jazyce C? Jaká je jejich vnitřní reprezentace (velikost)?
- float (32 bit), double (64 bit)
- mantisa a exponent
Jsou v jazyce C definovány rozsahy neceločíselných typů?
- nejsou, jediná podmínka – double musí být 2x větší než float
Jsou v jazyce C definovány rozsahy celočíselných typů?
- liší se podle architektury počítače, ano i ne, pravidla:
short menší než int, int menší než long
Jak v C zajistíte proměnné celočíselného typu s konkrétním požadovaným rozsahem (tj. velikostí datové reprezentace)?
- pomocí uint16_t a dalších
- musí být includovaná knihovna
Je součástí jazyka C typ logické hodnoty ,,true/false’’? Pokud ano, jak se používá? Pokud ne, jak jej definujete?
- ano = “_Bool”, ale radši a bool
Jak v C definujete ukazatel na proměnnou, např. typu int?
int a = 5;
int *b = &a;
Jaké jsou v C omezení pro názvy proměnných a funkcí?
- nesmí začínat číslem; obsahuje pouze pismena, cisla a _ , nesmí se shodovat s klíčovým slovem, délka
Jaké znáte escape sekvence používané v C pro řídicí znaky?
- \n \r \t \v \b \f \a (new line , carriage return, horizontal tab, vertical tab, backspace, form feed, alert)
- \0 = NULL
Jak jsou v C reprezentovány textové řetězce?
- pole charů, které má na konci \0. Pole s řetězcem tedy musí být vždy o 1 delší, než je délka textu, který do něj vkládáme
Jak v C zapisujeme identifikátory (jména funkcí a proměnných)?
- nesmí začínat číslem; obsahuje pouze pismena, cisla a _ , nesmí se shodovat s klíčovým slovem
Jakými dvěma způsoby lze v C vytvářet konstanty?
- definovat je jako macro
- pomocí const
Popište výčtový typ jazyka C. Uveďte vlastnosti, které považujete za důležité?
- enum
- Konstanty výčtového typu jsou vždy celočíselné. Pokud konstantě nepřiřadíte hodnotu, pak má hodnotu o jednotku vyšší, než konstanta předešlá.
- např. leden = 1 .. zbytek se přiřadí sám
Jaké znáte logické operátory jazyka C? Jak se zapisují?
&& (and)
|| (or)
! (negation)
Jaké znáte bitové operátory jazyka C? Jak se zapisují?
>> (logical right shift) << & (logical and) ^ (exclusive or) (XOR) ~ (inverse)(NOT) | (logical or)
Jak v C realizujete dělení a násobení dvěma s využitím operátorů bitového posunu?
- násobení – napr. posunu bitově o dva doleva i«1
- dělení – napr. posunu bitově o dva doprava i»1
Jak v C definujete složený typ (struct)?
struct my_struct_s{
int a;
}
voláme: struct my_struct_s A;
Jak zavedeme nový typ struktury, např. pojmenovaný my_struct_s.
typedef struct { // code } my_struct_s; voláme: my_struct_s A;
Kdy nemusíme psát před identifikátor určující jméno/typ struktury klíčové slovo struct?
- když použijeme typedef
Co je v jazyce C pointerová (ukazatelová) aritmetika a jak se používá?
- jedná se o aritmetiku ukazatelů (tedy proměnných, které ukazují na adresu jiné proměnné)
Jak se v C liší proměnná typu ukazatel a typu pole[] (VLA - pole variabilní délky)?
- pole je ukazatel na první prvek “pole”: int pole[50]; pole je pak ukazatelem na: &pole[0]
- pole[1] = *(pole+1)
Jak v C přistupujeme k datovým položkám složeného typu (struct)?
pomocí tečky (.)
Uveďte příklad přístupu k položkám proměnné složeného typu (struct) a proměnné typu ukazatel na složený typ.
- msg.data
- msg->data
Jaký v C rozdíl mezi typy struct a union?
Struct: - pamět pro každého člena = velikost součet nebo větší všech členů - změna hodnoty neovlivní ostatní čl. - víc inicializací najednou Union: - šetří pamět - jen největší člen - změna hodnoty změní ostatní čl. - přístup jen k jednomu členu v daný čas
Stručně popište typ union používaný v jazyce C.
Union:
- šetří pamět - jen největší člen
- změna hodnoty změní ostatní čl.
- přístup jen k jednomu členu v daný čas
- syntaxe jako struct
Jak se v jazyce C používá operátor přetypování?
- napíšeme před výraz do závorky typ, na který chceme přetypovat (int)promenna
- nelze vždy
Co v C reprezentuje typ void?
- speciální datový typ, kdy se při návratu neposkytuje do volajícího výrazu žádná návratová hodnota
- “žádná data” (datový typ pouze pro organizaci)
Co v C reprezentuje typ void*?
- Deklaruje ukazatel, ale bez zadání typu dat, na který ukazuje. (takže můžeme použít přetypovani jako např. u (int)malloc(…), jelikož malloc taky vrací void)
Jak v C realizujete opuštění dvou nebo více vnořených cyklů z nejvnitřnějšího cyklu?
- horní mez, goto, break, stavy, return, !quit podmínka
Co v C reprezentuje identifikátor NULL?
- jedná se o konstantu, která udává, že pointer je prázdný a že zrovna na nic neukazuje
Jak nastavíte proměnnou typu ukazatel na prokazatelně neplatnou hodnotu?
= 0 anebo = NULL
Napište základní tvar hlavní funkce main, která se používá v C programech? Uveďte další možné tvary.
int main(){} int main(int argc, char *argv[]){}
main ( int argc, char **argv ) { // code return 0; }
Jak v C zapíšete konstantní ukazatel na konstantní hodnotu, např., typu double?
const double * const ptr;
Co je v C ukazatel na funkci? K čemu slouží a jak definujete proměnou typu ukazatel na funkci?
int (functionPtr)(int,int);
functionPtr = &addInt;
int sum = (functionPtr)(2, 3);
Je v C rozdíl definovat složený typ pouze jako struct a prostřednictvím typedef struct? Pokud ano, tak jaký?
- Je rozdíl ve volání struktury. Když definujeme pomoci typedef, pak nemusíme psát klíčové slovo struct v definici.
Můžeme v C při definici proměnné typu pole, proměnnou přímo inicializovat? Pokud ano, jak?
- ano, např.:
int pole[] = { 0, 0, 0, 0};
int myArray[10] = { 0 };
char array[255]=”Hello”;
Můžeme v C při definici proměnné typu struct inicializovat pouze určitou položku?
- ne, při definici nemůžeme inicializovat nic. Pouze při inicializaci!
Jakou funkcí v C vytisknete na obrazovku formátovaný znakový výstup? V jaké standardní knihovně je funkce definována?
printf();
- taky fprintf(stdout,”smth”)
- knihovna
Jak v C načtete hodnotu textového řetězce a celého čísla od uživatele?
- Celé číslo: int a; scanf("%d", &a) - Text.: char pole[255] fgets (pole, 255, stdin);
Jak v C vytisknete textový řetězec na standardních výstup a standardní chybový výstup? Jakou funkci k tomu použijete?
- fprintf(stderr, “….”);
- fprintf(stdout, “….”) - stejný výsledek jako printf(“….”);
V jakém kontextu se používá klíčové slovo break?
- slouží k opuštění těla cyklu nebo příkazu switch
V jakém kontextu se používá klíčové slovo case?
- označuje jednu “možnost” v příkazu switch
V jakém kontextu se používá klíčové slovo continue?
- Program skočí na začátek cyklu a zvýší se iterace (tj. pokracuje se dal v cyklu (pokud není porušena podmínka průběhu cyklu))
V jakém kontextu se používá klíčové slovo default?
- při použití switch, abychom ošetřili situaci, kdy se nesplní ani jeden case
V jakém kontextu se používá klíčové slovo do?
- pro použití do…while smyčky, vykoná se aspoň jednou podmínka je na konci
V jakém kontextu se používá klíčové slovo while?
- while (podmínka) {}
- pro vytvoření cyklu, lze i nekonečný cyklus (while(1){}
V jakém kontextu se používá klíčové slovo for?
- for cyklus, nejčastěji když známe přesný počet opakování
- for(int i = 0; i < hranice; ++i) {}
Jaké bloky pro řízení cyklu definuje for cyklus?
for(inicializace; test podmínky; aktualizace proměnné){}
Jaký význam má uvedení specifikátoru register?
- klíčové slovo registr říká překladači (kompilátorů), že daná proměnná se může uložit do registru – rychlejší přístup než do paměti. Kompilátor sám zvolí zda ji uloží do registru nebo ne.
Kdy lze použít příkaz skoku goto?
- třeba když chci vyskočit z několika vnořených cyklů
- nepřehledný, nedoporučuje se
Co vrací operátor sizeof?
- velikost datového typu v bajtech
Lze použít proměnnou jako argument operátoru sizeof?
ano
Jak můžeme zjistit konkrétní velikost určitého datového typu? Např. celočíselný int nebo short.
sizeof(int)
sizeof(short)
Jak zajistíme, že lokální proměnná ve funkci si zachová hodnotu i při opuštění funkce?
- pomoci keyword static
Co reprezentuje klíčové slovo void?
- void funkce nemá návratovou hodnotu, void* ukazuje na libovolný datový typ
Jak definujete konstantní hodnotu typu float?
- const float a = 1.5; (jedna se defakto o definici spojenou s inicializaci, rozdelit tyto procesy by nedavalo smysl)
Jak rozlišíte literál typu float a double?
- podle velikosti. float 32 má 32 bitu, double 64 (obecne je double vzdy 2x vetsi nez float, 32 bitu neni zaruceno, zalezi na standardech)
Jak rozlišíte literál typu int a long?
- literál pro long zápisu long a = 156l;
Jak vytisknete hodnotu ukazatele int *p na standardní výstup? Jaký formátovací příkaz v printf použijete?
%p
printf(“%p”, p);
Jak vytisknete hodnotu proměnné typu int, na kterou odkazuje ukazatel deklarovaný jako int *p;?
printf(“%d”, *p);
Jak získáte ukazatel na proměnnou definovanou jako double d = 12.3?
double *dp = &d;
Jak přistoupit na položku number proměnné data typu struktura?
data.number;
Jak přistoupit na položku number proměnné data typu ukazatel na strukturu?
data->number;
K čemu slouží modifikátor const?
- určíme tím, že daná proměnná je neměnná, označíme ji za konstantu, překladač hlídá abychom do nich nepřiřazovali novou hodnotu -> nedovolí ji změnit
Jak se v C předává pole funkcím?
- jako ukazatel na první položku pole
Je velikost paměťové reprezentace typu struct vždy součet velikostí typů jednotlivých položek?
- Ne, každá položka musí být v paměti řádně zarovnána a tak mohou vzniknout “hluchá” místa -> padding
Podporuje jazyk C přetěžování jmen funkcí? Pokud ano, od jaké verze?
- Ne. Podporuje to pouze C++ za předpokladu odlišení funkcí na základě odlišnosti v počtu nebo typech parametrů
Jak probíhá proces spuštění programu implementovaného v jazyce C?
- V sekundární paměti počítače(hard disk). Po spuštění programu je celý zkopírován do paměti RAM. Potom procesor načte několik instrukcí (záleží na velikosti sběrnice) najednou, umístí je do registrů a provede je.
Popište jak v C probíhá volání funkce int doit(int r)? Jaká data jsou předávána do/z funkce a kam jsou hodnoty ukládány?
- do funkce vstupuje: int, z funkce: int, ukladaji se na stack
Vysvětlete rozdíl mezi proměnnou a ukazatelem na proměnnou v jazyce C?
- proměnná je uložená na určité adrese a má nějakou hodnotu
- ukazatel na proměnnou odkazuje na adresu, na které je uložená pointer je premenna typu pointer, je to len 32/64bit cislo s adresou kterou tam dame
Jaký je v C rozdíl mezi ukazatelem na konstantní proměnnou a konstantním ukazatelem? Jak definice těchto ukazatelů zapisujeme?
const char* myPtr = &a;
char *const myPtr,
- nemůžeme změnit kam tento pointer ukazuje
Jak v C dynamicky alokujete paměť pro uložení posloupnosti 20 hodnot typu data_t ? Jak následně takové dynamické pole zvětšíte pro uložení dalších 10 položek?
data_t *data = (data_t *)malloc(20 * sizeof(data_t)); data_t *tmp = (data_t*)realloc(data, 30 * sizeof(data_t)); if (tmp != NULL) { //včetně ověření dostatku paměti data = tmp; }
Jak v C zajistíte načtení textového řetězce ze souboru aniž byste překročili alokovanou paměť určenou pro uložení řetězce?
- postupnou realokací/dynamickou alokací
Vysvětlete jaký je v C rozdíl mezi proměnnou typu ukazatel, proměnnou a polem z hlediska uložení hodnoty v paměti?
- Pole je ukazatel na první prvek pole, ukazatel je adresa na které je uložena proměnná na kterou odkazuje.
- lokalni promenne——->stack
- globální proměnné ——->static
- ukazatele na stacku, pamět na heapu
Vyjmenujte základní paměťové třídy, ve kterých mohou být uloženy hodnoty proměnných.
auto (stack)
static (datové oblasti)
extern (datové oblasti)
register (jeli dovoleno překladačem umístněy v registru)
Jaký je v C rozdíl mezi ukazatelem na hodnotu int a polem hodnot int, tj. int *p a int p[]?
- sizeof (array) vrátí množství paměti použité všemi prvky v poli
- sizeof (ukazatel) pouze vrací množství paměti použité samotnym ukazatelem
- & (array) je stejne jako &pole[0] a vrátí adresu prvního prvku v poli
- & (ukazatel) vrátí adresu ukazatele
Jaký význam má klíčové slovo static v závislosti na kontextu?
- static fce a static proměnná - bude mít vnitřní linkování a nebude viditelné z ostatních modulů
- Statická proměnná uvnitř funkce nechává svoji hodnotu po skončení funkce.
Definujte pole variabilní délky o velikosti n, kterou načtete ze standardního vstupu.
int n = 0;
scanf(“%d”, &n);
int pole[n];
Definujte diagonální (jednotkovou) matici 3×3 jako 2D pole typu int.
- int Array[3][3]={{1,0,0},{0,1,0},{0,0,1}};
Garantuje uvedení const u definice proměnné, že není žádná možnost jak příslušnou hodnotu proměnné změnit?
- ne, lze změnit hodnotu pomoci pointeru
Je v C možné použít příkaz nepodmíněného skoku goto ke skoku z jedné funkce do jiné? Pokud ne, proč?
- Nemůžete v Standardnim C; labely jsou pouze lokální (pro jednu funkci).
Popište k čemu slouží příkaz dlouhého skoku (longjmp/setjmp) v C. Jak se používá?
- setjump si zapamatuje pozici a nastaví tam jmp_buf
- longjmp skoci na jmp_buf
- slouží ke skoku mezi funkcemi
Vyjmenujte základní rozdělení paměti přidělené spuštěnému programu z hlediska kódu, proměnných a literálů?
stack, heap, static data, literals
Vyjmenujte (čtyři) specifikátory paměťové třídy (Storage Class Specifiers).
auto,static,register,extern
Jaké typy paměti dle způsobu alokace rozlišujeme v jazyce C?
- Staticky(stack) a dynamicky(heap) alokovaná.
Definujte nový typ, který umožní sdílet paměť pro proměnnou typu double, nebo proměnnou typu int.
typedef union {
double doub;
int integer;
} sharing_int_double;
Co znamená klíčové slovo volatile?
- Volatile určuje, že proměnná bude vždy na stejném místě v paměti (například nebude se ukládat do cache apod.)
Jaký význam má klíčové slovo extern dle kontextu?
- pro funkce – extern je zahrnut i když jej nepíšeme
- pro proměnné - pouze deklarujeme nebude vyhrazená paměť pro ně, zviditelňuje proměnnou pro celý program
V jakém hlavičkovém souboru standardní knihovny C jsou deklarovány funkce pro vstup a výstup?
stdio.h
V jakém hlavičkovém souboru standardní knihovny C jsou deklarovány nejběžnější funkce std. knihovny?
stdlib.h
V jakém hlavičkovém souboru standardní knihovny C jsou deklarovány funkce pro práci s textovými řetězci?
string.h
Co je errno a v jakém hlavičkovém souboru standardní knihovny C je deklarováno?
extern int errno;
- ze zacatku je errno=0, v případě úspěšného bezchybného vykonání programu se nemění
Jakým způsobem jsou předávány nebo jinak ukládány chybové stavy ve většině funkcí standardní knihovny C?
- funkce vraci hodnotu -1 nebo NULL nebo EOF
- EXIT_SUCCESS a EXIT_FAILURE Defined in header
K čemu slouží makro assert a v jakém je hlavičkovém souboru standardní knihovny C?
- umožňuje zápis diagnostických informací na standardní chybový výstup, tedy zjednodusuje debuggovani
Ve kterém hlavičkovém souboru standardní knihovny C jsou definovány matematické funkce?
math.h
Ve kterém hlavičkovém souboru standardní knihovny C byste hledali rozsahy základní číselných typů?
stdint.h
Jakým způsobem otevřete soubor pro čtení? Napište krátký (1-3 řádkový) kód?
FILE* soubor= fopen(”text.txt“, “r”);
Jakým způsobem otevřete soubor pro zápis? Napište krátký (1-3 řádkový) kód?
FILE* soubor = fopen(”text.txt“, “w”);
Proč je vhodné explicitně zavírat otevřený soubor? Jakou funkci standardní knihovny C k tomu použijete?
fclose()
- Aby došlo k uvolnění paměti, kterou zabírá soubor.
Jak zjistíte, že jste při čtení souboru dosáhli konce souborů? Jakou funkci standardní knihovny C k tomu můžete použít?
- př. funkcí (int feof(FILE *stream)), která vrátí na konci souboru nenulovou hodnotu
- stdio.h
Jak zjistíte podrobnosti o selhání čtení/zápisu z/do souboru s využitím funkcí standardní knihovny C?
podle return value funkce,
size_t fwrite ..
Jak rozlišíte chybu a dosažení konce souboru při neúspěchu čtení ze souboru, např. funkcí fscanf()?
- pomocou feof()
Jaké znáte funkci/e standardní knihovny C pro náhodný přístup k souborům?
fseek(FILE *stream, long int offset, int whence)
Jaké znáte funkce standardní knihovny C pro blokové čtení a zápis?
size_t fread(void *ptr...) size_t fwrite(const void *ptr...)
Co je to proces v terminologii operačního systému?
- proces = instance programu, který je právě spuštěn operačním systémem ve vyhrazeném prostoru paměti
- může se skládat z jednoho nebo více vláken
- procesy jsou využívány operačním systémem pro oddělení různých běžících aplikací
Budete se snažit svůj program paralelizovat i když máte pouze jeden procesor? Svou odpověď zdůvodněte.
Ano, i na jednom procesu může běžet simultálně více vláken, organizace programu, zpracování soketů na webu
Jaké základní operace související s paralelním programováním (více procesové/vláknové) řeší programovací jazyky s explicitní podporou paralelismu?
- tvorba a rušení procesů
- správa více procesorů a procesu, rozvrhování
- systém sdílené paměti
- synchronizace procesů
Jaké entity (operačního systému) slouží k řízení přístupu ke sdíleným zdrojům)?
?
Jak lze standardní vstup a výstup využít pro komunikaci mezi procesy?
?
Co je to vlákno (thread)?
- samostatně prováděný výpočetní tok
- běží v rámci procesu
- jednoho procesu běží v rámci stejného prostoru paměti
- každé vlákno vyhrazený prostor pro spec. proměnné
Jaký je rozdíl mezi vláknem a procesem?
Proces / Vlákno:
Vlastní paměťový prostor / společný.
Entita OS / Uživatelská nebo os entita
Časová náročnost proces / méně náročné
Co musí úloha splňovat, aby mělo smysl uvažovat o vícevláknové architektuře aplikace (obecně, ne konkrétní typ aplikací)?
- reakce na asynchronní události
- větší kvanta dat
- nezávislé podúlohy
Jaké výhody má vícevláknová aplikace oproti víceprocesové aplikaci?
- Snadnější a rychlejší komunikace mezi vlákny (stejný pam. prostor)
- aplikace je interaktivnější
Je aplikace s interaktivním rozhraním vhodným kandidátem pro vícevláknovou aplikaci a proč?
- ano, procesy nesníží interaktivitu
- okamžitá odpověd ++
Kdy nemá smysl použití více vláken pro aplikaci s uživatelským rozhraním?
?
Má smysl vyvíjet vícevláknové aplikace pro systémy s jediným CPU a proč?
- ano, možnost lépe využít početní výkon
- možná zrychlit aplikaci
Kde se mohou nacházet vlákna z hlediska řízení přidělování procesoru?
?
Jak jsou rozvrhována vlákna řešená uživatelskou knihovnou a co to znamená z hlediska priority vláken?
?
Jaké modely vícevláknových aplikací znáte?
- boss/worker
- pipeline
- peer
- producer/consumer
Co je to Thread Pool a k čemu je dobrý?
- zásobárna předpřipravených vláken, která čekají na úkoly od hlavního vlákna. Nemusí se díky němu neustále inicializovat nová vlákna.
Jak snížíte nároky opakovaného vytváření vláken?
- využitím Thread Pool
Jaké vlastnosti sledujeme při návrhu struktury Thread Pool?
- počet předpřipravených vláken
- maximální počet požadavků ve frontě požadavků
- co se má stát, když je fronta plná a žádné z vláken není k dispozici
Jakou architekturu vícevláknové aplikace použijete v případě zpracování proudu dat?
pipeline
Jaké vlastnosti musí splňovat proudové zpracování dat, aby bylo výhodné použít více vláken?
- předpoklady: proud dat, určitá vlákna pracují paralelně na různých částech ‘proudu’ dat
Jak předáváme data mezi vlákny v úloze producent/konzument?
- pomocí memory bufferu nebo jen pomocí bufferu referencí (pointerů) na konkrétní datové jednotky
Jaké je základní primitivum synchronizace více vláken?
pthread_mutex_lock
pthread_mutex_unlock
Jaké znáte primitiva pro synchronizaci více vláken?
pthread_cond_signal
pthread_cond_wait
pthread_cond_broadcast
Kdy říkáme, že je funkce reentrantní?
- když můžeme být funkce v průběhu přerušena a pak bezpečně znova zavolána, nepíše do static data a nepracuje s globálními daty
Co je to thread-safe funkce?
- jedno či více vláken může vykonat stejnou část kódu bez toho aby způsobily synchronizační problémy
Jak dosáhneme reentrantní funkce?
- tak, že tato funkce nebude zapisovat do static data a nepracuje s globálními proměnnými
Jak dosáhneme thread-safe funkce?
- tak, že tato funkce bude mít přímý přístup ke globálním datům za použití synchronizačních primitiv
Jaké hlavní synchronizační problémy se objevují u vícevláknových aplikací?
deadlock
race condition
Co je to problém uváznutí (deadlock)?
- když pro dokončení první operace je potřeba dokončit operaci druhou a naopak → zacyklení se, čekají jedna na druhou
Co je to problém souběhu (race conditions) u vícevláknové aplikace?
- jedná se o přístup více vláken ke sdílenému zdroji, kdy alespoň jedno z nich nepoužívá synchronizační mechanismus
- zápis a čtení nejsou atomické
Jak se lze vyhnout problému uváznutí (“dead-lock”) u vícevláknové aplikace?
- zamykat proměnné vždy ve stejném pořadí (spraví většinu problémů), jinak žádné 100% pravidlo neexistuje