Jump to content

zbeng

Active Members
  • Posts

    2402
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by zbeng

  1. zbeng

    FlatLand

    gata nemessis te am prins esti din bucuresti
  2. zbeng

    bug

    poate mai acepta careva bugurile trimise la bug report )
  3. zbeng

    aratati pc

    daca nai dmai adresa siti trimit eu unu genu asta
  4. scz g3o aveam copiat tutorialu tau in pc nu a fost cu intentii proastea
  5. Index: 1-Preluarea datelor din formularele HTML 2-Functia mail 3-Notiuni de baza 4-Variabile 5-Functii 1-Preluarea datelor din formularele HTML Recapitulare: in tutorialul de HTML la capitolul Formulare am mentionat ca eticheta form are atributele action si method iar fiecare camp din formular avea un name. action indica fisierul care prelucreaza datele introduse in formular cand este apasat butonul Trimite method indica modul in care datele sunt trimise spre prelucrare pe server si poate avea valorile: POST cand datele trimise nu sunt vizibile utilizatorului si GET cand datele sunt adaugate la adresa URL. Metoda POST permite trimiterea unei cantitati mai mari de date decat metoda GET. name este un atribut care identifica datele introduse in fiecare camp al formularului Sa presupunem ca intr-un formular avem un camp cu name="nume" si method="POST". Fisierul indicat de action va prelua datele introduse in campul "nume" astfel: $_POST["nume"]; Exemplu: formular cu un camp si scriptul php de preluare a datelor <form action="exemplu5_1.php" method="POST"> Nume: <input type="text" name="nume"> <input type="submit" value="Trimite"> </form> /* urmeaza fisierul exemplu5_1.php */ <?php $nume=$_POST["nume"]; echo $nume; ?> Verificarea datelor introduse in formular Pentru a fi siguri ca utilizatorul a completat campurile trebuie sa adaugam scriptului partea de verificare. Exemplu: folosim acelasi formular dar adaugam partea de verificare <?php $nume=$_POST["nume"]; if ($nume=="") { echo "Campul nume nu este completat"; } else { echo $nume; } ?> Partea de verificare poate avea mai multe conditii simultane. Exemplu: acelasi formular dar partea de verificare are doua conditii legate prin operatorul OR sau || <?php $nume=$_POST["nume"]; if (($nume=="") || (strlen($nume)<5)) { echo "Campul nume nu este completat corect"; } else { echo $nume; } ?> Folosind modelele anterioare puteti prelua date si face verificarea pentru toate campurile formularului. Datele preluate pot fi eventual introduse intr-o baza de date sau prelucrate in vederea trimiterii prin email functie de cerintele aplicatiei. In afara preluarii datelor putem folosi formularul si pentru upload-ul fisierelor pe server dar cu masurile de precautie necesare pentru a evita eventualele upload-uri de fisiere nedorite pe server. Pentru upload formularul va contine un camp de tip input cu type="file" iar eticheta form va contine in plus un argument enctype="multipart/form-data". Exemplu: formular pentru upload fisiere. Folderul in care se face upload trebuie sa permita operatia de scriere. Din motive de securitate acest exemplu nu este activ. <form method="post" action="exemplu5_4.php" enctype="multipart/form-data"> Fisier pentru upload: <input type="file" name="file"> <input type="submit" value="Trimite"> </form> /* urmeaza fisierul exemplu5_4.php */ <?php $a=$_FILES["file"]["size"]; $b=$_FILES["file"]["name"]; $c=$_FILES["file"]["tmp_name"]; $d=$_FILES["file"]["type"]; if(($a<10000) && ($a>0)) { move_uploaded_file($c,$; echo "Original file name: ".$b." "; echo "File name after upload: ".$b." "; echo "File size: ".$a." "; echo "File type: ".$d.""; } ?> 2-Functia mail Folosind functia mail() din PHP pot fi trimise mailuri utilizand urmatoarea sintaxa: mail(destinatar, subiect, mesaj, header aditional); destinatar este adresa unde va fi trimis mailul iar daca este necesar mailul poate fi trimis mai multor destinatari, situatie in care adresele vor fi separate prin virgula subiect este informatia care va fi afisata in campul subiect mesaj este corpul mailului. Fiecare linie va fi separata prin LF (\n) si nu va avea mai mult de 70 de caractere header aditional contine informatii optionale, de exemplu: From, Cc, Bcc fiind separate de caracterele CRLF (\r\n) Toate mailurile trimise trebuie sa aibe campul From completat. Acest lucru poate fi facut prin adaugarea acestuia in header aditional sau prin setarea corespunzatoare a adresei in fisierul php.ini din PHP. Executia functiei mail returneaza TRUE daca mailul a fost acceptat pentru trimitere, altfel FALSE. Acceptarea mailului pentru trimitere nu inseamna obligatoriu si ca a fost trimis. Exemplu: trimiterea unui simplu mail $to="proba@test.ro"; $subject="functia mail"; $mesaj="Mail trimis cu functia mail din PHP"; mail($to, $subiect, $mesaj); Exemplu: trimiterea unui mail la care adaugam header aditional cu campurile From, Cc, Bcc. Pentru ca mailul sa poata contine etichete HTML trebuie adaugat Content-type. S-au folosit caracterele speciale \r\n pentru afisarea fiecarei informatii pe un nou rand $to="proba@test.ro"; $subject="functia mail"; $mesaj="Mail trimis cu functia mail din PHP"; $headers = 'MIME-Version: 1.0'."\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1'."\r\n"; $headers .= 'From: [email]sender@test.ro[/email]'."\r\n"; $headers .= 'Cc: [email]cc@test.ro[/email]'."\r\n"; $headers .= 'Bcc: [email]bcc@test.ro[/email]'."\r\n"; mail($to, $subiect, $mesaj, $headers); Notiuni de baza PHP este prescurtarea de la Hypertext PreProcessor. Spre deosebire de paginile HTML care puteau fi verificate si pe calculatorul local paginile PHP nu pot fi verificate decat daca sunt gazduite pe un server web care are instalat PHP. Cand accesam o pagina HTML serverul care o gazduieste trimite pagina HTML catre browser spre afisare. In cazul unei pagini PHP serverul citeste codul PHP, il interpreteaza si genereaza dinamic pagina HTML care este trimisa browserului spre afisare. Acesta este motivul pentru care utilizatorii folosesc PHP pentru construirea unor pagini cu continut dinamic. Fisierele PHP au extensia php. Puteti scrie astfel de fisiere cu Notepad sau cel mai indicat cu un editor specializat care va indica si numarul liniilor, lucru util la depanarea scripturilor. Verificati ca nu aveti extensiile ascunse (My Computer -> Tools -> Folder Options -> View -> debifati Hide extensions for known file types). Pentru a putea crea fisiere php dati clic dreapta New -> Text Document, apoi il redenumiti nume.php. Cand PHP-ul parcurge un fisier de fapt "citeste" textul pana cand intalneste una din etichetele speciale care-i spun sa inceapa sa interpreteze textul ca pe cod PHP. Se executata codul pana cand este intalnita eticheta de inchidere. Apoi se "citeste" din nou textul mai departe. Acesta este motivul pentru care se poate adauga cod PHP in interiorul HTML-ului. Important: * in cazul functiilor nu se face diferenta intre utilizarea literelor mari sau mici * pentru variabile se face diferenta intre utilizarea literelor mari sau mici * inchiderea unui rand se face obligatoriu cu caracterul ; * ghilimelele se folosesc pereche "..." sau '...', folosirea lor "...' sau '..." constituie o eroare Codul PHP este delimitat de unul din urmatoarele seturi de etichete de deschidere si inchidere: <?php ?> etichete recomandate <script language="php"?> </script> <? ?> folosirea lor necesita anumite setari pe server <% %> etichete tip ASP, folosirea lor necesita anumite setari pe server Exemplu: cel mai simplu script PHP este: <?php echo "Acesta este un script PHP"; ?> Daca veti verifica functionarea acestui script pe un server veti vedea ca este afisat textul delimitat de ghilimele. Functia echo este folosita pentru afisarea informatiilor delimitate de ghilimele. Nu uitati sa inchideti randul cu ;. Similar functiei echo este functia print. In situatia in care scriptul nu este scris corect PHP-ul va afisa eroarea indicandu-va si locul unde aceasta apare. Erorile sunt afisate doar daca serverul este setat corespunzator (in php.ini este setat display_errors=On si error_reporting=E_ALL). Exemplu: in interiorul scriptului puteti insera si etichete HTML <?php echo "Acesta este un script [b]PHP[/b] care contine si etichete HTML"; ?> Exemplu: fisierul PHP poate contine intre etichetele <html> si </html> blocuri PHP delimitate de <?php ?> <html> <head><title>Exemplu0_3</title> </head> <body> Bloc HTML <?php echo "Bloc PHP"; ?> </body> </html> In PHP sunt trei metode prin care se poate adauga un comentariu care evident nu va fi afisat in browser ci are ca scop doar adaugarea de informatii necesare programatorului. Tot ce urmeaza dupa caracterele // sau # este considerat comentariu. De exemplu: // Urmeaza un comentariu in PHP Un comentariu format din mai multe linii este incadrat de /* si */. De exemplu: /* Comentariul in PHP scris pe doua linii */ Variabile Variabila este un container de date care poarta un nume si i se poate atribui o valoare care poate fi modificata de mai multe ori sau salvata intr-o baza de date. Numele dat variabilei incepe cu simbolul $ urmat de orice litera mica (a-z) sau mare (A-Z) sau cu caracterul _ dar niciodata cu o cifra si nu poate contine spatii goale. De exemplu: $nume_variabila Este recomandat ca numele variabilei sa fie cat mai sugestiv pentru a evita incurcaturile in timpul scrierii scriptului. Exemplu: atribuim variabilei $program valoarea PHP si apoi o tiparim <?php $program="PHP"; echo $program; ?> Exemplu: in aceeasi constructie echo putem folosi text impreuna cu o variabila <?php $luna="iulie"; echo "Am concediu in luna ".$luna.""; ?> Modificand valoarea variabilei se modifica ceea ce este afisat de browser. Intr-un script puteti folosi mai multe variabile care pot fi adaugate in aceeasi constructie echo. Exemplu: <?php $ziua="22"; $luna="12"; $anul="1995"; echo "Data nasterii este ".$ziua.".".$luna.".".$anul.""; ?> In PHP sunt opt tipuri de variabile primitive: * patru tipuri scalare: intregi, numere cu virgula flotanta, siruri si boleene * doua tipuri compuse: matrice si obiecte * doua tipuri speciale: resurse si NULL Intreg (integer) este un simplu numar intreg exprimat in sistem zecimal, hexazecimal sau octal, optional putand purta si semn (+ sau -). In sistem octal numarul trebuie precedat de 0 iar pentru hexazecimal precedat de 0x. $a=2006; //numar exprimat in sistem zecimal $a=-52; //numar negativ exprimat in sistem zecimal $a=0135; //numar octal (echivalent cu 207 zecimal) $a=0x1D; //numar hexazecimal (echivalent cu 29 zecimal) Numerul cu virgula flotanta (float) sau dubla precizie este un numar real care poate fi folosit cu urmatoarea sintaxa: $a=3.14; //numar zecimal $a=-2.59; //numar zecimal negativ $a=1.3e2; //130 $a=6E+3; //6000 Exemplu: <?php $temperatura=-5; $vant=8.5; echo "La Sinaia sunt ".$temperatura."<sup>o</sup>C iar vantul bate cu ".$vant."m/s"; ?> Sirul (string) este o variabila care contine o combinatie de numere, litere, simboluri si spatii delimitate intre doua ghilimele simple sau duble. Sirurile pot contine si nume de variabile. Exemplu: <?php $nume="Ivan Paul"; $data="19 iulie 2005"; echo "Solicitarea a fost facuta de domnul ".$nume." pe data de ".$data.""; ?> Cea mai simpla cale pentru a specifica un sir este sa il incadram intre ghilimele simple (') dar eventualele ghilimele simple continute vor fi precedate de caracterul \. In aceasta situatie variabilele si caracterele speciale vor fi ignorate. echo "acesta este un sir"; //acesta este un sir echo "variabila $a"; //variabila $a echo "rand1 \n rand2"; //rand1 \n rand2 Daca sirul este definit prin ghilimele duble (") PHP-ul interpreteaza mai multe secvente pentru caracterele speciale: Secventa Semnificatie \n rand nou \r sfarsit de linie \t tab orizontal \\ backslash \$ simbol dolar \" ghilimele duble Variabila boleana exprima valoarea de adevar: TRUE sau FALSE. Orice valoare diferita de zero sau sir care nu este gol (contine cel putin un caracter) sunt considerate ca TRUE. Matricei (array) i se pot atribui mai multe valori comparativ cu numerele sau sirurile care pot contine doar o singura valoare. Matricele folosesc chei sau indexi pentru a identifica valorile stocate. O matrice se creaza folosind functia array(): $matrice = array('apa','aer','foc'); Exemplu: cream o matrice si ii tiparim elementele folosind functia print_r <?php $matrice = array('ocean','mare','lac'); print_r ($matrice); ?> Exemplu: utilizam aceeasi matrice dar folosim functia var_dump() care ne arata cate elemente sunt in matrice si lungimea fiecarei valori a sa <?php $matrice = array('ocean','mare','lac'); var_dump ($matrice); ?> Primul index al unei matrici are valoarea 0. Valorile indexilor pot fi si declarate manual. Exemplu: cream o matrice cu indexii 1, 3 si 5 <?php $matrice = array(1=>'calculator',3=>'monitor',5=>'imprimanta'); var_dump ($matrice); ?> Pentru a sterge o pereche cheie/valoare se foloseste unset() unset($matrice[3]); //sterge cheia 3 din matrice unset($matrice); //sterge intreaga matrice Exemplu: stergem elementul 3 din matricea $matrice <?php $matrice = array(1=>'Matematica',2=>'Fizica',3=>'Biologie',4=>'Istorie'); unset($matrice[3]); //sterge cheia 3 Biologie print_r ($matrice); ?> Variabile predefinite PHP ofera un mare numar de variabile predefinite oricarui script care ruleaza si sunt functie de serverul pe care functioneaza. Incepand cu PHP 4.2.0 valoarea default pentru directiva register_globals este off. Aceasta afecteaza setul de variabile predefinite disponibile in scop global. De exemplu pentru a obtine DOCUMENT_ROOT vom folosi $_SERVER['DOCUMENT_ROOT'] in loc de $DOCUMENT_ROOT cum era in cazul in care register_globals erau on. PHP Superglobals sunt variabile disponibile oriunde in script $GLOBALS contine referinte catre toate variabilele care sunt disponibile in scop global scriptului $_SERVER variabile furnizate scriptului de catre serverul web $_GET variabile furnizate scriptului via HTTP GET (provin dintr-un formular in care method="GET") $_POST variabile furnizate scriptului via HTTP POST (provin dintr-un formular in care method="POST") $_COOKIE variabile furnizate scriptului via HTTP cookies $_ENV variabile furnizate scriptului de catre mediu In continuare voi prezenta cateva din cele mai des folosite variabile globale. $_SERVER['REMOTE_ADDR'] Exemplu: adresa IP a vizitatorului $_SERVER['HTTP_USER_AGENT'] Exemplu: informatii despre browserul folosit $_SERVER['HTTP_REFERER'] Exemplu: pagina vizitata anterior $_SERVER['SERVER_NAME'] Exemplu: numele serverului $_SERVER['SCRIPT_NAME'] Exemplu: numele scriptului Scopul variabilelor depinde de contextul in care sunt definite. Majoritatea variabilelor din PHP au un singur scop. Acesta se aplica si pentru fisierele adaugate prin functiile include() si require(). Exemplu: <?php $a=10; include "exemplu1_9b.php"; ?> /* urmeaza fisierul exemplu1_9b.php */ <?php echo "Mihai are ".$a." ani"; ?> Orice variabila folosita in interiorul unei functii este limitata doar scopului functiei. Exemplu: deoarece functia foloseste o variabila declarata in afara ei echo nu va afisa nimic <?php $a=10; function mihai() { echo "Mihai are ".$a." ani"; } mihai(); ?> Exemplu: aceeasi functie dar acum declaram variabila de tip global motiv pentru care echo va afisa corect <?php $a=10; function mihai() { global $a; //declaram variabila $a de tip global echo "Mihai are ".$a." ani"; } mihai(); ?> Variabile statice O alta caracteristica importanta a scopului variabilei este variabila statica care exista doar in scopul functiei locale dar isi pierde valoarea cand executia scriptului inceteaza. Exemplu: executarea succesiva a functiei va afisa tot timpul 0 <?php function static1() { $a=0; echo $a; $a++; } static1(); echo " "; static1(); echo " "; static1(); ?> Exemplu: aceeasi functie dar declaram variabila ca fiind statica. De cate ori functia va fi executata ea va incrementa valoarea anterioara a variabilei $a <?php function static1() { static $a=0; echo $a; $a++; } static1(); echo " "; static1(); echo " "; static1(); ?> Variabile variabile Cateodata este util sa avem nume variabil pentru variabila Exemplu: <?php $a="Mihai"; $$a="Ionescu"; echo "$a $Mihai"; ?> Exista functii care determina tipul variabilei. Exemplu: verificam daca variabila $a este de tip intreg <?php $a=19; if (is_integer($a)) { echo '$a este intreg'; } else { echo '$a nu este intreg'; } ?> Exemplu: verificam daca variabila $a este de tip numar cu virgula flotanta <?php $a=3.14; if (is_float($a)) { echo '$a este numar cu virgula flotanta'; } else { echo '$a nu este numar cu virgula flotanta'; } ?> Exemplu: verificam daca variabila $a este de tip sir <?php $a="sir"; if (is_string($a)) { echo '$a este un sir'; } else { echo '$a nu este un sir'; } ?> Exemplu: verificam daca variabila $a este o matrice <?php $a = array('fructe','legume','carne'); if (is_array($a)) { echo '$a este o matrice'; } else { echo '$a nu este o matrice'; } ?> Functii Functia este o secventa de cod ce poate fi utilizata de mai multe ori in interiorul marilor scripturi si este prezentata in script prin declaratia ei. Functia chemata (invocata) va contine acelasi numar de argumente ca in declaratie. function foo($arg_1,$arg_2, $arg_n) { echo "Exemplu.\n"; return $val } unde: foo este numele functiei $arg_1, $arg_2, ... , $arg_n sunt argumentele functiei $val este valoarea returnata de functie Exemplu: construim o functie care aduna 2 variabile <?php function adunare($a,$ { $suma=$a+$b; return $suma; } $rezultat=adunare(5,16); echo $rezultat; ?> Exemplu: o functie care genereaza un tabel <?php function tabel($lim) { echo "<table border=\"1\">\n"; for ($i=0; $i<=$lim; $i++) { echo "<tr><td>randul ".$i."</td></tr>\n"; } echo "</table>"; } tabel(9); //tabel cu 10 randuri ?>
  6. Salut ! Limbajul JavaScript a fost inventat de o echipa de la Netscape, care dorea sa faca browserul lor sã interacþioneze mai mult cu utilizatorul ºi sã facã paginile mai dinamice. Deºi au nume asemãnãtoare, limbajele JavaScript ºi Java nu au nimic în comun unul cu celãlalt. La început, când a fost introdus în browserul Netscape Navigator prima variantã de scriptare rudimentarã, se numea LiveScript. În aceeaºi perioadã, Java era deja lansat ºi era din ce în ce mai cunoscut ºi se anticipa a fi un limbaj revoluþionar. Ulterior, Netscape a actualizat browserul Navigator pentru a permite rularea de appleturi Java în Navigator 2, dar odatã cu aceste actualizãri a redenumit LiveScript în JavaScript. Java este un limbaj de programare dezvoltat ºi comercializat de compania Sun Microsystems. Limbajul Java este descendent al familiei de limbaje de programare C ºi C++, iar cu ajutorul lui se pot crea diverse aplicaþii ºi se poate controla funþionarea diverselor aparate electronice. Principala utilizare a limbajului Java în domeniul web (client-side), în browserul utilizatorului, este crearea de appleturi, aplicaþii mici care sunt descãrcate prin Internet ºi ruleazã în cadrul browserului. Datoritã compatibilitãþii interplatformã a limbajului Java, aceste appleturi ar trebui sã ruleze identic pe orice browser care permite executarea de cod Java. Appleturile Java sunt adãugate în pagina web prin folosirea tagului HTML <applet>. Când browserul întâlneºte acest tag, el descarcã appletul Java de pe server, iar appletul va rula în porþiunea de ecran specificatã în tag. Un script JavaScript este un program inclus într-o pagina HTML. Deoarece este încadrat de tagul <script>, textul scriptului nu apare pe ecran, dar este rulat ºi interpretat de cãtre browser. Tagul <script> este prezent cel mai frecvent în secþiunea <head> a paginii HTML, deºi se pot pune ºi în secþiunea <body>. De obicei, scripturile care urmeazã sã afiºeze mesaje pe ecran sunt scrise în <body> Când Microsoft a vãzut cã limbajul JavaScript devenea popular, a preferat sã-ºi construiascã un limbaj propriu, foarte similar cu limbajul JavaScript, dar nu chiar identic, denumit JScript. În continuare este prezentatã o scurtã analizã a diferitelor versiuni de browsere ºi versiunea de JavaScrip pe care o are fiecare. Ce puteþi face cu JavaScript ? JavaScript vã permite sã creaþi o interfaþã activã cu utilizatorul, sã dea o impresie vizualã plãcutã în timp ce navigaþi prin paginile site-ului. Puteþi verifica validitatea informaþiilor introduse într-un formular înainte ca datele sã fie trimise cãtre server. Puteþi face calcule matematice, crea pagini HTML dinamice, personalizate în funcþie de opþiunile utilizatorului sau al browserului. JavaScript controleazã browserul, ºi prin intermediul scripturilor puteþi deschide ferestre noi, puteþi afiºa mesaje de avertizare ºi puteþi pune mesaje în bara de stare a ferestrei browserului. Puteþi genera ceasuri, calendare ºi documente cu timpul înscris. Puteþi chiar verifica prezenþa plug-in-urilor în browser, ºi puteþi redirecta utilizatorul spre o paginã diferitã în cazul în care browserul nu are un anumit plug-in. Aici trebuie sa fac o precizare, se pot detecta plug-in-urile în browserele Netscape Navigator 3.0 sau mai nou (pe orice sistem de operare) ºi în Internet Explorer 5.0 sau mai nou (doar pe platforma Macintosh) O menþiune importantã: programele care ruleazã pe calculatorul utilizatorului sunt numite aplicaþii client-side (aflate pe partea de client), ºi programele care ruleaza pe server (inclusiv CGI-urile) sunt numite aplicaþii server-side (aflate pe partea de server) Deoarece JavaScript ruleazã pe calculatorul dumneavoastra, i-au fost impuse o serie de limitãri, majoritatea din raþiuni de securitate, ºi anume: - nu permite citirea sau scrierea de fiºiere pe calculatorul utilizatorului. Singura excepþie este permisiunea de a scrie în directorul de cookie-uri al browserului, dar ºi aici sunt anumite limite. - nu permite citirea/scrierea de fisiere pe server. Alternativa este sã rulaþi pe server un program care sã preia datele trimise de script ºi sã le scrie pe server (un CGI, scris într-un limbaj precum Perl sau PHP, sau un program Java. - un script JavaScript nu poate închide o fereastrã de browser care nu a fost deschisã de el. Astfel se evitã situaþia când intraþi pe un site ºi vi se închid celelalte ferestre active care conþin alte site-uri... - nu poate citi informaþii dintr-un browser care conþine o pagina web de pe un alt server, ca sã nu puteþi afla pe ce site-uri navigeazã utilizatorul. de dj nu stiu cum
  7. scz ca apar si eu pe acolo din greseala
  8. 1-schimba semnatura 9. Avatarele nu trebuie sa depaseasca 120x120 si 100KB Semnaturile nu trebuie sa depaseasca 600x150
  9. Bazele in Visual Basic Continut: Introducere Variabile,constante Tipuri de variabile Tipul array Instructiuni Proceduri Functiile msgbox() si inputbox() Fisiere Meniu Bibliografie Introducere Visual Basic este un mediu de programare vizuala de inalta productivitate,produs de firma Microsoft,cu care poti crea o multime de aplicatii Windows.Visual Basic este derivat de la limbajul Basic si face parte din pachetul pentru programare vizuala oferit de Microsoft,Visual Studio. Programul Visual Basic este alcatuit din : Bara de meniu—contine meniuri cu care sunteti familiarizati din alte programe(File,Edit,View,Windows,Help)+2 meniuri specifice compilatoarelor (Project,Debug,Run,Add-ins); Bara de instrumente—are cateva scurtaturi pt comenzile cele mai folosite (Save,Open..) Bara de controale(Toolbox)—contine controalele din Visual Basic Fereastra Properties—proprietatile controalelor(am sa va explic cateva pe la sfarsitul tutorialului) Browser-ul pentru proiect—afiseaza formularele si modulele proiectului Fereastra From Deisgn— contine forma fiecarui element Fereastra de cod—nu este vizibila ,dar fiecarei forme sau module ii este asociata Aici se scrie codurile din visual basic(declararea variabilelor, instructini,etc); Comentarile in Visual Basic se fac cu ajutorul ‘ (apostrof). Variabile,constante 1.Variabile Variabilele sunt numele unei locati de memorie in care se pastreaza o valoare care poate fi modificata in timpul executiei programului. Declararea variabilelor : Dim nume_variabila as tip nume-este numele variabilei declarate(si pe care vei folosio in program); tip-tipul de date care ii este asociat(vom discuta despre acestea mai tarziu); Variablele incep cu o litera sau cu _(underscore) si contine 255 de caracere Mai putem folosi un fel de declarare a variabilelor: -a)Public nume as tip sau -b)Static nume as tip a)daca folosim cuvantul cheie Public inseamna ca am vrut ca variabila sa fie cunoscuta in intreaga aplicatie b)daca am folosit Static atunci inseamna ca am vrut sasi pastreze valoarea chiar si in afara proceduri. 2.Constante Constantele sunt un fel de variabile dar fata de acestea ele nu pot fi modificate in timpul executiei programului. Declararea constantelor : [Private][Public]Const nume as tip = valoare nume & tip-ca la variabile valoare- poate fi un numar,caracter sau sir de caractere care in timpul unui program sa nu se schimbe Private –cuvant cheie care face constata sa fie folosita numai in aplicatia curenta Public - cuvant cheie care face constanta vizibila in tot programu 2 functii incluse in compilator(limbaj) sunt vla() si str(). Val()—transforma un sir de caractere inrun rezultat intreg(Ascii?numar) Str() –transforma un intreg intrun sir de caractere(numar?Ascii) Tipuri de variabile In Visual Basic tipurile de variabile se impart(zic yo si multi alti de la care am invatzat) in 2 categorii : 1)Numerice : Byte:de la 0 la 255 Integer : numere intregi intre -32,768 si 32,767 Long : intreg lung (ceva numere mai mari) Single:numere reale cu virgula mobila simpla precizie Double:numere reale cu virgula mobila cu dubla precizie Currency:numere foarte mari(folosite pt monede spun unele carti) Decimal:numere foarte foarte mari Cu toate aceste tipuri se pot efectua operatii aritmetice. 2)Nenumerice: String:ca in toate limbajele(pt siruri de caractere); Date:se foloseste pt date din calendar Boolean :retine valori de tip true/flase(adevart/fals) ; Object :pt obiecte O variabila dere care nu sa mai auzit despre ea in alte limbaje este tipul Variant. Variant—contine toate tipurile de date Pt a forta o valoare sa ia un anumit tip de data atunci folositi urmatoarele sufixe : & --------------------------------------Long ! ---------------------------------------Single #---------------------------------------Double @--------------------------------------Currency Tipul array Tipul array este o lista de variabile ,toate avand acelasi tip de date si acelasi nume. Declararea variabilelor se poate face cu ajutorul cuvintelor cheie Public sau Dim(leam explicat mai sus): Dim nume(numar_de_elemente) as tip_de_date Variabilele sunt numar_de_elemente-1 De exemplu :Dim student(3) as String avem variabilele :student,student(1),student(2) Putem declara tipul array ca: Dim trandafiri(10 to 50) as Integer Am declarat un array care incepe cu trandafiri(10) si se termina cu trandafiri(50) Exemplu : Private Sub cmdtest_Click() Dim prop(4) as string prop(0)= « Programare » prop(1)=”in” prop(2)=”Visual” prop(3)=”Basic” Msgbox prop(0) & “ “ & prop(1) & “” prop(2) & “ “ & prop(3) End Sub Instructiuni In Visual Basic sunt 3 feluri de instructiuni :1)de decizie 2)repetitive 3)de salt 1)Instructiuni de decizie Sunt in numar de 2:a)Instructiunea IF b)Instructiunea Case a)Instructiunea if: Testeaza daca o conditie daca este adevarata. Folosire:are mai multe feluri de folosire If cond then instructiune Daca cond(conditia) este adevarata executa instructiunea. Exemplu: If 9>7 then msgbox “9 e mai mare decat 7” If cond then instructiune 1 Else instructiune 2 End If Testeaza daca cond(conditia) este adevarat si executa instructiunea 1.Daca cond este falsa atunci executa instructiunea2 si se termina in sf programu cu autorul lui End If. Exemplu: If 7<5 then msgbox « 7 este mai mic decat 5” Else msgbox “7 este mai mare decat 5” End if If cond then instructiune 1 Else If cond 2then instructiune 2 Else If cond 3 then instructiune 3 : : Else If cond n then instructiune n End if Testeaza daca cond(conditia) este adevarata si executa instructiunea 1,daca nu testeaza ce este la Else if la conditia 2 si daca este adevarat executa instructiunea 2 daca nu testeaza cond 3 si tot asa. Exemplu : In sf va dau un exemplu de un program complect.Faceti o forma cu 3 controale text si un label cu numele rezultat.Cele 3 controale text faci :primul la proprietatea Name scri primul,la al 2lea control la Name scri operato iar la al 3lea la Name scri aldoilea. Private Sub cmdtest_Click() Dim primul as integer Dim operator as string Dim aldoilea as integer primul = primulnumar.text operator= operator.txt aldoilea=aldoileanumar.txt If operator=”+” then rezultat.Caption=primul+aldoilea Else if operator=”-“ then rezultat.Caption=primul+aldoilea Else if operator=”*” then rezultat.Caption=primul*aldoilea Else if operator=”/” then rezultat.Caption=primul/aldoilea End If End Sub Acest program functioneaza ca un calculator simplu. b)Instructiunea Case Este o instructiune cu decizie multipla.Este echivalenta cu ultimua folosinta de la if adik cum e exemplu de mai sus. Select Case cond Case 1 :instructiune Case 2 :instructiune 2 : : Case n:instructiune n Case Else:instructiune n+1 End Select Testeaza conditia cond daca se afla intre case 1 si case n daca nu ,se se executa ce se afla la case else. Exemplu : Vom lua exemplu de la if(ultimul,care lam numit yo calculator) Private Sub cmdtest_Click() Dim primul as Integer Dim operator as String Dim aldoilea as Integer primul=primulnumar.txt operator=operator.txt aldoilea=aldoileanumar.txt Select Case (operator.txt) Case +: rezultat.caption=primul+aldoilea Case - : rezultat.Caption=primul-aldoilea Case *: rezultat.caption=primul*aldoilea Case /: rezultat.caption=primul/aldoilea Case Else: rezultat.caption=”Ai tastat ceva gresit” End Select End sub 2)Instructiuni repetitive Sunt tot in numar de 3:-while -do -for a)While Verifica conditia si daca este adevarat o executa pana cand se face falsa.Traducere din engleza in romana while inseamna cat timp.Instructinea while este cu test initial. While(conditie) Instructiune Wend Exemplu: Creazati un control text (cu numele textdatdevoi.txt)si un buton(cu numele cmdtest).Acest program cere de la utilizator un numar si acesta daca este mai mare executa pana cand numar (variabile declarata de noi) o ajunge(adik se egalizeaza). Private Sub cmdtest_Click() Dim numar as Integer numar = 1 While(numar<=textdatdevoi.txt) Msgbox numar & “MsgBoxes” numar=numar+1 Wend End Sub b)Do Instructiunea do : -Instructiunea cu test initial (e aproape ca while) i) Do While conditie instructiune Loop ii)Do Until Conditie Instructiune Loop Aceste 2 instructiuni sunt cu test initial si executa instructiune(poate fi un grup de isntructiuni) cat tip conditia este adevarat(i)=pana cand conditia se face falsa(ii). -Instructiune cu test final: i)Do Instructiune Loop while conditie ii)Do Instructiune Loop until conditie Aceste 2 instructiuni sunt cu test final adik prima data executa instructiune si dupaia verifica conditia(diferentza intre test initial si test final este ca la cele cu test final de cel putin o singura data se executa pe cand cea cu test initial sar putea sa nu se execute deloc) Exemplu(cu test final deoarece alea cu test initial e aproape ca while): Vom lua sursa codului de la while si o vom transpune aici cu do in loc de while. Private Sub cmdtest_Click() Dim numar as Integer numar = 1 Do Msgbox numar & “MsgBoxes” numar=numar+1 Loop While(numar<=textdatdevoi.txt) End Sub Daca veti vedea acest cod va intrebati ce este asa diferit.Poi prima diferentza este ca sa folosit in loc de While..Wend Do..Loop While si a doua diferentza e ca daca il veti utiliza pe primu si veti scrie 1 nu se va intampla nimik,dar daca executati a doua sursa daca vei scrie 1 ti se va aparea un MsgBox si va repeta o data (adik o data trebe sa dai ok ). c)For Sincer sa fiu asta e cea mai usoara(nush care o folosesc alti programatori dar yo asta o folosesc cel mai mult). Poi ce sa zic.For tradus din engleza in romana inseamna pentru. For numevariabila_de_lacat to numevariabila_pana_la_cat Instructiune Next numevariabila Poi nush cum sa va explic dar mai bine zic yo sa va dau un exemplus I sa va zic acolo. Exemplu : Vom lua exemplu de la while si do. Private Sub cmdtest_Click() Dim numar as Integer For numar=1 to textdatdevoi.txt Msgbox numar & “MsgBoxes” Next numar End Sub Poi cum vedeti for mai scurteaza din cod sursa si este mai usor.In loc sa ii dam valoare lu numar inafara instructiuni for o da inauntru.Acest cod se va executa pana cand numar va fi egal cu textdatdevoi.txt.Si inca o chestie in loc sa incrementam noi variabila(adik numar=numar+1) instructiunea for o face in interiorul ei cu ajutorul lui Next(urmatorul). O versiune de for mai este: For each v in multime Instructiune Next v Exemplu: Suma mai multor numere(acest exemplu lam luat dintro carte care o voi prezenta la bibliografie) Dim s,i as integer Dim nr Sub Suma(ParamArray()) For Each I in Nr s=s+1 Next i Txt_nr.txt = txt_nr.txt + str(s)+’ ‘ End Sub Private Sub cmd_exit_Click() Suma 1,7,11,14 Suma 2,12 End Sub Acest exemplu lam dat aici dar ar putea sa fi dat si intrun urmator capitol(proceduri,mai exact la procedura sub) 3)Instructiune de salt:GoTo Unii zic ca este comanda unii zic ca este isntructiune(yo ii dau numele de instructiune). Poi Goto tradus din engleza in romana inseamna mergi la.Cum zice si traducerea si numele de instructiune ,GoTo poate sari peste ceva daca vreti sau poate sari intro parte a unui program(partea aleasa de voi). Private Sub cmdtest_Click() MsgBox « Salut ! » buna : MsgBox « Buna ! » ce : Msgbox « Ce faci ? » Goto buna pa : Msgbox « La revedere ! » End Sub Acest program daca il veti executati nu se va termina nici o data deoarece goto inainte de asi lua la revedere se executa din nou si tot asa.Dupa ce da un msgbox cu ce faci ? iar va va redirectiona la buna si tot asa. Proceduri In Visual Basic se poate declara o procedura folosind meniul programului adik Tools si dupaia submeniul Add Procedure.Iti va aparea o fereastra in care la Name scri numele proceduri si la Type vei alege ce fel de procedura vrei sa fie proceura ta(voi explica un pic mai tz despre aceasta) ,iar laScope alege vizibilitatea. Akm va voi arata cum sa declara tu o procedura fara ajutorul meniului(programului). In Visual Basic sunt 2 feluri de proceduri : -pt a nu rezulta nici o valoare se foloseste procedura Sub; -pt a rezulta o valoare se foloseste procedura Function ; Sub Si aceasta la randul ei se imparte in 2 :generale eveniment Procedura Sub generala trebe sa fie declarata explicit de program. Procedura Sub eveniment se refera la o procedura in care este eplata un eveniment.In toate exemplele de mai sus daca va uitati akm va zic ca sunt toate proceduri sub eveniment .O procedura eveniment este de exemplu Private Sub cmdtest_click().Evenimentul din aceasta procedura este click().Numele unei eveniment se combina cu numele controlului cu ajutorul lui « _ »(underscore). Declararea procedurii Sub in general este : [Private/Public][static]Sub nume[argument] Continutul programului End Sub Private,Public,static este ca la variabile,se refera la vizibilitatea in program.Argument este declararea unei variabile in acel program.De exemplu : Private Sub yo Dim name as inetger putem scrie Private Sub yo(nume as string) La asta se refera argument . Daca vreti sa folositi tipul array trebe sa folositi ParamArray. Apelarea unei proceduri se face cu ajutorul lui Call.Daca ati mai lucrat in alte limbaje de programare (cum ar fi pascal) call este ca clauza with de la tipul record sin pascal. Function Aceasta procedura returneaza o valoare. Declararea acestei fucntii este aproape ca a celei Sub: [Private/Public][static]Function nume(argument) as tip de variabila Corpul programului End Function Ce ziceti?Nui asa ca e exact ca seamana cu Sub,dar diferentza e ca in loc de sub declaram Function si ii acordam un tip de variabila(rezultatul care il va rezulta ii va lua acest tip). Functiile msgbox() si inputbox() Msgbox() Functia msgbox() afiseaza un mesaj intro fereastra noua.Aceasta functie este foarte mult folosita in Visual Basic. Sinatxa este: MsgBox(mesaj,[tipu;],[titlul]) mesaj :ceea ce vrei tu sa apara in acea fereastra(caractere si numere deobicei) tipul :se refera cum sa afiseze msgboxul.Sub forma de eroare(VbCritical),sub forma de intrebare(VbQuestion),sub forma de avertisment(VbExclamation),sub forma de informare (VbInformation). titlul :se refera la ce nume vrei sa aiba msgboxul. Daca ii atribuim unei variabile un msgbox ca in exemplu : m = msgbox(« Acesta este un test »,VbExclamation, »Test ») Variabila m i se va atribui o valoare intreaga in funtie de ce buton vrei sa apara 1-pt ok 2-pt cancel 3-pt abort 4-pt retry 5-pt ignore 6-pt yes 7-pt no Daca combinam aceste valori cu niste forme de afisare putem crea alte forme ca de exemplu : VbOKOnly :va afisa o informatie in care se foloseste buton ok VbOKCancel : ok si cancel VbAbortRetryIgnore : abort,retry si ignore(butoane) VbYesNoCancel :yes,no si cancel VbYesNo :yes si no VbRetryCancel :retry si cancel Cred ca vati prins de smecherie !!! Inputbox() Aceasta functie executa 2 aplicati :afiseaza ceva sub forma de intrebare asteapta un raspuns.(in special pt asta este folosita) Sintaxa(e ceva mai complecta decat msgbox()) InputBox(mesaj,[titlu],[default],[xpos],[ypos],[helpfile]) mesaj-ce intrebare vrei sai pui titlu-titlul ferestrei(ca la msgbox()) defaul-sir de caractere ce reprezinta un raspuns prestabilit xpos,ypox-reprezinta coordonate unde vrei s apara caseta text in aceast afereastra ; Fisiere Poi ce sa zic de fisiere ca aproape toti stiu ce is alea(de aceea nu mai dau si definitia).Fisierele sunt folosite peste tot si in toate limbajele de programare(cunoscute). Poi pt lucrul cu fisiere cateva lucruri elementare va voi explica yo aici. Pt a deschide un fisier(poi ca sa lucrezi cu un fisier obligatoriu trebe sa fie deschis) se foloseste urmatoarea sintaxa : Open calea for [input(asta se foloseste pt citire din fisiere)][Output(pt scriere in fisiere)][Append(pt a adauga ceva)] As nrfisiere(acest nume este folosit in programul nostru) Pt a scrie valoarea unei variabile intrun program folosim Print #nrfisiere,lista_de_variabile Tot pt scriere este folosit si urmatoarea instructiune dar aceasta scrie si stringuri si mai multe variabile. Write #nrfisier,lista_expresii Pt fisierele binare si aleatorii se foloseste isntructiunea Put #nrfisiere,lista_variabile. Fisierele binare si aleatori se deschid cu Random si Binary . Citirea dintrun fisier se face cu se foloseste : Input #nrfisiere,lista_variabile (pt liste de variabile sau stringuri) Line Input #nrfisiere,variabila (pt citirea unei liniii intregi dintr-un fisier) Get #nrfisiere,lista_variabil (pt fisierele binare si aleatorii) Si inchiderea unui fisier se face cu ajutorul instructiunii : Close #nrfisiere Daca vreti sa alegi o locatie de unde sa se deschida un fisiere (nush cum sa va explic,mai bn dau un exemplu) faceti aproape ca mine : Dim locatia as String comdlg32.Show (si aicea poate fi Save pt a salva,Open pt a deschide) locatia=comdlg32.FileName Open locatia for (optiunile de mai sus)[] as #nrfisiere Exemplu de program care lucreaza cu fisiere : Creati un control text care ii dati numele de txt_scriere si un buton pt a scrie cu numele de cmd_scris. Private Sub cmd_scris_Click() Open « c:\exemplu.txt » For Output As #1 Print #, txt_scriere.Txt Close #1 End Sub Meniu Daca ati urmat acest mic tutorial creat de mine poti crea un program cat de cat pt folos.Pt programele mari ,ati vazut ca se foloseste meniuri.De exemplu toate programele am vazut ca au meniul File .Te gandesti cum sa faci si tu asa ceva ,nu?(cred ).Poi foarte usor .Visual basic are inclus in program(in meniul lui) un editor de meniu.Pt al accesa tot ce trebuie sa faci e sa te « duci » in Tools dupaia dai la Meniu Editor.(Ctrl+E) Este foarte usor sa lucrezi in acest « editor »Poi sa va explic : La Caption –contine numele pe care tu il vezi(de exemplu File) La Name pui numele optiuni (de obicei cu prefixu _mnu) La Index pui o valoarea indexului intr-o matrice La Shortcat pui o combinatie de taste ca sa fie mai usor utilizatorului sa ffolosesti programu NegotiatePosition-pozitia fatza de alt meniu(coodonate) Checked-la fel ca o caseta de validare Butoanele : Next-urmatorul meniu Insert-insertarea unui submeniu intrun meniu Delete-stergea unui meniu Daca punem & in fata la o litera de la Caption va realiza(yo dau exemplu dar nui obligatoriu aceasta litera) a de exemplu Animal. Bibliografie In primul rand :Visual Basic in 30 de lectii de Marina-Cristiana Bold (poi am chiar in tutorialul meu multe propozitii luate de aici deoarece nu am avut cuvinte sa explic) In al doilea rand :siteurile(sincer nush ca am cautat pe google si mia dat rezultate si am tradus de pe acolo) Si in al3lea rand :din prorpiiile mele cunostinele (akm 2 saptamani mam apucat din plictiseala de Visual Basic si am zis pe baza ce invatz sa fac si un fel de test si sa scriu ce am invatzat->rezulta ceea ce e scris aici) Creat de mine cand eram beat parca(vas da si numele dar dupaia………..) Daca am gresit pe undeva sau aveti complectari va rog sa le postati.Am creat acest mic tutorial deoarece stiu cum e sa fi n00b(am fost si inca mai sunt in multe domenii)si cauti sa invetzi ceva si nu gasesti in romana.
  10. Cand vine vorba de riscuri, e uimitor ca inca mai permitem trafic email in companii. Pe de alta parte, nici nu poate fi oprit. Astfel, fiecare companie trebuie sa gaseasca un echilibru intre securitate si abilitatea de a se mentine in afaceri fara probleme. Urmand cateva principii de baza, nu exista nici un motiv pentru care traficul email legitim sa nu poata continua dinspre si inspre companie, in timp ce sunt eliminate lucrurile care provoaca pagube: virusi, spam, spyware, troiani, phishing, atacuri DoS (Denial of Service), pierderea informatiilor si colectarea materialelor ilegale, imorale sau pur si simplu neplacute. 1: Stabilirea si promovarea unei politici robuste pentru email Nu serverele trimit email-uri, ci oamenii. Din acest motiv, e important ca toti angajatii unei organizatii sa inteleaga exact regulile de folosire pentru email. O politica buna este: clara, usor de interpretat; realistica, bazata pe toate aspectele afacerii, pentru a reflecta modul de lucru al companiei; granulara, recunoscand ca utilizatori diferiti si departamente diferite folosesc email-ul intr-un mod diferit; flexibila, adaptabila usor la schimbarile din companie; actualizata, acoperind toate amenintarile noi; vizibila, o politica eficienta poate fi vazuta si in newsletter-uri, si in cantina, si in orice directie ar putea privi un angajat. 2: Aflati impotriva cui va aparati Daca strategia de securitate pentru email nu acopera cel putin una din urmatoarele amenintari, atunci un atac este iminent: virusi, troiani si boti, atacuri spam si phishing, spyware, atacuri Denial of Service, scurgeri de informatii confidentiale, hatemail si pornografie, materiale ilegale si fisiere furate, etc. O solutie de securitate care nu acopera toate aceste amenintari nu este o solutie de securitate. 3: Aveti grija ca apararea poate fi sustinuta O solutie de securitate pentru email care supraincarca departamentul IT si administratorii de email va esua eventual, si va irosi talent care ar fi mai folositor altundeva. O solutie care poate fi sustinuta: foloseste tehnologia cea mai recenta, inclusiv filtrarea robusta a traficului si unelte de analiza; este integrata, se ocupa de toate amenintarile printr-o singura solutie, de la o singura consola de management; este administrabila prin web si este usor de instalat, monitorizat si administrat. 4: Aveti grija ca intregul trafic sa fie protejat Nu e o idee buna sa protejati doar traficul care intra in reteaua companiei, iar traficul dinspre companie si cel intern sa fie complet neprotejate. Traficul dinspre companie poate contine virusi sau informatii confidentiale, mesajele interne pot contine hatemail sau fisiere ilegale, iar webmail-ul poate contine orice amenintare care se gaseste si in traficul normal. 5: Alegeti optiunea de instalare corecta Solutiile de securitate pentru email sunt disponibile in trei variante, fiecare cu avantaje si dezavantaje. Solutiile software sunt potrivite datorita subtilitatii si mediilor complexe dar necesita mai multa atentie. Dispozitivele sunt usor de folosit, dar ar fi de preferat servere proprii. Serviciile terte sunt perfecte pentru a tine traficul nedorit in afara companiei, dar majoritatea companiilor sunt impotriva ideii ca o firma terta sa se ocupe de traficul intern. Organizatiile mici prefera servicii terte sau dispozitive, pe cand companiile mari aleg de obicei un model pe nivele, cu dispozitive ca gateway-uri si software ca firewall-uri. 6: Inchideti fereastra pentru zero-day Solutiile antivirus si antispyware sunt bune pentru protectia impotriva amenintarilor cunoscute. Dar ce opreste un virus nou sa intre in retea inainte de a fi recunoscut si inainte ca patch-uri sa poata fi implementate? Fereastra zero-day este cea mai raspandita vulnerabilitate in strategiile de securitate email. Exista un singur mod de protectie impotriva sa: filtrare cu reguli inteligente. 7: Ganditi in viitor Amenintarile impotriva companiei sunt intr-o schimbare continua. Nu vreti sa investiti intr-o tehnologie care va fi depasita atunci cand apar vesti proaste. Cea mai importanta parte a unei solutii de securitate este motorul de filtrare si de impunere a politicii. Pentru a fi eficient, trebuie sa permita adaugarea unor reguli noi pentru blocarea amenintarilor noi. 8: Monitorizati traficul si performantele retelei Nu puteti proteja ce nu puteti vedea. Folositi rapoarte pentru a observa comportamentul traficului de email-uri si problemele de performanta, astfel incat sa puteti interveni rapid. Ambele tipuri de rapoarte ajuta la realocarea resurselor pentru trafic legitim. 9: Nu uitati imaginile Nu toate mesajele nedorite sunt text. Imaginile indecente, ilegale sau neplacute pot deranja angajatii. Materialele confidentiale ale companiei pot de asemenea sa apara sub forma de imagine. 10: Investiti in conformitate Noile reglementari pentru raporturi financiare si protectia informatiilor poate pune presiune mare pe departamentul IT. Gateway-ul pentru email este un loc ideal pentru automatizarea multor proceduri cerute de reglementari: criptarea, arhivarea si raportarea.
  11. Perioada 1993-1998 a fost foarte zbuciumata, marcata de o lupta foarte dura pe piata microprocesoarelor, in care Intel a inceput sa simta din ce in ce mai mult prezenta competitiei formate din AMD, Cyrix sau NexGen. Tot in aceasta perioada s-a lansat si standardul MMX care mai este folosit si in prezent. Era Pentium (1993-1998) Intel Pentium (22 martie 1993) Intel Pentium a fost primul procesor superscalar de la Intel (putea executa pana la doua instructiuni simultan). Multi s-au intrebat de ce Intel nu a denumit acest procesor 80586. Motivul a fost ca numele format numai din cifre nu putea fi protejat de copyright, asa ca Intel s-a vazut nevoit sa foloseasca si litere pentru a-si diferentia produsele de cele ale concurentei. Procesorul lucra cu o magistrala de date de 64 de biti (cu toate ca a fost un procesor pe 32 de biti) si a fost lansat initial la viteze de 60 si 66 de MHz. Au urmat insa foarte rapid versiuni de 75, 90, 100, 120, 133, 150, 166, 200, 233 MHZ. De fapt au existat trei versiuni de Pentium: prima versiune care nu cuprindea decat doua modele: Pentium la 60 si la 66MHz, a doua versiune care a adaugat instructiunile MMX si o ultima versiune care a micsorat distanta dintre tranzistoare permitand astfel viteze mai mari care au ajuns pana la 233MHz. Intel Pentium a fost primul microprocesor pentru PC-uri care putea sa calculeze mai mult de 100MIPS (milioane de instructiuni pe secunda). Tot pentru prima oara era posibila construirea unor sisteme care sa lucreze cu 2 procesoare in paralel (sisteme multiprocesor). Microprocesorul de la Intel venea cu 16Kb de cache incorporati in pastila de siliciu. AMD K5 / Nexgen Nx586 (1995) AMD a reactionat destul de tarziu in a lansa un procesor comparabil ca viteza cu Intel Pentium. In 1995 a produs totusi primul sau procesor care era conceput integral de catre ei, nemaifiind o simpla clona a procesoarelor Intel. Acest procesor s-a numit K5 si avea viteze de la 75 la 166MHz. Cu toate acestea nu era un procesor mai rapid decat cele de la Intel, in plus avand o unitate de calcul in virgula mobila destul de slaba (ca si Cyrix de altfel). Una din inovatiile aduse de K5 era faptul ca instructiunile x86 erau transformate intern in ROP (Risc OPerations). Aceste operatii RISC se puteau executa in nucleul RISC al procesorului care era mult mai rapud. In acelasi timp o companie de care putina lume auzise pana atunci, Nexgen, lansa primul sau procesor: Nx586. Complexitatea procesorului K5 a dus la frecvente destul de mici, ceea ce i-a facut pe cei de la AMD sa cumpere compania Nexgen care tocmai terminase design-ul noului lor procesor, NX686. Acest design a fost ulterior folosit de AMD in urmatoarea sa familie de procesoare pe care avea sa o lanseze in 1997. Cyrix 6x86 (Octombrie 1995) 6x86 a fost replica lui Cyrix la procesorul Pentium al lui Intel. Acest chip era produs initial de catre IBM dat fiind ca Cyrix nu avea unitati de asamblare de procesoare, insa ulterior, odata cu achizitionarea Cyrix de catre National Semiconductor a fost produs chiar de catre acestia. Procesorul a avut un succes destul de mare dat fiind ca era mai rapid decat un Intel Pentium la aceeasi frecventa. De altfel pentru a-l putea compara cu procesoarele de la Intel, cei de la Cyrix au inventat ceea ce s-a numit ulterior P-Rating. De exemplu procesorul Cyrix 6x86 care functiona la 150 de MHz a fost denumit 6x86PR200, ceea ce insemna ca era comparabil ca viteza cu un Pentium la 200. Unul din marile dezavantaje ale acestui procesor a fost insa viteza foarte mica a calculelor in virgula mobila. Cu toate acestea in aplicatiile de tip office s-a dovedit cel putin la fel de rapid ca si un Pentium. Intel Pentium Pro (1 noiembrie 1995) Acest procesor a fost una dintre cele mai mari inovatii tehnice produse de Intel pana acum. Procesorul ingloba pentru prima oara in istorie pe langa cache-ul Level1 de 8k pentru date si 8k pentru instructiuni, si un cache Level2 de 256Kb sau 512Kb. Folosea un sistem complex de predictie a ramurii de executie (branch prediction) si executie speculativa (speculative execution) - in momentul in care executia programului ajungea la o bifurcatie ramura corecta nu era stiuta pana in momentul in care se executa instructiunea conditionala; pentru ca procesorul sa nu astepte pana in acea clipa, se alegea una din cele doua ramuri si se incepea executia instructiunilor respective; daca se dovedea ca ramura aleasa a fost cea corecta aceasta insemna un castig important de viteza. Acest microprocesor transforma instructiunile x86 in microoperatii care erau mult mai mici si mai rapide. Acest lucru, cu toate ca avea ca rezultat o viteza mult mai mare a instructiunilor de 32 de biti, a dus la performante mult mai slabe in sistemele de operare care mai contineau cod pe 16 biti. Acesta a fost unul din motivele performantei mai mici comparabil cu Intel Pentium in Windows 95 de exemplu. Intel Pentium MMX (Ianuarie 1997) MMX s-a crezut initial ca inseamna MultiMedia eXtension, dar Intel a declarat ca inseamna Matrix Math eXtension. Acesta reprezinta un standard introdus de Intel care aduce cateva noi instructiuni care usurau in principal calculele matematice cu vectori. AMD K6 (Aprilie 1997) Ca urmare a cumpararii firmei Nexgen, AMD a reusit sa lanseze un nou procesor, K6 care avea viteze de la 166 la 266MHz. Bineinteles ca politica AMD a fost ca procesoarele sale sa se vanda la aproape jumatate din pretul la care se vindeau procesoarele Intel. K6 incorpora instructiuni MMX (a caror licenta a cumparat-o de la Intel) devenind astfel un rival de temut pentru procesoarele Intel Pentium MMX. Cyrix 6x86MX (30 Mai 1997) 6x86MX a adus nou extensiile MMX precum si viteze de ceas mai mari decat precedentele chip-uri de la Cyrix. Astfel cel mai performant model era 6x86MX PR266 care rula la 233MHz. De asemenea, marimea memoriei cache Level2 s-a marit de patru ori fata de 6x86, ajungand la 64Kb. Cyrix MII (14 Aprilie 1998) Aceasta versiune a chip-ului 6x86 a imbunatatit putin performanta FPU si a atins viteze mai mari ajungand la 300MHz (PR433). De asemenea viteza bus-ului a ajuns la 100MHz. Cyrix MediaGX (1998) MediaGX a reprezentat incercarea lui Cyrix de a produce un chip care sa integreze atat functiile de sunet si video, cat si controller-ul de memorie si CPU-ul in sine. Scopul acestui chip a fost acela de a putea produce computere foarte ieftine si la vremea aceea deja se vorbea de calculatoare sub 500$ (ceea ce era foarte putin la acea data) construite in jurul lui MediaGX. Cu toate acestea, nici unul din marii producatori de computere nu a adoptat aceasta solutie, astfel incat procesorul acesta, desi revolutionar, nu a avut deloc succesul scontat. Procesoarele Cyrix Arhitectura x86 Corporaþia Cyrix este unul dintre furnizorii de bazã ai soluþiilor bazate pe microprocesoare, care a introdus noi standarde pe piaþa calculatoarelor personale. ÃŽn ultimii zece ani Cyrix a dezvoltat aproape o duzinã de procesoare originale folosite în milioane de calculatoare din întreaga lume. ÃŽn luna noiembrie a anului 1997, Cyrix a fost cumpãratã de National Semiconductor. Aceastã fuziune a adus douã componente importante pentru Cyrix: capacitatea de producþie la nivel mondial a National Semiconductor ºi infrastructura necesarã acestei producþii. Primul produs Cyrix a fost un coprocesor matematic destinat creºterii vitezei de realizare a calculelor matematice. Succesul acestui coprocesor matematic a permis celor de la Cyrix sã distribuie începând cu 1992, primul procesor din familia x86. Compania a dezvoltat rapid o linie de producþie pentru procesoarele 486, ºi apoi pentru procesoarele din generaþia a cincea 5x86, un CPU pentru sistemele PC (mobile ºi desktop). ÃŽn 1995, Cyrix a introdus procesorul din generaþia a ºasea, 6x86, un procesor superscalar, bazat pe o superbandã de asamblare; în iunie 1997, a introdus procesorul MMX 6x86MX, iar în 1998 a apãrut procesorul MII. Procesorul Cyrix 5x86 Familia de procesoare 5x86 reprezintã o nouã generaþie pe 64 de biþi compatibilã x86. Unitatea centralã se bazeazã pe o bandã de asamblare cu ºase nivele, putând executa o instrucþiune într-un impuls de tact. Unitatea centralã 5x86 este divizatã în urmãtoarele blocuri funcþionale (Fig. 1): -unitatea pentru numere întregi (Integer Unit - IU), -unitatea în virgulã flotantã (Floating Point Unit - FPU) , -unitatea cache (Write-Back Cache) , -unitatea pentru gestiunea memoriei (Memory Management Unit - MMU) , -unitatea de interfaþã cu magistrala (Bus Interface Unit - BIU). Unitatea pentru numere întregi conþine: -tamponul pentru instrucþiuni (Instruction Buffer - IB) , -unitatea de aducere a instrucþiunii (Instruction Fetch Unit - IF) , -unitatea de decodificare a instrucþiunii (Instruction Decoder Unit - ID). Instrucþiunile sunt executate în unitatea pentru numere întregi sau în unitatea de calcul în virgulã flotantã. Cache-ul conþine cele mai recent utilizate date ºi instrucþiuni ºi asigurã accesul rapid la aceste date din partea IU ºi FPU. Când apare o cerere de acces la o locaþie din memoria externã, MMU calculeazã adresa fizicã pe care o trimite unitaþii de interfaþã cu magistrala, care asigurã interfaþarea unitaþii centrale cu memoria externã ºi celelalte circuite de pe placa de bazã. Unitatea pentru numere întregi Aceastã unitate citeºte, decodificã ºi executã intrucþiunile într-o bandã de asamblare cu ºase nivele (Fig. 2): -nivelul de aducere al codului instrucþiunii (Instrucþion Fetch - IF) - citeºte din cache codul instrucþiunii urmãtoare ºi îl trimite spre decodificare nivelului urmãtor din banda de asamblare. Se pot citi pânã la 128 de octeþi într-un impuls de tact, -nivelul de decodificare a instrucþiunii (Instruction Decode - ID) - evalueazã ºirul de octeþi primit de la nivelul IF, determinând numãrul de octeþi pentru fiecare instrucþiune ºi tipul acesteia, pe care apoi le decodificã la viteza de o instrucþiune într-un impuls de tact, -primul nivel de caclul al adresei (Address Calculation 1 - AC1) - dacã instrucþiunea are un operand în memorie, acest nivel calculeazã adresa de memorie liniarã pentru instrucþiune, -al doilea nivel de caclul al adresei (Address Calculation 2 - AC2) - realizeazã toate funcþiile de gestionare a memoriei, accesarea cache-ului ºi a registrelor. Dacã detecteazã o instrucþiune în virgulã flotantã, aceasta este trimisã pentru execuþie unitãþii în virgulã flotantã, -nivelul de execuþie (Execution - EX) - executã instrucþiunea folosind operanzii furnizaþi de nivelele pentru calculul adresei, -nivelul write-back (WB) - ultimul nivel din IU, actualizeazã setul de registre sau trimite rezultatul unitãþii de interfaþã cu memoria (Load/Store Unit) din MMU. Unitatea cache Procesorul Cyrix 5x86 conþine un cache unificat pentru date ºi instrucþiuni de 16Ko, set-asociativ pe patru cãi, organizat pe 1024 de linii. Scrierile în cache se fac prin metoda write-back. Memoria cache este organizatã în patru bancuri a câte 256 linii fiecare, cu 16 octeþi pe linie. Fiecare linie cache are asociat câte un tag pe 21 de biþi ºi un bit de valid (aratã dacã linia conþine informaþii valide sau nu). Pe lângã aceºti biþi, fiecare linie mai conþine încã patru biþi care indicã dacã conþinutul liniei a fost modificat (dirty bits), câte unul pentru fiecare dublu-cuvânt din linie. Aceºti ultimi patru biþi permit marcarea independentã a fiecãrui dublu-cuvânt ca fiind modificat, în loc de a marca întreaga linie ca fiind modificatã. Unitatea de gestionare a memoriei MMU translateazã adresele liniare furnizate de IU în adrese fizice, pentru a putea fi folosite de unitatea cache ºi unitatea de interfaþã cu magistrala. Mecanismul de paginare este cel standard x86. Unitatea pentru gestionarea memoriei mai conþine un bloc (Load/Store Unit) care planificã accesele la memoria cache ºi memoria externã ºi implementeazã urmãtoarele concepte: -reordonarea citirilor ºi scrierilor - conferã o prioritate mai mare citirilor din memorie faþã de scrierile în memorie, -evitarea citirilor din memorie - eliminã citirile inutile din memorie prin folosirea datelor existente deja în unitatea centralã (în cazul dependenþelor de tipul citire dupã scriere). Controlul ramificaþiilor, prezicerea ramificaþiilor, dependenþele între date, unitatea în virgulã flotantã, unitatea de interfaþã cu magistrala vor fi prezentate la procesorul 6x86. Procesorul Cyrix 6x86 Procesorul Cyrix 6x86 este cel mai performant dintre procesoarele de generaþia a ºasea compatibile x86. ÃŽmbunãtãþirea performanþelor este realizatã prin utilizarea unei arhitecturi superscalare, bazate pe o superbandã de asamblare. Cyrix 6x86 este un procesor superscalar, deoarece conþine douã benzi de asamblare separate ce permit procesarea mai multor instrucþiuni în acelaºi timp. Folosirea unei tehnologii de procesare avansate ºi creºterea numãrului de nivele în benzile de asamblare (superpipelining) permit procesorului 6x86 sã atingã frecvenþe de lucru mai mari de 100MHz. Prin folosirea caracteristicilor arhitecturale unice, procesorul 6x86 eliminã multe dintre dependenþele între date ºi conflictele la accesarea resurselor, rezultând o performanþã optimã atât pentru programele pe 16 biþi cât ºi pentru cele pe 32 de biþi. Procesorul Cyrix 6x86 conþine douã cache-uri: -un cache unificat (pentru date ºi pentru instrucþiuni) de 16Ko dual port, ºi -un cache de instrucþiuni de 256 octeþi. Deoarece cache-ul unificat poate conþine instrucþiuni ºi date în orice raport, acesta oferã o ratã a hit-urilor (numãrul de accese în cache, raportat la numãrul total de accese) mai mare comparativ cu douã cache-uri separate pentru date ºi pentru instrucþiuni, având dimensiuni egale. O creºtere a lãþimii de bandã a transferurilor cache-unitatea întreagã este realizatã prin suplimentarea cache-ului unificat cu un mic cache de instrucþiuni foarte rapid, complet asociativ. Prin includerea acestui cache de instrucþiuni, se evitã conflictele excesive între accesele pentru date ºi pentru cod în cache-ul unificat. Unitatea în virgulã flotantã din procesor permite executarea instrucþiunilor în virgulã flotantã în paralel cu instrucþiunile întregi. Aceasta conþine o coadã de instrucþiuni pe patru nivele ºi o coadã pentru datele scrise tot pe patru nivele, pentru a facilita execuþia paralelã. Procesorul 6x86 este alimentat la 3.3V ducând la un consum redus pentru toate frecvenþele de lucru. ÃŽn plus, 6x86 mai posedã un mod de suspendare pe nivel scãzut, posibilitatea de a întrerupe tactul ºi modul de management al sistemului (SMM) pentru aplicaþiile sensibile la alimentare. Principalele blocuri funþionale Procesorul Cyrix 6x86 conþine cinci mari blocuri funcþionale (Fig. 3): -Unitatea întreagã (Integer Unit - IU) , -Unitatea cache (Cache Unit) , -Unitatea de gestionare a memoriei (Memory Management Unit - MMU) , -Unitatea în virgulã flotantã (Floating Point Unit - FPU) , -Unitatea de interfaþã cu magistrala (Bus Interface Unit - BIU). Instrucþiunile sunt executate în cele douã benzi de asamblare întregi (X ºi Y) ºi în unitatea în virgulã flotantã. Cache-ul conþine cele mai recent utilizate date ºi instrucþiuni pentru a permite accese rapide la informaþii din partea IU ºi FPU. Adresele fizice sunt calculate de MMU ºi sunt trimise unitaþii cache ºi unitãþii de interfaþã cu magistrala. BIU oferã o interfaþã între placa sistem externã ºi unitaþile interne ale procesorului. Unitatea întreagã Unitatea de calcul cu numere întregi oferã o execuþie paralelã a instrucþiunilor în douã benzi de asamblare pentru numere întregi cu ºapte nivele (Fig. 4). Fiecare din cele douã benzi de asamblare (X ºi Y) poate procesa simultan câteva instrucþiuni. Benzile de asamblare întregi conþin urmãtoarele nivele de prelucrare: -aducerea codului instrucþiunii (Instruction Fetch –IF) , -primul decodificator pentru instrucþiuni (Instruction Decode 1 – ID1) , -al doilea decodificator pentru instrucþiuni (Instruction Decode 2 – ID2) , -primul bloc de calculare a adresei (Address Calculation 1 – AC1) , -al doilea bloc de calculare a adresei (Address Calculation 2 – AC2) , -execuþie (Execute – EX) , -writeback (WB) (Fig. 4). Nivelul de aducere al codului instrucþiunii (IF) este împãrþit de cele douã benzi de asamblare, aduce câte 16 octeþi de cod din unitatea cache într-un singur ciclu de tact. ÃŽn acest nivel se cautã orice instrucþiune de salt ce poate apare în fluxul de cod ºi poate afecta secvenþierea normalã a programului. Dacã este detectatã o instrucþiune de salt necondiþionat sau una de salt condiþionat, logica de prezicere a salturilor din acest nivel genereazã o posibilã adresã destinaþie pentru instrucþiunea de salt. Apoi IF aduce codul instrucþiunilor începând cu aceastã adresã. Funcþia de decodificare a codului instrucþiunii este realizatã de nivelele ID1 ºi ID2. Nivelul ID1, folosit de ambele benzi de asamblare, evalueazã ºirul de octeþi de cod transmis de nivelul IF ºi determinã numãrul de octeþi pentru fiecare instrucþiune. Acest nivel poate trimite cel mult douã instrucþiuni într-un impuls de tact nivelului ID2, câte una pentru fiecare bandã de asamblare. Cele douã nivele ID2 decodificã instrucþiunile ºi le trimite uneia din cele douã benzi de asamblare X sau Y spre execuþie. Banda de asamblare este aleasã bazatã pe tipul instrucþiunilor aflate deja în fiecare bandã ºi cât de repede se presupune cã se vor termina. Funcþia de calculare a adreselor este realizatã tot în douã nivele: AC1 ºi AC2. Dacã instrucþiunea are o referinþã la un operand în memorie, AC1 calculeazã o adresã de memorie liniarã pentru instrucþiune. Nivelul AC2 realizeazã toate funcþiile de gestiunea memoriei cerute, accesele la cache ºi accesele la setul de registre. Dacã AC2 detecteazã o instrucþiune în virgulã flotantã, aceasta este trimisã spre prelucrare unitãþii FPU. ÃŽn nivelul de execuþie (EX), se executã instrucþiunile folosind operanzii primiþi din nivelul AC2. Nivelul writeback (WB) este ultimul din unitatea de lucru cu numere întregi. ÃŽn acest nivel sunt stocate rezultatele execuþiei sau în registre sau în tamponul de scriere din unitatea cache. Procesarea în inordine Dacã o instrucþiune este executatã mai repede decât instrucþiunea precedentã din cealaltã bandã de asamblare, instrucþiunile sunt completate în inordine. Toate instrucþiunile sunt prelucrate în ordine pânã la nivelul EX. ÃŽn timp ce în nivelele EX ºi WB instrucþiunile pot fi executate în inordine. Dacã existã dependenþe de date între cele douã instrucþiuni, este necesarã intervenþia unui bloc care sã asigure execuþia corectã a programului. Astfel, chiar dacã instrucþiunile sunt executate în inordine, excepþiile ºi scrierile din cadrul instrucþiunilor sunt întotdeauna efectuate în ordinea cerutã de program. Selectarea benzii de execuþie ÃŽn majoritatea cazurilor, instrucþiunile sunt prelucrate în oricare din cele douã benzi de asamblare ºi nu existã constrângeri cu privire la tipul instrucþiunilor executabile în paralel în cele douã benzi de asamblare. ÃŽnsã, unele instrucþiuni pot fi prelucrate doar de banda de asamblare X: -instrucþiunile de salt, -instrucþiunile în virgulã flotantã, -instrucþiunile exclusive. Instrucþiunile de salt ºi cele în virgulã flotantã pot fi executate în paralel cu o altã instrucþiune ce poate fi executatã în banda Y. Instrucþiunile exclusive nu pot fi executate în paralel cu nici o altã instrucþiune. Aceste instrucþiuni necesitã accese multiple la memorie. Chiar dacã aceste instrucþiuni sunt executate exclusiv, este folosit hardware-ul din cele douã benzi de asamblare pentru a se accelera completarea instrucþiunii. ÃŽn continuare sunt înºirate tipurile de instrucþiuni exclusive ale procesorului 6x86: -încãrcarea segmentelor în modul protejat, -accesele la registrele speciale (registrele de control, debug ºi test) , -instrucþiunile pe ºiruri, -înmulþirea ºi împãrþirea, -accesele la porturile I/O, -PUSHA ºi POPA, -salturile intersegment, apelurile de proceduri ºi ieºirea din proceduri intersegment. Soluþionarea dependenþelor de date Când douã instrucþiuni care sunt executate în paralel acceseazã aceeaºi datã sau acelaºi registru, poate apare una din urmãtoarele tipuri de dependenþe de date: -citire dupã scriere (Read-After-Write - RAW) , -scriere dupã citire (Write-After-Read - WAR) , -scriere dupã scriere (Write-After-Write - WAW). Dependenþele între date în mod normal necesitã serializarea execuþiei instrucþiunilor implicate. ÃŽnsã, 6x86 implementeazã urmãtoarele trei mecanisme ce permit execuþia paralelã a instrucþiunilor ce conþin dependenþe între date: -redenumirea registrelor (Register Renaming) , -înaintarea datelor (Data Forwarding) , -evitarea datelor (Data Bypassing). ÃŽn continuare, se vor descrie pe scurt aceste meacnisme. Redenumirea registrelor Procesorul Cyrix 6x86 conþine 32 registre fizice de uz general. Fiecare din cele 32 de registre din fiºierul de registre poate fi desemnat a fi unul din registrele de uz general din arhitectura x86 (EAX, EBX, ECX, EDX, ESI, EDI, EBP ºi ESP). Pentru fiecare operaþie de scriere într-un registru este selectat un nou registru fizic, pentru a se reþine temporar ºi data precedentã. Redenumirea registrelor eliminã efectiv toate dependinþele WAW ºi WAR. Pentru programator este transparent acest mod de redenumire a registrelor; este transparent atât pentru sistemul de operare, cât ºi pentru programele aplicaþie. Exemplul 1. Redenumirea registrelor eliminã dependenþele de tipul scriere dupã citire (WAR). O dependenþã de tip WAR apare atunci când prima dintr-o pereche de instrucþiuni citeºte un registru logic ºi a doua instrucþiune scrie în acelaºi registru. Acest tip de dependenþã este ilustrat de perechea de instrucþiuni de mai jos: banda X banda Y (1) MOV BX, AX (2) ADD AX, CX (BX <- AX) (AX <- AX + CX) (Ordinea iniþialã din program a instrucþiunilor este arãtatã de numerele din paranteze.) ÃŽn absenþa redenumirii registrelor, instrucþiunea ADD din banda de asamblare Y ar trebui sã aºtepte pânã când instrucþiunea MOV din banda de asamblare X ar citi registrul AX. ÃŽnsã, procesorul 6x86 evitã blocarea benzii de asamblare într-o astfel de situaþie. Pe mãsurã ce este executatã fiecare instrucþiune, rezultatele sunt plasate într-un nou registru fizic, pentru a evita posibilitatea suprascrierii unei valori a unui registru logic ºi pentru a permite execuþia în paralel a douã instrucþiuni fãrã blocare (fãrã a fi necesarã nici o secvenþiere la accesarea aceleiaºi resurse). Exemplul 2. Redenumirea registrelor eliminã dependenþele de tipul scriere dupã scriere (WAW) O dependenþã WAW apare când douã instrucþiuni consecutive realizeazã scrierea în acelaºi registru logic. Acest tip de dependenþã este ilustrat de: banda X banda Y (1) ADD AX, BX (2) MOV AX, [mem] (AX <- AX + BX) (AX <- [mem]) Fãrã denumirea registrelor instrucþiunea MOV din banda de asamblare Y ar trebui sã fie întreruptã pentru a garanta cã instrucþiunea ADD din banda X ºi-a depus rezultatul în AX (Tab.2). ÃŽnaintarea datelor (Data Forwarding) Doar redenumirea registrelor, nu poate elimina dependenþele de tipul citire dupã scriere (RAW). 6x86 foloseºte douã tipuri de data forwarding împreunã cu redenumirea registrelor pentru a elimina acest tip de dependenþe: -înaintarea operandului (operand forwarding), - apare când prima dintr-o pereche de instrucþiuni efectueazã o citire din registru sau memorie iar aceastã datã este necesarã celei de-a doua instrucþiuni. CPU executã operaþia de citire ºi furnizeazã data cititã ambelor instrucþiuni; -înaintarea rezultatului (result forwarding) - apare atunci când prima dintr-o pereche de instrucþiuni executã o operaþie (cum ar fi ADD) iar rezultatul ei este citit de o a doua instrucþiune. CPU-ul executã operaþia primei instrucþiuni ºi depune rezultatul operaþiei în destinaþiile ambelor instrucþiuni simultan. Exemplul 3. ÃŽnaintarea operandului eliminã dependenþa de tipul RAW O dependenþã de tipul RAW apare când prima dintr-o pereche de instrucþiuni realizeazã o scriere iar a doua instrucþiune citeºte acelaºi registru. banda X banda Y (1) MOV AX, [mem] (2) ADD BX, AX (AX <- [mem]) (BX <- AX + BX) ÃŽnaintarea operandului poate apare doar dacã prima instrucþiune nu modificã valoarea iniþialã a datei. Exemplul 4. ÃŽnaintarea rezultatului eliminã dependenþa de tipul RAW O dependenþã de tipul RAW apare când prima dintr-o pereche de instrucþiuni realizeazã o scriere iar a doua instrucþiune citeºte acelaºi registru. banda X banda Y (1) ADD AX, BX (2) MOV [mem], AX (AX <- AX + BX) ([mem] <- AX) A doua instrucþiune trebuie sã fie o instrucþiune de transfer iar destinaþia ei poate fi sau un registru sau o locaþie de memorie. Evitarea datelor (Data Bypassing) Pe lângã redenumirea registrelor ºi înaintarea datelor, 6x86 conþine o a treia tehnicã de eliminare a dependenþelor de date, denumitã evitarea datelor. Aceasta reduce scãderilor în performanþã ale acelor dependenþe de tipul RAW din memorie ce nu pot fi eliminate cu ajutorul înaintãrii datelor. Evitarea datelor apare când prima dintr-o pereche de instrucþiuni scrie în memorie ºi urmãtoarea citeºte aceeaºi datã din memorie. 6x86 reþine data din prima instrucþiune ºi o paseazã celeilalte instrucþiuni, astfel eliminându-se un ciclu de citire din memorie. Exemplul 5. Evitarea datei în dependenþa de tipul RAW ÃŽn acest exemplu, dependenþa de tipul RAW apare când prima instrucþiune efectueazã o scriere în memorie iar instrucþiunea urmãtoare citeºte aceeaºi locaþie de memorie. banda X banda Y (1) ADD [mem], AX (2) SUB BX, [mem] ([mem] <- [mem] + AX) (BX <- BX - [mem]) Controlul ramificaþiilor ÃŽn programe instrucþiunile de salt apar în proporþie de 20-25%. Când fluxul de secvenþiere normalã al programului se schimbã datoritã unei instrucþiuni de salt, nivelele benzilor de asamblare trebuie blocate pânã când CPU-ul calculeazã adresa, aduce ºi decodificã noul flux de instrucþiuni. Procesorul Cyrix 6x86 minimizeazã degradarea în performanþã ºi latenþa introduse de instrucþiunile de salt prin folosirea conceptelor de prezicere a salturilor ºi execuþie speculativã. Prezicerea salturilor Procesorul 6x86 foloseºte un tabel al adreselor destinaþie (Branch Target Buffer - BTB) cu 256 de intrãri, set asociativ pe 4 cãi, pentru menþinerea adreselor destinaþie ale instrucþiunile de salt ºi a altor informaþii necesare prezicerii acestor salturi. ÃŽn timpul aducerii codului instrucþiunii sunt cãutate instrucþiunile de salt în fluxul de instrucþiuni. Dacã este descoperitã o instrucþiune de salt necondiþionat, CPU-ul acceseazã BTB pentru a afla adresa destinaþie a instrucþiunii de salt. Dacã aceastã adresã existã în BTB, CPU-ul începe sã aducã instrucþiunile de la noua adresã. ÃŽn cazul salturilor condiþionate, BTB mai menþine o serie de informaþii cu privire la istoricul efectuãrii saltului respectiv (pentru a se putea lua decizia de efectuare sau nu a saltului). Dacã instrucþiunea de salt condiþionat este gãsitã în BTB, 6x86 începe aducerea instrucþiunilor de la adresa prezisã. Dacã instrucþiunea nu este gãsitã în BTB, 6x86 prezice neexecutarea saltului ºi aducerea instrucþiunilor va continua cu adresa urmãtoare. Decizia de efectuare sau nu a saltului este luatã pe baza unui algoritm de prezicere a salturilor. Odatã ce a fost adus codul unei instrucþiuni de salt condiþionat, aceasta este decodificatã ºi distribuitã spre execuþie benzii de asamblare X. Instrucþiunea trece prin nivelele benzii de asamblare X ºi este terminatã sau în nivelul EX sau în WB, în funcþie de instrucþiunea care a setat indicatorii de condiþii: -dacã instrucþiunea care a setat indicatorii de condiþii este executatã în paralel cu instrucþiunea de salt condiþionat, atunci aceasta este terminatã în nivelul WB, -dacã instrucþiunea care a setat indicatorii de condiþii a fost executatã înaintea instrucþiunii de salt, atunci aceasta se va termina în EX. Instrucþiunile de salt condiþionat corect prezise se vor executa într-un singur impuls de tact. Dacã dupã terminarea execuþiei instrucþiunii de salt condiþionat s-a detectat o prezicere eronatã a saltului, CPU-ul goleºte benzile de asamblare ºi începe execuþia de la adresa corectã. Procesorul 6x86 în cazul unei instrucþiuni de salt condiþionat aduce în avans atât instrucþiunea prezisã cât ºi cealaltã, dar o trimite benzii de asamblare spre execuþie doar pe cea prezisã. Astfel cã, în cazul unei preziceri eronate, instrucþiunea de la adresa neprezisã nu va mai fi cititã din cache, deoarece a fost adusã deja. Dacã instrucþiunea de salt condiþionat a fost rezolvatã în nivelul EX, atunci întârzierea în cazul unei preziceri eronate este de patru impulsuri de tact, iar dacã instrucþiunea de salt a fost rezolvatã doar în WB, atunci întârzierea este de cinci impulsuri de tact. Deoarece instrucþiunea de revenire dintr-o subrutinã (RET) este dinamicã, procesorul 6x86 menþine adresele pentru aceste instrucþiuni într-o stivã cu opt intrãri. Adresa de revenire este introdusã în stiva adreselor de revenire de cãtre instrucþiunea CALL, ºi este scoasã de cãtre instrucþiunea RET corespunzãtoare. Execuþia speculativã Procesorul 6x86 are posibilitatea de a executa speculativ instrucþiunile urmãtoare unei instrucþiuni în virgulã flotantã sau a unei instrucþiuni de salt. Execuþia speculativã permite benzilor de asamblare sã execute continu instrucþiuni dupã un salt, fãrã a fi necesarã blocarea benzii de asamblare pânã la obþinerea rezultatului execuþiei instrucþiunii de salt condiþionat. Acelaºi mecanism este folosit pentru a se executa instrucþiuni în virgulã flotantã în paralel cu instrucþiunile de numere întregi. Procesorul are posibilitatea de execuþie în patru nivele de speculaþie. Dupã generarea unei noi adrese prin mecanismul de predicþie, CPU-ul salveazã starea curentã (registrele, indicatorii de condiþii, etc.), incrementeazã numãrãtorul nivelului de speculaþie ºi începe execuþia fluxului de instrucþiuni prezis. Odatã ce instrucþiunea de salt a fost rezolvatã, CPU-ul decrementeazã nivelul de speculaþie. Pentru un salt corect prezis este ºtearsã starea resurselor salvate la intrarea în nivelul de speculaþie curent. Pentru un salt prezis eronat, procesorul 6x86 genereazã adresa corectã pentru urmãtoarea instrucþiune ºi foloseºte valorile de stare salvate pentru a restaura starea curentã, într-un singur impuls de tact. Pentru a se menþine compatibilitatea, nu sunt permise scrierile în memorie sau cache, pânã când nu este rezolvatã instrucþiunea de salt. Execuþia speculativã continuã pânã când apare una din urmãtoarele condiþii: -este decodificatã o nouã instrucþiune de salt sau de calcul în virgulã flotantã ºi nivelul de speculaþie este patru (maximul) , -apare o excepþie sau o eroare, -tamponul de scriere este plin, -se încearcã modificarea unei resurse a cãrei stare nu a fost salvatã (registrele segment, indicatorii sistem). Cache-ul unificat de date ºi instrucþiuni Procesorul Cyrix 6x86 conþine un cache unificat ºi un cache de instrucþiuni (Fig. 5). Cache-ul unificat cu dimensiunea de 16Ko funcþioneazã ca un cache primar (L1) de date ºi ca un cache secundar (L2) de instrucþiuni. Configurat ca un cache set-asociativ pe patru cãi, conþine pânã la 16Ko de cod ºi date în 512 linii. Cache-ul este dual-port ºi permite executarea a douã din operaþiile urmãtoare în paralel: -citirea unui cod de instrucþiune, -citirea unei date (de cãtre banda X, banda Y sau FPU) , -scrierea unei date (de cãtre banda X, banda Y sau FPU). Acest cache foloseºte un algoritm de replasare pseudo-LRU (Last Recently Used) ºi poate fi configurat sã aloce o nouã linie de cache doar la un miss de citire, sau ºi la citire ºi la scriere. Cache-ul de instrucþiuni de 256 octeþi complet asociativ serveºte drept cache de instrucþiuni primar (L1). Cache-ul de instrucþiuni este încãrcat din cache-ul unificat prin magistrala de date internã. Citirile codurilor de instrucþiuni din unitatea pentru numere întregi care se gãsesc în cache-ul de instrucþiuni nu mai acceseazã cache-ul unificat. Dacã instrucþiunea nu este gãsitã în cache-ul de instrucþiuni, linia din cache-ul unificat care conþine instrucþiunea respectivã, este transferatã atât cache-ului de instrucþiuni cât ºi unitãþii pentru numere întregi. Acest cache foloseºte tot algorimtul de replasare pseudo-LRU. Pentru a se asigura operarea corectã în cazul codului automodificabil, orice scriere în cache-ul unificat este verificatã cu conþinutul cache-ului de instrucþiuni. Dacã a fost modificatã o locaþie care este prezentã ºi în cache-ul de instrucþiuni, atunci linia ce conþine respectiva locaþie este dezactivatã. Unitatea de gestionare a memoriei Unitatea de gestionare a memoriei (Memory Management Unit - MMU) a procesorului Cyrix 6x86, prezentatã în Fig. 6, translateazã adresele liniare furnizate de IU într-o adresã fizicã, pentru a putea fi utilizatã în continuare de cache ºi interfaþa cu magistrala. MMU include douã mecanisme de paginare, un mecanism tradiþional ºi un mecanism specific lui 6x86 cu pagini de dimensiuni variabile (Fig. 6). Mecanismul de paginare cu dimensiunea paginilor variabilã Acest mecanism de paginare permite programelor sã mapeze pagini cu dimensiunea între 4Ko ºi 4Go. Folosirea paginilor de dimensiuni mari poate duce la sporirea performanþei unor anumite aplicaþii. Mecanismul tradiþional de paginare Mecanismul tradiþional de paginare a fost îmbunãtãþit la 6x86 prin adãugarea unui cache pentru tabelul directorilor (Directory Table Entry -DTE) ºi un TLB victimã. TLB-ul principal este cu mapare directã ºi conþine 128 de intrãri pentru tabelul paginilor. Cache-ul DTE cu patru intrãri complet asociative conþine accesele cele mai recente la DTE. TLB-ul victimã conþine liniile din TLB principal care au fost înlocuite datoritã unui miss în TLB. Dacã se face referirea la o paginã ce are PTE-ul în TLB-ul victimã, linia aceasta este schimbatã cu o linie din TLB-ul primar. Unitatea în virgulã flotantã Interfaþa dintre unitatea în virgulã flotantã (FPU) a procesorului 6x86 ºi unitatea pentru numere întregi este realizatã printr-o magistralã internã pe 64 de biþi. Setul de instrucþiuni FPU al procesorului 6x86 este compatibil x87 ºi aderã standardului IEEE-754. Procesorul Cyrix 6x86 executã instrucþiunile întregi în paralel cu instrucþiunile în virgulã flotantã. Instrucþiunile întregi pot fi executate în inordine cu respectarea instrucþiunilor FPU. Aºa cum s-a mai spus, instrucþiunile FPU sunt întotdeauna executate în banda de asamblare X. Nivelul pentru calculul adresei din banda X verificã apariþia excepþiilor de gestionare a memoriei ºi acceseazã operanzii din memorie folosiþi de FPU. Dacã nu apare nici o excepþie, se salveazã starea curentã a procesorului în AC2 ºi trimite instrucþiunea în virgulã flotantã spre execuþie FPU-ului. Apoi unitatea centralã poate executa orice instrucþiune întreagã urmãtoare, speculativ ºi în inordine. Unitatea centralã 6x86 poate trimite pânã la patru instrucþiuni FPU în coada de aºteptare a FPU. CPU-ul continuã cu execuþia speculativã ºi în inordine pânã când apare una dintre condiþiile ce cauzeazã oprirea execuþiei speculative. Pe mãsurã ce FPU terminã de executat o instrucþiune în virgulã flotantã, este decrementat nivelul speculativ ºi sunt ºterse valorile de stare salvate la începutul acestei instrucþiuni. Unitatea în virgulã flotantã mai conþine ºi un set de patru tampoane de scriere pentru a preveni întreruperile datorate scrierilor speculative. Procesoarele Cyrix 6x86MX ºi MII Aceste procesoare au la bazã nucleul procesorului 6x86, îmbunãtãþit cu cele 57 instrucþiuni multimedia noi, compatibile cu tehnologia MMX. ÃŽn plus, 6x86MX ºi MII lucreazã la frecvenþe mai mari, conþin un cache de dimensiune mai mare, un tampon destinat translatãrii adreselor liniare în adrese fizice (TLB) pe douã nivele ºi un cache destinat adreselor de salt îmbunãtãþit (Fig. 7). Pentru a oferi suportul pentru operaþiile multimedia, cache-ul poate fi transformat într-o memorie RAM scratchpad. Aceastã memorie funcþioneazã ca o memorie privatã pentru CPUºi nu participã în operaþiile cache Pânã unde se poate merge în direcþia miniaturizãrii ºi creºterii performanþelor? O privire asupra dezvoltãrii procesoarelor de la origini pânã în prezent ne poate permite sã caracterizãm arhitecturile microprocesoarelor contemporane ºi chiar sã încercãm sã prevedem cum vor aratã cele de mâine. Am întâlnit de mai multe ori un banc pe Internet, care spunea cã, dacã maºinile ar fi evoluat în aceeaºi mãsurã cu calculatoarele, acum ar fi mers 120 de kilometri cu benzina dintr-o brichetã ºi ar fi costat cât o pâine. Pe de altã parte, un contra-banc, din partea industriei automobilistice, ofensate, zicea apoi cã, dacã ar fi evoluat la fel, maºina ar fi refuzat sã mai meargã de câteva ori pe zi, ºi ar fi trebuit sã o duci înapoi în garaj ca sã reporneascã. Adevãrul este cã progresele fãcute de tehnologia calculatoarelor sunt absolut uluitoare; ajunge sã îþi cumperi un calculator nou dupã doi ani ca sã fii impresionat de câºtigul de performanþã înregistrat. Sporul de performanþã se datoreazã unor procesoare din ce în ce mai sofisticate ºi mai rapide, ºi unor memorii de capacitãþi din ce în ce mai mari. Rãspunzãtoare pentru creºterea exponenþialã a performanþei sunt însã în cea mai mare mãsurã microprocesoarele. ÃŽn acest articol vom arunca o privire asupra evoluþiei microprocesoarelor de la origini pânã în prezent. Vom încerca apoi sã caracterizãm arhitecturile procesoarelor contemporane ºi sã extrapolãm din datele la dispoziþie, speculând despre unele din posibilele evoluþii viitoare. Trebuie sã atrag de la început atenþia cã nu am însuºiri paranormale ºi, ca atare, nu sunt profet. Domeniul tehnologiilor de calcul este extraordinar de volatil ºi se miºcã cu o vitezã fantasticã; orice previziune este cel puþin hazardatã. De altfel caseta "Performanþe - estimãri" ilustreazã acest fapt, contrapunând previziunile din urmã cu câþiva ani ale unei organizaþii extrem de prestigioase, Semiconductor Industry Association (SIA, http://www.semichips.org/), cu realitatea. Deci nu vã aºteptaþi de la mine la mai mult. Am mai publicat în PC Report o serie întreagã de articole despre arhitectura procesoarelor moderne, pe care le voie cita ocazional; toate acestea sunt disponibile din pagina mea de web. Articolul de faþã va fi însã mai superficial. Existã o cantitate enormã de informaþie pe web. ÃŽn acest articol am folosit în mod repetat informaþii de la http://bwrc.eecs.berkeley. edu/CIC/, CPU Info Center. Aspecte economice Un istoric interesant al diferitelor idei arhitecturale din microprocesoare puteþi gãsi pe web la http://bwrc.eecs.berkeley.edu/CIC/archive/ cpu_history.html. Primul microprocesor a fost creat de firma Intel în 1971. Numele sãu era Intel 4004, ºi era un procesor pe 4 biþi. Apariþia primului microprocesor a fost un pas cu uriaºe consecinþe în evoluþia ulterioarã a sistemelor de calcul. Diferenþa între microprocesor ºi metodele îndeobºte folosite era cã procesorul strânge pe o singurã pilulã de siliciu toate unitãþile funcþionale importante necesare executãrii programelor; fiind toate strâns integrate, comunicaþia între ele este rapidã ºi eficace, permiþând dintr-o datã un salt calitativ. Nu mai puþin importantã este reducerea de cost care urmeazã unei astfel de integrãri. Cu siguranþã cã principalul motiv al evoluþiei explozive a tehnologiei circuitelor integrate nu este de naturã tehnologicã, ci economicã: spirala preþurilor din ce în ce mai scãzute face echipamentele de calcul din ce în ce mai accesibile, cererea creºte, ducând la venituri mai ridicate pentru fabricanþi, care investesc mai mult în cercetare/dezvoltare ºi linii tehnologice, obþinând densitãþi mai mari, permiþând integrarea mai multor circuite precum ºi costuri ºi mai scãzute. Cu toatã scãderea de preþ, veniturile globale ale industriei semiconductoarelor au crescut în mod galopant: numai anul trecut vânzãrile globale au fost de 149 de miliarde de dolari! Esenþial pentru a menþine aceastã spiralã este faptul cã echipamentele de calcul mãresc enorm productivitatea muncii, direct sau indirect: de aici cererea crescândã. Iar experþii afirmã cã acesta este doar începutul ºi cã în viitor fiecare individ va depinde de zeci de dispozitive de calcul în fiecare clipã. Nu suntem prea departe de acest punct: chiar în ziua de azi, o maºinã modernã are în medie 15 microprocesoare, care controleazã, regleazã ºi diagnosticheazã tot felul de parametri, de la injecþie pânã la frâne. Nu pot sã mã abþin sã remarc cã Statele Unite ale Americii atribuie o treime din creºterea venitului naþional brut în anul trecut doar tehnologiilor informaþionale, care însã ocupã doar 8% din forþa de muncã. ÃŽn foarte mare mãsurã, tehnologia informaþiei este responsabilã pentru fenomenala dezvoltare economicã pe care Statele Unite o traverseazã în aceºti ani. Aspecte cantitative Sã lãsãm acum deoparte economia, ºi sã aruncãm o privire asupra evoluþiei unor parametri ai procesoarelor de-a lungul timpului. Tabela "Cronologia Intel" prezintã evoluþia generaþiilor succesive ale celei mai proeminente familii de procesoare, ale firmei Intel. Ultima coloanã din tabel ºi figura "Performanþe - estimãri" aratã care este impactul miniaturizãrii: aceastã coloanã indicã dimensiunea de bazã (feature size), care poate fi vãzutã ca fiind dimensiunea unui tranzistor. Orice reducere a acestei valori are un impact cvadratic, pentru cã suprafaþa creºte cu pãtratul laturii. O reducere de la 2 microni la 1,5 (50%) mãreºte deci suprafaþa efectivã cu 77% (4/2,25 = 1,77). Din fericire, reducerea dimensiunilor mai are încã o consecinþã foarte importantã: traseele pe care trebuie sã le parcurgã curentul electric între dispozitive devin mai scurte, deci se pot parcurge mai rapid. Proiectanþii pot face deci procesorul sã funcþioneze cu un ceas mai rapid. Observaþie: Majoritatea covârºitoare a procesoarelor contemporane funcþioneazã în mod sincron: întreaga lor funcþionare este orchestratã de un tact de ceas, care garanteazã cã feluritele pãrþi sunt sincronizate. Din ce în ce mai mult însã se tinde spre scheme cu multiple semnale de ceas, sau chiar scheme asincrone. Nu ne vom ocupa însã de aceste evoluþii în textul acestui articol. Faptul cã avem siliciu la dispoziþie pentru a implementa mai mulþi tranzistori înseamnã cã: 1). Putem muta mai multe circuite auxiliare pe acelaºi cip. Evoluþia procesoarelor cunoaºte câteva salturi calitative: când miniaturizarea fãcea posibilã integrarea unui nou dispozitiv pe acelaºi circuit integrat, se realiza un salt de performanþã. Astfel, au fost integrate succesiv: unitãþi din ce în ce mai mari de procesare (8, 16, 32, acum 64 de biþi), coprocesoare aritmetice, unitãþi de management al memoriei, cache-uri de nivel 1 ºi chiar 2; 2). Designerii folosesc tranzistorii suplimentari pentru a construi circuite mai sofisticate, care pot executa mai repede ºi mai eficient programele. Metoda fundamentalã folositã este de a face mai multe lucruri în paralel. ÃŽmpreunã aceste trei fenomene (viteza ceasului, integrarea pe o singurã pastilã ºi exploatarea paralelismului) contribuie la creºterea performanþei totale a procesoarelor. Aºa cum am povestit ºi cu alte ocazii, mãsurarea performanþei unui calculator se face evaluând sistemul pe mai multe programe (deci performanþa depinde foarte mult ºi de compilatorul folosit), care de obicei fac parte din suite de teste standardizate (benchmark suites). Cele mai folosite pentru a evalua procesoare sunt cele din seria SPEC (Standard Performance Evaluation Corporation, http:// www.specbench.org). Nu ne va interesa acum prea tare ce reprezintã numerele acestea; cert este cã cu cât sunt mai mari, cu atât e mai bine. Graficul din figura "Performanþe - SPEC" aratã evoluþia performanþei procesoarelor în ultimii 10 ani, în termeni SPEC. Evoluþia urmãreºte aproximativ o curbã exponenþialã: în fiecare an performanþa creºte cu 60%. Tehnologii arhitecturale Aºa cum am ilustrat în seria mea de articole intitulate "Arhitectura avansatã a procesoarelor", o mulþime de inovaþii tehnologice au fost introduse una dupã alta în arhitecturi; de fapt intenþionez sã continui aceastã serie ºi în viitor, pentru cã mai sunt de prezentat ºi alte mecanisme importante. ÃŽmi permit sã prezint în continuare viziunea profesorului John Hennessy, de la universitatea Stanford, aºa cum a expus-o în prelegerea pe care a þinut-o ca invitat la Federated Computer Research Conferences, în mai 1999. Hennessy vede douã tehnologii arhitecturale ca fiind esenþiale: exploatarea paralelismului la nivel de instrucþiune (Instruction Level Parallelism, ILP) ºi ierarhii sofisticate de memorie (cache-uri). Sã spunem câteva cuvinte despre fiecare: ILP Paralelismul la nivel de instrucþiune constã în independenþa instrucþiunilor din programe una de alta, ceea ce ne permite sã executãm mai multe instrucþiuni simultan. Am vorbit altãdatã pe larg despre paralelismul la nivel de instrucþiune; sã observãm cã toate procesoarele contemporane îl exploateazã prin douã forme: Execuþia pe bandã de asamblare (pipeline) a instrucþiunilor succesive; Execuþia în paralel a instrucþiunilor independente: procesoarele de tip VLIW (very long instruction word) aleg la compilare care instrucþiuni merg în paralel, iar procesoarele superscalare fac aceastã alegere în timpul execuþiei. Astfel, în 1985 au apãrut primele procesoare cu banda de asamblare, în 1990 primele procesoare de tip VLIW, iar în 1995 procesoare foarte sofisticate superscalare, care pot executa instrucþiunile în ordini foarte diferite de cea din program (out-of-order execution). Cache-uri Am scris în repetate rânduri despre cache-uri în PC Report (de pildã martie 1997 ºi noiembrie 1998). Aici vom arunca doar o privire superficialã asupra lor; scopul nostru este de a înþelege de ce cache-urile joacã un rol fundamental în creºterea performanþei. Figura "Performanþe - memorii ºi procesoare" ne oferã cheia: deºi atât procesoarele cât ºi memoriile cresc constant în vitezã, creºterea procesoarelor este cu 50% mai rapidã decât a memoriilor. Ca atare existã o disparitate crescândã între nevoile de date (ºi instrucþiuni) ale procesorului ºi ceea ce memoriile pot oferi. Durata unui acces la memorie ajunge la zeci de cicli de ceas pentru procesoarele contemporane. ÃŽntârzierea accesului este ºi mai exacerbatã în cazul sistemelor care au mai multe procesoare, în care caz timpii de acces la date pot ajunge la mii de cicli. Din aceastã cauzã se construiesc cache-uri, care sunt memorii mai mici ºi mai rapide, care se plaseazã între procesor ºi memoria principalã, ºi în care sunt aduse datele pentru prelucrare. Proiectanþii au reuºit sã sporeascã eficacitatea cache-urilor folosind douã metode: (a) Prin folosirea unor cache-uri din ce în ce mai mari, plasate din ce în ce mai aproape de procesor. Aceastã evoluþie este clar vizibilã: Primele procesoare nu aveau nici un fel de cache, pentru cã memoriile erau suficient de rapide pentru a le servi cu date. ÃŽn 1980 au apãrut cache-uri (L1) sub forma unor circuite speciale, care în 1984 au fost integrate pe aceeaºi pilulã de siliciu cu procesorul central, dupã care (1986) a apãrut un al doilea nivel de cache (L2), mai mare ºi ceva mai lent, care în procesoarele moderne (1995) este la rândul lui adesea integrat cu circuitul microprocesorului, pentru a permite un acces rapid. Au apãrut nivele terþiare de cache (1999). ( Pe de altã parte metodele de management ale cache-urilor sunt din ce în ce mai sofisticate: Au apãrut cache-uri care servesc procesorul de îndatã ce primul cuvânt a sosit, chiar dacã restul sunt pe drum (early restart, 1992), cache-uri care nu blocheazã procesorul când datele lipsesc, ci îi permit sã continue execuþia (non-blocking, 1994) ºi tot felul de alte tehnologii sofisticate, pe care le-am expus în alte pãrþi (cache-uri victimã, buffere de scriere, instrucþiuni speciale (prefetching) de management al cache-ului etc.). Tot aici se cuvine sã menþionãm multiprocesoarele simetrice ºi protocoalele de coerenþã ale cache-urilor pentru astfel de sisteme; toate procesoarele moderne sunt construite pentru a fi folosite în sisteme multi-procesor, ºi includ astfel de dispozitive. Arhitecturile contemporane Astfel, urmãrind evoluþia arhitecturilor, am ajuns pânã în ziua de azi. Vom încerca sã caracterizãm sumar starea arhitecturilor, dupã care vom arunca o privire asupra unora din direcþiile viitoare. Hardware ºi software. Istoria modernã a procesoarelor contrapune douã paradigme pentru creºterea performanþei, bazate pe software ºi respectiv pe hardware. Aparent, un articol despre arhitectura procesoarelor nu are nimic de-a face cu softul. Nimic mai greºit: la ora aceasta existã o simbiozã totalã între hardware ºi software. Procesoarele se proiecteazã odatã cu compilatoarele care le folosesc iar relaþia dintre ele este foarte strânsã: compilatorul trebuie sã genereze cod care sã exploateze caracteristicile arhitecturale, altfel codul generat va fi foarte ineficace. Metodele de creºtere a performanþei cu ajutorul compilatoarelor se numesc ºi statice, pentru cã programul este analizat ºi optimizat o singurã datã, înainte de a fi pornit în execuþie. Metodele bazate pe hardware se numesc dinamice, pentru cã sunt aplicate în timp ce programul se executã. Istoria arhitecturilor contrapune mereu cele douã paradigme: de exemplu dezbaterea iniþialã RISC/CISC era de aceeaºi naturã, ca ºi dezbaterea între superscalar ºi VLIW, pe care am menþionat-o deja în acest text. Notã: ÃŽn anii '80 a apãrut ideea de a face procesoarele mult mai simple pentru a le permite sã meargã mai repede. Astfel de arhitecturi au fost numite RISC: Reduced Instruction Set Computer, prin contrast cu celelalte, Complex ISC. De fapt, aºa cum menþionam ºi în alte articole (de exemplu în PC Report din iunie 1999), existã lucruri care se pot face numai static ºi existã lucruri care se pot face numai dinamic. Aºa cã de fapt, chiar arhitecturile care pornesc la una din extreme, tind sã conveargã cãtre folosirea unui amestec de trãsãturi din ambele domenii: La ora actualã distincþia RISC/CISC aproape cã s-a estompat. De exemplu, Pentium, un procesor tipic CISC, de fapt traduce în mod automat instrucþiunile în instrucþiuni de tip RISC în hardware, dupã care le executã. Pe de altã parte, toate procesoarele RISC au cãpãtat extensii la setul de instrucþiuni (gen CISC) pentru a le mãri eficacitatea; de pildã toate procesoarele au extensii speciale pentru multimedia. De asemenea, graniþele dintre super-scalar ºi VLIW tind sã se estompeze, fiecare împrumutînd din tehnologiile celuilalt. Cu siguranþã cã un model mixt este preferabil, pentru cã poate lua ce e mai bun din fiecare tehnologie. Crusoe Se cuvine sã atragem atenþia asupra unei recrudescenþe a "luptei" sistemelor pure: anul acesta compania Transmeta a anunþat apariþia unui nou procesor, numit Crusoe, care exploateazã la maximum tehnologiile statice (compilarea). Compania Transmeta a fãcut mare vâlvã, nu atât prin procesorul lor, care poate simula alte procesoare, inclusiv cele ale firmei Intel, ci prin faptul cã angajeazã pe cel mai faimos programator al planetei, Linus Torvalds, creatorul sistemului de operare Linux. Transmeta a lansat Crusoe cu mare pompã în luna ianuarie; compania predicã întoarcerea la simplitate (care a fost sugeratã atât de curentul RISC, cât ºi de modelele VLIW), în care hardul este simplu ºi rapid iar compilatorul duce greul. Echipa care a lucrat la Transmeta este compusã în mare mãsurã din ingineri plecaþi de la IBM: IBM a lucrat la o versiune de procesor PowerPC care putea face exact acelaºi lucru: putea executa în mod nativ cod x86 (adicã compatibil Intel), dar proiectul lor a fost întrerupt deºi era într-o stare foarte avansatã, aparent din motive de marketing. Cât de serios este acest nou competitor? Din pãcate atuurile lui Crusoe nu sunt prea clare: • cipul nu are un ceas mai rapid decât procesoarele Intel (versiunile de Crusoe disponibile acum merg doar la 400Mhz, comparativ cu Pentium, care ajunge la 800); • cipul într-adevãr consumã mult mai puþinã energie ºi are nevoie de mult mai puþinã rãcire. Transmeta afirmã cã asta-l face ideal pentru laptop-uri. Din pãcate, principalul consumator de energie într-un laptop nu este procesorul, ci ecranul ºi discul, aºa încât avantajele noului cip vor fi marginale; • Crusoe se bucurã de compatibilitate cu setul de instrucþiuni x86; dar pentru platformele pe care x86 este dominant (desktop, laptop, chiar ºi server) am vãzut cã performanþa lui este insuficientã. Dacã Crusoe vrea sã concureze pentru celelalte pieþe, de procesoare integrate (embedded computing), atunci are de-a face cu alþi competitori formidabili, ca procesoarele de semnal de la Motorola, Texas Instruments ºi Intel (ARM), asupra cãrora nu este clar câte avantaje are. Probabil cã pentru a rãmâne viabil, Crusoe va trebui sã se metamorfozeze ºi sã devinã mai complicat, folosind ºi o serie de mecanisme dinamice de creºtere a performanþei. ÃŽn definitiv existã o singurã resursã aproape gratuitã ºi care este în cantitãþi suficiente: numãrul de tranzistori. Datoritã miniaturizãrii numãrul de tranzistori disponibili pentru design creºte enorm; de aceea simplitatea cu orice preþ (aºa cum o încarneazã Crusoe) nu este neapãrat o calitate. Constrângerile fizice Proiectanþii de microprocesoare se lovesc în ziua de azi de mai multe dificultãþi. Nici una dintre ele nu e insurmontabilã, dar soluþiile sunt din ce în ce mai grele. Vom arunca o privire asupra unora dintre ele; încercarea de a extrapola impactul acestor bariere în viitor va sugera apoi soluþii pentru depãºirea lor. Accesul la memorie Dupã cum am vãzut în figura "Performanþe - memorii ºi procesoare", în ultimii 10 ani viteza memoriilor a crescut cu 10% pe an, în timp ce viteza procesoarelor a crescut cu o rata de 60%. Toate motivele ne îndeamnã sã credem cã aceastã disparitate va continua sã se accentueze, ºi cã preþul relativ al unui acces la memorie (mãsurat în cicli de ceas) va continua sã creascã. Putere Un alt factor care limiteazã evoluþia circuitelor integrate este consumul de putere; în urmã cu 15 ani un procesor consuma 2 waþi; astãzi un procesor ca Alpha 80364 consumã 100W; de aici rezultã limitãri pentru ceas (puterea consumatã creºte cu frecvenþa ceasului), ºi necesitatea unor dispozitive speciale de rãcire. Din fericire tehnologia lucreazã în direcþia favorabilã: miniaturizarea duce la scãderea puterii necesare. Un alt factor care duce la scãderea puterii consumate este scãderea tensiunilor de alimentare. Interesant este faptul cã, deºi dimensiunea tranzistorilor a scãzut într-una, dimensiunile circuitelor fabricate au crescut: foamea neostoitã a designerilor cere suprafeþe din ce în ce mai mari ale plãcuþelor de siliciu; de aceea puterea consumatã a crescut ºi ea. Complexitate Un factor deloc neglijabil este complexitatea enormã a circuitelor. Procesoarele cele mai moderne au peste 25 de milioane de tranzistoare, iar în câþiva ani designerii vor avea la dispoziþie un miliard. Astfel de circuite sunt foarte greu de verificat ºi testat. La ora actualã o companie ca Intel cheltuieºte 40% din budget pentru proiectare ºi dezvoltare, ºi 60% pentru verificare ºi testare! O altã problemã importantã este legatã de liniile tehnologice de fabricaþie: o astfel de instalaþie costã la ora actualã douã miliarde de dolari. Puþine companii îºi pot permite investiþii de asemenea anvergurã pentru o tehnologie care se schimbã în 3 ani! Sârmele E clar cã miniaturizarea nu va putea continua în acelaºi ritm exponenþial: peste ceva vreme am ajunge la necesitatea de a face un tranzistor mai mic decât un atom, ceea ce e evident imposibil. Dar chiar înainte de a atinge un astfel de prag, vom avea alte probleme de înfruntat. O analizã extrem de interesantã a fost fãcutã de Mark Horowitz, profesor la universitatea Stanford, într-un articol intitulat "Viitorul sârmelor". Articolul porneºte de la caracteristicile electrice ale semiconductorilor ºi analizeazã o serie de scenarii posibile pentru tehnologiile de fabricaþie. Textul ia în considerare tot felul de factori, cum ar fi geometria sârmelor, capacitãþi ºi rezistenþe, disiparea puterii etc. Vom ignora toate aceste detalii, însã vom privi una din concluziile la care autorul ajunge. Autorul observã cã în general sârmele vor evolua în sensul dorit: vor deveni mai scurte, iar viteza de transmisiune a informaþiei nu va scãdea, relativ la dimensiunea circuitului. Deci dacã am lua un microprocesor de astãzi ºi l-am reduce la scarã, sârmele nu ar constitui un impediment în funcþionarea sa corectã. Problema apare însã din faptul cã de fapt suprafaþa circuitelor nu scade, din cauzã cã designerii adaugã noi module. O mare problemã sunt sârmele care traverseazã mai multe module. Lungimea acestora rãmâne practic constantã, în milimetri. Ori, cum viteza ceasului creºte mereu, asta înseamnã cã semnalele electrice nu mai au timp sã parcurgã sârmele de la un capãt la altul. La 1Ghz, lumina strãbate în vid 30 de centimetri. Dar viteza luminii în solide este mai micã iar viteza de propagare scade semnificativ odatã cu numãrul de "consumatori" ai sârmei (adicã o sârmã conectatã la 3 circuite e mult mai lentã decât una cuplatã la doar douã). De asemenea, liniile lungi de transmisiune vor avea nevoie de amplificatoare, care încetinesc substanþial semnalul. Asta înseamnã cã circuitele viitorului nu vor mai putea comunica prin semnale globale: pur ºi simplu va fi imposibil pentru o sârmã sã uneascã diferitele pãrþi ale circuitului. Aceasta este o consecinþã de cea mai mare importanþã pentru arhitecturile viitoare! Zgomotul ÃŽn fine, pe mãsurã ce tranzistorii sunt mai mici, sârmele sunt mai subþiri ºi consumul de putere este mai mare, circuitele sunt mai sensibile la zgomot, fie el termic, din mediu (de exemplu radiaþii cosmice) sau, în curând, chiar efecte cuantice! Fenomenele de transport din semiconductori pe care se bazeazã tranzistorul sunt fenomene statistice: or, când dimensiunile devin atât de mici încât numai câþiva electroni produc semnalele, statistica nu mai opereazã iar excepþiile încep sã aparã. Generaþia urmãtoare ÃŽn aceastã ultimã secþiune vom încerca sã discernem ce ne oferã viitorul. Marile companii lucreazã simultan la mai multe generaþii ale unui procesor, cu echipe independente, ca atare ceva din ceea ce viitorul ne rezervã poate fi observat în produsele comerciale în curs de proiectare, în mãsura în care companiile dezvãluie astfel de informaþii. Cercetarea în arhitectura procesoarelor este efervescentã, atât în industrie cât ºi în universitãþi; este absolut imposibil de urmãrit întregul peisaj. Iatã însã unele dintre direcþii: Evoluþie incrementalã Un efort substanþial este în continuare depus în a perfecþiona tehnicile care în ultimii 15 ani au servit atât de bine arhitectura, pe care le-am descris mai sus: exploatarea paralelismului la nivel de instrucþiune ºi ierarhiile de memorie. Iatã unele dintre tendinþe: Trace cache: este un cache pentru instrucþiuni care, în loc de a pãstra instrucþiunile în ordinea adreselor lor, le menþine în ordinea în care este probabil sã fie executate. Execuþia speculativã ºi predicþia valorilor: într-un articol anterior din PC Report (din iulie 1999) am vãzut cã principala limitare în calea execuþiei paralele a instrucþiunilor sunt dependenþele între instrucþiuni: una are nevoie de rezultatul alteia pentru a se executa. Or, dacã prima instrucþiune dureazã mult, atunci a doua nu se poate executa nici ea. Soluþia ades folositã este de a ghici valoarea rezultatã ºi de a executa ºi instrucþiunea dependentã. Când rezultatul primei instrucþiuni soseºte, este comparat cu cel ghicit (prezis); dacã predicþia a fost corectã, toate sunt bune, altfel instrucþiunea dependentã este re-executatã. Existã felurite forme de predicþie a valorilor, unele folosite deja de multã vreme (cum ar fi predicþia salturilor, pe care am descris-o în PC Report din august 1999), dar este plauzibil ca scheme din ce în ce mai sofisticate sã-ºi facã apariþia. Execuþia predicatã, care este deja folositã de procesoare de prelucrare de semnal ca Texas Instruments C6X, ºi care va fi una din trãsãturile fundamentale ale noii arhitecturi de la Intel, Merced. Execuþia predicatã evitã execuþia instrucþiunilor de salt (care au un efect negativ asupra performanþei, aºa cum am arãtat în articolul mai sus-citat) ºi preferã sã execute instrucþiuni în mod inutil dupã care sã arunce rezultatele la gunoi (de exemplu, când avem o structurã de genul if-then-else, o arhitecturã predicatã poate executa ambele ramuri ale condiþiei, dar va permite numai uneia dintre ele sã-ºi facã efectele vizibile). Multi-procesoare Aºa cum am vãzut, proiectanþii tind sã înghesuie din ce în ce mai multe circuite pe aceeaºi pilulã de siliciu. O evoluþie naturalã este de a face saltul de la mai multe procesoare legate printr-o magistralã comunã (ca în cazul sistemelor cu multiprocesoare simetrice, pe care le-am descris în PC Report din noiembrie 1998) în procesoare strâns cuplate, pe aceeaºi pilulã de siliciu. De fapt, astfel de scheme existã deja: procesorul pentru mainframes IBM S/390 are douã nuclee identice, care executã sincron acelaºi program: în cazul în care rezultatele nu sunt identice se executã o excepþie ºi programul este reluat. Acesta este un exemplu în care mai multe resurse sunt folosite pentru o fiabilitate sporitã, dar IBM a anunþat cã viitorul lor procesor G5 va conþine douã nuclee independente pe aceeaºi pilulã, permiþând realizarea unor sisteme multi-procesor cu un singur cip. Multithreading O evoluþie naturalã ar fi spre a exploata alte forme de paralelism decât cel la nivel de instrucþiune (ILP). Calculatoarele moderne exploateazã excelent paralelismul la nivel de proces, dar existã forme intermediare, ºi trebuie sã ne aºteptãm sã vedem arhitecturi din ce în ce mai orientate spre acestea: • Paralelism la nivel de buclã: în care iteraþii succesive ale unei bucle sunt executate în paralel. • Paralelism la nivel de thread; despre multithreading am scris un articol amplu în PC Report din ianuarie 1997. Existã o sumã de inovaþii arhitecturale legate de aceste tehnologii, încã ne-integrate în produse comerciale. Sã privim cîteva dintre ele: • Thread-level data speculation: este o metodã de a implementa paralelismul la nivel de buclã, lansând câte un thread pentru fiecare iteraþie a buclei. De exemplu, proiectul STAMPede de la Universitatea Carnegie Mellon, condus de profesorul Todd Mowry exploreazã aceastã alternativã (http://www.cs.cmu.edu/ ~tcm/STAMPede.html). • Simultaneous multi-threading, propus la universitatea din Seattle în 1995. Aceastã tehnologie menþ
  12. vladiii useru care posteaza nu e obligat sa testeze ceea ce posteaza ce vina are saracu om si el al luat de undeva asa ca;)
  13. escalation666 pune pozele alea sa intelegem si noi nu numai tu ca eu le vad cat un dop
  14. Autorii de malware au lansat atacuri ce vizeaza vulnerabilitatile critice de pe Yahoo Messenger, realizând 40-50 de site-uri malitioase care ataca utilizatorii neprotejati. „Vulnerabilitatea este una critica. Utilizarea ei a crescut dupa ce a fost dezvaluita”, a spus intr-un interviu Stephan Chenette, Manager la Websense Security Labs. Chenette a spus ca autorii de malware au adunat codurile facute publice saptamâna trecuta si au inceput sa lucreze cu ajutorul lor. Codul malitios profita de problemele de securitate din sistemul de incarcare si vizionare a imaginilor transmise prin intermediul webcam-ului. Chanette a spus ca realizatorii de virusi au preluat codul initial si au realizat o serie diferita de malware. Codul este integrat in 40 sau 50 de site-uri. Când cineva care utilizeaza Yahoo Messenger viziteaza unul dintre aceste site-uri, exploit-ul se instaleaza in computer si downloadeaza fie un troian de tip backdoor, fie un keylogger, potrivit celor de la Websense. Ambele cauta parole si informatii bancare pentru a le trimite atacatorului. Multe dintre site-urile malitioase isi au originea in China, sustine Chenette, care adauga ca 50% dintre site-uri sunt pur si simplu pagini web malitioase care au fost folosite inainte pentru raspândirea de malware. in cealalta jumatate sunt incluse site-uri pe care atacatorii le-au compromis cu cod exploit. Codul exploit a fost lansat initial pe internet in data de 6 iunie, la o zi dupa ce specialistii de la eEye Digital Security au postat informatii despre vulnerabilitatile Yahoo Messenger pe site-ul lor. Yahoo a lansat rapid un remediu pentru vulnerabilitati, vineri, la numai doua zile dupa ce acestea au fost facute publice. Se pare ca Terrell Karlsten, un purtator de cuvânt de la Yahoo, a dezvaluit prea multe informatii despre bug-uri intr-un interviu oferit celor de la InformationWeek, iar acele informatii l-au ajutat pe un hacker, care isi spune „Danny”, sa ajunga chiar la codul cu probleme. Sursa: Chip
  15. Deobicei, pentru a gasi xss pe un site, hackerii se folosesc de: <script>alert("XSS")</scripr> Sau chiar: "><script>alert("XSS")</scripr> Dar cred ca va venit intrebarea – Dece? Cred ca stiti ca xss vulnerabilitatile apar din cauza filtrarii proaste a codului… <html> <head> <title>Xss Vulnerabilitate</title> </head> <!-- html --!><!--cel mai bine e daca folositi html--!> ..................... <form action="" method=post> [b]codul Dvs:[/b]</br></br> <input type="text" name="xss"></br></br> <input type="submit" value="XSSvul"></br> </form> ...................... <!—mai departe e scriptul --!> <? if(isset($xss)) { .... //Daca exista xss atunci vom indeplini echo '$test '; // Aici este xss deoarece filtrul e slab de tot sau in genere nu este!!! Asa ceva se face atunci cind Dvs. va inregistrati pe un site si la urma va arata loginul. Iar acum puteti sa va imaginati ce va fi <script>alert("XSS")</scripr> daca veti vedea alerta, atunci puteti face o ataca, adica sa schimbati codul in loc de <script> Acesta este un exemplu de xss pasiv.. Iar acum veti vedea un exemplu de xss active! } else { Daca nu, iesim exit; } <? Deci sa vedem si un xss active! Exista forumuri, chaturi, carte de oaspeti si nu va-ti gindit daca ar fi sa puneti in loc de cuvinte de exemplu: <script>alert("XSS")</scripr> Daca filtrul e rau, atunci noi iarasi putem scoate cookies! Iata un exemplu de filtru: Acum veti vedea un exemplu de filtru scris in php si care filtreaza $path iar in locul ei, poti pune oricare altul… php <? $message = str_replace("\"","",$message);// filtreaza ghilimelele $message = str_replace("\'","",$message);// filtreaza doar o parte a ghilimelelor $message = str_replace("<","",$message); // filtram < ca sa nu poata deschide tagurile $message = str_replace(">","",$message);// filtram > ca san u poata inchide tagurile $message = str_replace("#","",$message); // Simbol tare … $message = str_replace("/","",$message);// slash $message = str_replace("script","",$message ); // cred ca singuri ati inteles dece… $message = str_replace("(","",$message); // filtreaza parantezele $message = str_replace(")","",$message); // filtreaza parantezele $message = str_replace("%","",$message); // % se foloseste in adresele url si de aceea este primejdios Cred ca acest script va va ajuta sa fiti mai aparati contra xss! ?>
  16. si poate prin bucuresti mai mult nu zic ca voi dati interpolu pe mine
  17. asta foloseam eu ca sa vad de cand am pc deschis
  18. ras 1 3 5 nu mai merg verifica nu trage omu in piept:))
×
×
  • Create New...