od Jenda_ » 2. 2. 2016 01:07
Poznámky k otázkám z webu:
> Napište sekvenci příkazů pro vytvoření dynamické knihovny a programu který na ní závisí (ideálně na Linuxu a Solarisu).
cc -G -o libadd.so add.c (gcc -shared)
cc -L. -ladd -R. main.c (gcc -Xlinker -R. nebo LD_LIBRARY_PATH=.)
> Proč není dobrý nápad používat proměnnou LD_LIBRARY_PATH pro něco jiného než ladění programů ?
Obcházení problémů nečistou metodou. A protože se dědí.
> Vysvětlete význam parametrů funkce main() a proměnné environ.
main může mít 3. parametr a to bude stejně jako extern char** environ
> Jak se zpracovávají argumenty programu pomocí funkce getopt() ?
getopt(int argc, char * argv[], char* optstring)
+ extern int optind
proces má kontext, vlákna jsou uvnitř procesu, program je spustitelný soubor na disku, např. ve formátu elf
paměť se přiděluje procesům
čas/procesor se přiděluje vláknům (pokud to není library-level threading)
syscall: vrací signed: -1 chyba, >=0 OK, vrací pointer: NULL chyba; nastavuje se errno
když čekám -1, musím nastavit errno na 0 a pak se kouknout
pthreads vracé 0 OK, >0 fail
/bin/ping má ruid=jenda, euid=root
testují se v tomto pořadí práva roota, vlastníka a skupiny, takže "---rwxrwx jenda jenda" nepřečtu, ale můžu chmodnout a pak to přečtu.
svazek = instance FS
block devices se bufferují
files: special, regular (hardlink), dir, fifo, socket, symlink
s5: boot block, superblock, inody, data - taky ve stromech, omezená jména a velikosti souborů, sloooow
ffs/ufs: cylgrupy (ne že by to v době LBA pomohlo) s kopiemi superbloku, bitmapy, jména 255, ufs2: dirhash cache
obrázek str. 80 - tree traversal
přístup k souborům: vždy open(), nebo creat(); vı́ce deskriptorů může sdı́let jedno otevřenı́ souboru (mód čtenı́/zápis, ukazatel pozice)
creat - bacha na umask
> Popište paměťový prostor procesu v uživatelském režimu a v režimu jádra.
text - data - bss - - stack - oblast user (nepřístupná) (ne vždy v tomto pořadí)
kernel text - data a bss jádra, uvnitř struktura user, pod tím stack jádra
> Nakreslete a popište stavový diagram procesu.
obrázek 123
> Popište základy mechanismu plánování procesů. Jaké jsou prioritní třídy ?
preemptivní (interrupty timerem)
timeshared ("normální"), ladí se velikost kvanta, system, realtime - definovaná časová kvanta
FIXME: signal handling u vláken
> Jaká pravidla existují pro psaní signal handlerů ? Jakým způsobem se vyrovnat s omezeními při jejich implementaci ?
reentrantní; globální přepínač
155: alarm signál
> Jak je možné vytvořit globální proměnnou privátní pro jedno vlákno ?
pthread_key_create vyrobí pointr, který si každé vlákno může nastavit jinam.
> Které atributy jsou společné pro proces, které jsou privátní pro každé vlákno ?
Soukromé: IP, stack, thread ID, plánovacı́ priorita a politika, errno, klíče
> Jak fungují destruktory klíčovaných hodnot a zásobník úklidových handlerů ?
Klíčové hodnotě prostě předám funkci.
pthread_cleanup_push a pop
> Co se stane když jedno vlákno zavolá fork() ? Jaký problém při tom může vzniknout a jak ho lze řešit ?
Neuvolněná paměť, navždy zamčené mutexy a deadlocky. Je dobré v prefork handleru vše zamknout (tedy počkat, až to ostatní vlákna uvolní) a v postfork odemknout.
Signály: masknout a jedno vlákno se věnuje jen signálům přes sigwait.
> Uveďte nástroje pro synchronizaci vláken.
Mutexy, podmínkové proměnné, RW zámky
> Popište způsob použití podmínkových proměnných, důvody proč se používají právě daným způsobem a co by se mohlo stát kdyby tomu bylo jinak.
Zamknu mutex, otestuji neplatnost podmínky, pthread_cond_wait. Jinak bych se mohl zaseknout - probudím se opravdu jen při změně, není tam fronta jako u signálů.
Probuzení nemusí nutně znamenat, že podmínka platí.
typicky je dobré volat wait ve while(!podminka)
231: použití
> Popište zamykání souborů pomocí fcntl().
dokonce se dá zamykat rozsah
advisory a mandatory (ne vždy je implementován) locking
při zavření se všechny moje zámky uvolní - a to i když to třeba otevřela a zavřela subrutina
> Vysvětlete zamykání pomocí lock souborů.
open(rdwr | creat | excl), vrátí -1 při souběhu
unlock: unlink
> Popište semafory, implementované v UNIX System V IPC. Jakými příkazy lze zobrazit jejich výpis a stav ?
pracuje atomicky nad polem! semaforů
semctl(semnum), GETVAL, GETNCNT (kolik drží procesů)
použití: semop, operace snížit, zvýšit, čekat na 0, a operace jsou v sembuf, kde je vždycky pro který semafor jakou operaci
jo a než s tím vůbec můžu začít pracovat, tak si samozřejmě musím pořídit IPC klíč přes ftok()
> Popište činnost serveru a klienta (posloupnost systémových volání) pro spojované síťové služby.
server: socket, bind, listen, accept, read/write, close
klient: socket, connect, read/write, close; bind pokud by chtěl extra odchozí port (může vyžadovat vyšší oprávnění)
nespojované: socket, bind, sendto/recvfrom
> Co je to soket? Jaké jsou varianty adresace soketů (v rámci jednoho stroje a po síti) ?
AF_UNIX, AF_INET6; UNIX má filename
> Jaké funkce slouží pro převod mezi číselnými a symbolickými jmény protokolů, portů a IP adres?
pton, ntop (network, presentable format)
getprotobyname, getservbyname, pozor, proto je IP protokol, serv je HTTP/SSH/IMAP
> Popište standardní funkce pro převod jména na adresu a naopak a způsob jejich použití pro klient a server.
getaddrinfo, getnameinfo
bývaly gethostbyname a gethostbyaddr
> Jak lze čekat na příchod dat z několika deskriptorů souborů zároveň?
select - čtecí, zapisovací, chybové
poll - čeká na událost a nastaví pro fd události ("lze číst", "lze zapisovat"…)
Poznámky k otázkám z webu:
> Napište sekvenci příkazů pro vytvoření dynamické knihovny a programu který na ní závisí (ideálně na Linuxu a Solarisu).
cc -G -o libadd.so add.c (gcc -shared)
cc -L. -ladd -R. main.c (gcc -Xlinker -R. nebo LD_LIBRARY_PATH=.)
> Proč není dobrý nápad používat proměnnou LD_LIBRARY_PATH pro něco jiného než ladění programů ?
Obcházení problémů nečistou metodou. A protože se dědí.
> Vysvětlete význam parametrů funkce main() a proměnné environ.
main může mít 3. parametr a to bude stejně jako extern char** environ
> Jak se zpracovávají argumenty programu pomocí funkce getopt() ?
getopt(int argc, char * argv[], char* optstring)
+ extern int optind
proces má kontext, vlákna jsou uvnitř procesu, program je spustitelný soubor na disku, např. ve formátu elf
paměť se přiděluje procesům
čas/procesor se přiděluje vláknům (pokud to není library-level threading)
syscall: vrací signed: -1 chyba, >=0 OK, vrací pointer: NULL chyba; nastavuje se errno
když čekám -1, musím nastavit errno na 0 a pak se kouknout
pthreads vracé 0 OK, >0 fail
/bin/ping má ruid=jenda, euid=root
testují se v tomto pořadí práva roota, vlastníka a skupiny, takže "---rwxrwx jenda jenda" nepřečtu, ale můžu chmodnout a pak to přečtu.
svazek = instance FS
block devices se bufferují
files: special, regular (hardlink), dir, fifo, socket, symlink
s5: boot block, superblock, inody, data - taky ve stromech, omezená jména a velikosti souborů, sloooow
ffs/ufs: cylgrupy (ne že by to v době LBA pomohlo) s kopiemi superbloku, bitmapy, jména 255, ufs2: dirhash cache
obrázek str. 80 - tree traversal
přístup k souborům: vždy open(), nebo creat(); vı́ce deskriptorů může sdı́let jedno otevřenı́ souboru (mód čtenı́/zápis, ukazatel pozice)
creat - bacha na umask
> Popište paměťový prostor procesu v uživatelském režimu a v režimu jádra.
text - data - bss - - stack - oblast user (nepřístupná) (ne vždy v tomto pořadí)
kernel text - data a bss jádra, uvnitř struktura user, pod tím stack jádra
> Nakreslete a popište stavový diagram procesu.
obrázek 123
> Popište základy mechanismu plánování procesů. Jaké jsou prioritní třídy ?
preemptivní (interrupty timerem)
timeshared ("normální"), ladí se velikost kvanta, system, realtime - definovaná časová kvanta
FIXME: signal handling u vláken
> Jaká pravidla existují pro psaní signal handlerů ? Jakým způsobem se vyrovnat s omezeními při jejich implementaci ?
reentrantní; globální přepínač
155: alarm signál
> Jak je možné vytvořit globální proměnnou privátní pro jedno vlákno ?
pthread_key_create vyrobí pointr, který si každé vlákno může nastavit jinam.
> Které atributy jsou společné pro proces, které jsou privátní pro každé vlákno ?
Soukromé: IP, stack, thread ID, plánovacı́ priorita a politika, errno, klíče
> Jak fungují destruktory klíčovaných hodnot a zásobník úklidových handlerů ?
Klíčové hodnotě prostě předám funkci.
pthread_cleanup_push a pop
> Co se stane když jedno vlákno zavolá fork() ? Jaký problém při tom může vzniknout a jak ho lze řešit ?
Neuvolněná paměť, navždy zamčené mutexy a deadlocky. Je dobré v prefork handleru vše zamknout (tedy počkat, až to ostatní vlákna uvolní) a v postfork odemknout.
Signály: masknout a jedno vlákno se věnuje jen signálům přes sigwait.
> Uveďte nástroje pro synchronizaci vláken.
Mutexy, podmínkové proměnné, RW zámky
> Popište způsob použití podmínkových proměnných, důvody proč se používají právě daným způsobem a co by se mohlo stát kdyby tomu bylo jinak.
Zamknu mutex, otestuji neplatnost podmínky, pthread_cond_wait. Jinak bych se mohl zaseknout - probudím se opravdu jen při změně, není tam fronta jako u signálů.
Probuzení nemusí nutně znamenat, že podmínka platí.
typicky je dobré volat wait ve while(!podminka)
231: použití
> Popište zamykání souborů pomocí fcntl().
dokonce se dá zamykat rozsah
advisory a mandatory (ne vždy je implementován) locking
při zavření se všechny moje zámky uvolní - a to i když to třeba otevřela a zavřela subrutina
> Vysvětlete zamykání pomocí lock souborů.
open(rdwr | creat | excl), vrátí -1 při souběhu
unlock: unlink
> Popište semafory, implementované v UNIX System V IPC. Jakými příkazy lze zobrazit jejich výpis a stav ?
pracuje atomicky nad polem! semaforů
semctl(semnum), GETVAL, GETNCNT (kolik drží procesů)
použití: semop, operace snížit, zvýšit, čekat na 0, a operace jsou v sembuf, kde je vždycky pro který semafor jakou operaci
jo a než s tím vůbec můžu začít pracovat, tak si samozřejmě musím pořídit IPC klíč přes ftok()
> Popište činnost serveru a klienta (posloupnost systémových volání) pro spojované síťové služby.
server: socket, bind, listen, accept, read/write, close
klient: socket, connect, read/write, close; bind pokud by chtěl extra odchozí port (může vyžadovat vyšší oprávnění)
nespojované: socket, bind, sendto/recvfrom
> Co je to soket? Jaké jsou varianty adresace soketů (v rámci jednoho stroje a po síti) ?
AF_UNIX, AF_INET6; UNIX má filename
> Jaké funkce slouží pro převod mezi číselnými a symbolickými jmény protokolů, portů a IP adres?
pton, ntop (network, presentable format)
getprotobyname, getservbyname, pozor, proto je IP protokol, serv je HTTP/SSH/IMAP
> Popište standardní funkce pro převod jména na adresu a naopak a způsob jejich použití pro klient a server.
getaddrinfo, getnameinfo
bývaly gethostbyname a gethostbyaddr
> Jak lze čekat na příchod dat z několika deskriptorů souborů zároveň?
select - čtecí, zapisovací, chybové
poll - čeká na událost a nastaví pro fd události ("lze číst", "lze zapisovat"…)