Maturski rad na temu:
Operativni sistem FreeBSD - istorija, dizajn, korisniki interfejs
Autor: Marko Uskokovic <turncoat@softhome.net>

ISTORIJA:
---------
  RAZVOJ UNIX-A U BELL-OVIM LABORATORIJAMA
  RAZVOJ UNIX-A OD STRANE USG
  UNIX NA BERKELEY UNIVERZITETU
  STANDARDIZACIJA UNIX-A
  DALJI RAZVOJ BSD-A
  FreeBSD
  NetBSD
  OpenBSD
 
DIZAJN:
--------
  O FreeBSD-u
  Model razvoja
  Razvoj (-CURENT, -STABLE)
  INSTALACIJA
  PORTS&PACKAGES
  KERNEL (ORGANIZACIJA, SERVISI)
  PROCESI (SIGNALI, GRUPE, SENI)
  MEMORY MANAGEMENT
  I/O SISTEM (Descriptors, devices)	
  FILE SYSTEM
  NETWORK FAJL SISTEM
  SYSTEM OPERATION (BOOT)
  KOMPAJLIRANJE KERNELA						
  

KORISNICKI INTERFEJS:
----------------------
- SHELL
- X-WINDOWS
- KDE, GNOME


LITERATURA KOJA JE KORIENA:
KNJIGE:
   - The Design and Implementation of the 4.4BSD Operating System - Kusick, Bostic, Karels, Quarterrman
   - The FreeBSD Handbook - The FreeBSD Documentation Project
   - Operating Systems: Internals and Design Principles - William Stallings
   - Design elements of the FreeBSD VM system - Matthew Dillon

NET:
    www.freebsd.org
    www.bsd.org.yu
    venus.elfak.ni.ac.yu/unix/html
    www.unix-systems.org
    www.opengroup.org
    www.vmunix.com/fbsd-book/book.phtml


############
## ISTORIJA ##
############

ISTORIJA UNIX OPERATIVNOG SISTEMA
===================================
------------------------------------------------------
- RAZVOJ UNIX-A U BELL-OVIM LABORATORIJAMA -
------------------------------------------------------
    Prvu verziju operativnog sistema UNIX razvio je 1969. godine Ken Thompson, lan AT&T-ove istraivake grupe Bell-ovih Laboratorija (The Research Group at Bell Laboratories) na DEC-ovim raunarima PDP-7 sa ciljem da napravi pogodan timesharing sistem. (*Kompjuterski sistemi tih godina su bili potpuno nekompatibilni, ak i kad su u pitanju razliite verzije sistema istog proizvoaa. Operativni sistemi su izvravali samo ograniene zadatke i to samo na mainama na kojima su bili napisani. Ako bi firma elela da unapredi svoje kompjutere, to bi znailo instaliranje novog sistema, ali i ponovno unoenje svih podataka!*) Njemu se uskoro pridruio Dennis Richie, koji je ranije radio na projektu MULTICS, koji ekonomski nije bio pogodan za dalje razvijanje. Od MULTICS-a je preuzeto mnogo toga: organizacija fajl sistema, ideja da se komandni interpreter (nazvan shell - ljuska) izvrava kao korisniki proces (a ne sistemski), korienje razliitih procesa za svaku komandu, linijsko editovanje i druge. Naravno na UNIX su uticali i drugi operativni sistemi, pogotovo MIT-ov CTSS, a sam UNIX je uspeo u onome to oni nisu - postao je snani operativni sistem, neobine jednostavnosti i elegancije.
    Druga verzija UNIX-a bila je portovana na raunare DEC PDP-11. Ove verzije UNIX-a bile su programirane u asembleru. Ken Thompson je 1970. godine napisao programski jezik B (po ugledu na Martin Richards-ov BCPL), i njega je Dennis Ritchie 1973. godine proirio strukturama podataka, stvorivi programski jezik C u kom e sledea verzija UNIX-a biti implementirana. Ova verzija je pokazala da postoje mnoge prednosti pisanja operativnog sistema u jeziku visokog nivoa, kakav je C (multiprogramiranje, deljenje koda, reusability...), tako da su danas sve verzije UNIX-a napisane u C-u. UNIX je ubrzo preao na sisteme iji je hardver podravao multiprogramiranje (PDP-11/45) i tako dobio velike mogunosti unapreivanja.
    Ken Thompson i Dennis Ritchie su 1973. godine na simpozijumu o principima operativnih  sistema, odranom na Purdue univezitetu, predstavili svoj rad o UNIX operativnom sistemu, a 1974. godine prvi put je opisan u tehnikom urnalu. Predavanja o UNIX-u koja je Ken Thompson drao na Berkeley univerzitetu (University of California at Berkeley - UCB) bila su od velikog znaaja za poveanje popularnosti UNIX-a na fakultetima. 1976. je Version 6 UNIX bio distribuiran mnogim fakultetima pod akademskim licencama. Na Berkeley-ju je osnovana grupa za istraivanje - Computer Science Research Group (CSRG), iji je rukovodilac bio Robert Fabry. Unapreenja koja je CSRG doneo UNIX-u nazvana su Berkeley Software Distribution (BSD). Sa dolaskom UNIX-a na Berkeley-u poeo je i rad na INGRES bazi podataka, koja je pretea jedne od najboljih baza podataka dananjice - Posgres baze podataka.
    Sledea verzija Version 7 UNIX je objavljena 1978. godine. Ovaj UNIX sistem radio je na PDP-11/70 i Interdata 8/32 raunarima, a uskoro je portovan i na VAX, gde dobija oznaku 32V. Version 8 iz 1985. ukljuuje I/O stream sistem (sistem ulazno/izlaznog toka) kojim se omoguuje fleksibilnost kernela u meuprocesnoj komunikaciji (IPC), i ukljuuje se RFS (Remote File System-daljinski fajl sistem) slian SUN-ovom NFS-u (Network File System) koji danas predstavlja standardni nain deljenja fajlova meu UNIX-ima. Sledee verzije (Version 9 (1986), Version 10 (1989) i Plan 9 (1991)), ostale su dostupne samo istraivkoj grupi unutar Bell-ovih laboratorija.
--------------------------------------
- RAZVOJ UNIX-A OD STRANE USG -
--------------------------------------
    Zbog svojih osobina i mogunosti (timesharing os, multitasking i multiuser os) UNIX je postao primamljiv i za komercijalnu upotrebu. Nakon Verzije 7 formirana je posebna grupa, UNIX Support Group (USG), u okviru AT&T sa zadatkom da se brine o UNIX sistemu. Njihova prva distribucija bila je System III (1981. god.) i ona je imala ugraene mogunosti iz Version 7, 32V, real time UNIX/RT i Programmer's Work Bench (PWB) sistema (interne verzije u Bell-ovim laboratorijama). 
    USG je 1983. god. objavio System V, System III derivat, zatim se preformirao u 'UNIX System Development Laboratory' (USDL), i 1984. god. objavio UNIX System V Release 2 (V.2). Sledea verzija - UNIX System V Release 2, Version 4 (V.2.4), donela je implementaciju virtualne memorije sa paging-om tipa kopiraj-pri-upisu i deljenu memoriju. USDL se transformisao u 'AT&T Information Systems' (ATTIS), koji je 1987. god. distribuirao System V Release 3 (V.3). SVR3 je adaptirao implementaciju I/O stream sistema iz V8 (nazvanu STREAMS) i ukljuio je RFS.
    ATTIS 1989. godine postaje UNIX Software Organization (USO) i razvija UNIX System V Release 4 (SVR4), kombinujui mogunosti iz SVR3, 4.3BSD, Microsoft Xenix i SunOS operativnih sistema. Predstavlja skoro potpuno prekodiran System V kernel i podrava procesovanje u realnom vremenu, process scheduling klase, signale (IPC), dinamino alociranje struktura podataka, upravljanje virtualnom memorijom, virtualni fajl sistem i kontrolu poslova (job control). SVR4 radi kako na 32-bitnim mikroprocesorima tako i na superkompjuterima i u potpunosti je usaglaen sa POSIX standardom. SVR4 je razvijan tako da postane jedinstvena platforma za komercijalni razvoj UNIX-a, a na njemu su radili kako komercijalni tako i akademski projektanti. Oni su u tome svakako i uspeli, tako da SVR4 predstavlja moda i najznaajniju varijantu UNIX-a, poto je objedinio sve najznaajnije mogunosti UNIX-a koje su razvijene.
    Posle izdavanja SVR4 USO postaje Unix System Laboratories (USL), koji postaje deo Novell-a 1993. godine.
---------------------------------------
- UNIX NA BERKELEY UNIVERZITETU -
---------------------------------------
    Najvei doprinos UNIX-u doneo je University of California at Berkeley (UCB). Prvu zvaninu distribuciju UNIX-a (3BSD) napravio je 1978. god. Bill Joy, autor vi-a (to je impliciralo i drajvere za terminale), ovek koji je znaajno unapredio tadanji pascal interpreter, jedan od osnivaa Sun Microsystems-a, autor programskog jezika JAVA i jedan od najveih UNIX hakera svih vremena. Ta distribucija predstavljala je VAX UNIX 32V, kome su dodati virtuelna memorija, stranienje na zahtev (demand paging) i zamena stranica (page replacement). Virtuelna memorija je omoguila da se UNIX koristi za razvoj velikih programa, kao to je Berkeley-ev Franz Lisp. Paralelno sa razvojem na VAX raunarima, BSD se razvija i na raunarima PDP-11, ali je manja cena VAX raunara doprinela irenju BSD i u drugim akademskim okruenjima.
    4BSD je nastao DARPA-inim (*Defense Advanced Research Projects Agency*) finansiranjem Berkeley-a za razvijanje standardnog UNIX sistema za vladine potrebe. 4.2BSD je obezbedio rad u mrei po DARPA-inom Internet mrenom protokolu (TCP/IP), tako da je obezbeena uniformna komunikacija meu razliitim elementima, ukljuujui lokalne mreze (kao to je Ethernet i token rings) i mree raunara (Arpanet i NSFNET). Berkeley-eva implementacija TCP/IP protokola se distribuirala na trakama kao "Networking Release 1", tj. "Net/1" trake.
    Sledea verzija, 4.3BSD, donela je mnoga unapreenja i poboljanje performansi mrene komunikacije. Berkeley je dozvoljavao distribuiranje 'Net/2' traka korporacijama koje su licencirale AT&T-ov UNIX, pod uslovom da one u svojim distribucijama priznaju da koriste Berkeley-eve trake. Ovo je omoguilo proirenje Interneta od 60 povezanih mrea (1984), do preko 8000 mrea i 10 miliona korisnika u 1993.
    Na Berkeley-u su razvijeni mnogi drajveri za terminale, novi korisniki interfejs (C shell), novi tekst editor (ex/vi), kompajler za Pascal, interpreter za Lisp, kao i mnogi drugi sistemski programi. 
    Poslednje Berkeley-evo izdanje UNIX-a 4.4BSD, dovreno je 1993. godine i ispunjava sve uslove koje zadaje POSIX standard. Pored toga sadri radikalno novu organizaciju fajl sistema koja omoguava lako dodavanje novih mogunosti. Ukljuena je i implementacija NFS-a, poboljana sigurnost i unapreena struktura kernela. Izdavanjem verzija 4.4BSD i 4.4BSD Lite (za distribuciju) Berkeley je obustavio dalji razvoj.
-------------------------------
- STANDARDIZACIJA UNIX-A -
-------------------------------
    Kako je popularnost UNIX-a rasla, razliite korporacije, organizacije i univerziteti su portovali UNIX na mnoge platforme raunara, tako da je stvoren veliki broj UNIX-slinih operativnih sistema. Primeri su DEC-ov Ultrix, IBM-ov AIX, Microsoft-ov Xenix, Sun-ov SunOS i Solaris, Hewlett-Packard-ov HP-UX, Compaq-ov Tru64 UNIX, Novell-ov UNIX Netware, SGI-ov IRIX, Chorus, MACH, OSF/1, 386BSD, SCO UNIX, kao i mnogi drugi operativni sistemi koji su razvijani po ugledu na UNIX, kao to su: Tunis, Xinu, Minix, Linux.
    UNIX je danas dostupan na svim raunarima opte namene, personalnim raunarima (PC), radnim stanicama, minikompjuterima (PDP-11, VAX), mainframe raunarima i super kompjuterima (cray).
    Veina ovih sistema je bazirana na Version 7, System III, 4.2BSD i SystemV UNIX-ima. Kako UNIX nije bio razvijan od strane samo jednog proizvoaa, niti za samo jednu vrstu raunara, postao je najprenosiviji i najzastupljeniji operativni sistem. Ovo bi moglo da omogui korisnicima da imaju jedinstveno okruenje na svim raunarima bez obzira na proizvoaa. Ali je veliki broj implementacija sistema doveo do znaajnih razlika u programiranju i korisnikom interfejsu ovih sistema. Da bi se korisnicima pruilo jedinstveno okruenje, mora postojati jedinstveni programski interfejs, tako da sve UNIX aplikacije koje potuju taj interfejs mogu da se izvravaju na svim UNIX sistemima. 
    Standardizacija UNIX-a je veoma teak zadatak i to zbog vie faktora. Naime, kako je Ken Tompsonov prvobitni cilj pisanja prvog UNIX kernela bio poboljanje performansi igre zvane Space Travel, on nije ni razmiljao da potuje bilo kakve standarde. Dalji razvoj i korienje UNIX-a bilo je samo u okviru AT&T-a, tako da opet nije bilo potrebe za nekim zvaninim standardom. Kada je UNIX izaao iz AT&T-a, poeo je njegov brzi razvoj u raznim pravcima, to je vodilo do pojave velikog broja varijanti UNIX-a i nemogunosti pojave bilo kakvog standarda. Takoe, sa razvojem UNIX kernela, razvijane su i razne alatke, bez kojih dananji UNIX sistemi ne bi bili to to jesu, tako da standardizacija UNIX-a svakako mora da obuhvati i standardizovanje alatki kao to su lex, yacc, awk, grep...
    Prvi pokuaj standardizovanja UNIX operativnih sistema bio je osnivanje nekormercijalne organizacije /usr/group u 1980. god, a 1984. god. IEEE (Institute of Electrical and Electronics Engineers) je iskoristio nacrt ovog standarda za POSIX (Portable Operating System Interface for UNIX) standard, koji bi trebalo da obuhvata 20 standarda, ali su do sada u potpunosti dovrena i objavljena samo dva - POSIX 1003.1 koji opisuje sistemske pozive i POSIX 1003.2 koji opisuje shell. POSIX ustvari predstavlja opis interfejsa, ali ne i implementaciju, to znai da i nije pravi standard. Ali, on predstavlja generalizaciju UNIX sistema, tako da su ga druge organizacije koristile kao osnovu za svoje standarde. 
    Otprilike u isto vreme AT&T je objavio System V Interface Definition (SVID), a X/Open je objavio X/Open Portability Guide (XPG). 1988 god. Open Software Foundation objavljuje OSF/1 verziju UNIX-a kompatibilnu sa POSIX-om i  Motif - grafiki interfejs koji danas predstavlja standardni korisniki grafiki interfejs. 
    1993. godine Novell je kupio UNIX System Laboratory od AT&T-a, a zatim objavio sledeu verziju UNIX-a pod imenom UnixWare. Kako UnixWare nije stekao veliku popularnost, Novell je shvatio da ukoliko ne doe do ozbiljne standardizacije UNIX-a, ni jedan komercijalni UNIX sistem nee preiveti. Zbog toga je ve 1994. god. Novell zvanino dao pravo korienja imena UNIX organizaciji X/Open i tako zapoeo najuspeniji pokuaj unifikacije UNIX-a do danas. 
    X/Open je utvrdio specifikaciju "Spec 1170", koja predstavlja nacrt vie od 10 000 API-ja (Application Programmer Interfaces) kojima se opisuju UNIX-slini operativni sistemi, a 1995. god. objavljuje konanu specifikaciju - "Single UNIX Specification". UNIX sistemi koji su usklaeni sa ovom specifikacijom nazivaju se "UNIX 95".
    Ujedinjenjem organizacija X/Open i OSF 1996. god. nastala je organizacija Open Group koja je objavila drugu verziju standarda "Single UNIX Specification, Version 2", a usklaeni sistemi se nazivaju "UNIX 98". U ovoj specifikaciji ukljueno je procesovanje u realnom vremenu, tredovi i 64-bitni (i vie) procesori. Specifikacija je besplatna i moe se dobiti preko web-a ( www.opengroup.org ).
    2001. godine objavljena je i trea verzija specifikacije "Version 3 of the Single UNIX Specification".
    Ovako je najpopularniji operativni sistem na svetu proao teak put definisanja i standardizovanja. 
