Advertisement
garnettkg

os2

Nov 29th, 2015
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Generalni pregled UNIX sistema
  2.  
  3.  
  4.  
  5. Pojavio se 1969
  6.  
  7. Od svoje pojave , UNIX je postao krajnje popularan
  8.  
  9. funkcioniše na velikom broju računara - CPU
  10. sa različitom procesorskom snagom
  11. od mikroprocesora
  12. do mainframe mašina
  13.  
  14. OS2 će obuhvatiti pregled UNIX System V + (Linux)
  15.  
  16.  
  17. 1965 Bell + General Electric Company + Project MAC
  18. razvijali su novi operativni system MULTICS
  19. (Multiplexed Information and Computing Service)
  20. sa ciljem da to bude moćan OS za veliki broj korisnika.
  21.  
  22. Iz tog projekta nastao je OS UNIX, 1969,
  23. Ken Thomson, Dennis Ritchie
  24. najpre za processor PDP-7,
  25. a potom za PDP-11 1971,
  26. sa skromnim hardverskim mogućnostima.
  27. (16K za UNIX, 8K za korisničke programe, disk veličine 512K, file limit 64K)
  28.  
  29. Dennis Ritchie
  30. je napisao novi PL koga je nazvao C,
  31. koji realizuje mašinski kod, deklaraciju tipova podataka i definiciju struktura podataka.
  32. 1973. godine, prepisali su UNIX na C.
  33.  
  34. Kasnije se UNIX razvijao:
  35. UNIX System III
  36. UNIX System V
  37. BSD UNIX (paralelna generacija UNIX-a)
  38.  
  39. Ovde će se uglavnom obrađivati UNIX System V
  40. DEC PDP-11 - A 16-bit successor to the PDP-8 also utilizing byte addressable memory. The PDP series was an extremely popular computer due to low cost and good performance. Its 16-bit address space caused it to decline in popularity as large memories became cheaply available with the introduction of VSLI technology. This picture is of Dennis Ritchie and Kenneth Thompson, creators of the UNIX operating system, at a PDP-11. (1970)
  41.  
  42. WASHINGTON, D.C. (April 27, 1999) -- Dennis Ritchie and Ken Thompson of Bell Labs received the U.S. National Medal of Technology today from President Bill Clinton at ceremonies televised at the White House.
  43. MULTICS
  44. Multiplexed Information and Computing Service
  45.  
  46. UNICS
  47. Uniplexed Information and Computing Service
  48.  
  49. UNIX
  50. Radi lakšeg izgovora i pisanja
  51. ime UNICS je kasnije evoluiralo u UNIX
  52. Prvi UNIX razvijen 1969
  53. glavni kreatori: Ken Thompson & Dennis Ritchie
  54. Research Group iz Bell Laboratories
  55. sa ugrađenim funkcijama drugih OS
  56. posebno MULTICS OS
  57.  
  58. III UNIX verzija napisana u C jeziku
  59. koji je takođe razvijen u Bell Labs
  60. sa posebnom podrškom za UNIX
  61.  
  62. Najuticajniji UNIX
  63. koji ne pripada Bell LAbs (non-Bell Labs) and
  64. koji ne spada u familiju AT&T UNIX (non-AT&T UNIX development groups)
  65. je BSD UNIX, University of California at Berkeley (Berkeley Software Distributions)
  66.  
  67. 4BSD UNIX je nastao iz DARPA zahteva
  68. da se razvije standard UNIX OS
  69. koji će se koristiti za SAD vladu (USA for government)
  70. Razvijen za VAX CPU
  71. 4.3BSD je jedna od najuticajnijih verzija
  72. portiran je na mnoge druge platforme.
  73. Prvu verziju UNIX-a je 1969. godine
  74. razvio Ken Thompson iz istraživačke grupe Bellovih laboratorija,
  75. da bi se koristio na računaru PDP-7
  76. (računar koji nije imao neku naročitu primenu u to vreme).
  77. Ubrzo, njemu se pridružio Dennis Ritchie.
  78. Thompson, Ritchie i drugi članovi istraživačke grupe su napravili prvu verziju UNIX-a.
  79.  
  80. Ritchie je predhodno radio na MULTICS projektu, I MULTICS je imao veliki uticaj na novonastali operativni sistem. Čak je i ime UNIX igrom reči nastao od MULTICS.
  81. Osnovna organizacija fajl sistema
  82. ideja da komandni interpretator bude korisnički proces
  83. korišćenje zasebnog procesa sa svaku komandu
  84. originalni način editovanja karaktera
  85. (# da se izbriše poslednji karakter a @ za brisanje celog reda)
  86. brojne druge osobine dolaze dirketno od MULTICS-a
  87.  
  88. Takođe su korišćene ideje iz nekih drugih operativnih sistema, kao npr. MIT-ov CTSS i XDS-940.
  89. Ritchie i Thompson su radili na UNIX-u bez publiciteta godinama. Njihov rad na prvoj verziji im je omogućio da ga prebace na PDP-11/20 u drugoj verziji.
  90.  
  91. U trećoj verziji, ponovo su pisali većinu koda, ali sad na programskom jeziku C, a ne kao pre u asembleru. C je razvijen u Bellovim laboratorijama zbog UNIX-a. UNIX je prebačen na veće PDP-11 modele, kao što su 11/45 i 11/70. Multiprogramiranje i ostale prednosti su dodate kad je sistem ponovo napisan u C-u, i prebačen na sisteme (kao npr. 11/45) koji su imali hardversku podršku za multiprogramiranje.
  92.  
  93. Kako se UNIX razvijao, postao je široko upotrebljivan u Bellovim laboratorijama i postepeno se preneo na nekoliko univerziteta. Prva verzija koja je bila puštena van Bellovih laboratorija je verzija 6, izbačena 1976. (Broj Verzije za prve UNIX sisteme odgovara broju UNIX-ovog programerskog uputstva – UNIX Programmer’s Manual, koji je bio aktuelan u trenutku distribucije izdanja; kod i uputstva su razvijani nezavisno).
  94.  
  95. U 1978 je izbačena verzija 7, koja je radila na PDP-11/70 i na Interdati 8/32, i to je predak većine modernih UNIX sistema. Tačnije, verzija 7 je uskoro puštena na ostale PDP-11 modele i na VAX kompjutere. Verzija za VAX je nosila oznaku 32V. Posle toga je nastavljen rad na UNIX projektu.
  96. Posle distribucije verzije 7 u 1978. godini, UNIX Support Group (USG) je preuzela kontrolu i odgovornost za UNIX. UNIX sad postaje proizvod, a ne samo alat za istraživanje. Ipak, istraživačka grupa nastavlja da pravi svoje verzije UNIX-a, za svoje unutrašnje potrebe.
  97. Nastaje verzija 8, koja ima nešto što se zove stream I/O system, koji omogućuje fleksibilnu konfiguraciju kernelovih IPC modula. Ova verzija sadrži i RFS (remote file system), sličan Sun-ovom NFS-u. Posle toga dolaze verzija 9 i 10 (poslednja verzija postoji samo u Bellovim laboratorijama).
  98.  
  99. USG je uglavnom pružao podršku za UNIX unutar AT&T.
  100. Prva spoljna distribucija USG grupe je UNIX Sistem III, 1982 godine. Sistemu III su pridružene mogućnosti iz verzija 7 i 32V, i još nekih verzija UNIX-a koji su se nezavisno razvijali. U Sistem III su uključene mogućnosti UNIX/RT, real-time UNIX sistema, kao i velikog dela PWB softverskih paketa (Programmer’s Work Bench).
  101. 1983, USG izbacuje Sistem V, koji je uglavnom nastao iz UNIX Sistem III. Izlazak raznih Bellovih kompanija iz AT&T-a, su naterali da AT&T agresivno marketinški gura Sistem V. Od USG-a nastaje USDL, UNIX System Development Laboratory, koji izbacuje verziju Sistema V, drugo izdanje (V.2), u 1984. A verzija Sistema V, V.2.4 dodaje novu implementaciju virtualne memorije sa copy-on-write paging i deljenom memorijom. UDSL postaje ATTIS (AT&T Information Systems), koji izbacuje V.3 verziju Sistema V, u 1987. V.3 prilagođava implementaciju iz verzije 8, ondosno stream I/O system, koji je sad dostupan kao STREAMS. On takođe sadrži RFS – remote file system.
  102.  
  103. Mala veličina, modularnost, i čist dizajn ranih UNIX sistema dovodi do UNIX baziranog rada na mnogim drugim naučno-kompjuterskim organizacijama, kao što su Rand, BBN, Univerzitet Illinoisa, Harvard, Purdue i DEC. Najveći uticaj među njima je imao Kalifornijski Univerzitet u Berkliju.
  104.  
  105. Prvi Berkley VAX UNIX nastaje 1978. kao skup sledećih mogućnosti:
  106. virtualne memorije
  107. straničenja po zahtevu
  108. zamenu stranica kao kod 32V
  109. ovo su odradili Bill Joy i Ozalp Babaoglu, da bi nastao 3BSD UNIX.
  110. 3BSD je bila prva verzija UNIX-a koji je imao neku od ovih mogućnosti. Veliki prostor virtualne memorije, omogućuje razvoj veoma velikih programa, kao što je Berkley Franz LISP.
  111. BSD upravljanje memorijom je ubedilo DARPA agenciju (Defense Advanced Research Projecr Agency), da finansira Berkley za razvoj UNIX sistema za vladine institucije; 4BSD UNIX je rezultat toga.
  112.  
  113. U razvoju 4BSD sistema uticali su brojni poznati ljudi iz poznavanja UNIX-a i mreža. Jedan od ciljeva ovog rada je bio da se napravi podrška za DARPA Internet protokol (TCP/IP). Ova podrška je urađena generalno.
  114. Omogućeno je da 4.2BSD komunicira između različitih tipova mreža, uključujući
  115. LAN mreže (kao Ethernet i token ring) i
  116. WAN mreže (kao NSFNET).
  117. Ta implementacija je glavni razlog za današnju popularnost ovih protokola.
  118. Korišćen je kao osnova
  119. za neke druge implementacije drugih izdanja UNIX-a,
  120. čak i za druge operativne sisteme.
  121. Omogućio je da Internet poraste sa 60 povezanih mreža 1984. na više od 8000 mreža, a po proceni 10 miliona korisnika u 1993.
  122.  
  123. UNIX softver kreiran na Berkley-u dobija ime BSD UNIX (Berkley Software Distributions.
  124. Obično se kaže da Berklijev VAX UNIX prate 3BSD i 4BSD, iako su zapravo postojala nekoliko specificnih izdanja, a glavna među njima su 4.1BSD i 4.2BSD.
  125. Oznake 2.x BSD sistema se koriste za PDP-11
  126. oznake 4.xBSD za VAX distribucije Berklijevog UNIX-a
  127.  
  128. 4.2BSD, izbačen 1983. godine, je bio kulminacija originalnog Berklijevog DARPA UNIX projekta. 2.9BSD je ekvivalentan verziji za PDP-11 sisteme.
  129.  
  130. 4.3 BSD
  131. U 1986. godini izašao je 4.3BSD. On je bio toliko sličan 4.2BSD-u, tako da je njegovo uputstvo jasnije objašnjavalo 4.2BSD, nego uputstva od 4.2BSD-a.
  132. Na njemu nisu radili na nekim brojim unutrašnjim promenama,
  133. već na ispravljanju bagova, i na unapređenju performansi.
  134. Dodate su neke nove mogućnost, uključujući podršku za Xerox Network System protokole.
  135.  
  136.  
  137. Sledeća verzija nosila je naziv 4.3BSD Tahoe, a puštena je 1988. Obuhvatala je brojne nove mogućnosti, kao:
  138. poboljšanu kontrolu mrežnog zagušenja
  139. i
  140. TCP/IP performansi
  141. Takođe konfiguracije diskova su odvojene od drajvera uređaja, tako da se sada čitaju direktno sa diskova.
  142. Dodata je i podrška za vremenske zone
  143. 4.3BSD Tahoe je ustvari razvijen za CCI Tahoe System (Computer Console, Inc., Power 5 computer) a ne za uobičajenu VAX bazu.
  144. Paralelno izdanje za PDP-11 je 2.10.1BSD, koje distribuira USENIX Asocijacija, koja je i izdala uputstva za 4.3BSD.
  145.  
  146. U verziji 4.32BSD Renoe je dodata implementacija ISO/OSI mrežnog modela
  147.  
  148.  
  149. Poslednje Berklijevo izdanje 4.4BSD je završeno Juna 1993. Ukljčuje podršku
  150. za novi X.25 mrežni protokol
  151. za POSIX standard
  152. Takođe ima radikalno promenjenu organizaciju fajl sistema,
  153. sa novim interfesjom prema virtuelnoj memoriji i
  154. podršku za stack-bazirani fajl sistem,
  155. koji omogućuje fajl sistemu da bude u slojevima za lako ubacivanje novih mogućnosti.
  156.  
  157. Dodata je i implementacija NFS, kao i novi fajl sistem sa dnevnikom.
  158. Još nekoliko promena je dodato
  159. kao poboljšana sigurnost
  160. poboljšana struktura kernela
  161.  
  162. Sa ovim izdanjem Berkli obustavlja rad na ovom projektu.
  163.  
  164. 4BSD operativni sistem je bio izbor za VAX CPU od njegovog prvog izdanja (1979) do pojave Ultrix-a, DEC-ove BSD implementacije.
  165. 4BSD je i dalje najbolji izbor za mnoge istraživačke i mrežne oraganizacije.
  166.  
  167. Mnogo organizacije su kupile 32V licencu i naručile 4BSD od Berklija.
  168.  
  169. Trenutni skup verzija UNIX operativnih sistema nije ograničen samo na one iz Bellovih laboratorija (čiji je vlasnik Lucent Technology) i iz Berklija.
  170. Sun Microsystems je pomogao u popularizaciji BSD verzije UNIX-a, tako što je isporučivao svoje radne stanice za njim.
  171. UNIX je rastao u populaciji, i bio je instaliran na mnogo različitih računara i računarskih sistema.
  172. Kreirana je široka lepeza UNIX i UNIX bazirnih operatinih sistema.
  173.  
  174. DEC ima svoj UNIX (zvan Ultrix) na radnim stanicama, i njegovog nastavljača OSF/1, koji je takođe nastao od UNIX-a.
  175.  
  176. Microsoft je preradio UNIX za Intel 8080 familiju i nazvao ga XENIX, a i Windows NT operativni sistem je nastao pod jakim uticajem UNIX-a.
  177.  
  178. IBM koristi UNIX (AIX) na svojim PC-jevima i na serverima.
  179.  
  180. Praktično, UNIX je dostupan na gotovo svim vrstama računara za opštu upotrebu, ima ga na personalnim računarima, radnim stanicama, miniračunarima, serverima i superračunarima, od Applovog Mekitoša do Cray-a.
  181. Zbog široke raspoložinosti, on se koristi na raznim mestima, počev od akademskih i vojnih organizacija, do fabrika. Većina ovih sistema je bazirano na Verziji 7, Sistemu III, 4.2BSD-u, ili Sistemu V.
  182.  
  183. MAC OS X
  184. Široka popularnost UNIX-a je dovela do toga da UNIX bude najrašireniji operativni sistem, i da korisnici očekuju da UNIX okruženje bude nezavisno u odnosu na specifičnost hardvera.
  185. Ali veliki broj njegovih implementacija doveo je do toga da postoje razne varijacije u programiranju i korisničkom interfejsu, koji je distribuiran od izdavača.
  186. Za pravu nezavisnost, oni koji razvijaju programe treba da imaju konzistentan interfejs.
  187. Takav interfejs bi omogućio da sve “UNIX” aplikacije rade na svim UNIX sistemima, što svakako nije trenutna situacija.
  188. Ovo je postalo veoma važno kako je UNIX postao omiljena platforma za razvoj programa pocevši od baza preko grafičkih programa, pa sve do mrežnih aplikacija, i zato je tržište zahtevalo da se postavi standard za UNIX.
  189. Postoje nekoliko projekata standardizacije u toku,
  190. počevši od /usr/group 1984 Standard koga finansira UniForum industry users’ group.
  191. Od tada, mnoga tela za standardizaciju se bave tim problemom, uključujući IEEE i ISO (POSIX standard).
  192. Grupa pod imenom X/Open Group internacionalni konzorcijum je napravila XPG3, koji je tipično okruženja za aplikacije (Common Application Enviroment), koji podvodi pod širu kategoriju IEEE standarde interfejsa.
  193. Nažalost, XPG3 je baziran na skici ANSI C standarda, a ne na konačnoj specifikaciji i zato je morao da se preradi. XPG4 je završen 1993.
  194. U 1989., telo za ANSI standardizaciju, pravi ANSI C standard, kome se proizvođači lako prilagođavaju. Dok se rad na ovim projektima nastavlja, razna izdanja UNIX-a nastaju a postoji samo jedan programerski interfejs za UNIX i zato UNIX postaje sve popularniji.
  195. Praktično postoje dva različita seta moćnih UNIX proizvođača koji rade na ovom problemu. AT&T-guided UNIX International (UI) i Open Software Foundation (OSF), koji su se oboje složili da prate POSIX standard.
  196. Nedavno, mnogi proizvođači iz ove dve grupe su se složili oko dalje standardizacije (COSE sporazum) na Motif okruženju prozora, i ONC+ (koji uključuje Sun RPC i NFS), kao i DCE mrežne kapacitete (koji uključuju AFS i RPC paket).
  197. ATA&T 1989,
  198. zamenio ATTIS grupu sa USO (UNIX Software Organization),
  199. koja isporučuje prvi spojeni-merged UNIX
  200. UNIX System V, Release 4.
  201. Ovaj sistem kombinuje funkcionalnost
  202. UNIX Sistema V
  203. 4.3BSD
  204. Sun-ovog SunOS,
  205. uključuje duga imena za datoteke, Berkeley fajl sistem,
  206. menadžment sa virtualnom memorijom,
  207. simboličke linkove,
  208. višekorisniče grupe,
  209. kontrolu poslova, i sigurne signale;
  210. takođe poštuje POSIX standard, POSIX.1.
  211. Nakon toga USO pravi SVR4 i postaje nezavisan od ATA&T,
  212. pod imenom Unix System Laboratories (USL);
  213. 1993, USL kupuje Novell, Inc
  214.  
  215.  
  216. UNIX sistem je porastao od ličnog projekta dvojce saradnika Bell laboratorija do operativnog sistema koji je definisan međunarodnim standardizacionim telima.
  217.  
  218. Ipak, ovaj sistem je i dalje interesantan akademskim institucijama. Verujemo da je UNIX postao i da će ostati važan deo teorije i prakse o operativnim sistemima.
  219. UNIX je odličan OS za akademske studije. Na primer:
  220. Tunis operativni sistem
  221. Xinu operativni sistem
  222. Minix operativni sistem
  223. su bazirani na konceptima UNIX-a, ali su razvijai eksplicitno za učionice.
  224.  
  225. Preobilje je aktuelnih istraživačkih OS baziranih na UNIX-OSu, uključujući Mach, Chorus, Comandos i Roisin.
  226.  
  227. Originalni tvorci, Riči i Tompson, su nagrađeni 1983. od Asociation for Computing Machinery, nagradom Turing, za njihov rad na UNIX-u.
  228.  
  229. Verzija UNIX-a korišćena u ovom poglavlju je Intelova verzija Free BSD-a. Sistem je koršćen zato što implementira razne interesantne koncepte operativnih sistema, kao što je zahtev za straničenjem sa klasterovanjem, i umrežavanje.
  230.  
  231. FreeBSD projekat je počeo 1993.
  232. kako bi napravio snimak 386BSD-a i
  233. rešio problem koje je bilo nemoguće rešiti koristeći postojeći patch mehanizam.
  234.  
  235. 386BSD je nastao od 4.3BSD-Lite (Net/2) i originalno je izbačen u junu 1992 od strane Williama Jolitza.
  236. FreeBSD (David Greenman) 1.0 je izbačen decembra 1993.
  237. FreeBSD 1.1 je pušten maja 1994. i obe verzije su bile bazirane na 4.3BSD-Lite.
  238. Zbog nekih ugovora između UCB-a i Novella, bilo je potrebno je da se kod iz 4.3BSD više ne koristi, tako da je konačan 4.3BSD-Lite izbačen jula 1994. (FreeBSD 1.1.5.1).
  239. FreeBSD je ponovo napravljen,
  240. bazirano na kodu 4.4BSD-Lite-a,
  241. koja je nepotpuna, i izdat je novembra 1994,
  242. pod oznakom FreeBSD 2.0.
  243.  
  244. Kasnija izdanja su
  245. 2.0.2 u junu 1995,
  246. 2.1.5 i avgustu 1996,
  247. 2.1.7 u februaru 1997,
  248. 2.2.1 u aprilu 1997,
  249. 2.2.8 u novembru 1998,
  250. 3.0 u oktobru 1998, 3.1 u februaru 1999,
  251. 3.2 u maju 1999,
  252. 3.3 u septembru 1999,
  253. 3.4 u decembru 1999,
  254. 3.5 u junu 2000,
  255. 4.0 u martu 2000,
  256. 4.1 u julu 2000 i
  257. 4.2 u novembru 2000.
  258. Cilj celog FreeBSD projekta je da omogući softverski alat koji bi mogao da se koristi za svaku svrhu bez bilo kakvih obaveza.
  259.  
  260. Ideja je da se kod maksimalno koristi i da pruži najviše koristi.
  261.  
  262. Osnova je ista kao ona opisana u McKusick et al. [1984],
  263. sa dodatkom povezane virtualne memorije i
  264. fajlsistemskog baferovanog keša,
  265. kernelskih upita, i
  266. softverskih update-a za fajlsistem.
  267.  
  268. Trenutno, FreeBSD radi prvenstveno na Intelovim platformama, iako su Alpha platfome podržane.
  269.  
  270. U toku je rad na tome da se podrže i druge procesorske platforme.
  271.  
  272. sistem je napisan na high level PL, sto mu omogućava
  273. da bude lakši za čitanje
  274. razumevanje
  275. modifikaciju
  276. prenos na druge računarske konfiguracije.
  277.  
  278. Ritchie je procenio da je na prvom UNIX-u C napravio
  279. povećanje koda i usporenje
  280. od 20 do 40%
  281. u odnosu na assembler realizaciju,
  282. ali su prednosti višeg PL kasnije došle do izražaja
  283.  
  284. UNIX poseduje jednostavni korisnički interfejs
  285. koji userima omogućava sve što žele
  286.  
  287. UNIX obezbeđuje primitive
  288. koje omogućavaju kompleksnijim programima
  289. da se realiziju iz jednostavnijih programa
  290.  
  291. UNIX koristi hijerarhijski FS koji omogućava
  292. lako održavanje
  293. efikasno korišćenje i realizaciju
  294.  
  295. UNIX koristi konzistentan format za datoteke i nizove bajtova,
  296. što omogućava lakše pisanje programa
  297.  
  298. UNIX obezbeđuje jednostavan konzistetan intefejs za periferijske uređaje
  299.  
  300. UNIX je multi-user, multi-task OS:
  301. svaki user može izvršavati više programa istovremeno
  302.  
  303. UNIX apstrakuje mašinsku arhitekturu od korisnika
  304. što omogućava lakšu realizaciju programa
  305. na različitim hardverskim arhitekturama
  306.  
  307. Mada su OS i većina komandi realizovana na C PL-u,
  308. UNIX podržava masu drugih jezika kao što su
  309. Fortran, basic, Pascal, Ada, Cobol, Lisp, Prolog...
  310.  
  311. Napisan u visokom programskom jeziku (high-level language).
  312.  
  313. Distribucija izvornog koda (Distributed in source form).
  314.  
  315. Obezbeđuje
  316. moćan skup OS baziranih primitiva
  317. na jeftinim hardverskim platformama
  318.  
  319. Poseduje
  320. malu veličinu
  321. modularan i jasan dizajn
  322.  
  323. Unix je bio napravljen
  324. od programera
  325. za programere
  326.  
  327. Projektovan da bude time-sharing system.
  328.  
  329. Poseduje
  330. standardni user interface (shell)
  331. koji se lako može zameniti
  332.  
  333. FS (File system)
  334. sa multilevel tree-structured direktorijumima.
  335.  
  336. Kernel
  337. podržava datoteke
  338. kao nestruktuiranu sekvecu bajtova
  339.  
  340. UNIX je multitask OS
  341. procesi mogu jednostavno da kreiraju nove procese
  342. Mehanizam se naziva fork
  343.  
  344.  
  345. Kao i većina OS, UNIX se sastoji od 2 odvojena dela :
  346. 1. Kernel:
  347. kernel je sve
  348. ispod SC (system-call) interface
  349. i
  350. iznad fizičkog hardvera
  351.  
  352. Kernel obezbeđuje:
  353. file system upravljanje (management)
  354. upravljanje raspoređivanje procesa process management and CPU scheduling
  355. upravljanje memorijom memory management
  356. druge OS funkcije preko SC (system calls)
  357.  
  358. 2. Sistemski programi:
  359. koriste kernel-supported SC (system calls)
  360. obezeđuju korisne funkcije, kao što su
  361. prevođenje (compilation)
  362. file manipulacija
  363.  
  364.  
  365. 1. Hardver
  366.  
  367. 2. Kernel i SC interfejs
  368.  
  369. 3. System programs
  370.  
  371. cc:
  372. sastoji se od:
  373. C preprocessor,
  374. two-pass compiler,
  375. assembler and
  376. loader (link-editor)
  377.  
  378. 4. Other application programs
  379.  
  380.  
  381. 1. SC interface: definiše programerski interface za UNIX OS
  382.  
  383. 2. user interface :
  384. set sistemskih programa
  385. koji su raspoloživi korisnicima
  386. definiše korisnički-user interface.
  387.  
  388. programerski i user interface
  389. definišu kontext koji
  390. kernel mora podržavati
  391.  
  392. Postoje 3 kategorije sistem calls na UNIX OS:
  393. 1. Rad sa datotekama (File manipulation)
  394.  
  395. 2. Kotrola procesa (Process control)
  396.  
  397. 3. Informacije (Information manipulation)
  398.  
  399.  
  400. UNIX FS se karakteriše sa sledećim osobinama:
  401. hijerarhijska struktura
  402. konzistetno tretiranje podataka
  403. mogućnost kreiranja i brisanja datoteka
  404. mogućnost dinaničkog rasta datoteka
  405. zaštita datoteka preko prava pristupa
  406. tretiranje periferijskih uređaja kao datoteka
  407.  
  408. FS je organizovan kao stablo
  409. sa jednim korenskim direktorijumom
  410. koji se zove root i obeležava kao /
  411. Sve ostalo u stablu su direktorijumi, regularne i specijalne datoteke
  412. ime datoteke uključuje i putanju koja joj određuju mesto u stablu
  413.  
  414. Direktorijumi su specijalni nizovi bajtova podataka koji sadrže opis datoteka
  415.  
  416. Uređaji se tretiraju kao datoteke,
  417. istim komandama se radi sa uređajem kao sa datotekom (cp, mv, ls, cat)
  418. na isti način imaju zaštitu i kontrolu pristupa (rwx) kao datoteke
  419.  
  420. datoteka je sekvenca bajtova
  421. UNIX kernel ne nameće strukturu za datoteke.
  422.  
  423. Datoteke se organizuju u direktorijume koji imaju strukturu stabla (tree-structured directories)
  424.  
  425. Direktorijumi su datoteke
  426. koje sadrže informacije
  427. kako da se pronađu druge daoteke
  428.  
  429. Putanja (Path name): identifikuje datoteku
  430. specificiranjem putanje kroz direktorijumsku strukturu do datoteke
  431. a) apsolutna putanja počinje od korenskog direktorijuma
  432. b) relativna putanja startuje u tekućem direktorijumu
  433.  
  434. SC pozivi za osnovnu manipulaciju sa datotekama :
  435. create
  436. open
  437. read
  438. write
  439. close
  440. unlink
  441. truncate.
  442.  
  443. Proces je jedna istanca programa u izvršavanju.
  444. Pod UNIX OS, proces je celina kreirana fork sistemskim pozivom.
  445. 4 SC su karateristična za kreiranje procesa pod UNIX-om
  446. 1. fork: kreira novi proces
  447. kopira adresni prostor od roditelja za proces dete
  448. i svakome dodeli pid {0 za dete, !=0 za roditelja).
  449. 2. exec: izvršava novi proces
  450. SC pomoću kojeg dete proces puni (overlay) odgovarajući program
  451. u svoj adresni prostor.
  452. Kada se dogodi execl, roditelj i dete nisu više isto.
  453. Dete se više ne vraća na početni kod jer ga je prepisalo sa execl SC
  454. 3. exit: proces završava aktivnosti
  455. dete mora imati sistemski poziv exit
  456. koji znači da je obavilo svoje
  457. i da se ukida, osobađajući resurse
  458.  
  459. 4. wait: roditelj čeka na dete
  460. SC koji omogućava procesu roditelju da se blokira i
  461. čeka da dete obavi svoje
  462.  
  463.  
  464. main (argc, argv)
  465. int argc;
  466. char *argv[];
  467.  
  468. {
  469. /* assume 2 args; source file and target file*/
  470. if ( fork() == 0) execl("cp", "cp", argv[1],argv[2], 0)
  471.  
  472. wait ((int *) 0 );
  473.  
  474. printf("copy done\n")
  475. }
  476.  
  477.  
  478. UNIX shell dozvoljava 3 tipa komandi:
  479. execulable binarne datoteke koje sadrže object code nastao kompilacijom source koda
  480. shell script datoteke koje nastaju kao programske konstrukcije sastavljene od shell komandnih linija
  481. interne komande shell-a koje omogućavaju shell programske konstrukcija tipa if, while ... for, ali i neke komande tipa cd...
  482.  
  483. Shell radi na principu fork-a za foreground procese
  484. čekajući ih da se završe
  485. to je sinhroni rad
  486.  
  487. Shell može raditi i asinhrono
  488. da napravi procese
  489. ali da ih postavi u background
  490. ne čekajući da se završe.
  491. To je asinhroni rad shell-a a postiže se sledećom sintaksom:
  492. command &
  493.  
  494. Svaki proces ima svoju radnu okolinu, a jedan od jako bitnih parametara je radni direktorijum
  495.  
  496. Shell nije deo kernela može se lako modifikovati i promeniti.
  497. Tipicani search path:
  498. .
  499. /home/prof/avi/bin
  500. /usr/local/bin
  501. /usr/ucb
  502. /bin
  503. /usr/bin
  504.  
  505. shell
  506. obicno suspenduje svoje aktivnosti (its own execution)
  507. dok se komanda ne kompletira
  508.  
  509. Foreground process
  510. Background process [&]
  511.  
  512.  
  513. UNIX obezbeđuje blok primitive koje omogućavaju korisnicima
  514. da pišu male, modularne programe
  515. koji se koriste za za realizaciju kompleksnijih programa.
  516. Jedna tipična blok primitiva je redirekcija ulaza i izlaza. Svaki proces ima konvencionalno 3 datoteke ili 3 file descriptora:
  517. standard input
  518. standard output
  519. error output
  520. Tipični primeri su:
  521. ls >output
  522. mail mjb <letternroff -mm <doc1 >doc1.out 2>errors
  523.  
  524.  
  525. Druga blok primitiva je pipe, mehanizam
  526. koji obezbeđuje da se niz podataka prosledi
  527. između procesa čitaoca i procesa pisca.
  528. Proces pisac redirektuje svoj standardni izlaz na pipe,
  529. dok proces čitaoc redirektuje svoj standardni ulaz na pipe.
  530. Tipičan primer je:
  531. grep main a.c b.c c.c | wc -l
  532.  
  533. Vecina procesa ocekuje
  534. da 3 fd (file descriptors)
  535. budu otvoreni, kada se startuju:
  536. standard input – fd=0
  537. program can read what the user types
  538. standard output – fd=1
  539. program can send output to user’s screen
  540. standard error – fd=2
  541. error output
  542.  
  543. Vecina procesa
  544. moze takodje da prihvati datoteku (rather than a terminal)
  545. za standard input i standard output.
  546.  
  547. Shells imaju jednostavnu sintaksu za
  548. I/O redirection.
  549.  
  550.  
  551. Command Meaning of command
  552. % ls > filea direct output of ls to file filea
  553. % pr < filea > fileb input from filea and output to fileb
  554. % lpr < fileb input from fileb
  555. %% make program > & errs save both standard output and
  556. standard error in a file
  557.  
  558. Mogu se udruziti individualne comande
  559. preko vertical bar
  560. koji kaze shell-u
  561. da prosledi output prethodne komande
  562. kao input za sledecu komandu $ ls | pr | lpr
  563. Filter:
  564. komadne kao pr
  565. prosledjuju svoj standard input na svoj standard output,
  566. obavljajuci neko procesiranje na njemu.
  567.  
  568. Pisanje novog shell-a sa razlicitom sintaksom i semantikom
  569. mogu promeniti korisniki pristup (user view),
  570. ali ne menjaju kernel i programmer interface.
  571. Shell programming
  572. Shell variables
  573. Program structure: if-then-else, for, while, until, case….
  574.  
  575. X Window System is a widely accepted iconic interface for UNIX
  576.  
  577. Ovde je reč o servisima kernela:
  578.  
  579. 1. upravljanje procesima koje omogućava njihovu
  580. kreaciju
  581. terminaciju
  582. suspenziju
  583. komunikaciju
  584.  
  585. 2. raspoređivanje procesa (CPU scheduling)
  586.  
  587. 3. alokaciju memorije procesima i swapping
  588.  
  589. 4. alokaciju sekundarne memorije (FS services)
  590.  
  591. 5. dozvoljavanje procesima da kontrolišu periferale (I/O system)
  592.  
  593. Izvršavanje UNIX procesa se deli na 2 nivoa:
  594. kernelski (kernel mode)
  595. korisnički (user mode)
  596. Kada proces izvršava SC
  597. izvršni mod procesa se menja sa user mode u kernel mode
  598. a OS pokušava da zadovolji korisnički zahtev
  599. i vraća status da li je uspeo ili se dogodila greška
  600.  
  601. No bez obzira da li će user proces da obavi SC ili ne,
  602. OS obavlja masu aktivnosti kao što su
  603. interrupt handling, CPU scheduling, ...
  604.  
  605. Neke procesorske arhitekture dozvoljavaju više nivoa, ali UNIX se zadovoljava sa 2:
  606. korisnicki nivo: procesi u korisničkom modu
  607. mogu pristupati samo svojim instrukcijama i podacima
  608. ali ne i kernelskim instrukcijama i podacima.
  609. kernelski nivo: procesi u kernelskom modu
  610. mnoge instrukcije su privilegovane i
  611. mogu se izvršavati samo u kernelskom modu
  612.  
  613. Hadverski prekid je mehanizam kojim se
  614. označava neki događaj (I/O completion)
  615. omogućava I/O uređajima
  616. da prekinu CPU asinhrono.
  617.  
  618. Po prijemu prekida
  619. izvrši se poslednja instrukcija koja se obavljala u trenutku prekida
  620. a kernel će sačuvati stanje prekinutog procesa
  621. odrediti uzrok prekida
  622. pozvati prekidnu rutinu
  623.  
  624. Nakon toga kernel obavlja po pravilu novi CPU scheduling
  625.  
  626. Za vreme obrade prekida, mogući su novi prekidi,
  627. ali se to obavlja prioritetno
  628. niži prekidi ne prekidaju
  629. više prekide.
  630.  
  631.  
  632. Izuzeci (exception) su neočekivani događaji
  633. koje je izazvao sam proces
  634. kao što je page fault
  635. illegal memory
  636. izvršavanje privilegovane instrukcije
  637. deljenje sa 0
  638.  
  639. po tome se razlikuju od prekida
  640. koje izazivaju neki eksterni događaji, van procesa.
  641.  
  642. Jedino se obrađuju slično, jer se
  643. prekida instrukcija
  644. kernel određuje vrstu trapa i trap rutinu
  645. ***ako ima smisla***
  646. obavlja se restart instrukcije koja je napravila izuzetak.
  647. Kernel mora da se zaštiti od prekida
  648. za vreme nekih kritičnih operacija,
  649. na primer, da ne dozvoljava disk prekid
  650. dok ažurira povezane liste.
  651.  
  652. Računari koriste skup privilegovanih instrukcija koje postavljaju
  653. CPU nivo izvršenja ili kako se nazivaju
  654. prekidni nivoi (CPU execution level)
  655. Kada se postavi neki nivo izvršenja,
  656. svi prekidi koji su ispod tog nivoa
  657. se neće dozvoljavati kao na slici
  658.  
  659.  
  660.  
  661. Kernel je rezidentno u memoriji
  662. ili
  663. bar deo njega.
  664.  
  665. Većina OS pa i UNIX
  666. koristi princip virtuelne memorije,
  667. čija je fundamentalna osobina
  668. mapiranje logičkih u fizičke adrese
  669.  
  670. Sadžaj direktorijuma /etc
  671. izlistati
  672. i
  673. upisati u datoteku etc.txt,
  674. na direktorijumu /tmp
  675.  
  676. Proveriti sadržaj datoteke
  677.  
  678. Izlaz se česće preusmerava od ulaza.
  679.  
  680. Za redirekciju se koristi znak > (veće od)
  681.  
  682. Ukoliko se redirekcija vrši u postojeću datoteku, datoteka se briše, a zatim
  683. se kreira nova u koju se smešta rezultat izvršenja komande.
  684.  
  685. Ukoliko korisnik želi da se rezultat izvršenja doda na postojeću datoteku bez brisanja njenog sadržaja, za redirekciju izlaza se koristi znak >>.
  686.  
  687.  
  688. Sledeći primer ilustruje redirekciju izlaza na štampač, u novu datoteku i postojeću datoteku i kreiranje prazne datoteke.
  689. $ sort kyuss.txt > /dev/lp0
  690. $ ls -l /home/jsmith > myfile
  691. $ ls -l /tmp/jsmith >> myfile
  692. $ >emptyfile
  693.  
  694. Standardni izlaz za greške se preusmerava ukoliko korisnik želi da sačuva rezultat izvršenja komande u nekoj datoteci radi kasnije analize grešaka (na primer, debagovanje programa u fazi razvoja).
  695.  
  696. Izlaz za greške se preusmerava u tekstualne datoteke pomoću znaka 2>.
  697.  
  698. $ ./testprogram 2> debugging.txt
  699.  
  700. Vratimo se na naš problem.
  701.  
  702. Sadžaj direktorijuma /etc izlistati i upisati u datoteku etc.txt, na direktorijumu /tmp
  703.  
  704. Da bi smo listali sadržaj direktorijuma, moramo znati Linux komandu ls
  705.  
  706. Korisnik može na ekranu pomoću komande ls (list) prikazati sadržaj bilo kog direktorijuma aktivnog UNIX stabla.
  707. Sintaksa komande ls je:
  708. $ ls [options] [dir][filespec]
  709. Komanda ls će na ekranu prikazati spisak objekata direktorijuma dir definisanih argumentom filespec. Argument filespec se formira pomoću džoker karaktera i nije obavezan. Ukoliko se ne navede, podrazumevaju se svi objekti u direktorijumu. Argument dir takođe nije obavezan, i ako se ne navede, prikazuje se sadržaj tekućeg direktorijuma. Ukoliko se ne navedu dodatne opcije, ls funkcioniše prikazuje samo imena objekata sortiranih u abecednom redu. Od značajnijih opcija komande ls navode se sledeće:
  710. -a prikazuju se i imena skrivenih objekata
  711. -B imena rezervnih kopija datoteka se ne prikazuju
  712. -d prikazuje se kontekst direktorijuma umesto sadržaja-
  713. -i prikazuje se i-node broj datoteke
  714. -R rekurzivno se prikazuje sadržaj svih poddirektorijuma
  715. -L dereferenciranje (umesto simboličkih linkova se prikazuju imena datoteka na koje linkovi upućuju)
  716. -h veličine datoteka se prikazuju u čitljivom formatu (1K, 234M, 2G)
  717. -k veličine datoteka se prikazuju u kilobajtima
  718. -l osim imena objekata, prikazuju se i informacije upisane u i-node (prava pristupa, vlasnik, grupa, datum, vreme)
  719. -1 prikazuje samo imena objekata (jedno ime u jednoj liniji)
  720. -r imena objekata se prikazuju sortirana u opadajućem redosledu
  721.  
  722. Da bi smo videli sadžaj direktorijuma /etc uradićemo sledeće komande
  723. $cd /etc
  724. $ls
  725. ili
  726. $ls /etc
  727.  
  728. Ukoliko želimo da sadržaj direktorijuma, umesto na ekran prebacimo u datoteku, primenićemo redirekciju izlaza sa znakom >, tj uradićemo sledeću komandu
  729. $ls /etc >/tmp/etc.txt
  730.  
  731. Proveravamo sadržaj datoteke sa komandom less
  732. $less /tmp/etc.txt
  733. Imate sistem sa sa 2 diska,
  734. /dev/hda kao primarni master sa Linux OS
  735. izmenljivi disk ZIP od 1GB na poziciji od sekundarnog mastera /dev/hdc
  736.  
  737. Potrebno je primpremiti novi ZIP medijum, sa fdisk programom ali bez intervencije korisnika.
  738.  
  739. Interaktivni program fdisk izvršiti automatski, tj neinteraktivno bez upotrebe tastature
  740.  
  741. Ulaz komande se preusmerava pomoću znaka < (manje od) na sledeći način:
  742. $ command < inputdevice
  743.  
  744. Inputdevice može biti datoteka ili ulazni uređaj (preusmeriti ulaz na izlazni uređaj kao što je štampač nema nikakvog smisla).
  745.  
  746.  
  747. Na primer, moguće je standardni ulaz sa tastature zameniti nekom tekstualnom datotekom:
  748. $ wc -l < /tmp/jsnmith.dat
  749.  
  750. Vratimo se na problem
  751. Imate sistem sa sa 2 diska,
  752. /dev/hda kao primarni master sa Linux OS
  753. izmenljivi disk ZIP od 1GB kao sekundarni mastera/dev/hdc
  754. Potrebno je primpremiti novi ZIP medijum, sa fdisk programom ali bez intervencije korisnika. Interaktivni program fdisk izvršiti automatski, tj neinteraktivno bez upotrebe tastature
  755.  
  756. Da bi smo rešili problem, upotrebićemo program fdisk sa redirekcijom ulaza. Opišimo prvo program fdisk. Program za particionisanje diskova koji se isporučuje uz Linux je fdisk (istiomeni program se isporučivao uz DOS i Windows 9x/ME). Detalji o njegovom korišćenju mogu se naći u on-line dokumentaciji (man pages).
  757.  
  758.  
  759. Program fdisk se pokreće na sledeći način:
  760. # fdisk device
  761. gde je device nod blok uređaja (diska) koga treba particionisati.
  762. # fdisk /dev/sda
  763. Command (m for help): m
  764. Command action
  765. a toggle a bootable flag
  766. b edit bsd disklabel
  767. c toggle the dos compatibility flag
  768. d delete a partition
  769. l list known partition types
  770. m print this menu
  771. n add a new partition
  772. o create a new empty DOS partition table
  773. p print the partition table
  774. q quit without saving changes
  775. s create a new empty Sun disklabel
  776. t change a partition's system id
  777. u change display/entry units
  778. v verify the partition table
  779. w write table to disk and exit
  780. x extra functionality (experts only)
  781. fdisk omogućava korisniku da uradi sledeće stvari:
  782. prikazivanje particione tabele (p - print the partition table)
  783. pregled podržanih tipova particija (l - list known partition types)
  784. kreiranje primarnih, extended i logičkih particija (n - add a new partition)
  785. brisanje particija (d - delete a partition)
  786. promena tipa particija (t - change a partition's system id)
  787. postavljanje flega aktivne particije (a - toggle a bootable flag)
  788.  
  789. Pri tome, promene se ne upisuju na disk dok korisnik ne napusti program pomoću opcije w - write table to disk and exit.
  790.  
  791. Napuštanje programa pomoću opcije q - quit without saving changes ne povlači upisivanje promena na disk.
  792.  
  793. U našem slučaju mi bismo pozvali fdisk i u njemu otkucali njegove interne komande
  794. #fdisk /dev/hdc
  795. n kreiranje nove particije
  796. 0 početak particije
  797. 1.1G veličina particije
  798. w upis u MPT
  799. q izlazak iz programa
  800. To bi bio interaktivni način rada. Da bi realizovali ne-interaktivni način rada, moramo formirati tekstualnu datoteku, na primer fdisk.txt, gde bi smo za svaku komandu kreirali posebnu liniju
  801. Izgled datoteke fdisk.txt bio bi
  802. dev/hdc
  803. n
  804. 0
  805. 1.1G
  806. w
  807. q
  808. Nakon toga rešenje našeg problema je
  809. #fdisk </tmp/fdisk.txt
  810.  
  811. Analizirajte sistemski direktorijum /bin.
  812.  
  813. Obavite prebrojavanje svih objekata u njemu,
  814. uz pomoć samo jedne komande
  815.  
  816. Pođimo prvo od povezivanja komandi u pipeline
  817.  
  818. Prebrojavanje datoteka u direktorijumu /etc može realizovati pomoću pipeline sprege komandi ls i wc:
  819.  
  820. $ ls -l /etc | wc -l
  821. 145
  822.  
  823. Opšta sintaksa pipeline sprege je sledeća:
  824. $ command1 | command2 | .... | commandN
  825.  
  826. To znači da se u pipeline može povezati veći broj komandi (maksimalan broj zavisi od konkretnog UNIX sistema, a obično se kreće od 20 do 30).
  827.  
  828. Vratimo se na problem
  829. Analizirajte sistemski direktorijum /bin. Obavite prebrojavanje svih objekata u njemu, uz pomoć samo jedne komande.
  830.  
  831. a ovaj problem potrebne su nam 2 Linux komande,
  832. ls
  833. wc.
  834.  
  835. Komandu ls smo već opisali, a za komandu, a sada dajemo kratak opis komande wc.
  836.  
  837. Komanda wc (word count) se koristi za brojanje karaktera, reči i linija u datoteci. Sintaksa komande je:
  838. $ wc [-cwl] filename
  839.  
  840. Bez opcija komanda prikazuje sve tri vrednosti, dok se opcijama -c, -w i -l specifira prebrojavanje karaktera (bajtova), reči ili linija.
  841.  
  842. Datoteka /etc/protocols je iskorišćena radi ilustracije upotrebe komande wc:
  843. $ wc -c /etc/protocols
  844. 1748 /etc/protocols
  845. $ wc -w /etc/protocols
  846. 297 /etc/protocols
  847. $ wc -l /etc/protocols
  848. 44 /etc/protocols
  849. $ wc /etc/protocols
  850. 44 297 1748 /etc/protocols
  851. U našem slučaju, problem ćemo da rešimo primenom povezivanja komandi u pipeline:
  852.  
  853. $ls –R /bin | wc -l
  854.  
  855. Otkucajte tekst programa koji štampa rečenicu Hello, world ma ekranu.
  856.  
  857. Program prevedite i linkujte
  858.  
  859. Program izvršite
  860.  
  861.  
  862. Rešenje
  863. Pođimo najpre od editora teksta. Editor je program koji koristite za uređivanje teksta izvornog koda.
  864.  
  865. Mnoštvo različitih editora je raspoloživo na Linux sistemu, ali najpopularniji i najfunkcionalniji je verovatno GNU Emacs.
  866.  
  867. Imate takođe program vi, joe....
  868.  
  869. Kreiranje datoteke
  870.  
  871. #include <stdio.h>
  872. int main (int argc, char **argv)
  873. {
  874.  
  875. printf ("Hello, world\n");
  876. return 0;
  877. }
  878.  
  879.  
  880. Prevođenje pojedinačne datoteke izvornog koda
  881.  
  882. Naziv C prevodioca je gcc. Da bismo preveli C datoteku izvornog koda, koristimo -c opciju. Tako se, na primer, zadavanjem sledeće naredbe u komandnoj liniji prevodi main.c datoteka izvornog koda:
  883. % gcc -c main.c
  884.  
  885. Rezultujuća objektna datoteka se zove main.o.
  886.  
  887. Povezivanje objektnih datoteka
  888.  
  889. Sada, kada ste preveli main.c, treba da je linkujete. Uvek koristite g++ prevodilac kada povezujete program koji sadrži C++ kod, čak i onda kada on sadrži i C kod. Ako vaš program sadrži isključivo C kod, koristite gcc prevodilac.
  890. Kako ovaj program sadrži i C i C++ kod, koristićete g++ prevodilac i to na sledeći način:
  891.  
  892. $ gcc -o main main.o
  893.  
  894. Opcijom -o se definiše naziv datoteke koja će biti rezultat povezivanja.
  895.  
  896.  
  897. Izvršavanje programa
  898. Sada možete pokrenuti main na sledeći način:
  899.  
  900. $ ./main
  901.  
  902. Hello, world
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916. Arhitektura UNIX operativnog sistema
  917.  
  918. user level
  919.  
  920. kernel level
  921.  
  922. hardware level
  923.  
  924. Dva entiteta, datoteke i procesi su
  925. 2 centralna koncepta u UNIX sistem modelu.
  926.  
  927. Imamo 3 nivoa arhitekture:
  928. korisnički nivo
  929. kernelski nivo
  930. hardverski nivo
  931.  
  932. SC intefejs i library interfejs predstavljaju granicu
  933. između korisničkog programa i kernela.
  934.  
  935. SC liče na obične pozive funkcije u C programu,
  936. a biblioteke mapiraju ove funkcijske pozive
  937. u primitive neophodne da se uđe u OS.
  938.  
  939. Asemblerski programi mogu pozvati SC direktno
  940. bez poziva sistemskih biblioteka.
  941.  
  942. Programi često koriste pozive za sistemske biblioteke
  943. koji se linkuju sa programom
  944. in compile time
  945. in execution time
  946.  
  947.  
  948. FS (File Subsystem)
  949. upravlja datotekama
  950. alocira prostor za datoteke
  951. administrira slobodan prostor
  952. kontroliše pristup datotekama
  953. obezbeđuje podatke iz datoteka korisnicima.
  954.  
  955. Interakcija procesa sa FS se odvija preko skupa sledećih SC:
  956. open (open file for reading and writing)
  957. close
  958. read
  959. write
  960. lseek
  961. stat (querry the attribute of file)
  962. chmod
  963. chown
  964.  
  965. FS pristupa podacima na 2 načina:
  966. 1. buffered access
  967. preko cache bafera (sve ide kroz kes)
  968. FS ima specifični interakciju
  969. sa I/O block uređajima kroz keš,
  970. keš bafer reguliše protok podataka
  971. između kernela i I/O uređaja.
  972.  
  973. 2. raw access
  974. bez cache bafera
  975. FS pristupa blok I/O uređajima direktno, bez keš bafera
  976. ovaj pristup se naziva raw.
  977. na isti način se upravlja svim uređajima koji nisu blok orijentisani.
  978.  
  979. Device drivers su kernelski moduli koji upravljaju radom I/O uređaja.
  980. Proces control subsystem(PCS) je odgovoran za
  981. sinhronizaciju procesa
  982. IPC
  983. za upravljanje memorijom
  984. za CPU scheduling.
  985.  
  986. PCS i FS komuniciraju
  987. kada se puni program iz FS u memoriju radi izvršenja,
  988. kada PCS čita executable file u memoriju pre nego što je izvrši.
  989.  
  990. SC iz PCS su:
  991. fork (create a new process)
  992. exec (overlay the image of a program onto running process)
  993. exit (finishing executing process)
  994. wait (synchronize process execution with the exit of a previosly forked process)
  995. brk (control the size of memory allocated to a process)
  996. signal (control process response to extraordinary events)
  997. 1. Memory Management module
  998. kontroliše alokaciju memorije.
  999. Tu svakako spadaju i dodatne funkcije
  1000. vezane za virtuelnu menoriju, kao što su swaping i DP.
  1001.  
  1002. 2. CPU Scheduler: alocira CPU procesima:
  1003. nastupa posle blokiranja procesa ili
  1004. posle isteka time quantuma
  1005.  
  1006. 3. IPC: postoji više formi IPCa: počevši od
  1007. asinhronog signaliziranja događaja,
  1008. do sinhronih prenosa poruka između njih
  1009.  
  1010. 4. Hardverska kontrola: je odgovorna
  1011. za upravljanje prekidima i
  1012. za komunikaciju sa hardverom-mašinom.
  1013.  
  1014. Prekidni programi se ne servisiraju kao specijalni procesi
  1015. već kao specijalne funkcije u kernelu
  1016. a u kontekstu procesa koji se izvršavaju.
  1017.  
  1018. Interna repreznetacija datoteke je definisana preko inode strukture koja opisuje
  1019. layout datoteke na disku
  1020. druge informacije kao što je vlasništvo, prava pristupa i vremena pristupa.
  1021.  
  1022. Svaka datoteka ima jedan unikatni inode,
  1023. ali može imati više imena (hard links).
  1024.  
  1025. Kada proces traži neku datoteku po imenu,
  1026. kernel analizira svaku komponentu u pathname,
  1027. proverava da li proces ima prava da pretražuje u toj grani,
  1028. a ako dođe do poslednje grane otvara traženi inode.
  1029.  
  1030. Kada proces kreira novu datoteku,
  1031. kernel mora da dodeli novi,
  1032. slobodni inode.
  1033. Inodes se čuvaju u inode tabelu na disku,
  1034. ali radi ubrzanja rada
  1035. kernel otvorene inodes
  1036. čuva u memorijskoj (in-core) inode tabeli.
  1037. Kernel sadrži još 2 dotatne strukture podataka,
  1038. FT=file table
  1039. FT je globalna kernelska struktura
  1040. UFDT = user file descrpitor table.
  1041. UFDT je tabela koja se dodeljuje svakom procesu.
  1042.  
  1043. Kada proces otvara ili kreira novu datoteku,
  1044. kernel alocira po jedan ulaz
  1045. iz svake od ove 2 tabele.
  1046.  
  1047. Stanje "live" datoteke i korisničkog pristupa toj datoteci je dato preko 3 tabele:
  1048. 1. inode table
  1049. 2. FT: čuva zapis o offsetu u datoteci
  1050. gde će se sledeći upis ili čitanje startovati i
  1051. prava pristupa koje ima openning proces
  1052. 3. UFDT: identifikuje sve otvorene datoteke za taj proces
  1053.  
  1054. Kada se otvori ili keira datoteka, kernel vraća deskriptor koji je index u UFTD.
  1055.  
  1056. Kada se potom obavlja read ili write,
  1057. na bazi deskriptora se ulazi u UFDT,
  1058. iz koga se čita ulaz u FT, a
  1059. onda se preko inode tabele realizuje odgovarajući read ili write.
  1060.  
  1061. Disk može biti izdeljen na više sistema datoteka od kojih ima svoj logički broj. Konverzija između logičke adrese <FS, logical_number> i fizičke adrese <cyl, head, sector> je zadatak disk drajvera.
  1062. Diskovi se sastoje of fizičkih blokova = 512. FS se sastoji od logičkih sistemskih blokova veličine 1K, 2K, 4K, 8K.
  1063. FS se sastoji od više komponenti:
  1064.  
  1065.  
  1066.  
  1067. Boot block okupira početak FS-a, obično je to prvi sektor, i sadrži boot code za inicijalno podizanje operativnog sistema.
  1068.  
  1069. Super block opisuje stanje FS-a,
  1070. koliko je veliki,
  1071. koliko maksimalno datoteka može sadržavati,
  1072. gde se nalazi informacija o slobodnom prostoru u FS i razne druge informacije.
  1073.  
  1074. Inode list je tabela koja sledi iza superbloka, administratori specificiraju veličinu ove tabele kada konfigurišu FS.
  1075. Kernel pronalazi inodes indeksiranjem u inode tabelu.
  1076. Specijalan inode je root inode za taj FS:
  1077. to je onaj inode preko kojeg je direktorijumska struktura tog FS
  1078. raspoloživa nakon uspešne mount komande
  1079.  
  1080. data area: počinje odmah iza inode tabele i sadrži datoteke i direktorijume
  1081. Proces je program u izvršavanju i sastoji se od 3 funkcionalne celine
  1082. text
  1083. data
  1084. stack
  1085.  
  1086. U princupu nema preklapanja ovih delova sa drugim procesima a sva komunikacija između procesa se odvija preko IPC-a. Postoje izuzeci od ovog kao što su deljivi kod segmenti (shared code segment) i deljiva memorija (shared memory).
  1087.  
  1088. Praktično, proces na UNIX sistemu je celina kreirana preko fork SC. Svaki proces izuzev procesa 0 se kreira kada neki drugi proces izvrši fork sistemski poziv, pri čemu se taj proces naziva roditelj, a kreirani proces se naziva dete. Svako dete ima samo jednog roditelja, a jedan roditelj može imati puno dece. Kernel svakom procesu dodeljuje jedinstveni broj PID.
  1089.  
  1090. Proces sa PID=0 je specijalan proces koji se kreira ručno kada se UNIX podiže, a potom taj proces forkuje svoje prvo dete koje postaje proces init sa PID=1, dok proces sa PID=0 postaje swapper process. Proces init je predak svih procesa na UNIX-u i svi ostali procesi imaju specijalnu vezu sa njim.
  1091.  
  1092.  
  1093. Izvršni prgoram se sastoji od više funkcionalnih delova:
  1094. skup zaglavlja „header“ koji opisuju atribute datoteke
  1095. text = programski kod
  1096. data sekciju inicijalizovanu (varijable koje imaju početnu vrednost kada se program startuje)
  1097. data sekciju koja se ne inicijalizuje bss
  1098. razne sekcije kao što je simbolička tabela na primer
  1099.  
  1100.  
  1101. Kada se program puni u memoriju preko exec SC,
  1102. minimalno 3 memorijska regiona moraju mu se dodeliti:
  1103. text
  1104. data
  1105. stack
  1106.  
  1107. Text i data sekcija odgovaraju text i databss samog programa
  1108.  
  1109. stack automatski kreira i njegova veličinu kernel automatski prilagođava u runtime.
  1110.  
  1111. Stack se sastoji od logičkih stack frame-ova, koji se
  1112. guraju na stek (push) kada se funkcija pozove i
  1113. skidaju sa steka (pop) kada se obavlja povratak iz funkcije.
  1114.  
  1115. Stack frame sadrži
  1116. adresu samog frame,
  1117. povratnu adresu funkcije,
  1118. parametre funkcije,
  1119. njene lokalne varijable,
  1120. podatke potrebne za regeneraciju prethodnog stek frame uključujući PC i SP u vreme funkcijskog poziva.
  1121.  
  1122. Kako proces na UNIXu može da se izvršava u 2 moda, kernelski i korisnički, za svaki mod mora da se koristi poseban stek.
  1123. Kernelski stek se sastoji od stek frames za funkcije koje se izvršavaju u kernelskom modu i sve je isto kao u korisničkom steku po strukturi .
  1124. Ukoliko nema sistemskih poziva, trapova i prekida, kernelski stek za proces = 0..
  1125. Svaki proces ima 2 ulaza:
  1126. ulaz u kernelskoj tabeli procesa PT
  1127. ulaz u u-area (u = user) a to je područje kojim manipuliše isključivo kernel
  1128. PT ulazi sadrže odnosno ukazuju na per proces region table PPRT, čiji ulazi ukazuju na region tabelu. Region je kontunalni adresni prostor za jedan proces, kao što je text, data ili stek. Region tabela (RT), u svojim ulazima opisuje atribute regiona (text-data, private-sharable) i lokaciju regiona u memoriji. Upotreba RT i PPRT omogućava efikasno deljenje regiona.
  1129. Objasnimo vezu između ovih tabela.
  1130. PT ukazuje na PPRT,
  1131. PPRT ima ukazivače na glavnu RT
  1132. RT opisuje regione
  1133. Ulaz u PT i ulaz u u-area
  1134. sadrže kontrolne i statusne informacije
  1135. o svakom procesu.
  1136.  
  1137.  
  1138. Polja u PT ulazu su:
  1139. polje stanja (state fileld)
  1140. UID: identifikatore koji opisuju koji user je vlasnik procesa
  1141. (user ID odnosno UID)
  1142. skup opisivača događaja kada se proces suspenduje
  1143. (in the sleep state)
  1144.  
  1145. Ulaz u u-area sadrži informacije o procesu koje su potrebne jedino kada se proces izvršava:
  1146.  
  1147. u-area:
  1148. polja u njemu su:
  1149. ukazivač na PT ulaz za proces koji se trenutno izvršava
  1150. parametre tekućeg SC, povratne vrednosti i error kodove
  1151. file deskriptore za sve otvorene datoteke
  1152. tekući direktorijum i tekući root
  1153. limiti za veličinu procesa i veličinu datoteka
  1154.  
  1155. Kernel uvek direktno pristupa poljima u u-area samo za proces koji se tekuće izvršava
  1156.  
  1157.  
  1158. Po pitanju SC i regiona važe sledeća pravila:
  1159. fork SC:
  1160. kernel duplicira adresni prostor od procesa roditelja,
  1161. dozvoljavajući da oba procesa dele regione uvek kad je moguće
  1162. i praveći kopije kada se to mora
  1163.  
  1164. exec SC:
  1165. kernel alocira regione za text, data i stek,
  1166. a prethodno oslobođa sve regione koje je proces imao pre exec SC
  1167.  
  1168.  
  1169. exit SC:
  1170. kernel oslobođa sve regione koje je proces posedovao
  1171.  
  1172. Kontekst procesa je njegovo stanje koje se definiše:
  1173. CPU context
  1174. vrednost registara CPU koje proces koristi
  1175.  
  1176. memory context
  1177. njegov text
  1178. vrednost globalnih promenljivih i data struktura
  1179. sadržina korisničkog i kernelskog steka
  1180.  
  1181.  
  1182. IO context
  1183. all open files
  1184.  
  1185. Kernel structures
  1186. vrednosti ulaza i u PT i ulaza iz u-area
  1187.  
  1188. OS izvršava proces, preciznije OS izvršava kontekst procesa.
  1189. Kontekst procesa se čuva u 3 situacije:
  1190. 1. CSw
  1191. Kada kernel odluči da izvršava neki drugi proces, mora se obaviti kontext switch, CSw.
  1192. Kernel dozvoljava prebacivanje konteksta samo pod određenim uslovima.
  1193. Kada obavlja CSw, kernel mora da sačuva dovoljno informacija o procesu koji se suspenduje kako bi kasnije mogao da ga nastavi.
  1194. 2. user->kernel mod
  1195. prilikom prebacivanja iz user moda u kernelski mod, kernel mora sačuvati dovljno informacija kako bi proces nastavio izvršavanje tamo gde je stao, nakon povratka u user mod.
  1196. Naravno u ovom slučaju se ne menja kontekst procesa već samo mod.
  1197. 3. Interrupt
  1198. Kernel opslužuje prekide u kontekstu jednog istog procesa koji se prekida, pa se nastavi.
  1199. Opsluživanje prekida se ne realizuje preko novih procesa, ali se radi uvek u kernelskom modu.
  1200. Prekinuti proces može biti i u user modu i u kernelskom modu, a prilikom prekida mora se sačuvati dovoljno informacija da prekinuti proces može da se nastavi.
  1201.  
  1202. Proces se može naći u nekoliko stanja:
  1203. (running in user mode)
  1204. Proces se trenutno izvršava u korisničkom modu
  1205. (running in kernel mode)
  1206. Proces se trenutno izvršava u kernelskom modu
  1207. (ready)
  1208. Proces je ready: ne izvršava se, nego čeka da scheduler prozove
  1209. (asleep in memory)
  1210. Proces je uspavan: proces blokira svoje izvršavanje zato što ne može dalje da nastavi čekajući na nešto, na primer na I/O da se završi
  1211.  
  1212. Zato što procesor može izvršava samo jedan proces u vremenu, samo jedan proces može biti u stanju 1 ili 2. Svi ostali procesi, osim CPU aktivnog, su u stanju 3 ili 4.
  1213.  
  1214.  
  1215.  
  1216. Procesi često menjaju svoja stanja po dobro poznatim pravilima, koja su prikazana na sledećoj slici, gde krug predstavlja stanje, a ivica sa strelicom predstavlja događaj koji izaziva da se proces pomeri iz jednog stanja u drugo.
  1217. Više procesa mogu biti u memoriji, a takođe više njih mogu raditi u kernelskom modu. Da ne bi došlo do narušavanja kernelskih struktura podataka, kernel ne dozvoljava bilo kakvo prebacivanje konteksta a takođe kontroliše i prekide.
  1218.  
  1219. Kernel dozvoljava prebacivanje konteksta samo kada se proces prebacuje iz stanja kernel running u stanje asleep in memory.
  1220. Proces koji radi u kernelskom modu ne može biti preemptovan od bilo kog drugog procesa, tako da se za kernel kaže da je non-preemptive i na taj način se rešava problem ME u kernelskom modu (samo jedan proces izvršava CS u kerneskom modu i ne može biti preempteed).
  1221. Čak i prekidi mogu biti suspendovani ako mogu da dovedu do problema inkozistencije podataka u kernelu. Takav deo koda se naziva CriticalSection u kernelu i tada kernel podiže CPU nivo da su većina prekida blokirana, samo dok je proces u CS (naravno u kernel modu).
  1222.  
  1223. UNIX kernel sebe štiti tako što dozvolava CSwitch samo na jednom mestu i što blokira prekide koji su opasni u svojim CS (na primer, dok ažurira buffer queue pointere, blokiraće disk prekidi).
  1224.  
  1225.  
  1226. Proces koji radi u kernelskom modu ima veliku autonomiju da odluči kako će da reaguje na sistemske događaje. Ako već mora da čeka na nešto, poželjno je da se uspava-blokira, ali to je odluka samog procesa.
  1227. Na drugoj strani, interrupt handler ne sme da se uspavljuje, jer ako to učini, prekinuti proces bi bio uspavan po defaultu.
  1228.  
  1229. Procesi se uspavljuju zato što čekaju da se neki događaj desi: završetak I/O operacije, čekanje na drugi proces da se završi, čekanje da resurs postane raspoloživ. Procesi se blokiraju na događaj, i kada se on desi prelaze u ready to run. Mnogi procesi mogu biti uspavani na isti događaj, a kada se on desi svi se bude i prelaze u ready queue, nema neposrednog izvršavanja.
  1230.  
  1231. Na primer, proces koji se izvršava u kernelskom modu može lock-ovati neke data strukture pre nego što ode na spavanje. Svi drugi moraju da čekaju na unlock, a dotle i oni idu na spavanje.
  1232.  
  1233.  
  1234. Kernel implementira locks na sledeći način:
  1235. lock
  1236. while(condition is true)
  1237. sleep (event: the condition becomes false)
  1238. set condition true
  1239.  
  1240. Proces obavlja unlock i budi sve procese koji to čekaju:
  1241.  
  1242. unlock
  1243. set condition false;
  1244. wakeup(event: condition is false)
  1245.  
  1246. Većina struktura podataka kernela zauzima
  1247. tabele fiksnih veličina
  1248. radije
  1249. nego dinamički alocirani prostor
  1250.  
  1251. To ima prednosti jer uprošćava kernelski kod,
  1252. ali limitira broj ulaza u kernelskim strukturama.
  1253.  
  1254. Ako se prekorači broj ulaza, korisnik mora da čeka i šalje mu se poruka o grešci, za njegov proces nema ulaza u kernelskoj strukturi.
  1255.  
  1256. Postoje i kerneli koji se mogu adaptirati, ali to se kosi sa efikasnošću i jednostavnošću kernela.
  1257. Postoje razni adminstativni procesi koji obavlja razne funkcije,
  1258. formatiranje diska,
  1259. kreiranje FS,
  1260. podešavanje parametara kernela.
  1261.  
  1262. Za takve procese,
  1263. kernel zahteva root privileguju,
  1264. odnosno da takve procese izvodi specijalni account sa atributima superuser-a.
  1265. Linux = Linus + Unix
  1266. Linux = Unix made by Linus Torvalds
  1267.  
  1268. Jedna od poslednjih varijanti UNIX operativnih sistema,
  1269.  
  1270. razvoj započeo Linus Torvalds
  1271.  
  1272. 1991. godine na Unverzitetu u Helsinkiju,
  1273.  
  1274. Torvalds je svoj operativni sistem koji objedinjuje oba standarda, SRV4 i BSD, objavio na Internetu i podsticao druge programere širom sveta da se priključe njegovom daljem razvoju.
  1275.  
  1276. Ubrzo, Linux je postao veoma popularan među računarskim entuzijastima, koji su tražili alternativno rešenje za postojeće operativne sisteme za PC računare (DOS, Windows).
  1277.  
  1278. Linux je svojom koncepcijom, stabilnog a jeftinog operativnog sistema doživeo veliku ekspanziju i popularnost.
  1279.  
  1280.  
  1281.  
  1282. Linux je raspoloživ kao besplatan operativni sistem
  1283. pod GNU GPL licencom (GNU General Public License),
  1284. što važi i za neke druge vrste UNIX sistema,
  1285. kao što su FreeBSD i NetBSD.
  1286.  
  1287. Linux je softver sa otvorenim izvornim kodom (Open Source), što znači da je mu je izvorni kod javno raspoloživ i može biti modifikovan tako da odgovara specifičnim potrebama.
  1288.  
  1289. Linux se može slobodno distribuirati među korisnicima.
  1290.  
  1291. Ovakav koncept je potpuno suprotan konceptu komercijalnog softvera, gde izvorni kod nije dostupan i svaki korisnik mora da plati licencu za korišćenje. Komercijalni softver je baziran na autorskim pravima (copyright laws), koja preciziraju limite koje korisnici softvera imaju u odnosu na izvorni kod, korišćenje i dalje distribuiranje softvera.
  1292.  
  1293. Linux se besplatno može preuzeti sa različitih web-sajtova.
  1294. GNU stands for “GNU's Not Unix”
  1295.  
  1296.  
  1297. Simbol Linux sistema je mali pingvin (Tux), prikakazan na slici
  1298. Linux je raspoloživ kao besplatan operativni sistem
  1299. pod GNU GPL licencom (GNU General Public License),
  1300. što važi i za neke druge vrste UNIX sistema,
  1301. kao što su FreeBSD i NetBSD.
  1302.  
  1303. Linux je softver sa otvorenim izvornim kodom (Open Source), što znači da je mu je izvorni kod javno raspoloživ i može biti modifikovan tako da odgovara specifičnim potrebama.
  1304.  
  1305. Linux se može slobodno distribuirati među korisnicima.
  1306.  
  1307. Ovakav koncept je potpuno suprotan konceptu komercijalnog softvera, gde izvorni kod nije dostupan i svaki korisnik mora da plati licencu za korišćenje. Komercijalni softver je baziran na autorskim pravima (copyright laws), koja preciziraju limite koje korisnici softvera imaju u odnosu na izvorni kod, korišćenje i dalje distribuiranje softvera.
  1308.  
  1309. Linux se besplatno može preuzeti sa različitih web-sajtova.
  1310. GNU stands for “GNU's Not Unix”
  1311.  
  1312. Brojne profit-orijentisane i neprofitne organizacije čine Linux raspoloživim u formi distribucija, odnosno različitih kombinacija kernela, sistemskog softvera i korisničkih aplikacija. Većina distribicuja sadrži kolekciju CD/DVD medijuma na kojima se nalazi operativni sistem, izvorni kod, detaljna dokumentacija, kao i štampana uputstva za instalaciju i upotrebu sistema. Cene ovakvih distribucija su u većini slučajeva simbolične, osim ako se u distribuciji nalazi komercijalan softver ili je distribucija specifične namene.
  1313.  
  1314. Osnovna komponenta svake Linux distribucije je kernel operativnog sistema.
  1315. Osim kernela i sistemskog softvera, u distribuciji se nalaze:
  1316. instalacioni alati, softver za podizanje operatvnog sistema (boot loader)
  1317. razne korisničke aplikacije (kacelarijski paketi - office suite
  1318. softver za manipulaciju bit-mapiranih slika)
  1319. serverski paketi
  1320.  
  1321. Većina distribucija je poput Windows sistema, grafički orijentisana prema korisniku, dok su neke distribucije namenjene za sistemske administratore i programere familijarne sa tradicionalnim UNIX okruženjem.
  1322. U poznatije Linux distribucije spadaju:
  1323. Debian GNU/Linux (http://www.debian.org),
  1324. Linux Mandrake (http://linux-mandrake.com/en),
  1325. Red Hat Linux (http://www.redhat.com),
  1326. Slackware Linux (http://www.slackware.com) i
  1327. SuSE Linux (http://www.suse.com).
  1328. Ubuntu Linux (http://ubuntu.suse.com)
  1329. Linux je višekorisnički,
  1330. višeprocesni operativni sistem
  1331. sa potpunim skupom UNIX kompatibilnih alata,
  1332. projektovan tako da poštuje relevantne POSIX standarde.
  1333. Linux sistemi podržavaju tradicionalnu UNIX semantiku i potpuno implementiraju standardni UNIX mrežni model.
  1334.  
  1335. Linux operativni sistem sastoji se od:
  1336. kernela
  1337. sistemskog softvera
  1338. korisničkih aplikacija
  1339. programskih prevodioca i njihovih odgovarajućih biblioteka (GCC - GNU C Compiler i C biblioteka za Linux) i
  1340. dokumentacije
  1341. Sadržaj konkretne Linux distribucije definisan je sadržajem instalacionih medijuma, koji u slučaju nekih Linux sistema uključuju razne FTP sajtove širom sveta.
  1342.  
  1343. Kernel je srce operativnog sistema - on omogućava konkurentno izvršavanje procesa, dodeljuje im memoriju i druge resurse i obezbeđuje mehanizam za ostvarivanje servisa operativnog sistema.
  1344. Kernel štiti korisničke procese od direktnog pristupa hardveru - procesi pristupaju hardveru korišćenjem sistemskih poziva kernela, čime se obezbeđuje jedna vrsta zaštite između samih korisnika.
  1345. Sistemski programi koriste kernel u cilju implemetacije različitih servisa operativnog sistema.
  1346.  
  1347. Svi programi, uključujući i sistemske, funkcionišu na nivou iznad kernela, što se naziva korisnički režim rada, dok se sistemske aktivnosti poput pristupa hardveru obavljaju na nivou kernela, odnosno u kernelskom režimu rada.
  1348.  
  1349. Razlika između sistemskih i aplikativnih programa je u njihovoj nameni: aplikacije su namenjene za razne korisne aktivnosti (kao što su obrada teksta i slike), dok su sistemski programi namenjeni za rad sa sistemom i administraciju.
  1350. Na primer tekst procesor je korisnička aplikacija, dok je komanda mount sistemski program. Razlike između korisničkih i sistemskih programa su ponekad veoma male i značajne samo za stroge kategorizacije softvera.
  1351.  
  1352. Tri osnovne verzije Linux kernela su početna verzija, verzija 1.x i verzija 2.x.
  1353. Početna verzija 0.01, koju je 1991. godine kreirao Linus Torvalds, podržavala je samo Intel 80386 kompatibilne procesore, mali broj hardverskih uređaja i Minix sistem datoteka. Mrežni servisi nisu imali kernelsku podršku.
  1354.  
  1355. Verzija 1.0, nastala u martu 1994. godine, uključivala je podršku za standardne TCP/IP mrežne protokole, BSD-kompatibilni socket interfejs za mrežno programiranje i drajversku podršku za mrežne kartice. Ova verzija je dodatno podržavala ext i ext2 sisteme datoteka, široku klasu SCSI disk kontrolera, kao i brojne hardverske uređaje. Verzija 1.2 (mart 1995) je poslednja verzija Linux kernela namenjena isključivo PC arhitekturi.
  1356.  
  1357. U verziji 2.0 (jun 1996) uvedena je podrška za više arhitektura (Motorola i Intel procesori, Sun Sparc i PowerMac sistemi), kao i podrška za višeprocesorsku arhitekturu (SMP). Dodatno, poboljšano je upravljanje memorijom i uvećane se performanse TCP/IP protokol steka, a ugrađena je i podrška za unutrašnje kernelske niti (internal kernel threads). Kernel je modularizovan, odnosno uvedena je mikro-kernel struktura sa izmenljivim drajverskim modulima (loadable kernel modules), a standardizovan je i konfiguracioni interfejs.
  1358. Osnovu Linux sistema čine:
  1359. kernel
  1360. sistemske biblioteke
  1361. sistemski programi
  1362.  
  1363. Kernel je odgovoran za najznačajnije funkcije operativnog sistema.
  1364.  
  1365. Dve osnovne karakteristike kernela su:
  1366.  
  1367. kernel kod se izvršava u kernelskom modu u kome je jedino moguće pristupati svim komponentama hardvera
  1368.  
  1369. kompletan kernel kod i sve kelnel strukture podataka se čuvaju u istom adresnom prostoru (monolithic)
  1370.  
  1371. Kod većine UNIX sistema, aplikacije se preko SC direktno obraćaju kernelu
  1372.  
  1373. Kod Linux sistema, sistemski pozivi se upućuju kernelu preko sistemskih biblioteka,
  1374. koje definišu standardni set funkcija
  1375. preko kojih aplikacije komuniciraju sa kernelom
  1376.  
  1377. Moduli kernela su delovi kernelskog koda koji može da se prevede, napuni u memoriju ili izbaci iz memorije nezavisno od ostatatka kernela.
  1378.  
  1379. Kernelski moduli implemetiraju:
  1380. drajvere za hardverske uređaje
  1381. novi sistem datoteka
  1382. mrežne protokole
  1383.  
  1384. Moduli omogućavaju raznim programerima da napišu i distribuiraju drajvere koji ne moraju da prođu GPL licencu.
  1385.  
  1386. Moduli kernela omogućavaju micro-kernel arhitekturu,
  1387. odnosno realizaciju minimalne stabilne konfiguracije kernela
  1388. bez dodatnih drajvera.
  1389.  
  1390. Potrebni drajveri pune se u memoriju kao moduli kernela.
  1391.  
  1392. Module Linux kernela čine 3 komponente:
  1393. 1. upravljanje modulom, koja omogućava punjenje modula u kernelsku memoriju i komunikaciju modula sa ostatkom kernela, proveru da li je modul u memoriji i da li se koristi i izbacivanje modula iz memorije (pod uslovom da se modul ne koristi).
  1394.  
  1395. 2. registracija drajvera, koja omogućava modulu da objavi ostatku kernela da je novi drajver u memoriji i da je raspoloživ za korišćenje. Kernel održava dinamičku tabelu drajvera, koji se pomoću posebnog seta programa mogu napuniti ili izbaci iz memorije u svakom trenutku,
  1396.  
  1397. 3. rezolucija konflikata, odnosno mehanizam koji služi da spreči hardverske konflikte, tako što omogućava drajveru da rezerviše hardverske resurse (IRQ, DMA, ports) i time spreči druge drajvere ili autoprobe funkciju da ih koriste.
  1398.  
  1399. #lsmod #modprobe #depmod #insmod #rmmod
  1400.  
  1401. Podešavanje putem menija je lakši i pregledniji način izrade konfiguracione datoteke (human-friendly interfejs za konfigurisanje).
  1402. Okruženje sa menijima se pokreće tako što se
  1403. na sistem prijavi root,
  1404. zatim pređe u direktorijum u kome se nalazi izvorni kod kernela
  1405. (na primer /usr/src/kernel-source-2.4.19) i
  1406. pokrene komandu make menuconfig.
  1407. Alat za podešavanje putem menija zahteva da je na sistem instalirana biblioteka ncurses.
  1408. # cd /usr/src/kernel-source-2.4.19
  1409. # make menuconfig
  1410.  
  1411. Podešavanje putem menija počinje spiskom kategorlja u kojima se biraju opcije kernela.:
  1412. Za navigaciju po menijima koriste se kursorski tasteri (strelice),
  1413. za ulazak u podmeni taster Enter.
  1414. Taster Tab služi za prelazak u deo ekrana sa dugmadima
  1415. Select (prikazuje podmeni opcija pridruženih istaknutoj stavci),
  1416. Exit (vraća se na prethodni meni, završavajući podešavanje ukoliko je izabrano sa najvišeg nivoa) i
  1417. Help (prikazuje pomoćni ekran pun informacija o istaknutoj stavci menija).
  1418. Stavke menija koje odreduju neku opciju jezgra, a ne mogu biti modularne, sa leve strane imaju jednu od sledećih oznaka:
  1419. [*] opcija je deo jezgra
  1420. [ ] opcija nije deo jezgra
  1421. Stavke menija koje odreduju neku opciju jezgra, a mogu biti deo jezgra ili realizovane kao modul, sa leve strane imaju jednu od sledećih oznaka:
  1422. < > opcija nije uključena kao deo jezgra, niti napravijena kao modul koji može kasnije da se učita
  1423.  
  1424. <*> opcija je deo jezgra i samim tim je uvek deo sistema.
  1425.  
  1426. <M> opcija je uključena kao modul, ali nije deo samog jezgra. Modul je kasnije po potrebi može učitati ili ukloniti iz jezgra koje se izvršava.
  1427. Oznake sa leve strane ukazuju na trenutno stanje opcije.
  1428. Stanje se može izmeniti jednim od sledećih tastera:
  1429. Y (uključi opciju u jezgro)
  1430. M (uključi opciju kao modul)
  1431. N (opcija se ne uključuje, niti realizuje kao modul).
  1432. Dodatno, pomoću tastera ? se za tekuću opciju na ekranu prikazuje detaljan opis.
  1433.  
  1434.  
  1435. Nakon postavljanja svih opcija na željenu vrednost, potrebno je iz glavnog menija odabrati dugme Exit, nakon čega će se na ekranu pojaviti pitanje da li želite da snimite izmenjenu konfiguracionu datoteku.
  1436.  
  1437. Prevođenje i testiranje novog jezgra
  1438. Nakon kreiranja nove konfiguracione datoteke potrebno je prevesti izvorni kod kernela.
  1439. Zavisno od konfiguracije računara (brzina procesora, količina memorije, tip i brzina diskova) i verzije kernela, prevođenje i sklapanje jezgra traje od nekoliko minuta do nekoliko sati.
  1440. Kernel može biti
  1441. nekomrimovan (image) i
  1442. komprimovan progrogramom gzip ili bzip2 (zlmage, bzimage), koji je manji, ali se sporije učitava.
  1443.  
  1444. Komande za prevođenje variraju sa konkretnom Linux distribucijom, ali su u svakom slučaju jednostavne i mogu izvršavati jedna za drugom zadate iz jedne komandne linije. Komande se mogu zadavati i odvojeno, jedna za drugom.
  1445. Prevođenje i testiranje novog jezgra
  1446.  
  1447. Sledeće komande
  1448. prevode izvorni kod,
  1449. prave novo jezgro i sklapaju sve module jezgra,
  1450. smeštajući ih u odgovarajuće sistemske direktorijume,
  1451. čime se obezbeđuje njihova dostupnost pomoću standardnih komandi za rad sa modulima:
  1452.  
  1453. # make dep; make clean; make zImage; make modules; make modules_install
  1454. Linux kernel čini nekoliko značajnih komponenti:
  1455. upravljanje procesima
  1456. upravljanje memorijom
  1457. upravljanje sistemima datoteka (VFS)
  1458. apstrakcija mrežnih servisa
  1459. podrška za hardverske uređaje
  1460. podrška za različite sisteme datoteka
  1461. podrška za TCP/IP
  1462.  
  1463. Linux koristi standardni UNIX proces mehanizam (fork)
  1464. koji razdvaja kreiranje procesa i
  1465. njegovo izvršenje u dve različite operacije:
  1466. 1. sistemski poziv fork, koji kreira novi proces
  1467. 2. sistemski poziv exec, koji izvršava program u resursima novostvorenog procesa
  1468.  
  1469. Pod UNIX sistemom sve informacije koje operativni sistem mora
  1470. čuvati da bi kontrolisao jedan proces
  1471. predstavljaju kontekst tog procesa.
  1472.  
  1473. Pod Linux operativnim sistemom, svaki proces je u potpunosti opisan sa 3 informacije:
  1474. identitet
  1475. okolina
  1476. kontekst
  1477.  
  1478.  
  1479. Identitet procesa obuhvata sledeće informacije:
  1480. Identifikator procesa (Process ID - PID), pomoću kog Linix kontroliše proces.
  1481. Akreditivi (Credentials). Svaki proces pripada jednom korisniku koji ima svoj user ID i jedan ili više grupnih IDs, koji određuju prava pristupa procesu u radu sa datotekama.
  1482. Ličnost (Personality). Ova informacija se ne koristi kod drugih UNIX sistema, a Linux svakom procesu dodeljuje lični identifikator koji može imati uticaja za neke sistemske pozive.
  1483.  
  1484. Okolina procesa se nasleđuje od procesa roditelja. U okolinu procesa spadaju vektor argumenata koje proces roditelj prosleđuje programu i vektor okoline, odnosno lista promenljivih koje definišu okolinu procesa (environment).
  1485. Kontekst procesa je stanje procesa u datom trenutku vremena.
  1486.  
  1487. Kontekst procesa čine sledeće komponente:
  1488. kontekts za raspoređivanje (scheduling context), koji služi za
  1489.  
  1490. efikasnu suspenziju ili ponovni start procesa. Obuhvata sve CPU registre, prioritet procesa i kernelski stek procesa.
  1491.  
  1492. statistički kontekst, koji sadrži informacije o resursima koje proses koriste u jednom trenutku, kao i kompletnu upotrebu resursa za vreme trajanja jednog procesa (accounting information)
  1493.  
  1494. tabela datoteka (file table), tj. polje ukazivača na kernelske strukture datoteka
  1495.  
  1496. kontekst sistema datoteka (file-system context)
  1497.  
  1498. tabela za upravljanje signalima (signal-handler table), koja definiše ukazivače na programe koji se pozivaju nakon određenog signala
  1499.  
  1500. kontekst virtulene memorije (virtual-memory context), koji potpuno opisuje korišćenje memorije od strane procesa
  1501. Linux koristi istu internu reprezentaciju za procese i niti –
  1502. nit (thread) je jednostavno novi proces
  1503. koji deli adresni prostor roditelja.
  1504.  
  1505. Za razliku od novog procesa koji pomoću sistemskog poziva fork formira novi kontekst sa unikatnim adresnim prostorom,
  1506.  
  1507. nit nastaje pomoću sistemskog poziva clone,
  1508.  
  1509. koji kreira novi kontekst, ali dozvoljava novom procesu da deli adresni prostor roditelja.
  1510.  
  1511. Linux koristi 2 algoritma za dodelu procesora procesima (process-scheduling algorithms):
  1512. 1. time-sharing algoritam za korektno raspoređivanje između procesa (fair preemptive scheduling).
  1513. Dodela se vrši na osnovu prioriteta procesa koji definiše korisnik i kredita (efektivni prioritet) koji raste s porastom vremena čekanja na procesor po sledećoj rekurzivnoj formuli:
  1514.  
  1515. kredit = kredit/2 + prioritet
  1516.  
  1517.  
  1518.  
  1519.  
  1520. 2. real-time algoritam za procese gde su apsolutni prioriteti mnogo značajniji od ravnomerne raspodele. Linux je ipak soft-real time operativni sistem.
  1521.  
  1522.  
  1523. Interprocesna komunikacija obuhvata
  1524. obaveštavanje procesa o događaju i
  1525. prenos podataka s jednog procesa na drugi.
  1526.  
  1527. Kao i UNIX sistem, Linux informiše procese u korisničkom režimu o događaju putem signala.
  1528.  
  1529. Procesi u kernel modu umesto signala,
  1530. koriste specijalnu vrstu deljive memorije
  1531. (wait.queue struktura)
  1532. za interprocesnu komunikaciju.
  1533.  
  1534. Za prosleđivanje podataka između procesa koristi se
  1535. 1. pipe mehanizam, koji omogućava jednosmernu razmenu podataka putem komunikacionog kanala koji proces nasleđuje od roditelja, i
  1536. 2. deljiva memorija, koja je brza i fleksibilna, ali zahteva sinhronizaciju
  1537.  
  1538. Upravljanje memorijom obuhvata
  1539. upravljanje operativnom (RAM) memorijom i
  1540. upravljanje virtuelnom memorijom.
  1541.  
  1542. Upravljanje fizičkom memorijom se bavi alokacijom i oslobađanjem stranice (pages, normal extent), grupe stranica (large extent) i malih memorijskih blokova (small extent).
  1543.  
  1544. Upravljanje fizičkom memorijom se obavlja po sistemu drugova (Buddy heap).
  1545. Cela fizička memorija se deli na udružene blokove čije su veličine stepeni broja 2.
  1546. Blokovi se prema potrebi alokacije dalje razbijaju na manje blokove ili se parovi udružuju u veće celine.
  1547. Linux podržava brojne formate za punjenje i izvršavanje programa. Među njima svakako treba istaći stari UNIX format a.out i novi elf format, koji je maksimalno prilagođen konceptu virtulene memorije.
  1548.  
  1549. ELF format se sastoji od zaglavlja, koje opisuje sekcije programa.
  1550. Sekcije programa su po veličini prilagođenje veličini stanice virtulene memorije.
  1551.  
  1552. Program kod koga su funkcije iz sistemske biblioteke direktno ugrađene u kod programa je program sa statičkim linkovanjem. Glavni nedostatak ovakvog linkovanja je povećanje veličine koda, jer svaki poziv funkcije iz biblioteke kopira celu funkciju u kod. Takođe čim je kod veći, veća je količina memorije potrebna za njegovo izvršavanje.
  1553.  
  1554. Na drugoj strani, dinamičko linkovanje je efikasnije i modernije, sama funkcija se ne kopira u kod, a i manja količina memorije je potrebna za izvršenje.
  1555. Linux deli uređaje u tri klase:
  1556. blok uređaje (poput diskova i CD-ROM uređaja)
  1557. karakter uređaje (poput štampača)
  1558. mrežne uređaje
  1559.  
  1560. Svaki uređaj je predstavljen specijalnom datotekom (device node, device file) koja se nalazi u direktorijumu /dev root sistema datoteka.
  1561.  
  1562. Kada korisnik upisuje podatke u datoteku koja predstavlja neki uređaj ili čita iz te datoteke, vrši se neka ulazno-izlazna operacija, odnosno sistem šalje ili prima podatke sa uređaja koji je predstavljen tom datotekom.
  1563.  
  1564. Time se ukida potreba za postojanjem posebnih programa (a samim tim i posebnom metodologijom programiranja ulazno-izlaznih operacija) neophodnih za rad sa uređajima.
  1565.  
  1566. Na primer, korisnik može da odštampa tekst na štampaču jednostavnom redirekcijom standardnog izlaza na datoteku /dev/lp1 koji predstavlja štampač:
  1567. # cat izvestaj.txt > /dev/lp1
  1568. Ova komanda će korektno odštampati datoteku izvestaj.txt ukoliko je ona u obliku koji štampač razume (npr. tekstualna datoteka).
  1569. Direktorijum /dev nastaje prilikom instalacije Linux sistema i
  1570.  
  1571. u njemu se nalaze sve specijalne datoteke,
  1572. bez obzira na to da li je uređaj instaliran na sistem ili ne –
  1573. postojanje datoteke /dev/sda ne znači da je na sistem instaliran SCSI disk.
  1574.  
  1575. Postojanje svih datoteka olakšava proces instalacije novog hardvera, tj. oslobađa administratora sistema potrebe za kreiranjem specijalnih datoteka sa korektnim parametrima.
  1576. Linux sistemi datoteka koriste hijerarhijsku strukturu stabla i semantku UNIX sistema datoteka.
  1577.  
  1578. Interno, kernel sakriva detalje i upravlja različitim sistemima datoteka preko jednog nivoa apstrakcije, koji se naziva virtuleni sistem datoteka VFS.
  1579.  
  1580. Aktivno Linux stablo datoteka čini jedan ili više sistema datoteka koji su montirani na odgovarajuće direktorijume preko kojih im se pristupa.
  1581.  
  1582. Osnovu aktivnog stabla datoteka čini korenski sistem datoteka (root filesystem), čiji root direktorijum ujedno predstavlja i root direktorijum aktivnog stabla datoteka.
  1583.  
  1584. Zavisno od hardverske konfiguracije i odluke administratora sistema, struktura aktivnog Linux stabla može biti jednostavna (aktivno stablo realizovano jednim sistemom datoteka), ili složena (aktivno stablo realizovano većim brojem sistema datoteka - root, /boot, /var, /usr, /home ...)
  1585.  
  1586. Umrežavanje je ključno područje funkcionalnosti Linux sistema.
  1587. Linux koristi standardni TCP/IP protokol stek
  1588. kao osnovni komunikacioni protokol,
  1589. a dodatno podržava i brojne druge protokole
  1590. koji nisu uobičajeni za komunikaciju dva UNIX sistema (AppleTalk, IPX, Samba).
  1591. Interno, umrežavanje pod Linux sistemom obuhvata tri softverska nivoa:
  1592. socket interfejs
  1593. protokol drajvere
  1594. drajvere za mrežne kartice
  1595.  
  1596.  
  1597.  
  1598. Lesson III: Buffer cache
  1599.  
  1600. Kernel pokusava da smanji broj disk pristupa preko baferskog kesa,
  1601. a to je skup internih bafera podataka
  1602. koji sadrzi podatke nedavno korisüenih disk blokova.
  1603.  
  1604. (read) Kada se proces obraüa datoteci za itanje,
  1605. kernel pokusava da je locira u kesu,
  1606. ako je u kesu ne ita je sa diska (read hit),
  1607. a ako nije prvo se dovede u kes (read miss),
  1608. uvajuüi u kesu one podatke za koje algoritam smatra da su najkorisniji.
  1609.  
  1610. (write) Po pitanju upisa, kes je vrlo beneficijalan,
  1611. moze da kompenzuje visestruka upisivanje ili
  1612. da potpuno elimise upis na disk, (ako usledi proces brisanja datoteke)
  1613. takoe vise odlozenih upisa se mogu kombinovati u optimalnom redosledu.
  1614.  
  1615. Kes algoritam izdaje instrukcije za
  1616. pre-cache (read-ahead) i
  1617. delayed-write da bi se maksimizovao kes efekat.
  1618.  
  1619.  
  1620.  
  1621.  
  1622. Lesson III Slide 1 of 27
  1623. Baferi (Buffers)
  1624.  
  1625. Za vreme sistemske inicijalizacije,
  1626. kernel alocira prostor za odreeni broj bafera (total cache size),
  1627. a taj prostor zavisi od memorijske veliine i sistemskih performansi.
  1628.  
  1629. Bafer se sastoji od 2 dela-komponente:
  1630. bafer: memorijsko polje koje sadrzi podatke, na nivou logikog bloka FS
  1631. bafersko zaglavlje (header) koje identifikuje bafer
  1632.  
  1633.  
  1634. Kernel ispituju zaglavlja kako bi analizirao sadrzaj kes bafera.
  1635.  
  1636.  
  1637.  
  1638. tag data
  1639. memory cache
  1640. memory
  1641.  
  1642.  
  1643. Lesson III Slide 2 of 27
  1644. Baferska zaglavlja (Buffer headers)
  1645.  
  1646. Bafer zaglavlje sadrzi sledeüa polja:
  1647. device number
  1648. block number
  1649. data pointer: ukaziva na blok iz data-area (mora da pokrije sve
  1650. blokove iz data area)
  1651.  
  1652. status:
  1653. locked: bafer je trenutno locked sto znai da je zauzet (puni se ..)
  1654. valid: bafer sadzi validne podatke
  1655. delayed write: kernel mora upisati sadrzaj bafera na disk pre nego sto
  1656. obavi ponovnu dodelu bafera
  1657. in reading/writing: kernel trenutno ita ili pise po baferu
  1658. wait for be free: proces eka da bafer postane slobodan
  1659.  
  1660. set pointera za alokaciju bafera koje koristi kes algoritam
  1661.  
  1662.  
  1663.  
  1664.  
  1665. Lesson III Slide 3 of 27
  1666. Buffer header
  1667.  
  1668.  
  1669.  
  1670.  
  1671. Lesson III Slide 4 of 27
  1672. Struktura bafera (Buffer pool)
  1673.  
  1674. Baferi se opsluzuju po LRU algoritmu:
  1675. kada se bafer dodeli disk bloku,
  1676. taj blok üe ostati tu
  1677. sve dok ne postane najstariji u baferu po pitanju obraüanja.
  1678.  
  1679.  
  1680. Kernel odrzava listu slobodnih bafera u LRU redosledu.
  1681.  
  1682.  
  1683. Slobodna lista je duplo linkovana cirkularna lista sa header-om na
  1684. poetku.
  1685.  
  1686.  
  1687. U poetku, svi su baferi slobodni:
  1688. Buffer is free?
  1689.  
  1690.  
  1691. kernel uzima bafer koji je na poetku free liste
  1692. tada ga izbacuje iz slobodne liste,
  1693. a po povratku ga stavlja na kraj free liste.
  1694.  
  1695.  
  1696.  
  1697.  
  1698. Lesson III Slide 5 of 27
  1699. Struktura bafera (Buffer pool)
  1700.  
  1701.  
  1702.  
  1703.  
  1704. Lesson III Slide 6 of 27
  1705. Struktura bafera (Buffer pool)
  1706.  
  1707. Kada kernel prisitupa disk bloku,
  1708. on pretrazuje sve headers za odgovarajuüu kombinaciju
  1709. <device, block number>
  1710.  
  1711. Da ne bi pretrazivao sva zaglavlja,
  1712. kernel organizuje cache-bafer u odvojene redove (hash queue)
  1713. na bazi hash funkcije od device-block broja.
  1714.  
  1715. Kernel povezuje bafere na duplo linkovani hash redove ekanja, u slinu
  1716. strukturu kao za listu slobodnih blokova.
  1717.  
  1718.  
  1719. Broj bafera za jedan hash queue je promenljiv i zavisno od obraüanja disku.
  1720.  
  1721.  
  1722. Kernel korsiti hash funkciju za raspodelu baferu izmeu hash redova, koja
  1723. mora biti dovoljna brza.
  1724.  
  1725.  
  1726. Broj hash redova se odreuje prilikom podizanja sistema i to moze po
  1727. default-u ili sistem administrator odreuje.
  1728.  
  1729.  
  1730. Lesson III Slide 7 of 27
  1731. hash queue example
  1732.  
  1733.  
  1734.  
  1735.  
  1736. Na levoj strani su headeri, blokovi se rasporeuju u hash redove po funkciji
  1737. LBA mod 4.
  1738. Isprekidane linije ukazuju na hash pointere u oba smera.
  1739. Svaki bafer je u nekom od hash queue, ali moze se dogoditi da bude i u
  1740. slobodnoj listi (never allocated).
  1741.  
  1742.  
  1743. Lesson III Slide 8 of 27
  1744. Tehnike za dobijanje podataka iz bafera
  1745.  
  1746. Kes algoritam upravlja baferskim kesom. Za svako itanje sa diska kernel
  1747. mora prvo da odredi da li je blok u kesu (cache buffer pool) i ako nije tamo
  1748. mora da mu dodeli slobodan bafer. To se isto desava i prilikom upisa, oba
  1749. algoritma i za itanje i za upis koriste uveni UNIX getblk algoritam koji
  1750. fukcionise na sledeüi nain.
  1751.  
  1752. Algoritam getblk ima 5 moguüih scenarija prilikom dodele baferu u kesu:
  1753. #1 Kernel pronalazi bafer u njegovom hash queue i bafer je slobodan (hit&free)
  1754.  
  1755. #2 Kernel ne nalazi bafer u njegovom hash queue, zato moze da alocira bafer iz
  1756. free liste (miss&there is free)
  1757.  
  1758. #3 Kernel ne nalazi bafer u njegovom hash queue, zato moze da alocira bafer iz
  1759. free liste ali taj bafer ima atribut delayed write, sto znai da mora prvo da se upise
  1760. na disk (miss&there is free, dirty)
  1761.  
  1762. #4Kernel ne nalazi bafer u njegovom hash queue, ali i free lista je prazna
  1763. (miss&there is no free)
  1764.  
  1765. #5 Kernel nalazi bafer u njegovom hash queue, ali je taj bafer locked (busy), neko
  1766. drugi ga je vec da ga ita (hit&busy)
  1767.  
  1768. Paznja: blok je free, ako je u free listi, koja znai da ga niko ne koristi pri emu
  1769. moze biti u hash listi ili ne..
  1770.  
  1771. Lesson III Slide 9 of 27
  1772. getblk (block is in the cache)
  1773.  
  1774. algoritam getblk
  1775. input: FS number, block number
  1776. output: locked buffer that can now be used for block
  1777. {
  1778. while (buffer not found)
  1779. {
  1780. if (buffer in hash queue)
  1781. {
  1782. if (buffer busy) /*scenario 5*/
  1783. {
  1784. sleep (event buffer becomes free);
  1785. continue; /* back to while lop*/
  1786. }
  1787. mark buffer busy; /*scenario 1*/
  1788. remove buffer from free list; /*lock*/
  1789. return buffer;
  1790. }
  1791.  
  1792.  
  1793.  
  1794. Lesson III Slide 10 of 27
  1795. getblk (block is not in the cache)
  1796.  
  1797. else /*block not on hash queue*/
  1798. {
  1799. if (there are no buffers on free list) /*scenario 4*/
  1800. {
  1801. sleep (event any buffer becomes free);
  1802. continue; /* back to while lop*/
  1803. }
  1804. remove buffer from free list; /*lock*/
  1805. if (buffer marked for delayed write) /*scenario 3*/
  1806. {
  1807. asynchronous write buffer to disk;
  1808. continue; /* back to while loop*/
  1809. }
  1810. /* scenario 2 ­ found a free buffer*/
  1811. remove buffer from old hash queue;
  1812. put buffer onto new hash queue;
  1813. return buffer;
  1814. }/*else*/ }/*while*/ }/*main*/.
  1815.  
  1816. Lesson III Slide 11 of 27
  1817. scenario #1 (searching)
  1818.  
  1819.  
  1820. Trazimo blok 4, blok 4 se nalazi u hash queue 0 i slobodan je
  1821.  
  1822.  
  1823. hash queue headers
  1824.  
  1825.  
  1826. block number 0 mod 4 28 4 64
  1827.  
  1828. block number 1 mod 4 17 5 97
  1829.  
  1830. block number 2 mod 4 98 50 10
  1831.  
  1832. block number 3 mod 4 3 35 99
  1833.  
  1834.  
  1835. freelist header
  1836.  
  1837.  
  1838.  
  1839.  
  1840. Lesson III Slide 12 of 27
  1841. scenario #1 (allocating)
  1842.  
  1843. Blok 4 je naen, izbacuje se iz free liste
  1844.  
  1845.  
  1846.  
  1847. hash queue headers
  1848.  
  1849.  
  1850. block number 0 mod 4 28 4 64
  1851.  
  1852.  
  1853. block number 1 mod 4 17 5 97
  1854.  
  1855.  
  1856. block number 2 mod 4 98 50 10
  1857.  
  1858.  
  1859. block number 3 mod 4 3 35 99
  1860.  
  1861.  
  1862.  
  1863. freelist header
  1864.  
  1865.  
  1866.  
  1867.  
  1868. Lesson III Slide 13 of 27
  1869. after allocating
  1870.  
  1871. Pre nego sto objasnimo ostale scenarije, demonstrirajmo sta se desava kada
  1872. se bafer dodeli.
  1873.  
  1874.  
  1875. Svaki proces posle getblk dobija bafer koga kernel je locked samo za njega.
  1876. Iza toga blok moze da se ita da se upisuje i
  1877.  
  1878.  
  1879. sve dok mu kernel drzi lock, nijedan proces ne moze pristupiti tom baferu.
  1880.  
  1881.  
  1882. Kada proces obavi svoje, bafer se mora osloboditi preko algoritma brelse.
  1883.  
  1884.  
  1885. Uvek kada se azurira free lista, prekidi moraju biti blokirani.
  1886.  
  1887.  
  1888.  
  1889.  
  1890. Lesson III Slide 14 of 27
  1891. algoritam brelse
  1892.  
  1893. algoritam brelse
  1894. input: locked buffer
  1895. output: none
  1896. {
  1897. wakeup all procs: event, waiting for any buffer to become free;
  1898. wakeup all procs: event, waiting for this buffer to become free;
  1899. raise CPU execution level to block interrupts;
  1900. if (buffer contents valid and buffer not old)
  1901. enqueue buffer at the end of free list
  1902.  
  1903.  
  1904. else
  1905. enqueue buffer at the beginning of free list
  1906. lower CPU execution level to allow interrupts;
  1907. unlock(buffer);
  1908. }/*main*/.
  1909.  
  1910.  
  1911.  
  1912.  
  1913. Lesson III Slide 15 of 27
  1914. scenario 2. a) Trazimo blok 18, nije u kesu
  1915.  
  1916. hash queue headers
  1917.  
  1918.  
  1919. block number 0 mod 4 28 4 64
  1920.  
  1921.  
  1922. block number 1 mod 4 17 5 97
  1923.  
  1924.  
  1925. block number 2 mod 4 98 50 10
  1926.  
  1927.  
  1928. block number 3 mod 4 3 35 99
  1929.  
  1930.  
  1931.  
  1932. freelist header
  1933.  
  1934.  
  1935.  
  1936.  
  1937. Lesson III Slide 16 of 27
  1938. scenario 2. b) Uklanja se prvi blok iz free liste i
  1939. dodeljuje novom bloku 18
  1940.  
  1941.  
  1942.  
  1943. hash queue headers
  1944.  
  1945.  
  1946. block number 0 mod 4 28 4 64
  1947.  
  1948.  
  1949. block number 1 mod 4 17 5 97
  1950.  
  1951.  
  1952. block number 2 mod 4 98 50 10 18
  1953.  
  1954.  
  1955. block number 3 mod 4 35 99
  1956.  
  1957.  
  1958. freelist header
  1959.  
  1960.  
  1961.  
  1962.  
  1963. Lesson III Slide 17 of 27
  1964. scenario 3. a) Trazimo blok 18, nije u kesu, ali 3 i 5
  1965. moraju da se upisu na disk
  1966.  
  1967. hash queue headers
  1968.  
  1969.  
  1970. block number 0 mod 4 28 4 64
  1971.  
  1972.  
  1973. block number 1 mod 4 17 5delay 97
  1974.  
  1975.  
  1976. block number 2 mod 4 98 50 10
  1977.  
  1978.  
  1979. block number 3 mod 4 3delay 35 99
  1980.  
  1981.  
  1982.  
  1983. freelist header
  1984.  
  1985.  
  1986.  
  1987.  
  1988. Lesson III Slide 18 of 27
  1989. cenario 3. b) Blokovi 3 i 5 se upisuju a prvi
  1990. slobodni se dodeljuje za 18, a to je 4
  1991.  
  1992.  
  1993.  
  1994. hash queue headers
  1995.  
  1996.  
  1997. block number 0 mod 4 28 64
  1998.  
  1999.  
  2000. block number 1 mod 4 17 5-write 97
  2001.  
  2002.  
  2003. block number 2 mod 4 98 50 10 18
  2004.  
  2005.  
  2006. block number 3 mod 4 3-write 35 99
  2007.  
  2008.  
  2009. freelist header
  2010.  
  2011.  
  2012.  
  2013.  
  2014. Lesson III Slide 19 of 27
  2015. scenario 4. a) Trazimo blok 18, nije u kesu, nema
  2016. ni jednog slobodnog bloka
  2017. free list je prazna
  2018.  
  2019.  
  2020. hash queue headers
  2021.  
  2022.  
  2023. block number 0 mod 4 28 4 64
  2024.  
  2025.  
  2026. block number 1 mod 4 17 5 97
  2027.  
  2028.  
  2029. block number 2 mod 4 98 50 10
  2030.  
  2031.  
  2032. block number 3 mod 4 3 35 99
  2033.  
  2034.  
  2035. freelist header
  2036.  
  2037.  
  2038. Proces mora otiüi na spavanje sve dok neko ne obavi algoritam brelse koji üe
  2039. osloboditi bar jedan bafer.
  2040. ak i da je u kesu hit, proces mora na spavanje.
  2041.  
  2042. Lesson III Slide 20 of 27
  2043. scenario 5. a) Trazimo blok 99, u kesu je,
  2044. ali je trenutno zauzet (locked)
  2045. Proces mora da eka da blok bude osloboen.
  2046.  
  2047. hash queue headers
  2048.  
  2049.  
  2050. block number 0 mod 4 28 4 64
  2051.  
  2052.  
  2053. block number 1 mod 4 17 5 97
  2054.  
  2055.  
  2056. block number 2 mod 4 98 50 10
  2057.  
  2058.  
  2059. block number 3 mod 4 3 35 99
  2060.  
  2061. busy
  2062. freelist header
  2063.  
  2064.  
  2065.  
  2066.  
  2067. Lesson III Slide 21 of 27
  2068. itanje i upis kroz bafer bread
  2069.  
  2070. Algoritam za itanje je bread.
  2071. Kod njega su 2 glavne karaktersitike, a cache hit i cache miss.
  2072.  
  2073.  
  2074. algorthm bread() /* block */
  2075. input: file system block number
  2076. output: buffer containing data
  2077. {
  2078. get buffer for block (algorithm getblk);
  2079. if (buffer data valid) return (buffer); /*hit*/
  2080. else
  2081. initiate disk read; /*miss*/
  2082. sleep (event disk read complete);
  2083. return (buffer);
  2084. }
  2085.  
  2086.  
  2087.  
  2088.  
  2089. Lesson III Slide 22 of 27
  2090. read-ahead (breada)
  2091. Za poveüanje performansi koristi se read-ahead tehnika:
  2092.  
  2093. algoritam breada /* block read and read ahead*/
  2094. input:
  2095. (1) file system block number for immediate read
  2096. (2) file system block number for asynchronous read
  2097. output: buffer containing data for immediate read
  2098. {
  2099. if (first block not in the cache) /*cache miss*/
  2100. {
  2101. get buffer for first block (algorithm getblk);
  2102. if (buffer data not valid) initiate disk read;
  2103. }
  2104. if (second block not in the cache)
  2105. {
  2106. get buffer for second block (algorithm getblk);
  2107. if (buffer data valid) release buffer (algorithm brelse)
  2108. else initiate disk read;
  2109. }
  2110.  
  2111.  
  2112.  
  2113. Lesson III Slide 23 of 27
  2114. read-ahead (breada)
  2115. if (first block was originally in the cache)
  2116. {
  2117. read first block (algorithm bread);
  2118. return buffer;
  2119. }
  2120.  
  2121. sleep (event first buffer contains valid data)
  2122. return buffer
  2123.  
  2124. }/*main*/
  2125. miss (2 read=read normal + read ahead)
  2126. Ako prvi blok nije u kesu odvija se sinhrono disk itanje sa sleep-om,
  2127. a ako je u kesu zadaje je neposredno prosleivanje bafera.
  2128. Odmah se obavlja asinhroni read-ahead, proveri se da li je sledeüi
  2129. sekvencijalni blok u kesu.
  2130. Ako jeste nikom nista, ali ako nije nae se blok u kesu (getblk) i ako je
  2131. dodeljeni bafer prazan, inicira se asinhrono disk itanje.
  2132.  
  2133. hit (no disk reading)
  2134. Ako dodeljeni bafer veü ima validne podatke read-ahead se ne izvrsava,
  2135. veü se bafer otpusta (to je hit za read-ahead).
  2136.  
  2137.  
  2138. Lesson III Slide 24 of 27
  2139. upis kroz bafer (bwrite)
  2140. Algoritam za upis je bwrite. 2 glavne karaktersitike, cache hit i cache miss.
  2141. algorthm bwrite() /* block */
  2142. input: buffer to be written
  2143. output: none
  2144. {
  2145. initiate disk write; /* ovaj I/O mozda se obavlja ili sihrono ili delayed */
  2146. if(I/O synchronous)
  2147. {
  2148. sleep (event I/O complete)
  2149. release buffer (algorithm brelse);
  2150. }
  2151. else if (buffer marked for delayed write);
  2152. mark buffer to put at head of free list;
  2153. }
  2154.  
  2155.  
  2156.  
  2157.  
  2158. Lesson III Slide 25 of 27
  2159. upis kroz bafer (bwrite)
  2160. Pretpostavimo da je upis hit(in_cache) i kernel daje nalog za upis na disk.
  2161. Taj nalog moze biti sinhroni i DW.
  2162. Ako je sinhroni write, kernel upisuje blok na disk i eka da se I/O zavrsi.
  2163.  
  2164.  
  2165. Ako delayed write, to se markira za taj bafer i ne vrsi se I/O, a bafer se
  2166. osloboa.
  2167.  
  2168.  
  2169. Upis se inicira u getblk algoritmu po scenariju 3 kada je DW blok u free listi, a
  2170. dodeljen je novi blok iz free liste.
  2171. Ti DW baferi se iniciraju za write, odnosno praznjenje.
  2172. DW blokovi se potiskuju na poetak free liste kako bi se praznili na svaki kes
  2173. miss.
  2174.  
  2175.  
  2176.  
  2177.  
  2178. Lesson III Slide 26 of 27
  2179. Prednosti i nedostaci baferskog kesa
  2180.  
  2181. Prednosti:
  2182. Smanjuje disk trafic
  2183. DW je izrazita prednost
  2184. kes je kernelska memorija koja je zastiüena i dobro sinhronizovana,
  2185. nije podlozna programerskim ili korisnikim greskama
  2186.  
  2187.  
  2188. Nedostaci:
  2189. meutransfer, sa diska u kes, pa u user buffer
  2190. DW moze dovesti do gubitka podataka, sto se ublazava sa
  2191. journaling tehnikom
  2192.  
  2193.  
  2194.  
  2195.  
  2196. Lesson III Slide 27 of 27
  2197.  
  2198.  
  2199.  
  2200. PREDAVANJE 4:
  2201.  
  2202. Svaka datoteka na UNIX sistemu ima jedinstveni inode,
  2203.  
  2204. inode sadrži sve informacije potrebne da odrede prava pristupa datoteci, kao što su vlasništvo, prava pristupa, veličina datoteke, lokacija datoteke na disku.
  2205. Procesi pristupaju datoteci preko jasno definisanog skupa sistemskih poziva.
  2206. Algoritmi koje obrađujemo se nalaze na nivou iznad baferskog keša.
  2207. To su:
  2208. iget: vraća vrednost prethodno identifikovanog inoda, (moguće je čitanje iz inode tabele preko baferskog keša)
  2209.  
  2210. iput: otpušta inode
  2211.  
  2212. bmap: postavlja kernelske parametre za pristupanje datoteci
  2213.  
  2214. namei: konvertuje ime datoteke u inode koristeći algoritme iget, iput i bmap.
  2215.  
  2216. alloc i free alociraju i oslobađaju slobodne disk blokove za datoteku
  2217.  
  2218. ialloc i ifree alociraju i oslobađaju slobodne inode-ove za datoteke
  2219.  
  2220. INODES
  2221. Definicija:
  2222. struktura koja potpuno opisuje datoteku
  2223. sve osim imena
  2224.  
  2225. Postoje 2 strukture:
  2226. -disk inode
  2227. to su inodes u statičkoj formi na disku (in inode table)
  2228. pasive files
  2229. -in-core inode.
  2230. disk inode kernel čita u memorijsku strukturu koja se naziva nazvati in-core inode
  2231. active files
  2232.  
  2233. Disk inode se sastoji od sledećih polja:
  2234. vlasništvo se deli na 2 komponente, na korisničko vlasništvo i grupno vlasništvo i ta dva identifikatora određuju vlasničke odnose grupe prema datoteci
  2235. vlasnik datoteke (UID identifikator).
  2236. grupa kojoj pripada datoteka (GID identifikator)
  2237.  
  2238. tip datoteke: datoteka može biti regularna, direktorijum, karakter ili blok specijalna datoteka, FIFO (pipe)
  2239.  
  2240. prava pristupa za datoteku: definišu se preko
  2241. 3 vlasničke kategorije (owner, group, other)
  2242. 3 prava pristupa za njih (read, write, execute) koja imaju precizno značenje, a nezavisno se deklarišu
  2243.  
  2244. vremena pristupa datoteke: ima 3 karakteristična vremena (vreme poslednje modifikacije, vreme poslednjeg pristupa, i vreme kad je inode poslednji put modifikovan)
  2245.  
  2246. broj linkova na datoteku: predstavlja broj različitih imena za isti prostor na disku
  2247.  
  2248. tabela koja opisuje alokaciju datoteke na disku
  2249.  
  2250. veličina datoteke
  2251. Inode ne opisuje path imena već svaka path komponenta ima poseban inode.
  2252.  
  2253. U ovom primeru imamo regularnu datoteku veličine 6030 bajtova čiji je vlasnik user mjb sa pravima pristupa rwx, datoteka pripada grupi os i svi članovi grupe imaju r i x pravo bez w prava, dok svi ostali useri imaju r i x pravo bez w prava. Poslednji put je neko pristupao i to samo čitao datoteku 23. oktobra 2004 u 1:45 PM, a posledni put je neko upisao nešto u datoteku 22. oktobra 2004 u 10:30 AM. Inode je promenjen zadnji put 23. oktobra u 1:30 PM.
  2254. Postoji razlika između upisa u datoteku i upisa u inode, svaka promena u datoteci se reflektuje u inode, dok postoje promene koje idu samo u inode a nemaju veze sa upisom datoteku, kao što je promena vlasništva, grupe, prava pristupa ili link setovanje.
  2255.  
  2256. n-core inode sadrži dodatne informacije u odnosu na polja disk inode::
  2257.  
  2258. Status in-core inoda koji pokazuje:
  2259. da li inode zaključan (locked)
  2260. da li proces čeka da inode postane otključan (unlocked)
  2261. da li se in-core inode razlikuje od svoje disk kopije kao rezultat promene polja u inode
  2262. da li se in-core inode razlikuje od svoje disk kopije kao rezultat promene podataka u datoteci
  2263. da li je ta datoteka postala mountpoint
  2264.  
  2265. FS descriptor(opis FS): u vidu logičkog broja koji sadrži tu datoteku, odnosno iz kog FS je taj inode
  2266.  
  2267. inode broj: in-core inode poseduje i ovo polje zato što na disku se pozicija inode određuje u polju fiksnog formata, zna se offset, a u memoriji polje nije fiksno i mora da se zna koji je inode u in-core tabeli
  2268.  
  2269. ukazivači na druge in-core inodove. Kernel povezuje in-core inode-ove u hash queue liste i slobodne liste na sličan način kao kod baferskog keširanja. Hash queue se idetifikuje na osnovu FS i inoda broja. Kernel sadrži najviše jednu kopiju disk inoda, a ona može biti ili u hash queue ili u slobodnoj listi.
  2270.  
  2271. broj referenci, pokazuje broj aktivnih instanci na tu datoteku, broj procesa koji su otvorili datoteku, odnosno taj inode
  2272.  
  2273. Mnoga polja u in-core(inode) su analogna poljima u baferskom zaglavlju
  2274. upravljanje incore inodovima je slično kao i kod baferskog keša.
  2275.  
  2276. Kada se inode zaključa, ostali procesi ne mogu da ga otvore, a ostali procesi postave svoje flagove da su zainteresovani za taj inode i da ih treba probuditi kada se inode otključa.
  2277.  
  2278. Kernel postavlja i druge flagove koji ukazuju na razliku između disk inode i njegove in-core kopije, kako bi na bazi tih flagova sravnjuje(destage) stanje inoda na disku.
  2279.  
  2280. Najveća razlika između incore inoda i bafer zaglavlja je u broju referenci za in-core inode koga uopšte nema kod baferskog keš zaglavlja.
  2281.  
  2282. Svaki proces koji pristupa in-core inodu povećava mu reference count
  2283. inode može biti u free listi samo ako je RC=0.
  2284. Samo takav inode može napustiti in-core,
  2285. dok kod baferskog keša, bafer je free listi samo ako je otključan (unlocked)
  2286.  
  2287. algorithm iget
  2288. input: file system and inode number
  2289. output: locked inode
  2290. {
  2291. while(not done)
  2292. {
  2293. if(inode in inode cache) /* if #1*/ /*in-core hit*/
  2294. {
  2295. if(inode locked) /* if #2*/
  2296. {
  2297. sleep (event inode becomes unlocked);
  2298. continue; /* loop back to while*/
  2299. }/* if #2*/
  2300. }/*if #1*/
  2301. /*special processing for mount point directory*/
  2302.  
  2303. if(inode on inode free list) remove from free list; #if inode on the free list, incore inode used by no processes
  2304. increment inode reference count;
  2305. return (inode);
  2306.  
  2307. /* inode not in inode cache*/ /*in-core miss*/
  2308.  
  2309. if(no inodes on free list) return(error) #table is full, no chance
  2310.  
  2311. #creation of new incore inode
  2312. remove new inode from free list; # in inode cache
  2313.  
  2314. reset inode number in free list; # in inode cache
  2315.  
  2316. remove inode from old hash queue, place on new one;
  2317.  
  2318. read inode from disk(algorithm bread);
  2319.  
  2320. initialize inode (eg. reference count to 1) (RC=1)
  2321.  
  2322. return(inode)
  2323. }/*while*/
  2324. }/*main*/
  2325.  
  2326. Pristupanje inodovima
  2327. Kernel identifikuje partikularni inode preko:
  2328. FS number
  2329. inode number
  2330. a alocira incore inode preko iget algoritma koji veoma podseća na getblk algoritam.
  2331.  
  2332. Kernel mapira FS broj i inode broj u hash queue i traži inode u odgovarajući hash queue.
  2333.  
  2334. Moguće su 2 situacije:
  2335.  
  2336. in-core hit: RC++; lock of inode;
  2337.  
  2338. in-core miss
  2339. Ako ne može da ga nađe, alocira slobodan inode iz free liste, lockuje ga i počinje čitanje disk inode u svoju in-core kopiju.
  2340.  
  2341. Pristupanje disk-inode-ovima:
  2342. disk inode se određuje prema formuli:
  2343.  
  2344. block num=
  2345. ((inode number - 1 )/ number of inodes per block)
  2346. +
  2347. start block of inode list)
  2348.  
  2349. taj blok se čita pomoću algoritma bread.
  2350.  
  2351.  
  2352. Kako je inode tipična struktura od 64 ili 128 bajtova, offset unutar bloka se određuje:
  2353. offset =
  2354. ((inode number - 1 ) % number of inodes per block))
  2355. * size of disk inode
  2356.  
  2357. Kernel manipulira sa inode lock i RC nezavisno.
  2358.  
  2359. Kernel lock inode svaki put kad treba da zaštiti inode od drugih procesa,
  2360.  
  2361. Reference Count (RC)
  2362. svaki open SC povećava RC,
  2363. svaki close SC dekrementira RC.
  2364.  
  2365. Nikada se inode ne lockuje sa posebnim SC,
  2366. lock i unlock of inode se obavljaju u toku SC
  2367. (iget: lock by iget, unlock by status field in incore),
  2368. (iput: lock and unlock by iput)
  2369.  
  2370. Kada kernel oslobađa inode,
  2371.  
  2372. prvo se dekrementira incore RC za taj inode.
  2373.  
  2374. Ako RC padne na 0,
  2375. kernel upisuje incore inode na disk inode samo ako ima promena.
  2376. incore inode ide u free listu.
  2377. ako i LC padne na 0, kernel takođe može oslobadja blokove podataka datoteke (brisanje)
  2378.  
  2379. Incore inode je i dalje tu (u kešu) ali se može izbaciti ako nema više mesta u inode cache memoriji.
  2380.  
  2381. IPUT
  2382. algorithm iput /* access to in core inode*/
  2383. input: pointer to incore inode
  2384. output: none
  2385. {
  2386. lock inode if not already locked;
  2387. decrement inode reference count; RC- -;
  2388. if(reference count == 0)
  2389. {
  2390. if(link count == 0) {
  2391. free disk blocks for file (algorithm free);
  2392. set file type to 0;
  2393. free inode (algorithm ifree) }
  2394. if (file accessed or inode changed or file changed) update disk inode;
  2395. put inode on free list;
  2396. } /*RC is not 0*/
  2397. release inode lock;
  2398. }/*main*/
  2399.  
  2400. Struktura regularne datoteke
  2401. Svaki blok na disku ima unikatnu adresu, i može pripadati samo jednoj datoteci.
  2402. Svi blokovi koji pripadaju datoteci moraju se naći u inodu te datoteke.
  2403. Da bi inode imao malu veličinu, ali da bi mogao opisivati efikasno i male ali i veoma velike datoteke, koriste se inode šema uvedena na UNIX System V na primer sa 13 ulaza.
  2404. Broj ulaza može biti proizvoljan kao i broj stepena indirekcije.
  2405.  
  2406. File max
  2407. Sa 32 bitnim pointerima, 1K blokovima = 256 pointers per block
  2408.  
  2409. 10 direct blocks with 1K bytes each = 10K bytes
  2410.  
  2411. 1indirect block with 256 direct blocks = 256K bytes
  2412.  
  2413. 1double indirect block with 256 indirect blocks = 64M bytes
  2414.  
  2415. 1triple indirect block with 256 double indirect blocks= 16G bytes
  2416.  
  2417. algorithm bmap
  2418. /*block map of logical file byte offset to file system block*/
  2419. byte offset ->FS block
  2420.  
  2421. algorithm bmap
  2422. input:
  2423. (1) inode
  2424. (2) byte offset
  2425. output:
  2426. (1) block number in file system
  2427. (2) byte offset into block
  2428. (3) bytes of I/O in block
  2429. (4) read ahead block number
  2430.  
  2431. {
  2432. calculate logical block number in file from byte offset; (byte_offset/1K)
  2433.  
  2434. calculate start byte in block for I/O; (byte_offset%1K) /* output 2*/
  2435.  
  2436. calculate number of bytes to copy to user; /* output 3*/
  2437.  
  2438. check if read – ahead applicable, mark inode; /*output 4/*
  2439. determine level of indirection;
  2440.  
  2441. while (not at necessary level of indirection)
  2442. {
  2443. calculate index into inode or indirect block from logical block number in file;
  2444. get disk block number from inode or indirect block;
  2445.  
  2446. release buffer from previous disk read, if any (algorithm brelse);
  2447.  
  2448. if (no more levels of indirections) return(block number);
  2449.  
  2450. read indirect disk block (algorithm bread)
  2451. adjust logical block in file according to level of indirection;
  2452. }
  2453. }
  2454.  
  2455. Moguće su 0 u pointerima,
  2456. to znači da proces nije nikada ništa upisao na tom offsetu i
  2457. ti blokovi ostaju na 0, tj sadrže 0-le
  2458. a ne troše prostor na disku.
  2459.  
  2460. BSD uvodi veće sistemske blokove 4K, 8K i
  2461. uvodi pojam block/fragment,
  2462.  
  2463. gde jedan sistemski blok može sadržavati fragmente
  2464.  
  2465. koji pripadaju različitim datotekama.
  2466.  
  2467. To zahteva modifikaciju inode strukture.
  2468.  
  2469. Direktorijumi
  2470. To su specijalne datoteke koje imaju značajne uloge za UNIX stablo.
  2471. Sastoje se od specijalnh struktura FCB,
  2472. od kojih svaka odgovara jednoj datoteci, a
  2473. sadrže ime datoteke i inode koji joj pripada.
  2474.  
  2475. UNIX System V ima maksimum 14 bajtova za ime i 2 bajta za inode.
  2476.  
  2477. Evo jednog isečka etc direktorijuma:
  2478. prvi ulaz . predstavlja sam taj direktorijum, drugi ulaz .. odgovara roditelskoj grani, ostalo su grane i datoteke
  2479.  
  2480. Mada se direktorijumi tretiraju kao datoteke,
  2481. kernel ne dozvoljava direktan upis u direktorijume
  2482. upis u diride preko SC poziva, creat, mknod, link i unlink SC.
  2483.  
  2484. Program mkfs kreira root direktorijum koji ima 2 ulaza . i .. koji dele isti inode i to je root direktorijum.
  2485.  
  2486. Inicijalni pristup datoteci se odvija preko njenog path imena u SC kao što su open, chdir ili link.
  2487.  
  2488. Kernel interno radi sa inodovima, radije nego sa path imenima, (ovo su brojevi, a ovo su imena različitih veličina).
  2489.  
  2490. Algoritam namei konvertuje path imena u inodove preko kojih se pristupa datoteci.
  2491.  
  2492. Algoritam namei razbija pathname
  2493. na jednu pojedinačnu komponentu iz imena
  2494. u jednom trenutku,
  2495. konvertujući to ime u njegov inode,
  2496. tako što nalazi FCB tog imena u roditeljskom direktorijumu.
  2497. Svaki proces ima svoj tekući direktorijum čiji se inode upisuje u u-area za taj proces.
  2498.  
  2499. Proces dobija tekući direktorijum od svog procesa roditelja, a može ga promeniti preko chdir SC.
  2500.  
  2501. Sve path komponente startuju od tekućeg direktorijuma, osim ako nemaju leading /, koji ukazuju da sve počinje od root direktorijuma.
  2502.  
  2503. Kernel to zna da identifikuje, a u-area sadrži tekući direktorijum
  2504. dok se root inode čuva u globalnoj varijabli.
  2505.  
  2506. Algoritam namei koristi među-inodove ili srednje inodove ili working inodove, a ima iterativnu petlju u čijem svakom prolazu se analizira jedna grana, za koju user mora imati r i x pravo.
  2507. Svaki proces ima svoj tekući direktorijum čiji se inode upisuje u u-area za taj proces.
  2508.  
  2509. Proces dobija tekući direktorijum od svog procesa roditelja, a može ga promeniti preko chdir SC.
  2510.  
  2511. Sve path komponente startuju od tekućeg direktorijuma, osim ako nemaju leading /, koji ukazuju da sve počinje od root direktorijuma.
  2512.  
  2513. Kernel to zna da identifikuje, a u-area sadrži tekući direktorijum
  2514. dok se root inode čuva u globalnoj varijabli.
  2515.  
  2516. Algoritam namei koristi među-inodove ili srednje inodove ili working inodove, a ima iterativnu petlju u čijem svakom prolazu se analizira jedna grana, za koju user mora imati r i x pravo.
  2517. algorithm namei /* convert path name to inode*/
  2518. input: path name
  2519. output: locked inode = locked incore inode)
  2520. {
  2521. if (path name starts from root)
  2522. working inode = root inode (algorithm iget);
  2523. else
  2524. working inode = current directory inode (algorithm iget);
  2525. while (there is more path name)
  2526. {
  2527. read next path name component from input;
  2528. verify that working inode is of directory, access permissions OK;
  2529. if (working inode is of root and component is “..”) continue;
  2530. /*loop back to while*/
  2531. read directory (working inode)
  2532. by repeated use of algorithms bmap, bread and brelse
  2533.  
  2534. if (component matches an entry in directory (working inode))
  2535. {
  2536. get inode number for matched component;
  2537. release working inode (algorithm iput);
  2538. working inode = inode of matched component (algorithm iget)
  2539. }
  2540. else
  2541. return (no inode);
  2542. }/* while */
  2543. return (working inode);
  2544. }
  2545.  
  2546. namei
  2547. Kernel obavlja linearno pretraživanje datoteka
  2548. koje se nalaze u working inodu,
  2549. pokušavajući da nađu sledeću path komponentu,
  2550. startujući u offsetu 0,
  2551.  
  2552. Preko bmap se određuje blok na disku
  2553. koji se čita preko bread,
  2554. a kada se blok dobije on se otpušta preko brelse.
  2555.  
  2556. Potom se direktorijumski blok pretražuje za path komponentu i
  2557. ako je nađe iz FCB se dobija njen inode,
  2558. a oslobađa se stari working inode,
  2559. uzima novi sa iget.
  2560.  
  2561. Ako ne nađe podudarenje,
  2562. mora pročitati sve direktorijumske blokove dok ne nađe FCB,
  2563. a može se dogoditi slučaj da ga uopšte ne nađe.
  2564.  
  2565. Super Block
  2566.  
  2567. Superblock se sastoji od sledećih polja:
  2568. veličina FS
  2569.  
  2570. broj slobodnih blokova u FS
  2571.  
  2572. lista slobodnih blokova raspoloživih u FS
  2573.  
  2574. Index/ukazivač na sledeći slobodan blok u free block listi
  2575.  
  2576.  
  2577. veličina inode tabele
  2578.  
  2579. broj slobodnih inodova u FS
  2580.  
  2581. lista slobodnih inodova raspoloživih u FS
  2582.  
  2583. index/ukazivač na sledeći slobodan inode u free inode listi
  2584.  
  2585. lock polja za liste slobodnih blokova i za liste slobodnih inodova
  2586.  
  2587. dirty flag koji ukazuju da je superblock modifikovan i da mora da se sravni sa disk super-blokom
  2588.  
  2589. Dodeljivanje inoda za novu datoteku
  2590. Algoritam ialloc obavlja dodeljivanje disk inoda za novo kreiranu datoteku.
  2591.  
  2592. FS sadrži linearnu listu inodova, a inode je slobodan ako je njegov sadržaj nula.
  2593.  
  2594. Kada se kreira nova datoteka mora se naći slobodan inode,
  2595. a to zahteva intenzivno pretraživanje inode tabele što može dugo da traje zbog višestrukih disk čitanja.
  2596.  
  2597. Da bi se to ubrzalo, superblock sadrži keširano polje koje sadrži listu slobodnih inodova.
  2598.  
  2599. ialloc
  2600.  
  2601. algorithm ialloc /* allocate inode */
  2602. input: FS
  2603. output: locked inode
  2604. {
  2605. while (not done) {
  2606. if (super block locked)
  2607. { sleep (event super block becomes free); continue; /*loop back to while*/ }
  2608.  
  2609. if (inode list in superblock is empty) /*empty SB list*/
  2610. { lock super block;
  2611. get remembered inode for free inode search;
  2612. search disk for free inodes until super block full, or no more free inodes
  2613. (algorithms bread i brelse)
  2614. unlock superblock; wake up (event superblock becomes free);
  2615.  
  2616. if(no free inodes found on disk) return(no inode);
  2617.  
  2618. set remembered inode for next free inode search; }
  2619. /* there are inode in superblock inode list*/
  2620. get inode number from super block list;
  2621. get inode (algorithm iget);
  2622.  
  2623. if(inode not free after all) /* !!! */
  2624. {
  2625. write inode to disk;
  2626. release inode (algorithm iput);
  2627. continue /* while loop*/
  2628. }
  2629.  
  2630. /* inode is free*/
  2631. initialize inode;
  2632. write inode to disk;
  2633. decrement FS free inode count;
  2634. return(inode);
  2635. }/* while */
  2636. }
  2637.  
  2638. Kernel prvo mora da proveri da li je superblock locked,
  2639. jer se u njemu nalazi free inode lista.
  2640.  
  2641. Ako lista nije prazna, kernel uzima sledeći inode,
  2642. alocira novi in-core inode (algoritam iget),
  2643. popunjava oba inodes (disk inode i in-core inode) i
  2644. vraća locked inode.
  2645.  
  2646. Ako je superblock lista prazna,
  2647. kernel mora čitati inode tabelu sa diska i
  2648. popuniti superblock listu,
  2649. naravno pamteći koji je zadnji inode detektovao i
  2650. koji je to blok tabele zadnji čitao,
  2651. da bi sledeći put ponovo čitao
  2652. (remembered inode, remembered block).
  2653.  
  2654.  
  2655. ifree
  2656. Algoritam za oslobađanje inode je mnogo jednostavniji.
  2657. algorithm ifree /* inode free */
  2658. input: FS, inode number
  2659. output: none
  2660. {
  2661. increment FS free inode count;
  2662. if (super block locked) return;
  2663. if (inode list full)
  2664. {
  2665. if( inode number less than remebered inode for search)
  2666. set remebered inode for search = input inode number;
  2667. }
  2668. else
  2669. store inode number in inode list;
  2670. return;
  2671. }
  2672.  
  2673. Pravila:
  2674.  
  2675. lista je sređena po opadajućim brojevima, osetno je manja nego inode tabela.
  2676.  
  2677. sadrži svoje ulaze koji se indeksiraju od najvišeg do najnižeg
  2678.  
  2679. poslednji inode (index 1) uvek predstavlja zapamćeni inode (remembered)
  2680.  
  2681. u slučaju potpuno prazne liste (svi inodes free) ako se pojavi novi free inode, doći će do promene na head tabele samo ako je novi inode manji od zapamćenog u protivnom se ne ubacuje u listu.
  2682.  
  2683.  
  2684. Alokacije disk blokova
  2685. Svakoj datoteci mora biti prvo dodeljen blok iz liste slobodnih blokova,
  2686. a svi njeni dodeljeni blokovi se upisuju u inode u direktne i indirektne ukazivače.
  2687. In-core superblok sadrži ograničenu listu slobodnih blokova sa ukazivačem na blokove na disku koje sadrže listu sledećih blokova.
  2688. Kada kernel želi da dodeli blok iz FS,
  2689. kernel prvo analizira keširanu listu iz superbloka i
  2690. uzima prvi slobodan blok.
  2691. Samo ako je to zadnji slobodan blok iz superblok keša,
  2692. tada se prelazi na listu sa diska,
  2693. čita se blok iz linkovane liste i popunjava superblok free list keš
  2694. iz koga se uzima prvi slobodan blok,
  2695. kome se dodeljuje mesto u kešu (getblk) i puni se nulama.
  2696.  
  2697. Program mkfs i se trudi da liste slobodnih blokova sadži blokove sa sličnim adresama, naravno iz razloga performansi.
  2698. Međutim, ta harmonija se brzo narušava jer se free blokovi često izbacuju i vraćaju u listu sasvim slučajno.
  2699. Kernel pokušava povremeno da sortira free liste.
  2700.  
  2701. alloc
  2702. algorithm alloc /* FS block allocation*/
  2703. input: FS number
  2704. output: buffer for new block {
  2705. while (super block locked) sleep (event super block not locked);
  2706. remove block from super block free list;
  2707. if (removed last block from free list)
  2708. {
  2709. lock superblock;
  2710. read block just taken from free list (algorithm bread);
  2711. copy block numbers in block into super block;
  2712. release block buffer (algorithm brelse);
  2713. unlock superblock;
  2714. wakeup processes (event superblock not locked);
  2715. }
  2716. /* cache buffer allocation*/
  2717. get buffer for block removed from superblock list (algorithm getblk);
  2718.  
  2719. zero buffer contents;
  2720.  
  2721. decrement total count of free blocks;
  2722.  
  2723. mark superblock modified;
  2724.  
  2725. return buffer;
  2726. }
  2727.  
  2728. Program mkfs kreira ovu linkovanu listu of free blocks čiji je početak u superblocku.
  2729.  
  2730. free
  2731. Algoritam free radi povratak bloka u free listu.
  2732.  
  2733. Ako keširana superblok lista nije puna,
  2734. blok se umeće u keširanu superblok listu.
  2735.  
  2736. Ako je puna,
  2737. lista se upisuje u neki blok na disku
  2738.  
  2739. blok se stavlja u linkovanu listu,
  2740.  
  2741. superblok lista postaje prazna
  2742.  
  2743. u nju se smešta novo-oslobođeni blok.
  2744.  
  2745.  
  2746. Veoma je zanimljivo primetiti da se linkovane liste ne primenju za slobodne inodove.
  2747. Ima 3 glavna razloga za drukčiji tretman blok free listi i inode free listi:
  2748. Kernel može odrediti da li je inode slobodan ispitivanjem njegovog sadržaja, ako type polje slobodno i inode je slobodan. Međutim, nema nikakvog načina da se odredi da li je blok slobodan ili nije na osnovu njegovog sadržaja. Zato, podrška cele free liste za blokove neophodna.
  2749.  
  2750. Disk blokovi su veoma povoljni za povezane liste zato što jedan disk blok može sadržati veliki broj pointera na slobodne blokove. Na drugoj strani mnogo je veći broj blokova nego broj inodova.
  2751.  
  2752. Procesi mnogo više teže da koriste slobodne blokove nego slobodne inodove, tako da je mnogo bitnije optimizovati performanse za liste slobodnih blokova nego za inode liste.
  2753.  
  2754. UNIX sistem podržava još 2 tipa datoteka:
  2755. pipe
  2756. specijalne datoteke.
  2757. Pipe datoteka koja se zove još i FIFO razlikuje se od obične datoteke po tranzijentnim podacima:
  2758. kada se podaci jedanput pročitaju iz pipe datoteke, ne mogu se ponovo pročitati,
  2759. takođe podaci se čitaju onim redosledom kojim u upisivani,
  2760. nema promene poretka.
  2761. Kernel upisuje pipe datoteku na disk na isti način kao i obične s tim što korisiti isključivo direktne pointere a ne indirektne.
  2762.  
  2763. Specijalne datoteke su
  2764. blok specijalne
  2765. karakter specijalne datoteke
  2766. koji specificraju uređaje i njihov inode ne ukazuje na nikakve podatke na disku, već njihov inode sadrži 2 broja: major i minor number.
  2767. major broj selektuje klasu uređaja kao što je disk
  2768. minor broj ukazuje uređaj unutar klase.
  2769.  
  2770.  
  2771.  
  2772. SC za postojeće datoteke:
  2773. open
  2774. read
  2775. write
  2776. lseek
  2777. close
  2778. SC za kreiranje novih datoteka kao što su:
  2779. creat
  2780. mknod
  2781.  
  2782. SC koji manipulišu inodovima i FS kao celinom kao što su:
  2783. chdir, chroot, chown, chmod, stat, fsstat
  2784. advanced SC:
  2785. pipe and dup koji su značajni za implementaciju pipeline komandi u shell-u.
  2786. mount i umount SC
  2787. link i unlink SC
  2788.  
  2789. Uvešćemo kernelske strukture podataka:
  2790. FT (file table)
  2791. UFDT (user file descriptor table)
  2792. MT (mount table)
  2793.  
  2794. SC za postojeće datoteke
  2795. open
  2796. read
  2797. write
  2798. lseek
  2799. close
  2800. SC za kreiranje novih datoteka kao što su:
  2801. creat
  2802. mknod
  2803.  
  2804. SC koji manipulišu inodovima i FS kao celinom kao što su:
  2805. chdir, chroot, chown, chmod, stat, fstat
  2806.  
  2807. SC se mogu klasifikovati u sledeće kategorije:
  2808.  
  2809. SC koji vraćaju fajl deskriptore koje mogu da koriste drugi SC
  2810.  
  2811. SC koji koriste namei algoritam da razbija path name do inode
  2812.  
  2813. SC koji dodeljuju i oslobađaju inodove preko algoritama ialloc i ifree
  2814.  
  2815. SC koji setuju ili menjaju atribute datoteke
  2816.  
  2817. SC koji obavljaju I/O operacije preko algoritama alloc, free i baferskih alokacionih algoritama
  2818.  
  2819. SC koji menjaju strukturu FS
  2820.  
  2821. SC koji omogućavaju procesu da promeni svoj izgled stabla
  2822.  
  2823. Open je SC je prvi korak koji proces mora obaviti da bi pristupio datoteci.
  2824. Sintaksa za open SC je:
  2825. fd = open(pathname, flags, modes)
  2826. pathname ime datoteke,
  2827. flags ukazuju na tipove otvaranja (za čitanje ili upis)
  2828. modes daje ACL ako se datoteka kreira
  2829.  
  2830. SC open daje jedan integer fd koji se naziva user file descriptor i koji se kasnije koristi za druge file operacije kao što su:
  2831. reading
  2832. writing
  2833. seeking
  2834. duplicating of file descriptors
  2835. setting a file I/O parameters
  2836. određivanje file statusa
  2837. zatvaranje datoteke
  2838.  
  2839. algorithm open
  2840. inputs: {filename, type of open, file permissions (for creation type of open)}
  2841. output: file descriptor
  2842. {
  2843. convert file name to inode (algorithm namei) #iget produce in-core inode
  2844.  
  2845. if(file does not exist or not permitted access) return(error);
  2846.  
  2847. allocate file table entry for inode, initialize count, offset; #FT
  2848.  
  2849. allocate user file descriptor entry, set pointer to file table entry; #UFTD
  2850.  
  2851. if (type of open specifies truncate file) free all file blocks (algorithm free)
  2852.  
  2853. unlock(inode);
  2854. return(user file descriptor);
  2855. }
  2856.  
  2857. Kernel pretražuje FS za zadatu datoteku preko algoritma namei,
  2858. koji ako nađe datoteku kroz sve path grane
  2859. proverava ACL
  2860. otvara inode u memoriju, kreira in-core inode
  2861.  
  2862. open SC otvara jedan ulaz u FT za tu otvorenu datoteku.
  2863.  
  2864. Taj ulaz u FT sadrži sledeće informacije:
  2865. pointer na in-core inode
  2866. offset gde kernel očekuje da bude sledeći upis ili čitanje iz datoteke.
  2867. Ovo polje kernel prilikom open SC postavlja na 0, a kasnije akcije sa datotekom ga modifikuju.
  2868. Proces može otvoriti datoteku u write-append modu u kom slučaju kernel inicijalizuje offset na kraj datoteke = filesize.
  2869.  
  2870. Pored globalne FT, kernel preko u-area inicijalizuje i UFDT, a pointer na UFDT postavlja u u-area. Naravno da UFDT mora ukazivati na datoteku u FT.
  2871.  
  2872. Pretpostavimo da se dogode 3 open SC:
  2873. fd1= open("/etc/passwd", O_RDONLY)
  2874. fd2 = open("/etc/local", O_RDWR)
  2875. fd3 = open("/etc/passwd", O_WRONLY)
  2876. Svaki openSC vraća poseban FD procesu u odgovarajući ulaz u UFDT koji ukazuje na odgovarajući ulaz u FT i u slučaju da je datoteka otvorena više puta. Sve otvorene instance za istu datoteku ukazuju na jedinstveni in-core inode.
  2877.  
  2878. Pretpostavimo da drugi proces B izvršava sledeći kod:
  2879. fd1= open("/etc/passwd", O_RDONLY)
  2880. fd2 = open("private", O_RDONLY)
  2881.  
  2882. FT v UFDT
  2883.  
  2884. Opet a slike vidimo da svaki open ima
  2885. jedinstveni ulaz u UFDT za proces
  2886. jedinstveni ulaz u kernelovoj FT
  2887. a samo jedan in-core inode za svaku otvorenu datoteku.
  2888.  
  2889. UFDT ulazi bi mogli da sadrže
  2890. offset za sledeće file I/O operacije i
  2891. pointer na in-core inode,
  2892. tako da FT ne bi trebalo da postoji,
  2893. međutimFT prisustvo je opravdano jer omogućava
  2894. deljenje file descriptora fd
  2895. deljenje pointera
  2896. što se koristi u dup i fork SC.
  2897.  
  2898. Prva 3 korisnička fd su (0, 1 i 2) i predstavljaju:
  2899. standarni ulaz stdin
  2900. standarni izlaz stdout
  2901. izlaz za greške stderr
  2902.  
  2903.  
  2904. Sintaksa za read SC je:
  2905.  
  2906. number = read(fd, buffer, count)
  2907.  
  2908. pri čemu je:
  2909. fd file descriptor dobijen od open SC
  2910. buffer je adresa memorijskog bafera koje je proces dobio za čitanje
  2911. count je broj bajtova koji se čita iz datoteke
  2912. number je broj koji se upravo pročitao preko ovog read SC
  2913.  
  2914. algorirthm read
  2915. inputs:
  2916. {user file descriptor, address of buffer in user process, number of byte to be read }
  2917. output: count of bytes copied into user space
  2918.  
  2919. {
  2920. get file table entry from user file descriptor;
  2921. check file accessibility;
  2922. set parameters in u area for user address, byte count, I/O to user;
  2923. get inode from FT; #in-core inode
  2924. lock inode;
  2925. set byte offset in u-area from file table offset;
  2926. while (count not satisfied)
  2927. {
  2928. convert file offset to disk block (algorithm bmap)
  2929.  
  2930. calculate offset into block, number of byte to read;
  2931.  
  2932. if (number of bytes to read is 0) break; /* end of file*/
  2933.  
  2934. read block (algorithm breada if with read ahead, bread otherwise);
  2935. copy data from system buffer to user address;
  2936. update u area fields for file
  2937. byte offset,
  2938. read count,
  2939. address to write into user space
  2940. release buffer /* locked in bread*/
  2941. }
  2942. unlock inode;
  2943. update FT offset for next read;
  2944. return (total number of bytes read);
  2945. }
  2946.  
  2947. Kernel prvo na bazi fd uzima ulaz UFTD. Tada se setuju I/O parametri u u-arei, konkretno kod read SC poziva, se postavlja da je read I/O, count i postavlja se user bafer adresa, a iz njega čita ulaz u FT, iz koga se dobija offset u file koji se takođe setuje u u-arei.
  2948. Polja koja se postavljaju u u-arei su:
  2949.  
  2950.  
  2951.  
  2952.  
  2953. Pored offseta, kernel iz FT čita ukazivač na in-core inode, pronalazi taj inode, lock-uje ga i počinje kroz keš da čita datoteku.
  2954.  
  2955. Čitanje se odvija u petlji na sledeći način:
  2956. na bazi offseta se određuje broj bloka preko algoritma bmap
  2957. blok se čita u keš preko bread algoritma
  2958. modifikuju se polja u u-arei, count i offset
  2959. petlja se ponavlja sve dok se ne pročita zahtevani broj bajtova
  2960.  
  2961. Na kraju se setuje novi offset za datoteku u FT, koji se može sa lseek() SC modifikovati
  2962.  
  2963. #include <fcntl.h>
  2964. main()
  2965. {
  2966. int fd;
  2967. char litlbuf[20], bigbuf[1024];
  2968. fd = open("/etc/passwd", O_RDONLY);
  2969. read (fd, litlbuf, 20);
  2970. read (fd, bigbuf, 1024);
  2971. read (fd, litlbuf, 20);
  2972. }
  2973.  
  2974. Prvi open će otvoriti datoteku i postavti offset na 0.
  2975. Prvi read će pročitati 20 bajtova i postaviti ofset na 20. Naravno u keš ide 1K, a iz keša 20 bajtova. U u-arei se setuje count=0 (read je zadovoljen), offset 20, a potom se ukupan broj pročitanih bajtova setuje na 20.
  2976.  
  2977. Drugi read čita 1K ali u offsetu 20, i skoro sve je u kešu (ako je malo vremena proteklo između prvog i drugog read-a) ali tu ima samo 1004 potrebna podatka, opet se ide na inode na sledeći direktni blok, pa se sa diska čita sledeći blok datoteke i u kešu se nalaze 2 bloka datoteke. U bigbuf se u 2 iteracije prebacuju 1024 bajta, offset = 1044.
  2978.  
  2979. Treći read čita 20 bajta na ofsetu 1044 koji je u kešu (najverovatnije) i postavlja finalni offset na 1064.
  2980.  
  2981. Kernel će na bazi read count-a da proceni da li da radi bread ili breada.
  2982.  
  2983. Ukoliko vrednost pointera inodu = 0, tada nema čitanja sa diska već se korisnički bafer puni nulama (sparse file)
  2984.  
  2985. Inode je locked dok traje read, jer bi moglo doći do inkonzistenicje podataka.
  2986.  
  2987. Pored toga uvodi se pojam lock-ovanja file/record, da vi obezbedila konzistentnost podataka
  2988. kao u primeru gde su 2 procesa, koja su istovremeno otvorila istu datoteku, a jedan ima 2 read-a a drugi 2 write.
  2989. Šta će da pročitati prvi proces, zavisi od redosleda rd1, rd2, wr1, wr2 ili rd1, wr1, rd2, wr2, ili rd, wr1, wr2, rd2. Zato se pored otvaranja datoteke uvodi lock na record, tako da jedan proces ne može otvoriti locked file.
  2990.  
  2991. #include <fcntl.h>
  2992. /*process A*/
  2993. main()
  2994. {
  2995. int fd; char buf[512];
  2996. fd = open("/etc/passwd", O_RDONLY)
  2997. read (fd, buf, sizeof(buf)) /*read 1*/
  2998. read (fd, buf, sizeof(buf)) /*read 2*/
  2999. }
  3000. /*process B*/
  3001. main()
  3002. {
  3003. int fd,i; char buf[512];
  3004. for (i=0; i<sizeof(buf); i++) buf[i] = ‘a’;
  3005. fd = open("/etc/passwd", O_WRONLY)
  3006. write (fd, buf, sizeof(buf)) /*write 1*/
  3007. write (fd, buf, sizeof(buf)) /*write 2*/
  3008. }
  3009.  
  3010. Na sledećem primeru proces može otvoriti datoteku 2 puta i čitati je preko 2 različita deskriptora sa nezavisnim file offsetima.
  3011.  
  3012. #include <fcntl.h>
  3013. main()
  3014. {
  3015. int fd1, fd2;
  3016. char buf1[512], buf2[512];
  3017.  
  3018. fd1 = open("/etc/passwd", O_RDONLY)
  3019. fd2 = open("/etc/passwd", O_RDONLY)
  3020.  
  3021. read (fd1, buf1, sizeof(buf1)) /*read 1*/
  3022. read (fd2, buf2, sizeof(buf2)) /*read 2*/
  3023. }
  3024.  
  3025. Sintaksa za write SC je:
  3026.  
  3027. number = write(fd, buffer, count)
  3028.  
  3029. pri čemu su parametri isti ako za read SC
  3030. fd file descriptor dobijen od open SC
  3031. buffer je adresa memorijskog bafera koje je proces dobio za upis
  3032. count je broj bajtova koji se upisuje u datoteku
  3033. number je broj koji se upravo upisan preko ovog read SC
  3034.  
  3035.  
  3036. Algoritam za write SC je sličan algoritmu za read SC,
  3037. izuzev ako datoteka ne sadrži blok koji odgovara file offsetu za upis,
  3038. tada kernel alocira novi blok preko algoritma alloc i
  3039. podešava inode.
  3040. Ako je file offset odgovara indirektnom bloku, kernel mora dodeliti više blokova koji će se koristiti za indirektne i data blokove.
  3041.  
  3042. Inode is locked za vreme write(SC), zato što kernel može promeniti inode u toku write SC. Kada se upis završi, kernel ažurira inode pointere i filesize polje ako je došlo do promene veličine.
  3043.  
  3044. Kada kernel obavlja upis, dešava se kao kod read ciklusa pri čemu su moguće sledeće situacije.
  3045. Jedna potencijalna situacija je da se upisuje ceo blok u jednoj u iteraciji.
  3046. Druga situacija je da se u nekoj iteraciji upisuje deo bloka, tada prvo blok mora da se učita u memoriju u keš blok, pa se prepiše deo bloka, a onda ceo blok se upisuje.
  3047. Treća situacija je kada mora prvo da se alocira indirektni blok pa tek onda upis.
  3048.  
  3049. Koriste se delayed write kroz kernelski keš koji je efikasan za pipe datoteke i i datoteke koje se privremeno kreiraju i čitaju se veoma skoro posle toga, kao što su privremene datoteke koje kreira editor teksta i briše ih. Dakle najveći uspeh se postiže za upis koji će živeti samo u kešu i nikada neće dostići disk.
  3050.  
  3051. Originalni UNIX od Thomsona i Ritchija nije imao interni mehanizam koji obezbeđuje eksluzivni pristup datoteci. Locking mehamizam se nije koristio, jer kako kaže Ritchie, nisu imali na svom sistemu veliku bazu sa više nezavisnih procesa.
  3052. Da bi UNIX prililižila database serverima, UNIX System V sadrži u sebi file i record locking mehanizam.
  3053. file locking mehanizam zabranjuje pristup (r/w) datoteci ostalim procesima, osim tom jednom koji je lock-ovao datoteku
  3054.  
  3055. record locking mehanizam zabranjuje pristup (r/w) recordu ostalim procesima, osim tom jednom koji je lock-ovao record.
  3056. Record je logička celina u datoteci, može biti bilo koji deo datoteke, ima svoj offset i veličinu.
  3057.  
  3058. Podešavanje pozicije u datoteci - lseek
  3059. Obično korišćenje read i write SC obezbeđuje sekvencijalni pristup datoteci, dok lseek SC omogućava random pristup datoteci.
  3060.  
  3061. Sintaksa za lseek SC je:
  3062.  
  3063. position = lseek(fd, offset, reference)
  3064.  
  3065. pri čemu su parametri:
  3066. fd file descriptor dobijen od open SC
  3067. offset je je relativni bajt offset
  3068. reference ukazuje u odnosu na na šta je offset:
  3069. u odnosu na početak datoteke (0)
  3070. u odnosu na tekuću poziciju (1)
  3071. u odnosu na kraj datoteke (2)
  3072. position je offset u kome će sledeće čitanje ili upis da se dogode
  3073.  
  3074. #include <fcntl.h>
  3075. /*process A*/
  3076. main(argc, argv)
  3077. int argc
  3078. char *argv[]
  3079. {
  3080. int fd, skval;
  3081. char c;
  3082. if (argc != 2) exit();
  3083.  
  3084. fd = open(argv[1], O_RDONLY);
  3085. if (fd == -1) exit();
  3086.  
  3087. while ((skval = read(fd, &c, 1)) == 1)
  3088. {
  3089. printf("char %c\n",c)
  3090. skval = lseek(fd, 1023L, 1);
  3091. printf("new seek val %d \n",skval)
  3092. }
  3093.  
  3094. Program čita svaki 1024 bajt datoteke, tako što prvo pročita jedan bajt, onda obavi lseek za 1023. SC lseek praktično ne radi ništa sa diskom, on jednostavno podesi offset u FT, koji će se korisititi u sledećoj r/w instanci.
  3095.  
  3096. close SC
  3097. Proces zatvara otvorenu datoteku kada više ne želi da joj pristupa, preko close SC.
  3098. Sintaksa za close SC je krajnje jednostavna:
  3099. close(fd);
  3100.  
  3101. Kernel obavlja close operaciju tako što obavi manipulacije u UFDT, FT i in-core inode.
  3102. Ako je reference count u FT veći od 1, zbog dup ili fork SC, kernel će dekremenirati broj u FT.
  3103. Ako taj broj posle dekrementa padne na 0, kernel oslobađa ulaz u FT i otpušta in-core inode (iput), originalno kreiran nakon open SC.
  3104. Ako ostali procesi takođe koriste taj in-core inode, broj RC se dekrementira.
  3105. Nakon toga se se briše ulaz u UFDT.
  3106.  
  3107. Kada proces obavi exit(SC) sve njegove otvorene datoteke se moraju zatvoriti.
  3108. Za in-core inode za private datoteku, RC pada na nulu čime se otpušta taj inode, /etc/passwd datoteku FC pada na 2, oslobađaju se 2 ulaza u FT koja su pripadala procesu B, a njegovi UFTD ulazi se anuliraju.
  3109.  
  3110. viši SC
  3111. fopen
  3112. fprintf, fputc, fputs i fwrite koje upisuju podatke u datoteku (stream)
  3113. fscanf, fgetc, fgets i fread koje ucitavaju podatke.
  3114.  
  3115. Datoteka (stream) je predstavljena kao FILE* pokazivac. Kada otvorite datoteku sa fopen vi dobijate FILE* pokazivac. Kada zavrsite mozete je zatvoriti sa fclose.
  3116. low-level SC
  3117.  
  3118. Sa Linux-ovim operacijama nizeg nivoa, koristimo postupak nazvan deskriptor datoteke umesto FILE* pokazivaca.
  3119.  
  3120. Deskriptor datoteke je celobrojna vrednost koja upucuje na odredjenu datoteku u pojedinacnom procedu.
  3121.  
  3122. Moze biti otvoren za citanje, za pisanje ili i za citanje i za pisanje.
  3123. Deskriptor datoteke ne mora da upucuje na otvorenu datoteku; moze predstavljati vezu sa drugom sistemskom komponentom koja moze da prima i salje podatke.
  3124.  
  3125. SC open na Linux OS - flagovi
  3126. fd=open (pathname, flags, modes)
  3127. flags
  3128. O_RDONLY, datoteka je otvorena samo za citanje
  3129. O_WRONLY stvara da bude samo za upis.
  3130. O_RDWR deskriptor datoteke se navodi da bude upotrebljena i za upis i za citanje.
  3131.  
  3132. Mozete navesti dodatne funkcije koriscenjem bita operacija ili sa ovom vrednoscu sa jednim ili vise indikatora. Ovo su najcesce koriscene vrednosti:
  3133.  
  3134. O_TRUNC da anulirate datoteku, ako prethodno postoji. Podatci upisani u deskriptor datoteke ce zameniti prethodni sadrzaj datoteke.
  3135.  
  3136. O_APPEND da dodate u postojecu datoteku. Podatci upisani u deskriptor datoteke ce biti dodati na kraj datoteke.
  3137.  
  3138. O_CREAT da kreirate novu datoteku. Ako ime datoteke koje navedete ne postoji, nova datoteka ce biti kreirana. Ako datoteka vec postoji, onda ce se samo otvoriti.
  3139.  
  3140. O_EXCL sa O_CREAT da nasilno kreirate novu datoteku. Ako datoteka vec postoji, poziv open ce biti bezuspesan.
  3141.  
  3142. SC open na Linux OS (modovi)
  3143. Ako pozovete open sa O_CREAT, dodajte treci dodatni argument zadajuci dozvole za novu datoteku.
  3144. Umasks
  3145. Kada kreirate novu datoteku sa open, neki bitovi prava pristupa koje ste predhodno namestili mogu biti iskljuceni. To je zato sto je vasa umaska podesena na ne nulte vrednost. Procesov umask odredjuje bitove koji su maskirani van svih novokreiranih dozvola. Aktuelna koriscena prava prtistupa su nivoi bita i pristipna prava koja odredimo za otvaranje i nivoi bita dopunjeni sa umask.
  3146.  
  3147. Da bi promenili vas umask iz komandnog interpretera, koristite umask komandu, i odredite numericku vrednost maske, u oktalnom sistemu. Da bi promenili umask za tekuci proces, koristite funkciju umask, prosledjujuci mu zeljenu vrednost kako bi je koristili za sledecu open funkciju.
  3148.  
  3149. Na primer, pozivanjem ovog reda u programu
  3150. umask (S_IRWXO | S_IWGRP);
  3151.  
  3152. ili pozivajuci ovu komandu
  3153. $ umask 027
  3154. odredjujete dozvolu za pisanje za clanove grupe i citanje, pisanje i pristup drugima ce uvek biti maskiran van novih dozvola.
  3155.  
  3156.  
  3157. (create-file.c) Kreiranje nove datoteke
  3158. #include <fcntl.h>
  3159. #include <stdio.h>
  3160. #include <sys/stat.h>
  3161. #include <sys/types.h>
  3162. #include <unistd.h>
  3163. int main (int argc, char* argv[])
  3164. {
  3165. /* Putanja gde ce se kreirati nova datoteka. */
  3166. char* path = argv[1];
  3167. /* Dozvole za novu datoteku. */
  3168. mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
  3169. /* Kreira datoteku. */
  3170. int fd = open (path, O_WRONLY | O_EXCL | O_CREAT, mode);
  3171. if (fd == -1) {
  3172. /* Dolazi do greske. Ispisuje se poruka o gresci. */
  3173. perror (“open”);
  3174. return 1;
  3175. }
  3176. return 0;
  3177. }
  3178.  
  3179. program u akciji:
  3180.  
  3181. $ ./create-file testfile
  3182. $ ls -l testfile
  3183. -rw-rw-r-- 1 samuel users 0 Feb 1 22:47 testfile
  3184.  
  3185. $ ./create-file testfile
  3186. open: File exists
  3187.  
  3188. Primetite da je velicina nove datoteke 0 zato sto program nije upisao nikakve podatke u nju.
  3189.  
  3190. Listing hexdump prikazuje prostu demonstraciju funkcije read.
  3191.  
  3192. Program ispisuje heksadecimalne ostatke sadrzaja datoteke, precizirane na comandnoj liniji.
  3193.  
  3194. Svaki red prikazuje
  3195. pomeraj u datoteci
  3196. i
  3197. sledecih 16 bajtova.
  3198. #include <fcntl.h>
  3199. #include <stdio.h>
  3200. #include <sys/stat.h>
  3201. #include <sys/types.h>
  3202. #include <unistd.h>
  3203.  
  3204. int main (int argc, char* argv[])
  3205.  
  3206. {
  3207. unsigned char buffer[16];
  3208.  
  3209. size_t offset = 0;
  3210. size_t bytes_read;
  3211.  
  3212. int i;
  3213.  
  3214. /*Otvara datoteku za citanje*/
  3215. int fd = open (argv[1], O_RDONLY);
  3216.  
  3217. do { /*Citanje bafera. */
  3218. bytes_read = read (fd, buffer, sizeof (buffer));
  3219.  
  3220. /*Pisanje pomeraja u datoteku, pracen je sa samim bajtovima*/
  3221. printf (“0x%06x : “, offset);
  3222. for (i = 0; i < bytes_read; ++i)
  3223. printf (“%02x “, buffer[i]);
  3224. printf (“\n”);
  3225. /*Pamti nasu poziciju u datoteci */
  3226. offset += bytes_read;
  3227. } while (bytes_read == sizeof (buffer));
  3228. /*Sve gotovo.*/
  3229. return 0;
  3230. }
  3231. hexdump u akciji.
  3232. Prikazuje ispis izvrsne datoteke hexdump:
  3233.  
  3234. $ ./hexdump hexdump
  3235. 0x000000 : 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  3236. 0x000010 : 02 00 03 00 01 00 00 00 c0 83 04 08 34 00 00 00
  3237. 0x000020 : e8 23 00 00 00 00 00 00 34 00 20 00 06 00 28 00
  3238. 0x000030 : 1d 00 1a 00 06 00 00 00 34 00 00 00 34 80 04 08
  3239. ...
  3240.  
  3241. Vas izlaz moze igledati drugacije,
  3242. u zavisnosti od prevodioca koji koristite
  3243. da prevedete hexdump
  3244. i prevedenih(kompajliranih) indikatora (flags) za prevodjenje koje ste selektovali.
  3245.  
  3246. write SC: timestamp.c
  3247. Program u timestamp.c dodaje tekuce vreme u datu datoteku.
  3248. Ako datoteka ne postoji, kreirace se.
  3249.  
  3250. Ovaj program takodje koristi
  3251. time
  3252. localtime
  3253. asctime
  3254. funkcije za dobijanje i formatiranje tekuceg vremena.
  3255.  
  3256. #include <fcntl.h>
  3257. #include <stdio.h>
  3258. #include <string.h>
  3259. #include <sys/stat.h>
  3260. #include <sys/types.h>
  3261. #include <time.h>
  3262. #include <unistd.h>
  3263.  
  3264. /* Vraca string koji predstavlja tekuci datum i vreme. */
  3265. char* get_timestamp ()
  3266. {
  3267. time_t now = time (NULL);
  3268. return asctime (localtime (&now));
  3269. }
  3270.  
  3271. int main (int argc, char* argv[]) {
  3272. /* Datoteka u koju treba da se doda vremenska oznaka. */
  3273. char* filename = argv[1];
  3274. /* Uzima tekucu vremensku oznaku */
  3275. char* timestamp = get_timestamp ();
  3276.  
  3277. /* Otvara datoteku za upis. Ako postoji, pristupa joj. */
  3278. int fd = open(filename, O_WRONLY | O_CREAT | O_APPEND, 0666);
  3279.  
  3280. /* Racuna duzinu timestamp stringa. */
  3281. size_t length = strlen (timestamp);
  3282.  
  3283. /* Upisuje timestamp u datoteku. */
  3284. write(fd, timestamp, length);
  3285.  
  3286. /* Sve gotovo. */
  3287. close (fd);
  3288. return 0; }
  3289.  
  3290. Evo kako timestamp program radi:
  3291.  
  3292. $ ./timestamp tsfile
  3293. $ cat tsfile
  3294. Thu Feb 1 23:25:20 2001
  3295.  
  3296. $ ./timestamp tsfile
  3297. $ cat tsfile
  3298. Thu Feb 1 23:25:20 2001
  3299. Thu Feb 1 23:25:47 2001
  3300.  
  3301. Zapamtite da prvi put kad pozovemo timestamp,
  3302. on kreira tsfile,
  3303. dok kad drugi put pozovemo taj program
  3304. on mu samo dodaje vreme.
  3305.  
  3306. lseek
  3307. off_t position = lseek (file_descriptor, offset, SEEK_xxx);
  3308.  
  3309. lseek funkcija vam omogucava da pozicionirate deskriptor datoteke u datoteci. Prosledite ga deskriptoru datoteke i dva dodatna argumenta, offset i SEEK_SET, koji odredjujuci novu poziciju.
  3310.  
  3311. Ako je treci argument
  3312. SEEK_SET, lseek tumaci drugi argument kao poziciju, u bajtovima, od pocetka datoteke.
  3313. SEEK_CUR, lseek tumaci drugi argument kao pomeraj , koji moze biti pozitivan ili negativan, od trenutne pozicije.
  3314. SEEK_END, lseek tumaci drugi argument kao pomeraj od kraja datoteke. Pozitivna vrednost pokazuje poziciju izvan kraja datoteke.
  3315.  
  3316.  
  3317. Funkcija lseek vraca novu poziciju, kao pomeraj od pocetka datoteke.
  3318.  
  3319. tip pomeraja je off_t.
  3320. Ako se pojavi greska, lseek vraca -1.
  3321. lseek ne mozete koristit sa nekim vrstama deskriptora datoteka, kao sto je uticnica(socket) deskriptor datoteke.
  3322.  
  3323. Linux vam omogucava da lseek funkcijom pozicionirate deskriptor datoteke izvan datoteke.
  3324.  
  3325. Normalno, ako je deskriptor datoteke pozicioniran na kraju datoteke i vi nesto upisujete u njega, Linux ce automatski da produzi datoteku kako bi napravio mesta za nove podatke. Ako pozicionirate deskriptor datoteke izvan datoteke i onda nesto upisujete u njega:
  3326.  
  3327. Linux prvo prosiruje datoteku kako bi prilagodio rupu koju ste napravili sa lseek operacijom i onda upisuje na kraj datoteke.
  3328.  
  3329. Ova praznina, kako bilo, ne zauzima mesto na disku; naprotiv, Linux samo pravi poruku koliko je to veliko.
  3330.  
  3331. Ako kasnije pokusate da procitate do iz datoteke, vasem programu ce izgledati kao da je ta praznina popunjena sa 0 bajtovima.
  3332.  
  3333. Koriscenjem ovog ponasanja lseek,
  3334. moguce je kreirati veoma velike datoteke
  3335. koje ne zauzimaju skoro nikakav prostor na disku.
  3336.  
  3337. Program lseek-huge radi to.
  3338.  
  3339. On uzima sa komandne linije
  3340. ime datoteke i
  3341. velicinu trazene datoteke u MB.
  3342.  
  3343. Program otvara novu datoteku,
  3344. pozicinira se do kraja datoteke koristeci lseek,
  3345. i
  3346. onda upise jedinstveni 0 bajt pre nego sto ga zatvori.
  3347.  
  3348. #include <fcntl.h>
  3349. #include <stdlib.h>
  3350. #include <sys/stat.h>
  3351. #include <sys/types.h>
  3352. #include <unistd.h>
  3353. int main (int argc, char* argv[])
  3354. {
  3355.  
  3356. int zero = 0;
  3357.  
  3358. const int megabyte = 1024 * 1024;
  3359.  
  3360. char* filename = argv[1];
  3361.  
  3362. size_t length = (size_t) atoi (argv[2]) * megabyte;
  3363.  
  3364. /*Otvaranje nove datoteke */
  3365. int fd = open (filename, O_WRONLY | O_CREAT | O_EXCL, 0666);
  3366.  
  3367. /* Prelazimo na 1 bajt manje od mesta gde hocemo da bude kraj datoteke. */
  3368. lseek (fd, length - 1, SEEK_SET);
  3369.  
  3370. /* Pisemo jedinstven 0 bajt*/
  3371. write (fd, &zero, 1);
  3372.  
  3373. /*Sve gotovo.*/
  3374. close (fd);
  3375. return 0;
  3376. }
  3377. Koriscenjem lseek-huge, napravicemo datoteku od 1 GB(1024MB).
  3378. Proverite slobodno mesto na disku pre i posle operacije.
  3379. $ df -h .
  3380. Filesystem Size Used Avail Use% Mounted on
  3381. /dev/hda5 2.9G 2.1G 655M 76% /
  3382.  
  3383. $ ./lseek-huge bigfile 1024
  3384. % ls -l bigfile
  3385. -rw-r----- 1 samuel samuel 1073741824 Feb 5 16:29 bigfile
  3386.  
  3387. $ df -h .
  3388. Filesystem Size Used Avail Use% Mounted on
  3389. /dev/hda5 2.9G 2.1G 655M 76% /
  3390. Neprimetna kolicina memorije na disku je potrosena, uprkos nenormalnoj velicini bigfile.
  3391. Opet, iako otvorimo bigfile i citamo iz njega, on ce izgledati kao da je popunjen sa nulama u vrednosti od 1GB.
  3392.  
  3393. Za primer, mozemo da testiramo njegov sadrzaj sa hexdump programom iz predhodnog primera.
  3394.  
  3395. $ ./hexdump bigfile | head -10
  3396. 0x000000 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  3397. 0x000010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  3398. 0x000020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  3399. 0x000030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  3400. 0x000040 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  3401. 0x000050 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  3402. ...
  3403.  
  3404. -end of Linux examples
  3405.  
  3406. File Creation
  3407. Dok open SC otvara postojeće datoteke, creat SC kreira novu datoteku.
  3408. Sintaksa za creat SC je:
  3409.  
  3410. fd = creat(pathname, modes)
  3411.  
  3412. gde svi parametri imaju isto značenje kao i kod open SC.
  3413.  
  3414. Ako takva datoteka ne postoji, kernel kreira novu datoteku 0-te veličine, pod zadatim imenom i sa zadatim pravima.
  3415. Ako datoteka postoji, kernel odseca datoteku na veličinu 0, oslobađjući sve data blokove.
  3416.  
  3417.  
  3418. algorithm creat
  3419. inputs: {filename, file permissions (for creation type of open)}
  3420. output: file descriptor
  3421.  
  3422. {
  3423. get inode for file name (algorithm namei);
  3424. if (file already exists)
  3425. {
  3426. if (not permitted access)
  3427. {
  3428. release inode (algorithm iput);
  3429. return(error)
  3430. }
  3431. }
  3432. else /*file does not exist yet*/
  3433. {
  3434. assign free inode from FS (algorithm ialloc);
  3435. create new directory entry in parent directory: include new file name and newly assigned inode number
  3436. }
  3437.  
  3438. allocate file table entry for inode, initialize count, offset; #FT
  3439.  
  3440. allocate user file descriptor entry, set pointer to file table entry; #UFTD
  3441.  
  3442. if (file did exist at time of create) free all file blocks (algorithm free)
  3443.  
  3444. unlock(inode);
  3445. return(user file descriptor);
  3446. }
  3447.  
  3448. SC create može da se izvede sa open SC koristeći 2 flag-a:
  3449. O_CREAT (create)
  3450. O_TRUNC(truncate)
  3451.  
  3452. Kernel razbija pathname koristeći algoritam namei, dok ne naiđe na zadnju komponentu.
  3453. Ukoliko u zadnjoj grani nađe zadnje ime ono se mora odseći na 0.
  3454. U protivnom dešava se kreacija novog objekta u direktorijumu, novi FCB.
  3455. Ako ima mesta u direktorijumskom bloku, dobro u protivnom, direktorijum se mora proširiti sa novim blokom što izaziva brojne akcije (alokaciju, inode promenu..).
  3456. Potom se pronalazi slobodan inode za novi datoteku (ialloc) koji se inicijalizuje i upisuje na disk preko bwrite algoritma.
  3457.  
  3458. Ukoliko je datoteka postojala, kernel zahteva od procesa da ima write pravo na nju da bi mogao da je odseče na 0, svi data blokovi se oslobađaju (free algoritam), ali se ne menja vlasništvo i grupa datoteke.
  3459.  
  3460. Na kraju se inicijaliziju po jedan ulaz u UDFT i FT, kao kod open SC.
  3461.  
  3462. Kreiranje specijanih datoteka, kao što su device files, named pipes i direktorijumi se odvija preko mknod SC, koji ima sličnosti sa create tako što dodeljuje novi inode za datoteku.
  3463.  
  3464. Sintaksa za mknod SC je:
  3465. mknod (pathname, type and permissions, dev)
  3466.  
  3467. pri čemu je
  3468. pathname ime specijalne datoteke,
  3469. type and permissions daju tip specijalne datoteke (node, pipe, directory) i prava pristupa koja joj se dodeljuju
  3470. dev specificira major i minor broj za specijalne blok i karakter datoteke
  3471.  
  3472. algorithm mknod
  3473. inputs: {filename, file type, permissions, major and minor device number}
  3474. output: none
  3475. {
  3476. if (new node not name pipe and user not super user) return (error);
  3477.  
  3478. get inode for file name (algorithm namei);
  3479.  
  3480. if (new node already exist)
  3481. {
  3482. release parent inode (algorithm iput);
  3483. return(error)
  3484. }
  3485. else /* file does not exist yet*/
  3486. {
  3487. assign free inode from FS (algorithm ialloc);
  3488. create new directory entry in parent directory: include new node name and newly assigned inode number;
  3489. release parent inode (algorithm iput);
  3490. }
  3491.  
  3492. if (new node is block or character special file) write major and minor numbers into inode structure;
  3493. release new node inode (algorithm iput);
  3494. }
  3495.  
  3496. Kernel u direktorijumskoj strukturi traži ime specijalne datoteke koju treba da kreira i
  3497. ako ime ne postoji, dodeljuje se novi inode,
  3498. u direktorijumu se upisuje novi FCB.
  3499. u inode se upisuje tip datoteke (node, pipe, directory) i prava pristupa.
  3500.  
  3501. Ukoliko je nod u pitanju, upisuju se major i minor number u inode.
  3502.  
  3503. Za direktorijum se moraju alocirati data blok i popuniti sa prva dva ulaza
  3504. . (itself)
  3505. .. (parent)
  3506.  
  3507. Na kraju se radi iput za novu specjilanu datoteku
  3508.  
  3509.  
  3510. Change directory, change root
  3511. Kada se sistem podiže,
  3512. prvi proces koji se kreira,
  3513. uzima root direktorijum za svoj tekući direktorijum,
  3514. tako što obavi iget za /,
  3515. pa pa ga čuva u u-area kao svoj tekući direktorijum,
  3516. i obavlja inode unlock (iput).
  3517.  
  3518. Kada proces kreira svoje dete sa fork SC,
  3519. novi proces nasleđuje tekući direktorijum od procesa roditelja,
  3520. a kernel povećava RC za inode tekućeg direktorijuma.
  3521.  
  3522. Algoritam chdir menja tekući direktorijum procesa. Sintkasa za chdir SC je:
  3523.  
  3524. chdir(pathname)
  3525. gde je pathname ime direktorijuma koji će postati novi tekući direktorijum procesa.
  3526.  
  3527. Kernel razbija pathname po granama preko namei algoritma
  3528. dok ne dođe do zadnje komponente,
  3529. kada proverava prava pristupa na tu granu.
  3530. Ako ima prava pristupa,
  3531. uzima se inode te grane (iget) i inkremetira RC za novi direktorijum,
  3532. oslobađa se (iput), izbacuju se stari inode a RC--,
  3533. a upisuje nov u u-areu procesa.
  3534. Pošto proces promeni tekući direktorijum, njegov inode je polazna tačka za sva pretraživanja (namei) za sve reference koje ne počinju sa apsolutnom putanjom /....
  3535.  
  3536. Inode za tekući direktorijum se otpušta i RC--, samo ako nastupi novi chdir ili proces završi aktivnosti (exit)
  3537.  
  3538. algorithm change directory (chdir)
  3539. input: new directory name
  3540. output: none
  3541. {
  3542. get inode for new directory name (algorithm namei);
  3543.  
  3544. if(inode not that of directory or process not permitted access to file)
  3545. {
  3546. release inode (algorithm iput);
  3547. return(error);
  3548. }
  3549. unlock inode;
  3550.  
  3551. release "old" current directory inode (algorithm iput);
  3552. place new inode into current directory slot in u-area
  3553. }
  3554.  
  3555. Procesi podrazumevaju da / označava root direktorijum celog UNIX stabla
  3556. to je globalna sistemska varijabla koja sadrži inode root direktorijuma,
  3557. koji se dobija preko iget SC prilikom podizanja UNIX-a.
  3558.  
  3559. Procesi mogu promeniti
  3560. svoju oznaku za FS root direktorijum preko chroot SC
  3561. to je korisno kada procesi simulairaju sopstvenu FS hijerarhiju.
  3562.  
  3563. Sintaksa za chroot SC je
  3564. chroot(pathname)
  3565. pathname ime direktorijuma koji će se tretirati kao root direktorijum procesa.
  3566.  
  3567. Algoritmam za chroot je praktično isti kao i za chdir.
  3568. Preko namei se dobija inode novog root direktorijima koji se upisuje u u-areu procesa.
  3569.  
  3570. Novi inode je logički root za sve reference koje počinju sa /.
  3571.  
  3572.  
  3573. Change owner, change mode
  3574. Promena vlasništva ili prava pristupa su operacije koje se obavljaju isključivo nad inodom, ništa se sa datotekom ne radi.
  3575.  
  3576. Sintakse su:
  3577. chown(pathname, owner, group)
  3578. chmod(pathname, mode)
  3579.  
  3580. Da bi promenio vlasništvo, kernel konvertuje pathname u inode preko namei algoritma.
  3581. Proces mora biti sa root privilegijom ili da bude vlasnik datoteke, u protivnom ne može.
  3582. Nakon dobijanja inode, kernel modifikuje UID i GID polje, briše set user i set group flagove, a potom otpušta inode sa iput.
  3583.  
  3584. Potpuno ista procedura se radi i za chmod, gde se modifikuju prava pristupa.
  3585.  
  3586. stat, fstat
  3587. SC stat i fstat omogućavaju procesu da
  3588. postavi upit za status datoteke, a
  3589. upit će vratiti informaciju o
  3590. tipu datoteke,
  3591. vlasništvu,
  3592. ACL,
  3593. broju linkova,
  3594. broju inoda i
  3595. vremenima pristupa.
  3596.  
  3597. Sintakse su:
  3598. stat(pathname, statbuffer)
  3599. fstat(fd, statbuffer)
  3600. gde je
  3601. pathname ime datoteke, fd je file descriptor koji je vratio prethodni open SC,
  3602. statbuffer je korisnikov bafer za prijem podataka o statusu datoteke gde će stat i fsfstat da napune podatke.
  3603.  
  3604. Pipes
  3605. Pipes dozvoljavaju prenos podataka
  3606. između procesa na FIFO način,
  3607. a takođe omogućavaju sinhronizaciju procesa.
  3608.  
  3609. Postoje 2 vrste pipes:
  3610. named pipes
  3611. unamed pipes
  3612.  
  3613. Obe vrste su identične
  3614. osim pri inicijalnom pristupu pipe, pri čemu se
  3615. za named pipe koristi open SC kao read, write i close,
  3616. dok se unamed pipes kreiraju preko pipe SC
  3617. Pravila su da samo deca procesa koji je otpočeo pipe SC mogu deliti pristup unamed pipes.
  3618.  
  3619. Sintaksa za pipe SC je
  3620. pipe(fdptr)
  3621. gde je fdptr ukazivač na integer polje koje će sadržavati 2 file deskriptora za čitanje i upis pipe-a.
  3622.  
  3623. Kako su pipes u stvari datoteke, koje ne postoje pre korišćenja, kernel mora dodeliti jedan inode prilikom kreiranja pipe-a.
  3624.  
  3625. Kernel dodeljuje par file deskriptora
  3626. read descriptor za čitanje iz pipe
  3627. write descriptor za upis u pipe
  3628.  
  3629. Takođe se dodeljuje:
  3630. 2 FT ulaza za pipe
  3631. kod obične datoteke, samo jedan ulaz
  3632.  
  3633. čim se kreira pipe, svi SC (read, write) važe kao i za običnu datoteku.
  3634.  
  3635. algorithm pipe
  3636. input: none
  3637. output: read file descriptor
  3638. write file descriptor
  3639. {
  3640. assign new inode for pipe device (algorithm ialloc);
  3641.  
  3642. allocate 2 FT: entry for reading, another for writing;
  3643.  
  3644. initialize FT entries to point to new inode;
  3645.  
  3646. allocate 2 UDFT:
  3647. for reading and for writing,
  3648. initialize to point to respective FT entries;
  3649.  
  3650. set inode RC to 2;
  3651. initialize reference count RC of inode readers, writers to 1;
  3652. }
  3653.  
  3654. Kernel dodeljuje inode za pipe device preko algoritma ialloc.
  3655. Pipe device je onaj FS u kome se dodeljuje inode i data blocks za taj pipe.
  3656.  
  3657. Kada je pipe aktivan, kernel ne obavlja reassign pipe-ovog inoda i data blokova.
  3658.  
  3659. Kernel zatim dodeljuje 2 FT ulaza: za read i write descriptor i ažurira informacije u in-core inodu.
  3660. Svaki FT ulaz čuva informaciju koliko instanci pipe-a je otvoreno za čitanje i upis, a inicijalno se postavljaju na 1.
  3661. U in-core inodu, RC pokazuje koliko puta je pipe otvoren a inicijalno je 2.
  3662.  
  3663. Takođe inode čuva informaciju o bajt offsetu gde će sledeći upis ili čitanje da se događa kroz pipe.
  3664.  
  3665. Tu je osnovna razlika između pipe i obične datoteke,
  3666. kod pipe je offset u in-core inodu,
  3667. kod obične datoteke je offset u FT ulazu.
  3668.  
  3669. Proces ne može sam da podešava offset kao kod obične datoteke,
  3670. lseek ne važi za pipe.
  3671. nema radnom pristupa kroz pipe, isključivo sekvencijalno=FIFO.
  3672.  
  3673. Imenovani pipe je datoteka čija je semantika potpuna ista kao kod unamed pipes, osim što ima FCB u direktorijumu i pristupa joj se po pathname.
  3674. named pipes se
  3675. otvaraju kao obične datoteke
  3676. permanetno postoje u FS
  3677. brišu se sa unlink SC
  3678. unamed pipes tranzijentni,
  3679. kada svi procesi završe sa korišćenjem pipe-a,
  3680. kernel oslobađa inode.
  3681.  
  3682. Algoritam za open of named pipe-a je skoro isti kao kod obične datoteke.
  3683. Međutim, pre završetka open SC, kernel inkremetira read i write count u inodu, ukazujući koliko procesa je otvorilo named pipe za čitanje i upis.
  3684. Proces koji otvori named pipe za čitanje ostaje uspavan sve dok drugi proces ne otvori pipe za upis i obrnuto.
  3685. Kernel će probuditi proces koji uspavan na pipe-u, kada se dogodi neki događaj upis ili čitanje.
  3686.  
  3687.  
  3688. Reading and Writing Pipes
  3689. Proces pristupa podacima u pipe na FIFO način, koji znači da podaci moraju da se čitaju o onom poretku u kome su se upisali. Nije neophodno da broj čitaoca bude jednak broju pisaca u pipe, ako je broj pisaca i čitaoca veći od 1, mora se obezbediti sinhronizacija.
  3690. Kernel pristupa podacima u pipe kao kod obične datoteke, blokovi se dodeljuju i pune u toku write SC. Razliku u alokaciji prostora između pipe i obične datoteke što pipe koristi isključivo direktne pointere, što povećava performanse ali ograničava veličinu pipes.
  3691.  
  3692. Kernel manipuliše direktnim blokovima pipe-a kao sa kružnim queue, kontrolišući interne read i write ukazivače da poštuju FIFO poredak.
  3693.  
  3694. Postoje sledeća 4 slučaja čitanja i upisa u pipe:
  3695. I upis u pipe kada ima mesta za upis
  3696. II čitanje iz pipe kada se u pipe nalaze svi potrebni podaci koje čitaoc zahteva
  3697. III čitanje iz pipe kada nema svih traženih podataka
  3698. IV upis u pipe kada nema mesta za upis
  3699.  
  3700. WRITE
  3701. Prvi slučaj nastupa kada proces upisuje u pipe tako da je suma podataka koji se upisuje + količina podataka koja je već u pipe mora da bude manja od kapaciteta pipe-a.
  3702. Qnew_data+ Qexisting_data < PIPE_capacity
  3703.  
  3704. Kernel, tada upisuje podatke kao kod obične datoteke
  3705. za svaki takav upis inkremetira se pipe size i write pointer
  3706. budi sve read procese koji čekaju da se nešto upiše u pipe.
  3707. Kada se dođe do kraj pipe, iscrpe se svi direktni pointeri, ide se na početak pipe-a (byte offset 0).
  3708. Upis je uvek u rastućem redu.
  3709. Kod obične datoteke veličina ažurira samo ako se upis dešava iza kraja datoteke.
  3710. READ
  3711. Kada proces čita pipe, proverava se da li je pipe prazan ili nije.
  3712. Ako nije, read se dešava ali poštujući strogo offset koji je u inodu of pipe.
  3713. Posle čitanja svakog bloka,
  3714. kernel dekremetira veličinu pipe-a,
  3715. ažurira read pointer (read offset) i
  3716. budi eventualne writer procese koji čekaju na prazno mesto.
  3717.  
  3718. Proces koji čita pipe će se uspavati ako je pipe prazan ili nema dovoljno podataka. Postoje i no delay opcije koje odmah vraćaju bez čekanja ako read ne može da se zadovolji.
  3719.  
  3720. Ako proces želi da nešto upiše u pipe, a nema mesta, mora da ide na spavanje dok reader proces ne isprazni pipe.
  3721.  
  3722. Ukoliko proces upisuju podatke koji prevazilaze kapacitet pipe-a,
  3723. tada proces ne može da čeka jer nikada neće dočekati,
  3724. već upisuje samo onaj deo koji može da stane,
  3725. u najboljem slučaju kapacitet pipe-a,
  3726. pa čeka da se potpuno ili delimični isprazni.
  3727.  
  3728. Još jedanput, pipe
  3729. liči na regularnu datoteku
  3730. ali read i write offset nisu kontrolabilni od strane procesa
  3731. već se kontrolišu pomoću kernela i nalaze se u inode a ne u FT
  3732. to su offseti zajednički za sve procese koji dele pipe.
  3733.  
  3734.  
  3735. Kada se zatvara (close) pipe,
  3736. proces obavlja sličnu proceduru kao kod obicne datoteke,
  3737. ali kernel mora obaviti specijalnu proceduru prilikom zatvaranja pipe, odnosno otpuštanja pipe-ovog inoda.
  3738.  
  3739. Kernel dekrementira broj pipe-ovih reader-a i writer-a na svako zatvaranje.
  3740.  
  3741. Ako broj writera padne na 0, a ima uspavanih readera, kernel in budi i vraća im read SC bez pročitanih podataka.
  3742.  
  3743. Ako broj readera padne na 0, a ima uspavanih writera, kernel ih budi i salje im signal greške.
  3744.  
  3745. U oba slučaja čekalo bi se na nešto što nije sigurno da će se dogoditi,
  3746. a u slučaju named pipe mogao bi se pojaviti novi proces
  3747. ali ih kernel i named i unamed pipe tretira na isti način.
  3748.  
  3749. Ako nema ni reader ni writer procesa,
  3750. kernel oslobađa sve data blokove od pipe-a
  3751. markira inode da je pipe prazan.
  3752.  
  3753. Ovaj program ilustruje veštačko korišćenje pipes.
  3754. Proces kreira pipe i ide u beskonačnu petlju,
  3755. upisuje string „hello“ u pipe i čita ga iz pipe.
  3756. Kernel ne kontroliše stanje ako isti proces čita ili piše pipe.
  3757.  
  3758. char string [] = “hello”
  3759. main
  3760. {
  3761. char buf[1024];
  3762. char *cp1, cp2*;
  3763. int fds[2];
  3764. cp1= string;
  3765. cp2=buf;
  3766. while (*cp1) *cp2++ = *cp1++; /* popuna bafera "buf" sa stringom hello */
  3767. pipe(fds);
  3768. for (;;)
  3769. {
  3770. write(fds[1], buf, 6);
  3771. read(fds[0], buf, 6);
  3772. }
  3773. }
  3774.  
  3775. #include <fcntl.h>
  3776. char string [] = “hello”
  3777. main(argc, argv)
  3778. int argc;
  3779. char *argv[]
  3780. {
  3781. int fd;
  3782. char buf[256]
  3783. /*create named pipe with read/write permission for all users*/
  3784. mknod (“fifo”, 010777,0)
  3785.  
  3786. if (argc == 2) fd = open (“fifo”, O_WRONLY);
  3787. else fd = open (“fifo”, O_RDONLY);
  3788.  
  3789. for (;;)
  3790. {
  3791. if (argc == 2) write(fd,string,6);
  3792. else read(fd,buf,6);
  3793. }
  3794. }
  3795. Proces kreira pipe, a zatim
  3796. ako je pozvan sa 2 argumenta onda kontinualno upisuje string hello u pipe fifo.
  3797.  
  3798. Ako se pozove bez drugog argumenta on kontinualno čita named pipe.
  3799.  
  3800. Ako se od ovog programa kreiraju 2 procesa
  3801. oni će komunicirati kroz isti pipe fifo,
  3802. a može se više procesa uključiti na isti način.
  3803.  
  3804. DUP
  3805.  
  3806. SC dup
  3807. kopira file descriptor
  3808. u prvi slobodan slot u UFDT,
  3809. pri čemu vraća novi descriptor korisniku.
  3810.  
  3811. Ovaj SC radi za sve tipove datoteka i ima sledeću sintaksu
  3812. newfd = dup(fd);
  3813. pri čemu je fd descriptor datoteke koji se duplicira,
  3814. newfd je novi descritor datoteke.
  3815.  
  3816. S obzirom da dup duplicira file descriptor,
  3817. dup će inkrementirati count odgovarajućeg FT ulaza,
  3818. FT ulaz sada ima još jedan UFDT ulaz koji na taj FT ulaz ukazuje
  3819.  
  3820. Ovde smo imali sitaciju UFDT(1) je otvorio datoteku /etc/passwd fd 1, UFDT(3) fd3 je otvorio local, UFDT(5) fd5 je ponovo otvorio /etc/passwd. Potom je obavljen newfd=dup(fd1) i upisan u slot 6.
  3821. SC dup ne izgleda elegantan na prvi pogled, ali je zgodan za razne sofisticirane zadatke u programiranju kao što su shell pipeline
  3822.  
  3823. Posmatrajmo sledeći program
  3824. #include <fcntl.h>
  3825. main()
  3826. {
  3827. int i,j; char buf1[512], buf2[512];
  3828.  
  3829. i = open(”/etc/passwd”, O_RDONLY)
  3830. j = dup (i);
  3831. read (i, buf1, sizeof(buf1));
  3832. read (j, buf2, sizeof(buf2));
  3833.  
  3834. close(i);
  3835. read (j, buf2, sizeof(buf2));
  3836. }
  3837. Najpre je urađen open SC na /etc/passwd, dobijen je fd=i kreiran jedan ulaz sa njim u UFDT, kreiran ulaz u FT sa offsetom 0.
  3838. Sa dup je kreiran još jedan fd=j, još jedan slot u UFDT koji ukazuje na isti FT ulaz to znači sa istim offsetom.
  3839. Prva 2 read SC će pročitati prva dva disk bloka datoteke, a onda se zatvori jedan fd a to je fd=i, ali se datoteka ne zatvara već samo jedan ulaz u UFDT nestaje, ali tu je drugi fd=j sa kojim se nastavlja čitanje iz datoteke. Ovo može da se radi i sa standardnim file descriptorima 0, 1, 2, mogu se duplicirati, zatvarati itd.
  3840.  
  3841. Mounting and Umounting FS
  3842. Fizička disk jedinica se sastoji od više logičkih sekcija, i svaka sekcija ima svoje ime (device file name).
  3843. Proces može pristupati podacima u sekciji kao sa datotekom, prvo se otvori device filename, a potom se disk sekcija tretira kao datoteka, po njoj se čita i piše.
  3844. SC mount povezuje FS koji se nalazi u odgovarjućoj sekciji na disku u stablo, dok SC umount izbacuje FS iz stabla.
  3845. SC mount omogućava korisnicima da pristupaju sekciji diska kao FS a ne kao sekvenci disk blokova.
  3846.  
  3847. Sintaksa za mount SC je:
  3848. mount(special pathname, directory pathname, options)
  3849. pri čemu je:
  3850. special pathname ime specijalne datoteke koja se refencira na deo diska koji sadrži FS koji će biti mountovan
  3851. directory pathname je direktorijum u postojećem stablu gde će FS biti mountovan (mount-point)
  3852. option pokazuju kako će FS biti mountovan (read-only će blokirati svaki creat ili write SC u njemu
  3853.  
  3854. Na primer ako proces pošalje sledeći SC
  3855.  
  3856. mount("/dev/dsk1", "/usr", 0)
  3857.  
  3858. kernel će priključiti FS koji se nalazi u delu diska koji se naziva /dev/dsk1 ka direktorijum /usr u postojećem UNIX stablu.
  3859.  
  3860. Datoteka /dev/dsk1 je blok specijalna datoteka i po pravilu predstavlja deo diska, a da bi taj deo diska mogao da se mount-uje, on mora da sadrži FS, odnosno da sadrži superblock, inode listu i root inode.
  3861.  
  3862. Kada se kompletira mount SC, root direktorijum mountovanog FS je raspoloživ preko MPD direktorijuma (/usr u ovom slučaju).
  3863.  
  3864. Proces pristupa datotekama na mountovanom FS sasvim normalno bez obzira što su one uklonjive. Jedino link SC kontroliše tu činjenicu jer ne dozvoljava linkovanje između 2 FS.
  3865.  
  3866. Kernel održava mount tabelu (MT) sa ulazom za svaki mountovani FS.
  3867.  
  3868. Svaki ulaz u mount tabeli sadrži:
  3869. device number koji identifikuje mountovani FS
  3870. ukazivač na bafer koji sadrži superblock za taj FS
  3871. ukazivač na root inode mountovanog FS (/ of /dev/dsk1)
  3872. ukazivač na inode of MPD (usr of root FS)
  3873.  
  3874. Asocijacija MPD inoda i root inoda mountovanog FS, dozvoljava kernelu da prostiru (traverse) FS vrlo efikasno.
  3875.  
  3876.  
  3877. algorithm mount
  3878. input:
  3879. file name of block special file
  3880. MPD
  3881. options
  3882. output: none
  3883. {
  3884. if(not superuser) return (error);
  3885. get inode of block special file (algorithm namei);
  3886. make legality check;
  3887. get inode of MPD (algorithm namei);
  3888. if(not directory, or reference count > 1)
  3889. {
  3890. release inodes (algorithm iput); return (error);
  3891. }
  3892. find empty slot in MT;
  3893. invoke block device driver open routine;
  3894. get free buffer from buffer cache;
  3895. read superblock into free buffer;
  3896. initialize superblock fields;
  3897.  
  3898. get root inode of mounted device (algorithm iget), save in mount table;
  3899. mark inode of MPD as mount point;
  3900. release special file inode (algorithm iput);
  3901. unlock inode of MPD;
  3902. }
  3903.  
  3904. Kernel dozvoljava samo procesu sa superuser privilegijama da obave mount i umount SC, kako se ne bi dozvoljavao haos u sistemu.
  3905.  
  3906. Kernel pronalazi inode block specijalne datoteke koja predstavlja FS za mounting, izvlači major i minor number, pomoću kojih se identifikuje sekcija na disku koja sadrži taj FS i nalazi inode za MPD.
  3907.  
  3908. RC za taj MPD ne sme da bude veći od jedan, jer se ne sme mountovati više FS na isti MPD.
  3909.  
  3910. Kernel zatim alocira slobodan slot u MT, markira slot da je zauzet i dodeljuje device number.
  3911.  
  3912. Potom se otvara node, pozivajući open proceduru za block-special node, koja proverava da li je node legalan, inicijalizuje driver data strukture i šalje komande hardveru preko disk drajvera.
  3913.  
  3914. Kernel alocira free blok u bafer kešu (getblk) u koji će se čitati superblok i preko read algortima čita superblok u njega. Kernel memoriše pionter na inode MPD, čime se praktično obezbeđuje informacija na roditeljsku granu (..).
  3915.  
  3916. Kernel pronalazi root inode FS koji će biti mountovan, i memoriše ga u MT tabeli. Za korisnika, MPD i root of FS su logički ekvivalentni i kernel uspostavlja njihovu ekvivalenciju u istom ulazu u MT.
  3917.  
  3918. Iza mount-a procesi više ne pristupaju inodu of MPD.
  3919.  
  3920. Kernel inicijalizuje polja u superblocku, brišući lock za free block listu i free inode listu i postavlja broj free inodova na 0. To se radi da bi se sprečilo oštećenje FS prilikom mountovanja posle sistem crash-a, što će naterati kernel da pretraži slobodne inodove sa ialloc. Nažalost ako su povezane liste free blokova oštećene, kernel ne popravlja, to se postiže sa fsck.
  3921.  
  3922. Ukoliko mount sadrži read-only opciju, kernel će postaviti flag u superblock-u.
  3923.  
  3924. Na kraju, kernel će markirati inode(MPD) kao mountpoint, tako da svi procesi mogu da to identifikuju, što je ilustrovano na sledećoj slici.
  3925.  
  3926. Razmatrajmo šta se dešava ako pathname prolazi preko MPD, kako se ponašaju namei i iget algoritmi. Postoje 2 slučaja prelaska preko mount pointa:
  3927. prolazak sa mounted-on na mounted FS (u dubinu)
  3928. prolazak sa mounted FS na mounted-on (iz dubine)
  3929.  
  3930. To se sledeće 2 sekvence nakon komande
  3931. mount /dev/dsk1 /usr
  3932. cd /usr/src/ust
  3933. cd ../../..
  3934. Prva komanda obavlja mount SC koji mountuje FS(/dev/dsk1) na MPD(/usr).
  3935. Prva cd komanda obavlja chdir SC koji na svom putu prolazi preko mountpoint-a /usr.
  3936. Druga cd komanda ide na 3 roditeljske grane opet prolazeći mountpoint /usr.
  3937.  
  3938. U prvom slučaju, prolazak sa mounted-on na mounted FS (u dubinu), imamo modifikovani iget algoritam, koji je sličan kao osnovni algoritam iget, osim što proverava da li je inode mountpoint, koji se označava kao mounted-on ako je to MPD.
  3939. Za svaki takav inode se pronalazi ulaz u MT, iz koga čita device number i root inode, na osnovu kojih kojih može pristupiti root inode mountovanog FS i vratiti sadržaj tog inoda.
  3940. U prvoj cd komandi, kernel pristupa /usr inodu u mounted-on FS i detektuje da je to mountpoint, pronalazi se iz MT device number i root inode.
  3941.  
  3942. algorithm iget
  3943. input: file system and inode number
  3944. output: locked inode {
  3945. while(not done)
  3946. {
  3947. if(inode in inode cache) /* if #1*/
  3948. {
  3949. if(inode locked) /* if #2*/
  3950. {
  3951. sleep (event inode becomes unlocked);
  3952. continue; /* loop back to while*/
  3953. }/* if #2*/
  3954. /*special processing for mount point directory*/
  3955. if(inode a mount point)
  3956. {
  3957. find mount table entry for mount point;
  3958. get new FS number from MT;
  3959. use root inode number in search;
  3960. continue
  3961. }
  3962. if(inode on inode free list) remove from free list;
  3963. increment inode reference count;
  3964. return (inode);
  3965. }/*if #1*/
  3966. /* inode not in inode cache*/
  3967. if(no inodes on free list) return(error)
  3968.  
  3969. remove new inode from free list;
  3970.  
  3971. reset inode number in free list;
  3972.  
  3973. remove inode from old hash queue, place on new one;
  3974.  
  3975. read inode from disk(algorithm bread)
  3976.  
  3977. initialize inode (eg. reference count to 1)
  3978.  
  3979. return(inode) }/*while*/
  3980. }/*main*/
  3981.  
  3982. Za drugi slučaj posmatajmo modifikovani namei algoritam
  3983. algorithm namei /* convert path name to inode*/
  3984. input: path name
  3985. output: locked inode
  3986. {
  3987. if (path name starts from root)
  3988. working inode = root inode (algorithm iget);
  3989. else
  3990. working inode = current directory inode (algorithm iget);
  3991.  
  3992. while (there is more path name)
  3993. {
  3994. read next path name component from input;
  3995. verify that working inode is of directory, access permissions OK;
  3996. if (working inode is of root and component is “..”) continue; /*loop back to while*/
  3997. read directory (working inode) by repeated use of algorithms bmap, bread and brelse
  3998.  
  3999. if (component matches an entry in directory (working inode))
  4000. {
  4001. get inode number for matched component;
  4002. if(found inode of root and working inode is root and component name is ..)
  4003. /*crossing mount point*/
  4004. {
  4005. get MT entry for working inode;
  4006. release working inode (algorithm iput);
  4007. working inode = mounted on inode; (MPD inode)
  4008. lock MPD inode;
  4009. increment reference count of working inode;
  4010. go to component search for ..;
  4011. }
  4012. release working inode (algorithm iput);
  4013. working inode = inode of matched component (algorithm iget)
  4014. }
  4015. else
  4016. return (no inode);
  4017. }/* while */
  4018. return(working inode);
  4019. }
  4020.  
  4021. Kernel za svaki nađeni inode proverava
  4022. da li je root inode i
  4023. ako je working inode root i
  4024. ako je path komponenta je .., tada je to prolazak kroz mountpoint.
  4025. Tada se working inode zamenjuje sa inode(MPD) koji se čita iz MT.
  4026.  
  4027. Praktično imaš 2 inode za svaki MPD direktorijum i kada ga namei prolazi, mora doći do zamene working inoda.
  4028.  
  4029.  
  4030. Unmounting FS
  4031. Sintaksa za umount SC je:
  4032.  
  4033. umount(special filename)
  4034.  
  4035. gde special filename ukazuje na FS koga treba otkačiti.
  4036.  
  4037. Kernel mora prvo proveriti da nema otvorenih datoteka i DW blokova u kešu da taj u FS koji će se otkačiti.
  4038.  
  4039. Pretražuje se FT za sve potencijalne datoteke koje imaju FS number.
  4040. algorithm umount
  4041. input: file name of block special file
  4042. output: none
  4043. {
  4044.  
  4045. if(not superuser) return (error);
  4046.  
  4047. get inode of block special file (algorithm namei);
  4048.  
  4049. extract major, minor number of FS;
  4050.  
  4051. ger mount table entry, based on major and minor number;
  4052.  
  4053. release special file inode (algorithm iput);
  4054.  
  4055. remove shared text entries from region tables for files belonging FS;
  4056.  
  4057. update superblock, inodes, flush buffer;
  4058.  
  4059. if (files from FS still in use) return (error);
  4060.  
  4061. get root inode of mounted FS from MT;
  4062.  
  4063. lock inode;
  4064.  
  4065. release inode (algorithm iput); /*iget was in mount*/
  4066.  
  4067. invoke close routine for special device;
  4068.  
  4069. invalidate buffers in pool from unmounted FS;
  4070.  
  4071.  
  4072. get inode of MPD from MT;
  4073.  
  4074. lock inode;
  4075.  
  4076. clear flag marking it as mountpoint;
  4077.  
  4078. release inode (algorithm iput); /*iget was in mount*/
  4079.  
  4080.  
  4081. free buffer used for super block;
  4082.  
  4083. free mount table slot;
  4084. }
  4085. Kernel uzima inode za FS,
  4086. ažurira
  4087. superblock,
  4088. inodes i flush buffer,
  4089. oslobađa njegov root inode, zatvara device.
  4090.  
  4091. Potom uzima MPD, briše mu mount point flag, oslobađa ga.
  4092.  
  4093. Na kraju briše ulaz u MT i bafer za superblock.
  4094.  
  4095.  
  4096. link
  4097. Link SC linkuje datoteku sa novim imenom u stablu, tako što
  4098. kreira novi FCB
  4099. sa postojećim inode.
  4100.  
  4101. Sintaksa za link SC je:
  4102.  
  4103. link(source file name, target file name)
  4104.  
  4105. gde je source file name ime postojeće datoteke, a target file name nova datoteka koja će se kreirati ako link SC uspe.
  4106.  
  4107. FS sadrži path imena za sve linkove koje datoteka ima, i proces može pristupati datoteci po bilo kom path name.
  4108.  
  4109. Kernel ne zna koja je prva odnosno originalna datoteka, tako da su sva imena ravnopravna.
  4110. Na primer posle izvršenja 2 SC, dogodiće se situacija kao na slici:
  4111. link ("/usr/src/uts/sys", "/usr/inlcude/sys")
  4112. link ("/usr/inlcude/realife.h","/usr/src/uts/sys/testfile.h")
  4113.  
  4114. Kernel dozvoljava samo superuser,
  4115. zbog mogućnosti beskonačnih petlji kada korisnik linkuje direktorijume koji su na istoj grani. a ide se unazad.
  4116. Za superuser-a se pretpostavlja da je oprezniji.
  4117.  
  4118. Potreba za linkovanjem direktorijuma je bila na starim UNIX sistemima,
  4119. zato što mkdir komanda radila preko link SC,
  4120. ali je sve to razrešeno preko uvođenjem mkdir SC,
  4121. čime više nema potrebe da se linkuju direktorijumi.
  4122.  
  4123.  
  4124. algorithm link
  4125. input: {existing file name, new file name}
  4126. output: none
  4127. {
  4128. get inode for existing file name (algorithm namei);
  4129.  
  4130. if (too many links on file or linking directory without super user permission)
  4131. {
  4132. release inode (algorithm iput);
  4133. return (error);
  4134. }
  4135.  
  4136. increment link count on inode;
  4137. update disk copy of inode;
  4138. unlock inode;
  4139.  
  4140. get parent inode for directory to contain new file name (algorithm namei);
  4141. if (new file name already exists or existing/new file name on different FS)
  4142. {
  4143. undo update done above;
  4144. return (error);
  4145. }
  4146. create new FCB-directory entry in parent directory of new file name:
  4147. FCB include new file name, but inode number of existing file
  4148.  
  4149.  
  4150. release parent directory inode (algorithm iput);
  4151. release inode of existing file (algorithm iput);
  4152. }
  4153.  
  4154. Kernel prvo locira inode originalne datoteke, preko algoritma namei,
  4155. inkrementira link count,
  4156. ažurira disk kopiju inoda (iz razloga konzistencije),
  4157. a na kraju unlock-uje inode.
  4158.  
  4159. Zatim se traži target file,
  4160. ako target file postoji link otkazuje, link count se dekrementira jer je prethodno inkremetiran.
  4161. Ako ne postoji, dodeli novi FCB slot u target direktorijumu,
  4162. upisuje se filename i inode broj originalne datoteke,
  4163. oslobađa se inode parent direktorijuma za target file preko iput.
  4164. Potom se oslobađa inode postojeće datoteke čiji link count uvećan za 1.
  4165.  
  4166. deadlock - possibility
  4167.  
  4168. Prilikom linkovanja datoteka mogući su deadlocks.
  4169. Obradićemo 2 moguće situacije za deadlock i oba potiču zbog ne-oslobađanja inoda nakon inkrementiranja link count.
  4170. Pažnja: uvek se lock-uje poslednji inode originala.
  4171. Ako kernel ne oslobađa inode, 2 procesa bi mogla da uđu u deadlock situaciju, kao na primeru 2 simultana procesa:
  4172. proces A: link("a/b/c/d", "e/f/g");
  4173. proces B: link("e/f ", "a/b/c/d/ee");
  4174.  
  4175. Pretpostavimo da proces A nađe inode za "a/b/c/d" u isto vreme kada proces B nađe inode za "e/f " i oba postaju locked.
  4176. Kada proces A pokuša da nađe inode za "e/f", on mora da čeka da inode za e postane free.
  4177. Na drugoj strani proces B mora da čeka da inode za da postane slosoban, i tako su oba procesa uletela u deadlock.
  4178. Sve se to sprečava tako što kernel otpusti inode nakon LC++;
  4179.  
  4180.  
  4181. Unlink
  4182. unlink SC uklanja FCB datoteke iz direktorijuma.
  4183.  
  4184. Sintaksa za unlink SC je:
  4185.  
  4186. unlink(pathname);
  4187. gde je pathname ime koje će biti izbačeno iz UNIX stabla.
  4188.  
  4189. Na primer u sledećoj sekvenci, open SC će otkazati jer je datoteka prethodno obrisana:
  4190. unlink("myfile");
  4191. fd=open("myfile", O_RDONLY)
  4192.  
  4193. Ako se datoteka unlink-uje kao poslednji ili jedini link na datoteku, tada će unlink osloboditi inode i sve blokove datoteke.
  4194. Ako postoji više linkova,
  4195. nestaje samo to ime i LC--;
  4196. dok je datoteka raspoloživa preko svih ostalih imena.
  4197.  
  4198. algorithm unlink
  4199. input: file name
  4200. output: none
  4201. {
  4202. get parent inode for directory to contain file to be unlinked (algorithm namei);
  4203. /* if unlinking the current directory…*/
  4204. if (last component of file name “.”)
  4205. increment inode reference count;
  4206. else
  4207. get inode of file to be unlinked (algorithm iget);
  4208.  
  4209. if(file is directory but user is not super-user)
  4210. {
  4211. release inodes (algorithm iput);
  4212. return (error);
  4213. }
  4214.  
  4215. if (shared text file and link count currently 1) remove from region table;
  4216.  
  4217. write parent directory: zero inode number of unlinked file;
  4218.  
  4219. release inode parent directory (algorithm iput);
  4220.  
  4221. decrement file link count;
  4222.  
  4223. release file inode (algorithm iput);
  4224.  
  4225. /* iput checks if link count is 0: if so,
  4226. release file blocks (algorithm free) and
  4227. frees inode (algorithm ifree)
  4228. */
  4229. }
  4230.  
  4231. Kernel prvo preko namei nalazi
  4232. ali ne datoteku,
  4233. već inode roditeljskog direktorijuma.
  4234.  
  4235. Pristupa se in-core inode datoteke koja će brisati, preko iget.
  4236. Potom se obave testovi,
  4237. da li to shared text i
  4238. da li LC=1, i
  4239. kernel briše FCB iz direktorijuma, tako što na mestu inode broja upiše 0, a to se sinhrono upiše na disk i parent inode se oslobađa preko iput.
  4240.  
  4241. Za datoteku koja se briše LC--; i oslobađa se in-core file inode.
  4242.  
  4243. Ako prilikom otpuštanja in-core inode, LC padne na 0,
  4244. ta datoteka više ne postoji na disku,
  4245. iput tada oslobađa sve data blocks sa free,
  4246. tako što oslobađa sve direktne i sve indirektne blokove i
  4247. oslobađa inode sa ifree tako što upiše filetype=0 u inode.
  4248.  
  4249.  
  4250. FS Consistency
  4251. Kernel obavlja svoje upise u poretku kako bi minimizovao šanse za FS oštećenje u slučaju otkaza sistema.
  4252.  
  4253. Na primer, kada se briše filename iz svog direktorijuma (FCB),
  4254. to se se sinhrono upisuje na disk u roditeljski direktorijum,
  4255. pre nego što se oslobode blokovi datoteke i inode.
  4256.  
  4257. Ako se dogodi system crash dok se oslobođaju data blokovi, nije strašno, nema FCB koji ukazuje na taj inode.
  4258.  
  4259. Ako unos ne bi bio sinhron a dogodi se crash, FCB koji nije upisan može ukazivati na potpuno prazan inode ili na pogešan inode što je ozbiljnije oštećenje FS.
  4260.  
  4261. Mnogo je lakše očistiti inode za koga nema FCB, nego ispraviti pogrešan FCB.
  4262.  
  4263. Evo primera:
  4264. Pretpostavimo da imamo 2 linka sa imenima a i b i obavimo unlink a.
  4265. Kernel poštuje poredak write operacija,
  4266. pa prvo anulira FCB u direktorijumu za link-a i upiše ga na disk.
  4267. Ako tada sistem pukne, LC=2, a ostao je samo b, tako da će sistem imati problema jedino ako se briše b, a svi ostalim slučajevima je sve ispravno.
  4268.  
  4269. Pretpostavimo drugi poredak write operacija.
  4270. Kernel prvo uradi LC--; i dogodi se crash pre nego što je obrisan FCB(a).
  4271. Posle butiranja sistema, imamo 2 FCB na isti inode, a LC=1 i ako se obavi brisanje a ili b, datoteka će fizićki nestati,
  4272. a ostaje FCB koji postaje neregularan, jer ukazuje ili na prazan inode ili na inode koji se kasnije dodeli za neku drugu datoteku, koja će opet imati LC=1, a dva imena.
  4273.  
  4274. Kernel takođe oslobađa inode i disk blokove u poretku,
  4275. mogu se prvo oslobađati data blocks pa tek onda inode ili obrnuto,
  4276. ali uticaj crash-a je sasvim različit.
  4277. Pretpostavimo da kernel oslobađa disk blokove i da se dogodi crash. Nakon podizanja sistema imamo inode koji ukazuje na oslobođene blokove a to je prilično neregularna situacija.
  4278. Ako se prvo oslobodi inode, pa sistem pukne, blokovi koji su pripadali datoteci su neupotrebljivi jer nisu vraćeni u free listu, ali sve ostalo je sasvim regularno, nema inode i nema pogrešnog pristupa. Program fsck lakše oslobađa disk blokove nego što ih čisti.
  4279.  
  4280.  
  4281. Race Condition
  4282. Race condition je prisutan u unlink SC, osobito kada se brišu direktorijumi sa rmdir koji briše direktorijum, samo ako je prazan, a to će konstatovati samo ako svi direktorijumski ulazi-FCB imaju vrednost inoda = 0.
  4283. Kako se rmdir ne obavlja atomski, a to znači da može da se dogodi context switch između čitanja za proveru direktorijumskih blokova i brisanja samog direktorijuma.
  4284. Na primer može drugi proces da obavi create, a ovaj prvi konstatovao da je već prazan. Jedini način da se ovo spreči je record locking. Kada proces izvršava unlink call, nijedan drugi proces ne može da pristupa roditeljskom direktorijumu jer mu je inode locked zbog inoda.
  4285.  
  4286. Podsetimo da algoritam za link SC oslobađa inode pre kraja poziva, ali ako drugi proces pokušava da obriše datoteku, to je moguće jer je link oslobodio inode, ali će brisanje samo decrementirati LC, a datoteka ostaje.
  4287.  
  4288. Drugi RC se dešava kada jedan proces konvertuje file pathname u inode preko namei algoritma, a drugi proces uklanja granu u toj putanji.
  4289. Pretpostavimo da proces A razbija pathname "a/b/c/d" i odlazi na spavanje dok se ne oslobodi in-core inode za c.
  4290. Proces B na primer želi da obavi unlink c i on odlazi na spavanje.
  4291. Kada se on oslobodi i ako kernel da prednost procesu B, tada će B obrisati granu c, ako je prazna naravno.
  4292. Kada A dobije procesor, namei više ne nalazi in-core c, jer je obrisan a na njega je čekao i mora da se završi sa porukom o grešci.
  4293. Može da se dogodi i 3 situacija da novi proces C, dobije inode koji je pripadao grani c, napravi novu granu ili datoteku, a da proces a nastavi sa izmenjenom siutacijom, pa će pristupiti pogrešnoj datoteci, što nije dobro.
  4294.  
  4295.  
  4296. brisanje otvorene datoteke
  4297. Proces može obrisati datoteku čak i kada je otvorena od strane nekog drugog procesa.
  4298.  
  4299. Pošto open SC, oslobađa inode na kraju, unlink će biti uspešan.
  4300.  
  4301. Kernel prati unlink agoritam kao da datoteka nije otvorena i uklanja FCB, tako da datoteci više niko ne može da priđe.
  4302.  
  4303. Međutim kako je open SC inkrementirao RC, kernel ne briše datoteku oslobađajući data blocks i inode, u iput algoritmu kod unlink SC.
  4304.  
  4305. Svi procesi koji su otvorili datoteku rade sa njom (FD). Tek kada se dogodi close SC, tada kernel preko iput algoritma briše sadržaj datoteke.
  4306.  
  4307. Ovo se često dešava, proces kreira tmp file, pa ga otvorenog odmah obriše, ali se pravo brisanje dogodi tek na zadnji close SC.
  4308.  
  4309. Evo primera: prvo se otvori datoteka, zatim se briše, III stat puca jer napada datoteku koje više nema, ali fstat radi jer ide preko file descriptora
  4310. #include <sys/types.h>
  4311. #include <sys/stat.h>
  4312. #include <fcntl.h>
  4313. main(argc, argv)
  4314. int argc;
  4315. char *argv[];
  4316. {
  4317. int fd;
  4318. char buf[1024];
  4319. struct stat, statbuf;
  4320. if(argc != 2) exit (); /*need parameter*/
  4321. fd = open(argv[1], O_RDONLY)
  4322. if (fd == -1) exit (); /*open fails */
  4323. if(unlink(argv[1], == -1) exit (); /*unlink just opened */
  4324.  
  4325. if( (stat(argv[1],&statbuf == -1) /*stat the file by name */
  4326. printf("stat %s fails as it should\n", argv[1]);
  4327. else
  4328. printf("stat %s succeded!!!!! \n", argv[1]);
  4329.  
  4330. if( (fstat(fd,&statbuf == -1) /*fstat the file by fd */
  4331. printf("fstat %s fails !!!!!\n", argv[1]);
  4332. else
  4333. printf("fstat %s succeded as it should\n", argv[1]);
  4334.  
  4335. while (read(fd, buf, sizeof(buf)>0) /*read open/unlinked file*/
  4336. printf("%1024s n", buf); /*prints 1K byte field*/
  4337. )
  4338.  
  4339. FS Abstractions
  4340.  
  4341. Weinberg je uveo FS tipove-types da bi obezbedio podršku za njegov network filesystem, što je implemetirano na UNIX System V.
  4342. FS tipovi omogućavaju kernelu da simultano podržava više FS tipova kao što su mrežni FS ili FS različitih operatvnih sistema.
  4343. Procesi koriste normalan open SC, a kernel mapira generički skup I/O operacija u operacija za specifični tip FS.
  4344.  
  4345. Inode je interfejs između apstraktnog FS i specifičnog FS.
  4346.  
  4347. Generički in-core inode sadrži podatke koji su nezavisni od specifičnog FS i ukazuju na file-specifični inode koji sadrži file-specific podatke.
  4348.  
  4349. File-specific inode uključuje informacije kao što su ACL, block layout itd.
  4350.  
  4351. Generic inode sadrži informacije kao što su
  4352. device number,
  4353. inode number,
  4354. file type,
  4355. size,
  4356. vlasnik, i
  4357. RC.
  4358. Drugi podaci koji su FS-specific sadržani u superblocku i direktorijumskim strukturama.
  4359. Na slici je prikazana generička in-core inode tabela i 2 tabele sa FS-specific inodovima,
  4360. jedna za UNIX System V FS a
  4361. druga za remote inode,
  4362. koja sadrži dovoljno informacija da identifikuju datoteku na udaljenom FS.
  4363.  
  4364. Taj udaljeni FS možda i nema inode baziranu strukturu, međutim sve se to preko generičke inode tabele i FS-specific tabele mapira u inode-like strukturu, tako da se sve radi apstraktno sa open, close, read, write, dobijanje inode za datoteku kao namei i iget, oslobađanje inoda kao iput, ažuriranja inoda, provera prava, setovanje prava, mount i umount FS.
  4365.  
  4366.  
  4367. FS Maintenance-data blocks
  4368. Kernel održava konzistenciju FS za vreme normalne operacije, ali neobične okolnosti kao što je power-fail, mogu ostaviti FS u nekonzistetno stanje.
  4369. Komanda fsck proverava FS i ispravlja nepravilnosti, pristupajući preko block ili character interfejsa, zaobilazeći regularni file pristup.
  4370.  
  4371. Za disk blokove, pravila su jasna, prvo su svi blokovi slobodni, potom se blok izbaci iz liste a dodeli samo jednom inodu, a da bi se dodelio drugom inodu mora se prvo vratiti listu. Prema tome disk blok ili je u free listi ili je u samo jednom inodu.
  4372. Tipične neregularnosti su
  4373. da disk blokovi pripadaju više od jednog inoda
  4374. ili se istovremeno nalaze u listi slobodnih blokova i inodu.
  4375.  
  4376. Tipična situacija koja se dešava je kada kernel oslobodi blok iz datoteke, upiše ga in-core free listu superbloka, dodeli ga u in-core druge datoteke.
  4377. Potom treba ažurirati superblock na disku i oba inoda, i ako se pre tih ažuriranja dogodi crash,
  4378. može se blok naći u inodovima obe datoteke,
  4379. a takođe može završiti i free listi i u inodu.
  4380. Postoji još jedna neregularna situacija kada blok nije ni u free listi ni u datoteci, na primer blok se izbaci iz free liste upiše u in-core inode, ali se ne ažurira a dogodi se crash, pa ga nema nigde.
  4381.  
  4382.  
  4383. Takođe, inodovi mogu imati non-0 link count, a da taj inode ne postoji u nijednom FCB, što se dešava kada sistem ako se dogodi crash kada se dodeli inode za pipe ili new-file a ne upiše se FCB. Slična sitacija može da se dogodi ako se neregulano obriše grana koja nije prazna.
  4384.  
  4385. I druga polja u inodu mogu biti neregularna, na primer file type, ako se mountuje nepravilno formatirani FS.
  4386.  
  4387. Neregularnosti se pojavljuju u slobodnim i zauzetim inodovima jer se zbog crash inode može naći i u FCB i u listi slobodnih inodova.
  4388.  
  4389. Neregularnost je kada broj slobodnih blokova i broj slobodnih inodova u superbloku ne odgovara realnom stanju na disku, zato što kompletna informacija u superbloku mora biti veoma tačna.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement