Spis tre±ci Zarz¡dzanie procesami QNX

Transkrypt

Spis tre±ci Zarz¡dzanie procesami QNX
Zarz¡dznie procesami QNX
Spis tre±ci
1
Wst¦p
1.1
1.2
1.3
teoretyczny . . . . . . . . . . . . . . . . . . .
Tabela atrybutów procesów w systemie QNX
Przykªadowe programy - Tworzenie procesów
Zako«czenie procesu . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
1
3
Zarz¡dzanie procesami QNX
1
Wst¦p teoretyczny
Proces - jedno z najbardziej podstawowych poj¦¢ w informatyce, deniowane jako egzemplarz wykonywanego programu, jednak ka»dy nowo powstaªy proces otrzymuje unikalny numer, który go jednoznacznie identykuje, tzw. numer PID (ang. process IDentier).
W celu wykonania programu system operacyjny przydziela procesowi zasoby, ale tak»e mo»e by¢
konieczne wspóªbie»ne wykonywanie pewnych fragmentów programu. Aby to zrealizowa¢ program mo»e
za»¡da¢ utworzenia okre±lonej liczby w¡tków, wykonuj¡cych wskazane cz¦±ci programu - o ich wspóªbie»ne wykonanie dba system operacyjny. W¡tki wspóªdziel¡ prawie wszystkie zasoby zarezerwowane
dla danego procesu, wyj¡tkiem jest czas procesora, który jest przydzielany indywidualnie ka»demu
w¡tkowi.
Za zarz¡dzanie procesami odpowiada j¡dro systemu operacyjnego, sposób ich obsªugi jest ró»ny
dla ró»nych systemów operacyjnych. W systemie operacyjnym ka»dy proces posiada proces nadrz¦dny,
z kolei ka»dy proces mo»e, poprzez wywoªanie funkcji systemu operacyjnego, utworzy¢ swoje procesy
potomne; w ten sposób tworzy si¦ swego rodzaju drzewo procesów. Ka»dy proces otrzymuje od systemu
operacyjnego odr¦bne zasoby, w tym odr¦bn¡ przestrze« adresow¡, list¦ otwartych plików, urz¡dze«
itp.
1.1
Tabela atrybutów procesów w systemie QNX
Atrybuty procesu to informacje wykorzystywane przez system operacyjny do zarz¡dzania procesami.
Atrybut procesu
Identykator procesu PID
Identykator procesu macierzystego PPID
Numer grupy procesów PGID
Identykator sesji SID
Rzeczywisty identykator u»ytkownika UID
Rzeczywisty identykator grupy GID
‘rodowisko procesu
Katalog bie»¡cy
Priorytet procesu
Strategia szeregowania
1.2
Testowanie
getpid()
getppid()
getpgrp()
getsid()
getuid()
getgid()
getenv()
getcwd()
getprio(), sched_getparam()
sched_getscheduler()
Ustawianie
setpgrp(), setpgid()
setsid()
putenv()
chdir()
setprio(), sched_setparam()
sched_setscheduler()
Przykªadowe programy - Tworzenie procesów
Pierwszy program testuje i ustawia priorytet i strategi¦ szeregowania dla bie»¡cego procesu:
#include <sched.h>
#include <stdio.h>
int main(void) {
// Deklaracja potrzebnych zmiennych
PDW 2
1
Zarz¡dznie procesami QNX
struct sched_param par;
int str;
//Testowanie priorytetu i strategii szeregowania
sched_getparam(0,&par);
str=sched_getscheduler(0);
//Drukowanie
printf("Przydzielony priorytet: %d\n",par.sched_priority);
printf("Strategia szeregowania: %d\n",str);
//Ustawianie priorytetu 9 i strategii szeregowania FIFO
par.sched_priority=9;
sched_setparam(0,&par);
sched_setscheduler(0,SCHED_FIFO,&par);
}
sleep(20);
return(0);
Drugi program pokazuje wykorzystanie funkcji f ork() do tworzenia procesu potomnego. Funkcja f ork()
tworzy proces potomny b¦d¡cy kopi¡ procesu macierzystego.
#include <stdio.h>
#include <process.h>
int main(int argc,char *argv[])
//schemat wykorzystania funkcji fork
{
int pid;
if ((pid=fork())==0)
{
printf("Proces potomny PID: %d\n",getpid());
//instrukcje procesu potomnego
}
else
{
printf("Proces macierzysty PID: %d\n",getpid());
//instrukcje procesu macierzystego
}
}
Trzeci program pokazuje schemat wykorzystania funkcji execl(). Wykonanie funkcji z rodziny exec *()
spowoduje zast¡pienie bie»¡cego procesu procesem utworzonym z podanego jako parametr funkcji pliku
wykonywalnego
#include <stdio.h>
#include <process.h>
int main(int argc,char *argv[])
//schemat wykorzystania funkcji execl
{
int pid;
if ((pid=fork())==0)
{
//Uruchomienie programu my_prog i przekazanie argumentu z linii polece«
execl("my_prog","my_prog",argv[1],NULL);
PDW 2
2
Zarz¡dznie procesami QNX
perror("Blad funkcji exec");
}
}
else
{
printf("Proces macierzysty PID: %d\n",getpid());
//instrukcje procesu macierzystego
}
Kolejny program wykorzystuje funkcj¦ spawnl(). Funkcje z rodziny spawn *() daj¡ efekt wywoªania
sekwencji funkcji f ork() i exec *().
#include <stdio.h>
//schemat wykorzystania funkcji spawn
#include <process.h>
#include <sys/wait.h>
int main(void)
{
int pid,i,res,status;
char buf[10]
for(i=0;i<3;i++)
{
res = spawnl( P_NOWAIT, "myprog","myprog", itoa(i,buf,10), NULL );
if (res<0)
{
perror("Blad funkcji spawn");
exit(i);
}
}
while((pid=wait(&status))!=-1)
printf("Proces %d zakonczony, status %d\n",pid,WEXITSTATUS(status));
}
Pierwszy argument funkcji spawnl() okre±la tryb wykonania procesu potomnego, szczegóªowo opisany
w dokumentacji funkcji spawnl(). W linii 17 programu proces macierzysty zawiesza si¦ wykonuj¡c funkcj¦ wait() w oczekiwaniu na zako«czenie procesów potomnych. Sposób u»ycia funkcji wait() opisano
w pomocy.
1.3
Zako«czenie procesu
Przy prawidªowym zako«czeniu procesu powinno si¦ wykona¢ nast¦puj¡ce czynno±ci: Zako«czy¢ scenariusze komunikacyjne z innymi procesami, zwolni¢ zajmowane zasoby, zaczeka¢ na zako«czenie procesów
potomnych. Zako«czenie procesu nast¦puje gdy:
• W dowolnym miejscu kodu zostanie wywoªana funkcja exit()
• Funkcja main() wykona instrukcj¦ return lub ostatni¡ instrukcj¦ kodu
• Proces zostanie zako«czony przez system operacyjny lub inny proces maj¡cy stosowne uprawnie-
nia
Wywoªanie funkcji exit() powoduje zako«czenie procesu bie»¡cego. Przed zako«czeniem s¡ m.in. zwalniane zasoby oraz wykonywane funkcje zarejestrowane przy u»yciu funkcji atexit(). Funkcja exit()
przyjmuje jako parametr tzw. kod powrotu, którego najmªodszy bajt zostanie przekazany do funkcji
wait() (lub pokrewnej) wywoªanej przez proces macierzysty ko«czonego procesu.
PDW 2
3
Zarz¡dznie procesami QNX
Do synchronizacji zako«czenia procesów u»ywa si¦ funkcji wait() i waitpid(). Proces macierzysty
zawiesza si¦ wykonuj¡c funkcj¦ wait() w oczekiwaniu na zako«czenie którego± z procesów potomnych.
Po zako«czeniu któregokolwiek z procesów potomnych zwracany jest PID zako«czonego procesu oraz
status (przekazany przez funkcj¦ exit() wywoªan¡ w procesie potomnym). Gdy nie istniej¡ procesy
potomne, funkcja wait() zwraca warto±¢ -1.
Przy testowaniu statusu zako«czonego procesu korzysta si¦ z makr zdeniowanych w pliku sys/wait.h
i opisanych w dokumentacji funkcji wait().
PDW 2
4