---------------------------
- DALJI RAZVOJ BSD-A -
---------------------------
    Kako je Berkeley doputao distribuciju svojih Net/1 i Net/2 traka pojavili su se mnogi operativni sistemi zasnovani na ovim distribucijama. Jedan od njih je i 386BSD iji je razvoj poeo kada je 1991. godine William Jolitz poeo sa portovanjem Net/2 (4.3BSD-Lite) trake na 386 raunare. Meutim, on nije bio u stanju da isprati sve popravke bug-ova i sve promene koje su vrene, tako da 1993. godine on prestaje sa razvojem. Programeri koji su sa njim radili podelili su se u 2 grupe koje su nastavile zapoeti posao. Takoe, 1992. godine je osnovana i firma BSDi koja je predstavila svoj komercijalni BSD/OS sistem. Na ovaj nain je nastavljen razvoj koji je zapoeo CSRG.
-------------
- FreeBSD -
-------------
    Poetkom 1993. godine Jordan K. Hubbard, Rod Grimes i Nate Williams su pokrenuli projekat iji je cilj bio reavanje problema koji su postojali u principima razvoja Jolitzovog 386BSD-a. Posle konsultovanja sa tadanjim korisnicima sistema, uspostavljeni su principi i smiljeno je ime - FreeBSD. Pre nego to je konkretan razvoj i poeo, Jordan Hubbard je predloio je firmi Walnut Creek CDROM da pripreme distribuiranje FreeBSD-a na CD-ROM-ovima. Walnut Creek CDROM su prihvatili ideju, ali i obezbedili (tada potpuno nepoznatom) projektu mainu na kojoj e biti razvijan i brzu Internet konekciju. Bez ove pomoi teko da bi FreeBSD bio razvijen u ovolikoj meri i ovolikom brzinom kao to jeste. 
    Prva distribucija FreeBSD-a na CD-ROM-ovima (i naravno na netu) bila je FreeBSD 1.0, objavljena u decembru 1993. godine. Bila je zasnovana na Berkeley-evoj 4.3BSD-Lite ("Net/2") traci, a naravno sadrala je i komponente 386BSD-a i mnoge programe Free Software Foundation (fondacija besplatnog-slobodnog softvera). 
    Nakon to je Novell otkupio UNIX od AT&T-a, Berkeley je morao da prizna da Net/2 traka sadri velike delove UNIX koda. Posle sudskog spora, dogovoreno je da Berkeley pripremi 4.4BSD-Lite distribuciju iz koje e biti izbaeni pojedini delovi koda. Od tada su BSD i UNIX, kontradiktorno, dve razliite stvari. Svi korisnici Net/2 traka bili su prinueni da preu na 4.4BSD-Lite. Ovo je ukljuivalo i FreeBSD, tako da je pred projektom bio zadatak da dovri sistem bazirajui se na novoj i nepotpunoj 4.4BSD-Lite distribuciji. Veliki delovi sistema su ponovo isprogramirani tako da je u novembru 1994. godine objavljena FreeBSD 2.0 distribucija koja je napokon mogla legalno da se distribuira preko neta i CDROM-ovima.
    Tekua -stable grana projekta je 4.x-stable. 4.5-RELASE je objavljen u januaru 2002. godine, a sledee izdanje FreeBSD 4.6 zakazano je za 1. jun. 2002. 
    Krajem 2002. godine FreeBSD-CURRENT e biti objavljen kao FreeBSD 5.0-RELASE. 
------------
- NetBSD -
------------
    NetBSD je takoe nastao sa ciljem da pobolja mehanizam razvoja 386BSD-a. Ljudi iz firme Virginia Tech uzeli su za osnovu 386BSD i Net/2 traku i poeli su sa portovanjem BSD-a na raunare Macintosh. Razvoj se ubrzo proirio i na Atari ST, Amiga, i PC platforme. 
    Kako se projekat razvijao, postalo je oigledno da e FreeBSD biti namenjen za i386, a NetBSD za sve ostale platforme. Ime je dobio zato to je do 1998 godine rad na njemu bio vezan iskljuivo za Net, a komunikacija meu developer-ima je bila bazirana na chat-u i mail-u.
    Danas snaga NetBSD-a lei u podrci za ak 51 hardversku platformu. NetBSD je postao stabilni, multiplatformski, istraivaki orijentisan operativni sistem. Posveenost ka portabilnosti uticala je na druge operativne sisteme da i oni pruaju podrku za vie platformi. Nekoliko operativnih sistema (OpenBSD, KAME, Darwin, MacOS X) izvedeno je direktno iz NetBSD-a. 
--------------
- OpenBSD -
--------------
   OpenBSD projekat je 1996. zapoeo Theo De Raadt, jedan od glavnih programera projekta NetBSD. Umesto velike portabilnosti, OpenBSD se orijentisao ka sigurnosti. OpenBSD je operativni sistem sa izrazito jakim security-em, kao i sa kriptografijom (Blowfish, OpenSSH, PRNG, OpenSSL...) integrisanom u sam sistem. Takoe, programeri OpenBSD-ja su od 1996. godine poeli sa detaljnim pregledom koda kernela u potrazi za potencijalnim bug-ovima i exploit-ima, to je rezultiralo ispravljanju mnogih greaka u kodu pre nego to su one i bile primeene u drugim sistemima. 
   OpenBSD je svakako najimpresivniji operativni sistem dananjice sa aspekta security-a.
   
