gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control systemb638d78be7ec145eca749840ef0c81d5cdfc16ac
1 % skripta-os2.tex
2 % Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS
3 % Doni Pracner, Ivan Pribela
4 % 2011/12 -- 2013/14
10 % osnovne informacije koje ce se prikazati na naslovnoj strani,
11 % kao i u informacijama u generisanom pdfu
27 %change the default font
34 %podesavanja outputa za pdf verzije
47 %\usepackage{keystroke}
48 % ispod je dodata alternativa za ovaj paket
56 draw,
57 fill=white,
59 rectangle,
60 rounded corners=2pt,
61 inner sep=1pt,
62 line width=0.5pt,
63 font=\small\sffamily
65 ;
66 }
72 %margine
77 %customize the itemize environments
81 \olditemize
87 }
89 %% ovi redovi daju header i footer
93 %\fancyfoot[C]{\thepage}
104 %\renewcommand{\footrulewidth}{0.5pt}
105 %\addtolength{\headheight}{0.5pt} % make space for the rule
111 }
114 %promene u marginama:
115 %\setlength{\marginparwidth}{32pt}
116 %\setlength{\textwidth}{620pt}
117 %\setlength{\textheight}{620pt}
120 %% specijalni blokovi koji služe kao podsetnici u radu ili napomene
124 }
128 }
130 %boldovane skice visokog prioriteta
137 % ako je sledeci red odkomentarisan nista od skica nece biti ispisano
138 % u finalni dokument
143 \maketitle
145 % theorems, definition etc.
146 %''''''''''''''''''''''''''
157 basicstyle=\ttfamily,
158 showstringspaces=false,
159 breaklines=true
160 }
163 % basicstyle=\footnotesize\ttfamily,
164 keywordstyle=\textbf,
166 breakatwhitespace=true,
167 % prebreak=\P,
168 % postbreak=\ding{229}\space,
169 language=Modula-2,
170 xleftmargin=4em
171 }
174 frame=lt,
175 % frameround=fftt,
177 % prebreak=\P,
179 xleftmargin=2em
180 }
183 style=codeblock,
184 numbers=left,
185 firstnumber=1,
186 stepnumber=1
187 }
192 % ----------------==================--------------------------------------
193 % Pravi pocetak rada
196 Programi u ovoj skripti su testirani sa kompajlerom ``GNU Modula 2'' (u
198 sistemima iz Debian porodice.
200 \tableofcontents
202 \newpage
204 %\begin{multicols}{2}
210 (GCC). Podržava nekoliko dijalekata jezika ``Modula 2'' --
211 najznačajniji su ISO standard i nekoliko varijacija koje je originalni
214 dobijaju i besplatne ISO, PIM i još neke biblioteke.
219 Tradicionalni prvi program ``Hello World'' bi izgledao ovako:
221 MODULE hello;
223 FROM StrIO IMPORT WriteString, WriteLn;
225 BEGIN
226 WriteString('hello world');
227 WriteLn
228 END hello.
231 Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na
234 brojevima i tako dalje. Za pregled dostupnih biblioteka predlaže se
235 korišćenje zvanične stranice:
238 biblioteke.
240 Predpostavimo da je fajl napravljen u trenutnom direktorijumu,
242 ``joe'' koji se koristi na vežbama). Kreirani fajl se tada može
243 prevesti u izvršnu verziju sledećom komandom:
245 gm2 hello.mod
248 Ako je kod ispravan (kao onaj gore) u istom direktorijumu će se
251 ./a.out
254 direktorijuma (koji se označava tačkom). Ako je potrebno da
255 izvršni fajl ima neki drugi naziv može se koristiti poziv sledećeg
256 tipa:
258 gm2 -o imeIzlaznogFajla ulaznifajl
262 stranicu kompajlera.
263 %ovde je trebalo -{}- da razdvoji dva minusa, jer se inače tumače kao jedan.
267 Mapiranje procedura na sistemske pozive se može izvršiti preko
268 specijalnog definicionog modula koji u zaglavlju sadrži ključne reči
270 imenima sistemskih poziva i imaju parametre i povratne vrednosti
273 komande možemo videti sa
275 man system
278 odnosno videćemo da je poziv definisan na sledeći način:
280 int system(const char *command);
282 što znači da vraća ceo broj, a prima jedan argument koji je pokazivač
283 (što se označava *) na znak. Ovo je zapravo ceo string, pošto se u C
284 jeziku oni predstavljaju kao pokazivač na prvi znak, a string se onda
285 sastoji od svih sledećih znakova u memoriji dokle god se ne naiđe na
286 0C. Srećom, sve ovo se automatski mapira kreiranjem sledećeg modula:
289 DEFINITION MODULE FOR "C" Lib;
291 EXPORT UNQUALIFIED system;
293 PROCEDURE system(command: ARRAY OF CHAR): INTEGER;
295 END Lib.
298 Nije potrebno praviti prazne implementacione module. Iz ovakvog modula
299 se mogu uvoziti i koristiti procedure kao i iz bilo kakvog
300 ``normalnog'' modula, kao što se može videti u sledećem primeru, koju
301 od korisnika učitava stringove i pokušava da ih izvrši kao da su uneti
302 u komandnoj liniji, dokle god korisnik ne unese reč ``kraj'':
304 MODULE Zad2;
306 FROM StrIO IMPORT
307 ReadString, WriteString, WriteLn;
308 FROM StrLib IMPORT
309 StrEqual;
310 FROM Lib IMPORT
311 system;
313 TYPE
316 VAR
317 Komanda: String;
319 PROCEDURE Izvrsi(Komanda: ARRAY OF CHAR);
320 VAR
321 c: INTEGER;
322 BEGIN
323 c:= system(Komanda);
324 END Izvrsi;
326 BEGIN
327 WriteString("?> "); ReadString(Komanda);
328 WHILE NOT StrEqual(Komanda, "kraj") DO
329 Izvrsi(Komanda);
330 WriteString("?> "); ReadString(Komanda);
331 END;
332 END Zad2.
335 Prilikom mapiranja sistemskih poziva je moguće koristiti ``...'' na
336 kraju liste argumenata da se označi da je moguće proslediti
337 proizvoljan broj argumenata nakon navedenih, koji će biti premapirani
338 na odgovarajuće tipove podataka. Takođe je moguće i označiti da se
339 povratna vrednost procedure ne mora koristiti. U gornjem primeru je
343 vrednost.
345 Neki primeri pretvaranja tipova su dati u Tabeli~\ref{t-pretvaranje-tipova}, preuzetoj sa \url{http://www.nongnu.org/gm2/interface_to_c.html}.
350 Stvarni parametar & Konverzija & Tip vrednosti koji će biti prosleđen\\
351 \hline
352 123 & - & long long int\\
353 "hello world" & - & const char *\\
354 a: ARRAY OF CHAR & ADR(a) & char *\\
356 3.14 & - & long double
364 Korišćenje sistemskih poziva se može ilustrovati primerom čitanja
368 pokazivač kao ulazni parametar, a vraća pokazivač na slog koji
371 kraju i zatvara otvoreni direktorijum. Bitno je zatvarati otvorene
372 resurse jer je moguće da sistem odbije da otvori novi ako ih
373 proces već ima previše otvorenih.
375 Kada imamo imena stavki iz direktorijuma o njima možemo dobiti više
377 putanja do fajla, a drugi je pokazivač na strukturu u koju će komanda
378 upisati podatke. Obratiti pažnju da zbog ovoga struktura već mora
379 postojati u memoriji, ili kao lokalna promenljiva odgovarajućeg
380 slogovnog tipa, ili dinamički alocirana korišćenjem pokazivača na nju.
382 Budući da su u pitanju sistemski pozivi niskog nivoa, veličine tipova
383 su nažalost promenljive i mogu zavisiti od konkretnog operativnog
385 sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima.
390 DEFINITION MODULE FOR "C" Lib32;
391 FROM SYSTEM IMPORT
392 ADDRESS, BYTE;
393 EXPORT UNQUALIFIED opendir, readdir, closedir, stat,
394 PDir, DirEnt, PDirEnt, Stat, PStat, PInt;
398 (* types for 32 bit *)
399 TYPE
400 PDir = ADDRESS;
401 DirEnt = RECORD
402 ino: INTEGER;
403 off: INTEGER;
404 reclen: SHORTCARD;
405 type: BYTE;
407 END;
408 PDirEnt = POINTER TO DirEnt;
409 Stat = RECORD
410 dev: LONGINT;
411 ino: LONGINT;
412 mode: INTEGER;
413 nlink: LONGINT;
414 uid: INTEGER;
415 gid: INTEGER;
416 pad1: LONGINT;
417 rdev: INTEGER;
418 size: INTEGER;
419 blksize: INTEGER;
420 blocks: INTEGER;
421 atime: LONGINT;
422 mtime: LONGINT;
423 ctime: LONGINT;
424 END;
429 (* types for 64 bit *)
430 TYPE
431 PDir = ADDRESS;
432 DirEnt = RECORD
433 ino: LONGINT;
434 off: LONGINT;
435 reclen: SHORTCARD;
436 type: BYTE;
438 END;
439 PDirEnt = POINTER TO DirEnt;
440 Stat = RECORD
441 dev: LONGINT;
442 ino: LONGINT;
443 nlink: LONGINT;
444 mode: INTEGER;
445 uid: INTEGER;
446 gid: INTEGER;
447 pad1: INTEGER;
448 rdev: LONGINT;
449 size: LONGINT;
450 blksize: LONGINT;
451 blocks: LONGINT;
452 atime: LONGINT;
453 mtime: LONGINT;
454 ctime: LONGINT;
455 END;
459 PStat = POINTER TO Stat;
460 PInt = POINTER TO INTEGER;
462 PROCEDURE opendir(name: ARRAY OF CHAR): PDir;
463 PROCEDURE readdir(dirp: PDir): PDirEnt;
466 END Lib32.
470 MODULE Zad5;
472 FROM SYSTEM IMPORT
473 ADR;
474 FROM StrIO IMPORT
475 WriteString, WriteLn;
476 FROM NumberIO IMPORT
477 WriteInt;
478 FROM StrLib IMPORT
479 StrLen, StrConCat;
480 FROM Args IMPORT
481 Narg, GetArg;
482 FROM Lib32 IMPORT
483 opendir, readdir, closedir, stat, PDir, PDirEnt, Stat;
484 FROM errno IMPORT
485 geterrno;
487 TYPE
490 VAR
491 Putanja: String;
492 n, i: INTEGER;
493 ok: BOOLEAN;
495 PROCEDURE Listaj(Ime: ARRAY OF CHAR);
496 VAR
497 dir: PDir;
498 entry: PDirEnt;
499 info: Stat;
500 c: INTEGER;
501 Len: CARDINAL;
502 Putanja: String;
503 BEGIN
504 dir:= opendir(Ime);
505 IF dir = NIL THEN
506 WriteString("Folder "); WriteString(Ime); WriteLn;
507 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
508 WriteString(" Ne mogu da otvorim direktorijum."); WriteLn();
509 ELSE
510 Len:= StrLen(Ime);
512 StrConCat(Ime, "/", Ime);
513 END;
514 WriteString("Folder "); WriteString(Ime); WriteLn;
515 entry:= readdir(dir);
516 WHILE entry # NIL DO
518 StrConCat(Ime, entry^.name, Putanja);
519 c:= stat(Putanja, ADR(info));
520 WriteString(" ");
521 IF c = -1 THEN
522 WriteString("? ? KB");
523 ELSE
524 WriteInt(info.nlink, 3);
526 END;
527 WriteString(" "); WriteString(entry^.name); WriteLn;
528 END;
529 entry:= readdir(dir);
530 END;
531 c:= closedir(dir);
532 IF c = -1 THEN
533 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
534 WriteString(" Ne mogu da zatvorim direktorijum."); WriteLn();
535 END;
536 END;
537 END Listaj;
539 BEGIN
540 n:= Narg();
542 ok:= GetArg(Putanja, i);
543 WriteLn;
544 Listaj(Putanja);
545 END;
546 WriteLn;
547 END Zad5.
553 (``račva''). Novi proces je identičan sa originalnim, osim u svom
554 identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način:
556 PROCEDURE fork(): INTEGER;
559 Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu
560 koda. Jedino po čemu se razlikuju je vrednost koju je vratio
563 ``deteta'', i može se koristiti za komunikaciju sa detetom, a u novom
564 procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno
565 da dete i roditelj rade različite stvari, to se obično rešava kodom
566 sledećeg oblika:
568 pid := fork();
569 IF pid = 0 THEN
570 (* "detetove" operacije *)
571 ELSE
572 (* "roditeljske" operacije *)
573 END;
577 originalnom procesu sa efektom da se proces uspava dokle god neki od
578 procesa dece ne završi sa radom. Veća kontrola nad ovim ponašanjem se
580 koji proces čekamo da se završi.
582 U sledećim sekcijama će biti ilustrovano nekoliko klasičnih primera
583 organizacije procesa.
591 pid := 0;
592 i := 1;
593 WHILE (pid = 0) AND (i < n) DO
594 pid := fork();
595 IF pid # 0 THEN
596 (* ... *)
597 ELSE
598 INC(i);
599 END;
600 END;
608 {
610 }
614 }
622 pid := -1;
623 j := 0;
624 WHILE (pid # 0) AND (j < m) DO
625 pid := fork();
626 IF pid # 0 THEN
627 INC(j);
628 ELSE
629 (* ... *)
630 END;
631 END;
640 {
642 }
645 }
653 dubina := 1;
654 brdece := 0;
655 WHILE (dubina < maxdubina) AND
656 (brdece < potrebnodece) DO
657 pid := fork();
658 IF pid # 0 THEN
659 INC(brdece);
660 ELSE
661 INC(dubina);
662 brdece := 0;
663 END;
664 END;
673 ]
678 }}};
681 čvorovi prikazuju vrednosti pri kreiranju};
686 % ----------------------------------------------
688 \newpage
690 \appendix
695 Ova sekcija treba da omogući instalaciju kompajlera GNU Modula 2 na
696 već postojeći GNU Linux operativni sistem iz Debian porodice, koja
697 uključuje i sve varijante Ubuntu distribucije, kao i Linux Mint i
698 mnoge druge. Kompajler je moguće bez većih problema instalirati i na
699 bilo koji drugi Linux (a i OSX i Windows), kompajliranjem iz izvornog
700 koda, za šta preporučujemo konsultovanje sa zvaničnom stranicom
703 Ovo uputstvo neće ulaziti u detalje kako instalirati operativni
704 sistem. Za one koje koriste Windows i nisu sigurni kako da paralelno
705 instaliraju drugi operativni sistem, preporučujemo korišćenje
706 virtuelne mašine (npr besplatni Virtual Box,
708 lakše skinuti već instaliranu mašinu sa nekim od Debian sistema, npr
709 Ubuntu ili Kubuntu, ili eventualno neku manje zahtevnu verziju kao što
710 je Lubuntu, ako su performanse problematične.
714 Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je
715 dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim
718 #
719 # GNU Modula-2 repo
720 #
722 deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main
723 deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main
726 Alternativno se mogu koristiti sledeće komande:
729 sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
730 sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
733 Većina sistema omogućava i da se ovo uradi preko nekih grafičkih
734 alata.
736 Nakon dodavanja novog izvora za softver potrebno je u konzoli uraditi
737 sledeće:
739 sudo apt-get update
740 sudo apt-get install gm2-doc gm2
743 Po želji se može skinuti i izvorni kod kompajlera sledećom komandom:
745 sudo apt-get source gm2
752 Pri pokušaju kompajliranja se na nekim sistemima može desiti da
755 pošto postoji problem u pakovanju kompajlera, ali moguće je da utiče i
756 na neke druge sisteme.
758 Greška se ispravlja na sledeći način (korisnik treba da
759 ima administrativna prava, zato se radi ``sudo'') ukoliko
760 je u pitanju 64-bitni sistem:
762 sudo su
763 cd /usr/lib
764 ln -sv /usr/lib/x86_64-linux-gnu/crti.o crti.o
765 ln -sv /usr/lib/x86_64-linux-gnu/crt1.o crt1.o
766 ln -sv /usr/lib/x86_64-linux-gnu/crtn.o crtn.o
767 exit
770 Za 32-bitne sisteme važi ista ispravka, jedino što se u komandama
771 treba zameniti ``x86\_64'' sa ``i386''.
775 \newpage
779 Ukratko ćemo predstaviti editor ``joe''. Odabran je zbog svoje
780 rasprostranjenosti, potpune funkcionalnosti u tekstualnom modu rada
781 (korišćenje iz terminala) te vrlo jasnom sistemu pomoći koji se može
782 koristiti pri radu. Na nekim sistemima on dolazi već instaliran, a na
783 skoro svima se lako može dodati iz repozitorijuma. Na Ubuntu i sličnim
784 sistemima se ovo može uraditi sa:
786 sudo apt-get install joe
788 Ili analogno na drugim sistemima za instaliranje softvera.
790 Otvaranje postojećeg fajla ``hello.mod'' za uređivanje, odnosno
791 otvaranje novog praznog fajla u koji ćemo unositi odgovarajući kod ili
792 tekst se može postići sledećom komandom:
794 joe hello.mod
799 Joe je po svojoj prirodi bogat prečicama na tastaturi. U daljem tekstu
800 će biti navedene mnoge od njih. Kod svih se navodi redosled
801 pritiskanja tastera individualno, a ako su negde tasteri spojeni sa
802 ``+'' (alternativno sa ``-'') onda ih je potrebno pritisnuti
803 odjednom. Neki primeri:
816 U okviru sistema pomoći koji je ugrađen u sam editor uglavnom se
817 pojavljuju skraćeni oblici:
827 Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje
829 komandi u gornjem delu editora. Postoji nekoliko stranica ove pomoći
833 U okviru pomoći postoje maltene sve komande koje editor pruža, a na
834 kraju su čak uključene i ASCII tabele znakova. Preporučuje se makar
835 ovlašno upoznavanje sa stranicama pomoći i mogućnostima editora.
839 Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl
842 slučaja ``joe'' pita za ime fajla koji snimamo, pri čemu kao podrazumevanu
843 vrednost ponudi trenutno ime.
845 Joe može raditi sa više fajlova odjednom. Novi fajl se može otvoriti
847 polje za kucanje imena fajla koje dozvoljava i da se putanja
848 automatski dopunjava mogućnostima pritiskom na taster \Tab (Tab), baš
849 kao i u komandnoj liniji.
851 Prelazak na sledeći, odnosno prethodni, otvoreni fajl se dobija pritiskom
855 standardna komanda za ``ubijanje'' trenutnog procesa u terminalu), pri
856 čemu će ``joe'' pitati da li želimo da izađemo ako postoje promene
857 koje nisu snimljene. Ako je u pitanju bio jedini otvoren fajl, tada će
858 se i sam editor zatvoriti.
864 Premeštanje i kopiranje delova teksta je malo drugačije nego u
865 klasičnim grafičkim programima. Prvo je potrebno označiti željeni
867 početak bloka na trenutnu poziciju kursora, a \Ctrl
869 selekcija biti i vizuelno označena. Sada je moguće na proizvoljnom
870 mestu u istom ili drugom dokumentu pritisnuti \Ctrl
878 može odabrati više opcija za rad, kao što su margine, automatsko
880 sintaksno bojenje itd.
884 ``Joe'' ima mogućnosti i da podeli radnu površinu na nekoliko prozora
885 koji omogućavaju da se vidi više dokumenata, ili čak da se vide
886 različiti delovi istog dokumenta. Prozor se deli na dva komandom \Ctrl
890 sledeći, odnosno prethodni prozor se dobija pristikom na \Ctrl
893 omogućuje da se naizmenično vide svi prozori, ili samo jedan.
896 kao da se zaledio verovatno je problem što je stisnuta ``klasična''
898 ovom programu, a nažalost izaziva prekid osvežavanja ekrana. Efekat
904 \newpage
908 sistemom otvori terminal (konzola, komandna linija) na udaljenom UNIX
909 serveru. Može se naći online na
912 Po pokretanju se prikazuje dijalog u kome se može ukucati adresa
913 udaljenog računara i konfigurisati mnogi parametri. Najčešće je dosta
914 samo uneti adresu računara i pokrenuti konekciju. Nakon toga (ako je
915 uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i
916 lozinke.
921 Putty (kao i većina standardnih linux terminala koji koriste
923 može dovesti u stanje da ne prikazuje ispis unosa na ekranu, pritiskom
925 standardnom prečicom za snimanje u većini grafičkih aplikacija, pa se
926 može nehotično aktivirati. Iz ovog režima rada se može izaći prečicom
929 Do not press
930 Ctrl S
931 If you do
932 Ctrl Q
935 Smisao postojanja ovakve opcije je dobrim delom istorijski, iz vremena
936 kad su brzine protoka bile veoma male, i kada se štedelo time što bi
937 se privrmeno isključio protok kada nisu neophodne povratne
938 informacije, na primer kod komandi koje se dugo izvršavaju. Naravno
939 ovo ima svoje primene i danas kod slabijih veza, ili kod mobilnih veza
940 koje se plaćaju po protoku, a nekad se može i dobiti na brzini
941 izvršavanja programa, ako se ne gubi vreme na osvežavanje ekrana.
945 %\end{multicols}