Sunteți pe pagina 1din 11

Ministerul Educaiei al Republicii Moldova Universitatea Tehnic a Moldovei Facultatea Calculatoare, Informatic i Microelectronic Catedra Automatic i Tehnologii Informaionale

RAPORT

Disciplina: Programare paralel i concurent Lucrare de laborator Nr. 2 Tema: Fundamente de limbaj necesare programrii concurente

A efectuat : A verificat:

studentul grupei TI-102 Lazari Mihai lector superior Ciorb Dumitru

Chiinu 2013

1. Scopul lucrrii Studierea mecanismelor de comunicare dintre firele de execuie (procese). Canale (pipes, streams). 2. Obiectivul lucrrii Crearea unei aplicaii cu multiple fire de execuie n interaciune, conform topologiei determinate de dependenele cauzale definite de diagrama descris n lucrarea de laborator numrul 1. Utilizarea serializrii i deserializrii. 3. Sincronizarea firelor de execuie cu ajutorul canalelor Pentru a transmite date ntre diferite entiti este necesar comunicarea. Aceasta poate fi realizat prin variabile partajate sau prin canale atunci cnd entitile se afl n acelai spaiu de adrese. Atunci cnd entitile se afl n diferite spaii de adrese comunicarea e posibil doar prin canale. Canalele reprezint un concept de comunicare ce corespunde modelului orientat pe conexiune i poate fi realizat prin diferite modaliti cum ar fi stream-urile, socket-urile i altele. Pe lng faptul c sunt utilizate pentru comunicare, canalele mai sunt utilizate i pentru sincronizare, deoarece operaiile de stabilire a conexiunii (WaitForConnect i Connect) sunt blocante. 4. Serializarea i deserializarea n C# Serializarea este procesul de convertire a strii unui obiect ntr-o form care poate fi scris n memoria extern sau transportat. Complementar serializrii este deserializarea, care convertete un stream ntr-un obiect. mpreun aceste procese permit stocarea i transferarea datelor. Exist 2 tehnologii de serializare oferite de Microsoft .NET Framework. Serializarea binar pstreaz fidelitatea tipului, care este util pentru pstrarea strii unui obiect ntre diferite invocri ale aplicaiei. De exemplu, este posibil de partajat starea unui obiect ntre diferite aplicaii prin serializarea n Clipboard. E posibil de serializat un obiect ntr-un flux, pe un disc, n memorie, n reea .a. Serializarea XML se aplic doar cmpurilor i proprietilor publice ale unui obiect i nu pstreaz fidelitatea tipului. Acest lucru este util atunci cnd se dorete oferirea sau consumarea datelor fr restricii referitoare la aplicaiile care utilizeaz datele. Deoarece XML este un standard deschis, este o alegere atractiv pentru partajarea datelor prin Web. Serializarea XML convertete toate cmpurile i proprietile publice ale unui obiect, sau parametrii i valorile returnate ale metodelor ntr-un stream XML care se conformeaz unui document XML. Pentru serializarea sau deserializarea obiectelor se poate utiliza clasa System.Xml.Serialization.XmlSerializer. Atributele pot fi utilizate pentru a controla serializarea unui obiect efectuat de clasa XmlSerializer. Cteva din aceste atribute sunt urmtoarele: - XmlAttributeAttribute membrul va fi serializat ca un atribut XML; - XmlElementAttribute cmpul sau proprietatea poate fi serializat ca un element XML; - XmlIgnoreAttribute cmpul sau proprietatea va fi ignorat la serializare; - XmlRootAttribute reprezint numele elementului-rdcin al documentului XML, se aplic doar unei clase. Pentru a serializa i deserializa o clas trebuie urmai urmtorii 2 pai: - Crearea unei instane a clasei XmlSerializer i transmiterea ctre aceasta sub forma unui argument a tipului obiectului serializat;
3

Apelarea metodelor Serialize() i Deserialize() ale clasei XmlSerializer, transmind obiectul care trebuie s fie serializat sau deserializat.

4. Realizarea aplicaiei Aplicaia realizat se bazeaz pe aceeai digram ca i la lucrarea 1 (figura 4.1.), doar c de aceast dat sgeile reprezint nite canale prin care se transmit nite obiecte i care servesc n acelai timp ca un mecanism de sincronizare.

