You are on page 1of 45

Sisteme Operative

Çka është Sistemi Operativ?


Sistemi Operativ është pjesa ndërmjetsuese e përdoruesit dhe harduerit të kompjuterit, që i siguron
përdoruesit një mjedis në të cilin ai mund të ekzekutojë programe në mënyrë të përshtatshme dhe
efiçiente.
Një Sistem Operativ ngjan me qeverinë, nuk ka funksion të dobishëm në vetvete, por siguron ambientin
në të cilin programet e tjera kryejnë punë të dobishme.
Sistemi Operativ është një softuer që menaxhon haruerin e kompjuterit.
Sistemi Operativ është alokues i memories dhe program kontrolli që mundëson përdorimin efiçent të
harduerit dhe menaxhimin e ekzekutimit të programeve.
Për shkak se Sistemi Operativ është i madh dhe kompleks, duhet të krijohet pjesë për pjesë.
Sistemet Operative janë gjithandej: në makina, në pajisje shtëpiake duke përfshirë pajisjet IoT, në
smartphone, në personal computers, në enterprice computers, në cloud computing environments.

Çfarë bëjnë Sistemet Operative?


Kjo varet nga pikëpamja:
1)Përdoruesit – duan komoditet, pëdorim të lehtë dhe përformancë të mirë. Nuk interesohen
për shfrytëzimin e resurseve. Pajisjet mobile si smartphone-ët dhe tabletët kanë pak resurse të
optimizuar për përdorim dhe me bateri jetëgjata, përdoruesi i shfrytëzon përmes thouch screens dhe
voice recognition. Disa kompjutera kanë shumë pak ose fare user interface sikurse embedded
computers në pajisje shtëpiake apo automobila, sepse janë të dizajnuar për të punuar pa intervenimin e
përdoruesit.
2)Sistemi – bën alokumin e resurseve që të menaxhoj konfliktet e kërkesave për resurse dhe
funksionon si controll program duke menaxhuar ekzekutimin e programeve të përdoruesit për të
parandaluar erroret dhe përdorimin jo të duhur të kompjuterit, posaçërisht merret me kontrollin dhe
operimin e pajisijeve I/O. Shared computers sikurse mainframe dhe minicomputers duhet t’i kënaqin të
gjithë përdoruesit. Përdoruesit e dedicated systems sikurse workstations kanë resurse të dedikuara, por
shpesh përdorin shared resources nga serverët.
Definicioni i Sistemeve Operative
Nuk ekziston një definicion i përgjithshëm se çfarë është pjesë e Sistemit Operativ.
Kernel-i është programi i vetëm që ekzekutohet gjatë gjithë kohës në kompjuter dhe që është pjesë e
Sistemit Operativ. Gjithçka tjetër është ose:
1)system program – që është i lidhur me Sistemin Operativ por nuk është pjesë e kernel-it.
2)application program – të gjitha programet që nuk janë të lidhura me sistemin operativ.
Sistemet e sotme operative për general purposes dhe mobile computing poashtu përfshijnë edhe
middleware, një set i software frameworks që siguron shërbime shtesë për zhvilluesit e aplikacioneve si
databaza, multimedia, graphics.

Computer Startup
Computer startup është bootstrap program që përmban
instruksionet që pajisja ekzekuton në nxezje të sistemit apo në
restartim. Ruhet në ROM apo EPROM dhe njihet me emrin
firmware. Inicializon të gjitha aspektet e sistemit. Ngarkon
kernelin e sistemit operativ dhe fillon ekzekutimin.

Organizimi i Sistemit Kompjuterik


Një Sistem Kompjuterik mund të ketë një ose më shumë CPU, dhe një numër të device controllers të
lidhur përmes një bus-i që siguron çasje në shared memory. Secili device controller është përgjegjës për
një lloj specifik të pajisjeve (disc drive, audio device, graphic display). Duke u varur nga controlleri më
shumë së një pajisje mund të ketë çasje, psh. në një usb port mund të konektohet një usd hub tek i cili
mund të konektohen një numër i pajisjeve. Një device controller siguron local buffer storage dhe nje set
të special purpose registers dhe është përgjegjës për bartjen e të dhënave nga pajisjet periferike të cilat i
kontrollon n local buffer storage. Sistemet operative kanë devide driver për çdo device controller i cili i
siguron sistemit një uniform interface të pajisjes dhe ka mundësi ta menaxhoj atë. Pajisjet I/O (device
controllers) dhe CPU mund të ekzekutohen në mënyrë konkurente. CPU zhvendos të dhënat mes
memories kryesore dhe local buffers. Device controllers e lajmërojnë CPU-në që operimi i tyre ka
përfunduar duke dërguar interrupte.

𝑑𝑒𝑣𝑖𝑐𝑒 𝑐𝑜𝑛𝑡𝑟𝑜𝑙𝑙𝑒𝑟 𝑣𝑠 𝑑𝑒𝑣𝑖𝑐𝑒 𝑑𝑟𝑖𝑣𝑒𝑟


𝐻𝑎𝑟𝑑𝑤𝑎𝑟𝑒 | 𝑆𝑜𝑓𝑡𝑤𝑎𝑟𝑒
𝑃𝑗𝑒𝑠ë e sistemit kompjuterik që kupton | Program kompjuterik që operon apo konrollon
sinjalet që shkojnë\vijnë nga CPU. | një lloj specifik të pajisjes që kyçet në pc.
Konverton serial bit streams në block of | Punon si përkthyes në mes të pajisjes
bytes 𝑑ℎ𝑒 𝑗𝑒𝑝 𝑒𝑟𝑟𝑜𝑟 𝑐𝑜𝑟𝑟𝑒𝑐𝑡𝑖𝑜𝑛 𝑘𝑢𝑟 | ℎ𝑎𝑟𝑑𝑢𝑒𝑟𝑖𝑘𝑒 𝑑ℎ𝑒 𝑎𝑝𝑙𝑖𝑘𝑎𝑐𝑖𝑜𝑛𝑖𝑡 𝑎𝑝𝑜 𝑠𝑖𝑠𝑡𝑒𝑚𝑖𝑡
{ duhet. | 𝑜𝑝𝑒𝑟𝑎𝑡𝑖𝑣 𝑞ë e përdor atë. }
Funksionet e zakonshme të interrupteve
Interrupt-et janë pjesa kryesore se si sistemi operativ dhe hardueri komunikojnë. Pjesët harduerike
mund të krijojnë interrupte në cilindo moment duke dërguar sinjal në CPU. Hardueri i CPU ka një tel të
quajtur interrupt-request line përmes të cilit controller i dërgon sinjalet e interrupt-it. Kur CPU pranon
sinjalin e një interrupti (e lexon interrupt number), ndalon çfarëdo pune që është duke u kryer dhe kalon
punën në një fixed location që zakonisht përmban adresën fillestare ku është vendosur service routine-
ën për interrupt-in. Interrupti i jep kontrollin interrupt service routine-ës përmes interrupt vector (duke
përdorur interrupt number si indeks), i cili përmban adresat e të gjitha service routine-ave. Interrupt
architecture i ruan state infromations të çkado qoftë që është ndërprerë nga interrupti dhe kur interrupt
routine-a përfundon ka mundësi që gjithçka të vazhdojë aty ku ka mbetur. Një trap ose exception është
interrupt i gjeneruar nga softueri që shkaktohet nga një error apo user request. Një sistem operativ
është interrupt driven.
Storage Structure
Main memory
CPU mund t’i marre instruksionet vetem prej memories, prandaj çdo program duhet fillimisht të
ruhet në memorie për t’u ekzekutuar. General-purpose computers i ekzekutojnë shumicën e
programeve nga rewritable memory që quhet main memory (RAM). Main memory shpesh është
e implementuar në teknologjinë gjysmëpërquese të quajtur dynamic random access memory
(DRAM). RAM është volatile, e humb përmbajtjen kur ndalet kompjuteri. Për këtë shkak
bootstrap programi (firmware) nuk mund të ruhet në RAM, por duhet të ruhet në erasable
programmable read-only memory (EEPROM).
Secondary storage
Është extension i main memory që siguron kapacitet të madh të memories nonvolatile.
Secondary storage devices më të zakonshme janë hard-disc drive (HDD) dhe nonvolatile
memory (NVM) që sigurojnë hapësirë memorike edhe për programe edhe për të dhëna.
Hard Disc Drives(HDD) - janë pllaka metalike ose qelqi të ngurtë të mbuluara me
material regjistrues magnetik. Disk surface është e ndarë logjikisht në tracks të cilat më
pas janë të ndara në sektore. Disk controller përcakton ndërveprimin logjik në mes të
pajisjes dhe kompjuterit.
Non-volatile Memory – janë më të shpejta se hard dirqet. Po bëhen më të përdorura me
rritjen e kapacitetit dhe përformancës.

Storage systems organizohen në hierarki duke u bazuar në shpejtësi, kosto dhe volatility.
Caching – kopjimi i informatave në një sistsem memorik më të shpejtë, main memory mund të
konsiderohet si chach i secondary memory.

Direct Memory Access


Computer System Architecture
Një sistem kompjuterik mund të organizohet në shumë mënyra të ndryshme, të cilat mund të
kategorizohen në bazë të numrit të general-purpose processor që përdoren.

Single processor systems – janë sisteme që kanë vetëm një general-purpose CPU që përmban vetëm një
processing core. (Këto sisteme mund të kenë special-purpose processors.)
Multiprocessor systems – janë sisteme të cilat kanë dy e më shumë procesor, secili me një single-core
CPU. Procesorët ndajnë computer bus dhe në disa raste edhe clock-un,
memorien e pajisjet periferike. Në kompjuterët modern, nga pajisjet mobile
deri tek serverët, multiprocessor systems dominojnë fushën e komjuterikës.
Avantazhet kryesore të sistemeve multiprocesorike janë:
- Rritja e throughtput – me rritjen e numrit të procesorëve më shumë punë kryhet për kohë më
të shkurtër.
- Economy of scale –
- Increased reliability – fault tolerance

Sistemet multiprocesorike mund të jenë të dy llojeve:


Asymmetric Multiprocessing – secilit procesor i caktohet një task i veçantë.
Symmetric Multiprocessing – secili procesor i kryen të gjithë tasqet.

Definitions
CPU – hardueri që ekzekuton instruksione.
Processor – një chip fizik që përmban një ose më shumë CPU.
Core – basic computation unit e CPU-së.
Multicore – përfshirja e shumë computing cores në një CPU.
Multiprocessor – përfshirja e disa procesorëve.

A Dual-Core Design – disa cores në të njejtin processor chip.


Secili core ka register set dhe local cache të vetin.

Blade servers – janë sisteme në të cilat multiple processor


boards, I/O boards dhe networking boards janë të
vendosura në të njejtën chase.
Clustered Systems
Clustered Systems janë të njejta me sistemet multiprocesorike, mirëpo dallojnë sepse janë sikur disa
multicore sisteme të cilat punojnë së bashku. Ndajnë hapësirën memorike përmes Storage Area
Network (SAN). Në bazë të mënyrës sesi janë të strukturuar, clusters ndahen në:
Asymmetric clusters – ka një makinë në hot-standby mode, përderisa të tjerat duhe ekzekutuar
aplikacionet. Makina hot-standby nuk bën asgjë tjetër veçse e monitoron
serverin aktiv. Nëse serveri dështon, atëherë makina hot-standby bëhet
server aktiv.
Symmetric clusters – ka dy e më shumë hosta që ekzekutojnë aplikacionet dhe monitorojnë njëri
tjetrin.
Meqë clusters janë një numër i madh i sistemeve
komjuterike të lidhura në rrjet, ato mund të
përdoren për të siguruar high-performance
computing environments (greater computational
power). Aplikacionet duhet të shktuhen veçanërisht
për të shfrytëzuar avantazhet e clusters. Kjo
përfshin një teknikë të njohur si paralelizim, e cila e
ndan një program në komponente që ekzekutohen
paralelisht në core individuale të një kompjuteri
apo të kompjuterëve në cluster. Këto programe janë të dizajnuara ashtu që pasi secili computing node
në cluster të ketë zgjidhur pjesën e tij të problemit, rezultatet nga të gjitha nodes të kombinohen në një
zgjidhje finale.

Multiprogramming
Meqë një program i vetëm nuk mund t’i mbajë të zëna edhe CPU edhe I/O devices gjatë gjithë kohës,
sistemet operative kanë aftësi të ekzekutojnë multiple programs. Multipragramming e rrit shfrytëzimin e
CPU-së duke e kënaqur përdoruesin, duke i organizuar programet ashtu që CPU gjithmonë të ketë një
për të ekzekutuar. Në multiprogramming systems, një program që është duke u ekzekutuar quhet
proces. Sistemi operativ i mban në memorie disa jobs (code and data) njëkohësisht, dhe job scheduling
zgjedh një prej tyre dhe fillon ekzekutimin. Nëse job duhet të pres për ndonjë task tjetër (psh. I/O
operation), atëherë përgjatë asaj kohe sistemi operativ kalon në ekzekutimin e job-it tjetër.

Multitasking (timesharing)
Multitasking është ekzekutim logjik i multiprogramming. Në sistemet multitasking, CPU ekzekuton
multiple processes duke kaluar nga njëri në tjetrin më shpesh, duke i mundësuar përdoruesit response
time më të shpejtë (më e vogël se 1s). Metoda për ta mundësuar shpejtimin e response time është
virtual memory, një teknologji e cila mundëson ekzekutimin e një procesi jo krejtësisht në memorie. Çdo
përdorues e ruan në memorie më shumë se një proces, dhe zgjedhja e procesit bëhet nga CPU
scheduling.
Dual-Mode and Multimode operation
Për shkak se sistemi operativ dhe përdoruesit ndajnë të njejtat resurse harduerike dhe softuerike, duhet
të sigurohet që funksioni jokorrekt i një programi të përdoruesit të mos afektoj funksionin e tërë
sistemit operativ. Prandaj mund të ndahen dy mode: user mode dhe kernel mode (supervisor mode,
system mode, priviledged mode). Mode bit është biti i ofruar nga harduerit, i cili tregon modin aktual, 0
për kernel mode dhe 1 për user mode. Kur përmes një user applikacion thirret një system call, atëherë
kalohet nga user mode në kernel mode derisa kryhet system call dhe më pas kthehet në user mode
përsëri. Gjatë computer startup hardueri fillon në kernel mode, me fillon sistemi operativ dhe
ekzekutohet ndonjë user application kalon në user mode. CPU-të që e përkrahin virtualizimin kanë edhe
një mod të ndarë i cili tregon kur virtual machine manager e ka nën kontroll sistemin. Në këtë mod,
VMM ka më shume privilegje sesa një user e më pak sesa kernel-i.