###########
## DIZAJN ##
###########
-----------------
- O FreeBSD-u -
-----------------
   FreeBSD je istaknuti operativni sistem za arhitekture raunara koje su kompatibilne sa Intel x86, DEC Alpha i PC-98 arhitekturama (druge platforme su u planu razvoja).
   Cilj projekta je da se razvije softver koji e moi da se koristi u svaku svrhu.
   FreeBSD je kompletan operativni sistem - kernel, C biblioteke i kompajler, mreni serveri i klijenti, X-Windows sistem, mnogi programi - sve to je potrebno za svakodnevni rad na kompjuteru. Izvorni kod celog sistema je dostupan i moe se skinuti sa neta (ftp://ftp.FreeBSD.org/pub/FreeBSD/). 
   FreeBSD prua napredne mrene servise, dobru iskoristivost memorije, visoku stabilnost i performanse rada, tako da predstavlja ekonominu alternativu komercijalnim UNIX sistemima. Prilagoen je radu sa velikim brojem desktop i server aplikacija. Pored dobrog security-a, odlikuje se i fantastinim performansama, kao i najboljom implementacijom TCP/IP stack-a to ga ini jednim od omiljenih izbora za web servere. U principu, FreeBSD je najpopularnija BSD distribucija. 
   Free u imenu znai da se moe koristiti besplatno, ak i za komercijalne upotrebe, ali takoe i u smislu slobodno. Sa izvornim kodom FreeBSD-a korisnik moe da radi bilo ta: da ga ita, menja, prepravlja, kopira, prodaje... doslovno sve osim da tvrdi da ga je on napisao.
   FreeBSD ima mnogo osobina vrednih panje:
   - 32-bitni operativni sistem (64-bitni na Alpha-ma) koji je od poetka dizajniran kao takav.
   - preemptivni multitasking sa dinaminim podeavanjima prioriteta koji obezbeuje fer i glatku podelu procesorskog vremena, memorije i drugih resursa raunara ak i pri najveim optereenjima sistema
   - mogunost da opsluuje vie korisnika u isto vreme tako to svi korisnici mogu da koriste resurse raunara (tampae, mreu...), ali takoe i da ogranii njihovu upotrebu
   - SMP - podrka za maine sa vie procesora (samo za Intel)
   - stranienje na zahtev koje omoguava brzo izvravanje programa koji zahtevaju dosta memorije
   - zatita memorije koja obezbeuje da programi (ili korisnici) ne mogu omesti jedni druge; ako se jedan program srui, to nee uticati na ostale ni na koji nain
   - jak TCP/IP sa odlinom implementacijom TCP/IP stack-a, podrka za mnoge standarde kao to su SLIP, PPP, NFS, DHCP, NIS, serveri za e-mail, WWW, FTP, DNS, routing, firewall...
   - X Window System (X11R6) kojim se prua grafiki korisniki interfejs (GUI)
   - hiljade gotovih programa se nalaze u FreeBSD ports&packages kolekciji 
   - binarna kompatibilnost sa mnogim programima kompajliranim za Linux, SCO UNIX, SVR4, BSD/OS i NetBSD
   - kompatibilnost izvornog koda programa sa veinom popularnih komercijalnih UNIX sistemima, to omoguava jednostavno portovanje progama sa ovih sistema na FreeBSD.
   - kompletna zbirka razvojnih alata za mnoge programske jezike kao to su C, C++, Java, Fortran, Perl, Pascal (Delphi-Kylix)...
   - izvorni kod celokupnog sistema, od kernela, preko alatki, do igara i nain kompajliranja svega toga korienjem samo jedne komande
   - velika koliina veoma dobre dokumentacije
   
   FreeBSD svakodnevno koriste razne kompanije, Internet provajderi, istraivai, studenti, korisnici kod kue irom sveta. 
   Slogan "The Power to Serve" (snaga da slui) dobija pravo znaenje kada se vidi da FreeBSD koriste mnogi veliki sajtovi da opslue svoje korisnike, kao to su: Yahoo! (http://www.yahoo.com), Hotmail (http://www.hotmail.com), Apache (http://www.apache.org), Be, Inc. (http://www.be.com), BSDi (http://www.osd.bsdi.com) i mnogi drugi.
---------------------
- MODEL RAZVOJA -
---------------------
    FreeBSD se razvija tako da korisnicima sistema bude olakano unapreivanje sistema. Cilj je da se stvori stabilan operativni sistem i veliki broj dodatnih programa koje korisnici mogu lako da instaliraju, koriste, prijave greke i daju sugestije za poboljanje sistema i programa. 
    Da bi se ovo omoguilo, koristi se CVS (Concurrent Version System). To je alatka za kontrolisanje izvornog koda programa koja omoguuje korisnicima da u svakom trenutku dobiju doslovno svaku verziju FreeBSD-ja, od prvih razvojnih verzija, pa sve do jo neobjavljenih verzija koje se trenutno programiraju. 
    Committers (odbornici) su ljudi koji imaju pravo da prepravljaju CVS drvo. Oni koji pripadaju ovoj grupi su autorizovani da prave modifikacije izvornog koda FreeBSD-ja. Naziv committer su dobili po komandi cvs-a commit, kojom prepravljaju CVS drvo.  
    Za dobro stanje projekta u celini i za planiranje daljeg razvoja odgovoran je FreeBSD core tim. Oni daju commiters-ima pravo da prepravljaju CVS drvo i pozivaju posveene i odgovorne programere da se pridrue projektu. Obino su odgovorni za razvijanje nekog veeg dela sistema. Biraju se svake 2 godine na izborima na kojima pravo glasanja imaju svi committer-si.
    lanovi core i committers timova su volonteri kada je u pitanju razvoj FreeBSD-ja i nemaju nikakve finansijske koristi od projekta, pa bi bilo pogreno smatrati da su oni obavezni da pruaju tehniku podrku. Za to su zaduene komercijalne firme koje zarauju distribuiranjem FreeBSD-ja na diskovima, izdavanjem knjiga i pruanjem tehnike podrke.
    Takoe, veliki udeo u razvoju FreeBSD-a imaju i sami korisnici koji alju svoje sugestije i predloge, prijavljuju greke i alju ispravke, dopunjuju i prevode dokumentaciju. Ovakvih ljudi je uvek bilo i uvek e biti mnogo, pogotovo kada je u pitanju FreeBSD projekat.
------------
- RAZVOJ -
------------
    Postoje dve glavne grane razvoja FreeBSD-a: -CURRENT i -STABLE.
    FreeBSD-CURRENT je, bukvalno, nita vie nego dnevni prikaz radnih kopija izvornog koda FreeBSD-a. Nabavljanjem FreeBSD-CURRENT preko CVS-a, korisnici mogu da vide na kom problemu trenutno rade programeri FreeBSD-a. Ovo je naroito potrebno lanovima razvojne grupe FreeBSD-a, bilo da programiraju bilo da testiraju nove funkcije koje su dodate sistemu. FreeBSD-CURRENT nije nain za dobijanje novih programa pre zvaninog izdavanja, jer su to jo neistestirane, nekompatibilne i bagovite verzije.
    FreeBSD-STABLE je aktivna verzija FreeBSD-a koja je proglaena stabilnom i za koju se smatra da je ispravljena veina greaka koje su se pojavile. Ove verzije koriste korisnici kojima je stabilnost celokupnog sistema vanija od nekih novijih mogunosti.
    FreeBSD-SNAP je binarna verzija -current, a FreeBSD-RELASE -stable izdanja.
--------------
- Instalacija -
--------------
    FreeBSD se moe instalirati sa CDROM-a, flopija, MS-DOS particije ili preko mree (NFS ili FTP). Instalacija se smatra jednom od najlakih UNIX instalacija koje postoje. U idealnom sluaju treba boot-ovati mainu sa CD-a (ako maina to ne dozvoljava onda sa flopija), FreeBSD e prepoznati hardver i putem Kernel Configuration dijaloga e dati mogunost njegovog podeavanja, zatim sledi particionisanje hard-diska i alociranje prostora, biranje distribucija koje e se instalirati i samo kopiranje fajlova. Prilikom sledeeg boot-ovanja kompjutera korisniku su dostupne sve mogunosti FreeBSD-a.
    FreeBSD-u je potrebna jedna primarna particija (koja se u FreeBSD terminologiji naziva slice) unutar koje e disklabel program napraviti particije fajl sistema.
    FreeBSD nije zavistan od "logical BIOS drive mapping" kao drugi operativni sistemi ve naziva diskove redom kako ih pronalazi. Fiziki diskovi mogu biti IDE, SCSI, RAID Flash i dr. FreeBSD naziva ove ureaje na sledei nain:
    - IDE hard drives	        ad
    - IDE CDROM drives     acd
    - SCSI hard drives       da
    - SCSI CDROM drives    cd
    - Ne-standardni CDROM drives mcd for Mitsumi CD-ROM
                                         scd for Sony CD-ROM
                                         matcd for Matsushita/Panasonic CD-ROM
    - Floppy drives       fd
    - SCSI tape drives   sa
    - IDE tape drives	    ast
    - Flash drives	        fla
    - RAID drives         myxd for Mylex
                             amrd for AMI MegaRAID
                             idad for Compaq Smart RAID
    Ako na maini ima vie ureaja istog tipa onda se iza njihovog imena stavlja redni broj (npr. prvi atapi IDE cdrom je acd0). Drive-ovi su podeljeni na slice-ove (particije u drugim sistemima). Slice-ovi se oznaavaju slovom s i rednim brojem, (npr. s1 je prvi slice na disku). Svaki slice je podeljen na particije koje dobijaju oznaku od a do h. Obino je slovo b rezervisano za swap particiju, a slovom c se oznaava celo slice. Ovakvim nazivanjem /usr particija na drugom slice-u prvog IDE hard diska bi dobila oznaku ad0s2e.
--------------------
- Ports&Packages -
--------------------
    U FreeBSD-u korisnici imaju na raspolaganju dva naina za instaliranje novih programa: portovi i paketi. Kolekcija portova i paketa se sastoji od preko 6000 programa i mogu se nai na netu ili na CDROM-ovima. Ove kolekcije pored toga to pruaju veliki broj programa, znatno pojednostavljuju intstaliranje. Ideja je da korisnici ne moraju da trae programe "negde na netu", ve da se stvori centralna kolekcija programa i mehanizam kojim bi se ti programi, koristei samo jednu komandu, skinuli sa neta (ili snimili sa CDROM-a), raspakovali, zakrpili, kompajlirali i instalirali.
    Kolekcija portova se moe snimiti prilikom instaliranja sistema. Port nekog programa se sastoji iz makefile-a (skript kojim se program instalira), distinfo fajla koji sadri informacije o fajlovima koji se moraju download-ovati da bi se sagradio port, checksum-ove tih fajlova kako bi se proverio njihov integritet, i zakrpe (patch) koja sadri informacije o promenama koje treba izvriti kod odreenih fajlova (zbog ispravljanja bug-ova programa i sl.). Instaliranje programa iz kolekcije portova se obavlja komandom make install. Deinstaliranje se vri komandom make deinstall. 
    Kolekcija paketa predstavlja nain snimanja binarnih verzija programa. Paket je kompresovani .tgz fajl. Da bi se instalirao jedan program iz kolekcije paketa sve to treba uraditi je skinuti odgovarajui .tgz fajl sa adrese: 
    ftp:// ftp.FreeBSD.org/pub/FreeBSD/ports/packages/
    i pokrenuti komandu pkg_add(1). Deinstaliranje je komandom pkg_delete(1). Na CDROM-ovima se paketi nalaze u /packages direktorijumu.
----------
- Kernel -
----------
    Kernel je deo sistema koji se izvrava u zatienom (protected) modu hardvera i koji posreduje izmeu korisnikih programa i hardvera. Kernel prua osnovne funkcije sistema; on kreira, izvrava i upravlja procesima, prua pristup fajl sistemu i mrenim protokolima i dr. Ove funkcije se nazivaju sistemski pozivi (system calls) i korisniku su dostupne kroz biblioteku rutina koje moe pozivati iz svojih programa. Sistemski pozivi su jedini nain na koji procesi mogu da pristupe ovim servisima.
    Govorei tradicionalnom terminologijom operativnih sistema, kernel je malo jezgro softvera koje prua minimalne servise koji su neophodni za implementiranje dodatnih servisa operativnog sistema. U savremenim istraivakim operativnim sistemima kao to su Chorus, Mach, Tunis i V Kernel, servisi kao to su fajl sistemi, mreni protokoli i dr.  potpuno su izdvojeni iz kernela. No, UNIX kernel je od samog poetka bio monolitni, tj. nije bio podeljen u vie procesa. Ovakva struktura kernela je odabrana zbog jednostavnosti i performansi. 
    Najvei deo kernela implementira sistemske servise kojima aplikacije pristupaju kroz sistemske pozive. U 4.4BSD (pa tako i u FreeBSD) on obuhvata:
    - osnovne servise kernela: manipulisanje tajmerom i sistemskim satovima, deskriptorima i procesima
    - upravljanje memorijom: stranienje (paging) i zamena stranica (swapping)
    - opti sistemski interfejsi: I/O, kontrola deskriptora
    - fajl sistem: upravljanje fajlovima, direktorijumima, prevoenje putanja fajlova
    - manipulisanje terminalima: interfejs terminala i linijske discipline za procesovanje karaktera
    - meu-procesna komunikacija: pipe i socket
    - mrena komunikacija: komunikacioni protokoli, routing
    Veina ovih servisa su nezavisni od maine i mogu se portovati na druge arhitekture. Delovi kernela koji su zavisni od konkretne maine su izolovani od ovih delova. To su:
    - startovanje sistema
    - manipulisanje zamkama (trap handling) i grekama (fault handling)
    - manipulisanje radnog konteksta procesa (run-time context)
    - konfigurisanje i inicijalizovanje hadrverskih ureaja
    - radna podrka za ulazno/izlazne (I/O) ureaje
    
    Granica izmeu programa koji se izvravaju u kernel-modu i korisnikom modu se ostvaruje pomou hardverske podrke ovim servisima. Kernel se izvrava u adresnom prostoru koji je nedostupan korisnikim programima. Privilegovane operacije, kao to su pokretanje ulazno/izlazne operacije ili upravljanje procesorom (CPU) dostupne su samo kernelu. Sistemske pozive koriste korisniki programi (aplikacije) kako bi pristupili ovim operacijama. Sistemski poziv se izvrava sinhronizovano sa aplikacijom koja ga je pozvala; program se ne izvrava dok kernel izvrava akciju koju mu nalaze sistemski poziv. Ukoliko izvravanje sistemskog pozva traje dugo (npr. upisivanje podataka na disk), izvravanje aplikacije se moe nastaviti i pre nego to se sistemski poziv zavri (podaci e biti snimljeni u bafer, pa kasnije snimljeni na disk).
    Postoje tri vrste ulaza u kernel: hardverski interapt, hardverska zamka (trap) i softverska zamka (softwer-initiated trap). Hardverske interapte stvaraju spoljni dogaaji, kao to je ulazno/izlazni ureaj ili sat koji prijavljuje prolazak vremena. Hardverski interapti se javljaju asinhronizovano i nisu vezani za proces koji se trenutno izvrava. Za manipulisanje hardverskim interaptom odgovoran je odgovarajui device-driver interupt handler u kernelu.
    Hardverska zamka je vezana za proces koji se trenutno izvrava i moe biti ili sinhronizovana ili asinhronizovana. Javljaju se usled neke greke kao npr. deljenje nulom. Proces sazna za greku ili tako to primi signal, ili tako to bude ugaen.
    Softverske zamke se koriste da zakau to skorije izvravanje nekih dogaaja (mrena komunikacija, vremensko planiranje izvravanja...) i javljaju se sinhronizovano. Za softverske i hardverske zamke odgovoran je deo kernela pod imenom trap handler.
    Sistemski pozivi su specijalni sluaj softverske zamke i za njih je odgovoran deo kernela pod imenom syscall handler. Nakon izvravanja sistemskog poziva programu se alje informacija o tome da li je sistemski poziv uspeno izvren i identifikator greke ukoliko se javila, posle ega kernel odluuje koji proces e nastaviti da izvrava.
    Svaka aplikacija ima svoj sopstveni adresni prostor koji se razlikuje od adresnog prostora kernela. Kernel odreuje koje e procese kada da izvrava, prekine sa izvravanjem ili suspenduje radi izvravanja drugog procesa.
-----------
- Procesi -
-----------
    Proces je program koji je trenutno u izvravanju. Svaki proces zauzima odreene sistemske resurse, kao to su memorija i procesorsko vreme. Kernel prua korisnicima iluziju konkurentnog izvravanja vie procesa u isto vreme rasporeivanjem tih resursa meu procesima koji su spremni za izvravanje.
    Proces se izvrava ili u korisnikom, ili u kernel-modu. U korisnikom modu instrukcije se izvravaju u neprivilegovanom modu hardvera. Kada proces zatrai od kernela da izvri neki sistemski poziv, instrukcije se vre u privilegovanom, ali kernelom ogranienom i kontrolisanom modu. Ovako su aplikacije odvojene od hardvera.
    Kernel razlikuje procese prema njihovom proces identifier (PID) broju. Korisnici mogu kreirati procese, kontrolisati izvravanje procesa i primiti obavetenje kada se status izvravanja procesa promeni.
    Procesi mogu stvoriti nove pozivanjem sistemskog poziva fork. Njime se stvara istovetna kopija procesa; dobiju se dva ista programa i sa istim promenljivama i istim vrednostima. Oba procesa (roditelj i dete) nastavljaju sa izvravanjem instrukcije koja sledi posle pozivanja fork-a, s tim to postoji jedna razlika: detetu fork vraa vrednost nula, a roditelju vraa vrednost PID-a deteta (koja je razliita od nule).
    Obino posle pozivanja fork-a jedan od ova dva procesa poziva sistemski poziv execve, kojim se vri prepisivanje postojee memorijske slike procesa novom, koja se ita iz binarnog fajla, posle ega poinje izvravanje novog programa. 
    Proces moe da zavri svoje izvravanje pozivanjem sistemskog poziva exit. Ako je njegov roditelj pozvao sistemski poziv wait, PID deteta se signalom alje roditelju tako da on moe da zna koje dete je zavrilo sa izvravanjem. Ako se dete-proces srui, sistem simulira exit sistemski poziv i obavetava roditelja. Prilikom izlaenja, dete-proces postaje zombi proces, koji se ne izvava, ali postoji u memoriji, kako bi roditelj mogao, koristei wait4 sistemski poziv, da dobije vie informacija o detetovom izvravanju. 
    - Multiprogramiranje predstavlja iluziju paralelnog izvravanja vie procesa ili programa. Kernel to omoguava pomou smenjivanja konteksta procesa (context switching). Kontekst procesa obuhvata sve informacije koje kernel koristi za izvravanje procesa (PID, prioritet, stanje izvravanja, data, stack i text segmente, stanje signala, akcije na signale, tajmere, deskriptore...). Kernel odluuje koji e proces sledei da izvrava - ovo se naziva scheduling - vremensko planiranje. 
    - Scheduling - Zadatak kernela je da isplanira i zakae izvravanje procesa tako da svi procesi mogu da zauzmu podjednako resursa. Programi se ocenjuju prema koliini raunanja i koliini I/O koje izvravaju i na osnovu toga im se odreuje prioritet. On se u FreeBSD-u izraunava svake sekunde, na osnovu koliine raunanja u prethodnom periodu, koliine memorije koju zauzima, ukupne zauzetosti resursa sistema i vrednosti nice koju ima svaki proces i koja oznaava poeljni prioritet. Svi procesi naizmenino dobijaju odreen vremenski period izvravanja. U FreeBSD-u ovaj period je 0,1 sekunda, posle ega kernel prelazi na izvravanje procesa sa najviim prioritetom.
    Procesi koji ekaju da se I/O operacija zavri imaju vei prioritet izvravanja, jer se izvravaju u kernel-modu. Nasuprot tome, procesima koji zahtevaju dosta raunanja (procesorskog vremena) prioritet se smanjuje, kako ne bi zauzeli kompletan procesor i zaustavili izvravanje ostalih procesa. Na ovaj nain 4.4BSD kernel daje prednost interaktivnim programima (kakvi su npr. tekst editori) nad dugotrajnim batch-type procesima koji zahtevaju dosta procesorskog vremena i koji zaguuju sistem.
    Ograniavanje resursa - Kernel podrava ograniavanje koliine resursa koji su dostupni pojedinanim procesima. Ova ogranienja mogu biti: maksimalno CPU vreme koje proces moe da zauzme, koliina memorije koju moe da alocira, veliina i broj fajlova koje proces moe da kreira, broj simultanih procesa koje korisnik moe da pokrene i dr.
    Za svako ogranienje postoje soft (mekani) i hard (vrsti) limit. Kada proces pree soft limit, stie mu signal koji obino rezultira prekidanjem izvravanja procesa, ali proces moe i da ignorie ovaj signal i pokua da oslobodi resurse. Ukoliko to ne uradi sledei pokuaj alociranja jo resursa nee uspeti. 
    Hard limit se ne moe prekoraiti. Svi korisnici mogu svojim procesima da smanje hard limit, a jedino superuser moe da ga povea.
    Sistemski procesi - Svi procesi u 4.4BSD-u (i naravno FreeBSD-u) potiu od jednog procesa kojeg startuje kernel. Prilikom startovanja sistema kreiraju se tri procesa i oni uvek postoje i izvravaju se. Procesi swapper i pagedaemon su procesi koji se izvravaju u kernel modu. Swapper (PID 0) je odgovoran za vremensko planiranje premetanja procesa iz RAM memorije u sekundarni memorijski prostor (swap) ukoliko sistem ima manjak memorije. Pagedaemon (PID 2) je odgovoran za ispisivanje delova adresnog prostora procesa na swap. Init (PID 1) je proces koji se izvrava u korisnikom modu, van kernela i koji je odgovoran za administrativne zadatke, kao to je pokretanje drugih procesa (po jedan getty proces za svaki terminal maine) zatvaranje procesa prilikom gaenja sistema (ulaskom u beskonanu petlju ili restartovanjem sistema).
    Identifikatori korisnika - Vana odgovornost operativnog sistema je da prui mehanizam za kontrolu i ogranienje pristupa privilegovanim operacijama kernela (npr. gaenje sistema ili slanje mail-a). U FreeBSD-u ovaj mehanizam se zasniva na razlikovanju korisnika i grupa korisnika sistema. Svaki korisnik ima jedinstveni user identifier (UID), 32-bitni broj koji mu je pripisao sistemski administrator. Korisnici su svrstani u grupe, koje se oznaavaju GID (group identifier) brojem. Jednom korisniku koji se naziva superuser dostupne su sve operacije kernela, dok su mnoge od njih nedostupne obinim korisnicima. 
    Svakom procesu su pripisani UID i GID korisnika koji ga je pokrenuo, tako da obini korisnici mogu samo svojim procesima da alju signale. Svaki fajl ima pristupne dozvole (access permissions) za vlasnika fajla, grupu korisnika kojoj pripada vlasnik i ostale korisnike. Ove dozvole ukljuuju itanje (read), prepravljanje (write) i izvravanje fajla (execute). Ovako se obezbeuje kontrola pristupa fajlovima.
    U UNIX sistemima postoje setuid i setgid programi koji omoguavaju da korisnik kontrolisano izvi neke operacije koje mu nisu dozvoljene. Ovakvi programi moraju biti veoma paljivo napisni kako ne bi dolo do zloupotreba privilegija.
    Signali - Sistem definie skup signala koji se mogu poslati procesu. Proces definie odreene akcije koje se izvravaju kada signal stigne. Neki signali ne mogu biti ignorisani, kao to su SIGSTOP i SIGKILL koji stopiraju i zatvaraju (ubijaju) proces.
    Grupe procesa i seni - Procesi su organizovani u grupe procesa. Prilikom pokretanja proces ulazi u grupu procesa u kojoj je i njegov roditeljski proces, a i sam moe napraviti novu grupu. Procesi unutar jedne grupe mogu meusobno slati signale, a signali se mogu poslati i celoj grupi, tako da svi procesi te grupe prime signal. Ovo se koristi npr. kada shell pokrene posao (job) kao to je pipeline (cevovod). Vie procesa se spajaju pajpovima (pipes), a signali se mogu slati svim procesima tog posla odjednom.
    Kao to vie povezanih procesa mogu da se skupe u grupu, tako i grupe mogu da se skupe u sene (sessions). Seni se koriste za stvaranje izolovanog okruenja za veliki broj daemon procesa i njegove dece. Na nivou sena je odreena kontrola pristupa terminalu samo procesima i grupama procesa koji pripadaju odreenom senu.
-------------------------------
- Manipulisanje memorijom -
-------------------------------
    Centralni deo operativnog sistema zauzima sistem za manipulisanje memorijom (memory management system). On je zaduen za kontrolisanje memorijskih resursa koji su dostupni maini. Primarna (glavna) memorija je RAM memorija raunara, a sekundarna je svaki drugi medijum za uvanje podataka (hard disk, cdrom...).
    Svaki program ima svoj privatni adresni prostor. On se sastoji iz data, text i stack segmenata. Data segment sadri inicijalizovane i neinicijalizovane podatke programa. Text segment sadri mainske instrukcije i dele ga svi procesi koji izvravaju taj fajl, dok su data i stack segmenti privatni za svaki proces. U stack segmentu se nalazi run-time stack programa i njega kernel automatski proiruje dok se program izvrava. Data segment moe biti proiren ili skupljen pozivanjem sistemskog poziva, dok veliina i sadraj text segmenta mogu jedino biti promenjeni prilikom pozivanja sistemskog poziva execve, kada se postojea memorijska slika prepisuje nekom drugom i stvara se novi proces.
    Prilikom zapoinjanja izvravanja nekog programa, kernel prvo uita text segment programa na poetak adresnog prostora. Posle toga kernel mapira inicijalizovane podatke data segmenta i nulira ostatak adresnog prostora (koji je veliine neinicijalizovanih podataka i stack-a). Iako to nuliranje nije neophodno (ak je i suvino jer usporava uitavanje programa) rani UNIX sistemi su to ostavili u naslee (mnogi programi raunaju na to da je poetna vrednost promenljive nula). 
    Kopiranje celog text segmenta i inicijalizovanih podataka u memoriju mnogo usporava proces inicijalizovanja programa. 4.4BSD ovo izbegava korienjem stranienja na zahtev (demand paging) koje obezbeuje da se program uitava u malim delovima - stranama prvi put kada one postanu potrebne. Adresni prostor se deli na strane jednakih veliina, a kernel vodi rauna o adresama strana koje su uitane. Kada program pokua da pristupi stranici koja nije uitana javi se page-fault trap u kernelu, page-fault trap handler uita dotinu stranicu i program nastavlja sa izvravanjem. Ovako se u memoriju uitavaju samo delovi programa koji se koriste.
    Usled primene multiprogramiranja neophodno je da operativni sistem efektivno deli memorijske resurse meu procesima. Ceo adresni prostor ne mora u svakom trenutku biti prisutan u primarnoj memoriji da bi se proces izvravao. Ukoliko su memorijski resursi sistema niski, kernel sprovodi neki od mehanizama oslobaanje resursa. Kernel moe izbaciti stranice koje nisu dugo bile upotrebljivane (paging), ili moe ceo kontekst procesa prebaciti u sekundarnu memoriju (swapping). Stranienje na zahtev i zamena stranica su transparentni za procese, ali procesi mogu pruiti sistemu informacije o buduim memorijskim zahtevima, radi poboljanja performansi.
    Dobra strana memory management-a je to to se omoguava da postoji vie procesa nego to moe da se smesti u primarnu memoriju, a loa je ta to se izvravanje procesa usporava. Sistem mora da se pobrine da minimizuje pojavu trashing-a. To je pojava kada sistem vie vremena troi da izvri zamenu stranica, nego to troi na korienje tih stranica. Sistem detektuje trashing tako to posmatra koliinu slobodne memorije. Ukoliko postoji mali broj slobodnih stranica, a veliki je broj zahteva za alociranje memorije, sistem blokira izvravanje odreenog broja procesa koji zauzimaju dosta resursa i prebacuje ih u sekundarnu memoriju. Kada zaguenje proe, blokirani procesi se vraaju u glavnu memoriju i nastavljaju sa izvravanjem.
----------------
- I/O System -
----------------
    Osnovni model UNIX-ovog ulazno/izlaznog sistema je sekvenca bajtova kojoj se moe pristupiti bilo nasumino (random access) bilo sekvencijalno (sequential acces). 
    Razliiti programi rade sa razliitim strukturama podataka, ali ih kernel ne razlikuje. Uobiajeno je da se tekstualni fajlovi posmatraju kao niz linija ASCII karaktera koje se zavravaju karakterom za novu liniju. to se tie kernela svi fajlovi predstavljaju ulazno/izlazni tok bajtova (I/O stream). 
    UNIX procesi koriste deskriptore za pristup I/O stream-u. Deskriptori su mali, neoznaeni celi brojevi koje vraaju open i socket sistemski pozivi. Deskriptori predstavljaju odgovarajue objekte koje kernel podrava.
    Sistemski poziv open se koristi za kreiranje novog, praznog fajla, ili za otvaranje postojeeg. Prenos podataka iz i u objekat kog deskriptor predstavlja obavlja se pomou read i write sistemskih poziva, a sistemski poziv close se koristi sa oslobaanje deskriptora.
    Objekti sa kojima kernel radi, a koje deskriptori mogu da predstavljaju su file, pipe, socket.
    Fajl je niz bajtova. On ima svoje ime i postoji dokle god postoji referenca na njega u fajl sistemu ili dok god neki proces ima otvoren deskriptor koji ga predstavlja. I/O ureajima se pristupa kao fajlovima.
    Pipe (cev) je takoe niz bajtova, ali se, za razliku od fajlova koristi kao ulazno/izlazni tok podataka u jednom smeru. Nema ime, tako da ne moe biti otvoren open sistemskim pozivom. Umesto njega koristi se sistemski poziv pipe. Kernel takoe podrava named pipe (FIFO - First In First Out) - pipe koji postoji u fajl sistemu. Kada dva procesa ele da komuniciraju oni otvore FIFO, jedan za itanje, jedan za pisanje.
    Socket je privremeni objekat koji se, kao i pipe koristi za meuprocesnu komunikaciju. On postoji samo dok postoji otvoren deskriptor kojim je predstavljen. U sutini socket je generalizovan dvosmerni pipe. Socket prua mogunost komunikacije izmeu dva procesa koji se izvravaju na razliitim mainama, ak i pod razliitim operativnim sistemima.
    
    Svakom procesu kernel prilikom startovanja obezbeuje tri deskriptora: standardni ulaz (0), standardni izlaz (1) i standardna greka (2). Obino ova tri deskriptora predstavljaju korisnikov terminal. Program prima podatke itajui standardni ulaz (tastaturu), a izlaz i greke ispisuje po ekranu. Ovi deskriptori mogu da predstavljaju i druge objekte osim tastature i ekrana, npr. fajlove. Ovo se zove I/O preusmeravanje. Pipe je nain preusmeravanja izlaza jednog programa u ulaz drugog. Ako jedan program preusmeri izlaz, a drugi ulaz na pipe dobija se pipeline (cevovod). 
    Svi hardverski ureaji su predstavljeni fajlovima i programi im mogu pristupiti koristei iste sistemske pozive kao i za obine fajlove. Terminalima, tampaima i drugim slinim ureajima pristupa se preko I/O toka. Hardverski ureaji se mogu podeliti na struktuirane i nestruktuirane. Nestruktuirani (character) ureaji obrauju znak po znak (komunikacione linije), a struktuirani (block) obradjuju vece grupe podataka od jednom, na primer, blokove od 512 bajtova (diskovi, magnetne trake, cdrom-ovi).
---------------
- Fajl sistem -
---------------
    Fajlovi mogu biti: obicni fajlovi, direktorijumi i specijalni fajlovi.
    Obini fajl je niz bajtova. Velicina fajla je jednaka ukupnom broju znakova koje fajl sadrzi. Fajlu se moe pristupiti (itati ili pisati) poev od bilo kog bajta. Podaci unutar fajla nemaju nikakvu strukturu osim one koju sam korisnik definie. U samom fajlu se ne nalaze nikakve informacije o tom fajlu, ve u fajl sistemu. 
    Fajl sistem uva sledee informacije o fajlovima: ime fajla, jedinstven broj fajla nazvan inode, velicinu u bajtovima, vreme kreiranja, vreme poslednje izmene, vreme poslednjeg pristupa, pristupne dozvole, vlasnika fajla i grupu kojoj pripada.
    Direktorijumi hijerarhijsku organizaciju celog fajl sistema. Direktorijum su obini fajlovi, ali poseduju strukturu. Direktorijum je lista imena fajlova i drugih direktorijuma koji se nalaze u njemu. Kernel ne dozvojava procesima da prepravljaju direktorijume. 
    Fajl sistem UNIX operativnog sistema je hijerarhijski struktuiran u vidu stabla. Na vrhu stabla je direktorijum koji se naziva korenom (root) i oznaava se kosom crtom (/). 
    Procesi identifikuju fajlove po njihovoj putanji i imenu. Putanja (put) je niz imena direktorijuma na ijem se kraju nalazi ime ciljnog direktorijuma ili fajla. Sva imena u putanji su razdvojena kosom crtom. Ako put poinje kosom crtom znai da je formirana od korena, to jest od root direktorijuma, i tada se naziva potpunim ili apsolutnim putem. Put se takoe moe kreirati relativno u odnosu na radni (working), ili tekui direktorijum i tada se on naziva relativnim. Ovo ime ne poinje kosom crtom. Svi direktorijumi i fajlovi, osim root direktorijuma, imaju neposrednog prethodnika (parent direktorijum) koji je oznaen sa "..", dok je radni direktorijum oznaen sa ".".
    Iako postoji vie ureaja i fajl sistema, svi su smeteni pod root fajl sistemom. Root fajl sistem je uvek prisutan, dok se fajl sistemi sa drugih ureaja (diskova, cdrom-ova) montiraju pod neki direktorijum na root fajl sistemu. Montiranje se obavlja eksplicitno, bilo pri startovanju sistema, bilo na korisnikov zahtev. FreeBSD prua korisnicima jednu olakicu to se ovoga tie - fajl sistem se moe montirati dinamiki svaki put kada mu korisnik pristupi.
    Sistemski poziv link stvara jo jedno ime kojim se jednom fajlu moe pristupiti. Fajl se moe ukloniti sistemskim pozivom unlink. Fajl e biti izbrisan kada se ukloni i poslednje ime kojim se on moe pristupiti i kada se zatvori poslednji deskriptor koji je neki proces koristio za pristupanje fajlu.
    Tipian fajl sistem FreeBSD-a izgleda ovako:
bin/		- programi
boot/		- konfiguracioni fajlovi boot-manager-a
cdrom/	- direktorijum pod kojim se montira cdrom
compat/	- biblioteke koje omoguuju izvravanje linux programa
dev/		- direktorijum u kom se nalaze specijalni fajlovi koji predstavljaju ureaje
etc/		- konfiguracioni fajlovi sistema
fat/			- direktorijum pod kojim se montira ms-dos particija
home/		- direktorijumi korisnika
mnt/		- za montiranje ostalih fajl sistema (floppy)
modules/	- moduli koji se mogu dinamiki uitati u kernel
proc/		- virtualni fajl sistem koji prikazuje stanje procesa
root/		- superuser-ov home direktorijum
sbin/		- sistemski programi
stand/		- instalaciona alatka (sysinstal)
sys/		- izvorni kod kernela i programa
tmp/		- privremeni fajlovi
usr/		- korisniki programi, kolekcija portova
var/		- razne informacije (o instaliranim portovima, logovi ...)
kernel*	- kernel binarni fajl

    Direktorijum usr sadri sve korisnike programe, kolekciju portova, izvorni kod sistema i programa i dr:
X11R6/	home/		libexec/	sbin/
bin/		include/	local/		share/
compat/	lib/			obj/		src/
games/	libdata/	ports/		tmp/
------------------------
- Network fajl sistem -
------------------------
    NFS predstavlja standardni nain deljenja fajlova meu UNIX sistemima. Svrha NFS-a je da omogui korisnicima pristup fajl sistemu nekog drugog raunara tako to se on montira na lokalni fajl sistem. Lokalni korisnici ovako mogu da promene aktivni direktorijum u direktorijum na mrenom fajl sistemu, mogu da itaju, prepravljaju i izvravaju fajlove isto kao fajlove na lokalnom fajl sistemu.
    Kada lokalni klijent zatrai neku operaciju sa udaljenim fajl sistemom, zahtev se kompresuje (zbog performansi) i alje serveru. Server izvrava zatraenu operaciju ili prijavljuje greku i razlog odbijanja servisa. Zbog performansi klijent uva podatek o podacima kojima se esto pristupa.
    NFS protokol i implementaciju razvio je Sun Microsystems.
----------------------------
- Startovanje FreeBSD-a -
----------------------------
    Startovanje kompjutera se naziva bootstrap, ili skraeno boot.
    Na x86 hardvery Basic Input/Output System (BIOS) je odgovoran za pokretanje kompjutera. Na hard disku koji se boot-uje, BIOS pronalazi Master Boot Record (MBR). Ukoliko na raunaru postoji samo jedan operativni sistem, onda je standardni MBR sasvim dovoljan za pokretanje sistema. MBR e pronai prvi boot slice (butabilnu particiju) na disku i pokrenue kod koji uitava ostale delove operativnog sistema. Ukoliko je na raunaru instalirano vie sistema, onda e MBR morati da pita korisnika koji sistem da startuje. Ovakav MBR se naziva boot-manager. BootEasy je zvanini boot-manager FreeBSD-a. Nalazi se u MBR-u, ali i u /boot/boot0 fajlu. Za razliku od veine drugih boot-manager-a on njemu nije neophodno podesiti ta sve moe da boot-uje, ve e pri startovanju sam pronai sve sisteme koji mogu da se startuju. 
    Dalje uitavanje FreeBSD-a je zbog ogranienja koje postavlja PC hardver, podeljen u tri faze: boot1, boot2 i loader. 
    boot1 (/boot/boot1) je jednostavan program, poto moe da bude velik samo 512 bajtova. On moe da proita informacije o particijama FreeBSD-a i moe da pokrene boot2. 
    boot2 (/boot/boot2) moe da pristupi FreeBSD-ovom fajl sistemu i startuje loader (ili kernel direktno).
    loader (/boot/loader) vri uitavanje modula kernela zajedno sa kernelom. Pre startovanja kernela korisnik moe da pokrene komandni interpreter kojim bi podesio koje module da uita i koji kernel da startuje.
    Posle ove tri faze kernel se startuje i poinje sa ispitivanjem i inicijalizovanjem hardvera. Kada zavri sa tim, pokree se prvi korisniki proces /sbin/init. Ako je prilikom boot-ovanja prosleen odreen parametar, ili ukoliko init otkrije neispravnost fajl sistema, FreeBSD se startuje u Single-User modu radi otklanjanja greaka. Ukoliko nije, FreeBSD se startuje u Multi-User modu. Prvo se startuje shell, zatim se ita konfiguracioni fajl /etc/rc.conf, montiraju se fajl sistemi koji su podeeni u /etc/fstab fajlu, startuju se mreni servisi, sistemski daemoni. Posle toga init startuje po jedan /usr/libexec/getty program za svaki terminal sistema. On ita sa terminala korisniko ime, a zatim pokree /usr/bin/login program koji proverava ispravnost ifre i ako je ispravna pokree korisnikov shell.
---------------------------
- Kompajliranje kernela -
---------------------------
    Kompajliranje kernela je jedan od najznaajnijih stvari koje bi trebalo da se urade poto se FreeBSD instalira. Kernel koji se snima prilikom instalacije je GENERIC kernel, to znai da on mora da podrava veliki broj hardverskih komponenti. Kompaliranjem kernela dobija se kernel koji je optimizovan za konkretan sistem, ostvaruje se bre startovanje sistema (kernel inicijalizuje manji broj ureaja), manja zauzetost memorije (uitava se manje modula i kernel je manji), prua se podrka dodatnom hardveru koji nije dostupan u GENETIC kernelu).
    Da bi se kernel prekompajlirao treba imati izvorni kod kernela. On se nalazi u /usr/src/sys direktorijumu (ili /sys). Konfiguracioni fajl kernela se nalazi u /usr/src/sys/i386/conf. Posle podeavanja potrebnih stavki sledi kompajliranje i instaliranje.
    Ukoliko korisnik eli da unapredi verziju FreeBSD-a koju koristi, za to postoji odlian mehanizam. Sve to treba da uradi je da snimi najnoviji izvorni kod (ili unapredi postojei pomou CVS-a) i pokrene jednu komandu: make world. Ovim e ceo sistem biti prekompajliran. 
    
#######################
## KORISNIKI INTERFEJS ##
#######################
---------
- Shell -
---------
    Shell (ljuska) je omota, ljuska oko jezgra operativnog sistema, kernela. U UNIX sistemima se dosta posla obavlja iz komandne linije (command line). Korisniki i sistemski programi se (obino) pokreu komandnim interpreterom. U UNIX-u je shell korisniki proces iji je zadatak da prima komande od korisnika i da ih izvrava. 
    FreeBSD dolazi sa barem dva shell-a: bash i tcsh, a dosta drugih shell-ova se moe instalirati iz kolekcije portova. Evo kratkog opisa najeih shell-ova:

    sh - Bourne-Shell - jedan od prvih shell-ova koji su napisani. I danas se dosta koristi, pogotovo za pisanje skripti (za startovanje i gaenje sistema)
    csh - C-Shell - standardni shell Berkeley-evih distribucija, prvi shell sa istorijom komandi i sintaksom u stilu C-a. Napisao ga je Bil Joy. 
    ksh - Korn-Shell - standardni shell UNIX System V, prvi shell sa editovanjem komandne linije korienjem drugih programa (vi, emacs)
    bash - Boune-Again-Shell  - moderni naslednik sh-a, koristi se za skripte
    tcsh - T-C-Shell - moderni naslednik csh-a, lako prilagodljiv

    Shell je takoe i programski jezik visokog nivoa U njemu se mogu pisati skripte koje se mogu pokretati kao obine komande.
    Na svakom BSD sistemu se javljaju sh i csh. sh se koristi za sistemske skripte kao to je /etc/rc, a csh je zvanini shell koji koristi root. Korn-Shell se javlja jedino u System V UNIX sistemima.
    Komandni interfejs je dosta popularan u UNIX sistemima zbog lakoe obavljanja mnogih zadataka. Skripte omoguavaju automatizovanje tih zadataka.
    C shell FreeBSD sistema prua kontrolu poslova (job control) koja omoguava prebacivanje poslova iz prednjeg u zadnji plan, stopiranje i restartovanje poslova. Ovo je nalo primenu i u X-Windows-u, grafikom korisnikom interfejsu gde se svaki prozor smatra terminalom i moe postojati vie programa koji e biti u prvom planu.
---------------
- X Windows -
---------------
    X Window System je veliko i mono (neki kau preveliko i previe sloeno) grafiko okruenje UNIX sistema. Razvijen je na MIT-u, a komercijalni proizvoai su ga postavili kao standard na UNIX sistemima. Danas velika veina UNIX radnih stanica koristi neku varijantu X Windows-a
    Besplatni port MIT-ovog X Windows-a, verzije 11, izdanja 6 (X11R6) za x86 raunare koji rade pod UNIX sistemim se naziva XFree86 i moe se instalirati iz kolekcije portova FreeBSD-a. 
