stst.elia.pub.rostst.elia.pub.ro/news/SO/TEME_SO_2010_11/STRU... · Web viewPlanificatorul de...

130
UNIVERSITATEA POLITEHNICA BUCUREȘTI FACULTATEA DE ELECTRONICĂ, TELECOMUNICAȚII ȘI TEHNOLOGIA INFORMAȚIEI S S TRUCTURA TRUCTURA S S ISTEMELEOR ISTEMELEOR DE DE O O PERARE PERARE W W INDOWS INDOWS ȘI ȘI L L INUX INUX Profesor Coordonator, Ștefan Stăncescu

Transcript of stst.elia.pub.rostst.elia.pub.ro/news/SO/TEME_SO_2010_11/STRU... · Web viewPlanificatorul de...

Universitatea Politehnica București

Facultatea de Electronică, Telecomunicații și Tehnologia Informației

Structura Sistemeleor de Operare Windows și Linux

Profesor Coordonator,

Ștefan Stăncescu

Anul Universitar 2010 – 2011

Cuprins

Capitolul 1

Structuri de bază ale fiecărui sistem de operare în parte: concepte generale, structura nucleului (Călin Gabriel, 432A)

Pagina 3

Capitolul 2

Nivelul de abstractizare al hard-ului (Bucurică Mihai, 432A)

Pagina 13

Capitolul 3

Interpretoare de comenzi din Linux (Bălănescu Diana, 432A)

Pagina 16

Capitolul 4

Comparație interfețe (Vasile Ioana Iuliana, 423A)

Pagina 29

Capitolul 5

Biblioteca apelurilor de sistem pentru Windows și Linux (Dumitru – Guzu Mădălin, 433A)

Pagina 43

Capitolul 6

Win32 API și registrul de informații pentru Windows (Hulea Răzvan Florin, 433A)

Pagina 82

Capitolul 1

Structurile de bază ale fiecărui sistem de operare

în parte: concepte generale, structura nucleului

Călin Gabriel, 432A

Sistemul de operare este un program care are rolul de a gestiona dispozitivele hardware ale unui calculator. De asemenea, el oferă un nivel de bază pentru aplicaţii, acţionând ca un intermediar între utilizator şi hardware.

Sistemele de operare sunt extrem de variate, în funcţie de sarcinile pe care trebuie să le îndeplinească. De exemplu, sistemele de operare ale serverelor sunt concepute pentru a optimiza consumul de energie al componentelor hardware. Sistemele de operare ale calculatoarelor personale (PC) trebuie să permită rularea unor aplicaţii complexe, de la jocuri până la aplicaţii comerciale. Cele ale telefoanelor mobile trebuie să ofere o interfaţă care să permită accesarea rapidă a aplicaţiilor. Se observă deci că unele sisteme de operare sunt concepute pentru a fi comode utilizatorului, altele pentru a fi eficiente iar altele pentru a realiza o combinaţie între acestea.

Istoricul sistemelor de operare

Primul calculator digital a fost conceput de Charles Babbage, un matematician englez, la începutul secolului XIX. Acesta era în totalitate mecanic, fiind extrem de lent. Nu s-a pus problema existenţei unui sistem de operare pe o astfel de maşină.

După aproape un secol, datorită necesităţilor impuse de cel de-al doilea război mondial, a apărut primul calculator electronic. Componentele centrale ale acestuia erau tuburile cu vid. Din acest motiv aceste calculatoare erau uriaşe iar folosirea lor continuă ducea la o supraîncălzire a tuburilor, acestea arzându-se şi trebuind a fi înlocuite. Programarea lor se făcea în limbajul maşină. Nici pentru acestea nu a existat un sistem de operare.

În 1955, tranzistoarele au fost introduse în SUA. Problemele generate de folosirea tuburilor cu vid au dispărut. Din acest motiv, costul calculatoarelor a scăzut. Au apărut primele limbaje de programare: limbajul de asamblare, limbajul FORTRAN, care au simplificat sarcina programatorilor. La începutul anilor ’60, multe companii au început să îşi prevadă calculatoarele cu sisteme de operare. Acestea erau însă sisteme primare, care se preocupau în primul rând cu eficientizarea transmiterii datelor. Compania numită Burroughs a fost printre primele companii care au produs un sistem de operare care avea facilităţi precum cele ale sistemelor de operare din prezent. Acesta se numea Master Control Program (MCP) şi implementa multiprogramarea (execuţia mai multor programe simultan), multiprocesarea (controlul mai multor procesoare de către acelaşi sistem de operare) şi memoria virtuală (mărimea programului putea fi mai mare decât memoria disponibilă).

În 1964, IBM a lansat seria de calculatoare System/360. Iniţial, IBM a plănuit să furnizeze doar un singur sistem de operare pentru toate calculatoarele din această familie. Această abordare s-a dovedit a fi dificilă deoarece sistemele de operare care rulau eficient pe un sistem mai mic nu puteau gestiona eficient resursele pe un sistem mai mare şi invers. De aceea, IBM a lansat patru sisteme de operare. Principalele facilităţi ale acestora erau: folosirea circuitelor integrate care au redus costul şi mărimea calculatoarelor, divizarea timpului care îmbunătăţea conceptul de multiprogramare prin acordarea de priorităţi diferitelor procese.

În anii ’70 apare sistemul de operare Unix, care a fost scris în proporţie de 90% în limbajul de programare C şi 10% în limbajul de asamblare. Aceasta a facilitat portarea sistemului de operare. De aceea, mulţi producători hardware au preferat să porteze sistemul Unix decât să scrie un nou sistem de operare de fiecare dată.

După apariţia circuitelor de integrare pe scară largă (LSI), mii de tranzistoare au putut fi încapsulate pe o arie restrânsă a unui cip de silicon. Astfel a început era microcalculatoarelor şi a calculatoarelor personale. Control Program for Microcomputers (CP/M) a fost primul sistem de operare pentru platforma microcalculatorelor. A fost dezvoltat pentru Intel 8080 în 1974. În 1981 apare sistemul de operare MS-DOS care a devenit foarte popular după dezvoltarea unor programe precum Database Systems (dBase) sau Word Processing (WORDSTAR). De asemenea, acest sistem de operare a permis dezvoltarea unor compilatoare pentru limbajele de programare de nivel înalt precum Basic, Cobol şi C. Ulterior, Microsoft a lansat sistemele de operare Xenix şi OS/2 pentru procesoarele Intel 286 şi Intel 386.

În 1991, studentul finlandez Linus Torvalds a pus bazele sistemului de operare Linux. Acesta este scris în C şi în limbajul de asamblare şi are la baza principiile sistemului de operare Unix. În prezent, este cel mai folosit sistem de operare pentru servere. De asemenea, el rulează pe cele mai rapide 10 supercalculatoare din lume.

Microsoft a lansat primul sistem de operare cu interfaţă grafică (GUI) Windows 1.0 în 1985. Acesta includea programe precum Calculator, Calendar, Paint. În anii care au urmat, Microsoft a lansat noi sisteme de operare, cele mai cunoscute fiind Windows XP sau recentul Windows 7. În ianuarie 2011, variante ale sistemului de operare Windows erau prezente în peste 91% dintre calculatoarele din întreaga lume.

Rolul unui sistem de operare

Un calculator poate fi divizat în patru componente: dispozitivele hardware, sistemul de operare, aplicaţiile şi utilizatorii.

Dispozitivele hardware sunt reprezentate de unitatea centrală de procesare (UCP), memoria şi dispozitivele de intrare-iesire (I/O). Ele reprezintă resursele de bază ale sistemului. Aplicaţii precum editoarele de text, editoarele grafice, browserele web, jocurile definesc modul în care aceste resurse sunt folosite pentru a satisface nevoile utilizatorului. Rolul sistemului de operare este de a controla şi de a coordona modul în care sunt folosite dispozitivele hardware în diverse aplicaţii, pentru diverşi utilizatori. Se observă, deci, că sistemul de operare nu are o funcţie utilă în sine, ci doar asigură un mediu în care alte aplicaţii pot lucra.

În ceea ce priveşte rolul sistemelor de operare, există două puncte de vedere:

· Punctul de vedere al utilizatorului

Există mai multe tipuri de utilizatori, iar rolul sistemelor de operare trebuie să fie dependent de necesităţile acestora.

Majoritatea utilizatorilor stau în faţa calculatorului personal, având drept scop maximizarea muncii pe care o execută. Un astfel de sistem este destinat unui singur utilizator, care are monopol asupra resurselor sistemului. În acest caz, sistemul de operare este construit astfel încât să fie uşor de folosit, cu puţină atenţie acordată performanţei şi fără atenţie acordată utilizării resurselor.

În alte cazuri, un utilizator poate folosi un terminal conectat la un calculator central. Alţi utilizatori pot folosi acelaşi calculator prin alte terminale. Ei împart resursele aceluiaşi calculator şi îşi pot transmite informaţii unul altuia. În acest caz, rolul sistemului de operare este de a maximiza folosirea resurselor şi de a se asigura că niciun utilizator nu este dezavantajat faţă de altul.

Alţi utilizatori folosesc o staţie de lucru conectată la o reţea formată din alte staţii de lucru şi servere. Aceşti utilizatori au la dispoziţie atât resurse dedicate lor cât şi resurse comune precum fişierele aflate pe un server. De aceea, sistemul de operare trebuie să realizeze un compromis între posibilitatea de utilizare personală şi folosirea resurselor.

Recent, dispozitivele portabile au devenit din ce în ce mai folosite. Deoarece ele funcţionează cu baterie, un rol important pe care îl au sistemele de operare ale acestora este de a maximiza performanta raportată la durata de viaţă a bateriei.

Există şi calculatoare care nu necesită deloc sau foarte rar intervenţia umană, de exemplu calculatoarele automobilelor. În acest caz, sistemul de operare este conceput pentru a funcţiona autonom.

· Punctul de vedere al sistemului

Din punctul de vedere al calculatorului, sistemul de operare este programul care intră cel mai mult în contact cu dispozitivele hardware. Sistemul de operare poate fi văzut ca un repartitor de resurse. El administrează resurse precum spaţiul de memorie, de depozitare a fişierelor, dispozitivele de intrare/ieşire etc. El trebuie să decidă cum alocă resursele diferitelor aplicaţii şi utilizatori astfel încât funcţionarea calculatorului să fie eficientă.

Un alt punct de vedere se referă la nevoia de a controla diverse dispozitive de intrare/ieşire şi programe ale utilizatorilor. Sistemul de operare este un program de control, care administrează execuţia programelor astfel încât să nu apară erori sau o folosire neadecvată a calculatorului.

Se observă că nu există o definiţie clară a ceea ce reprezintă un sistem de operare. Există însă o definiţie general acceptată:

Sistemul de operare reprezintă acel program care rulează tot timpul pe calculator (numit kernel), restul fiind programe de sistem şi aplicaţii.

Următoarea figură evidenţiază această definitie.

Kernel-ul Linux