Kalimi nga User Mode në Kernel Mode


Për tu siguruar që sistemi operativ ka kontroll
mbi CPU dhe programet nuk do të hyjnë në
infinite loop e të mos e kthejnë më kurrë
kontrollin tek sistemi operativ, përdoret timer-
i. Timer-i krijohet për të gjeneruar interrupt pas
një kohe të caktuar. Për çdo tick të physical
clock timer-i dekrementohet për 1 dhe kur e
arrin vlerën 0 gjeneron interrupt.

Resource management

Funksionet kryesore të sistemit operativ janë: memory management, processor management, device
management dhe file management.

Process Management –

Memory Management –

File-system Management –

Mass-storage Management-

Cache Management -

I/O Systems Management – I/O subsystem përbëhet nga disa komponente: memory management që
përfshin buffering (ruajtja momentale e të dhënave kur janë duke u
transferuar), caching (ruajtja e pjesëve të të dhënave në memorie të shpejtë
për performancë më të mirë) dhe spooling (mbivendosja e outputit të një
job-i si input i job-it tjetër); general device-driver interface; drivers për
pajisje harduerike specifike.

Protection dhe security


Kur një sistem operativ i ka disa përdorues dhe mundëson ekzekutimin konkurent të disa proceseve,
atëherë çasja në të dhëna duhet të rregullohet.
Protection – është mekanizëm për kontrollimin e çasjes së proceseve dhe përdoruesve në resurset e
përcaktuara nga sistemi komjuterik.
Security – është mbrojtja e sistemit nga internal ose external attacks. Këto attacks janë të një rangu të
gjerë duke përfshirë viruses dhe worms, DoS, identity theft, dhe theft of service (përdorim i
paautorizuar i sistemit).
Protection dhe security kërkon që sistemi të mund t’i dalloj të gjithë përdoruesit e tij, që të caktohet se
kush çfarë mund të bëjë. Kjo rregullohet përmes identifikimit me:
-User identities (user IDs, security IDs – unike për çdo user) që iu bashkangjitet emri i user-it.
User ID përcakton çasjen e përdoruesit në proceset dhe fajllat të cilët i takojnë.
-Group identities (group ID) lejon indentifikimin e disa users si pjesë e një grupi të caktuar dhe
mundëson menaxhimin e çasjes së tyre në procese e fajlla. Një user mund të jetë pjesë e më
shumë se një grupi të përdoruesve.
Privilege escalation – lejon përdoruesin që të kaloj nga ID e tij actuale në një effective ID për t’i dhënë
më shumë të drejta. (Psh. në UNIX, atributi setuid në një program bën që programi të ekzekutohet me
user ID të pronarit të atij fajlli, e jo me user ID aktuale.)

Virtualizimi
Virtualizimi është teknologji e cila na mundëson abstrahimin e harduerit të një kompjuteri të vetëm
(CPU, memory, disc drives, NIC,etc) në cila execution environments të ndryshme, duke krijuar
përshtypjen se secili environment është duke u ekzekutuar në kompjuterin e tij privat. Këto
encvironments mund të shihen si sisteme operative individuale (Windows, UNIX) që mund të
ekzekutohen në të njejtën kohë dhe të ndërveprojnë me njëra tjetrën. Virtualizimi i lejon sistemet
operative të ekzekutohen si aplikacione brenda një sistemi tjetër operativ. Përdoruesi i një virtual
machine mund të kaloj nga një sistem operativ në tjetrin njejtë sikurse mund të kaloj nga një proces në
tjetrin (kur proceset ekzekutohen në mënyrë konkurente) brenda të njejtit sistem operativ.
Me virtualizim një sistem operativ që është
natively compiled për një CPU ekzekutohet brenda
një sistemi tjetër operativ i cili poashtu është native
për atë CPU. Për menaxhim më të lehtë është
krijuar një virtualization technology në formë të një
aplikacioni i cili ekzekutohet në një sistem operativ
që quhet Virtual Machine Manager (VMM). VMM
mund të ekzekutoj disa guest sisteme operative,
menaxhon resurset që ato i shfrytëzojnë dhe mbron
secilin guest nga njëri tjetri.

Emulacioni
Emulacioni përfshin simulimin e harduerit të kompjuterit në softuer, përdoret kur source CPU type është
i ndryshëm nga target CPU type. (Psh. kur Apple ka kaluar nga IBM Power CPU në Intel x86 CPU për
desktop dhe laptop computers, ka përfshirë një aftësi emulimi të quajtur “Rosetta” që ka mundësuar
aplikacionet e dedikuara vetëm për IBM CPU të ekzekutohen edhe në Intel CPU.) Ky koncept lojon që një
sistem operativ i shkruar për një platform të ekzekutohet edhe në platformën tjetër. Emulation code
ekzekutohet më ngadalë se native code.
Distributed Systems
Një sistem i distriduar është koleksion i sistemeve kompjuterike (munësisht heterogjene) të ndara
fizikisht, që janë të lidhura në rrjet për t’i ofruar përdoruesit çasje në resurset e shumta që siguron
sistemi. Network është një rrugë komunikimi në mes të dy ao më shumë sistemve. Funksionimi i
sistemeve të distribuara varet nga networking. Protocolli më i përdorur i komunikimit në network është
TCP/IP, që siguron arkitekturën fundamentale të Internetit.
Llojet e networks karakterizohen në bazë të distancës në mes të nodes të networkut:
-Local Area Network (LAN)
-Wide Area Network (WAN)
-Metropolitan Area Network (MAN)
-Personal Area Network (PAN)
Network Operating System është një sistem operativ që siguron features sikur shprendarja e fajlleve në
network, së bashku me një skemë komunikimi që lejon proceset e ndryshme në kompjuterët e
ndryshëm që të shkëmbejnë mesazhe.
Computing Environments
Traditional Computing – Më herët një ambient i zyreve karakterizohej me PC të lidhura në rret me
serverët që ofronin file sharing dhe printing services dhe remote access ishte i
vështirë. Sot kompanitë krijojnë portals, të cilët sigurojnë web accessibilities
për internal servers të tyre. Network computers (thin clients) (që janë
terminale që kuptojnë web-based computing) përdoren në vend të traditional
workstations ku dëshirohet më shumë siguri e mirëmbajtje më e lehtë. Mobile
devices mund të konektohen në wireless networks dhe celullar data networks.
Mobile Computing – iu referohet smartphone-ve apo tabletëve. Përgjatë viteve janë shtuar shumë
features në smartphone dhe tablet (mobile devices) aq sa disa prej tyre nuk janë të
ofrueshme apo praktike në laptop. (Psh. global position system chips e lejojnë një
pajisje mobile të përdorë satelitët për të caktuar pozitën precize të tij të lokalizuar
në Tokë, akselerometri mundëson detektimin e orientimit apo dridhjes se mobile
devices gjë që shpesh integrohet në video games ku mungon mausi apo ekyboard
dhe përdoruesi ndërvepron me lojën përmes levizjes së pajisjes.) Për tu kyçur në
online servoces mobile devices përdorin wireless(IEEE standard 802.11) apo cellular
data networks. Dy sistemet aerative që momentalisht dominojnë në mobile
computing janë Apple iOS dhe Google Android.
Client-Server Computing – sisteme kompjuterike në të cilat sistemi server i plotëson kërkesat e sistemit
klient. Compute-Server System siguron një interface në të cilin klienti mund
të dërgojë kërkesa për të kryer veprime (psh. për të lexuar të dhëna). Si
përgjigje, serveri ekzekuton veprimin dhe i dërgon rezultatin klientit. File-
Server System siguron një file-system interface ku klientët mund të krijojnë,
ndryshojnë, lexojnë apo fshijnë fajlla. Shembull i një sistemi të tillë është web
serveri i cili dërgon fajlla tek klienti.
Peer-2-Peer Computing – në këtë sistem klienti dhe serveri nuk janë të dalluar nga njëri tjetri, prandaj të
gjitha nyjet mund të jenë në të njejtën kohë edhe klient edhe server. Një node
mund të bashkangjitet në peer-2-peer network duke regjistruar services të tij
me central lookup services në network apo duke broadcast një kërkesë për
service dhe duhe u përgjigjur në kërkesat për service përmes discovery
protocol. Skype është një shembull i peer-2-peer computing.
Cloud Computing – është lloj i computing i cili ofron computing, storage e madje edhe applications si
shërbime përmes network. Është logical extension e virtualizimit sepse përdor
virtualizimin si bazë të funksionimit të tij. Psh. Amazon EC2 ka qindra server, miliona
makina virtuale, petabytes of storage në disponueshëm në internet, dhe përdoruesit
të cilët shfrytëzojnë këto shërbime paguajn në bazë të resurseve që shfrytëzojnë.
Llojet e cloud computing janë:
Public Cloud – cloud i disponueshëm në internet për të gjithë ata që paguajnë për shërbimin.
Priavte Cloud – cloud i një kompanie të veçantë që shfrytëzohet për nevojat e kompanisë.
Hybrid Cloud – cloud që përfshin komponente të public dhe private cloud.
Software as a Service (SaaS) – një apo më shumë aplikacione të disponueshme në internet.
Platform as a Service (PaaS) – softeare stack i gatshëm për përdorim nga aplikacionet përmes
Internetit.
Infrastructure as a Service (IaaS) – server apo storage të disponueshëm përmes Internetit.
Real-Time Embedded Systems – këto pajisje gjinden gjithandej, nga motorret e makinës dhe robotët e
prodhimit deri te disqet optike dhe mikrovalat. Zakonisht kanë pak apo
fare interface, më shumë hargjojnë kohën duke monitoruar dhe
menaxhuar pajisjet harduerike, sikurse automotive engines dhe robotic
arms. Embedded systems ndryshojnë në mënyrë të komsiderueshme,
disa janë general-purpose computers me sisteme operative standarde
(sikur Linux) me special-purpose aplikacione që implementojnë
funksionalitetin, të tjerët janë pajisje harduerike me special-purpose
embedded operating systems që mundëson vetëm funksionalitetin e
kërkuar, ka edhe pajisje harduerike me application-specific integrated
circuits (ASICs) që kryejnë detyrat edhe pa pasur sistem operativ.
Përdorimi i embedded systems vazhdon të zgjerohet. Real-time system
ka kushtëzime kohore fikse mirë të definuara. Procesimi duhet të bëhet
brenda kushtëzimeve ose sistemi dështon. Real-time system funksionon
në mënyrën e duhur vetëm nëse kthen rezultatin e kërkuar brenda
kushtëzimit kohor.

Sistemi operativ Linux


Linux është versioni më i popullarizuar i sistemit operativ UNIX. Disa nga karakteristikat kryesore të Linux
janë se është Open source (kodi burimor i tij është publik), është portable (përkrah platforma të
ndryshme harduerike), Multi-user (shumë shfrytëzues mund të çasen në resurset e Linux në të njejtën
kohë), multiprogramming (aplikacione të shumëfishta mund të veprojnë në të njejtën kohë), ka
hierarchical file system (strukturë standarde të sistemit të fajllave), ka Shell (interpretues special i
komandave, që ekzekuton komandat), është i sigurt (mundëson siguri të shfrytëzimit përmes
autentifikimit, password, enkriptim, etj).
File separator është “/” e jo “\”. Ekstensioni i fajllave nuk ka ndonjë domethënie të veçantë.

Komponentet e sistemit operativ Linux janë:

System Utilities – për detyra (tasks) speciale.


System Library – janë programe/funksione për implementim
pa pasur nevojë për të drejtat nga kernel-i.
Kernel – zemra e sistemit operativ. Përgjegjës për të gjitha
aktivitetet e sistemit operativ.
Shtresat e arkitekturës së Linuxit janë:

Hardware layer – pajisjet harduerike (RAM, ,CPU,


HDD, etj).
Kernel – bërthama e Linux që ndërvepron me
harduerin.
Shell – fsheh kompleksitetin e funksioneve të
kernel-it nga shfrytëzuesi.
Utilities – funksionaliteti i sistemit.

Sistemi i fajllave në Linux


Në Linux nuk ka drive si C,D. Të gjitha direktoriumet janë nën “/”. Direktoriumi root është “/” dhe është
një i vetëm.

boot – boot loader configuration. Nëse fshihet boot sistemi nuk starton.
bin – programe esenciale, komandat për navigim në sistemin e fajllave dhe menaxhimin e fajlave.

dev – komponentet e harduerit si fajlla (hard disk, tastiera, etj).


etc – konfigurimi i sistemit, të gjithë fajllat konfigurues janë tekst fajlla, mund të editohen dhe
konfigurohen manualisht.
home – direktoriumi home i shfrytëzuesit, të gjithë fajllat e shfrytëzuesit janë këtu.
lib – direktoriumi në të cilin gjenden të gjitha libraritë kryesore.
proc – interface-i i kernel-it, konfigurimi i kernel-it, monitorimi i gjendjes së kernel-it.
root – është admin i sistemit.
sbin – programet për konfigurimin e sistemit, formatizimi i hard diskut, menaxhimi i harduerit.
tmp – direktoriumi temporary, të gjithë fajllat temp krijohen nga programet.
usr – programe të rëndësishme, kompajlleri, tools ,etj.
var – direktoriumi i variablave, të gjithë fajllat diamik, shfrytëzuesi nuk mund t;i ndryshoj këta fajlla.

Linux distribution: Ubuntu, Debian, CentOS, Fedora, Linux Mint, OpenSUSE, Arch Linux, PCLinuxOS, etj.
Operating System Services
Sistemi operativ ofron një environment në të cilin ekzekutohen programet. Sistemin operativ mund ta
shohim nga disa këndvështrime: njëra fokusohet në shërbimet që i ofron sistemi, tjetra në interface-in
që u është mundësuar përdoruesve dhe programerëve, e treta fokusohet në komponentet dhe
ndërveprimet mes tyre.

