X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=os2skripta.git;a=blobdiff_plain;f=skripta-os2.tex;h=b638d78be7ec145eca749840ef0c81d5cdfc16ac;hp=0e1509ab9b5d1be1ff1f0b9fcab84ed9a5248083;hb=ad7a88f8f2fd398ea67f5ea1beadb46ddde4efdd;hpb=41cc70ce0ff901eedb90c5d365f43d907f54ed42 diff --git a/skripta-os2.tex b/skripta-os2.tex index 0e1509a..b638d78 100644 --- a/skripta-os2.tex +++ b/skripta-os2.tex @@ -1,6 +1,7 @@ % skripta-os2.tex % Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS -% 2011/2012 +% Doni Pracner, Ivan Pribela +% 2011/12 -- 2013/14 \documentclass[a4paper,twoside]{article} \usepackage[T1]{fontenc} @@ -12,8 +13,8 @@ \newcommand{\inst}{Departman za matematiku i informatiku, PMF, UNS} \newcommand{\autorinst}{\autor \\ \inst} \newcommand{\naslov}{Skripta za vežbe iz predmeta operativni sistemi 2} -\newcommand{\datum}{April 2012, Novi Sad} -\newcommand{\verzija}{ver 12d} +\newcommand{\datum}{Februar 2014, Novi Sad} +\newcommand{\verzija}{ver 14a} \usepackage[serbian]{babel} \usepackage{fancyhdr} @@ -25,10 +26,10 @@ %change the default font \usepackage{lmodern} +\usepackage{beramono} \renewcommand{\familydefault}{\sfdefault} \usepackage{pifont} -\usepackage{keystroke} %podesavanja outputa za pdf verzije \usepackage[bookmarks,pdffitwindow=false,unicode=true,% @@ -43,13 +44,33 @@ pdfauthor={\autor}% \usepackage{latexsym} \usepackage{multicol} +%\usepackage{keystroke} +% ispod je dodata alternativa za ovaj paket + \usepackage{tikz} +\usetikzlibrary{shadows} + +\newcommand*\keystroke[1]{% + \tikz[baseline=(key.base)] + \node[% + draw, + fill=white, + drop shadow={shadow xshift=0.2ex,shadow yshift=-0.2ex,fill=black,opacity=0.75}, + rectangle, + rounded corners=2pt, + inner sep=1pt, + line width=0.5pt, + font=\small\sffamily + ](key) {#1\strut} + ; +} + +\newcommand*\Ctrl{\keystroke{Ctrl}} +\newcommand*\Tab{\keystroke{Tab}} +\newcommand*\Esc{\keystroke{Esc}} %margine -%experiment -%\usepackage[top=2.5cm, bottom=1.5cm, left=2cm, right=1cm]{geometry} -%staro: -\usepackage[top=1.5cm, bottom=1cm, left=2cm, right=1cm]{geometry} +\usepackage[top=2cm, bottom=2cm, left=2.5cm, right=2cm]{geometry} \begin{document} @@ -70,19 +91,23 @@ pdfauthor={\autor}% \renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} \fancyhf{} % delete current setting for header and footer %\fancyfoot[C]{\thepage} + \fancyhead[LO]{\bfseries\rightmark} \fancyhead[RO]{\thepage} + \fancyhead[RE]{Operativni sistemi 2 -- skripta} \fancyhead[LE]{\thepage} + \renewcommand{\headrulewidth}{0.5pt} \renewcommand{\headwidth}{\textwidth} + %\renewcommand{\footrulewidth}{0.5pt} %\addtolength{\headheight}{0.5pt} % make space for the rule \fancypagestyle{plain}{% -\fancyhead{} % get rid of headers on plain pages -\fancyfoot{} -\renewcommand{\headrulewidth}{0pt} % and the line -\renewcommand{\footrulewidth}{0pt} % and the line + \fancyhead{} % get rid of headers on plain pages + \fancyfoot{} + \renewcommand{\headrulewidth}{0pt} % and the line + \renewcommand{\footrulewidth}{0pt} % and the line } \renewcommand{\headheight}{15pt} @@ -129,13 +154,13 @@ pdfauthor={\autor}% \lstloadlanguages{Modula-2,C++} \lstset{ - basicstyle=\footnotesize\ttfamily, + basicstyle=\ttfamily, showstringspaces=false, breaklines=true } \lstdefinestyle{codeblock}{ - basicstyle=\footnotesize, +% basicstyle=\footnotesize\ttfamily, keywordstyle=\textbf, columns=[l]fixed, breakatwhitespace=true, @@ -146,9 +171,12 @@ pdfauthor={\autor}% } \lstdefinestyle{terminal}{ - frame=l, + frame=lt, % frameround=fftt, - xleftmargin=4em + backgroundcolor=\color[gray]{.95}, +% prebreak=\P, + postbreak=\ding{229}\space, + xleftmargin=2em } \lstdefinestyle{numcodeblock}{ @@ -171,12 +199,20 @@ sistemima iz Debian porodice. \tableofcontents -%\newpage %necemo jos da prelamamo ovde +\newpage %\begin{multicols}{2} \section{GNU Modula 2} +\emph{GNU Modula 2} (u daljem tekstu često skraćeno na \emph{gm2}) je +pred procesor (\emph{front end}) za GNU kolekciju kompajlera +(GCC). Podržava nekoliko dijalekata jezika ``Modula 2'' -- +najznačajniji su ISO standard i nekoliko varijacija koje je originalni +autor Niklaus Virt (\emph{Niklaus Wirth}) opisao u različitima +verzijama knjige \emph{Programming in Modula 2 (PIM)}. Uz kompajler se +dobijaju i besplatne ISO, PIM i još neke biblioteke. + \subsection{Prvi program u gm2 } \label{g-prvi-program} @@ -193,27 +229,30 @@ Tradicionalni prvi program ``Hello World'' bi izgledao ovako: \end{codeblock} Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na -XDS/TopSpeed verzije M2, tamo je sve bilo u \kod{InOut}, dok ovde -koristimo \kod{StrIO} za rad sa stringovima, \kod{NumberIO}, za rad sa +XDS/TopSpeed verzije M2, tamo je sve bilo u \kod{InOut}, dok se ovde +koristi \kod{StrIO} za rad sa stringovima, \kod{NumberIO} za rad sa brojevima i tako dalje. Za pregled dostupnih biblioteka predlaže se korišćenje zvanične stranice: \url{http://nongnu.org/gm2/libraries.html}, odnosno \url{http://nongnu.org/gm2/base_libraries.html} za samo osnovne biblioteke. -Predpostavimo da smo ga napravili u trenutnom direktorijumu, koristeći -neki tesktualni editor (u dodatku~\ref{app-joe} je opisan ``joe'' koji -koristimo na vežbama). Kreirani fajl se može prevesti u izvršnu -verziju sledećom komandom: +Predpostavimo da je fajl napravljen u trenutnom direktorijumu, +koristeći neki tesktualni editor (u dodatku~\ref{app-joe} je opisan +``joe'' koji se koristi na vežbama). Kreirani fajl se tada može +prevesti u izvršnu verziju sledećom komandom: \begin{terminal} gm2 hello.mod \end{terminal} Ako je kod ispravan (kao onaj gore) u istom direktorijumu će se -napraviti fajl \kod{a.out}, koji se može pokrenuti sa \kod{./a.out}, -pri čemu naglašavamo da hoćemo da pokrenemo program iz trenutnog -direktorijuma koji se označava tačkom. Ako želimo da napravimo -izvršni fajl pod nekim drugim nazivom možemo koristiti poziv sledećeg +napraviti fajl \kod{a.out}, koji se može pokrenuti sa: +\begin{terminal} + ./a.out +\end{terminal} +pri čemu \kod{./} naglašava da hoćemo da pokrenemo program iz trenutnog +direktorijuma (koji se označava tačkom). Ako je potrebno da +izvršni fajl ima neki drugi naziv može se koristiti poziv sledećeg tipa: \begin{terminal} gm2 -o imeIzlaznogFajla ulaznifajl @@ -303,8 +342,22 @@ mogla funkcija da se definiše kao \kod{PROCEDURE system(command: ARRAY bez korišćenja pomoćne promenljive \kod{c} da se dobije povratna vrednost. -Tabela pretvaranja tipova se može videti na -\url{http://www.nongnu.org/gm2/interface_to_c.html} +Neki primeri pretvaranja tipova su dati u Tabeli~\ref{t-pretvaranje-tipova}, preuzetoj sa \url{http://www.nongnu.org/gm2/interface_to_c.html}. + +\begin{table}[htp] +\begin{center} +\begin{tabular}{lll} +Stvarni parametar & Konverzija & Tip vrednosti koji će biti prosleđen\\ +\hline +123 & - & long long int\\ +"hello world" & - & const char *\\ +a: ARRAY OF CHAR & ADR(a) & char *\\ +a: ARRAY [0..5] OF CHAR& ADR(a) & char *\\ +3.14 & - & long double +\end{tabular} +\end{center} +\caption{Tabela pretvaranja tipova\label{t-pretvaranje-tipova}} +\end{table} \subsubsection{Primer: Izlistavanje sadržaja direktorijuma} @@ -330,8 +383,8 @@ Budući da su u pitanju sistemski pozivi niskog nivoa, veličine tipova su nažalost promenljive i mogu zavisiti od konkretnog operativnog sistema, a naročito utiče da li je u pitanju~32--bitni, ili~64--bitni sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima. -Prva je testirana na Lubuntu 11.10 32bit, a druga je testirana na -Kubuntu 11.10 64bit. +Prva je testirana na Lubuntu 11.10 i 12.04 32bit, a druga je testirana +na Kubuntu 11.10 i 12.10 64bit. \begin{codeblock} DEFINITION MODULE FOR "C" Lib32; @@ -597,15 +650,16 @@ END; \begin{minipage}{0.6\textwidth} \begin{codeblock} -i := 1; -j := 0; -WHILE (i < n) AND (j < m) DO +dubina := 1; +brdece := 0; +WHILE (dubina < maxdubina) AND + (brdece < potrebnodece) DO pid := fork(); IF pid # 0 THEN - INC(j); + INC(brdece); ELSE - INC(i); - j:=0; + INC(dubina); + brdece := 0; END; END; \end{codeblock} @@ -613,14 +667,18 @@ END; \begin{minipage}{0.4\textwidth} \begin{tikzpicture} [proc/.style={circle,draw}, -level 1/.style={sibling distance=20mm,level distance=10mm}, -level 2/.style={sibling distance=10mm,font=\scriptsize} +level 1/.style={sibling distance=28mm,level distance=10mm}, +level 2/.style={sibling distance=14mm,font=\scriptsize}, +level 3/.style={sibling distance=6mm,font=\tiny} ] -\node[proc] (root) {0} -child[->] foreach \x in {1,2} {node[proc] {\x} - child foreach \y in {1,2} {node[proc] {\x-\y} - }}; - +\node[proc] (root) {1-0} +child[->] foreach \x in {0,1} {node[proc] {1-\x} + child foreach \y in {0,1} {node[proc] {2-\y} + child foreach \z in {0,1} {node[proc] {3-\z} + }}}; + +\node[text width=0.9\textwidth] (desc) at (0,-4) {maxdubina=4, potrebnodece=2, +čvorovi prikazuju vrednosti pri kreiranju}; \end{tikzpicture} \end{minipage} @@ -668,8 +726,8 @@ deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main Alternativno se mogu koristiti sledeće komande: \begin{terminal} -add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main" -add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main" +sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main" +sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main" \end{terminal} Većina sistema omogućava i da se ovo uradi preko nekih grafičkih @@ -714,6 +772,7 @@ treba zameniti ``x86\_64'' sa ``i386''. \skica{možda i build from source} +\newpage \section{Tekst editor Joe} \label{app-joe} @@ -728,39 +787,121 @@ sudo apt-get install joe \end{terminal} Ili analogno na drugim sistemima za instaliranje softvera. -Otvoranje postojećeg fajla ``hello.mod'' za uređivanje, -odnosno otvaranje novog praznog fajla u koji ćemo unositi -odgovarajući kod ili tekst se može postići sledećom komandom: +Otvaranje postojećeg fajla ``hello.mod'' za uređivanje, odnosno +otvaranje novog praznog fajla u koji ćemo unositi odgovarajući kod ili +tekst se može postići sledećom komandom: \begin{terminal} joe hello.mod \end{terminal} -Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl -+\keystroke{K}\keystroke{X} (\emph{ctrl} i \emph{K} odjednom, pa onda -\emph{X}, ova šema pritiskanja tastera važi za sve prečice), dok se -samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba -slučaja joe pita za ime fajla koji snimamo, pri čemu kao podrazumevanu -vrednost ponudi trenutno ime. Brz izlaz iz editora je moguć i sa -\Ctrl+\keystroke{C} (što je i standardna komanda za ``ubijanje'' -trenutnog procesa u terminalu), pri čemu će joe pitati da li želimo da -izađemo ako postoje promene koje nisu snimljene. +\subsection{Tumačenje prečica na tastaturi} + +Joe je po svojoj prirodi bogat prečicama na tastaturi. U daljem tekstu +će biti navedene mnoge od njih. Kod svih se navodi redosled +pritiskanja tastera individualno, a ako su negde tasteri spojeni sa +``+'' (alternativno sa ``-'') onda ih je potrebno pritisnuti +odjednom. Neki primeri: + +\begin{itemize} +\item \Ctrl +\keystroke{\_} (poništavanje poslednje promene) pristsak + na taster \emph{CTRL} i \emph{\_ (podvlaka)} odjednom. +\item \Ctrl +\keystroke{K}\keystroke{H} (otvaranje sistema pomoći) + pritisak na \emph{CTRL} i \emph{K} odjednom, odpustiti sve, pa onda + pritisak na \emph{H}. +\item \Esc \keystroke{,} (prelazak na sledeću stranu pomoći) + pritisak na taster \emph{Escape}, a nakon toga pritisak na taster + \emph{, (zarez)}. +\end{itemize} + +U okviru sistema pomoći koji je ugrađen u sam editor uglavnom se +pojavljuju skraćeni oblici: +\begin{itemize} +\item \^{}D isto što i ``Ctrl-D'' +\item \^{}KH isto što i ``Ctrl-K H'' +\item \^{}[. isto što i ``Esc .'' +\end{itemize} + + +\subsection{Sistem pomoći} Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje kombinacije \Ctrl +\keystroke{K}\keystroke{H}, koja daje spisak komandi u gornjem delu editora. Postoji nekoliko stranica ove pomoći -kroz koje se može kretati sa \Esc \keystroke{.} i \Esc \keystroke{,}. +kroz koje se može kretati sa \Esc \keystroke{.} (tačka) i \Esc +\keystroke{,} (zarez). + +U okviru pomoći postoje maltene sve komande koje editor pruža, a na +kraju su čak uključene i ASCII tabele znakova. Preporučuje se makar +ovlašno upoznavanje sa stranicama pomoći i mogućnostima editora. + +\subsection{Rad sa fajlovima} + +Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl ++\keystroke{K}\keystroke{X}, dok se +samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba +slučaja ``joe'' pita za ime fajla koji snimamo, pri čemu kao podrazumevanu +vrednost ponudi trenutno ime. + +Joe može raditi sa više fajlova odjednom. Novi fajl se može otvoriti +sa \Ctrl +\keystroke{K}\keystroke{E}. Na dnu editora će se pojaviti +polje za kucanje imena fajla koje dozvoljava i da se putanja +automatski dopunjava mogućnostima pritiskom na taster \Tab (Tab), baš +kao i u komandnoj liniji. -U okviru pomoći stoje i komande za označavanje blokova teksta i -njihovo nakndadno premeštanje, kopiranje ili brisanje. Pritiskom na -\Ctrl+\keystroke{\_} se vraća poslednja promena (undo). +Prelazak na sledeći, odnosno prethodni, otvoreni fajl se dobija pritiskom +na \Esc \keystroke{V}, odnosno \Esc \keystroke{U}. + +Zatvaranje fajla je moguće sa \Ctrl+\keystroke{C} (što je i +standardna komanda za ``ubijanje'' trenutnog procesa u terminalu), pri +čemu će ``joe'' pitati da li želimo da izađemo ako postoje promene +koje nisu snimljene. Ako je u pitanju bio jedini otvoren fajl, tada će +se i sam editor zatvoriti. + +\subsection{Rad sa tekstom} + +Pritiskom na \Ctrl+\keystroke{\_} se poništava poslednja promena (undo). + +Premeštanje i kopiranje delova teksta je malo drugačije nego u +klasičnim grafičkim programima. Prvo je potrebno označiti željeni +tekst u dva koraka: \Ctrl +\keystroke{K}\keystroke{B} postavlja +početak bloka na trenutnu poziciju kursora, a \Ctrl ++\keystroke{K}\keystroke{K} postavlja kraj bloka, nakon čega će +selekcija biti i vizuelno označena. Sada je moguće na proizvoljnom +mestu u istom ili drugom dokumentu pritisnuti \Ctrl ++\keystroke{K}\keystroke{C} da bi se iskopirao označeni blok, odnosno +\Ctrl +\keystroke{K}\keystroke{M} da bi se on premestio. +Komanda \Ctrl +\keystroke{K}\keystroke{Y} briše odabrani blok. + +Pretraga dokumenta se započinje sa \Ctrl +\keystroke{K}\keystroke{F}. Pritiskom na \Ctrl +\keystroke{T} se dobija meni sa opcijama u kome se može odabrati više opcija za rad, kao što su margine, automatsko prelamanje redova, očuvanje uvlačenja redova (\emph{auto-indent}), sintaksno bojenje itd. +\subsection{Rad sa prozorima} + +``Joe'' ima mogućnosti i da podeli radnu površinu na nekoliko prozora +koji omogućavaju da se vidi više dokumenata, ili čak da se vide +različiti delovi istog dokumenta. Prozor se deli na dva komandom \Ctrl ++\keystroke{K}\keystroke{O}. Veličina trenutnog prozora se potom može +povećavati (\Ctrl +\keystroke{K}\keystroke{G}) ili smanjivati (\Ctrl ++\keystroke{K}\keystroke{T}) na uštrb drugih prozora. Prelazak na +sledeći, odnosno prethodni prozor se dobija pristikom na \Ctrl ++\keystroke{K}\keystroke{N}, odnosno na \Ctrl ++\keystroke{K}\keystroke{P}. Komanda \Ctrl +\keystroke{K}\keystroke{I} +omogućuje da se naizmenično vide svi prozori, ili samo jedan. + +\subsection{Problem: ``zamrzavanje'' pri snimanju} ako editor izgleda +kao da se zaledio verovatno je problem što je stisnuta ``klasična'' +kombinacija za snimanje \Ctrl + \keystroke{S} koja ne radi u +ovom programu, a nažalost izaziva prekid osvežavanja ekrana. Efekat +se poništava pritiskom na \Ctrl + \keystroke{Q}. Za više detalja +pogledati Glavu~\ref{g-smrzavanje}. + \skica{joe i sintaksno bojenje za m2} +\newpage \section{Putty} \emph{Putty} je program koji služi da se pod Windows operativnim @@ -775,13 +916,15 @@ uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i lozinke. \subsection{Problem: terminal ne odgovara na unos, ``smrznuo'' se} - -Putty se može dovesti u stanje da ne prikazuje ispis unosa na ekranu, -pritiskom na \Ctrl+\keystroke{S} (što je često velik problem jer se -poklapa sa standardnom prečicom za snimanje u većini grafičkih -aplikacija). Iz ovog režima rada se može izaći prečicom -\Ctrl+\keystroke{Q}. -Ukratko: +\label{g-smrzavanje} + +Putty (kao i većina standardnih linux terminala koji koriste +softversku kontrolu toka podataka \emph{software flow control}) se +može dovesti u stanje da ne prikazuje ispis unosa na ekranu, pritiskom +na \Ctrl+\keystroke{S}. Ovo je često velik problem jer se poklapa sa +standardnom prečicom za snimanje u većini grafičkih aplikacija, pa se +može nehotično aktivirati. Iz ovog režima rada se može izaći prečicom +\Ctrl+\keystroke{Q}. Ukratko: \begin{lstlisting}[xleftmargin=10em] Do not press Ctrl S @@ -789,6 +932,14 @@ If you do Ctrl Q \end{lstlisting} +Smisao postojanja ovakve opcije je dobrim delom istorijski, iz vremena +kad su brzine protoka bile veoma male, i kada se štedelo time što bi +se privrmeno isključio protok kada nisu neophodne povratne +informacije, na primer kod komandi koje se dugo izvršavaju. Naravno +ovo ima svoje primene i danas kod slabijih veza, ili kod mobilnih veza +koje se plaćaju po protoku, a nekad se može i dobiti na brzini +izvršavanja programa, ako se ne gubi vreme na osvežavanje ekrana. + \skica{literatura i linkovi izdovjeni na kraju dokumenta} %\end{multicols}