Kernel-ul Linux reprezintă nucleul acestui sistem de operare. Codul acestuia a fost scris de la zero, special pentru acest scop. Multe din programele software-ul care sunt suportate de acest kernel nu sunt scrise special pentru Linux însă, ci sunt compatibile cu mai multe sisteme UNIX. Principalele librării provin din proiectul GNU, însă acestea au fost îmbunătăţite de-a lungul timpului de către comunitate. Comunitatea Linux este responsabilă şi cu menţinerea Standardelor de Ierarhizare a Fişierelor de Sistem (File System Hierarchy Standard) care au rolul de a păstra compatibilitatea cu diversele componente de sistem. Acestea determina în ce directoare trebuie salvate librăriile, fişierele de configurare şi alte fişiere de sistem.

Ca majoritatea sistemelor UNIX, Linux conţine trei componente principale:

· Kernel

· Librării de sistem

· Utilitare de sistem

Kernel-ul este resonsabil cu menţinerea tuturor abstractizărilor importante ale sistemului de operare, cum ar fi procesele sau memoria virtuală. Codul kernel-ului este executat într-un mod de lucru privilegiat, având acces la toate resursele fizice ale sistemului. Acest mod este denumit modul kernel.

Spre deosebire de alte sisteme de operare, kernel-ul Linux este creat ca un singur fişier binar, monolitic. Principalul motiv este acela de a spori performanţa. Deoarece întregul cod care compune kernel-ul şi toate structurile de date se găsesc în acelaşi spaţiu de adresă, nu este necesară o schimbare de context atunci când un proces apelează o funcţie de sistem sau când se activează o întrerupere hardware. Prin întregul cod kernel se înţeleg inclusiv driverele componentelor, sistemul de fişiere sau codul de lucru cu reţeaua.

Deşi toate componentele kernel-ului se găsesc la aceeaşi adresă, acesta este modular. El poate încărca şi descărca module în mod dinamic.

Kernel-ul asigură funcţionalitatea necesară pentru a rula procese şi are prevăzute servicii de sistem pentru a acorda acces la resursele hardware. Spre deosebire de alte sisteme UNIX, interfaţa vizibilă de către aplicaţiile în desfăşurare nu este susţinută direct de către kernel. Aplicaţiile fac cereri librăriilor de sistem, care la rândul lor apelează serviciile sistemului de operare.

Kernel-ul Linux este capabil să încarce şi să descarce secţiuni de cod, numite module, la cerere. Acestea rulează în modul de lucru privilegiat, deci au acces la toate resursele hardware ale calculatorului. De obicei, modulele kernel implementează un driver, un sistem de fişiere sau un protocol de reţea. Aceasta structurare sub formă de module se datorează faptului că sistemul Linux este gratis, deci oricine poate scrie cod kernel. Este necesară o repornire a sistemului pentru a se încărca noile funcţionalităţi. Totuşi, dacă se dezvoltă un driver, recompilarea întregului kernel din această cauză ar fi greoaie. Datorită organizării modulare, este suficientă compilarea modulului creat iar apoi includerea lui în restul kernel-ulului. În plus, în felul acesta utilizatorii pot distribui modulele scrise.

Suportul pentru module are trei componente:

· Administratorul de module

· Înregistrarea de drivere

· Un mecanism de rezolvare a conflictelor

· Administratorul de module

Încărcarea unui modul necesită mai mult decât simpla încărcare a conţinutului său binar în memoria kernel. Sistemul trebuie să se asigure că orice referinţe pe care modulul le face la simboluri kernel sau puncte de intrare sunt actualizate astfel încât să indice către locaţiile corecte din spaţiul de adresa kernel. Linux face acest lucru în două etape: administrarea secţiunilor codului modulului în memoria kernel şi manevrarea simbolurilor pe care modulele au voie să le refere.

Linux păstrează un tabel de simboluri în kernel. Acest tabel nu conţine întreg setul de simboluri definite în kernel. Un simbol trebuie să fie exportat în mod explicit de către kernel. Acest set de simboluri exportate reprezintă interfaţa prin care un modul interactionează cu kernel-ul. Deşi exportarea de simboluri dintr-o funcţie kernel necesită o cerere specială din partea programatorului, importarea lor într-un modul se face simplu. Persoana care scrie un modul trebuie doar să folosească legăturile externe ale limbajului C. Legăturile externe care sunt referentiate, dar nu sunt declarate în modul sunt marcate ca nerezolvate în fişierul binar produs de către compilator. Când modulul este încărcat în kernel, un utilitar de sistem scanează aceste referinţe nerezolvare. Simbolurile care trebuie rezolvate sunt căutate în tabelul de simboluri şi adresele acestor simboluri sunt actualizate în codul modulului. Abia apoi, dacă toate referinţele au fost rezolvate, modulul este încărcat în kernel.

Încărcarea modulului se face în două etape. Mai întâi, se realizează o cerere către kernel pentru a rezerva o arie continuă de memorie kernel virtuală pentru modul. Kernel-ul întoarce adresa zonei de memorie alocate iar această adresă este folosită pentru mutarea codului maşină al modulului la respectiva adresă. Un al doilea apel la sistem transmite modulul şi un eventual tabel de simboluri pe care modulul vrea să îl exporte către kernel. Apoi, tabelul de simboluri al kernel-ului este actualizat cu noile simboluri pentru o viitoare folosire a lor de către alte module.

O altă componentă a administratorului de module o reprezintă solicitantul de module. Printr-o conexiune existentă între kernel şi acest modul, kernel-ul informează despre cererile de drivere, de fişiere de sistem sau de servicii de reţea care nu sunt încărcate şi dă administratorului de module posibilitatea de a încărca aceste module. De asemenea, administratorul de module verifica regulat dacă modulele încărcate dinamic sunt încă în folosinţă şi le descarcă dacă nu mai sunt necesare.

· Înregistrarea de drivere

După ce un modul este încărcat, el rămâne într-o zonă izolată de memorie. Kernel-ul păstrează tabele dinamice cu toate driverele cunoscute şi permite rutine prin care driverele pot fi adăugate sau şterse din acest tabel.

Un modul poate înregistra multe tipuri de drivere şi poate înregistra mai mult de un driver dacă este necesar. De exemplu, pentru un dispozitiv, driver-ul sau poate înregistra două mecanisme de accesare a respectivului dispozitiv. Tabelele de înregistrare includ următoarele componente:

-driverele componentelor care includ driverul imprimantei, al mouse-ului, hard-diskului sau al plăcilor de reţea.

-sistemele de fişiere; pot implementa un format pentru stocarea fişierelor pe un disc, dar pot fi şi sisteme de fişiere de reţea, precum NFS, sau un sistem de fişiere virtual cum ar fi sistemul de fişiere „/proc”.

-protocoalele de reţea; se pot implementa protocoale de reţea complete precum IPX sau, de exemplu, doar nişte reguli pentru un firewall.

-formate binare; specifică o metodă de recunoaştere şi încărcare a unui nou tip de fişier executabil.

· Rezolvarea conflictelor

Sistemul Linux poate funcţiona pe o varietate mare de calculatoare. Acestea pot avea nenumărate configuraţii, având un număr mare de drivere posibile pentru dispozitive precum plăci de reţea, plăci de sunet sau plăci video. Problema devine mai dificilă atunci când sunt suportate drivere organizate modular. Linux asigură un mecanism de rezolvare a conflictelor pentru a soluţiona accesul la diverse resurse hardware. El are următoarele funcţii:

-Previne modulele să intre în conflict datorită accesului la o resursă hardware

-Previne ca autoverificarea (drivere care auto-detectează configurarea dispozitivului) să interfereze cu driverele deja existente

-Rezolva conflictele datorate încercării mai multor drivere să acceseze acelaşi dispozitiv hardware

Kernel-ul deţine o listă de resurse hardware alocate, cum ar fi porturile de intrare/ieşire sau liniile de întrerupere. Când un driver vrea să acceseze o astfel de resursă, trebuie mai întâi să rezerve acea resursă în baza de date a kernel-ului. Dacă aceasta rezervare dă greş (în cazul în care resursa nu există sau este deja folosită), modulul este cel care decide ce va face în continuare.

Kernel-ul Windows

Sistemul de operare Windows a avut, de-a lungul timpului, două variante de kernel.

Prima variantă o reprezintă kernel-ul sistemelor de operare Windows 95, 98 şi ME. Acesta este monolitic şi necesită suportul MS-DOS pentru a rula. Conţine câteva fişiere critice cum ar fi: IO.SYS, MSDOS.SYS, COMMAND.COM, WIN.COM, LOGO.SYS care păstrează diverse informaţii, cum ar fi tratarea rutinelor de intrare/ieşire sau încărcarea interfeţei grafice a sistemului de operare. De asemenea, sistemul poate conţine şi fişierele numite CONFIG.SYS sau AUTOEXEC.BAT, dar acestea nu sunt critice deoarece există nişte setări implicite în cazul în care ele lipsesc. Secvenţa de boot a sistemului are loc în următoarea ordine:

· Se încarcă IO.SYS, folosind informaţiile stocate în MS-DOS.SYS

· Comenzile CONFIG.SYS sunt analizate de IO.SYS

· Se încarcă COMMAND.COM, care permite rularea AUTOEXEC.BAT, dacă acesta există

· WIN.COM încarcă interfaţă grafică (dacă aceasta nu este dezactivată).

A doua variantă o reprezintă kernel-ul sistemelor de operare Windows 2000, XP, Vista şi 7 (care fac parte din familia denumită Windows NT). Ne vom referi în continuare la structura sistemului de operare Windows XP.

Arhitectura sistemului Windows XP conţine mai multe module organizate pe straturi. Principalele straturi sunt HAL (Hardware Abstraction Layer – Nivelul de Abstractizare al Hard-ului), kernel-ul şi un nivel executiv. Toate acestea rulează într-un mod de lucru protejat, fiind ascunse utilizatorului. Există apoi un strat care conţine o serie de servicii şi subsisteme care rulează în modul utilizator. Există două categorii de subsisteme: cele de mediu, care emulează diferite sisteme de operare şi cele de protecţie care asigură securitatea sistemului.

Schema bloc a arhitecturii Windows XP este prezentată în următoarea figură:

Kernel-ul Windows XP asigură nivelul de bază pentru nivelul executiv şi pentru subsisteme. Kernel-ul este prezent mereu în memorie şi execuţia sa nu este niciodată oprită. El are următoarele responsabilităţi majore: planificarea thread-urilor, implementarea primitivelor de sincronizare, administrarea numărătoarelor, întreruperile software şi tratarea excepţiilor.

Planificarea thread-urilor

Într-un proces pot exista unul sau mai multe thread-uri, fiecare fiind controlat de către kernel. Fiecare thread are propria stare de planificare care include prioritatea acestuia, afinitatea către un anumit procesor şi informaţii despre folosirea CPU.

Există şase stări posibile pentru un thread: gata de rulare, în standby, în curs de rulare, în aşteptare, în tranziţie şi terminat.