Sistemi operativ i ofron disa shërbime për programet dhe përdoruesit e tyre.
Një grup i shërbimeve të sistemit operativ ofron funksione që janë helpful për përdoruesin:
-User interface – pothuajse të gjitha sistemet operative kanë një User Interface (UI):
Comand Line (CLI)
Graphical User Interface (GUI)
Touch-Screen
-Program execution – sistemi duhet të jetë në gjendje ta ngarkoj një program në memorie, ta ekzekutoj
programin dhe ta përfundoj ekzekutimin (në mënyrë normale apo jonormale-për
shkak të error-ave).
-I/O operations – Një program që ekzekutohet mund të kërkoj hyrje/dajle, që përfshin fajlla apo I/O
devices. Për disa pajisje duhet të përdoren funksione speciale (psh. leximi nga network
interface apo shkrimi në fajlla të sistemit).
-File-system manipulation – programeve mund tu nevojitet të lezojnë e shkruajnë fajlla dhe directory, t’i
krijojnë dhe fshijnë ato sipas emirt, të kërkojnë një fajll të dhënë, të listojnë
informacionet e fajllave. Disa sisteme operative përfshijnë permission
management për të lejuar apo ndaluar Ļasjen në fajlla e directory bazuar në
pronësinë.
-Comunications – proceset mund të shkëmbejnë informacione brenda të njejtit kompjuter apo mes
kompjuterëve të ndryshëm në rrjet. Komunikimi mund të implementohet për mes
shared memory (dy ose më shumë procese lexojnë dhe shkruajnë nga i njejti seksion i
memories) apo message passing (paketa të informacionit në formate të paradefinuara
zhvendosen në mes të proceseve nga sistemi operativ).
-Error detection – sistemet operative duhet të jenë vazhdimisht në dijeni për error-at e
mundshëm.Errorat mund të shfaqen në CPU dhe memory hardware, I/O devices dhe
në programet e përdoruesit.
Grupi tjetër i shërbimeve të sistemit operativ nuk janë për të ndihmuar përdoruesin por për të siguruar
funksionin efikas të vetë sistemit, e kjo bëhet përmes resource sharing në mes të proceseve.
-Resource allocation – kur në të njejtën kohë janë due u ekzekutuar disa procese, resurset duhet të
alokohen për secilin prej tyre. Sistemi operativ menaxhon lloje të ndryshme të
resurseve (CPU cycles, main memory, file storage, I/O devices).
-Logging – mbajtja e statistikava se cili perdorues (eventualisht cilat programe) cilat lloje të computer
resources në çfarë mase i ka përdorur.
-Protection and security – pronarët e të dhënave të ruajtura në një sistem kompjuterik multiuser apo
networked duan që të kenë kontroll mbi të dhënat e tyre. Kur disa procese
ekzekutohen në të njejtën kohë, ato nuk duhet të interferojnë me njëra
tjetrën apo me vtë sistemin operativ. Protecsion duhet të siguroj se çasja në
resurset e sistemit është e kontrolluar. Security e sistemit ka rëndësi të
veçantë, dhe kjo bëhet duke i kërkuar çdo përdoruesi të autentifikohet (kjo
bëhet me password) në mënyrë që ti jepet çasje në resurse.

User and Operating Systems Interface


Command Line (CLI) - Shumica e sistemeve operative duke përfshirë edhe UNIX, Kinux e Windows, e
trajtojnë command interpreter si program special i cili ekzekutohet kur
inicializohet një proces apo kur një përdorues logohet për herë të parë (në
sistemet interaktive). CLI (command interpreter, ndryshe njihet si shell) lejon që
përdoruesi të shkruaj comandat direkt dhe e ekzekuton atë.
Graphical User Interface (GUI) – në vend se të shkruhen komandat dierekt në CLI, përdoruesi ka në
dispozicion një sistem mouse-based window-and-menu i karakterizuar
nga desctop metaphor. Përdoruesi përdor mausin për të pointuar në
imazhe ose ikona në desktop që paraqesin programe, fajlla,
direktoriume apo system functions. Butona të ndryshëm në interface
mund të shkaktojnë veprime të ndryshme kur klikohen. Shumë sisteme
operative tani përfshijnë edhe CLI edhe GUI interface (Microsoft
Windows është GUI me CLI command shell, Apple MAC IOs është
“Aqua” GUI me UNIX kernel dhe ka në dispozicion shell, Unix dhe Linux
kanë CLI dhe interface opsionale (CDE, KDE, GNOME)).
Touchscreen Interfaces – përdoren në pajisje mobile pasi CLI dhe mouser-and-keyboard systems janë
jopraktik. Interaksioni zhvillohet përmes gjesteve (prekjeve) në touch screen.
Më herët smartphone-ët kanë pasur një tastier fizike, por tani e kanë të
emuluar tastierën në touch screen. Pajisjet mobile sot kanë të implementuar
edhe voice commands.
Thirrjet sistemore (System Calls)
Thirrjet sistemore ofrojnë një interface të shërbimeve që mundësohen nga sistemi operativ. Keto thirrje
janë të dispoueshme si funksione të shkruara në C apo C++. (Sistem call është mënyra përmes së cilës
një program kompjuterik kërkon një shërbin nga kerneli i sistemit operativ në të cilin ekzekutohet. Kjo
është mënyrë e komunikimit mes programit dhe sistemit operativ.) Thirrjeve sistemore më së shpeshti
iu qasemi përmes Application Programming Interface (API) e jo direkt. Tre API që hasen më së shpeshti
janë: Win32 API e Windows, POSIX API (UNIX, Linux, Mac OS), Java API për JVM.

Pjesa softurike e nevojshme për


ekzekutimin e aplikacioneve të
shkruara në një gjuhë programuese,
duke përfshirë kompajlleret e
interpreteret dhe softuer tjere si
libraries dhe loaders, quhet run-time
environment (RTE). RTE ofron system-
call interface që shërben si link mes
aplikacionit dhe thirrjeve sistemore i
mundësuar nga sistemi operativ. Secilit
system call i asociohet një numër dhe
system-call interface ofron një tabelë
të indeksuar në bazë të këtyre
numrave. System-call interface kërkon
një system call të caktuar në kernelin e sistemit operativ dhe e kthen statusin nga system call. Thirresit
nuk i duhet të dij fare sesi është implementuar një system call, por vetëm duhet t’i përmbahet API dhe
të dijë se çfarë rezultati duhet të pres nga sistemi operativ për një system call të caktuar. Shumica e
detajeve të interface-it të sistemit operativ janë të fshehura nga programeri përmes API dhe
menaxhohen nga RTE.

Për të kaluar parametrat në sistemin operativ,


përdoren tri metoda kryesore. Metoda më e
thjeshtë është kalimi i parametrave në
regjistra. Në disa raste ka më shumë
parametra sesa regjistra, atëherë parametrat
ruhen në blloqe apo tabela në memorie dhe
adresa e blloqeve kalohet si parametër në
regjistër. Nëse janë më pak se 5 parametra
përdoren regjistrat, nëse janë më shumë
përdoren blloqet. Metoda e tretë është
përmes stack ku parametrat bëhen push nga pragrami dhe pop nga sistemi operativ.

Thirrjet sistemore mund të grupohen në 6 kategori: process control (fork(), exit(), wait()), file
management (open(), read(), write(), close()), device management (ioctl(), read(), write()), information
maintenance (getpid(), alarm(), sleep()), communications (pipe(), shm_open(), mmap()) dhe protection
(chmod(), umask(), chown()).
System Services
Aspekt tjetër i sistemeve modere është koleksioni i shërbimeve të sistemit. System services që ndryshe
njihen edhe si system utilities, sigurojnë një environment të përshtatshëm për zhvillimin dhe
ekzekutimin e programeve. Mund të ndahen në disa kategori:
File management/manipulation – këto programe shërbejnë për create, delete, copy, rename,
print, dump, list dhe çasje e manipulim me fajlla e direktoriume.
File modification – file editorët krijojnë dhe modifikojnë përmbajetjen e fajllave. Ekzistojnë
komanda të veçanta për të kërkuar në përmbajtjen e një fajlli dhe për të ndryshuar tekstin.
Status information – disa programe kërkojnë të dhëna të sistemit si: data, koha, hapësira e
memories, disk space, numri i përdoruesve. Të tjerë janë më kompleks, duke ofruar informata të
detajuara për performancën, logging dhe debugging. Keto programe e paraqesin outupin në terminal,
output devices apo në fajlla. DIsa sisteme kanë registry që përdoret për të ruajtur dhe shfaqur
configuration information.
Programming language support - compilers, assemblers, debuggers, dhe interpreters për gjuhët
programuese të zakonshme (C, C++, Java, Python) që ofrohen bashk me sistemin operativ, apo mund të
downloadohen veçanëtisht.
Program loading and execution – pasi të kompjallohet programi, ai duhet të bëhet load në
memorie që të mund të ekzekutohet. Sistemi duhet të ofroj absolute loaders, relocatable loaders,
linkage editors, dhe overlay loaders.
Communications – këto programe ofrojnë një mekatizëm për krijimin e connections virtuale mes
proceseve, përdoruesve dhe sistemeve kompjuterike. U lejon përdoruesve të dërgojnë mesazhe në
ekranet e njëri tjetrit, të kërkojnë në web faqe, të dërgojnë email, të logohen remotely, të transferojnë
fajlla nga një makinë në tjetrën.
Background services – janë procese të cilat fillojnë në system startup dhe pastaj kur përfundojnë
taskun terminojnë, e të tjerat vazhdojnë deri sa mbyllet sistemi. Njihen ndryshe si services, subsystems,
daemons.
Application programs – nuk janë pjesë e sistemit operativ, ekzekutohen nga përdoruesi. Hapen
përmes command line apo mouse click. Aplikacione të tilla janë web browser, word processor dhe text
formatter, database systems, games, etj.
Building dhe Booting një sistem operativ
Zakonisht sistemet operative dizajnohen për tu ekzekutuar në Ļfarë lloji të makinës me shumë lloje të
pajisjeve periferike. Zakonisht kur blejmë një sistem kompjuterik, e ka të instaluar sistemin operativ.
Mirëpo , mund të built dhe instalohet ndonjë sistem tjetër operativ nga fillimi përmes hapave:
-Shkruarja e source code të sistemit operativ
-Konfiguri i sistemit operativ për sistemin në të cilin do të ekzekutohet
-Kompajllimi i sistemit operativ
-Instalimi i sistemit operativ
-Startimi i kompjuterit dhe sistemit të ri operativ
Hardueri nuk e din se ku është i vendosur kerneli she si ta startoj atë. Procesi i startimit të kompjuterit
duke e startuar kernelin njihet si booting i sistemit. Kur fillon furnizimi me energji i sistemit, ekzekutimi
fillon nga një fixed memory location. Në shumicën e sistemeve, boot process zhvillohet kështu:
-Një copëz e vogël kodi që njihet si bootstrap program apo boot loader (BIOS- i ruajtur në ROM
ose EEPROM)e lokalizon kernelin
-Kerneli loadohet në memorie dhe startohet
-Kerneli inicializon harduerin
-Root file i sistemit përcaktohet.
(Në disa raste ky proces i ka dy hapa (multistage) – boot loader i lokalizuar në nonvolatile
firmware që njohur si BIOS ekzekutohet dhe e loadon një boot loader tjetër të lokalizuar në fixed disk
location që njihet si boot block i cili në pas e loadon sistemin operativ në memorie dhe e ekzekuton.)
Në sistemet moderne kompjuterike BIOS-i është zëvendësuar me Unified Extensible Firmware Interface
(UEFI) i cili ka suport më të mirë ndaj 64-bit systems dhe disqeve më të mëdha. Avantazhi kryesor është
se është single complete boot manager që e ben më të shpejt se multistage BIOS boot process.
Definicioni i procesit
Sistemi operativ ekzekuton shumë programe të cilat marrin emrin procese. Një program gjatë ekzekutit
quhet proces. Sistemi operativ është koleksion i proceseve, disa prej të cilave ekzekutojnë user code e të
tjerat operativ system code. Termi proces ndryshon nga termi job apo program. Programi është pjesë
pasive/statike e ruajtur në disk (executable file), ndërsa kur executable file loadohet në memorie
programi bëhet proces dhe është pjesë aktive/dinamike. Programi është pasiv/statik, nuk mund të
kërkoj resurse dhe ka vetëm code section, ndërsa procesi është aktiv/dinamik, kërkon resurse dhe ka
code section, data section , stack dhe program counter.
Vlera e program counter-it dhe përmbajtja e regjistrave të procesorit paraqesin statusin e aktivitetit
aktual të procesit.
Memory layouts të procesit ndahen në
disa seksione:
-Stack section – përmban të dhëna të
përkohshme gjatë thirrjes së funksioneve,
si psh. parametrat e funksionit, return
address dhe variablat lokale.
-Heap section – memorie që është e
alokueshme dinamikisht gjatë program run
time.
-Data section – variablat globale.
-Text section – executable(program) code.

Process state
Kur procesi ekzekutohet, e ndërron gjendjen. Gjendja e procesit definohet nga aktiviteti aktual i
procesit. Procesi mund të jetë në një nga gjendjet:
-New – procesi është duke u krijuar.
-Ready – procesi është i gatshëm t’i caktohet një procesori.
-Running – instruksionet janë duke u ekzekutuar.
-Waiting – procesi është duke pritur që të ndodh ndonjë event.
-Terminated – procesi ka përfunduar ekzekutimin.
Life cycle e procesit

1.Fillimisht krijohet një program/job.


2.Kur një job i ri shtohet në sistem, ruhet në
job pool/queue në hard disk.
3.Përmes job scheduling bëhet zgjedhja e një
job-i për të kaluar në main memory.
4.Kur një job kalon në memorie bëhet proces
dhe ruhet në waiting queue që quhet ready
queue, ku të gjitha proceset presin radhën e
tyre për tu dërguar për ekzekutim në CPU.
5.Përmes process scheduling apo CPU scheduling zgjedhet një proces të cilit do t’i alokohet memoria.
6.Përmes process dispatching procesit të zgjedhur i jepet kontrolli i CPU-së.
7.Pas kalimit në CPU, ekzekutohet i gjithë kodi i procesit dhe përfundon.
Job queue – është në hard disk për të ruajtur jobs që janë futur në sistem.
Ready queue – është në main memory për të ruajtur proceset. Jobs kur kalojnë nga job queue në ready
queue bëhen procese.
Blocked queue – është në main memory dhe ruan proceset të cilat duhet të presin për resurse apo I/O.
Suspended queue – është në hard disk për të ruajtur proceset të cilat janë suspenduar apo përjashtuar
nga main memory.
Device queue – ruan proceset të cilat presin për një I/O device të caktuar.
Process Control Blocks
Process control blocks apo task control block janë informatat për një proces specifik. Këto informata
janë:
-Process state – new, ready, running, waiting, halted.
-Program counter – Përmban adresën e instruksionit të radhës që duhet ekzekutuar.
-CPU registers – përmbajtja e të gjithë process-centric registers.
-CPU scheduling information – përfshin process priority, scheduling queue pointer, dhe
parametra të tjerë të scheduling.
-Memory-management information – memoria e alokuar për procesin.
-Accounting information – sa është përdorur CPU, time limits, numri i accounts, jobs dhe
proceseve.
-I/O status information – lista e I/O devices të alokuara për këtë proces, lista e open files, etj.
Proceset implementohen me anë të process table, e cila ruan ID e secilit proces dhe pointerin PCB
përkatës.

Context Switch
Gjatë ekzekutimit të një procesi në CPU
ndodh që nevojitet të kalohet nga një
proces në procesin tjetër. Për tu realizuar
ky veprim duhet të ruhet state i procesit
të vjetër dhe të mirret gjendja e procesit
të ri nga PCB (CPU register, process state,
memory management informations) duke
kaluar në procesin e ri. Ky veprim quhet
context switch. Kur ndodh context switch,
ruhet context i procesit të vjetër në PCB
(CPU register, process state, memmory
management informations) dhe merret
context i procesit të ri që duhet të
ekzekutohet. Gjatë kalimit nga një proces
në tjetrin systemi nuk kryen punë andaj
context switching time is overhead. Sa
më kompleks që është sistemi operativ
dhe PCB, më shumë kohë merr context switching.
Scheduler
-Long term scheduler/Job scheduler – thirret
kur një job duhet të kaloj nga job pool në
ready queue. Ky lloj e schedul-imit nuk
ndodh shpesh sepse proceseve u duhet kohë
në sistem për tu ekzekutuar.
-Mediun term scheduler – thirret kur duhet
të ndërrohen disa blocked processes.
Përdoret veçanërisht në time-sharing
systems si një intermediate scheduling level.
Përdoret për të larguar nga memoria
programet e ekzekutuara parcialisht dhe për
t’i thirrur ato më vonë që të vazhdojnë ku
kanë mbetur.
-Short term scheduler/CPU scheduler – prej
disa proceseve që janë të gatshme për tu
ekzekutuar zgjedh një dhe ia alokon CPU-në.
Procesi ekzekutohet për vetëm pak sekonda para se të detyrohet të pres për I/O requests.

Dispatchers
Dispatcher është moduli i cili i jep kontrollin e
CPU-së procesit të zgjedhur nga CPU scheduler.
Funksioni i dispatcher-it përfshin switching
context, switching to user mode dhe kalimin në
lokacionin adekuat në user program për ta
rifilluar atë program.
Sistemet duhet të ofrojnë mekanizmat për krijimin e procesit dhe terminimin e procesit.
Krijimi i procesit
Procesi prind krijon procesin fëmijë, i cili
krijon procese tjera duke e krijuar një
tree of processes. Proceset
identifikohen dhe menaxhohen përmes
process identifier (pid) i cili është një
numër integjer. Kur një parent e krijon
një child process, procesi child do të
ketë nevojë për resurses (CPU time,
memory, files, I/O devices) për të kryer
tasqet e tij. Child procesi mund të siguroj resurset direkt nga sistemi operativ apo mund t’i caktohet një
pjesë e resurseve të procesit parent. Procesi parent i ndan resurset e tij në mes të proceseve child ose i
share disa resurse (memory, files) me disa procese child. Kur krijohet një proces i ri ekzistojnë dy
mundësi të ekzekutimit: parent dhe child ekzekutohen paralelisht apo parent pret derisa child
përfundon.
Poashtu janë dy mundësi të address-space-ave: child është duplikat i parent (ka të njejtin program dhe
të dhëna) apo child process ka nje program të ri në të.
Terminimi i procesit
Një proces terminon kur e përfundon ekzekutimin statemant të fundit dhe i kërkon sistemit operativ ta
fshijë përmes exit() system call. Procesi që terminon e kthen status value tek procesi prind përmes wait()
system call, dhe resurset e procesit bllokohen nga sistemi operativ.
Një proces parent mund ta terminojë procesin child përmes abort() system call, në rastet kur procesi
child i tejkalon resurset memorike, kur tasku që i ishte caktuar child procesit nuk është më i nevojshëm
apo kur parent është duke terminuar dhe sistemi operativ nuk lejon që child të vazhdoj pas terminimit
të parent të tij.
Disa siteme operative nuk lejojnë që një child proces të vazhdoj kur parent i tij terminon, andaj kur
terminon një proces terminojnë edhe të gjithë child-at e tij dhe ky fenomen quhet cascading
termination.
Procesi parent pret për përfundimin e procesit child përmes wait() system call, i cili ka një parametër që i
mundëson parent procesit të marrë exit code nga child procesi. Ky system call kthen process identifier të
procesit child që ka terminuar që parent të dijë se cili child ka terminuar.
Procesi child i cili terminon, mirëpo procesi parent i të cilit ende nuk e ka thirrur wait () (child ende
ekziston në proces table për të raportuar tek procesi prind), quhet zombie process. Pasi parent të ketë
thirrur wait() proces identifier dhe recordi në proces table për child procesin fshihen.
Procesi child, procesi parent i të cilit ka terminuar pa pritur për terminimin e child procesit, quhet
orphan process.
Interprocess Commnication
Proceset brenda një sistemi mund të jenë të pavarura ose kooperative. Proceset e pavarura nuk
afektojnë apo nuk afektohen nga ekzekutimi i ndonjë procesi tjetër. Proceset kooperative afektojnë apo
afektohen nga proceset tjera, duke përfshirë sharing data. Arsye për ekzistimin e proceseve kooperative
është information sharing (disa aplikacione mund të kenë interes për të njejtën pjesë të informacionit
andaj duhet mundësuar një environment që u
mundëson çasje në këto informacione),
computational speedup (që një task të kryhet më
shpejt duhet të ndahet në subtasks që ekzekutohen
paralelisht me njëri tjetrin) dhe modularity (mund të
nevojitet që të konstruktohet një sistem modular,
duke i ndarë funksionet e sistemit në procese ose
threads të ndara). Tek proceset kooperative
nevojitet interprocess communication (IPC) që të
mund të shkëmbehen të dhëna mes proceseve. Dy
modelet e interprocess communications janë shared
memory dhe message passing.
Shared memory
IPC duke përdorur shared memory kërkon që proceset të cilat do të komunikojnë të krijojnë një region
të shared memory. Shared memory segment krijohet nga njëri proces në address space-in e tij dhe
proceset e tjera që duan të komunikojnë duhet të lidhin këtë segment me address space-in e tyre.
Sistemi operativ tenton të ndaloj proceset t’i çasen memories së një procesi tjetër, andaj proceset që
duan të komunikojnë duhet ta largojnë këtë restriction. Proceset pastaj mund të komunikojnë duke
shkruar dhe lexuar të dhëna nga shared memory. Ky komunikim kontrollohet vetëm nga proceset e jo
nga sistemi operativ. Proceset poashtu janë përgjegjëse për të siguruar se ato nuk do të shkruajnë në të
njejtin lokacion njëherësh. Qështja kryesore është sigurimi i mekanizmit i cili iu mundëson proceseve të
sinkronizojnë veprimet e tyre të çasjes në shared memory.
Për të ilustruar procesin e komunikimit kooperativ përdoret problemi producer-consumer. Një producer
process prodhon informacione që konsumohen nga një consumer process (psh. compiler-i prodhon
assembly code që konsumohet nga assembler-i dhe assembler-i prodhon object modules që
konsumohen nga loader-i). Problemi producer-consumer ofron edhe metaforën për paradigmën client-
server. Serveri konsiderohet si producer, ndërsa klienti si consumer (psh. web server prodhon
përmbajtjen e HTML fajllave dhe imazheve, të cilat konsumohen nga klienti web browser i cili i kërkon
kërto resurse).
Një zgjidhje për problemin producer-consumer përdor shared memory. Për të mundësuar që proceset
producer dhe consumer të ekzekutohen paralelisht, duhet të krijohet një buffer i items i cili mbushet
nga producer dhe zbrazet nga consumer. Ky buffer duhet të jetë i vendosur në një regjion të memories
ku kanë çasje edhe producer edhe consumer (shared mermory). Dy lloje të buffers mund të përdoren:
-unbounded-buffer – nuk ka vlerë kufizuese të madhësisë së buffer-it (consumer-it mund t’i
duhet të presë për items të reja, por producer gjithmonë mund të vendos item të reja në buffer).
-bounded-buffer – ka një vlerë fikse të madhësisë së buffer-it (consumer duhet të presë nëse
buffer-i është i zbrazët dhe producer duhet të pres nëse buffer-i është i mbushur).
Message passing
Message passing siguron një mekanizëm i cili i mundëson proceseve të komunokojnë pa ndarë të njejtin
namespace (memory sharing). Është posaqërisht e përdorshme në sistemet e distribuara ku proceset të
cilat duhet të komunikojnë janë në kompjuterë të ndryshëm të lidhur në rrjet. Message passing ka së
paku dy operacione që janë send(message) dhe receive(message). Madhësia e mesazhit mund të jetë
fikse apo variabile (komunikimi ngjan me chat programs). Nëse dy procese duan të komunikojnë me
njëra tjetrën, të dërgojnë dhe pranojnë mesazhe, mes tyre duhet të ekzistoj një communication link.
Disa metoda për implementimin logjik të communication link janë:
-Komunikimi direkt dhe indirekt
-Komunikimi sinkron dhe asinkron
-Automatic dhe explicit buffering
Naming – proceset të cilat duan të komunikojnë duhet të kenë një mënyrë për t’iu referuar njëri tjetrit.
Mund të përdorin komunikimin direkt ose indirekt.
Tek komunikimi direkt kemi adresimin simetrik dhe asimetrik. Tek adresimi simetrik edhe dërguesi edhe
pranuesi duhet ta emërojnë njëri tjetrin dhe funksionet e dërgimit dhe pranimin definohen:
send(P, message) – dërgon mesazhin tek procesi P.
receive(Q, message) – pranon mesazhin nga procesi Q.
Tek adresimi asimetrik vetëm dërguesi emëron pranuesin, ndërsa pranuesi nuk është e nevojshme ta
emëroj dërguesin dhe funksionet e dërgimit dhe pranimit definohen:
send(P, message) – dërgon mesazhin tek procesi P.
receive(id, message) – pranon mesazhin nga cilido proces. Variabla id i vendoset emrit të
procesit me të cilin është vendosur komunikimi.
Në komunikimin indirekt mesazhet dërgohen ose pranohen përmes mailboxes ose porteve. Mailboxes
mund të shikohen sikur objekte në të cilat proceset mund të vendosin mesazhe apo prej të cilave
largojnë mesazhe. Secili mailbox ka një indentifikues unik. Dy procese mund të komunikojnë me njëri
tjetrin vetëm nëse kanë shared mailbox. Sistemi operativ duhet të ofroj mekanizmat që mundësojnë
krijimin e një mailbox, dërgimin e pranimin e mesazheve përmes mailbox dhe fshirjen e mailbox.
Funksonet e dërgimit dhe pranimit definohen:
send(A, message) – dërgon mesazh në mailbox-in A.
receive(A, message) – pranon mesazh nga mailbox-i A.
Sinkronizimi – message passing mund të jetë blocking ose non-blocking. Blocking konsiderohet sinkrone
blocking send/blocking receive (dërguesi bllokohet deri mesazhi të pranohet, pranuesi është i blokuar
deri sa të ketë një mesazh të gatshëm për ta pranuar). Non-blocking konsiderohet asinkrone non-
blocking send/non-blocking receive (dërguesi dërgon mesazhin dhe vazhdon, pranuesi pranon një
mesazh valid apo null message).
Buffering - Edhe nëse komunikimi është direkt apo indirekt, mesazhet që këmbehen mes proceseve
komunikuese vendosen në temporary queue. Këto queue mund të implementohen në tre mënyra: zero
capacity (asnjë mesazh nuk është i vendosur në link, dërguesi duhet të pres për pranuesin), bounded
capacity (gjatësi e caktuar e numri të mesazheve, dërguesi duhet të pres nëse linku është i mbushur)
dhe unbounded capacity (gjatësi e pacaktuar, dërguesi nuk pret asnjëherë).

Dallimet mes shared memory dhe message passing


Shared memory dhe message passing janë modele të zakonshme në sistemet operative, dhe shumica e
sistemeve i implementojnë të dyjat. Message passing përdoret për këmbimin të një sasie të vogël të të
dhënave, sepse nuk ka konflikte që duhet të evitohen. Poashtu, message passing është më i lehtë për tu
implementuar në sistemet e distribuara sesa shared memory. Modeli shared memory mundëson
shpejtësi maksimale dhe është më i shpejt se sa modeli message passing sepse sistemet me modelin
message passing janë të implementuara duke përdorur thirrjet sistemore (system calls), të cilat marrin
kohë me ndërhyrjen në kernel. Tek modeli shared memory thirrjet sistemore përdoren vetëm derisa të
krijojnë regjionet shared memory dhe më pas nuk nevojitet asistencë nga kerneli.

Pipes
Një pipe është një gyp që i lejon dy procese të komunikojnë. Pipes kanë qenë IPC mekanizmi më i
hershëm në UNIX sisteme. Në implementimin e pipes duhet të merret parasysh: a është komunikimi
unidirectional apo bidirectional, në rastet e bidirectional a është half-duplex (të dhënat mund të
transferohen vetëm nga njëra anë brenda një kohe) apo full-duplex (të dhënat mund të transferohen
nga të dyja anët në të njejtën kohë), a mund të kenë relacion parent-child proceset që komunikojnë dhe
a mund të komunikojnë pipes nëpër network apo duhet të jenë të dy proceset në të njejtën makinë.

Ordinary pipes – iu lejojnë proceseve të komunikojnë në modin standard producer-consumer, ku


producer shkruan në njërin fund të pipe-it (the write end) ndërsa consumer lexon nga fundi tjetër (the
read end). Ordinary pipes janë unidirectional, pra mundësojnë one-way communication. Nëse nevojitet
two-way communication, atëherë duhet të përdoren dy pipe të cilët dërgojnë të dhëna në drejtime të
ndryshme.

Named pipes – komunikimi mund të jetë edhe bidirectional dhe nuk kërkon parent-child relation. Kur
vendoset një named pipe disa procese mund ta përdorin atë për komunikim. Named pipe vazhdojnë të
ekzistojnë edhe kur përfundon komunikimi mes proceseve.
-Në UNIX sisteme named pipes iu referohen si FIFO. FIFO krijohet nga mkfifo() system call dhe
manipulohet me open(), read(), write(), close() system calls. FIFO lejon komunikimin bidirectional, por
transmetimi duhet të jetë half-duplex.
-Në Windows sisteme lejohen full-duplex communications dhe proceset që komunikojnë mund të jenë
në të njejtën makinë apo në makina të ndryshme. Named pipes krijohen nga CreateNamedPipe(). Një
klient mund të konektohet në named pip e përmes ConnectNamedPipe() dhe komunikimi realizohet
duke përdorur ReadFile() dhe WriteFile().

Sockets
Një socket definohet si endpoint i një komunikimi. Komunikimi i dy proceseve përmes network kërkon
që të ekzistoj nga një socket për secilin proces. Socket-i identifikohet me një IP address të shoqëruar me
numrin e portit.

Threads
Thread është njësia bazë e përdorshmërisë së CPU-së, që përmban një thread id, program counter, një
register set dhe një stack. Një thread ndan me threads të tjerë të të njejtit proces code/text section,
data section dhe resurset e tjera të sistemit operativ si open files dhe signals. Proceset tradicionale e
kanë vetëm një thread të kontrollit. Proceset që kanë më shumë threads të kontrollit, mund të kryejnë
më shumë se një punë në të njejtën kohë. Krijimi i procesit është heavy-weight, ndërsa krijimi i thread
është light-weight. Përdorimi i threads thjeshtëson kodin dhe rrit efiçiencën. Kernel-ët janë kryesisht
multithreaded. Pra, proceset mund të jenë single-threaded ose multithreaded.

Shumica e aplikacioneve
softuerike që ekzekutohen në
kompjuterët modern dhe pajisjet
mobile janë multithreaded. Një
aplikacion implementohet si një
proces i vetëm me disa threads.
Psh. një web browser duhet të
ketë një thread i cili i shfaq fotot
ose tekstin dhe një tjetër thread
që merr të dhënat nga rrjeti, apo
një word processor (Word) duhet
të ketë një thread për paraqitjen
grafike, një thread që u përgjigjet
shtypjes së tasteve nga user-i dhe një thread të tretë për të kontrolluar spelling të fjalëve në
background.

Thread Control Block (TCB) përbëhet nga: thread id (tid), program counter, registers, state, priority,
event information, information related to scheduling, pointer to owner process, TCB pointer.

Krijimi i proceseve shpenzon kohë dhe kërkon resurse, prandaj është më efiçiente të krijohet një proces i
cili ka disa threads.
Thread Groups janë një bashkësi e threads që ekzekutohen brenda procesit të njejtë. Ato përdorin
(ndajnë) memorie të njejtë dhe mund të ju qasen variablave globale të njejta, zonës heap të njejtë dhe
pershkruesve të fajllave (file descriptors) të njejtë. Të gjitha këto threads ekzekutohen në mënyrë
paralele.

Benefitet e multithreading programming


Responsiveness – lejon që të vazhdoj ekzekutimi edhe nëse ndonjë pjesë e procesit është bllokuar, gjë
që ka rëndësi për user interface.
Resource sharing – përderisa proceset mund të ndajnë të njejtat resurse vetëm përmes teknikave si
shared memory dhe message passing , threads ndajnë të njejtën memorie dhe resurse të procesit
përkatës by defafult. Ndarja e të njejtit code dhe data i mundëson aplikacionit të ketë shumë thread me
të njejtin address space.
Economy – meqë ndarja e memories dhe resurseve është e kushtueshme, është më ekonomike të
krijohen threads dhe context-switch mes threads pasi ndajnë të njejtën memorie dhe resurse me
procesin të cilit i takojnë. Krijimi i threads merr më pak kohë sesa krijimi i proceseve dhe context
switching mes threads është më i shpejtë sesa mes proceseve.
Scalability – rriten benefitet e multithreading në multiprocessor architecture, pasi threads mund të
ekzekutohen paralelisht në processing cores të ndryshme. Ndërsa single-thread process mund të
ekzekutohet vetëm në një procesor pa marrë parasysh se sa të tjerë janë të disponueshëm.

Sfidat për multicore system programming janë: identifying tasks, balance, data splitting, data
dependency, testing and debugging.
Ekzijtojnë dy llojet të parallelism:
-Data parallelism – fokusohet në distribuimin e të njejtave data mes multiple computing cores të cilat
performojnë të njejtin operacion.
-Task parallelism – përfshin distribuimin e tasqeve (threads) mes multiple computing cores. Secili thread
perfermon një operatcion unik. Threads mund të veprojnë me të njejtat data, apo me data të ndryshme.
Threads mund të jenë:

User threads – menaxhohen nga user level


threads library. (Tri libraritë kryesore janë: POSIX Pthreads, Windows threads, Java threads.)
Kernel threads – mbështeten dhe menaxhohen direkt nga sistemi operativ. (Mbështeten nga të gjithë
general-purpose operatin systems si : Windows, Linux, Mac OS X, iOS, Android.)

Multithreading Models
Duhet të ekzistoj një relacion mes user threads dhe kernel threads. Tri modelet më të zakonshme të
këtij relacioni janë:
-Many-to-one – mapon disa user level threads me një kernel
thread. Bllokimi i një thread-i shkakton bllokimin e tërë procesit.
Për shkak se vetëm një thread mund t’i çaset kernelit për një
kohë, multiple threads nuk mund të ekzekutohen paralelisht në
multicore systems. Pak sisteme e përdorin këtë model, pasi nuk
mund të shfrytëzohen avantazhet e multiple processing cores.
-One-to-one– mapon secilin user level threads me një kernel
thread. Ka më shumë concurrency sesa many-to-one, duke lejuar
threads të tjerë të ekzekutohen edhe kur njëri thread blokon.
Disavantazh i këtij modeli është se krijimi i një user level thread
krijon edhe një kernel thread dhe numri i madh i kernel threads
ndikon në performancën e sistemit. Numri i threads për proces
nganjëherë kufizohet për shkak të overhead. Ky model
implementohet nga Windows dhe Linux.
-Many-to-many – lejon mapimin e shumë user level threads me
disa kernel threads. E lejon sistemin operativ që të krijoj kernel
threads sa të jetë e nevojshme. Kur një thread bllokon, kerneli
schedulon një tjetër thread për ekzekutim.

Top-level Model është i ngjajshëm me Many-to-many, vetëm se


përpos që mapohen disa user level threads me një numër të
njejtë apo më të vogël të kernel threads, lejon që një user thread
tjetër të mapohet me një kernel thread.
Thread Libraries
Thread library i ofron programerit një API për krijimin dhe menaxhimin e threads. Janë dy mënyra
kryesore për implementimin e thread library:
-Libraria implementohet tërësisht në user space dhe nuk mbështetet nga kerneli. Tërësisht code dhe
data structures të librarisë gjenden në user space. Pra, kur thirret një funksion i librarisë rezuton me
thirrjen e një funksioni lokal në user space e jo me një system call.
-Libraria implementohet në kernel level e mbështetur nga sistemi operativ. Code dhe data structures të
librarisë gjenden në kernel space. Thirrja e funksionit nga kjo librari rezulton me thirrjen tipike të një
system call.

Ekzistojnë dy strategji të krijimit të threads:


-Asynchronous threading – pasi parent krijon një child thread, parent e vazhdon ekzekutimin, ashtu që
parent dhe child ekzekutohen concurrently dhe të pavarur nga njëri tjetri.
-Synchronous threading – kur parent krijon një ose më tepër childs, duhet të pres që të gjithe childs të
terminojnë, që të mund ta vazhdoj ekzekutimin e tij. Child threads mund të kryejnë punë concurrently,
por parent nuk mund të vazhdoj derisa këto punë të jenë kryer.

Pthreads
Mund të ekzistohet edhe në user level edhe në kernel level. Është POSIX standard API për krijim dhe
sinkronizimin e threads. Është specifikim i thread behaviors, ndërsa dizajnuesit e sistemit operativ i
implementojnë specifikimet. Implementohet në UNIX sisteme si Linux dhe Mac OS.

Windows threads
Windows thread është kernel level librari e disponueshme në Windows sisteme.

Java threads
Threads janë modeli fundamental i ekzekutimit të programit në një Java program, Java dhe API e saj
ofron një set të features për krijimin dhe menaxhimin e threads. Çdo Java program ka të paktën një
thread, edhe një program i thjeshtë në Java që përmban vetëm në main method ekzekutohet si single
thread në JVM. Java threads janë të disponueshëm në të gjitha sistemet ku mund të ketë JVM, duke
përfshirë Windows, Linux dhe Mac OS. Java thread API është e disponueshme edhe për Android
aplikacione.

Thread pools
Ideja e thread pool është krijimi i një numri të threads dhe vendosja e tyre në një pool, ku ata presin për
ndonjë punë. Benefitet e thread pool janë se shërbimi i një kërkese nga një thread ekzistues është më i
shpejtë se sesa krijimi i një thread-i të ri dhe lejon numrin e threads të një aplikacioni të jenë të lidhur
me gjatësinë e pool. Windows API përkrah thread pool.

Signal Handling
Sinjalet përdoren në UNIX sisteme për t’i treguar procesit se ka ndodhur një event. Signal handler
përdoret për të procesuar sinjalet. Sinjali gjenerohen nga një event i veçantë, i dërgohet procesit dhe
procesohet nga default ose user-defined handlers. Çdo sinjal ka default handler që kerneli ekzekuton për
të handle sinjalin. User-defined handlers mund ti bëjnë override default handlers.

Thread Cancellation
Thread cancellation është terminimi i një thread-i para se të ketë përfunduar. Thread-i i cili duhet të
anulohet shpesh referohet si target thread. Anulimi i target thread mund të ketë dy scenario:
-Asynchronous cancellation – një thread menjëherë terminon target thread-in.
-Deferred cancellation – target thread në mënyrë periodike kontrollon se a duhet të terminohet, duke i
lejuar kështu atij mundësinë për të terminuar veten.

Windows threads
Windows API është API kryesore për Windows aplikacione. Implementon mapimin one-to-one në kernel
level. Çdo Windows aplikacion ekzekutohet si një proces i veçantë që mund të ketë një e më shumë
threads. Çdo thread përmban: një thread id, një register set që paraqet statusin e procesorit, p

rogram counter, user dhe kernel stack të ndarë për rastet kur thread ekzekutohet në user mode apo
kernel mode dhe një private data storage area që përdoret nga libraritë run-time dhe dynamic link
libraries (DLL). Register set, stack dhe private storage area njihen si context të një thread-i. Strukturat
kryesore të të dhvnave në një thread janë:
-ETHREAD (executive thread block) – përmban
një pointer të procesit të cilit i takon, adresën e
rutinës në të cilën fillon threadi dhe një pointer
të KTHREAD korrespodues (gjendet në kernel
space).
-KTHREAD (kernel thread block) – përmban
informacionet për skedulim dhe sinkronizim,
kernel stack dhe një pointer të TEB (gjendet në
kernel space).
-TEB (thread environment block) – përmban
thread id, user mode stack dhe një array për
thread local storage (gjendet në user space).

Linux threads
Linux më shumë iu referohet si tasks sesa si
threads. Në Linux një proces duplikat krijohet
përmes fork() system call, ndërsa një thread i ri
krijohet me clone() system call, i cili lejon që child të ndajë të njejtin address space me parent. Kur
thirret clone(), pasohet një set i flags të cilët përcaktojnë sesi ndodh sharing mes parent dhe child (p.sh
CLONE_FS – file system information is shared, CLONE_VM - the same memory space is shared,
CLONE_SIGHAND – signal handlers are shared, CLONE_FILES – the set of opern files is shared).

CPU Scheduling
CPU scheduling është baza e multiprogrammed operating systems. Në një CPU single-core vetëm një
proces mund të ekzekutohet brenda një kohe dhe proceset e tjera duhet të presin derisa CPU core të
jetë e lirë për ta. Objektiv i multiprogramming është që disa procese të ekzekutohen gjatë gjithë kohës
në mënyrë që të rritet CPU utilization. Duke i ndërruar proceset në CPU, sistemi operativ e bën
kompjuterin më produktiv. Kur një proces duhet të presë, CPU largohet nga ai proces dhe e merr një
proces tjetër për ta ekzekutuar në ndërkohë. Në sistemet multicore, koncepti i mbajtjes së CPU të zënë
zgjerohet në të gjitha processing cores të sistemit. Scheduling i këtij lloji është fundamental për
funksionimin e sistemit operativ, dhe gati të gjitha resurset duhet të skudulohen para përdorimit. Meqë
CPU është një prej resurseve kryesore të kompjuterit, skedulimi i saj është në qendër të dizajnimit të
sistemimt operativ.

Ekzekutimi i procesit përbëhet nga një cycle i CPU execution dhe I/O
wait. Proceset alternojnë mes këtyre dy gjendjeve. CPU burst është kur
një proces ekzekutohet në CPU, ndërsa I/O burst është kur CPU pret
për I/O që të mund ta vazhdoj ekzekutimin. Ekzekutimi i proceseve
fillon me CPU burst, vazhdon me I/O burst, pastaj me CPU burst, prap
me I/O burs e kështu me rradhë. CPU burst i fundit përfundon me një
system request për të terminuar ekzekutimin.
-Proceset CPU bound janë proceset shpejtësia e të cilave varet nga
performanca e CPU-së, kjo për shkak se kanë CPU burst intensive me
CPU cycles më të gjata dhe numër më të vogël të I/O burst.
-Proceset I/O bound janë proceset shpejtësia e të cilave varet nga
performanca e I/O subsystems, kjo për shkak se kanë numër më të
madh dhe të shpeshtë të I/O burst me CPU burst të vogla.

CPU scheduler selekton një proces nga proceset në memorie që janë


