View Full Version : Domanda su Alberi
Kleidemos
29-08-2003, 17:57
Ma gli alberi sono delle liste con 2 puntatori (prev e next)????
Tnk 1k
Icedguardian
29-08-2003, 18:23
Dipende.
Es. albero binario ha elementi con due puntatori che puntano al figlio sinistro e figlio destro. Però è proprio la forma che cambia in un albero rispetto ad una lista.
Poi ci sono altri tipi di alberi.
Kleidemos
29-08-2003, 18:26
cioe una lista bilaterale nn è un albero???
E che tipo di alberi ci sono???
P.s: ma sono utili nei programmi reali queste strutture?
Icedguardian
29-08-2003, 18:36
Dovrebbero ma non mi è mai capitato di usarli per il momento :D
Classico esembio del albero binario di ricerca:
Nodo ( valore, figlioSx, figlioDx)
Un nodo del albero ha un valore (es. un intero)
e può avere al max due figli (cioè due puntatori a nodi figli).
Ogni figlio Sx ha il valore <= al valore del padre mentre ogni figlio Dx ha il valore maggiore (ecco perchè li chiamano di ricerca :D ).
Un albero ha tre tipi di nodi:
Un nodo radice, cioè senza padre
Nodi interni e
Nodi foglie, cioè senza figli.
Adesso sai tutto quelli che ti serve per creare un albero binario di ricerca.
Ci sono anche i B+ alberi, alberi generici, ecc...
Ciao
Kleidemos
29-08-2003, 18:46
na cosa tipo:
typedef struct SAlbero
{
int data;
SAlbero *figlioSx;
SAlbero *figlioDx;
}Albero;
Se ho ben capito.
P.S: come hai imparato tu?
Originariamente inviato da Kleidemos
cioe una lista bilineare nn è un albero???
E che tipo di alberi ci sono???
P.s: ma sono utili nei programmi reali queste strutture?
Un albero per essere definito tale deve:
- avere un nodo, detto radice, che non possiede nessun nodo padre
- avere dei nodi, detti foglie, che non posseggono nessun nodo figlio
- qualsiasi nodo X che non è radice nè foglia, possiede un nodo padre (cioè esiste un nodo di cui il figlio è il nodo X) e dei nodi figli (cioè esistono dei nodi di cui il nodo X è padre)
La lista semplice può essere vista come un tipo di albero in cui ogni nodo ha al più un figlio.
Le strutture ad alberi sono varie: si va dai semplici alberi binari (bilanciati o non) ad alberi aventi strutture molto più complesse (n°variabile di figli).
Il loro utilizzo spazia un po' in tutti i campi: si va dalla computer graphics a banali applicazioni matematiche. Cmq basta un po' di inventiva: sono strutture molto versatili che si adattano bene a diversi scopi...
Aloha!
Kleidemos
29-08-2003, 20:08
ma la disposizione delle directory di un filesystem possono essere considerati alberi?
Originariamente inviato da Kleidemos
ma la disposizione delle directory di un filesystem possono essere considerati alberi?
Certo, ma non alberi binari. In genere per la costruzione di filesystem si adottano un particolare tipo di alberi detti BB trees, una particolare struttura ad albero che viene impiegata in genere in file di archivio. Poichè i nodi possono avere anche centinaia di figli, si possono trovare i dati molto velocemente perchè l'altezza dell'albero rimane piccola, pur contenendo una grande quantità di informazioni.
Dimenticavo. Varianti di BB alberi molto sofisticate vengono usate per esempio nei DBMS ...
Kleidemos
29-08-2003, 23:23
ma il reiserFs nn ha una struttura B*Tree..............e una di quelle varianti di cui parli?
Originariamente inviato da Kleidemos
ma il reiserFs nn ha una struttura B*Tree..............e una di quelle varianti di cui parli?
Se ne analizzi a fondo le proprietà vedi che tutto da li parte. Il resto sono tecniche per implementare caratteristiche e migliorare gli accessi R/W
Kleidemos
29-08-2003, 23:35
Originariamente inviato da mjordan
Se ne analizzi a fondo le proprietà vedi che tutto da li parte. Il resto sono tecniche per implementare caratteristiche e migliorare gli accessi R/W
quindi gli alberi( e le liste ) sono importanti nel mondo software?
Direi che dire importanti è riduttivo.
Tutto si costruisce sulle strutture dati. . . E alberi (binari semplici) e liste (lineari singole) sono le + semplici e le meno efficienti . . .
Kleidemos
29-08-2003, 23:51
Originariamente inviato da mjordan
Tutto si costruisce sulle strutture dati. . . E alberi (binari semplici) e liste (lineari singole) sono le + semplici e le meno efficienti . . .
Cosa c'è d'altro??
Originariamente inviato da Kleidemos
Cosa c'è d'altro??
Tabelle hash, alberi red black, albery splay, patricia, heap, heap binomiali, heap di fibonacci, deap, B alberi, grafi ciclici, aciclici, bipartiti rappresentati con matrici di adiacenza o liste di adiacenza. Poi ci sono tutti gli algoritmi che operano su di esse e le varie tecniche matematiche per analizzarne le prestazioni (complessità computazionale)....
Kleidemos
29-08-2003, 23:59
Originariamente inviato da mjordan
Tabelle hash, alberi red black, albery splay, patricia, heap, heap binomiali, heap di fibonacci, deap, B alberi, grafi ciclici, aciclici, bipartiti rappresentati con matrici di adiacenza o liste di adiacenza. Poi ci sono tutti gli algoritmi che operano su di esse e le varie tecniche matematiche per analizzarne le prestazioni (complessità computazionale)....
:eek:
Come vedi l'informatica è ben altro che conoscere un misero linguaggio di programmazione ...
Kleidemos
30-08-2003, 00:03
Originariamente inviato da mjordan
Come vedi l'informatica è ben altro che conoscere un misero linguaggio di programmazione ...
e per questo che mi piacie
Originariamente inviato da Kleidemos
e per questo che mi piacie
A te ti piacie, a me ... me piace ... :D :sofico:
Kleidemos
30-08-2003, 00:06
ma all'uni si fa ?
Originariamente inviato da Kleidemos
ma all'uni si fa ?
Si. Tutta quella roba che ti ho scritto su (e molta altra) almeno per me che sono rimasto al vecchio ordinamento costituisce un solo esame ... Pure abbastanza pesante ...
Kleidemos
30-08-2003, 00:11
Ma ti sembro un pochino sveglio su ste cose??
Sai ho solo 15 anni e le liste le ho cominciate stamani da autodidatta.
Cmq nn so ma trovo una certa affinita tra graeco, latino, matematica e programmazione .....................
Originariamente inviato da Kleidemos
Ma ti sembro un pochino sveglio su ste cose??
Sai ho solo 15 anni e le liste le ho cominciate stamani da autodidatta.
Cmq nn so ma trovo una certa affinita tra graeco, latino, matematica e programmazione .....................
Certo. Il latino e il greco conducono al ragionamento che è il pilastro cardine della matematica e della fisica.
I modelli matematici algebrici, logico matematici e analitici trovano applicazione nell'informatica. L'informatica (pura) non sarebbe altro che un'altra applicazione della matematica. Non a caso una volta il corso di laurea in informatica era una specializzazione di matematica. I grandi informatici del passato sono stati tutti matematici (Donald Knuth in primis era un matematico).
E' stato lui a scoprire la relazione fra matematica e algoritmo e a formalizzarne per primo il concetto di "Teoria della complessità computazionale,
Pare inoltre che il termin "algoritmo" derivi dal matematico usbeco Mohammed Ibn Musa Al-Kowarizmi. Scrisse un famoso trattato di algebra.
Non ti stupirai inoltre se ti dico che le strutture di dati che ti ho detto prima sono effettivamente strutture matematiche appartenenti al campo dell'algebra moderna.
I grafi, di fatto, sono stati "inventati" da Eulero, per formalizzare e dimostrare l'impossibilità del famoso problema dei ponti di Koenigsberg in Germania ...
Kleidemos
30-08-2003, 00:29
ma il certo era della prima domanda?
Cmq secondo te all'uni ho qualche speranza?
P.S: cosa sono i grafi?
andrea88
30-08-2003, 00:33
Scusate se mi inserisco ma ho2 domande da fare:
1)Che tipo di strutture sono i grafi e come funzionano?
2)Cosa dovrei studiare una volta fatte le liste?
Originariamente inviato da mjordan
Si. Tutta quella roba che ti ho scritto su (e molta altra) almeno per me che sono rimasto al vecchio ordinamento costituisce un solo esame ... Pure abbastanza pesante ...
che facoltà (ingegneria???)
Originariamente inviato da Kleidemos
ma il certo era della prima domanda?
Cmq secondo te all'uni ho qualche speranza?
Il certo si riferiva all'affinità fra latino, greco, matematica e informatica.
Scusa eh ma come posso dirti se avrai possibilità? Non ti conosco mica ...
L'unica linea guida da seguire con l'università e seguire sempre e solo la propria vocazione. Ne ho visti troppi ritirarsi dale parti mie (facoltà intendo) solo perchè si erano iscritti a Info perchè "fa figo" o perchè "si lavora".
Nei campi scientifici ci vuole una forte motivazione personale (e una schiena abbastanza resistente aggiungerei :) ) altrimenti diventa tremendo, scoppi senza ottenere risultati e ti esaurisci per niente.
Il segreto del successo è "volerlo fare perchè si vuole, non perchè piace da morire quello che fanno gli altri".
In sostanza, anche a me piacciono tanto gli overclock, i computer, le schede grafiche, i tensionatori, i transistor e i condensatori. Le moto e i motori, le macchine, gli impianti a protossido d'azoto, le bielle e i pistoni. Ma non sono affatto portato per l'elettronica e la meccanica. . .
Kleidemos
30-08-2003, 00:40
:O ottimo discorso :O
Originariamente inviato da cisc
che facoltà (ingegneria???)
Informatica (pura).
Kleidemos
30-08-2003, 00:43
Originariamente inviato da andrea88
Scusate se mi inserisco ma ho2 domande da fare:
1)Che tipo di strutture sono i grafi e come funzionano?
2)Cosa dovrei studiare una volta fatte le liste?
andrea88
30-08-2003, 00:44
Originariamente inviato da mjordan
Il certo si riferiva all'affinità fra latino, greco, matematica e informatica.
Scusa eh ma come posso dirti se avrai possibilità? Non ti conosco mica ...
L'unica linea guida da seguire con l'università e seguire sempre e solo la propria vocazione. Ne ho visti troppi ritirarsi dale parti mie (facoltà intendo) solo perchè si erano iscritti a Info perchè "fa figo" o perchè "si lavora".
Nei campi scientifici ci vuole una forte motivazione personale (e una schiena abbastanza resistente aggiungerei :) ) altrimenti diventa tremendo, scoppi senza ottenere risultati e ti esaurisci per niente.
Il segreto del successo è "volerlo fare perchè si vuole, non perchè piace da morire quello che fanno gli altri".
In sostanza, anche a me piacciono tanto gli overclock, i computer, le schede grafiche, i tensionatori, i transistor e i condensatori. Le moto e i motori, le macchine, gli impianti a protossido d'azoto, le bielle e i pistoni. Ma non sono affatto portato per l'elettronica e la meccanica. . .
Complimenti, bel discorso, soprattutto molto sensato e ben motivato.
Originariamente inviato da andrea88
Scusate se mi inserisco ma ho2 domande da fare:
1)Che tipo di strutture sono i grafi e come funzionano?
2)Cosa dovrei studiare una volta fatte le liste?
I grafi sono strutture dati (per lo +) non dinamiche, che hanno vastissime applicazioni, dal calcolo di un cammino + breve di un pacchetto di dati all'interno di routers (algoritmo distance vector) al calcolo del percorso + breve per raggiungere una posizione predefinita di un navigatore satellitare (algoritmo di Dijkstra).
Dopo le liste dovresti studiare gli stack e le code. Per poi passare alle liste doppiamente concatenate.
andrea88
30-08-2003, 00:48
Tnk
Kleidemos
30-08-2003, 00:49
Originariamente inviato da mjordan
Dopo le liste dovresti studiare gli stack e le code. Per poi passare alle liste doppiamente concatenate.
Ma sono molto + complessi?
Originariamente inviato da Kleidemos
Ma sono molto + complessi?
Gli algoritmi per manipolarli sono abbastanza complessi. Tecnicamente parlando, essi si rappresentano con altre strutture ancora, multiliste oppure matrici di adiacenza. E in base a come li si rappresenta, cambiano anche gli algoritmi!!!!!! Per esempio, l'algoritmo di Dijkstra che calcola il cammino minimo fra due nodi di un grafo opera sulle liste di adiacenza.
Ma trattare in modo sensato queste strutture richiede alcune conoscenze matematiche (quella di grafo, appunto) e quella di complessità computazionale e spaziale. Ci sono differenze infatti in base a come le si rappresenta (sia di complessità temporale che spaziale) e il miglior modo dipende dal problema che si deve risolvere.
Kleidemos
30-08-2003, 01:00
parli arabo x uno di V Ginnasio:eek:
Originariamente inviato da Kleidemos
parli arabo x uno di V Ginnasio:eek:
Ehm, sorry :(
Quello che volevo dire io è che i grafi hanno poca utilità se non se ne conoscono le proprietà che, appunto, sono quelle che ho elencato ...
Diciamo che una volta studiate le liste, gli stack, le code e gli alberi binari semplici dovreste stare a posto. Perchè dovreste cominciare a fare implementazioni reali, come ad esempio funzioni che manipolano tali strutture (costruzione, distruzione, inserimento, unione), le visitano (effettuano una ricerca, trovano una proprietà (la lunghezza di una lista o l'altezza di un albero per esempio) e via discorrendo ... Già a partire da solo queste due strutture c'è così tanto da fare ...
Originariamente inviato da Kleidemos
Ma sono molto + complessi?
No, affatto. In genere gli stack e le code sono + facili delle liste stesse (puoi anche rappresentarli come comunissimi array)
Originariamente inviato da mjordan
Informatica (pura).
Mi piace: "Informatica pura ". Peccato che ancora ci siano degli stolti che sottovalutano la nostra facoltà, non voglio andare OT, bisogna avere la schiena e testardaggine di un mulo per poter andare avanti in tali facoltà.
ciao
Kleidemos
30-08-2003, 09:04
Originariamente inviato da mjordan
Diciamo che una volta studiate le liste, gli stack, le code e gli alberi binari semplici dovreste stare a posto. Perchè dovreste cominciare a fare implementazioni reali, come ad esempio funzioni che manipolano tali strutture (costruzione, distruzione, inserimento, unione), le visitano (effettuano una ricerca, trovano una proprietà (la lunghezza di una lista o l'altezza di un albero per esempio) e via discorrendo ... Già a partire da solo queste due strutture c'è così tanto da fare ...
Ma una volte fatte liste, code , stavk e alberi binari semplici con funzioni annesse e connesse............... potro considerarmi un po + programmatore, no?
Icedguardian
30-08-2003, 10:24
Un po OT X mjordan
Dove fai l'università???
Originariamente inviato da gokan
Mi piace: "Informatica pura ". Peccato che ancora ci siano degli stolti che sottovalutano la nostra facoltà, non voglio andare OT, bisogna avere la schiena e testardaggine di un mulo per poter andare avanti in tali facoltà.
ciao
Perchè tu che facoltà fai?
Originariamente inviato da Kleidemos
Ma una volte fatte liste, code , stavk e alberi binari semplici con funzioni annesse e connesse............... potro considerarmi un po + programmatore, no?
Puoi essere "un po +" programmatore anche senza conoscere sta roba e conoscere invece un pacco di altre librerie che ti consentono di svolgere tutto senza avere la minima conoscenza di queste cose. Il problema è cheè più bello sapere come una printf() FA l'output a terminale, piuttosto accontentarsi di sapere che fa un semplice output testuale. Stessa cosa per le strutture dati. Puoi trovare diverse funzioni nelle librerie che ti consentono di usare tablle hash, per esempio, senza che tu abbia una minima idea di come funzionino (ok , sono stato un po troppo generale). In realtà se conosci tali strutture, puoi implementarti da solo le tue funzioni e adattarle nelle circostanze + disparate, cose che con una funzione di libreria non puoi sempre fare.
Originariamente inviato da Icedguardian
Un po OT X mjordan
Dove fai l'università???
Devo darti anche il mio codice fiscale?? ;)
Originariamente inviato da mjordan
Perchè tu che facoltà fai?
Informatica Pura. Sono iscritto a Palermo!!
Ti devo dare anche il codice fiscale? ;)
Originariamente inviato da gokan
Informatica Pura. Sono iscritto a Palermo!!
Ti devo dare anche il codice fiscale? ;)
No pensavo mi stessi prendendo per culo sul fatto del "pura" ... ;)
Kleidemos
30-08-2003, 16:43
Originariamente inviato da mjordan
. Il problema è cheè più bello sapere come una printf() FA l'output a terminale, piuttosto accontentarsi di sapere che fa .
Concordo al 1000000%
Originariamente inviato da Kleidemos
Concordo al 1000000%
Si ma questo non è una bazzecola però ...
Per esempio, bisogna sapere che tutto nei computer (nei sistemi unix) funziona a partire da sei chiamate principali di sistema definite dal sistema operativo. Su queste sei chiamate base, si implementano le librerie dei linguaggi di programmazione. Per esempio la libreria C. Sulla libreria C si costruiscono altre librerie, per esempio la STL C++, oppure la glib, sulla quale a sua volta, si basa GTK+, che a sua volta viene usata dalle API di GNOME...e così' via...
Quello che possiamo scrivere semplicemente in C con le GTK+, per esempio per costruire una semplice finestra con un bottone:
/* -*-linux-c-*- */
#include <gtk/gtk.h>
gboolean
delete_event_callback(GtkWidget * widget,
gpointer user_data)
{
return FALSE;
}
int
main(int argc, char ** argv)
{
GtkWidget * top_window;
GtkWIdget * button;
gtk_init(&argc, &argv);
top_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
button = gtk_button_new_with_label("Hello, world!");
gtk_container_add(GTK_CONTAINER(top_window), button);
gtk_signal_connect(GTK_OBJECT(top_window), "delete_event",
GTK_SIGNAL_FUNC(delete_event_callback), NULL);
gtk_signal_connect(GTK_OBJECT(top_window), "destroy",
gtk_main_quit, NULL);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
gtk_main_quit, NULL);
gtk_widget_show_all(top_window);
gtk_main();
return 0;
}
è in realtà tremendamente complesso, dietro le quinte, proprio per il fatto che il sistema operativo fornisce soltanto meccanismi semplici. E' più si va indietro con le dipendenze della libreria, più si vede che si procede con un livello più basso, fino ad arrivare alle famigerate 6 chiamate di sistema ...
Da non confondere, quindi, semplicità con facilità (anzi, molto spesso semplicità è proprio sinonimo di complessità) ...
Originariamente inviato da gokan
Mi piace: "Informatica pura ". Peccato che ancora ci siano degli stolti che sottovalutano la nostra facoltà, non voglio andare OT, bisogna avere la schiena e testardaggine di un mulo per poter andare avanti in tali facoltà.
ciao
Ho capito a quali studenti di quale facoltà ti stai riferendo (non lo dico per non accendere flame, ma ci siamo capiti, vero? ;) )
Bene...Osservali...Guarda quante arie si danno... Poi però, vai a vedere COSA sanno fare... CHE CODICE sanno scrivere... Non mi risulta tutta questa scienza... ;) Dici di no? ;)
Kleidemos
30-08-2003, 17:28
il fatto della semplicità, che in vece è complessita, è quello che mi ha spinto a imparare a programmare.
Ma queste 6 syscall quali sono?
Cmq per il bottone so che bisogna disegnarlo a skermo, ridisegnarlo ad ogni evento...... e che i toolkit sono pieni di moltissimo codice AMS che pero nn è visibile.
O sbaglio?
Icedguardian
30-08-2003, 17:35
Originariamente inviato da mjordan
Devo darti anche il mio codice fiscale?? ;)
Una risposta del genere mi sarei aspettato da un ingeniere non da un informatico
:mad: :D
Era semplice curiosità perchè alcune delle cose che hai detto sembrano prese pari pari da una lezione della mia facoltà (però io sono uno scienziato :D )
Ciao
Originariamente inviato da Kleidemos
il fatto della semplicità, che in vece è complessita, è quello che mi ha spinto a imparare a programmare.
Ma queste 6 syscall quali sono?
Cmq per il bottone so che bisogna disegnarlo a skermo, ridisegnarlo ad ogni evento...... e che i toolkit sono pieni di moltissimo codice AMS che pero nn è visibile.
O sbaglio?
Le syscall sono read, write, fork, wait, exec, alloc.
Le syscall che puoi trovare in una libreria C probabilmente hanno gli stessi nomi, ma non sono quelle a cui mi riferisco. Esse sono ad un livello ancora più alto e sono costruite mediante le chiamate che ti ho detto.
Poichè è non comune usare questi nomi nelle librerie, in genere i sistemi operativi le implementano come __read, __write, __fork, __exec e __alloc.
Per esempio, la primitiva __alloc è la primitiva che alloca la memoria nel sistema operativo e la funzionalità ad alto livello della libreria C che si basa su __alloc è la malloc().
Non ho capito che intendi dire per codice AMS ...
Originariamente inviato da Icedguardian
Una risposta del genere mi sarei aspettato da un ingeniere non da un informatico
:mad: :D
Era semplice curiosità perchè alcune delle cose che hai detto sembrano prese pari pari da una lezione della mia facoltà (però io sono uno scienziato :D )
Ciao
Dai stavo scherzando. Sto a L'Aquila ...
Prese pari pari da una lezione?? :confused:
Icedguardian
30-08-2003, 17:44
Originariamente inviato da mjordan
Dai stavo scherzando. Sto a L'Aquila ...
Prese pari pari da una lezione?? :confused:
L'introduzione del corso di Algoritmi e strutture dati del prof. Maniezzo.
Cmq io, ancora per 2 esami + tesi, sto a Cesena :) (soltanto la triennale per me)
Torno al mio elaborato che ho solo una settimana per finirlo :(
Ciao
Originariamente inviato da Icedguardian
L'introduzione del corso di Algoritmi e strutture dati del prof. Maniezzo.
Cmq io, ancora per 2 esami + tesi, sto a Cesena :) (soltanto la triennale per me)
Torno al mio elaborato che ho solo una settimana per finirlo :(
Ciao
Cazzo, allora ho una stoffa per fare un'eventuale Ph.D :D :D :sofico:
Nei DBMS si usano sia i B Tree che i B+ Tree...
Kleidemos
30-08-2003, 18:38
Cmq per il bottone so che bisogna disegnarlo a skermo, ridisegnarlo ad ogni evento...... e che i toolkit sono pieni di moltissimo codice ASM che pero nn è visibile.
Originariamente inviato da Kleidemos
Cmq per il bottone so che bisogna disegnarlo a skermo, ridisegnarlo ad ogni evento...... e che i toolkit sono pieni di moltissimo codice ASM che pero nn è visibile.
Certo. Da qui la primitiva __write, come vedi ...
Sono implementazioni talmente generiche nell'SO che poi, opportunamente implementate, è possibile creare delle funzioni che scrivono ovunque...(detto in modo molto generale, ovviamente...) Non a caso la semplicità di design dei sistemi Unix impone che TUTTO sia un file. Fateci caso...Anche il vostro HD è un file...O la vostra scheda grafica. Cambia solo il modo con cui ci si accede, ma per l'utente questo non deve preoccupare ;)
Kleidemos
30-08-2003, 19:03
Originariamente inviato da mjordan
Certo. Da qui la primitiva __write, come vedi ...
Sono implementazioni talmente generiche nell'SO che poi, opportunamente implementate, è possibile creare delle funzioni che scrivono ovunque...(detto in modo molto generale, ovviamente...) Non a caso la semplicità di design dei sistemi Unix impone che TUTTO sia un file. Fateci caso...Anche il vostro HD è un file...O la vostra scheda grafica. Cambia solo il modo con cui ci si accede, ma per l'utente questo non deve preoccupare ;)
infatti unix è il mio OS preferito.
Ma quindi un bottone e una __write sullo skermo............giusto?
Originariamente inviato da Kleidemos
infatti unix è il mio OS preferito.
Ma quindi un bottone e una __write sullo skermo............giusto?
Possiamo vederla così... Ovviamente è una visione molto semplicistica. Diciamo anche che un driver per una scheda grafica è quel pezzo di software che dice alla __write COME deve scrivere nella scheda. Ma questo, ovviamente, è la semplice teoria, priva di ogni formalismo tecnico... Comunque il principio è corretto.
Kleidemos
30-08-2003, 19:09
Dimmi di + che questo discorso ni interessa:D
Originariamente inviato da Kleidemos
Dimmi di + che questo discorso ni interessa:D
Ok. Partiamo da un componente hardware. Una scheda grafica per esempio. Tutti sappiamo che per funzionare ha bisogno di un driver. Ma come funziona una scheda grafica??
Bhè, ci sono due modi di vedere la cosa e questi due modi sono tutti applicabili a qualsiasi genere di hardware.
Un componente hardware è composto essenzialmente da due parti. Una parte logica (che gestisce, genera e manipola segnali elettrici) e un'interfaccia di programmazione, ovvero un "traduttore" di questi segnali elettrici nei cosiddetti bit, che servono per colloquiare con il mondo esterno. Cosa c'è dietro l'interfaccia di programmazione è materia degli ingegneri elettronici. L'interfaccia di programmazione è proprio il punto in comune fra informatici ed elettronici. Entrambi la devono capire. Ma l'informatico non sa cosa c'è dietro, l'elettronico non sa cosa ci sta davanti. Ed è proprio questo "muro" a segnare la barriera fra hardware e software.
Il driver essenzialmente "prende" le informazioni del sistema operativo e le "converte" in un formato leggibile dall'interfaccia di programmazione (e quindi dalla scheda grafica). Viceversa, "prende" i dati dall'interfaccia di programmazione e la "converte" in un formato "leggibile" dal sistema operativo. Come vedete il funzionamento può sembrare quello di un modem. Possiamo chiamare questa operazione come "marshalling" dell'informazione. Ed è essenzialmente questo che fa un driver. Poi ci sono tutte altre funzioni che interoperano con le primitive del sistema operativo, ma quì andremmo troppo nel dettaglio. . .
Spero di essere stato chiaro...
Se aspettate vi faccio un esempio ancora + tangibile...
Kleidemos
30-08-2003, 19:24
Originariamente inviato da mjordan
Se aspettate vi faccio un esempio ancora + tangibile...
certo!
Guardate. Questo è un semplice modulo per il linux kernel.
/* -*-linux-c-*- */
#define MODULE
#include <linux/module.h>
int
init_module(void)
{
for (int i = 0; i < 10; i++)
printk("<1>Hello! I'm in the Linux Kernel address space!");
return 0;
}
void
cleanup_module(void)
{
printk("<1>Good bye cruel world...\n");
}
MODULE_LICENSE("GPL");
MODULE_AUTHOR("mjordan");
Compilalo con la seguente riga di comando:
gcc -Wall -g -O2 -std=c99 -D__KERNEL__ -D__MODULE__ -o hello.o -c hello.c
assumendo che hai chiamato il modulo hello.c
Ora caricalo nel kernel space da root con il comando:
insmod hello.o - :D
Fai, sempre da root, un lsmod per vedere il nostro bel modulo caricato in memoria.
Infine eliminalo con rmmod hello.
Fammi sapere.
Kleidemos
30-08-2003, 19:40
ma è un modulo del kernel:D
Originariamente inviato da Kleidemos
ma è un modulo del kernel:D
Eh...Mo te l'ho detto. Prova prova...
Kleidemos
30-08-2003, 19:45
nn sono su linux ma so quale sara l'output...........ma che centra?
Originariamente inviato da Kleidemos
nn sono su linux ma so quale sara l'output...........ma che centra?
Quello che volevo proporti era una differenza per farti capire un concetto. Le due modalità di funzionamento di un sistema operativo. User mode e supervisor mode.
La modalità user mode non consente al sistema operativo di effettuare operazioni pericolose, quale l'impostazione di un temporizzatore, la gestione di un interrupt, l'aggiornamento di un trap vector ecc. Quando siamo in modalità supervisor, invece, il sistema operativo può effettuare quelle e molte altre operazioni (per esempio impostare la modalità protetta della CPU).
Secondo te, quel modulo viene eseguito in user mode o supervisor mode??
Kleidemos
30-08-2003, 19:52
user mode;)
Originariamente inviato da Kleidemos
user mode;)
supervisor mode. ;) E difatti posso fare al sistema operativo uno scherzetto:
/* -*-linux-c-*- */
#define MODULE
#include <linux/module.h>
int
init_module(void)
{
for ( ; ; );
return 0;
}
void
cleanup_module(void)
{
printk("<1>Good bye cruel world...\n");
}
MODULE_LICENSE("GPL");
MODULE_AUTHOR("mjordan");
Poichè il sistema è in modo supervisor, non è più in grado di gestire nient'altro che il ciclo infinito del nostro modulo. E il sistema operativo si bloccherà ;)
Tutto quello che potrai fare e spegnere il sistema.
Tutto questo per dirti che poichè i driver in genere sono moduli di un sistema, devono avere accesso TOTALE al sistema e alla macchina, cioè richiedere l'inizializzazione di se stessi in modo supervisor. Altrimenti non potresti accedere alla scheda grafica nell'esempio che ti dicevo prima.
E' questo è un altro motivo per non caricare drivers proprietari chiusi di persone che non si conoscono. Questo era un semplice esempio sciocchezza. Ma immagina cosa si potrebbe fare con il pieno controllo del kernel a questo punto... ;)
E puoi ben immaginare a questo punto perchè Windows è una fetecchia ... ;)
Kleidemos
30-08-2003, 20:03
Molto interessante:eek:
Sei preparatissimo;)
E io sono un pessimo programmatore:(
Kleidemos
30-08-2003, 20:04
Originariamente inviato da mjordan
E puoi ben immaginare a questo punto perchè Windows è una fetecchia ... ;)
ora capisco.
P.s: ma se io gli dicessi di eseguire codice ASM arbitrario al for infinito del modulo.............lo farebbe?
Originariamente inviato da Kleidemos
ora capisco.
P.s: ma se io gli dicessi di eseguire codice ASM arbitrario al for infinito del modulo.............lo farebbe?
Certo... Potresti impostare con del codice assembly ben scritto di far muovere un braccio di un hard disk continuamente fra cilindri/settori a "sbalzi" rompendo un hard disk ;) Ed ecco perchè gli autori dei driver inseriscono nel disclaimer "NO WARRANTY" ;)
E soprattutto "USE AT YOUR OWN RISK" ;)
Kleidemos
30-08-2003, 20:10
ma allora perche i virus nn sono presentati come driver?
Originariamente inviato da Kleidemos
ma allora perche i virus nn sono presentati come driver?
I virus sono scritti totalmente in assembly, in genere.
Ma poichè sotto Windows hai il controllo completo della macchina, basta effettuare chiamate di sistema native per modificare il comportamento del sistema. Sfruttano un particolare bug per caricarsi nella memoria in modo "supervisor" e fare i loro giochetti.
Molto a grandi linee ovviamente.
Kleidemos
30-08-2003, 20:21
mi hai spiegato un sacco di cose che nn sapevo.
Sei eruditissimo:eek:
Tnk
p.s: tornando ai tipi dato.............mi spiegheresti gli stack(pila) o mi daresti un link ove documentarmi?
Figurati. E' solo un granello di sabbia di tutto ciò che si dovrebbe sapere ... ;)
Kleidemos
30-08-2003, 20:25
Originariamente inviato da mjordan
Figurati. E' solo un granello di sabbia di tutto ciò che si dovrebbe sapere ... ;)
ma tu lo sai e io no:muro:
andrea88
30-08-2003, 20:27
Premetto che questa discussione mi interessa molto in quanto sta prendendo una piega molto tecnica, complimenti a tutti i partecipanti. La seguo con molto interesse. Kleidemos, se un virus venisse presentato come driver e dopo la sua installazzione creasse problemi, instabilità, danni al software o all' ardware, ecc. anche se nn fosse riconosciuto come virus nessuno lo utilizzerebbe più, logicamente.
Ops, postato in ritardo.
Kleidemos
30-08-2003, 20:28
ottima obbiezione :D
andrea88
30-08-2003, 20:32
Originariamente inviato da mjordan
I virus sono scritti totalmente in assembly, in genere.
Ma poichè sotto Windows hai il controllo completo della macchina, basta effettuare chiamate di sistema native per modificare il comportamento del sistema. Sfruttano un particolare bug per caricarsi nella memoria in modo "supervisor" e fare i loro giochetti.
Molto a grandi linee ovviamente.
Avrei una piccola obbiezione da fare: i virus non sempre sono scritti totalmente in assembly, anzi quelli scritti solo in assembler sono sempre più rari (basti pensare a i love you... scritto in VB...). Soltanto cracker "impegnati" utilizzano l' assembler, la maggior parte di persone che scrivono virus (lamer) non conosce neanche l' assembler...
Kleidemos
30-08-2003, 20:35
perche IMHO ormai il programmatore stile anni '80 che programma in asm in cantina sta scomparendo:cry:
andrea88
30-08-2003, 20:37
Non del tutto fortunatamente, spero che tu capisca a cosa mi riferisco :D
Kleidemos
30-08-2003, 20:38
Originariamente inviato da andrea88
Non del tutto fortunatamente, spero che tu capisca a cosa mi riferisco :D
:confused:
Originariamente inviato da Kleidemos
perche IMHO ormai il programmatore stile anni '80 che programma in asm in cantina sta scomparendo:cry:
Non è vero. Diciamo che bisogna rivalutare invece la parola programmatore ;) La colpa è dei media. Per me uno che usa sempre e solo API scritte dal altri e sa fare solo quello non è degno del titolo di "programmatore".
Originariamente inviato da Kleidemos
ma tu lo sai e io no:muro:
Ti conviene studiare la roba che DEVI sapere (la scuola) altrimenti queste cose non le saprai mai. Tutto ha un ordine temporale.
Per stack e code:
http://www.ing.unife.it/elettr/FondamentiInformatica2nuovo/9-PileCode.pdf
Fa un po schifo, ma dovrebbe essere adatto allo scopo questo documento.
Originariamente inviato da mjordan
Non è vero. Diciamo che bisogna rivalutare invece la parola programmatore ;) La colpa è dei media. Per me uno che usa sempre e solo API scritte dal altri e sa fare solo quello non è degno del titolo di "programmatore".
Anzi, gli darei il nome di "Assemblatore di cocci" :D :sofico:
Originariamente inviato da andrea88
Premetto che questa discussione mi interessa molto in quanto sta prendendo una piega molto tecnica
Purtroppo ti posso asssicurare che non è molto tecnica. Anzi, è talmente generale che qualche informatico purista di sistemi operativi come Silberschatz e Galvin, o lo stesso Tanenbaum potrebbero uccidermi :D :D :D
Kleidemos
30-08-2003, 20:48
Originariamente inviato da mjordan
Anzi, gli darei il nome di "Assemblatore di cocci" :D :sofico:
:)
P.S: tipo le PK-patch?
Comunque non su tutti i Windows si può eseguire codice arbitrario... Da NT e in tutti i suoi derivati, esistono anche su Windows il kernel mode e lo user mode...in parole povere hanno finalmente cominciate ad usare il meccanismo di protezione della CPU ;) Quindi in modalità utente niente INT ;)
Kleidemos
30-08-2003, 20:50
Originariamente inviato da cionci
Comunque non su tutti i Windows si può eseguire codice arbitrario... Da NT e in tutti i suoi derivati, esistono anche su Windows il kernel mode e lo user mode...in parole povere hanno finalmente cominciate ad usare il meccanismo di protezione della CPU ;) Quindi in modalità utente niente INT ;)
secondo me copiando da *NIX......................
Originariamente inviato da Kleidemos
:)
P.S: tipo le PK-patch?
No, quello è ancora peggio... :D :D :eheh: :rotfl: :fiufiu:
Originariamente inviato da Kleidemos
secondo me copiando da *NIX......................
Non esiste "copiare" in questo caso...il meccanismo di protezione c'è in hardware e DEVE essere usato per scrivere i sistemi operativi...
Per questo Win9x/Me sono delle ciofeche e non so nemmeno se possano essere chiamati sistemi operativi...li chiamerei più window manager (come Gnome e KDE per intenderci), anche perchè il "sistema operativo" che c'è sotto è MS-DOS (anche questo deve essere stato un grande sforzo, si scrivono le routine degli interrupt, si carica la shell e si lancia il loader sugli .EXE e .COM...ed ecco fatto un "sistema operativo" fra virgolette...azz mi dimenticavo la FAT, wow)...
Kleidemos
30-08-2003, 21:00
Originariamente inviato da cionci
Non esiste "copiare" in questo caso...il meccanismo di protezione c'è in hardware e DEVE essere usato per scrivere i sistemi operativi...
Per questo Win9x/Me sono delle ciofeche e non so nemmeno se possano essere chiamati sistemi operativi...li chiamerei più window manager (come Gnome e KDE per intenderci), anche perchè il "sistema operativo" che c'è sotto è MS-DOS (anche questo deve essere stato un grande sforzo, si scrivono le routine degli interrupt, si carica la shell e si lancia il loader sugli .EXE e .COM...ed ecco fatto un "sistema operativo" fra virgolette...azz mi dimenticavo la FAT, wow)...
come me ami la M$.................vero?
Sinceramente l'ho odiata fino a Windows 2000... Da 2000 in poi mi sta già più simpatica (solo dal punto di vista delle caratteristiche tecniche, non per la politica commerciale)...
Kleidemos
30-08-2003, 21:03
Originariamente inviato da cionci
Sinceramente l'ho odiata fino a Windows 2000... Da 2000 in poi mi sta già più simpatica (solo dal punto di vista delle caratteristiche tecniche, non per la politica commerciale)...
con blackbomb lo riodierai...............
andrea88
30-08-2003, 21:28
Originariamente inviato da mjordan
Purtroppo ti posso asssicurare che non è molto tecnica. Anzi, è talmente generale che qualche informatico purista di sistemi operativi come Silberschatz e Galvin, o lo stesso Tanenbaum potrebbero uccidermi :D :D :D
Beh, devi ammettere che pur nella sua generalità è tecnica... :mc:
Originariamente inviato da Kleidemos
Ma gli alberi sono delle liste con 2 puntatori (prev e next)????
Tnk 1k
R.J. Wilson - Introduzione alla Teoria dei Grafi - Longman :
"... un grafo connesso che non contiene cicli è chiamato albero ..."
G.G. Marquez - Cent'anni di solitudine " Mondadori :
"... non confendere cazzi con equinozi ..."
Originariamente inviato da cionci
Comunque non su tutti i Windows si può eseguire codice arbitrario... Da NT e in tutti i suoi derivati, esistono anche su Windows il kernel mode e lo user mode...in parole povere hanno finalmente cominciate ad usare il meccanismo di protezione della CPU ;) Quindi in modalità utente niente INT ;)
Non ho capito che intendi dire con "eseguire codice arbitrario" in relazione alla user e supervisor mode. Inoltre non ho capito che intendi dire quando dici "niente interrupt in user mode".
Scusa Cionci ma mi sa che stai confondendo le modalità del processore con la gestione degli utenti ... :confused:
Ah io credevo che tu parlassi del meccanismo di protezione della CPU che viene sfruttato da NT in poi... Infatti se su NT fai un programma ASM a 32 bit non puoi sfruttare alcuna chiamata all'istruzione INT...
Kleidemos
01-09-2003, 10:20
Originariamente inviato da cionci
meccanismo di protezione della CPU che viene sfruttato da NT in poi... Infatti se su NT fai un programma ASM a 32 bit non puoi sfruttare alcuna chiamata all'istruzione INT...
davvero???
No ho detto una cacchiata...volevo dire istruzioni di IN e OUT...
Le INT bisogna poterle eseguire a tutti i costi...
Visto che mjordan diceva che in user mode non si possono fare operazioni pericolose (tipo riscrivere un gate di interrupt) pensavo che perlasse di questo... Comunque i permessi aggiuntivi dei moduli del kernel rispetto ai programmi utente derivano appunto dal fatto che il livello di protezione di tali programmi è superiore a quello dei programmi utente...e questo deriva appunto dal meccanismo di protezione della CPU...
Quando si chiama una system call (che in realtà viene chiamata tramite una INT, ecco perchè prima ho detto una ca@@ata) si entra in kernel mode permettendo alla system call di accedere direttamente all'hardware...
Le IN e le OUT appunto non sono permesse a livello utente...mentre sono permesse a lviello di kernel...
Le IN e le OUT appunto non sono permesse a livello utente...mentre sono permesse a lviello di kernel...
Non è che non sono permesse, sono "filtrate" dal supervisor mode e eseguite se non hanno "pretese troppo grosse", altrimenti il sistema operativo emmette una trap e gestisce la situazione.
Che io sappia non sono proprio permesse... Almeno questo succede con il meccanismo di protezione della CPU...
Originariamente inviato da cionci
Che io sappia non sono proprio permesse... Almeno questo succede con il meccanismo di protezione della CPU...
Oddio forse questa è roba che poi dipende dall'implementazione del sistema operativo.
Non so per Windows e magari per altri sistemi UNIX ma linux ha una caratteristica che "riconosce" l'I/O potenzialmente dannoso da quello "innocuo". Detto in parole povere Linux non associa TUTTE le chiamate di I/O alla modalità supervisor.
Non so questo tuttavia in che modo e dove possa migliorare le prestazioni... Forse elimina il carico di eseguire le routine per l'impostazione del bit di modo per operazioni non riconosciute necessarie ... Chissà ... Sarebbe bello però poter vedere da qualche parte delle statistiche (leggasi benchmark) sui punti cruciali di diversi sistemi operativi ... Ma le cose interessanti non le fa mai nessuno :D
Vero...mi sono riletto un po' il mio libro...e le istruzioni IN e OUT possono essere o meno istruzioni privilegiate (cioè eseguibili o meno in modalità utente)... Questo viene stabilito scrivendo nel campo IOPL del registro EFLAG...
Comunque che io sappia Windows non permette la scrittura diretta...mentre a quanto mi dici tu Linux lo permette...
Ma tu sai qualche principio di scrittura di un "modulo" per Windows??? Caricamento nel nucleo e compagnia bella? So che sto usando un terminologia Unix ... Ma purtroppo per Windows di documentazione generica ce n'è molto poca ... Che sia ancora un campo delegato alle tuttofare Win32 API???
Per modulo cosa intendi ? Intendi un driver ? Lì c'è il Driver SDK...ed ovviamente ci sono sempre le API di mezzo...sinceramente non me ne sono mai interessato...
Originariamente inviato da cionci
Per modulo cosa intendi ? Intendi un driver ? Lì c'è il Driver SDK...ed ovviamente ci sono sempre le API di mezzo...sinceramente non me ne sono mai interessato...
Non necessariamente un driver. Anche un pezzo di codice caricabile nel nucleo. Tipo quella sciocchezza che ho scritto prima per spiegare a kleidemos la differenza fra supervisor e user mode ...
Il Driver SDK fornisce le chiamate di sistema del nucleo??
Una curiosità personale ... Non è la prima volta che ti vedo citare diversi SDK ...
Ma quanti ce ne sono??? :D
Di SDK ce ne sono una marea... Il Driver SDK fornisce tutti gli include e .lib per scrivere i driver (i .sys di Windows 2k e i .vxd di 9x)...
Questi sono gli SDK: http://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm
Quello per i driver si chiama Driver Development Kit o DDK...
http://www.microsoft.com/whdc/ddk/winddk.mspx
Originariamente inviato da cionci
Di SDK ce ne sono una marea... Il Driver SDK fornisce tutti gli include e .lib per scrivere i driver (i .sys di Windows 2k e i .vxd di 9x)...
Questi sono gli SDK: http://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm
Quello per i driver si chiama Driver Development Kit o DDK...
http://www.microsoft.com/whdc/ddk/winddk.mspx
Vedo vedo...
E il platform SDK dovrebbe racchiuderli tutti, giusto??
A questo punto mi sorge spontanea una domanda. Con Visual Studio .NET che SDK forniscono? Cherelazione c'è fra il .NET Framework e questi SDK??
.Net è una piattaforma di più alto livello rispetto alle API...le chiamate a funzioni/oggetti .Net vengono tradotte in API...
Che io sappia con Visual Studio .Net dovrebbero fornire il Core SDK e .Net SDK...
Ok thx.
Dici che posso considerare la Win32API al pari della Glibc???
Direi di sì... Anche se le Win32 API forse sono un po' più ampie...
Originariamente inviato da cionci
Direi di sì... Anche se le Win32 API forse sono un po' più ampie...
Eh si... Forse perchè contengono anche il supporto alla grafica ...
Bhè... Diciamo Win32API = XLib + Glibc :p
Sicuramente anche per quello, ma non solo... La visione di Linux dell'hardware permette di ridurre notevolmente il numero di funzioni necessarie...ed inoltre diciamo che le Win32 API sono molto più "specializzate" mentre le Glibc sono più "generiche"...
Magari per fare una cosa che con Linux fai con 20 chiamate, con Windows ce ne metti 5...ma con questo non voglio dire che siano meglio...tutt'altro; quando si cerca di fare una cosa particolare, il problema non sta nello scivere il codice, ma nel trovare l'API giusta per farlo...e questo rende tutto molto dispersivo...
Non so se hai visto l'MSDN Library (in pratica l'help delle Win32 API)...ho passato anche ore a cercare la "funzione giusta" nel MSDN e molte volte ho dovuto persino desistere (per puntualmente trovarla casualmente la volta successiva che lo aprivo)...
Anche per questo penso che con Linux si riesca a raggiungere una buona connescenza delle Glibc prima di quanto si possa fare con le Win32 API... Inoltre le Win32 API ci si scordano troppo facilmente...a volte hanno nomi talmente assurdi che ti passano immediatamente di mente...
Originariamente inviato da cionci
Sicuramente anche per quello, ma non solo... La visione di Linux dell'hardware permette di ridurre notevolmente il numero di funzioni necessarie...ed inoltre diciamo che le Win32 API sono molto più "specializzate" mentre le Glibc sono più "generiche"...
Magari per fare una cosa che con Linux fai con 20 chiamate, con Windows ce ne metti 5...ma con questo non voglio dire che siano meglio...tutt'altro; quando si cerca di fare una cosa particolare, il problema non sta nello scivere il codice, ma nel trovare l'API giusta per farlo...e questo rende tutto molto dispersivo...
Non so se hai visto l'MSDN Library (in pratica l'help delle Win32 API)...ho passato anche ore a cercare la "funzione giusta" nel MSDN e molte volte ho dovuto persino desistere (per puntualmente trovarla casualmente la volta successiva che lo aprivo)...
Anche per questo penso che con Linux si riesca a raggiungere una buona connescenza delle Glibc prima di quanto si possa fare con le Win32 API... Inoltre le Win32 API ci si scordano troppo facilmente...a volte hanno nomi talmente assurdi che ti passano immediatamente di mente...
E' vero hai ragione. Forse questo esempio che mi hai fatto è perfettamente applicabile alla JFC di Java ... Ecco perchè tutto questo fare "ad alto livello" è (secondo me) solo apparentemente + facile. Difatti se con una libreria + generica (tipo la glibc, appunto) devo fare 20 chiamate (e su un totale ne ho 40) magari riesco a programmare + velocemente che con le Win32API (dove per risolvere un problema devo farne solo 5 ma ho 20000 funzioni di libreria in cui cercare) ...
Effettivamente tentai un approccio con la MSDN per aiutare un utente di questo forum. Ci misi un'eternità a cercare quello che mi serviva. (Ed è la stessa cosa che si fa con la documentazione Java).
Anzi, perdonami se dico una sciocchezza... Ma le Win32API, essendo facilmente dimenticabili e con nomi assurdi, mi sembrano proprio delle librerie non idonee alla programmazione "manuale", ma +ttosto per essere richiamate da tool specializzati che generano codice (ad es Visual Studio). Effettivamente chi vorrebbe mettersi a studiare "pesante" per cercare di ricordare tutto quel caos ...
Infatti...ma anche programmando con MFC le API servono sempre, perchè le MFC ricopriranno si e no un 10% delle API, garantendoti a volte meno funzionalità...
Ecco perchè è nato .Net che promette di coprire tutte le API, ma a che prezzo ?
Originariamente inviato da cionci
Infatti...ma anche programmando con MFC le API servono sempre, perchè le MFC ricopriranno si e no un 10% delle API, garantendoti a volte meno funzionalità...
Ecco perchè è nato .Net che promette di coprire tutte le API, ma a che prezzo ?
Dio santo ... Mi immagino i tool di sviluppo di prossima generazione :eek: :eek: Poi dicono che l'assembly è difficile
:D :D :D
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.