Planificatorul de thread-uri foloseşte o schemă cu 32 de nivele de prioritate pentru a determina ordinea de execuţie a thread-urilor. Priorităţile se împart în două clase: clasa variabilă care conţine thread-uri cu priorităţi între 0 şi 15 şi clasa în timp real cu priorităţi între 16 şi 31. Planificatorul foloseşte o coadă pentru fiecare nivel de prioritate şi apoi traversează aceste cozi de la cea cu nivelul cel mai ridicat de prioritate până la cel mai scăzut până când găseşte un thread în starea gata de rulare. Dacă un thread are o afinitate pentru un anumit procesor dar procesorul nu este disponibil, planificatorul îl sare şi caută un alt thread în starea gata de rulare care poate rula pe procesoarele disponibile. Dacă niciun thread nu este gata de a fi executat, planificatorul executa un thread special numit thread-ul inactiv.

Planificarea are loc atunci când un thread intra în starea gata de rulare sau în starea de aşteptare, când un thread se termină sau când o aplicaţie schimbă nivelul de prioritate al unui thread sau afinitatea pe un anumit procesor. Dacă un thread cu o prioritate mai înaltă devine gata de rulare în timp ce un thread cu o prioritate mai redusă este în execuţie, thread-ul cu prioritate mai scăzută este înlocuit. Windows XP nu este un sistem de operare în timp real ferm deoarece nu garantează că un thread în timp real îşi va începe execuţia într-o anumită limita de timp.

Implementarea primitivelor de sincronizare

Cele mai importante structuri de date ale sistemului de operare sunt administrate ca obiecte prin diverse facilităţi precum alocarea, numărarea referinţelor şi securitatea. Obiectele de coordonare controlează coordonarea şi sincronizarea în sistem. De exemplu, obiectele eveniment sunt folosite pentru a înregistra apariţia unui eveniment şi pentru a-l sincroniza cu o anumită acţiune. Evenimentele de notificare anunţa toate thread-urile în astepare şi evenimentele de sincronizare anunţă un singur thread în aşteptare. Obiectele de tip numărător pot fi folosite pentru planificarea periodică a unei anumite acţiuni.

Întreruperile software

Sunt implementate două tipuri de întreruperi software: asincrone şi de întârziere. Cele asincrone întrerup un thread în execuţie şi cer execuţia unei proceduri. Ele sunt folosite pentru a începe execuţia unui thread sau pentru a termina procese. Întreruperile de întârziere sunt folosite pentru a suspenda procesarea unei întreruperi. Ele mai sunt folosite şi atunci când un numărător expiră sau pentru a opri execuţia unui thread la finalul intervalului de timp alocat.

Tratarea excepţiilor

Kernel-ul asigură traterea excepţiilor. Acestea pot fi: încălcarea accesului la memorie, depăşirea valorii maxime a unui tip de variabilă, împărţirea la zero, intructiuni nepermise etc. Tratarea excepţiilor se face de către coordonatorul de excepţii din kernel. Acesta creează o înregistrare care conţine motivul excepţiei şi caută un mod de a trata respectivă întrerupere. Dacă nu se găseşte o metodă de tratare a excepţiei, se generează o eroare de sistem netratabilă iar utilizatorului îi apare celebrul ecran albastru.

Bibliografie Capitol 1:

· Silberschat & Galvin – Operating System Concepts 7th edition

· Achyut S Godbole – Operating systems

· D. M. Dhamdhere – Operating Systems: A Concept-based Approach

· M. Naghibzadeh – Operating System Concepts and Techniques

· http://en.wikipedia.org/wiki/Operating_system

· http://en.wikipedia.org/wiki/Linux_kernel

· http://en.wikipedia.org/wiki/Architecture_of_Windows_9x

Capitolul 2

Nivelul de abstractizare al hardului

Bucurică Mihai, 423A

Un strat de abstractizare (sau nivel de abstractizare) este o modalitate de a ascunde detaliile de implementare a unui set particular de funcţionalitate. Modele de produse software care utilizează straturi de abstractizare includ modelului OSI 7 - strat pentru protocoale de reţea de computere, grafica OpenGL şi fluxul de octeţi de intrare / ieşire (I / O), model provenit de la Unix şi adoptat de MSDOS, Linux, şi cele mai moderne sisteme de operare.

În sistemul de operare Unix, cele mai multe tipuri de operaţiuni de intrare şi ieşire sunt considerate a fi fluxuri de octeţi cititi dintr-un dispozitiv sau scrisi într-un dispozitiv. Acest model de flux de octeţi este folosit pentru fişierul I / O, socket I / O, şi terminal I / O pentru a asigura independenţa dispozitivului. În scopul de a citi şi scrie la un dispozitiv la nivelul cererii, programul apelează o funcţie pentru a deschide dispozitivul care poate fi un dispozitiv real, cum ar fi un terminal sau un dispozitiv virtual, sau un port de reţea sau un fişier într-un sistem de fişiere. Caracteristicile dispozitivului fizic sunt mediate de sistemul de operare, care la randul sau, prezinta o interfaţa abstracta care permite programatorului sa citeasca şi sa scrie octeţi de la / la aparat. Sistemul de operare efectueaza apoi transformarea necesara sa citeasca şi sa scrie fluxul de octeţi la dispozitiv. Majoritatea bibliotecilor grafice cum ar fi OpenGL ofera un model grafic abstract ca o interfaţa. Biblioteca este responsabilă pentru traducerea comenzilor furnizate de programator în comenzi specifice de dispozitiv necesare pentru a desena elementele grafice şi obiecte. Comenzile de dispozitiv specifice pentru un plotter sunt diferite de comenzile pentru un monitor CRT, dar biblioteca grafica ascunde punerea în aplicare şi detaliile dependente de dispozitiv, oferind o interfaţă abstracta care oferă un set de primitive, care sunt în general utile pentru desenarea obiectelor grafice.

În informatică, un nivel de abstractizare este o generalizare a unui model sau algoritm, departe de orice punere în aplicare specifica . Frecvent straturi de abstractizare pot fi compuse într-o ierarhie de niveluri de abstractizare. Model de reţea ISO-OSI cuprinde şapte straturi de abstractizare. Fiecare strat al modelului de reţea OSI ISO încapsulează şi se adresează unui segment diferit de nevoile de comunicare mult digitale, reducând astfel complexitatea soluţiilor de inginerie asociate.

Nivelul de abstractizare al hardului sau pe scurt HAL este un modul kernel incarcabil(Hal.dll) care ofera interfata de nivel scazut la platforma hardware pe care ruleaza Windows. El ascunde detaliile dependente de hardware cum ar fi interfete I/O, controllere de intreruperi si mecanismele de comunicatie multiprocesor.Astfel HAL poate fi considerat un driver pentru placa de baza.

Putem porta hardul cu Windows si codul kernel inglobat la o varietate mare de procesoare, cu memorii diferite, pe scurt la foarte multe sisteme cu configuratii diferite fara a afecta setul de instructiuni pe aceste sisteme.

De exemplu , statiile de lucru SGI Intel bazate pe arhitectura x86 nu au fost IBM PC compatibile, dar datorita HAL, Windows NT a fost capabil sa ruleze pe ele. BSD, Mac OS X, Linux, CP / M, DOS, Solaris, şi alte sisteme portabile de operare au, de asemenea, un HAL, chiar dacă nu este explicit desemnată ca atare. Unele sisteme de operare, cum ar fi Linux, au capacitatea de a insera o în timp ce rulează, ca Adeos.

Sistemul de operare NetBSD este cunoscut ca avand un strat de abstractizare hardware curat, care ii permite sa fie extrem de portabil.Ca parte a acestui sistem sunt UVM / PMJP , bus_space , bus_dma şi alte subsisteme.

UVM este sistem de memorie virtuala care gestioneaza accesul la memoria calculatorului. Are doua kernel-uri : pagedaemon si Swapper. Pagedaemon intra in actiune atunci cand memoria fizica devine limitata, sau mai bine spus ocupata. Acesta scaneaza memoria fizica de paginare si elibereaza memoria care nu a fost recent utilizata.

Un exemplu extrem de HAL poate fi gasit in arhitecturile System/38 si AS/400. Majoritatea compilatoarelor pentru aceste sisteme genereaza un cod masina foarte abstract, LIC(Licensed Internal Code) care traduce codul virtual masina intr-un cod nativ pentru procesor.

Sistemele de operare care au definite un HAL sunt foarte portabile de la hard la hard. Este mai ales important acest lucru pentru sisteme care ruleaza pe o multime de platforme.

Driverele din Windows nu manipuleaza hardware direct ci apeleaza functii din HAL , scrise in C, sau C++, si prin urmare prin utilizarea buna a rutinelor HAL, pot fi portate in cod sursa pe orice CPU suportate de Windows.

Tipuri de drivere:

· Drivere pentru dispozitive hardware care scriu sau citesc un dispozitiv fizic din retea.

· Drivere I/O

· Drivere filtru de sistem de fisiere cum ar fi cele care fac mirroring pentru diskuri(o copie a unui disk ce se gaseste pe un disk separat si se foloseste pentru backup)

· Drivere de protocol cum ar fi: TCP/IP, IPX/SPX

· Drivere de filtrare a fluxului kernel pentru realizarea de procesare video si audio.

Daca vrem sa vizualizam HAL din windows se deschide fisierul driver.cab in folderul specific sub \windows\Driver Cache.(exemplu : \Windows\Driver Cache\i386\Driver.cab ). Se cauta fisiere care incep cu “HAL” si o sa se observe fisiere de genul: hal.dll(PC standard), halacpi.dll, halapic.dll, halmps.dll(PC multiprocesor), etc.

Software pentru HAL

HAL a fost un soft pentru a asigura nivelul de abstractizare al hardului pentru sistemele Unix. Tinta lui era sa ajute aplicatiile desktop sa descopere si sa foloseasca hardul host-ului printr-un simplu , portabil si abstract API, fara a tine seama de arhitectura sistemului.

HAL a fost creat de Havoc Pennington , dar acum este un program de tip freedesktop.org, fiind o parte cheie a GNOME AND KDE Desktop environments. Este un soft gratis, sub licenta duala a GNU General Public License si Academic Free License. Sta la baza conceptului de kernel al Windows NT , care se ocupa cu diverse functionalitati , printre care si rutinele de intreruperi.

In mod traditional, sistemul kernel a fost responsabil sa asigure interfata abstracta catre hardware pe sistemul care rula. Aplicatiile foloseau interfata de comunicare a sistemului , sau controlele I/O . Totusi in ultima vreme, hardware a crescut in complexitate si abstractizarea asigurata de kernelele Unix nu mai tineau pasul. Astfel s-a ajuns la concluzia ca trebuie reimplementat softul.

Unele dispozitive aveau nevoie de privilegiu pentru a putea rula ca de exemplu unele aplicatii ca “wireless networks” cereau permisiunea de a se loga numai daca userii erau conectati. Astfel s-a ajuns la folosirea unor seturi binare , sau rularea serviciilor daemon sa asigure accesul propriu si privilegiat cu parole.

Aplicatiile comunica cu HAL prin mecanisme de tip D-Bus IPC , care abstractizeaza hardul prin mecanisme obiect orientate. Fiecare dispozitiv logic de tip hard este considerat a fi un obiect D-Bus, iar adresa sa este folosita ca identificator unic. Dispozitivele includ abstractizari ca partitionarea diskului si vizualizarea retelelor wireless.