të gatshme për tu ekzekutuar (proceset në ready queue), dhe ja alokon
CPU-në atij procesi. Ready queue mund të implementohet si: FIFO queue, priority queue, tree ose
unordered linked list. Rekordet në ready queue përmbjanë Process Controll Blocks (PCB) të proceseve.

Vendimet për CPU scheduling ndodhin në rastet kur:


1.Një proces kalon nga running state në waiting state (për shkak të I/O request ose wait()).
2.Një proces kalon nga running state në ready state (për shkak të ndonjë interrupti).
3.Një proces kalon nga wainting state në ready state (kur kryhet komunikimi I/O).
4.Një proces terminon.
Kur skedulimi ndodh në rastet 1 dhe 4, themi se është nonpreemptive scheduling apo cooperative, nërsa
në rastet 2 dhe 3 është preemptive scheduling.
Në nonpreemptive scheduling, kur CPU i alokohet një procesi, ai e mban CPU-në deri kur terminon apo
kalon në waiting state. Në preemptive scheduling në rastet kur të dhënat ndahet mes disa proceseve,
mund të shkaktohet race condition.
Të gjitha sistemet operative moderne duke përfshirë Windows, macOS, Linux dhe UNIX përdorin
algoritmin e preemptive scheduling.
Dispatcher
Dispatcher është moduli i cili i jep procesit të selektuar nga CPU scheduler
(short-term scheduler) kontrollin e CPU-së. Ky funksion përfshin: switching
context, switching to user mode dhe kalimin në lokacionin adekuat në user
program për ta rifilluar atë program. Dispatcher duhet të jetë sa më i shpejtë
që të jetë e mundur, pasi thirret gjatë çdo context switch-i. Koha që i duhet
dispatcher-it që të ndaloj një proces dhe të filloj ekzekutimin tjetër njihet si
dispatch latency.
Kriteret për të krahasuar CPU scheduling algoritmet janë:
-CPU utilization – CPU duhet të mbahet e zënë sa më shumë që të jetë e mundur. Përdorimi i CPU
përshkallëzohet nga 0 deri në 100 përqind.
-Throughput – numri i proceseve që e përfundojnë ekzekutimin në njësi të kohës.
-Turnaround time – koha që nevojitet për të ekzekutuar një proces të caktuar. Intervali kohor prej fillimit
deri në përfundim të procesit. Turnaround time është shuma e kohës që shpenzon procesi derisa
vendoset në memorie, pret në ready queue, ekzekutohet në CPU dhe kryen I/O requests.
-Waiting time – koha për të cilën procesi duhet të pres në ready queue.
-Response time – koha që duhet nga dërgimi i një kërkese deri kur fillon të krthehet response.

CPU scheduling algoritmet duhet të maksimizojnë CPU utilization dhe throughput-in, ndërsa të
minimizojnë turnaround time, waiting time dhe response time.

Scheduling algorithms
Merren me problemin se cilit nga proceset në ready queue duhet t’i alokohet CPU-ja.
-First Come First Served (FCFS) scheduling – është algoritmi më i thjeshtë i skedulimit. CPU i alokohet
procesit i cili e ka kërkuar i pari. Implementimi i FCFS menaxhohet përmes FIFO queue. Kur një proces
hyn në ready queue, PCB e tij vendoset në fund të queue. Wainting time mesatare e FCFS është mjaft e
gjatë. Është algoritëm nonpreemptive.
-Shortest-job-first (SJF) scheduling – e asocion secilin proces me gjatësinë e CPU burst të ardhshme për
atë proces. Kur CPU është e lirë, ajo i caktohet procesit i cili e ka next CPU burst më të shkurtë. Nëse CPU
burst e ardhshme e dy proceseve është e njejtë, atëherë përdoret FCFS scheduling. Është optimale, ka
waiting time mesatare minimale për proceset e dhëna, vetëm është e vështirë të parashikohet gjatësia e
CPU request të ardhshme. Mund të jetë peemptive ose nonpreemptive. SJF preemptive quhet edhe
shorterst-remaining-time-first.
-Round Robin (RR) scheduiling – cakton një time quantum (njësi kohore variabile) zakonisht 10-100
milisekonda, gjatë së cilit i alokohet CPU secilit proces. Ready queue përdoret si circle queue. Kur një
proces e shfrytëzon time quantum atëherë kalon në fund të ready queue, dhe CPU i alokohet procesit
tjetër më radhë për një time quantum. Nëse në ready queue janë n procese dhe time quantum është q,
atëherë secili proces merr 1/n CPU time në pjesë prej q time units. Secili proces pret jo më gjatë se
(n-1)*q njësi kohore. Timeri ndërpren pas çdo quantumi që të skedulohet procesi i radhës. Performanca
e këtij algoritmi varet shumë nga madhësia e time quantum. Nëse time quantum është shumë i madh,
atëherë algoritmi është i njejtë me FCFS scheduling. Nëse time quantum është shumë i vogël, mund të
rezultoj me numër të madh të context switches.
-Priority scheduling – bazohet në radhitjen e procesit në bazë të prioritetit. Prioriteti definohet nga
priority number i cili i asociohet secilit proces dhe është numër integer. CPU i alokohet procesit me
prioritetin më të lartë (priority number i vogel == prioritet i lartë). Ky algoritëm mund të jetë preemptive
ose nonpreemptive. Problem i këtij algoritmi është se në sistemet e ngarkuara disa low priority
proceseve mund të mos ju vie radha e ekzekutimit fare. Një proces i tillë që pret shumë gjatë në ready
queue për alokimin e CPU-së mund të konsiderohet i bllokuar. Kjo quhet infinite blocking apo
starviation, dhe mund të zgjidhet përmes aging që mundëson që prioriteti të rritet gradualisht për
proceset të cilat presin në sistem për një kohë të gjatë.
-Multilevel Queue scheduling – krijohen queue të ndara për secilin nivel të priority. Mund të përdoret si
kombinim i priority scheduling dhe round-robin scheduling. Mund të përdoret edhe për ndarjen e
proceseve në queue në bazë të process type (Lista e queues sipas prioritetit: 1.Real-time processes,
2.System processes, 3.Interactive rocesses, 4.Batch processes).

Thread scheduling
Në sistemet operative moderne, janë kernel level threads ato që schedulohen nga sistemi operativ e jo
proceset. Në sistemet që implementojnë modelin Many-to-one dhe Many-to-many, thread library
skedulon user-level threads. Process-Contention Scope (PCS) është skemë ku threads të të njejtit proces
garojnë për të poseduar CPU-në. System-Contention Scope (SCS) është skemë në të cilën të gjithë kernel
level threads garojnë për tu skeduluar në CPU. Sistemet që përdorin modelin one-to-one, sikurse
Windows dhe Linux, i skedulojnë threads duke përdorur SCS.

Pthread scheduling
POSIX Pthread API mundëson krijimin e threads duke specifikuar PCS ose SCS. Pthread identifikon dy
contention scope values:
PTHREAD_SCOPE_PROCESS skedulon threads duke përdorur PCS skedulimin.
PTHREAD_SCOPE_SYSTEM skedulon threads dike përdorur SCS skedulimin.
Linux dhe macOS lejojnë vetëm PTHREAD_SCOPE_SYSTEM.

Multiprocessor scheduling
Në sistemet multiprocesorike CPU scheduling është më kompleks. Multiprocessor mund t’i referohet një
prej arkitekturave: multicore CPUs, multithreaded cores, NUMA (Non-Uniform Memory Access) systems
dhe Heterogeneous Multiprocessing
-Asymmetric Multiprocesing – vetëm njëri prej procesorëve (master server) menaxhon me system
activities, ndërsa procesorët e tjerë ekzekutojnë user code. Është e thjeshtë pasi vetëm një core u qaset
system data structures, dhe nuk ka nevoj për data sharing.
-Symmetric Multiprocessing – të gjithë
procesorët janë self scheduling. Ekzistojnë dy
strategji të skedulimit:
1.Të gjithë threads janë në një ready
queue të përbashkët.
2.Secili procesor ka një queue privat të
threads.

Multicore processors
Sot nga ana harduerike është e mundur që të vendosen disa computing cores në të njejtin chip fizik dhe
ky njihet si multicore processor. Sistemet Symmetric Multiprocessing (SMP) janë më të shpejta dhe
hargjojnë më pak energji sesa sistemet në të cilat secila CPU ka chipin e vet fizik.

Multicore processors mund të kenë probleme


gjatë skedulimit. Kur një procesor i qaset
memories hargjon kohë duke pritur që të dhënat
të jenë të gatshme. Kjo situatë që quhet memory
stall, ndodh pasi procesorët modern operojnë
shumë më shpejtë sesa memoria, por mund të
ndodh edhe në rastet duhen çasur të dhëna që
nuk janë në cache. Për të evituar këtë situatë,
shumë harduerë tani dizajnohen duke
implementuar multithreaded processing cores, ku dy e më shumë hardware threads i caktohen secilit
core. Në këtë mënyrë nëse një thread ka memory stall, core kalon tek threadi tjetër.
Nga aspekti i sistemit operativ secili hardware thread shihet si logical CPU. Teknika Chip Multithreading
(CMT) i cakton secilit core disa hardware threads (hyperthreading). Psh. tek sistemi me katër cores ku
secila ka nga dy hardware threads, sistemi operativ i sheh si tetë logical processors.

Tek multithreaded multicore systems janë dy nivele të


skedulimit:
1.Sistemi operativ vendos se cili software thread
duhet të ekzekutohet në logical CPU.
2.Vendoset se cili hardware thread do të ekzekutohet
në physical core.

Në symmetric multiprocessing systems është e rëndësishme që të ketë ngarketë të balancuar te të gjithë


procesorët në mënyrë që të arrihen benefitet maksimale të pasjes së më shumë se një procesori. Load
balancing tenton që ta mbajë ngarkesën e njejtë te të gjithë procesorët. Janë dy lloje të arritjes së load
balancing:
1. Push migration – bëhet kontrollimi periodik i tasqeve në secilin procesor dhe kur një procesor është i
tejngarkuar atëherë tasqet i kalohen një procesori më pak të ngarkuar.
2.Pull migration – procesorët e lirë marrin waiting tasks nga procesorët që janë të zënë.

Kur një thread është ekzekutuar në një procesor, cache i atij procesori ruan memory accesses të
threaded. Nëse ky thread kalon tek një procesor tjetër për shkak të load balancing, duhet të ripopullohet
cache i ri dhe ky proces është i kushtuedhëm, andaj edhe tentohet qe një proces të ekzekutohet te i
njejti procesor. Kjo njihet si processor affinit, thread ka afinitet për procesorin në të cilin është duke u
ekzekutuar.
Load balancing e afekton processor affinity padi kur një thread kalon nga një procesor në tjetrin ai e
humb cache që e ka pasur në procesorin e kaluar.
Proccesor affinity mund të ketë dy forma:
1.Soft affinity – sistemi operativ tenton që ta ekzekutoj threadin në të njejtin procesor, por nuk ka
garancion,
2.Hard affinity – lejon procesin të specifikojë një grup procesorësh në të cilët mund të ekzekutohet.

Real-time CPU scheduling


CPU skedulimi për real-time operating systems përfshinë çështje të veçanta. Real-time systems mund të
ndahen në:
-Soft real-time systems – real-time tasqet kritike kanë prioritet kundrejt tasqeve tjera, mirëpo
nuk garantohet se kur tasku do të skedulohet
-Hard real-time systems – kanë kërkesa strikte, tasku duhet të shërbehet në bazë të deadline-it
të tij, shërbimi pasi deadline të ketë përfunduar është si të mos ketë ndodhur fare.

Event latency është koha që shtrihet nga momenti kur ndodh një event deri kur ai shërbehet.
Dy lloje të latency kanë ndikim në performancën e real-time systems:
1.Interrupt latency – koha nga arritja e interruptit në CPU deri te fillimi i rutinës që i shërben interruptit.
2.Dispatch latency – koha që i nevojitet scheduling dispatcher për ndaljen e një procesi dhe fillimin e
procesit tjetër.

Process synchronization
Proceset kooperative mund të ndajnë logical address space-in (code dhe data) ose lejohen që të ndjanë
të dhëna përmes shared memory apo message passing. Çasja e njëkohshme në të dhëna nga disa
procese mund të rezultojë në jokonsistencë.
Race condition ndodh kur disa procese kanë çasje konkurente në shared data dhe rezultati final varet
nga rendi në të cili është bërë çasja. Race condition mund të rezultoj në të dhëna të gabuara në shared
data.
Tek shembulli i producer-consumer, kur shtohet apo hiqet nga bufferi inkrementohet apo
dekrementohet counter. Në rastet kur kjo bëhet në mënyrë konkurente rezultati në counter mund të
jetë 4,5 ose 6 dhe mund të rezultoj me rezultat jo të saktë. Për të mos ndodhur race condition tek
producer-consumer model, duhet të sigurohet që vetëm një proces mund të manipuloj me variablën
counter në të njejtën kohë.

Process synchronization përfshin përdorimin e tools që kontrollojnë çasjen në shared data, që të


evitohet race condition. Këto tools duhet të përdoren me kujdes, pasi përdorimi jo i duhur i tyre mund
të rezultoj me performancë të dobët të sistemit, duke përfshirë edhe deadlocks.

The Critical-Section Problem


Le të jetë një sistem i përbërë nga n procese. Secili proces ka një
segment of code, që quhet critical section, në të cilin procesi
duhet tu çaset apo t’i update-oj të dhënat që janë të ndara me
të paktën edhe një proces tjetër. Për këtë shkak nuk duhet
lejuar që dy procese të ekzekutojnë critical section të tyre në të
njejtën kohë. Zgjidhje e critical-section problem është dizajnimi i
një protokolli të cilin mund ta përdorin proceset për të
sinkronizuar aktivitetin e tyre në shared data. Secili proces duhet
të kërkoj leje për të ekzekutuar critical section të tij dhe pjesa e
kodit që e implementon këtë request është entry section.
Critical section pasohet nga exit section. Kodi i mbetur quhet
remainder section.
Zgjidhja për critical-section problem duhet t’i plotësoj tri kushtet:
1.Mutual exclusion – nëse procesi Pi është duke ekzekutuar critical section të tij, asnjë proces tjetër nuk
duhet të jetë duke ekzekutuar critical section.
2.Progress – nëse asnjë proces nuk është duke ekzekutuar në critical section, dhe disa procese janë duke
pritur për të ekzekutuar critical section, vetëm proceset që nuk janë në reaminder section mund të
marrin pjesë në vendosjen se cili proces do të vazhdoj në ekzekutimin e critical section.
3.Bounded waiting – është një limit i caktuar se sa herë proceset e tjera mund të ekzekutojnë critical
section të tyre, pasi një proces ka kërkuar të ekzekuj critical section e deri kur kjo i lejohet.

