Google+ Quarta Info B: febbraio 2013

mercoledì 27 febbraio 2013

1848: le Rivoluzioni europee

"Oibò! É successo un quarantotto!"
Nel 1848 avvengo, in Europa, avvenimenti sociale che faranno da base a fatti successivi e che sanciscono la fine dell'età della Restaurazione (1815 - 1848).
Tutte le zone europee si ritroveranno a fare i conti con questi moti popolari, esclusa l'Inghilterra e l'Est Europa: troppo progredita la prima e troppo arretrato il secondo.

Le motivazioni alla base di questi tumulti sono, principalmente, TRE:
  • la forte crisi economica: due anni di carestie hanno messo in ginocchio gli strati più poveri della società che diminuisce la propria domanda di prodotti industriali - emblematico il caso dell'Irlanda dove una malattia delle patate costringe alla morte un milione di persone e all'emigrazione altrettante persone;
  • le lotte di classe tra aristocrazia, borghesia e proletariato; 
  • il desiderio d'indipendenza delle zone occupate, sopratutto quelle sotto il dominio austriaco - discorso diverso per la Germania, dove verrà cercata l'unità nazionale.
Tutte le capitali dei futuri stati indipendenti (Budapest, Praga, Zagabria, Milano e Venezia) si ritrovano centro di rivoluzioni durante il mese di marzo
In un primo momento, le rivoluzioni sembrano in grado di andare a bersaglio, ma le forti frammentazioni al loro interno le faranno finire entro l'estate del 1849; l'Impero farà leva sull'esercito che rimarrà sempre fedele al Re.
Nel mentre sale al trono il giovane Francesco Giuseppe destinato, nel suo regno secolare, a far nascere l'Impero Austro-Ungarico.

La situazione francese