Figura 4.1. Diagrama dependenelor cauzale. n diagrama dat exist 2 tipuri de activiti: cauzale i dependente. Cauzale sunt cele din care pornesc sgeile. Acestea deserializeaz din cte un fiier xml (1.xml, 2.xml, 3.xml, respectiv 4.xml) un obiect, i incrementeaz un cmp, ateapt conectarea la canal, dup care semnalizeaz prin transmiterea obiectului serializat binar. Dependente sunt cele spre care sunt orientate sgeile. Acestea se conecteaz la canale, ateapt obiectele de la activitile cauzale corespunztoare, le deserializeaz binar i le adaug ntr-o list, iar dup ce le-a primit pe toate le sorteaz cresctor dup unul din cmpuri i serializeaz lista ntr-un fiier xml. Canalele sunt denumite dup numele activitilor pe care le unete. De exemplu, canalul dintre activitatea cauzal 1 i cea dependent 5 se va numi 1_5. Programul afieaz pe ecran principalele evenimente care au loc. Codul surs este prezentat n anexa A, iar un screenshot n figura 4.2. Coninutul fiierelor xml este prezentat n anexa B.

Figura 4.2. Rezultatul execuiei programului

Concluzii La aceast lucrare de laborator am studiat sincronizarea firelor de execuie cu ajutorul canalelor. Aceast modalitate de sincronizare este util, mai ales atunci cnd comunicarea prin variabile partajate nu este posibil din diferite cauze se afl n procese diferite sau chiar pe calculatoare diferite. Alt mecanism studiat la aceast lucrare este serializarea i deserializarea obiectelor n C#. Aceste operaii sunt necesare pentru a putea transmite obiecte prin canale sau a le stoca n memoria extern.

Bibliografie 1. http://ciorba.name/?p=94 [Autor: Ciorb Dumitru, accesat la 17.10.2013] 2. http://www.codeproject.com/Articles/1789/Object-Serialization-using-C [Autor: omkamal, accesat la 17.10.2013] 3. http://www.codeproject.com/Articles/37609/Serialize-and-Deserialize-Objects-as-XMLusing-Gen [Autor: farzaneh ansari, accesat la 17.10.2013]

Anexa A. Codul surs al programului Program.cs


using System; namespace Exemplu2 { class Program { static void Main(string[] args) { CausalActivity ca1 = new CausalActivity("1"); CausalActivity ca2 = new CausalActivity("2"); CausalActivity ca3 = new CausalActivity("3"); CausalActivity ca4 = new CausalActivity("4"); DependentActivity da5 = new DependentActivity("5"); DependentActivity da6 = new DependentActivity("6"); AddDependence(da5, AddDependence(da5, AddDependence(da5, AddDependence(da6, AddDependence(da6, AddDependence(da6, da5.Activate(); da6.Activate(); ca1.Activate(); ca2.Activate(); ca3.Activate(); ca4.Activate(); } Console.ReadKey(); ca1); ca2); ca3); ca2); ca3); ca4);

private static void AddDependence(DependentActivity d, CausalActivity c) { d.AddCausalActivity(c.GetName()); c.AddDependentActivity(d.GetName()); } } }

CausalActivity.cs
using using using using using using System; System.Collections.Generic; System.IO; System.IO.Pipes; System.Runtime.Serialization.Formatters.Binary; System.Threading;

namespace Exemplu2 { class CausalActivity { private List<string> m_dependentActivities = new List<string>(); private string m_name; public CausalActivity(string name) { this.m_name = name; } public void AddDependentActivity(string dependentActivity)

{ }

m_dependentActivities.Add(dependentActivity);

public string GetName() { return m_name; } public void Activate() { new Thread(() => { BinaryFormatter bf = new BinaryFormatter(); foreach (string dependentActivity in m_dependentActivities) { string fileName = m_name + ".xml"; Site site = (Site) MyXmlSerializer.DeserializeFromFile(m_name + ".xml", typeof(Site)); Console.WriteLine("(AC{0}) {1} => {2}, inc. Visits, asteapta AD{3}", m_name, fileName, site.ToString(), dependentActivity); ++site.Visits; using (NamedPipeServerStream outStream = new NamedPipeServerStream(m_name + "_" + dependentActivity, PipeDirection.Out)) { outStream.WaitForConnection(); Console.WriteLine("(AC{0}) gata sa semnalizeze", m_name); try { bf.Serialize(outStream, site); } catch (IOException e) { Console.WriteLine(" *** EROARE: {0}", e.Message); } } } }).Start(); } } }

