Professional Documents
Culture Documents
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.
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.
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
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.
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.
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.
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.
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.
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.
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
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ë).
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ë.
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.
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ë:
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.
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 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.
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.
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ë.
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.
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.
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.
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.
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.
-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.
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.
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.
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.
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.
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 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).