Nëse dy procese P1 dhe P2 në të njejtën kohë


përdorin fork() system call, krijohen dy procese të
reja child. fork() si return tek procesi parent e ka
process identifier të procesit të ri child të krijuar.
Në këtë rast ndodh race condition në variablën
next_avalable_pid që tregon vlerën e process
identifier të radhës që mund të përdoret. Kur
ndodh çasja e njëkohësishme mund të ndodh që të
dy proceset child të kenë process identifier të
njejtë.

Janë dy zgjidhje të critical section në sisteme operative:


1.Preemptive kernels – një proces që është duke u ekzekutuar në kernel mode mund të ndërprehet dhe
të zëvendësohet me një process tjetër edhe në mes të ndonjë kernel function.
2. Non-preemptive kernels – nuk lejon që një proces që është duke u ekzekutuar në kernel mode të
zëvendësohet me një proces tjetër. Në non-preemptive kernel nuk ndodhin race contions në kernel data
structures pasi, në të njejtën kohë vetëm një proces është aktiv në kernel.

Peterson’s solution
Peterson’s solution është një nga software-based zgjidhjet për
critical section problem. Për shkak se arkitekturat moderne të
kompjuterëve kryejnë basic machine-language instructions, sikurse
load dhe store, nuk garantohet që Peterson’s solution do të punoj
si duhet. Kjo zgjidhje kufizohet vetëm në dy procese të cilat e
alternojnë ekzekutimin mes critical section dhe remainder section.
Variabla turn tregon se e cilit proces është radha për të hyrë në
critical section. flag array tregon se a është i gatshëm një proces të
hyjë në critical section.

Synchronization hardware
Pasi software-based solution për critical section problem nuk punon sigurt në arkitekturat e sistemeve
moderne, përdoren harware instructions që ofrojnë mbështetje në zgjidhjen e critical section problem.
Tri format e hardware support jane:
1.Memory barriers – Memory model është memory guarantiees që arkitektura e sistemit komjuterik i
jep aplikacioneve. Janë dy lloje të memory models:
-Strongly ordered – kur një modifikim i memories në një procesor është menjëherë visible për të
gjithë procesorët e tjerë.
-Weakly ordered - kur një modifikim i memories në një procesor mund të mos jetë menjëherë
visible për të gjithë procesorët e tjerë.
Memory barries ose memory fence është istruksion që bën të mundur që çdo ndryshim në memorie të
bëhet visible për të gjithë procesorët.
2.Hardware instructions – instruksione harduerike speciale të cilat lejojnë ose test-and-modify të një
word, ose swap të përmbajtjes së dy words në mënyrë atomike. Mbron critical section përmes locks.
3.Atomic variables – mundëson atomic operations (të pandërprershme) në basic data types si integers
dhe booleans.

Mutex Locks (Mutual Exclution Locks)


Hardware solutions për critical section problem nuk janë të çasshme nga
një programer i aplikacioneve, andaj janë ndërtuar software tools për ta
evituar këtë problem, prej të cilave edhe mutex lock. Mutex lock përdoret
për të ruajtur critical section dhe në këtë mënyrë për të parndaluar race
condition. Një process duhet të siguroj një lock përmes acquire()
funksionit para se të hyj në critical section, dhe të liroj një lock përmes
release() funksionet kur kryen critical section. Një mutex lock ka një
boolean variabël available që tregon se a është i përdorshëm lock apo
jo.Thirrjet e acquire() dhe release() duhet të jenë atomike, zakonisht
implementohen përmes hardware atomic instuctions sikurse sompare-and-swap.

Disavantazhi kryesor është se shkakton busy waiting. Kur një proces është në critical section të tij, cilido
proces tjetër që tenton të hyjë në critical section të tij vazhdimisht thërret acquire() funksionin. Ky lloj i
mutex lock quhet edhe spinlock, pasi procesi rrotullohet (hyn në loop) teksa pret që lock të jetë i
gatshëm.

Semaphores
Semaphore është synchronization tool më i sofistikuar
se mutex locks për sinkronizimin e proceseve dhe
aktiviteteve të tyre. Një semaphore ësht variable
integer të cilës mund t’i çasemi vetëm përmes dy
standard atomic operations: wait() dhe signal().

-Counting semaphore – nuk ka domen të kufizuar. Mund të përdoret për të kontrolluar çasjen në një
resurs me një numër të caktuar të instancave. Kur count i semaphore është 0, të gjitha resurset janë
shfrytëzuar. Pas kësaj proceset të cilat duan të çasen në resurse bllokohen derisa counter të jetë më i
madh se 0. Semaphore nuk do të ketë kurrë vlerë negative.
-Binary semaphore – mund të ketë vlerë 0 ose 1, i njejtë si mutex locks. Në sistemet të cilat nuk i
mundësojnë mutex locks, mund të përdoren binary semaphores për të ofruar mutual exclution.

Duhet të garantohet që dy procese të mos ekzekutojnë wait() apo signal() në të njejtin semaphore në të
njejtën kohë.

Secili semaphore ka një waiting queue ku vendosen të gjitha proceset që thirrin metodën wait por vlera
e semaphore është negative. Çdo field në waiting queue përbëhet nga një value integer dhe porinter i
rekordit të radhës në listë. wakeup() e largon një proces nga waiting queue dhe e vendos në ready
queue, ndërsa block() e vendos procesin në waiting queue adekuat.
Monitors
Është high-level abstraction që ofron një mekanizëm efektiv për process/thread sychronization. Një
monitor është një modul që përmban: shared data structures, procedures që operojnë në shared data
structures dhe sinkronizimin mes thirrjeve konkurente të procedurave. Vetëm një proces mund të jetë
aktiv në monitor brenda një kohe.

Liveness
Në sinkronizimin me mutex locks dhe semaphores, mund të ndodh që një proces pret pafundësisht për
tu çasur. Kjo pritje prish bounded-waiting kriteret e procesit. Liveness iu referohet disa karakteristikave
që sistemi duhet të ketë për të siguruar që procesi të ketë progres. Infinite waiting është shembull i
dështimit të liveness.

Deadlocks
Në implementimin e semaphores me waiting queue, mund të arrihet situata kur dy e më shumë procese
janë në waiting infinitively për ndodhnjen e një eventi që mund të shkaktohet vetëm nga njëri nga
proceset që ndodhet në waiting queue, dhe kjo situate quhet deadlock.
Psh. nëse kemi dy procese P0 dhe P1, që kanë çasje në dy semaphores Q dhe S me vlera fillestare 1,
supozojmë se procesi P0 ekzekuton wait(S), dhe P1 wait(Q). Kur procesi P0 ekzekuton wait(Q), duhet të
pres derisa P1 të ekzekutoj signal(Q). Njejtë procesi P1 ekzekuton wait(S) dhe pamundësohet ekzekutimi i
signal() funksionit në të dy anët dhe arrihet gjendja e quajtur deadlock.

Forma të tjera të deadlocks janë:


-Starviation – infinite blocking. Një proces asnjëhetë nuk largohet nga semaphore queue në të cilën
është suspenduar.
-Priority inversion – problem i skedulimit kur low-priority process mban një lock që i nevojitet high-
priority procesit. Zgjidhet përmes priority-inheritance protocol.

Priority-inheritance protocol
Është protokoll i cili i lejon të gjitha proceset të cilat janë duke i përdorur resurset të cilat iu nevojitetn
high-priority proceseve, të trashëgojnë hoght-priority derisa të kryejnë punë me resurset në fjalë. Kur
ato kryhen, prioriteti i tyre kthehet në vlerën origjinale.

Classic Problems of Synchronization


-Bounded-Buffer problem – në producer-consumer model
-Readers-Writers problem – konsiderojmë një database e cila ndahet në mes të disa proceseve
konkurente, prej të cilave disa jane readers(vetëm lexojnë nga data set, nuk mund të update-ojnë) e disa
writers(mund të lexojnë dhe update-ojnë data set). Nëse dy reader duan të lexojnë nga data set nuk
paraqet konflikt, mirëpo kur një writer dhe një proces tjetër qoftë writer ose reader çasen në data set në
të njejtën kohë, krijohet kaos. Për të siguruar që të mos ketë probleme, duhet të kenë çasje eksklusive
në database kur janë duke shkruar në të .
-Dining-philosophers problem – filozofët e shpenzojnë kohën e tyre duke menduar dhe duke ngrënë. Në
një tavolinë rrethore janë ulur 5 filozof dhe pjata me oriz është në mes të tavolinës. Poashtu në tavolinë
janë vetëm 5 chopsticks të vendosur anash secilit filozof. Që një filozof të mund të ushqehet duhet të
përdor chopstick-un e tij dhe të huazoj një chopstick nga ndonjëri nga fqinjët e tij. Kur një filozof përdor
dy chopsticks nuk i liron derisa e përfundon ngrënien. Shared data mes filozofëve janë pjata me oriz
(data set) dhe semaphore chopstick[5] të inicializuar me vlerën 1.
-Windows synchronization – përdor interrupt masks për të mbrojtur çasjen në resurse globale në
unirocessor sisteme, përdor spinlocks në multiprocessor sisteme,
-Linux synchronization – ofron semaphores, atomic integers, spinlocks dhe reader-writer version of
both. Në sistemet single CPU, spinlocks zëvendësohet me mundësimin apo pamundësimin e kernel
peemption.
-POSIX synchronization – POSIX API është në dispozicion të programerëve në user mode dhe ofron:
mutex locks, semaphores dhe condition variables. Përdoret në UNIX, Linux dhe macOS sisteme.
-Java synchronization – Java language dhe API e saj ofrojnë mbështetje të gjerë për thread
synchronization përmes: Java monitors, locks, semaphores dhe condition variables.

Deadlocks
Në multiprogramming, disa procese mund të garojnë për alokimin e një numri të caktuar të resurseve.
Kur një proces/thread kërkon resurset dhe ato nuk janë të lira në ato momente, procesi/thread hyn në
waiting state. Ndodh që një proces/thread që është në waiting state nuk e ndryshon më kurrë gjendjen
e tij, sepse resurset që ka kërkuar posedohen nga ndonjë proces tjetër dhe kjo situatë quhet deadlock.
(Psh. “Kur dy trena takohen në një udhëkryq, ata do të ndalen dhe nuk do të vazhdojnë derisa njëri prej
tyre të jetë larguar.”)

Më modin e operimit normal, një thread duhet të përdor një resurs vetëm në sekuencën:
1.Request – Thread e kërkon resursin dhe nëse nuk është i lirë (psh. mutex lock mbahet nga një thread
tjetër) pret derisa të lirohet.
2.Use – thread operon me resursin.
3.Release – thread e liron resursin.

Request dhe release të resursesve duhet të jenë system calls:


request(), release() – device
open(), close() – file
allocate(), free() – memory
wait(), signal() – semaphores
acquire(), release() – metax locks.

Për të kuptuar se si identifikohen dhe


menaxhohen deadlocks, fillimisht ilustrojmë
sesi mund të ndodh një deadlock në një
Pthread program duke përdorur POSIX mutex
locks. Funksioni pthread_mutex_init()
inicializon një unlocked mutex. Funksionet për
acquire dhe release të mutex locks janë
pthread_mutex_lock() dhe
pthread_mutex_unlock(). Deadlock ndodh kur thread i parë acquires mutex lock-un e pare, dhe thread i
dyte acquires mutex lockund e dyte. Threadi i parë duhet të pres që të lirohet mutex lock-u i dyte,
ndërsa threadi i dytë pret që të lirohet mutex lock-u i parë.

Deadlock ndodh nëse katër kushtet e mëposhtme në sistem njëkohësisht:


1.Mutual exclusion – të paktën një resurs duhet të jenë në nonsharable mode, ashtu që vetëm një
thread mund t’i çaset në të njejtën kohë. Nëse një thread tjetër e kërkon atë resurs ai duhet të pres deri
resursi të lirohet.
2.Hold and wait – thread duhet të posedoj të paktën një resurs dhe të jetë duke pritur për të marrë
resurse shtese që momentolisht i posedon një thread tjetër.
3.No preemption – resursi mund të lirohet vetëm vulnetarisht nga threadi i cili e posedon, pasi threadi
të ketë kryer taskun e tij.
4.Circular wait – ekziston një grup i threads ku A pret B, B pret C, C pret D, ndërsa D pret A.

Resource-allocation graph
Deadlocks mund të përshkruhen më saktë përmes grafit të drejtuar të quajtur system resource-
allocation graph. Ky graf ërbëhet nga nyjet dhe edges. Nyjet mud të jenë të dy llojeve:
1. T={T1,T2,…TN} – grupi i të gjithv threads aktiv në sistem.
2. R={R1,R2,…RN} – grupi i të gjithë resource types në sistem.

Një directed edge nga thread Ti tek resource type Rj shënohet Ti  Rj dhe tregon se threadi TI ka kërkuar
një instance të RJ resource type dhe po pret për atë resurs. Kjo directed edge quhet reqeuest edge.
Një directed edge nga resource type Rj tek threadi Ti shënohet Rj  Ti dhe tregon se një instancë e Rj
resource type i është alokuar thredit Ti.

Përshkrimi i grafit të dhënë:


-Grupet e threads, resurce types dhe edges
T={T1,T2,T3}
R={R1,R2,R3,R4}
E={T1  R1, T2  R3, R1  T2, R2  T1, R2  T2, R3  T3}

-Resource instances
R1 resource type një instancë.
R2 resource type dy instanca.
R3 resource type një instancë.
R4 resource type tri instanca.
-Threads state
Threadi T1 posedon një instancë të R2 resource type dhe është duke
pritur për një instancë të R1 resource type.
Threadi T2 posedon një instancë të R2 resource type dhe është duke
pritur për një instancë të R3 resource type.
Threadi T3 posedon një instancë të R3 resource type.

Nëse thread T3 kërkon një instancë të R2 resource type, krijohet gjendja e


deadlock.

Kur një graf nuk përmban rrathë, nuk ka deadlock. Në rastin tjetër, kur një graf ka rrathë, nëse secili
resurs ka vetëm një instancë ndodh deadlock, ndërsa nëse secili resurs ka disa instanca ka gjasa të
ndodh deadlock.

