Bosna i Hercegovina



#1 10.02.2011-15:22
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 9,489


Subject: Programiranje pod Linuxom
Programersko okruženje ili interfejs svako tumači na svoj način. Nekome je to grafičko point-to-click okruženje poput Kylixa ili Eclipse, a nekome ono podrazumijeva konzolu u starom duhu UNIX-a. Koji god alat koristili, Linux se sa svakim dobro slaže.
Prema tradicionalnom razmišljanju, okruženje za programiranje je ili grafičko ili tekstualno. Međutim, u Linuxu se ono često sastoji od servisa ili dodataka koje pruža sami sistem, odnosno kernel i osnovnih sistemskih komponenti. Nebitno koristite li mišem vođen IDE ili tekstualni editor i komandu make, Linux vam uvijek nameće određene uvjete, ali i daje brojne mogućnosti koje određuju što kôd kojeg pišete mora i može raditi. Na osnovu svega ovoga, interfejs za programiranje u Linuxu možemo svrstati u dvije grupe: grafički, koji koristi X Window sistem pomoću kojega prima i procesuira korisničke unose, i interfejs komandne linije, koji je čisti tekstualni interfejs koji uopće ne treba X Window sistem da bi radio. Naravno, uvijek postoje programi poput e-mail klijenta Pine koji će raditi bez obzira da li su X-i pokrenuti ili ne. Postoji i jedna posebna vrsta interfejsa, a to je API (Application programming Interface). API koristi strukturne metode za pisanje programa koji rade samo određene zadatke. Na primjer, ako želite napisati program koji će komunicirati TCP/IP mrežom, koristit ćete socket API, ili audio API za program koji će producirati zvuk. Kao što možete zaključiti, za rad ovih programa nije potreban IDE niti interfejs komandne linije. Za Linux slobodno možemo reći da trenutno ima najbogatije okruženje za programiranje među svim operativnim sistemima, pri čemu se misli na broj alata pomoću kojih je moguće programirati u nekom programskom jeziku.
Pozdrav
↑  ↓

#2 10.02.2011-15:22
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 9,489


Subject: Re: Programiranje pod Linuxom
Spomenuli smo da se Linuxovo razvojno okruženje sastoji od servisa ili dodataka koje pruža sami sistem, odnosno kernela i osnovnih sistemskih komponenti. U ovo spadaju biblioteke prepune pretkompajliranih funkcija koje su dio svake distribucije. Ovo sve postavlja granice i definira kako programirati pod Linuxom. Ali, krenimo od osnova. Sjećate se da Linux po uzoru na UNIX sve u svom fajl sistemu promatra kao fajl. Ovo vam je kao početnicima bilo nejasno i teško za razumjeti, ali upravo ovo drastično pojednostavljuje pisanje aplikacija. Kako? Jednostavno, jer na primjer, programer koristi istu write() funkciju za upis podataka u fajl, za slanje podataka printeru, kada tipka sa tastature šalje podatke aplikaciji, čak i kada dva uređaja komuniciraju preko mreže. Ovo je moguće jer Linux kao fajl promatra i modem i monitor i CD-ROM, i hard disk i miša i… Drajveri, ako ih možemo nazvati ovom terminologijom, su dio kernela i uvijek se nalaze između uređaja i korisnika ili aplikacije koja želi pristupiti tom uređaju. Kada primi naredbu poput write(), on ga prevodi u oblik koji taj uređaj razumije, što je često neki low-level jezik ili čak binarni zapis. Naravno, ovo ima i svojih loših strana, jer ukoliko ne postoji gore spomenuti drajver, onda vi ne možete slati uređaju nikakve naredbe. Pored toga što se sve promatra kao fajl, Linux ima i druge dobre strane poput procesnog modela, zaštite procesora i memorije, sigurnosni model, preemptivni multitasking, višekorisnički dizajn, međuprocesnu komunikaciju, te blok pristup. Nakon pomalo profesorskog pristupa, da vam objasnimo o čemu se radi.