In Francia, troviamo - principalmente - due blocchi in contrapposizione:
  1. Liberali - Democratici - Socialisti con appoggio della media-piccola borghesia e della classe operaia
  2. Monarchia (nella figura di Luigi Filippo d'Orleans) appoggiata dalla Chiesa, della nobiltà e della grande borghesia.
Le sempre più forti tensioni sociali hanno luogo di esplodere a febbraio, quando il Governo tenta di impedire una manifestazione per l'allargamento del diritto di voto. I manifestanti reagiscono facendo cadere la monarchia e riescono ad instaurare una Repubblica, con un Governo di coalizione.
L'esecutivo dà subito luogo ad alcuni provvedimenti:
  • suffragio universale maschile;
  • abolizione pena di morte;
  • istruzione elementare gratuita;
  • abbassamento delle ore lavorative che diventano, così, 10;
  • abolizione del lavoro a cottimo: la paga non sarà più proporzionata alla quantità di pezzi prodotti;
  • istituzione degli Ateliers Nationaux: aziende pubbliche capaci di assorbire i disoccupati.
Questo Governo resiste fino al 23 aprile quando si terranno le elezioni con la vittoria dei moderati, i quali cacceranno i due rappresentati socialisti.  
Il Governo moderato riallungherà la giornata lavorativa e abolirà gli Ateliers.

I socialisti tenteranno di conquistare una poltrona in Parlamento durante il mese di giugno, ma verranno prontamente soppressi dall'esercito.

A dicembre si tengono le elezioni presidenziali, dove stravincerà un esponente dei moderati: Luigi Napoleone Bonaparte (nipote di Napoleone).
Luigi Napoleone riformerà l'Impero nel 1851 grazie al consenso borghese - i borghesi rinunciano al potere politico in cambio della calma popolare imposta da Luigi Napoleone III.




 

martedì 26 febbraio 2013

LE ULTIME LETTERE DI JACOPO ORTIS (Ugo Foscolo)

"Le Ultime lettere di Jacopo Ortis" è un romanzo epistolare, cioè formato quasi esclusivamente da lettere tra i personaggi. Foscolo finge che, un giovane di nome Lorenzo Alderani raccolga e pubblichi le lettere che un suo amico, Jacopo Ortis, gli ha scritto negli anni. L'amico, Jacopo, si è suicidato ed è per questo che Lorenzo vuole ricordarlo pubblicando le sue lettere. Jacopo Ortis è un giovane studente veneziano, di sentimenti e ideologie democratiche, che è costretto a trasferirsi a causa del trattato di Campoformio del 1797, ed è colpa della lontananza dalla patria e dell'amore non corrisposto verso Teresa, donna della quale si innamora sperduatamente, che lo portano al suicidio, considerando la sua vita come un fallimento.
Il modello del romanzo è ispirato alle opere di Goethe, su una base preromantica, dove troviamo un'anticipazione dell'eroe romantico. Per certi versi può essere considerato un romanzo dell'attuale tradizione italiana, per altri, invece, non può essere ancora considerato un romanzo moderno, perchè ancora presenta dei versi lirici e non narrati.

domenica 24 febbraio 2013

I PENSIERI DELL'800

I tre grandi sistemi di pensiero che si formano all'inizi dell'800 sono:

-Liberalismo
-Democrazia
-Socialismo

Tutte e tre le ideologie sono in contrasto e opposizione alla Restaurazione dell'Europa.
Il liberalismo si trova in ambito politico, da non confondere con il liberismo che si trova sul fronte dell'economia. Secondo il liberalismo lo Stato deve garantire la libertà individuale e tutelare i diritti fondamentali dell'individuo; per ottenere questo scopo, secondo questa ideologia, deve esserci una divisione dei poteri (legislativo, esecutivo, giudiziario). In un sistema liberale era garantita una rappresentanza popolare, anche se il diritto di voto non è considerato un diritto fondamentale della persona.
La democrazia, invece, si basa sul diritto di voto per tutti, cioè il suffragio universale. Anche se nell'800 le donne non avevano diritto di voto.
Il socialismo si preoccupa fondamentalmente dell'uguaglianza economica e sociale. Ciò che i socialisti vogliono superare sono le grosse differenze economiche all'interno della società dell'800. Essi credevano che per ottenere una società più giusta, bisognava arrivare ad un'abolizione della proprietà privata dei mezzi di produzione, che andrebbe sostituita con una proprietà collettiva. Nei dibattiti che sono emersi, prevalse l'idea di Karl Marx e Federico Engels che pubblicarono un libretto chiamato "Manifesto del Partito Comunista". In questo periodo le parole socialista e comunista erano sostanzialmente sinonimi. Secondo Marx, l'affermazione del capitalismo industriale porterà alla divisione in 2 grandi gruppi, cioè un grande numero di proletari e un piccolo numero di industriali.

venerdì 22 febbraio 2013

Età Napoleonica: PREROMANTICISMO e NEOCLASSICISMO

L'età Napoleonica è un periodo storico che va dal 1796 al 1815.
In letteratura, questi anni sono influenzati dagli ultimi strascichi di illuminismo, dal preromanticismo e dal neoclassicismo.

L'illumismo fa da culla al concetto di "bello", dove l'opera deve essere sublime e capace di smuovere l'anima dello spettatore.
Secondo Edmund Burke, all'artista non sono quindi richieste particolari abilità strettamente tecniche, ma intuizioni geniali capaci di "suscitare la più forte emozione che l'anima sia capace di sentire [in maniera analoga al terrore]": è di questo periodo la relazione tra artista e genio.

Il preromanticismo è l'avo del romanticismo che si svilupperà, poi, nel secolo successivo.
Sentimento, esaltamento della natura e una ferma opposizione a classicismo e ragione sono alla base di questo movimento culturale sviluppatosi in Inghilterra.
Queste basi ideologiche portano alla nascite di liriche in cui l'autore si produce in riflessioni sulla morte e sulla natura solitaria dell'uomo, dove l'ambiente è cupo e malinconico (tipiche le poesie cimiteriali).
Gli autori più illustri sono Thomas Gray e Edward Young.
L'opera più illustre è "Canti di Ossian" scritti , narra la leggenda, da Ossian, un leggendario poeta galeico del III sec. d.C, e raccolti dallo scozzese Macpherson (saranno poi tradotti in italiano da Melchiorre Cesarotti e pubblicati nel 1763). Questo Testo è inoltre testimone di come i preromantici tendano a riscoprire il Medioevo barbarico.

In contemporanea, nasce in Germania il movimento "Sturm und Drang" (letteralmente: Tempesta e Assalto) che condivide il pensiero anti-illuminista inglese ed esalta il ribellismo dell'artista-genio istintivo e sentimentale.
Autori importanti del movimento sono Schiller e Goethe ("I dolori del giovano Werther").

Opposto a questi due movimenti, troviamo dominante neoclassicismo della letteratura e dell'arte in un periodo di transizione così incerto.
Come si evince dal nome, questa filosofia di pensiero si basa sui canoni classici greci e romani arricchiti, però, dalle esperienze di secoli di storia.
"Il neoclassicismo" teorizza il tedesco Winckelman "è un canone naturale capace di perfezionare la natura umana".
Sempre di Winckelman è dovuto un nuovo concetto di estetica secondo cui la Grazia "agisce nella semplicità e nella quiete della anima offuscata dalle passioni (N.B: come le statue elleniche)".

Questi movimenti sono in contrapposizione tra loro, ma proprio la loro fusione (es. Foscolo) porterà alla nascita del pensiero moderno occidentale.


UGO FOSCOLO

Ugo Foscolo naque nel 1778 e morì nel 1827. Nasce a Zante (Zacinto), un isola del mar Ionio, all'ora dominata dai veneziani; proveniva da una famiglia il cui padre era veneto e la madre greca, ed è per questo che si ritiene pienamente greco. Dal 1792 si trasferisce a Venezia, la quale diventerà la sua seconda patria e lo indirizzerà ad un pensiero politico democratico. Inizialmente Foscolo e i democratici vedevano i francesi come dei liberatori, ma successivamente, dopo il trattato di Campoformio, vennero visti come traditori che avevano consegnato i veneziani agli austriaci. Ugo Foscolo poi si trasferì in molte città d'Italia e si arruolò nell'esercito della Repubblica Cisalpina. Nel 1811 il Governo di Milano interrompe le rappresentazioni di un'opera di Foscolo, dato che era presenti dei riferimenti negativi nei confronti dell'operato di Napoleone. Nel 1815 gli austriaci gli offrono un lavoro come direttore a capo di un'importante rivista del tempo, ma costui non accettò e preferì trasferirsi all'estero. Muore a Londra nel 1827 e venne sepolto a Firenze nella Chiesa della Santa Croce.

In Ugo Foscolo è presente una formazione illuminista, che conserva una aspetto laico e materialista. Nelle sue opere sono presenti molti elementi e riferimenti alla cultura classica, ma anche degli elementi come, il pessimismo e la malinconia, che sono tipici del preromanticismo. Nella visione di Foscolo l'arte e la poesia erano 2 attività fondamentali. Queste servivano per dare bellezza, armonia e serenità all'uomo e alla sua vita, per contrastare l'amara realtà.

giovedì 21 febbraio 2013

Multiprogrammazione

Per varie applicazioni è utile avere in singolo processo svariati thread in esecuzione.  Questi condivideranno il segmento di codice e il segmento dati ma avranno un segmento di stack personale.
I threads verranno schedulati automaticamente per essere mandati in esecuzione all'interno del processo stesso. Questi thread possono avere delle zone di memoria condivise ( possono essere delle variabili globali contenute nel data segment oppure dei file comuni). Se i thread dovessero solo leggere il dato / file non ci sarebbe nessun problema, ma se dovessero anche modificarlo?  Basti pensare al caso di un conto corrente:

Thread 1Thread 2Bilancio
Legge Bilancio: $1000$1000
Legge Bilancio: $1000$1000
Deposito $200$1000
Deposito $200$1000
Aggiorna Bilancio $1000+$200$1200
Aggiorna Bilancio $1000+$200$1200


Il primo thread legge il bilancio attuale (1000€) così come il secondo che esegue un deposito di 200€.
Viene eseguito un deposito da parte del primo thread, che va ad aggiornare il bilancio.
Il secondo thread non avrà il bilancio aggiornato (1200€) ma avrà il bilancio letto in precedenza (1000€), quindi quando si andrà ad aggiornare il valore si avrà solo l'ultima modifica fatta dal secondo thread e non quella fatta dal primo.
Questo esempio è uno dei tanti e fa capire quanto sia importante la gestione di thread o processi quando devono andare a scrivere su dei dati condivisi.

Per risolvere questo problema utilizziamo  le variabili mutex o le variabili semaforo.

Nella gestione di più processi o thread che eseguono delle corse critiche abbiamo 3 problemi ricorrenti, che sono i seguenti:
- Le cinque filosofe a tavola
- Il barbiere che dorme
- Lettore e scrittore
- Produttore e consumatore

Il primo problema è il seguente: 5 filosofe sono ad un tavolo rotondo per mangiare degli spaghetti. Ogni filosofa dispone di una sola forchetta ma sfortunatamente gli spaghetti sono così scivolosi che per mangiarli bisogna utilizzare per forza 2 forchette insieme.
Le nostre filosofe (cioè i nostri processi) possono essere in 3 stati distinti: pensante , affamata  e mangiante .
Come possiamo far mangiare il maggior numero di filosofe contemporaneamente senza creare nessuna situazione di stallo?

Utilizzeremo un vettore di interi state di un numero uguale a quello delle filosofe; in ognuno di queste posizioni andremo ad inserire lo stato della nostra filosofa (pensante, affamata e mangiante).
In totale avremo 6 mutex: 5 per ogni filosofa mentre ne avremo una globale.
Ogni filosofa può iniziare a mangiare solo se nessuna delle 2 filosofe ai suoi fianchi non sta mangiando.


Il codice per risolvere questo problema è il seguente:


#define N 5
#define THINKING 0
#define HUNGRY 1
#define EATING 2

typedef int semaphore;
int state[N];
semaphore Mutex=1; /*Master Mutex*/
semaphore S[N]; /*Philosopher's Mutex, Inizializzato come? tutto a zero, ovvero bloccato*/
/*down circa= lock. up circa= unlock. */

void philosopher(int i) //Codice eseguito dalle 5 filosofe
{
while (1)
{
think(); // La filosofa sta pensando
take_forks(i); // la filosofa è affamata, quindi cercherà di prendere le forchette
eat(); // entra nella sezione critica, inizia a mangiare
put_forks(i); // posa le forchette e ricomincia a pensare
}
}

void take_forks(int i)  //Funzione prendi forchette
{
down(&Mutex);  //Cerca di entrare nella zona critica
state[i]=HUNGRY; //Si modifica il suo stato rendendolo da pensante ad affamata
test(i); // controlla che le forchette siano disponibili, quindi che le due filosofe da parte non stiano mangiando
up(&Mutex); //Esce dalla regione critica
down(&S[i]); // Se la funzione test è andata a buon fine, quindi la filosofa ha ottenuto le forchette essa inizierà a mangiare, altrimenti si bloccherà aspettando che una delle filosofe ai suoi lati la sblocchi, così che possa iniziare a mangiare
}

void put_forks(int i) //Funzione posa forchette
{
down (&Mutex);  //Cerca di entrare nella zona critica
state[i]=THINKING; //Ha finito di mangiare, quindi il suo stato viene modificato in pensante
test( Left(i) ) ; // Controlla che la filosofa alla sua sinistra possa mangiare
test( Right(i) ); // Controlla che la filosofa alla sua destra possa mangiare
up(&Mutex); //Esce dalla regione critica
}

void test(i)  //Funzione che controlla che le filosofe possano iniziare a mangiare
{
if(state[i]== HUNGRY && state[ Left(i) ]!=EATING && state[ Right(i) ]!=EATING )
        //Se la filosofa è affamata e nessuna delle filosofe vicine sta mangiando, allora la filosofa può mangiare
{
state[i]=EATING; // Si mette nello stato mangiante
up(&S[i]); //fa una unlock sulla sua mutex, così che quando va a fare la down nella funzione take_forks(i) essa non verrà bloccata e quindi potrà mangiare
}
}

int Right(int i) /*Nome filosofa di destra*/
{
return (i-1) % N;
}

int Left(int i) /*Di sinistra */
{
return (i+1) % N;
}


Per riassumere.
Una filosofa quando smette di pensare sarà affamata, per poter mangiare dovrà avere le due filosofe ai fianchi che non stiano mangiando, altrimenti aspetterà fino a quando non saranno disponibili le forchette.
Il problema delle cinque filosofe è molto utile per risolvere problemi dove dei processi devono competere per l'accesso a un numero limitato di risorse, come i dispositivi di input/output.


Il secondo problema invece riguarda quello di un barbiere che ha una sola postazione per il taglio dei capelli e un numero di sedie per far attendere i clienti. Se non c'è nessun cliente nel negozio il barbiere inizierà a dormire. Quando arriverà un cliente si sveglierà e inizierà a tagliargli i capelli; se intanto arrivano altri clienti mentre il barbiere è occupato essi attenderanno sulle sedie, se un cliente vuole fare il taglio dei capelli ma ci sono tutte le sedie per attendere occupato questo se ne va.


Il codice è il seguente:

#define SEDIE 5 //Il numero di sedie utilizzate per far aspettare i clienti

typedef int semaforo; //La nostra variabile semaforo

semaforo clienti = 0;  //Numero dei clienti in attesa
semaforo barbieri = 0;  //Numero dei barbieri in attesa dei clienti
semaforo mutex = 1; //Mutex che utilizziamo per la mutua esclusione
int in_attesa = 0;  //Numero dei clienti in attesa (non durante il taglio dei capelli)

void barbiere(void)
{
     while(1)
     {
             down(&clienti); //Il barbiere inizierà a dormire se non c'è nessun cliente
             down(&mutex); //Entra nella sezione critica perché va a modificare una variabile globale ...
             in_attesa = in_attesa -1;  //... che è in_attesa
             up(&barbieri); //Un barbiere è pronto per tagliare i capelli al cliente
             up(&mutex); //Esco dalla zona critica
             taglia_capelli(); //Taglio i capelli al cliente
     }
}

void cliente(void)
{
     down(&mutex); //Entra nella zona critica
     if(in_attesa < SEDIE) //Se i clienti in attesa sono meno delle sedie per attendere...
     {
                  in_attesa = in_attesa +1;  //...anche questo cliente si metterà in attesa
                  up(&clienti); //Incrementa in numero di clienti in attesa
                  up(&mutex); //Esce dalla zona critica
                  down(&barbieri); //Blocca l'esecuzione del cliente se non c'è nessun barbiere disponibile per il taglio dei capelli
                  vai_al_taglio(); //Taglio dei capelli
     }
     else //Se tutte le sedie sono occupate
     {
         up(&mutex); // Allora esco direttamente dalla zona critica, senza eseguire il codice che mi serve
     }
}


Per fare un esempio, questo problema è ricorrente nei server web.
Ogni volta che un utente vorrà andare su una pagina web il server gli invierà il file .html della pagina corrispondente tramite un codice simile a quello del barbiere. Il server infatti avrà naturalmente più di un "barbiere" che potrà servire i vari utenti (perché se potesse inviare la pagina ad un solo utente alla volta sarebbe improponibile, basti pensare a pagine molto visitate) che richiedono la pagina internet; per gestire i più barbieri semplicemente li creerà come thread da un thread master. Il thread master sarà quello in ascolto sulla porta 80, cioè quella che riguarda le pagine web; ogni volta che un cliente arriva darà la richiesta del cliente al thread barbiere, rimettendosi immediatamente in ascolto per nuove richieste.













domenica 17 febbraio 2013

L'EUROPA DELLA RESTAURAZIONE

Nella prima metà dell'800 avvengono due fenomeni che possono apparire un pò contraddittori, da un lato la rivoluzione industriale e dall'altro un ritorno al passato della politica, chiamato età della Restaurazione. Questa va dal 1815 al 1848, cioè dall'anno del Congresso di Vienna, al quale parteciparono tutte le potenze europee dell'epoca, ma anche quelle minori e un rappresentante del nuovo stato francese. Il compito di questo congresso fu quello di restaurare appunto, la carta politica dell'Europa, cioè ripristinare i governi precedenti all'epoca napoleonica e basandosi sui concetti di legittimità dei governi(legittimi proprietari) e equilibrio, cioè forze equilibrate all'interno degli stati.
Inoltre si nota un espansione dei Paesi Bassi, includendoci sia l'Olanda che il Belgio e la formazione della Confederazione Germanica, la quale era composta da una "confederazione di stati indipendenti" governati però dall'imperatore d'Austria.
Dal punto di vista prettamente di politica interna, tutti gli stati adottano nuovamente l'assolutismo, tranne la Francia, con un sistema costituzionale, mentre l'Inghilterra adotta una monarchia costituzionale.
Durante la restaurazione, si crea la "Santa Alleanza", sotto richiesta dello zar di Russia, che consiste, inizialmente, nel patto tra la Russia, l'Austria e la Prussia e, solo successivamente, l'Inghilterra. Venne introdotto il principio d'intervento, cioè qualora in uno di questi stati si manifestino eventi rivoluzionari, gli altri erano obbligati ad intervenire per reprimerli, anche militarmente.
Dato che Austria, Prussia e Russia si dichiararono tutti cristiani, venne a ricrearsi un alleanza tra la religione e lo stato.
La carta politica italiana subisce un forte cambiamento, ricordiamo l'espansione del Regno di Sardegna, che ora comprende anche la Liguria, si forma il Regno Lombardo-Veneto e si uniscono i regni di Napoli e di Sicilia per formare il Regno delle due Sicilie. L'Austria, durante la restaurazione, diventa la potenza egemone in Italia, dove viene ripresa un frammentazione della penisola a discapito della futura unificazione.
In Europa sono presenti anche forze politiche e sociali contrarie alla restaurazione, dove troviamo esponenti del ceto borghese, studenti, intellettuali e ufficiali dell'esercito. Tutti questi entrano a far parte delle "società segrete", formazioni segrete che mantengono forti livelli di riservatezza anche al loro interno; La più famosa fu "la Carboneria", lo scopo di queste società era quello di ottenere una costituzione, tramite delle cospirazioni comandate dai capi di eserciti ribelli. La prima fase tra il 1820 e il 1821, interessa principalmente l'Italia, in particolar modo il Piemonte e il Regno delle due Sicilie, e la Spagna. Una seconda parte, nel 1830, interessa la Francia, che porta a una caduta del re e fa salire al potere Luigi Filippo d'Orleans, il cui potere durerà fino al 1848.
In questo periodo si assiste anche alla guerra per l'indipendenza della Grecia dall'impero Ottomano, dove le potenze europee appoggiano lo stato greco, il quale riesce ad ottenere il distacco dai turchi nel 1831.

venerdì 15 febbraio 2013

Mutex e semafori.

Come già parlato nei post dei thread, per gestire le corse critiche utilizziamo le mutex.
Le mutex sono delle speciali variabili a livello kernel che ci permettono di gestire l'ingresso in una zona critica (Cioè una zona di istruzioni che interessa la modifica di variabili globali o di un file condiviso che deve essere eseguita da un solo thread o processo alla volta, dall'inizio alla fine) da parte di 2 o più thread / processi.
Le mutex, essendo variabili in kernel space possono essere modificate solo tramite delle chiamate di sistema particolari.