DependentActivity.cs
using using using using using using System; System.Collections.Generic; System.IO; System.IO.Pipes; System.Runtime.Serialization.Formatters.Binary; System.Threading;

namespace Exemplu2 { class DependentActivity { private List<string> m_causalActivities = new List<string>(); private string m_name; public DependentActivity(string name) { this.m_name = name; } public void AddCausalActivity(string causalActivity) { m_causalActivities.Add(causalActivity); } public string GetName()

{ }

return m_name;

public void Activate() { new Thread(() => { List<Site> ls = new List<Site>(); string message = "[AD" + m_name + "] asteapta semnale de la AC "; for (int i = 0; i < m_causalActivities.Count - 1; i++) message += m_causalActivities[i] + ", "; message += m_causalActivities[m_causalActivities.Count - 1]; Console.WriteLine(message); BinaryFormatter bf = new BinaryFormatter(); Site site; foreach (string causalActivity in m_causalActivities) { using (NamedPipeClientStream inStream = new NamedPipeClientStream(".", causalActivity + "_" + m_name, PipeDirection.In)) { inStream.Connect(); site = (Site)bf.Deserialize(inStream); } ls.Add(site); Console.WriteLine("[AD{0}] a primit de la AC{1} {2}", m_name, causalActivity, site.ToString()); } Console.WriteLine("[AD{0}] sorteaza obiectele primite dupa numarul de vizite...", m_name); ls.Sort((Site s1, Site s2) => { if (s1.Visits < s2.Visits) return -1; if (s2.Visits < s1.Visits) return 1; return 0; }); message = "[AD" + m_name + "] Lista de obiecte sortate:\n"; for (int i = 0; i < ls.Count; i++) message += " " + ls[i].ToString() + "\n"; Console.Write(message); string fileName = m_name + ".xml"; Console.WriteLine("[AD{0}] serializeaza lista in fisierul {1}", m_name, fileName); MyXmlSerializer.SerializeToFile(ls, fileName); }).Start(); } } }

Site.cs
using System; using System.Runtime.Serialization; namespace Exemplu2 { [Serializable()] public class Site { public string Name { set; get; } public int Visits { set; get; } public Site() { } public Site(string name, int visits = 0) { Name = name; Visits = visits; }

} }

public override string ToString() { return "(Name: \"" + Name + "\", Visits: " + Visits + ")"; }

MyXmlSerializer.cs
using System; using System.IO; using System.Xml.Serialization; namespace Exemplu2 { class MyXmlSerializer { public static void SerializeToFile(Object obj, string fileName) { XmlSerializer serializer = new XmlSerializer(obj.GetType()); TextWriter textWriter = new StreamWriter(fileName); serializer.Serialize(textWriter, obj); textWriter.Close(); } public static Object DeserializeFromFile(string fileName, Type type) { XmlSerializer deserializer = new XmlSerializer(type); TextReader textReader = new StreamReader(fileName); Object obj = deserializer.Deserialize(textReader); textReader.Close(); return obj; } } }

Anexa B. Coninutul fiierelor xml 1.xml


<?xml version="1.0" encoding="utf-8"?> <Site xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Name>google.com</Name> <Visits>200</Visits> </Site>

2.xml
<?xml version="1.0" encoding="utf-8"?> <Site xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Name>mail.ru</Name> <Visits>75</Visits> </Site>

3.xml
<?xml version="1.0" encoding="utf-8"?> <Site xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Name>infoarena.ro</Name> <Visits>80</Visits> </Site>

4.xml
<?xml version="1.0" encoding="utf-8"?> <Site xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Name>utm.md</Name> <Visits>25</Visits> </Site>

5.xml
<?xml version="1.0" encoding="utf-8"?> <ArrayOfSite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Site> <Name>mail.ru</Name> <Visits>76</Visits> </Site> <Site> <Name>infoarena.ro</Name> <Visits>81</Visits> </Site> <Site> <Name>google.com</Name> <Visits>201</Visits> </Site> </ArrayOfSite>

6.xml
<?xml version="1.0" encoding="utf-8"?> <ArrayOfSite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Site> <Name>utm.md</Name> <Visits>26</Visits> </Site> <Site> <Name>mail.ru</Name>

10

<Visits>76</Visits> </Site> <Site> <Name>infoarena.ro</Name> <Visits>81</Visits> </Site> </ArrayOfSite>

11

S-ar putea să vă placă și