Procesni model je način na koji Linux radi sa procesima. To je u stvari mogućnost Linux procesa da samostalno kreiraju podprocese, svoju djecu. To proces obavlja pomoću fork() naredbe pri čemu stvara identičnu kopiju samog sebe (osim PID-a), te ta kopija postaje dijete ili child proces.
Pozdrav
Ovaj komentar je mijenjan 1 puta. zadnja izmjena 10.02.2011-15:23 od strane zxz. ↑  ↓

#3 10.02.2011-15:24
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 9,489


Subject: Re: Programiranje pod Linuxom
Primjer:
DownloadIzvorni kod (C#):
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/wait.h>
  5. int main(int argc, char *argv[])
  6. {
  7.     pid_t child;
  8.     int status;
  9.     child = fork();
  10.     if (child == 0) {
  11.         printf(“unutar child proccesa\n”);
  12.         execl(/bin/ls”, “/bin/ls”, NULL);
  13.     } else {
  14.         printf(“unutar parent procesa\n”);
  15.         waitpid(child, &status, 0);
  16.     }
  17.     return 0;
  18. }

Pozdrav
↑  ↓

#4 10.02.2011-15:24
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 9,489


Subject: Re: Programiranje pod Linuxom
Nije bitno ako kôd ne razumijete, ali obratite pažnju na tri stvari:
child = fork(); - ovo kreira novi child proces
Kôd između if (child == 0) i else
izvršava se unutar child procesa, pri čemu child koristi naredbu exec() da bi pokrenuo program /bin/ls, odnosno da izlista sadržaj direktorija
waitpid() se izvršava od strane procesa roditelja (eng. parent) pri čemu vidimo da parent proces čeka da se child prekine da bi on nastavio sa radom.

Ako imate insaliran GCC kompajler (a trebali biste imati), onda kompajlirajte i pokrenite ovaj program komandom

$ gcc forkexec.c -o forkexec

$ ./forkexec

unutar parent procesa

unutar child procesa

neki-listing

Sljedeća stavka je zaštita procesora i memorije. Ona objašnjava kako je Linux operativni sistem u potpunosti odvojen od svih aplikacija. Jedino kernel radi u privilegiranom kernel modu poznatom kao ring 0, dok korisnički programi rade u korisničkom prostoru koji je u potpunosti van privilegiranog moda. Razlika je očigledna: kernel mod ima nekontrolirani pristup procesoru, RAM memoriji, periferijama. Ovdje postoji i jedan proces čuvar koji se zove syscall. Kada podaci idu od korisnika prema kernelu, on ih detaljno ispita prije nego što ih propusti. Zbog ovoga čuvara u Linux svijetu je skoro pa nepoznat pojam da korisnik sruši kernel, što je bio čest slučaj u prijašnjim verzijama Windows-a (blue screen of death). Pored ove podjele na modove, kernel i korisnički programi čak imaju i svoje vlastito područje u memoriji. U Linuxu postoji područje virtualne memorije od 4GB (na 32bitnim arhitekturama). Od ovoga, 1GB koristi kernel, dok ostalo koriste korisnički programi. Naravno, korisnički programi ne mogu direktno pristupiti kernelovom dijelu ove memorije. Do sada se sigurno već pitate kakve ovo ima veze sa programiranjem. Upravo zbog ove gore-opisane osobine, programeri Linux aplikacija mogu bez bojazni pisati svoj program jer znaju da i ako se program sruši, on neće i ne može srušiti sistem. Također, i kernel može vršiti određene radnje koje bi se inače morale izvršavati u korisničkom modu bez potrebe za dodatnim programiranjem. Na primjer, ako pravite HTTP server, u kernelu syscall interfejs omogućava da on komunicira sa HTTP serverom bez potrebe da koristite novi ili drugačiji interfejs za programiranje. Loša strana ovakve podjele je što sistemski administrator mora svaki put izričito dozvoliti ako korisnik treba pristupiti nekim dijelovima kernel moda, poput periferija i sličnoga.
Pozdrav
↑  ↓

#5 10.02.2011-15:25
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 9,489


Subject: Re: Programiranje pod Linuxom
Sigurnosni model. Stara je priča kako u Linuxu postoje korisnici i root. Root može raditi sve, a korisnici samo ono što im root dozvoli. Ista ovakva ograničenja postoje i u okruženjima za programiranje. Na primjer, ako programirate program i morate pristupiti kernel modu preko sistemske komande, to nećete moći uraditi ukoliko program niste pokrenuli kao root. Također, kada program kreira svoje fajlove, defaultne permisije na fajlovima kontrolira umask korisnika koji je pokrenuo program. Ukoliko je program smješten u nekom direktoriju kojem korisnik nema pravo pristupa, korisnik neće moći program niti pokrenuti. Da posao oko permisija ne bi administratoru zadavao muke, programer može program kodirati tako da on u run-time modu dodaje ili oduzima permisije korisniku. Ovo prebacuje teret na programera koji o permisijama mora voditi računa prilikom programiranja. Međutim, da korisnik ne bi program pokretao kao root svaki put kada želi raditi nešto u kernel modu (za što često nema ni ovlasti), biblioteke nekog “zabranjenog” uređaja daju programerima pristup do posebnog interfejsa preko kojeg onda programer pristupa kernel modu bez potrebe da program pokrene kao root.
Pozdrav
↑  ↓

#6 10.02.2011-15:25
zxz Offline
Administrator
Registrovan/a od: 03.02.2009-16:22
Komentari: 9,489


Subject: Re: Programiranje pod Linuxom
Preemtivni multitasking. Iza ovog pojma krije se osobina zbog kojeg se nama kao korisnicima čini da procesor u isto vrijeme radi sa više zadataka. Međutim, CPU u jednom trenutku može raditi samo sa jednim zadatkom. Zbog toga on na sebe preuzima desetke ili čak stotine zadataka, i na svakom zadatku radi po nekoliko milisekundi, pa onda pređe na sljedeći. Zbog toga se nama čini da CPU sve to radi u isto vrijeme. Ovakva raspodjela vremena, odnosno prekidanje rada na jednom procesu i početak rada na drugom, naziva se preemtivni multitasking. Ali ne obavlja sav posao samo CPU. Iako program ili proces ne može zatražiti da baš on u danom trenutku koristi CPU, program može dati svoje vrijeme nekom drugom programu ili procesu. Zbog ovoga, programer može odgoditi izvršenje jednog dijela kôda da bi se izvršio kritičniji dio kôda. Ovo se radi pomoću funkcije sched_yield(). Koliko je nama kao korisniku preemtivni multitasking odličan, on isto toliko stvara probleme programeru. Naime, multitasking može programeru stvoriti tri vrste problema:
slijepe ulice (eng. deadlock) koje nastaju kada dva ili više procesa ne mogu nastaviti svoj rad jer oba ili svi čekaju da ovaj drugi nešto uradi. Ovo se može dogoditi zbog više razloga, na primjer kad server šalje programu zahtjev da ovaj nešto uradi prije nego što je obavio zadatak koji mu je program prethodno proslijedio ili kada nisko prioritetni programi nikada ne dođu na red za CPU jer ih stalno preplavljuju programi većeg prioriteta ili kada dva programa pokušavaju u isto vrijeme jedan drugom slati podatke, ali to ne mogu jer niti jedan ne može primiti poruku drugoga pošto mu se napunio bafer odlazećim podacima.
Prometne ulice (eng. livelock) nastaju kada program serveru konstantno šalje nove zadatke pa ovaj nikako ne može završiti sa radom tj. ne može očistiti svoj queue. Razlika od slijepih ulica je što je u gornjem slučaju queue procesa prazan, dok ovdje procesi imaju previše posla.
Trke; one nastaju kada jedan proces koji zavisi od drugoga počne obavljati taj posao prije nego što je drugi proces završio. Na primjer, proces za pisanje i čitanje podataka pristupaju fajlu i ovaj problem nastaje kada proces čitanja počne čitati fajl prije nego je proces pisanja završio sav upis u fajl.
Pozdrav
↑  ↓

Stranice (1): 1


All times are GMT +01:00. Current time: 23.11.2017-08:31.