La sintassi delle mutex è la seguente:

-La creazione ed inizializzazione di una variabile mutex.

pthread_mutex_t    mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_t è la variabile con qui si dichiarano le mutex, PTHREAD_MUTEX_INITIALIZER invece serve per inizializzare la nostra variabile mutex

-Le due chiamate di sistema

pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);

pthread_mutex_lock e pthread_mutex_unlock servono rispettivamente, come fanno intuire i loro nomi, a bloccare e sbloccare la variabile mutex.

Il funzionamento di queste variabili è semplice: quando un thread entra nella zona critica blocca la variabile mutex, perciò quando un altro thread cercherà di entrare nella zona critica (eseguendo anch'esso una pthread_mutex_unlock(&mutex) ) il thread si bloccherà fino a quando l'altro thread non uscirà dalla zona critica, sbloccando la mutex.
Nel caso ci fossero più thread bloccati sulla stessa mutex sarò il S.O. a scegliere quale thread mandare in esecuzione.
Da notare -> il S.O. quando viene eseguita una pthread_mutex_unlock va a controllare se ci sono dei thread bloccati su quella variabile: se ci sono manderà in esecuzione uno dei thread bloccati (senza modificare il valore della mutex), altrimenti sbloccherà definitivamente la mutex.

Ce un altro tipo di variabile che può fare lo stesso lavoro delle mutex: sono le variabili semaphore, cioè semaforo.
I semafori per bloccare e sbloccare hanno anch'essi 2 chiamate di sistema, che noi chiameremo molto semplicemente up e down.

Queste tipo di variabile è come se fosse un intero: parte da 1 (che rappresenta lo stato iniziale del semaforo, cioè che si può accedere a quella determinata zona critica) e ogni volta che un thread cerca di entrare nella zona critica il semaforo si decrementa di uno. Quando un thread esce dalla zona critica dovrà eseguire lo sblocco, cioè una up.

Praticamente non ci sono differenze tra l'utilizzo di una variabile mutex o una semaforo per la gestione tra thread.







mercoledì 6 febbraio 2013

LE TRASFORMAZIONI SOCIALI (Rivoluzione Industriale)



Con la rivoluzione industriale si afferma pienamente il capitalismo, un sistema economica basato sulla proprietà privata, su una produzione dedicata alla vendità e sul profitto; il terzo elemento caratteristico è l'esistenza di una mano d'opera libera e salariata. Il capitalismo risale al Medioevo che conviveva con altre forme di economia.
La rivoluzione industriale determina profondi cambiamenti dividendo la società in delle classi sociali, cioè le persone venivano classificate in base alla loro collocazione nell'ordine della produzione e del loro reddito. Questa nuova società, almeno in teoria, è più dinamica, perchè non esistono ostacoli nel passaggio da una classe all'altra, a differenza dell'antico regime, dove la società era regolamentata dagli ordini.
Le due classi sociali più importanti, che si formano durante la rivoluzione industriale, sono la borghesia e il proletariato. La borghesia capitalista, della rivoluzione industriale, è formata principalmente da imprenditori, proprietari delle fabbriche, poi dai proprietari terrieri, i banchieri, gli intellettuali ecc. La stratificazione della borghesia al suo interno è dovuta al fattore economico, alta borghesia, media e piccola borghesia.
Nell'800 si nota come il ceto borghese si afferma come classe dominante, sovrastando l'aristocrazia. La borghesia decide di creare un proprio ideale politico, che fa riferimento al denaro, alla libertà sociale e all'importanza del lavoro; grazie a questo ceto viene introdotta la concezione di vita privata.
L'altro ceto importante è il proletariato, formato da tutti coloro che non posseggono delle proprietà terriere e percepiscono un salario. All'interno del proletariato troviamo come classe più importante quella operaia, considerata una bassa classe sociale, basta considerare che in Germania gli operai prima di potersi sposare, dovevano avere il consenso dal proprietario della fabbrica.
Nella rivoluzione industriale, all'inizi dell'800, venivano sfruttati bambini e donne come forza-lavoro nelle fabbriche.
Verso la metà del XIX secolo, vennero a crearsi delle organizzazioni di operai. La prima rivolta fu la distruzione dei macchinari nelle fabbriche, visti come responsabili delle nuove condizioni di vita. Successivamente iniziarono a formarsi le prime forme sindacaliste e le organizzazioni per una cassa comune dalla quale attingere soldi in caso di malattia. Un'altra introduzione fu quella di alcuni rappresentanti del proletariato in parlamento. Più avanti si crearono i manifesti e quello più importante fu quello Comunista, di Karl Marx e del suo collaboratore Friedrich Engels.

lunedì 4 febbraio 2013

Socket, IP e altro

Per prima cosa, come avviene il collegamento tra generalmente due computer? Per collegare tra di loro 2 computer abbiamo bisogno di una socket, cioè un canale virtuale che permette a due processi su due macchine distinte di scambiarsi dei dati.
Per gestire correttamente questo scambio di dati ho bisogno di un protocollo (cioè un insieme di regole) per far sì che la comunicazione tra i due processi avvenga correttamente. 
Uno dei protocolli fondamentali è l' IPv4 (Internet Protocoll version 4) , cioè un protocollo che associa un indirizzo di rete al computer.
Nel caso dell' IPv4 l'indirizzo è composto da 4 numeri (che vanno da 0 a 255) separati da dei punti.
Un esempio può essere il seguente:  192.168.1.254
Già da tempo il protocollo IPv4 doveva essere sostituito dall'IPv6, visto l'esaurimento degli indirizzi IPv4.
Insieme all'indirizzo IP (prenderemo in considerazione gli indirizzi IPv4, per comodità essendo quello più diffuso) si utilizza anche una mask, un maschera.
La maschera suddivide l'IP della rete in tre classi distinte:
-Classe c ->Si utilizza come maschera 255.255.255.0
-Classe b ->Si utilizza come maschera 255.255.0.0
-Classe a ->Si utilizza come maschera 255.0.0.0
 Questa maschera ha lo scopo di dividere l'indirizzo IP nell'indirizzo vero e proprio della macchina è l'indirizzo della rete dove è collegato il computer, questo avviene facendo una AND bit per bit tra indirizzo IP e maschera.

IP = 192.168.1.254    Mask = 255.255.255.0

    1100000 | 10101000 | 00000001 | 11111110     Facendo la AND bit a bit 
    1111111 | 11111111 | 11111111 | 00000000
=      192           168               1                 0 

Come si vede, quel che ne risulta è l'indirizzo della rete ( o net address) , mentre l'indirizzo del computer non viene visualizzato. L'host address invece (che è 254) è nascosto.
Quindi, se 192.168.1.0 identifica una rete, l'host address 254 identifica quel determinato computer in quella rete.
Gli host utilizzabili vanno da 1 a 254, il 255 è un broadcast, cioè se invio dei dati all'host 255 è come se lo inviassi a tutti gli host presenti nella rete.
Oltre a questi esistono indirizzi di rete specifici che sono privati come 192.168.0.0 , 172.16.0.0 , 10.0.0.0 
Gli indirizzi privati si possono vedere tra di loro solo se sono nella stessa rete.
Il router permette il coesistere sia le reti private sia le reti pubbliche, il router ha un IP che si chiama gateway.
Altri protocolli che il S.O. utilizza per inviare i dati sono il TCP (Transfer Control Protocol) e l'UDT.

Per creare una socket devo avere:
- L'indirizzo di rete di entrambi i computer
- Le porte dove i processi sono in ascolto

Le porte sono valori a 64 bit (quindi può avere valori da 0 a 65535), però le porte da 0 a 1023 sono riservate al S.O.

Una socket può essere indicata così
8.8.8.8:1015 | 1.2.5.7:10

8.8.8.8 e 1.2.5.7 sono gli IP dei due computer, mentre 1015 e 10 sono le porte dove i processi sono in ascolto.
Altra cosa, l'S.O. tramite la scheda di rete è quello che gestisce tutte le socket.