A fost reimplementat un nou soft , Device Kit , care se dorea sa inlocuiasca anumite aspecte ale HAL, dar in martie 2009, s-a renuntat la el in favoarea adaugarii codului udev ca un fel de update(package).

Bibliografie Capitol 2

· Operating System Concepts - "Silberschatz"

Capitolul 3

Interpretoarele de comenzi din Linux

Bălănescu Diana, 432A

Introducere

Interpretorul de comenzi este un program care realizează o interfaţă între utilizator şi sistemul de operare, interfaţă care preia comezile utilizatorului şi le transmite sistemului de operare spre execuţie. Pentru Unix există mai multe interpretoare de comenzi, selectabile de către utilizator. Fiecare interpretor acceptă un limbaj specific, astfel că fișierele de comenzi care pot fi scrise diferă în funcție de acest limbaj. Ca terminologie, in limba engleză interpretorul de comenzi mai este numit shell.

Shell-ul este un program utilitar ce este pornit în momentul conectării utilizatorului la sistem, oferind posibilitatea utilizatorilor să interacţioneze cu kernelul prin interpretarea comenzilor introduse fie direct de la tastatură, fie prin intermediul unui fişier de comenzi shell, numit fişier shell-script, sau, pe scurt, script.

Shell-ul oferă o modalitate ușoară pentru utilizatori de a gestiona programe, fişiere și de asemenea procesele care rulează pe sistemul Linux. Miezul shell-ului este promptul de comandă. Acesta reprezintă partea interactivă a shell-ului. El permite introducerea de comenzi text, interpretează apoi comenzile, iar apoi le execută în kernel.

În momentul conectării la sistemul UNIX shell-ul îşi ia „atribuţiile” în primire, îndeplinindu-şi rolul de interpretor al comenzilor introduse de către utilizator şi care trebuie „înţelese” de către kernel (este echivalentul interpretorului DOS command.com). În momentul introducerii unei comenzi, interpretorul de comenzi shell execută următorii paşi:

(1) interpretează sintactic linia de comandă introdusă;

(2) interpretează metacaracterele, redirectările, mecanismele pipe şi controlul job-urilor şi

(3) verifică existenţa comenzii/comenzilor introduse şi dacă acestea există, sunt executate.

``Shell'' înseamnă cochilie sau carapace. Numele acestui program vine din faptul că ``înveleşte'' nucleul sistemului de operare, precum cochilia miezul moale al melcului: utilizatorul nu are de-a face cu nucleul ci interacţionează prin intermediul shell-ului.

Pentru nucleu, shell-ul este un proces ca toate celelalte, care se execută fără nici un fel de privilegii şi care ocazional face cîte un apel de sistem. Shell-ul conţine un set de comenzi interne utilizate pentru anumite operații, cum ar fi copierea de fişiere, mutarea fişierelor, redenumirea fişierelor, afişarea programelor ce rulează în acel moment pe sistem, oprirea programelor în execuție etc. Pe lângă comenzile interne, shell-ul permite, de asemenea, să introducerea numelui unui program de la promptul de comandă. Acesta apoi trimite numele programului kernel-ului pentru a îl pune în aplicație.

Modul de funcționare a shell-ului este prezentat in figura următoare:

Shell-ul preia comanda (sau shell script-ul = fișierul de comenzi), o translatează în binar pentru a putea fi apoi interpretată și prelucrată de kernel-ul Linux.

Istoric

Orice sistem de operare recent are o de interfaţă cu utilizatorul, un mod de a specifica comenzi pentru a fi executate de sistemul de operare. Dar în multe sisteme de operare, interfața de comandă este built-in și în plus aceasta permite doar executarea comenzillor si atât. Așa că sistemul de operare Unix a introdus conceptul de separea a shell-ului de celelalte lucruri de care sistemul de operare se ocupă. Așadar shell-ul a devenit un program al cărui rol este de a executa alte programe în numele utilizatorilor.