Tre metodat për trajtimin e deadlocks janë:


1.Injorimi dhe pretendimi se deadlocks nuk do të ndodhin asnjëherë në sistem. (Linux, Windows)
2.Përdorimi i një protokolli për parandalimin dhe evitimin e deadlocks, duke siguruar që sistemi nuk do
të hyjë asnjëherë në gjendje deadlock-u.
3.Mund të lejohet që një sistem të hyjë në gjendje deadlock-u, të detektohet dhe të zgjidhet. (Database)

Për tu sigururar që deadlock nuk do të ndodh asnjëherë, sistemi duhet të përdorë skemën deadlock
prevention apo skemën deadlock avoidance.
-Deadlock prevention – ofron një grup të metodave që sigurojnë që të paktën njëri nga kushtet (mutual
exclution, hold and wait, no peemption, circular wait) nuk mund të ndodh.
-Deadlock avoidace – kërkon që sistemit operativ t’i jepen informacione shtesë se cilat resurse mund t’i
kërkoj dhe përdor një thread gjatë ekzekutimit të tij. Modeli më i thjeshtë kërkon që secili proces të
deklaroj maksimumin e resurseve që mund t’i nevojiten. Deadlock avoidance algoritmi gjatë gjithë kohës
kontrollon resource-allocation state për tu siguruar që nuk ndodh circular-wait condition. Resource-
allocation state definohet nga numri i resurseve të lira dhe resurseve të alokuara, dhe maksimumin e
kërkesave të proceseve.

Safe state
Një gjendje konsiderohet safe nëse sistemi mund të alokoj resurset për secilin
thread (maksimunim e kërkuar) në mënyrë të tillë që të shmang deadlock-un.
Në rastet kur secili resource type ka vetëm një instancë përdoret resource-
allocation graph, ndërsa kur resource types kanë më shumë se një instancë
përdoret Banker’s algorithm.

Deadlock detection
Në sistemet të cilat nuk përfshijnë deadlock prevention dhe dedadlock avoidance algoritmet, mund të
ndodh deadlock. Sistemet e tilla duhet të ofrojnë një algoritëm që ekzaninon gjendjen e sistemit për të
ditur nëse ka ndodhur ndonjë deadlock dhe një algoritëm për recovery nga deadlock.

Recovery from deadlocks


Kur një detection algorithm përcakton se ekziston një deadlock, njofton operatorin se ka ndodhur një
deadlock dhe lejon që ai të mirret me të manualisht apo lejon që sistemi të bëhet recover automatikisht.
Dy teknika për të dalë nga deadlock janë:
1. Process and thread termination – ekzijtojnë dy mënyra për të eleminuar deadlock-un: terminimi i të
gjitha deadlocked proceseve dhe terminimi proceseve një nga një derisa të eleminohet deadlock cyrcle.
Disa faktor ndikojnë në zgjedhjen e procesit i cili duhet terminuar, si çfarë prioriteti ka procesi, për sa
kohë procesi është ekzekutuar dhe edhe sa kohë i duhet që ta përfundoj taskun, sa dhe cilat lloje të
resurseve procesi ka përdorur, sa resurse të tjera i duhen procesit për të përfunduar, sa procese të tjera
duhet të terminohen.
2.Resource preemtion – për të eleminuar deadlocks, duhet të përvetësohen resurset nga disa procese
dhe tu jepen proceseve tjera derisa të eleminohet deadlock cycle. Në këtë rast duhet të adresohen tre
çështje: zgjedhja e një viktime (cilat resurse prej cilave procese duhet të mirren), rollback (procesi të cilit
i merren resurset duhet të kthehet në një safe state dhe të refilloj ekzekutimin prej atij state-i) dhe
starviation (i njejti proces mund të zgjedhet si viktim vazhdimisht dhe nuk mund të arrij ekzekutimin e
tij, andaj duhet siguruar që një proces mund të jetë viktim vetëm për një numër të caktuar të herëve).

Main memory
Memoria është pjesë qendrore e operimit të sistemeve kompjuterike moderne. Memoria është array e
madhe e bytes, ku secili byte ka adresën e tij. CPU merr instruksionet nga memoria në bazë të vlerës së
program counter-it. Main memory dhe regjistrat e ndërtuar brenda secilës processing core janë e vetmja
general-purpose storage, së cilës CPU-ja mund t’i çaset direkt (CPU operon vetëm me të dhënat të cilat
janë në memorie). Cache vendoset në mes të main memory dhe regjistrave të CPU-së. Zgjedhja e një
memory management method për një sistem specifik varet nga disa faktor, sidomos nga dizajni
harduerik i sistemit.

Përpos shpejtësisë së çasjes në memorien fizike, ka rëndësi edhe


operimi i duhur me të. Për operim të duhur, duhet të mbrohet
sistemi operativ nga çasja e user processes dhe duhet të mbrohen
proceset nga njëra tjetra. Kjo gjë sigurohet nga hardueri, pasi
sistemi operativ zakonisht nuk intervenon mes CPU-së dhe çasjes
së saj në memorie. Secili proces duhet të ketë memory space të
ndarë. Për të ndarë memory spaces, duhet të ekzistojë aftësia për
të përcaktuar rangun e adresave të cilave procesi mund tu çaset
dhe të sigurohet që procesi u çaset vetëm atyre adresave. Kjo
mbrojtje ofrohet duke i përdorur dy regjistra: base register
(përmban adresën fizike më të vogël) dhe limit register
(specifikon madhësinë e rangut).
CPU-ja kontrollon çdo memory access të
gjeneruar në user mode për tu siguruar që
është mes base dhe limit për atë user. Çdo
tentim i ndonjë programi që ekzekutohet
në user mode për tu çasur në memorien e
sistemit operativ apo të users të tjerë
resulton me trap, që e trajton si fatal error.
Kjo skemë parandalon modifikimin e code
ose data structures të sistemit operativ apo
users të tjerë, nga një user program. Instruksionet për të bërë load base dhe limit registers janë
privileged dhe mund të ekzekutohen vetëm në kernel mode, dhe vetëm sistemi operativ ekzekutohet në
kernel mode, që bën që vetëm sistemi operativ të mund t’i bëjë load këta regjistra.

Një program rrin në disk si binary executable file dhe për ta ekzekutuar duhet të sillet në memorie dhe
të vendoset në context të procesit ku bëhet i gatshëm për ekzekutim nga CPU-të e lira.
Address binding i instructions dhe data me adresat memorike mund të bëhet në tri faza: compile time,
load time dhe execution time.

Adresa memorike që gjenerohet nga CPU-ja quhet


logical address (virtual address), ndërsa adresa që
shihet nga memory unit (ajo që bëhet load në
memory address register të memories) quhet
physical address. Grupi i të gjitha logical addresses të
gjeneruara nga një program quhet logical address
space, ndërsa grupi i të gjitha physical addresses të
gjeneruara quhet physical address space.
Mapimi në run-time prej virtual në physical adresses
bëhet nga një pajisje harduerike që quhet Memory
Management Unit (MMU). Ky mapim mund të bëhet në
disa mënyra. Base register gjatë mapimit quhet relocation
register. Vlera e relocation register i shtohet të gjithë
adresave të gjeneruara nga user proces në kohën kur
adresa dërgohet në memorie. (Psh. nëse base register
është në adresën 14000, çasja e user në lokacionin 346
mapohet në 14346.)

-Dynamic loading – i gjithë programi duhet të jetë në


memorie për tu ekzekutuar. Në dynamic loading një rutinë nuk bëhet load derisa të jetë thirrur dhe të
gjitha rutinat nbahen në disk në një relocatable load format. Për shkak që rutinat që nuk përdoren nuk
bëhen load ka përdorim më të mirë të memory-space. Avantazh i saj është se rutina bëhet load vetëm
kur nevojitet. Dynamic loading nuk kërkon special support nga sistemi operativ dhe është përgjegjësi e
përdoruesve të dizajnojnë programet e tyre ashtu që të shfrytëzojnë avantazhet e kësaj metode. Sistemi
operativ mund të ndihmoj përdoruesin duke ofruar library routines për të impementuar dynamic
loading.
-Dynamic linking – Dynamiclly Linked Libraries (DDLs) janë librari të sistemin që janë të lidhura me user
programs kur ato janë duke u ekzekutuar. Disa sisteme operative përkrahin vetëm static linking, në të
cilat libraritë e sistemit trajtohen si të gjitha object modules të tjera dhe kombinohen nga loader në
binary program image. Dynamic linking është i ngjajsëm me dynamic loading. Një avantazh tjetër i DDLs
është se këto librari mund të mund të ndahen mes shumë proceseve, ashtu që vetëm një instance e
DLLs është në main memory. Për këtë ardyet DDLs njihen edhe si shared libraries dhe përdoren
extensively in Windows dhe Linux sisteme.

Main memory mund të akomodoj edhe sistemin operativ edhe user programs. Memoria zakonisht
ndahet në dy particione: një për sistemin operativ dhe tjetra për user programs. Ne zakonisht duan disa
user programs të vendosen në memorie në të njejtën kohë, andaj duhet të shikohet sesi të alokojmë
memorien në dispozicion për proceset që presin të vendosen në memorie. Në contiguous memory
allocation, secili proces përfshihet ne një seksion të memories i puthitur me seksionin që përmban
procesin e ardhshëm.

Memory protection – mund të parandalojmë


pracesin t’i çaset memories e cila nuk i takon atij
duke kombinuar relocation register dhe limit
register. Kur CPU scheduler e zgjedh një proces
për ekzekutim, dispatcher bën load relocation
dhe limit registers me vlerat adekuate si pjesë e
context switch. Skema e reloaction register
ofron një mënyrë efektive që lejon madhësinë e
sistemit operativ të ndryshoj në mënyrë
dinamike.

Memory allocation – shkalla e multipragramming limitohet nga numri i particioneve. Në këtë variable
partiocion scheme, sistemi operativ mban një tabelë që tregon cilat pjesë të memories janë të lira e cilat
të zëna. Sistemi operativ mirëmban informacionet për particionet e alokuara dhe particionet e lira
(hole). Hole – e gjithë memoria është në dispozicion për user processes dhe konsiderohet si një block i
madh i memories së lirë. Kur arrin një proces i alokohet memoria nga hole mjaftueshëm për ta
akomoduar atë.

Dymanic storage allocation problem – janë tri strategji për përzgjedhjen e një frre hole nga seti i free
holes që janë në dispozicion:
-First-fit – alokon free hole të parë që ka hapsirë të mjaftueshme. Kërkimi ose fillon nga fillimi i
setit të holes ose nga locasioni në të cilin ka përfunduar first-fit search i kaluar.
-Best-fit – alokon hole më të vogël që ka hapësirë të mjaftueshme. Duhet të kërkohet në tërë
listën, nëse lista nuk është e renditur sipas madhësisë.
-Worst-fit – alokon hole më të madh që është në dispozicion. Duhet të kërkohet në tërë listën,
nëse lista nuk është e renditur sipas madhësisë.

First-fit dhe best-fit janë për nga shpejtësia dhe përdorimi i memories më të mira se worst-fit.

Fragmentimi është një problem i përgjithshëm që shfaqet kur duhet të menaxhohen blloqe të të
dhënave. Për shkak se proceset vendosen dhe largohen nga memoria, free memory space është e ndarë
në pjesë të vogla.
-External fragmentation – memory space totale është e mjaftueshme për të kënaqur një kërkesë
apo për të vendosur një proces në të, por nuk është contiguous (storage është e fragmentuar në numër
të madh të small holes) andaj nuk mund të përdoret.
-Internal fragmentation – memoria e alokuar është pak më e madhe se memoria e kërkuar, kjo
diferencë në madhësi është pjesë e brendshme e particionit por që nuk përdoret.

Varësisht nga sasia totale e memory storage dhe madhësia mesatare e proceseve, external
fragmentation mund të jetë problem i minor ose madhor.

Një zgjidhej për external fragmentation është compaction, i përzien (rivendos) përmbajtjet e memories
për të vendosur të gjithë free memory në një bllok të madh. Compaction është i mundshëm vetëm nëse
relocation është dinamik dhe kryhet në excecution time. Compaction algoritmi më i thjeshtë është të
zhvendosen të gjitha proceset nga njëri skaj i memories, të gjitha holes zhvendosen në shkajin tjetër
duke krijuar një large hole të memories së lirë.

Paging përdoret nga sistemet operative moderne për të menaxhuar memorien. Paging është teknikë e
menaxhimit të memories në të cilën address-space i procesit ndahet në blloqe me madhësi të njejta të
quajtura pages. Paging shmang external fragmentation dhe shmang problemin e blloqeve memorike me
madhësi të ndryshme. Ndan physical memory në blloqe me madhësi fikse të quajtura frames, ndërsa
ndan logical memory në blloqe me madhësi të njejta të quajtura pages. Për të ekzekutuar një program
me madhësi të n pages, duhet të gjenden n free frames dhe të vendoset programi. Krijohet një page
table për të përkthyer adresat logjike në adresa fizike. Kur përdoret paging, një adresë logjike ndahet në
dy pjesë: page number p (përdoret si
index në per-process page table) dhe
page offset d (është lokacioni të cilit i
referohet në frame).

Hapat që ndërmerr MMU për të


përkthyer logical address të gjeneruar
nga CPU-ja në physical address:
1. Nxjerr page number p dhe e përdor
atë si index në page table.
2. Nxjerr frame number f përkatës nga
page table.
3. Zëvendëson page number p në
logical address me frame number f.

Swaping ësht mekanizëm në të cilin një proces mund të


kaloj përkohësisht nga main memory në secondary
storage (disc) dhe e bën atë memorie të jetë e lirë për
proceset tjera. Më vonë sistemi e zhvendos përsëri
procesin nga secondary storage në main memory.
Swaping poashtu është një teknikë për memory
compaction. Rrol iin, rrol out, janë swaping variante që
përdoren për priority-based algoritmet, proceset me
low-priority largohen ndërsa proceset me hight-priority
vendosen në memorie dhe ekzekutohen. Koha totale që
nevojitet për swaping të proceseve përfshin kohën që
shpenzohet për të zhvendosur kompet procesin në secondary disc dhe vendosjen e tij prap në memorie,
popashtu edhe kohën që i duhet procesit që të mund të kalon përsëri në memorie.

You might also like