Vorbim despre un început al revoluției. Cum shell-ul era doar un program care lucra pe sistemul de operare, acesta putea fi cu ușurința înlocuit cu unul mai performant sau mai eficient. Și deci, la sfâșitul primei decade a existenței Unix-ului existau cel puțin două shell-uri concurente: Bourne Shell (descendentul originalului Thomson shell) si C Shell (o prelucrare a shell-ului Bourne astfel încât să semene cu un limbaj de programare asemănător C-ului. La sfârșitul celei de-a doua decade au mai apărut câteva alternative, Korn shell si versiunile incipiente ale shell-ului bash. Odată cu dezvoltarea Unix-ului au aparut in continuare și alte versiuni de shell. Cu toate acestea, doi factori au condus la evoluţia shell-ului Unix: programarea și comoditatea utilizatorului. Iar rezultatul este un shell modern care face mult mai mult decât să accepte comenzi.

Primele shell-uri au fost instrumente de programare destul de bune, dar nu foarte convenabile pentru utilizatori. Shell-ul C, a adăugat o mulţime de facilităţi pentru utilizator (cum ar fi posibilitatea de a repeta o comandă care tocmai a fost tatstată), ca un limbaj de programare insă, prezenta destule excentricități. Shell-ul Korn, ce apărut în perioada imdiat următoare (la începutul anilor '80), vine cu o serie de schimbări: a adăugat o mulţime de facilităţi de utilizator, şi a îmbunătăţit limbajul de programare. Adoptarea pe scară largă părea a fi calea pe care se îndrepta. Dar ksh nu a fost de la început open source; fiind un soft proprietar asocierea lui cu Linux-ul (sistem de operare free – gratuit) era dificilă.

La sfârşitul anilor 1980, comunitatea Unix a decis că standardizarea este un lucru bun, iar grupurile de lucru POSIX (organizate de IEEE), s-au format. POSIX a standardizat utilităţile şi bibliotecile Unix, inclusiv shell-ul. Shell-ul standard se baza în principal pe versiunea 1988 Korn Shell, cu unele caracteristici ale C Shell-ului şi un pic de inovație pentru a umple golurile. Bash a luat ființă ca parte efortului proiectului GNU de a produce un sistem complet POSIX, care natural avea nevoie de un shell POSIX. Bash-ul îndeplinea toate caracteristicile necesare pentru programatorii shell plus deținea toate facilităţile dorite de utilizatori. Aceasta a fost iniţial conceput ca o alternativă pentru shell-ul Korn, și cum mişcarea pentru software gratuit a devenit din ce în ce mai importantă iar Linux-ul devenea din ce în ce mai popular, bash a umbrit rapid ksh. Ca rezultat, bash-ul este shell-ul implicit pe fiecare distribuţie Linux cunoscută precum şi pe Mac OS X. Este, de asemenea, disponibil pentru aproape orice sistem de operare Unix, inclusiv BSD Unix si Solaris. Este chiar disponibil pentru Windows (Prin Cygwin).

Structura unui shell

Orice shell are structura următoare:

while (1) {

/* 1 */ scrie_prompt();

/* 2 */ linie = citeste_linie_de_la_utilizator();

/* 3 */ comanda = identifica_comanda(linie);

/* 4 */ argumente = identifica_argumente(linie);

/* 5 */ executa_comanda(comanda, argumente);

/* 6 */ asteapta_terminarea_comenzii();

}

Apelurile de sistem sunt folosite pentru:

· A scrie utilizatorului mesaje (prompt);

· a citi tastele apăsate de utilizator;

· a ruga nucleul să execute o comandă;

· a aştepta executarea acesteia să se termine.

Shell-ul nu returneaza nici un fel de rezultate pe ecran (poate doar cînd s-a produs o eroare)! Shell-ul citeşte un nume de comandă, pe care o execută ca un proces separat. Acest proces este cel care tipăreşte rezultatele văzute de utilizator.

La pornirea unui shell sunt rulate fişierele de pornire (de startup) pentru ca shell-ul să se iniţializeze. Selecția fişierelor depinde tipul de shell cu care se lucreaza, shell de login, un shell interactiv care nu este un shell de login (cum ar fi cel rezultat prin comanda bash), sau un shell neinteractiv (cel folosit pentru a executa un script shell). Pentru a executa comenzi intr-un fișier de startup sunt necesare drepturi de acces.

Unul din rolulurile principale ale shell-ului este acela de a translata liniile de comandă introduse de utilizator în instrucțiuni recunoscute de sistemul de operare. Spre exemplu, vom considera următoarea linie de comandă:

sort -n phonelist > phonelist.sorted ce execută o operație de sortare a liniilor din fișierul phonelist și de plasare a rezultatului în fişierul phonelist.sorted. Iată ce va face shell-ul cu această comandă:

1. Împarte linia de comandă în segementele sort, -n, phonelist, >, și phonelist.sorted.Aceste segmente sunt numite cuvinte (words).

2. Stabileşte scopul cuvintelor: sort este o comandă, -n și phonelist suntargumente, iar, > şi phonelist.sorted, luate împreună, sunt instrucțiuni I / O.

3. Pregătște I / O în funcţie de instrucțiunile > și phonelist.sorted (ieșire către fișierul phonelist.sorted) şi anumite instrucţiuni standard, implicite.

4. Găseşte comanda sort intr-un fişier şi o execută cu ajutorul opţiunii -n (ordinea numerică) şi a argumentului phonelist (numele fişierului de intrare).

Desigur, fiecare dintre aceste etape implică mai multe subetape, iar fiecare dintre acestea includ o instrucţiune particulară către sistemul de operare. Să ne amintim că shell-ul în sine nu este UNIX, ci doar interfaţa cu utilizatorul. UNIX este unul dintre primele sisteme de operare în care interfaţa cu utilizatorul este independentă de acesta.

Utilizare interactivă a Shell-ului.

Când shell-ul este utilizat interactiv, se acceseza o sesiune de autentificare care începe la conectare și se încheie atunci când se tastează exit sau logout sau prin apăsarea tastelor CTRL-D. În timpul unei sesiuni de autentificare, linia de comandă se tastează în shell. În mod implicit, shell-ul atenționează la fiecare comandă cu un şir de informaţii, urmat de semnul dolar ($).

Putem deci distinge două utilizări separate ale shell-ului: prima utilizare constă în a executa comenzi simple, în general pentru a lansa în execuţie alte programe. În acest caz shell-ul prezintă utilizatorului un prompt, o invitaţie de a primi o comandă. După ce utilizatorul tastează comanda, shell-ul o execută imediat, iar cînd comanda îşi termină execuţia (sau chiar mai înainte, dacă este instruit în acest sens), shell-ul oferă din nou un prompt. Acest mod de utilizare, în care fiecare comandă este citită de la utilizator şi executată se numeşte interactiv. În acest text vom folosi semnul procent % pentru a indica prompt-ul.

A doua utilizare a shell-ului este pentru execuţia unor programe mai complicate, scrise dinainte şi depozitate în fişiere. Un fişier cu comenzi pentru shell se numeşte în engleză shell script (adică un ``scenariu pentru cochilie''), sau pe scurt ``script''. Executarea unui script se mai numeşte ``procesare în vrac'', batch processing, pentru că shell-ul nu se mai opreşte după fiecare comandă cu un prompt.

Descifrare Prompt

Toate sesiunile shell au, în linia de comandă, un fel de prompt pentru a avertiza că shell-ul este gata de a accepta comezi. Cum arată prompt-ul depinde de mulți factori, inclusiv tipul şi versiunea de sistem de operare utilizat, tipul şi versiunea shell-ului, distribuţia, şi modul propriu de configurare.

În familia de shell-uri Bourne, simbolul $ din prompt, reprezintă, în general, că utilizatorul autentificat este unul obişnuit, în timp ce simbolul # inseamnă un utilizator root. Contul de root îl are administratorul de sistem, echivalentcontului de sistem pe Windows sau contului Supervizor pe Netware. Root-ul este atotputernic şi poate face orice pe un sistem Unix tipic sau pe un sistem Linux.

Prompt-urile default afișează de regulă calea spre directorul de lucru curent; Acesta este uneori abreviat. Simbolul ~ arată că ne aflăm în directorul home sau de login. Unele promp-uri pot expune implicit numele de utilizator şi numele maşinii pe care ne-am autentificat. Un exemplu de prompt tipic Linux pentru un utilizator denumit JP pe o mașina numită Adams este următorul: jp@adams:~$ simbolul de la final $ indică un utilizator obişnuit nu, rădăcină (root). Dacă schimbăm directorul curent într-un director /tmp prompt-ul după schimbare va fi: jp@adams:/tmp. A se observa cum ~, care de fapt însemna calea: /home /jp, s-a schimbat în /tmp.

Comenzi, Argumente, şi Opţiuni

Liniile de comandă shell sunt constitiute din unul sau mai multe cuvinte, care sunt separate de blank-uri sau tab-uri. Primul cuvânt pe linie este comanda. Restul (în cazul în care mai urmează și altele) sunt argumentele (numite, de asemenea, parametrii) comenzii, care sunt nume de lucruri pentru care comanda va acţiona.

De exemplu, linia de comandă lp myfile este alcatuită din comanda lp ( imprimă un fişier) şi argumentul myfile. Comanda lp tratează argumentul myfile ca numele fișierului pe care urmează să îl printeze. Argumentele sunt adesea nume de fişiere, dar nu neapărat: în linia de comandă mail cam, programul de mail tratează cam ca un nume de utilizator, destinatar al mesajului. O opţiune este un tip special de argument care oferă informaţii specifice comenzii asupra a ceea ce trebuie să facă. Opţiunile sunt, de obicei, constituite dintr-o linie, urmată de o literă; spunem "de obicei", deoarece aceasta este o convenţie, mai degrabă decât o regulă. Comanda lp -h myfile conţine opţiunea -h, care spune comenzii lp sa nu imprime "pagina cu banner-ul " înainte de a imprima fişierul.Uneori opţiunile au propriile argumente. De exemplu, lp -d lp1 -h myfile are două opţiuni şi un argument. Prima opţiune este -d lp1, ce înseamnă "Trimitela imprimanta (destinaţie) Lp1. A doua opţiune şi argumentul sunt cele din exemplul anterior.

Fişiere Deşi argumentele pentru comenzile nu sunt întotdeauna fişiere, fisierele sunt foarte importante pe orice sistem UNIX. Un fişier poate conţine orice fel de informaţie, şi într-adevăr, există diferite tipuri de fişiere. Cele mai importante sunt:

Fişiere obișnuite

Numite și fişiere text; acestea conțin caractere lizibile.

Fişierele executabile

Numite de asemenea, programe; acestea sunt invocate drept comenzi. Unele nu pot fi citite;-altele nu (script-uri shell -sunt doar fişiere text speciale.

Directoare

Acestea sunt asemnea foldere-lor care conţin alte fişiere, eventual alte directoare (numite subdirectoare).

Faptul că directoarele pot conține subdirectoare duce la o structură ierarhizată (cunoscută sub numele de arbore-tree) pentru toate fișierele sistemului UNIX.

Figura ilustreaza doar o parte a unui arbore obisnuit. Dreptunghiurile reprezintă subdirectoare iar ovalele fișiere. În partea de sus a arborelui regăsim rădăcină-root. Toate fişierele pot fi denumite exprimând locația lor in raport cu radacina. Astfel de nume sunt construite prin enumerarea tuturor directoarelor (în ordine de la rădăcină), separate prinlinii oblice (/), urmate de numele fişierului.

Exista de asemenea conceptul de director curent. Inițial, dupa logare directorul curent este unul special numit director de login. Pentru a schimba directorul curent se foloseste comanda cd. Comanda cd ia ca argument numele de directorului dorit drept director curent. Acesta poate fi relativ la vechiul director curent, acesta saupoate avea o clae absolută (incepand cu un caracter slash). Dacă argumentul este omis, comanda cd va fixa drept director curent directorul de login (home directory).

Imaginea următoare oferă câteva exemple pentru folosirea comenzii cd.

Primele patru comenzi sunt simple. Tilda (~) reprezintă o formă de a abrevia directorul ”home”. Comezile 5 și 6 folosesc un director special numit .. (două puncte) ce inseamnă "părinte a acestui director". Aeastea reprezintă un mod universal de a ajunge la directorul imediat superior celui actual în ierarhie (numit director părinte).

Standardul I/O

Prin convenţie, fiecare program UNIX are un singur mod de a accepta datele de intrare numit intrare standard, un singur mod de a produce date de ieşire numit ișire standard , și un singur mod de a produce mesaje de eroare numit eroare standard.

Standard I/O fost conceput special pentru utlizarea interactivă a terminalelor. Deoarece shell-ul UNIX oferă interfaţa cu utilizatorul, nu este de mirare faptul că standardul I/O a fost proiectat pentru a se potrivi într-un mod elegant cu shell-ul .

Toate shell-urile folosesc, în esenţă, standardul I/O în acelaşi mod. Fiecare program invocat are toate cele trei canale I/O setatde la terminal sau la stația de lucru, astfel încât intrarea standard este tastatura, ieșirea standard cât și eroarea standard vor fi ecranul sau fereastra.

Atunci când este necesar, se pot redirecţiona intrarea şi de ieşirea de la sau către un anume fişier. Dacă se dorește trimiterea conţinutului unui fişier pre-existent drept mail, intrarea standard a mail-ului se va redirecţiona, astfel încât citirea va avea loc din acel fişier în loc de tastatură.

Se poate, de asemenea legarea mai multor programe de împreună într-o legatură de tip pipeline (conductă), în care iesirea standard a unui program va reprezenta intrarea standard a altuia.

Acest lucru face posibilă utilizarea utilităţilor UNIX, drept blocuri pentru programe mai mari. Multe din programele utilitare UNIX sunt destinate spre a fi folosite în acest fel: fiecare dintre acestea vor efectua un anumit tip de filtrare pe textul primit la intrare. Cele mai frecvente utilități de filtrare sunt afișate în următorul tabel:

Cea mai simplă utilitate de filtrere este cat, ce copiază pur şi simplu intrarea sa la ieşire. Comanda cat împreuna cu un argument de tip nume fişier, va tipări conţinutul fișierului pe ecran.

Redirectare I/O

Shell-ul permite redirecţionarea intrării standard, astfel încât aceasta să provină dintr-un fişier. Notaţia command < filename face acest lucru. Astfel comanda va folosi drept intrare standard un nume de fișier în locul unui terminal. Spre exemplu comanda cat filename va cauza redirectarea ieșirii standard către fișierul numit. Exemplu clasic este comanda date >now prin care se va tipări data curentă intr-un fișier numit ”now”. Se poate face o combinație a redirectarii intrării și a ieșirii. Spre exemplu comanda cp utilizată in mod normal pentru a copia fișiere ar putea fi inlocuită cu urmatoarea comanda $ cat < file1 > file2.

Pipeline

De asemenea, este posibil să se redirecționeze ieșirea standard a unei comenzi cătrea intrarea standar a altei comenzi în loc de un fişier. Construcția cu acest rol poarte numele de pipe, și este reprezentată de caracterul |. O linie de comandă care include două sau mai multe comenzi legate cu pipe-uri poartă numele de pipeline. Pipe-urile sunt adesea folosite împreună cu comanda more, care funcţionează precum comanda cat cu excepţia că ieșirea se imprimă ecran cu ecran, oprindu-se pentru ca utilizatorul să apese SPACE (următorul ecran), să dea comanda RETURN (linia următoare), sau alte comenzi. Pipeline-urile pot deveni foarte complexe, şi pot fi, de asemenea, combinate cu alți directori I/O. Un exemplu interesant ar fi comanda sort < cheshire | lp care pe lângă sortarea liniilor din fișierul cheshire va imprima conținutul (sortat) acestuia.

Citare

Uneori, există nevoia de a folosi speciale literal, adică, fără sensul lor special. Acest procedeu poartă numele de citare. Citarea se realizează prin introducerea între ghilimele a şirului de caractere; astfel caracterele dintre ghilimele nu vor mai avea nici o semnificație specială.

O altă metodă de schimbare a înțelesului unui caracter este de a-l preceda un backslash(\)

Un exemplu potrivit în acest caz este caraterul special $. Introducerea acestui caracter între ghilimele nu îi va ascunde sensul. Backslash-ul in schimbă îi poate ascunde sensul. Comanda echo ”the cost is \$5” va fi interpretată de shell atliteram. Daca ” \” ar lipsi atunci shell-ul ar interpreta $5 ca al 5-lea parametru poziţional. Ultima modalitatea de a ascunde ințelesul special al caracterelor este delimitarea acestuia între apostroafe. ' ' - sunt cele mai puternice caractere de ascundere. Ele ascund şi caracterul "$".

Help (Ajutor)

O caracteristică a bash-ului ce nici un alt shell nu o mai prezintă sistem de ajutor online.Comanda help oferă informaţii cu privire la comenzile in bash. Dacă se tastează help se va obţine o listă de comenzi shell built-in, împreună cu opţiunile lor. Dacă se folosește comanda help împreună cu un nume de comanda shell aceasta va afișa o descriere detaliată a comenzii.

În continuare se vor prezenta câteva din comenzile importante interpretate de shell.

Scripturi Shell

Un script (de comenzi shell indirecte) este un program shell. Acesta este un fişier text care conţine comenzi similare celor care pot fi introduse interactiv. Avantajul script-urilor constă în posibilitatea de a repeta execuţia unui set complex de comenzi prin simpla

introducere a numelui fişierului.

Apare astfel la suprafaţă natura duală a interpretorului de comenzi; pe de o parte acesta are sarcina de a culege comenzile utilizatorului şi a lansa în execuţie programele care corespund acestor comenzi, iar pe de altă parte interpretorul de comenzi pune la dispoziţia utilizatorului un veritabil limbaj de programare.

Un script se poate crea prin utilizarea oricărui editor de text. Odată creat, există două modalităţi de a-l rula. Unul este de a da comanda source scriptname. Acesta determină citerea și rularea comenzilor din interiorul script-ului. Cea de-a doua metodă de a rula script-ul o reprezintă introducerea numelui, urmată de apăsarea RETURN, la fel ca în cazul în care se invocă o comandă built-in. Acesta, desigur, este modul cel mai convenabil deoarece face ca script-ul să arate la fel ca orice altă comandă UNIX. Există, de regulă, câteva comenzi puse în aplicare ca script-uri shell, inclusiv spell, man pe câteva sisteme, și varii comenzi pentru administratorii de sistem.

Lipsa distincţiei între "fişierele comandă de utilizator" şi "comenzile built-in", este un factor favorizant pentru programatori.Un script se poate rula prin tastarea numelui său numai în cazul în care directorul în care se găsește script-ul este situat în calea de căutare a comenzii sau script-ul se află în directorul curent. În cazul în care acestea nu sunt in calea de căutare a comenzii trebuie să tastată comanda /scriptname, care este în esență acelaşi lucru cu tatstarea căii absolute a script-ului.

Înainte de a putea invoca script-ul shell prin nume, acesta trebuie sa aibă permisiunea ”execute”. Fişierele au trei tipuri de permisiuni (de a citi, de a scrie, si de a executa) iar aceste permisiuni se aplică unor categorii de utilizatori (proprietarul fişierului, un grup de utilizatori, şi oricine altcineva). În mod normal, atunci cand se crează un fişier prin intermediul unui editor de text, fişierul este configurat cu permisiunea de citire pentru proprietar și permisiunea de read-only pentru oricine altcineva.

Imaginea următoare ilustreaza cum execută shell-ul script-urile. Considerăm un shell simplu numit alice ce conține comenzile hatter și gryphon. În primul caz (a) comanda source alice are drept efect rularea în același shell a celor două comenzi ca și cum ar fi fost introduse de mână . În cazul următor (b) se observă ce se întâmplă atunci când se tastează numai comanda alice: cele două comenzi din script vor fi rulate în subshell în timp ce shell-ul părinte așteaptă ca subshell-ul să încheie. Este interesant de urmărit ce se întâmplă în situația .c, unde este ilustrat rezultatul comenzii alice &. Argumentul & determină executarea comenzii în background. Singura diferență între ultimele două situații este posibilitatea de a folosi terminalul în timp ce rulează programul în cazul .c .

Funcții

Funcțiile sunt particularități ale shell-ului cu ajutorul cărora programabilitatea interpretorului este cu mult îmbunătățită. Aceasta caracteristică pentru bash reprezintă o versiune extinsă a unei facilități similare în cazul shell-ului Bourne si a altor câteva shell-uri.

O funcție este un fel de script în cadrul unui script; se folosește pentru a defini un cod shell după nume si apoi pentru a putea fi rulat mai târziu fiind stocat în memoria shell-ului.

Cum am meționat la început această facilitate a shell-ului este foarte avantajoasă din punct de vedere al programării. În primul rând pentru faptul că este mult mai avantajos de a construi niște funcții uzuale decât a păstra o mulțime de script-uri. În al doilea rând pentru că sunt mult mai ușor de organizat și de întreținut.

Pentru a defini o funcție se poate folosi una din urmatoarele sintaxe:

function numeFuncție{

comenzi shell

}

sau:

numeFuncție ( ){

comenzi shell

}

Nu exista nici o diferență funcțională între cele două modalități de definire a funcției. Pot fi folosite deci, oricare dintre ele.

Pentru a șterge definiția unei funcții se folosește comanda unset -f numeFuncție. Atunci când o funcție este definită, în memoria shell se vor stoca numele și definiția acesteia. Pentru o eventuală rulare a funcției se tatstează pur și simplu numele acesteia alături de argumente, ca și cum ar fi fost un script shell. În afară de avantajele pe care funcțiile le au asupra script-urilor, între cele doua mai există duoă diferențe importante. Prima dintre ele este aceea că funcțiile nu rulează în procese separate așa cum fac script-urile atunci când sunt apelate. Cea de-a doua diferență este aceea că o funcție cu același nume cu un script sau cu un program executabil va avea prioritate mai mare la apel și doar ea va fi executată.

Pentru o mai bună înțelegere iată ordinea priorităților surselor de comenzi atunci când sunt apelate din linia de comandă:

1. Aliasuri;

2. Comenzi de genul function și alte câteva, cum ar fi if sau for;

3. Funcții;

4. Comenzi built-in ( de exemplu: cd sau type );

5. Script-uri și programe executabile, pentru care shell-ul caută în directoare;

Preferința surselor de comenzi poate fi schimbată cu ajutorul comenzilor: command,

builtin, și enable. Acestea permit definirea funcțiilor, a aliasurilor și a scripturilor cu același nume și selectarea celei care se dorește rulată.

Variabile Shell

Ca orice limbaj de programare, limbajul shell-ului conţine variabile. În mod tradiţional, variabilele shell sunt scrise numai cu majuscule, pentru că în Unix programele executabile au nume scrise cu minuscule; în felul acesta se evită confuziile. Valoarea unei variabile shell este un şir arbitrar de caractere. Numele variabilelor sunt aceleaşi ca în limbajul C: o literă urmată de litere, cifre şi semnul ``subliniat''.

Principala limitare a shell-ului, care îl face nepractic pentru scrierea de programe mari, constă în sărăcia tipurilor de date disponibile: există un singur tip de date, şirul de caractere. Nu există numere, structuri, matrici, liste, arbori, etc. Pentru a scrie programe mai complicate, aceste structuri de date trebuie implementate pornind de la şiruri, ceea ce e complicat şi adesea ineficient.

Atribuirea unei valori unei variabile shell se face cu metode specifice fiecăruiinterpretor de comenzi. Astfel, în sh şi ksh, comanda nume=valoare atribuie variabilei nume valoarea valoare.

De exemplu:

$ cine=”Ana”

$ ce=”mere”

$ echo $cine are $ce

Ana are mere

$echo ${cine} are ${ce}u ${ce}

Ana are mereu mere.

O variabilă shell este locală procesului în care a fost definită. Ea poate fi “exportată” către

procesele fiu ale procesului curent dacă în procesul curent se face declaraţia export

. Ea poate fi accesată numai pe durata execuţiei procesului.

Variabile predefinite de către UNIX sunt:

1) variabile read-only actualizate de interpretor :

$? - conţine codul de revenire al ultimei comenzi executate;

$$ - conţine identificatorul de proces al shell-ului (PID);

$! - conţine identificatorul ultimului proces lansat în background;

$* - conţine lista de argumente;

$# - conţine numărul de argumente ale unui script;

$0 - conţine numele comenzii executate de shell (argv[0]);

$1, $2 ... - conţin argumentele poziţionale la apelul unei comenzi shell.

Ex.: ls -l /usr

$#=2; $0=“ls”; $1=“-l”; $2=“/usr”

2) variabile iniţializate la intrarea în sesiune :

$LOGNAME - numele de login al utilizatorului;

$SHELL - numele interpretorului de comenzi al utilizatorului;

$HOME - conţine numele directorului “home” asociat utilizatorului la intrarea în sesiune;

$PATH - conţine căile în care shell caută fişierele executabile corespunzător comenzii

introduse (de regulă /usr/bin şi /bin);

$PS1 - defineşte prompter-ul asociat shell-ului (implicit $);

$PS2 - defineşte al doilea prompter (implicit >), folosit când o comandă se continuă pe

o altă linie;

$TERM - conţine numele tipului de terminal sub care se lucrează.

În sistemul de operare Unix există mai multe interpretoare de comenzi (shell), selectabile de către utilizator. Fiecare interpretor acceptă un limbaj specific, astfel că fișierele de comenzi care pot fi scrise diferă în funcție de acest limbaj. Interpretorul de comenzi "standard" este sh, în Linux el fiind înlocuit cu interpretorul bash. Din acest motiv în acest capitol s-a abordat în mare măsură acest tip de shell. Acest lucru nu înseamnă că celelate variante nu funcționează după acelși tipar. Spre exemplu dacă ne referim la shell-ul Bourne, compatibilitatea dintre cele două este aproape completă. Singura diferență majoră ar fi ca bash-ul nu suportă caracterul ”^” ca sinonim al caracterului pipe ( | ). Nici un alt shell modern nu suportă acestă caracteristică. Shell-ul Korn împarte de asemenea o sumedenie de caracteristici cu bash-ul. Există totuși si câteva diferențe importante, cum ar fi înlocuirea comenzii echo (bash) cu comanda print (Korn), funcțiile sunt considerate mai degrabă niște entități separate decât ca facând parte dintr-un shell, posibilitatea de autoapelare a funcțiilor in cazul Korn etc.

În concluzie shell-ul Linux se referă la un program special care permite interacțiunea cu sistemul de operare prin intermediul anumitor comenzi. Dialogul cu sistemul de operare are loc, de obicei, prin intermediul unui terminal.

Shell-ul va citi, interpreta si apoi executa comenzile și va afișa rezultatele. In acelasi timp va controla modul și momentul în care sunt executate instructiunile. În Unix shell-ul oferă mai mult decît abilitatea de a lansa procese în execuţie: oferă o sumedenie de comenzi şi facilităţi suplimentare, care-l fac un mediu ideal pentru a activităţi de administrare a sistemului. Toate aceste comenzi formează un limbaj de programare deosebit de puternic; shell-ul este deci un interpretor, care citeşte şi execută comenzi

Bibliografie Capitol 3:

· Learning The Bash Shell Third Edition - Cameron Newham, Bill Rosenblatt

· Unix Shell Programming - Stephen G. Kochan, Patrick Wood (Tutorial)

· Learning The Bash Shell – Cameron Newham (Tutorial)

· Bash Cookbook – Carl Albing, JP Vossen, Cameron Newham

· 5http://www.cs.cmu.edu/~mihaib/articles/shell-2/shell-2-html.html

· http://labs.cs.upt.ro/labs/so/html/so2.html

· http://www.islavici.ro/cursuri/Sisteme%20de%20operare%20-%20laborator/Cap3-Interpretoare.pdf

Capitolul 4

Comparație Interfețe

Vasile Ioana Iuliana, 432A

1. Ce este o interfață?

În general, o interfață reprezintă ”graniță” între 2 sisteme independente prin care cele aceste comunică între ele. În domeniul calculatoarelor, există mai multe tipuri de interfețe:

· interfața cu utilizatorul ce asigură comunicarea dintre utilizator și sistemul de operare;

· interfața software ce înglobează limbajele si codurile pe care aplicațiile le folosesc pentru a cominca între ele si cu partea hardware;

· interfața harware ce cuprinde firele, mufele și prizele pe care dispozitivele hardware le ultilizează pentru intercoumincare.

2. Interfața cu utilizatorul

Aproape toate sisteme de operare dispun de o interfață cu utilizatorul (user interface). Ea reprezintă un program sau un ansamblu de programe care poate fi descris ca un nivel deaspura sistemului de operare, cu toate acestea interfața cu utilizatorul diferă cu fiecare sistem de operare. Interfaţa sistemului de operare asigură comunicarea între utilizator şi calculator. Prin intermediul tastaturii sau al mouse-ului, utilizatorul transmite comenzi sau răspunsuri la solicitările calculatorului iar prin intermediul monitorului, calculatorul transmite utilizatorului mesaje sau întrebări. Ultima funcţie a sistemului de operare menţionată mai sus este realizată de interfaţa sistemului de operare.

Există două abordări fundamentale pentru utlizatori să interacționeze cu sistemul de operare. Una din tehnici este să asigure un CLI sau interpretor de comandă (command interpreter) care permite utilizatorului să introducă în mod direct comenzi care urmează a fi efectuate de sistemul de operare. A doua abordare vizează folosirea unei interfețe grafice pentru interacționarea dintre utilizator și sistem.

Din punct de vedere istoric, în concordață cu tipul dominant prezent în sistemele de operare, interfața batch a prezentat o dezvoltare între anii 1945 și 1968, după care a facut loc CLI 1969 - prezent și GUI 1981 – prezent.

Pe lângă acestea, au mai apărut recent alte categorii de interfețe cum ar fi: interfețe touchscreen, de gesturi, de mișcare, de voce, ele revoluționând industria IT.

2.1 CLI

Unele sistem de operare includ interpretorul de comenzi in kernel. Altele, precum Windows si UNIX, trateaza interpretorul de comenzi ca un program special care rulează când este inițiată o funcție sau când un utilizator se loghează prima oară (în sistemele interactive). În sistemele cu interpretoare de comenzi multiple, interpretoarele sunt denumita shells. De exemplu, pe sistemele UNIX sau Linux, există diverse shell-uri care pot fi alese de utilizator, printre care: Bourne shell, C shell, Bourne-Again shell, the Korn shell, Command Prompt (cmd) etc. Majoritatea shell-urilor pun la dispoziție funcționalități similare, diferențele fiind minore.

Funcția principală a interpretorului de comendă este să execute comenzile specificate de utilizator. Multe dintre comenzile oferite la acest nivel sunt orientate spre manipularea fișierelor: creare, ștergere, listare, copiere, execuție, etc.

2.1.1 Comparație shell-uri

Categorii

Funcții

Bourne shell

C shell

Korn shell

Cmd

Caracteristici generale

Enivromentul usual

UNIX (ed. 7)

POSIX

POSIX

Win32

Anul apariției

1977

1978

1983

1993

Independent față de platformă

Nu

Da

Da

Nu

Sistemul de operare unde este shell implicit

Unix

-

-

Windows NT, 2000, XP, Vista

Redirectare flux

Da

Da

Da

Da

Blocare scripturi nesmenate

Nu

Nu

Nu

Da

Funcții interactive

Completare

Nu

Da

Da

Da (parțial)

Schimbare director implicit

Nu

Da (opțional)

Nu

Nu

Istoric comenzi

Nu

Da

Da

Da

Verificare ortografie

Nu

Nu

Nu

Nu

Scripturi la lansare

Da

Da

Da

Da

Funcții de programare

Tratare de excepții

Da

Nu

Da

Nu

Căutare și înlocurire variabile

Nu

Nu

Da

Da

Argumente impicite

Nu

Nu

Da

Nu

Generare pseudoaleatoare de numere

Nu

Nu

Da

Da

Bytecode

Nu

Nu

Da

Nu

Sintaxă

Ghilimele

Da

Da

Da

Da

Caracter de ieșire

Da ( \ )

Da ( \ )

Da ( \ )

Da ( ^ )

Comentarii

Nu

Da ( # )

Da ( # )

Da ( :: )

Notații științifice

Tipuri de date

Întreg artimetic

Nu

Da (sintaxa @ )

Da (sintaxa $(()) )

Da (sintaxa ”set /a”)

Tabele hash

Nu

Nu

Da

Nu

Vectori

Nu

Da

Da

Nu

Matrici

Nu

Nu

Da

Nu

Potrivire de nume

Expresii regulate

Nu

Nu

Da

Da

Globbing

Da

Da

Da

Da

2.2 GUI

Interfața grafică pentru interacționarea cu utilizatorul a apărut ca o reacție la interfața line de comandă. Aceasta s-a dorit să fie mai ”prietenoasă”, deoarce comenzile oferite de CLI puteau fi numeroase, complicate, necesita cunoștințe avansate ce nu puteau fi învățate rapid, doarece nu erau foarte intuitive. Interfața grafică a revoluționat domeniul calculatoarelor, mutându-l dintr-un dispozitiv tehnic, la un dispozitiv care poate fi utilizat de orice persoană fară cunoștințe bogate în domeniu.

În general, GUI este bazat pe WIMP, acronimul lui "window, icon, menu, pointing device" (fereastră, icoană, meniu, cursor). Ideea centrală a acestei interfețe este să ofere utilizatorului numeroase aplicații de mici dimensiuni care reprezintă și pot declanșa unele din comenzile de sistem disponibile. O proprietate importantă a WIMP-ului este folosirea a mai multe moduri, în sensul că tastele și click-urile pe poziții specifice, se redefinesc constant în funcție de context.

Interfața grafică s-a dezvolat la începutul anilor '70 în unitatatea de cercetare de la Xerox PARC. Primul GUI a apărut pe calculatorul Xerox Alto în anul 1973. Cu toate acestea, interfața grafică s-a dezvoltat și răspândit odată cu venirea pe piața a calculatoarelor Apple Macintosh (cu sistemul de operare Mac OS) în anii '80, iar cea mai nouă interfață a acestui sistem de operare se numește Aqua. Prima versiune a sistemului de operare Windows (versiunea 1.0) a celor de la firma Microsoft a fost bazată pe interfața grafică a sistemului MS-DOS. Versiunile următoare au adus schimbări semnificative din punct de vedere grafic, atât estetice, cât și funcționale (cum ar fi Windows Explorer – o modalitate de vizualizare a directoarelor și fișierelor).

În mod tradițional, sisteme de operare bazate pe UNIX au avut ca interfață cu utilizatoraul dominantă CLI, deși la ora actuala sunt disponibile diverse interfețe grafice, printre care și mediul comun pentru desktop, Common Desktop Enviroment – CDE, și X-Windows (o interfață ce se vrea asemănătoare cu cea specifică sistemului de operare Windows). Dezvoltări considerabile în design-ul interfețelor grafice au fost realizate de proiectele open-source precum K Desktop Environment (KDE) și GNOME desktop în cadrul proiectului de licențe gratuite, GNU. Atât KDE, cât și GNOME pot fi rulate pe sistemele de operare Linux, dar și pe unele Unix.

2.2.1 KDE

KDE este un manager de ferestre şi GUI atât pentru sistemul de operare UNIX, cât şi pentru Linux. KDE a fost creat în 1996 la iniţiativa sutdentului german Matthias Ettrich. Scopului lui a fost să creeze un mediu consecvent, în care toate aplicaţiile să fie uşor de folosit şi să arate şi să lucreze asemănător. În spatele KDE, se află un set de instrumente grafice şi un limbaj de programare complet echipat numit Qt. Acesta este făcută de către o societate comercială numită Trolltech şi rulează pe multe sisteme Unix şi Microsoft Windows si Mac OS. Înainte de începutul anului 2000, obiectivele principale ale KDE sunt să creeze o interfaţa grafică extrem de uşor de utilizat, prietenosă, funcţională şi extrem de puternică.

Utilizatorii obiţnuiţi cu Windows sau Mac OS se vor acomoda rapid cu aceasta interfaţă deoarce sunt similare. De exemplu, stilul Windows meniul "Start" este alternat cu "K" meniu. Ca şi MacOS X, pentru că permite folosirea skin-urile, transparenţe şi alte înfrumuseţări, şi poate încorpora multe "Teme"

Platforma tehnologică a mediului KDE conţine 3 părţi independente: platforma de dezvoltare KDE (”KDE Development Platform”), Spațiul de lucru KDE (”KDE Workspace”) și Aplicații KDE (”KDE Applications”).

Hartă KDE

2.2.1.1 KDE Development Platform

Platforma de dezvoltare este formată din un set integrat de tehnologii care are ca scop principal construirea unor aplicații rapid şi eficient. Aceasta a început ca o modalitate de a partaja funcţionalitatea între aplicaţiile KDE pe care dezvolatorii le creau. Ei și-au dat seama că prin distribuirea volumului de lucru, aplicațiile lor au devenit mai uşor de scris şi menţinut, iar stabilitatea şi coerenţa au fost îmbunătăţite. Acestă filosofie este prezentată ăn orientările impuse pnetru adăugările de noi funcționalități platformei de dezvoltare KDE.

KDE 2.0 a introdus multe tehnologii şi concepte noi pentru platforma de dezvoltare, cum ar fi KParts pentru integrarea obiect (”object embedding”), KIO care furnizează aplicaţii KDE cu o transparenţă de reţea (”network transparency”), un API multimedia rapid şi uşor, motorul web KHTML (care a fost ulterior adoptat de către Apple pentru a forma WebKit), un cadru de configurare, etc. Prin oferirea mai mult decât widget-uri şi instrumente simple de bază, cum ar fi fișiere de dialog, bare de instrumente, verificarea ortografică la nivel de sistem şi altele, aplicaţiile KDE se comporta mai mult cum se aşteaptă utilizatorii şi totodată mai puţin timp de dezvoltare este irosit pentru mici modificări ale fiecărei aplicaţii individuale pentru a se atinge orientările vizuale şi comportament impuse.

Versiunea 4 a platformei a introdus câțiva "piloni" noi pentru a fi utilizați de către aplicaţii Aceștia includ: Akonadi pentru stocarea şi regăsirea datelor utilizatorului, Phonon pentru multimedia, Solid pentru conştientizarea hardware, ThreadWeaver pentru multithreading simplificat, Sonet pentru verificarea ortografiei, Kross pentru suportul mai multor tipuri de limbaje de scripting, Nepomuk pentru fişiere semantice, indexarea și regăsire de conţinut şi Oxygen pentru proiectare vizuală. Aceste tehnologii au adus blocuri de contrucție în cadrul platformei de dezvoltare KDE mai puternice și mai uşor de utilizat pentru dezvoltatorii de aplicaţii. Cele mai multe dintre aceste tehnologii pilon pot fi utilizate ca biblioteci independente ceea ce le permite programatorilor să aleagă și să combine pe ce dependețe să se bazeze.

Întreaga platformă este construit pe toolkit-ul Qt, iar bibliotecile KDE sunt licențiate cu LGPL sau BSD, permițând o dezvoltare de tipul cross-platform. Comunitatea KDE lucrează pentru a permite aplicaţiilor KDE să fie folosite atat pe sistemele de oprare Unix cat și cele Unix-like, cum ar fi Linux, Sun Solaris, Windows şi Mac. Eforturile sunt depuse, de asemenea, pentru integrarea KDE și pe platforme mobile precum Symbian, Windows CE şi Maemo.

În timp ce platforma KDE este în principal scrisă în C + +, acesta include și un set de legături pentru alte limbaje de programare, inclusiv Python, Java, C # şi Ruby.

2.2.1.2 KDE Workspace

Spaţiile de lucru, Plasma, asigură un mediu de funcţionare şi de gestionare a aplicaţiilor. Acesta include mai multe componente, cum ar fi:

· Kwin este managerul de ferestre, caracterizându-se printr-un design asemănător cu cel al sistemelor de operare Microsoft Windows. Acesta include următoarele caracteristici: butoane pe bara de titlu configurabile, teme, ferestre agățătoare (”tabbed windows”), scurtături de la tastatură, ponou pentru interschimbare între ferestrele de lucru;

· KDM – KDE Display Manager este interfața grafică ce permite logarea utilizatorului, permițând acestuia să alea tipul de sesiune de pe o bază pre-logare, alegerea unei teme și unei fotografii specifică fiecărui utilizator. KDM folosește toolkit-ul Qt și poate fi configurat de la System Settings;

· bibliotecile Plasma core oferă componete adiționale cum ar fi widget-uri, motoare de date care nu sunt incluse în pachetul implicit;

· Klipper este utilitarul de clipboard, ajutând utilizatorii să acceseze istoria selecțiilor, astfel, orice element poate fi reselecționat pentru lipire, sau se poate reacționa în mod automat în care un anumit text este selectat;

· Ksysguard – KDE System Guard este managerul de sarcini (”task manager”), el poate să monotorizeze atât host-urile locale, cât și la distanță. Se poate recupera valori simple sau date complexe, afișând informațiile într-o varietate de tipuri de afișări grafice organizabile în fișe de lucuru;

· System Settings este o aplicație destinată configurărilor de sistem. Caracteristicile principale sunt: centru de control pentru setările globale ale platformei KDE, toate setările de desktop sunt adunate într-o singură locație centrală, motor de căutare pentru a regăsi anumite setări, file separate pentru setările generale și avansate.

Există diferite interfețe GUI disponibile: Plasma Desktop pentru calculatoarele de tip desktop, Plasma Netbook pentru netbook-uri, Plasma Mobile pentru smartphone-uri şi Plasma Tablet pentru Tablet PC-uri.

Plasma Desktop este spaţiul de lucru care a fost primul dezvoltat şi a fost declarată matur cu eliberarea versiunii KDE SC 4.2. Acesta este destinat calculatoarelor de tip desktop şi laptop-uri mai mari. În configuraţia implicită sale se aseamănă cu versiunile anterioare ale mediilor desktop KDE şi, de asemenea, cu Microsoft Windows, dar configurabilitate extinsă permite abateri radicale de la layout-ul implicit.

Plasma Netbook este destinat în primul rând laptopurilor de dimensiuni și performanțe mai reduse, dar poate fi folosit și pe Tablet PC-uri, deoarece Plasma Tablet este încă în stadiul de prototip, combinând elementele din Plasma Netbook și din Plasma Mobile.

Plasma Mobile a apărut în urma dezvoltării rapide a pieței de telefoane inteligente și a dispozitivelor mici de tip tabletă, toate dintre acestea folosind în principal ecran tactil. Și acesta este încă în stadiul de dezvoltare, prima versiune stabilă urmănd a se lansa în cursul anului curent, 2011.

2.2.1.3 KDE Applications

Aplicațiile KDE sunt în general construite în platforma KDE. Acestea pot fi portabile între sistemele de operare şi independente de spaţiul de lucru sau mediul desktop. Există puține branduri care sunt utilizate pentru a identifica suitelor de aplicaţii, cum ar fi KDE Network, Graphics KDE şi KDE Utilities. Unele aplicaţii fac parte din versiuni ale Software Compilation, altele fac parte din Extragear şi versiunile lor sunt independente.

Exemple de aplicații specifice KDE:

· Okular este o aplicație de vizulaizare și editare de deocumente, iar printre formatele suportate se numără: pdf, tiff, odf, xps, dvi, chm;

· KTorrent este clientul de BitTorrent si este scris în C++ folosind toolkitul de interfețe de utilizator Qt;

· Karbon14 este un editor de vectori grafici;

· Konqueror este un browser web, dar și un manager de fișiere care oferă funcționalități de vizualizare a fișierelor în diverse modalități: fișiere locale, fișiere ce se află pe un server ftp extern sau fișiere aflate pe o unitate optică de stocare;

· Kontact este un manager de informații personale și articole de grup, calendare, contacte, note, stiri, liste de sarcini și e-mail.

Logo GNOME

După ce a fost lansat în 1996, proiectul KDE au început să apară reacții la adresa setului de instrumente pe care îl folosea acesta, Qt, care la vremea respectivă nu avea GPL, deși KDE se dorea a fi open source. De aceea, în august 1997, două proiecte au fost iniţiate ca răspuns la această problemă: Toolkit Harmony (un înlocuitor gratuit pentru bibliotecile Qt) şi GNOME (un desktop diferit care să nu folosească Qt, fiind construit în întregime cu echipamente software GPL şi LGPL). Liderii proiectului iniţial pentru GNOME au fost Miguel de Icaza şi Federico Mena.

În loc de toolkit-ul Qt, GTK + a fost ales la bază mediului desktop GNOME. GTK + foloseşte LGPL, o licenţă pentru software gratuit, care permite interopabilitatea între celelalte aplicații software care fac parte din GNU. GNOME în sine este licenţiat LGPL pentru bibliotecile sale, şi pentru toate aplicaţiile care fac parte a proiectului GNOME.

Proiectului GNOME prevede două lucruri: Mediul GNOME, un desktop intuitiv şi atractiv pentru utilizatori, şi platforma de dezvoltare GNOME, un cadru extins pentru construirea de aplicaţii care se integrează în restul de mediu desktop.

Proiectul GNOME pune un mare accent pe simplitate, utilitate , şi a face lucrurile "doar să meargă" . Celelalte obiective ale proiectului sunt:

· Libertatea de-a crea un mediu desktop cu un cod sursă disponibil promt pentru re-utilizarea sub o licenţă software liberă;

· Accesibilitate pentru a se asigura un spaţiu de lucru care poate fi folosit de oricine, indiferent de aptitudini tehnice sau a circumstanţelor fizice;

· De internaţionalizare şi localizare pentru a face desktop disponibile în mai multe limbi. În acest moment, GNOME este tradus în 161 de limbi;

· Developer-friendliness pentru a se asigura coduri care se integrează fără probleme în spaţiul de lucru, şi a permite dezvoltatorilor alegerea liberă a limbajului de programare;

· Organizaţie să adere la un ciclu regulat de comunicate de presă și variante noi şi a menţine o structură organizată a comunității;

· Ajutor pentru asigurarea suport pentru alte instituţii din afara comunităţii GNOME.

Aplicații GNOME:

· gedit – editor de text;

· Evolution – client de e-mail și organiztor de informații personale

· Totem – player media

· Shotwell – manager de fotografii

· Chromium – browser internet

· Gparted – editor de partiții

· Rhythmbox – player audio

· GnomeBaker – pentru scriere CD-uri

2.3 CLI vs GUI

Cele două modalități fundamentale în interacția sistemului de operare cu utilizatorul dispun de filosofii de abordare diferite, ceea ce le face complementare. Astfel, avantajul uneia reprezintă dezavantajul celeilalte, iar măsura în care cele două sunt folosite rămâne strict legată de scopul urmărit de utilizatitor.

O listă cu avantajele și dezavantajele celor două interfețe este prezentată mai jos:

Topică

CLI

GUI

Ușurință în folosire

Din cauza necesității de memorare şi de familiarizare cu comenzile interfaţei, utilizatorii noi au nevoie de mai mult timp pentru a învăța să navigheze cu succes şi să opereze o interfaţă linie de comandă.

Deşi utilizatorii noi pot avea un moment dificil în a învăţa să utilizeze mouse-ul, totuși timpul necesar acomodării cu interfața graficp este mai scurt decât în cazul interfaţei linie de comandă.

Control

Utilizatorii au mult mai mult control asupra fișierelor de sistem şi a sistemul de operare într-o interfaţă linie de comandă. De exemplu, utilizatorii pot copia cu uşurinţă un anumit fişier de la o locaţie la alta cu o comandă într-o singură linie.

Chiar dacă GUI oferă suficient de control asupra fişierelor de sistem şi sistem de operare în sine, de multe ori utilizatorii avansați sau utilizatorii care trebuie să facă o sarcină specifică ar putea fi nevoiți să se recurgă la o linie de comandă pentru a finaliza această sarcină.

Multi-tasking

Deşi multe medii CLI sunt capabile de multitasking, ele nu oferă aceeaşi uşurinţă şi capacitatea de a vizualiza mai multe lucruri în acelaşi timp pe un singur ecran.

Utilizatorii GUI au ferestre care să permită unui utilizator să vizualizeze cu uşurinţă, să controleze şi să manipuleze mai multe lucruri în același timp şi de obicei sarcinile se realizează mult mai rapid.

Viteză

Deoarece utilizatorii CLI au nevoie doar de tastatură pentru a naviga în acest tip de interfaţă şi de multe ori au nevoie să execute decât câteva linii pentru a efectua o sarcină, un utilizator avansat ar putea să termine ce are de făcut mai repede spre deosebire de un utilizator avans GUI.

Un GUI poate fi mai uşor de utilizat din cauza mouse-ului. Cu toate acestea, folosind un mouse şi o tastatură pentru a naviga şi a controla sistemului de operare pentru mai multe lucruri poate fi mai lent decât cineva care lucrează într-o linie de comandă.

Folosire redusă de resurse

Un calculator care folosește numai linia de comandă consumă mult mai puţin din resursele acestuia.

O GUI va necesita mult mai multe resurse de sistem din cauza fiecăror elementele care trebuie să fie încărcate. În plus driverele video, driverele mouse-ul, şi alte drivere care trebuie să fie încărcate vor lua, de asemenea, resurse suplimentare.

Scripting

O interfaţă linie de comandă permite unui utilizator să folosească cu ușurință un script (o secvenţă de comenzi) pentru a efectua o activitate sau pentru a executa un program.

Deşi Un GUI permite unui utilizator să creeze comenzi rapide, sarcini, sau alte acţiuni similare, pentru a finaliza o sarcină sau pentru executarea un program aceasta nu se compară cu ceea ce este disponibil printr-o linie de comandă.

Acces de la distanță

Deseori, la accesarea un alt calculator sau unui dispozitiv de reţea printr-o reţea, un utilizator va putea doar să manipuleze dispozitivul sau fişierele sale utilizând o linie de comandă.

Deşi accesare de la distanţă prin interfață grafică este posibil și a deveni popular. Totuși, nu toate calculatoarele şi mai ales nu toate echipamentele de reţea au această posibilitate.

3. Sisteme de gestiune a ferestrelor

Un sistem de gestiune a ferestrelor (window management system) asigură majoritatea caracteristicilor importante ale interfețelor utilizator moderne: rularea aplicațiilor în ferestre distincte pe ecran, abilitatea de a redimensiona și muta ferestrele, meniuri pop-up și pull-down, ferestre de dialog (dialog boxes).

Majoritatea sistemelor de gestiune a ferestrelor sunt create pentru a ajuta la furnizarea mediului desktop. Ele lucrează în raport cu sistemul grafic ascuns care furnizează funcționalitatea cerută cum ar fi suport pentru plăcile grafice, dispozitivele de indicare (mouse) și tastatura, și sunt adesea scrise și create folosind un set de widget-uri.

Un sistem de gesiune a ferestrelor este, în principal, un gestionar de resurse. El alocă spațiu pe ecran diverselor programe care încearcă să folosească ecranul și apoi gestionează utilizarea zonelor de ecran alocate, astfel