Asynchronous programming

Slides:



Advertisements
Similar presentations
Processes and threads. תהליכים ותתי תהליכים תהליכים –כל תוכנית שרצה היא תהליך (process) –ניתן להתפצל מתהליך אחד למספר תהליכים, בעזרת הפקודה fork(). הרבה.
Advertisements

ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
1 Formal Specifications for Complex Systems (236368) Tutorial #4 Refinement in Z: data refinement; operations refinement; their combinations.
תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1 ואפליקציות ל- Windows Phone 8 סילבוס הקורס.
מערכות הפעלה ( אביב 2004) חגית עטיה © 1 תהליכים - דייאט : חוטים  מוטיבציה  חוטי משתמש וחוטי מערכת  תמיכת מערכת ההפעלה  דוגמאות.
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
מכונת מצבים תרגול מס' 4 Moshe Malka.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
תמחיר תהליך. מערכת תמחיר תהליך מערכת זו נועדה לספק מידע, כמו מערכת תמחיר הזמנה, על עלות המוצרים שיוצרו בתקופה ועל עלות המוצרים שבתהליך הייצור בסוף התקופה.
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
מערכות הפעלה ( אביב 2009) חגית עטיה © 1 תהליכים - דייאט : חוטים  מוטיבציה  חוטי משתמש וחוטי מערכת  תמיכת מערכת ההפעלה  דוגמאות ושימושים.
1 Data Structures, CS, TAU, Splay Tree Splay Tree  מימוש של עץ חיפוש בינארי  מטרה לדאוג ל- Amortized Time  פעולה בודדת יכולה לקחת O(N)  אבל כל רצף.
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
Data Structures, CS, TAU, Splay Tree 1 Splay Tree - עץ חיפוש בינארי - מטרה לדאוג ל - Amortized Time - פעולה בודדת יכולה לקחת O(N) - אבל כל רצף M פעולות.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
טיפול בקיפאון בעיית הקיפאון הימנעות מקיפאון
מערכות הפעלה תרגול 6 – חוטים ב-Linux. מערכות הפעלה - תרגול 62 (c) ארז חדד 2003 תוכן התרגול מבוא לחוטים ב-Linux כיצד גרעין Linux תומך בחוטים עבודה עם חוטים.
תהליכים  מהו תהליך ?  מבני הנתונים לניהול תהליכים.  החלפת הקשר.  ניהול תהליכים ע " י מערכת ההפעלה.
תהליכים - דייאט : חוטים  מוטיבציה  חוטי משתמש וחוטי מערכת  תמיכת מערכת ההפעלה  דוגמאות.
ערכים עצמיים בשיטות נומריות. משוואה אופינית X מציין וקטור עצמי מציינת ערך עצמי תואם לוקטור.
משטר דינמי – © Dima Elenbogen :14. הגדרת cd ו -pd cd - הזמן שעובר בין הרגע שראשון אותות הכניסה יוצא מתחום לוגי עד אשר אות המוצא יוצא מתחום.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
מערכות הפעלה ( אביב 2004) חגית עטיה © 1 תהליכים  מהו תהליך ?  מבני הנתונים לניהול תהליכים.  החלפת הקשר.  ניהול תהליכים ע " י מערכת ההפעלה.
Safari On-line books. מה זה ספארי ספארי זו ספריה וירטואלית בנושא מחשבים היא כוללת יותר מ כותרים כל הספרים הם בטקסט מלא ניתן לחפש ספר בנושא מסוים.
אביב תשס " ה JCT תיכון תוכנה ד " ר ר ' גלנט / י ' לויאןכל הזכויות שמורות 1 פרק 7 ISP דוגמא נוספת.
Text to speech In Mobile Phones איתי לוי. הקדמה שימוש בהודעות טקסט על המכשירים הסלולארים היא דרך תקשורת מאוד פופולארית בימינו אשר משתמשים בה למטרות רבות,
אתחול עצמים. אתחולים ובנאים יצירת מופע חדש של עצם כוללת: הקצאת זכרון, אתחול, הפעלת בנאים והשמה לשדות במסגרת ריצת הבנאי נקראים גם הבנאי/ם של מחלקת הבסיס.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
Methods public class Demonstrate { public static void main (String argv[]) { public static void main (String argv[]) { int script = 6, acting = 9, directing.
תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1 ואפליקציות ל- Windows Phone 8 Control (Part II)
שיאון שחוריMilOSS-il מוטיבציה  python זה קל ו C זה מהיר. למה לא לשלב?  יש כבר קוד קיים ב C. אנחנו רוצים להשתמש בו, ולבסס מעליו קוד חדש ב python.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
שיתוף PDT בין חוטים PDT Thread A Process Descriptor File Object 1 File Object 2 File 1 File 2 pthread_create Thread B Process Descriptor ה PDT משותף לכל.
Overview of C#. Agenda Structure of a C# Program Basic Input/Output Operations Compiling, Running, and Debugging Namespaces.
מחרוזות – הטיפוס String
אביב תשס " ה JCT תיכון תוכנה ד " ר ר ' גלנט / י ' לויאןכל הזכויות שמורות 1 פרק 5 תרשימי מצבים Statecharts למחלקות תגובתיות Reactive Classes הקדמה ודוגמא.
Multiprocessor Synchronization Algorithms
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Object Oriented Programming
Tirgul 12 Trees 1.
Object Oriented Programming
Operators Overloading
Object Oriented Programming
קורס Java מתקדם Thread'ים
תוכנה 1 תרגול 13 – סיכום.
טרנזיסטור כמתג דו מצבי ממסר - RELAY הפעלה רציפה , PWM
Static and enum קרן כליף.
תכנות מכוון עצמים ושפת JAVA
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
ממשקים - interfaces איך לאפשר "הורשה מרובה".
Data Structures, CS, TAU, Splay Tree
פרק רביעי – תקשורת בין תהליכים פנימיים
ניתוח מערכות מידע תכנות ב C#
תכנות אסינכרוני מבוא.
תזכורת על מה דיברנו שיעור שעבר? בנינו אתר אינטרנט עם כותרות
תהליכים-דייאט: חוטים מוטיבציה חוטי משתמש וחוטי מערכת
Shell Scripts בסביבת UNIX
תוכנה 1 תרגול 13 – סיכום.
Engineering Programming A
Computer Architecture and Assembly Language
הכלת אובייקטים קרן כליף.
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

Asynchronous programming תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל-Windows 8.1 ואפליקציות ל-Windows Phone 8 Asynchronous programming

Thread Synchronization עד כה, כל התהליכים שכתבנו רצו באופן בלתי מסונכרן. עד כה, כל התהליכים שכתבנו לא היו תלויים אחד בשני. עד כה, כל התהליכים שכתבנו לא עשו שימוש במשאבים משותפים. במקרים רבים ואחרים תהליכים יעשו שימוש במשאבים משותפים: אובייקט, תכונה .... אסינכרוניות במצבים כאלו יכולה להיות מסוכנת.

Thread Synchronization כאשר בתוכנית רצים מספר תהליכים במקביל לחלקם או לכולם יש גישה למידע המשותף. כאשר מתכננים ובונים אפליקציה עם יכולות מקביליות יש לשמור על המידע המשותף. אם כולם רק קוראים את תוכן המידע המשותף לא נוצרת שום בעיה. יש להיזהר ממצב שבו מספר תהליכים ישנו את ערכו. הסכנות: תהליך יכול להרוס מידע שנשמר על ידי תהליך אחר. תהליך יכול להסתמך על מידע ששונה על ידי תהליך אחר. תהליך יכול להסתמך על מידע לא יציב (תהליך הסתיים לפני שהוא הספיק להשלים את עבודתו) במקרים בהם מספר תהליכים משנים את המידע נדרש לספק לכל תהליך גישה אקסקלוסיבית. X = rnd.Next(); Y = rnd.Next(); Y = X; למה?

Thread Synchronization לדוגמה: שלב א – ללא תהליך נפרד public class SampleClass { private object threadLock = new object(); private int num; private Random rnd = new Random(); public void PrintNumbers() Console.WriteLine("-> {0} is executing PrintNumbers()", Thread.CurrentThread.Name); Console.Write("Numbers: "); for (int i = 0; i < 10; i++) Thread.Sleep(100 * rnd.Next(5)); num = i; Console.Write("{0}, ", num); } Console.WriteLine(); משאב משותף מתודת עבודה שינוי המשאב המשותף static void Main(string[] args) { Thread.CurrentThread.Name = "Main Thread"; SampleClass p = new SampleClass(); //1 - Run method 10 time Console.ForegroundColor = ConsoleColor.Red; for (int i = 0; i < 10; i++) p.PrintNumbers(); } הפעלת המתודה קוד דוגמה: ThreadProblem

Thread Synchronization פלט שלב א:

Thread Synchronization public class SampleClass { private object threadLock = new object(); private int num; private Random rnd = new Random(); public void PrintNumbersAsynch () Console.WriteLine("-> {0} is executing PrintNumbers()", Thread.CurrentThread.Name); Console.Write("Numbers: "); for (int i = 0; i < 10; i++) Thread.Sleep(100 * rnd.Next(5)); num = i; Console.Write("{0}, ", num); } Console.WriteLine(); לדוגמה: שלב ב – בתהליך נפרד משאב משותף מתודת עבודה שינוי המשאב המשותף static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.Green; Thread[] threads_arr1 = new Thread[10]; for (int i = 0; i < 10; i++) threads_arr1[i] = new Thread (new ThreadStart(p.PrintNumbersAsynch)); threads_arr1[i].Name = string.Format("Worker thread #{0}", i); } foreach (Thread t in threads_arr1) t.Start(); יצירת תהליכים הפעלת המתודה

Thread Synchronization פלט שלב ב:

Thread Synchronization ברור שיש פה בעיה. כל תהליך מבקש להדפיס ערך המשותף לכל התהליכים שרצים והתוצאה היא משהו לא ברור ולא יציב. על מנת לפתור את הבעיה צריך שיטה לסנכרן בין התהליכים את הגישה למשאבים. תהליכים הם מטבעם הם אסינכרוניים. למזלנו הרב, מרחב השמות System.Threading מממש כמה גישות המאפשרות להכניס סדר סינכרוני בכאוס האסינכרוני.

Thread Synchronization Blocking השיטה הפשוטה ביותר לסינכרון נקראת Blocking או Simple Blocking. תהליך נמצא במצב של חסימה (Blocking) בשני מקרים: הפעלת המתודה Thread.Sleep(…) – חסימת התהליך לפרק זמן מוגדר. הפעלת המתודה Thread.Join() - חסימת התהליך הנוכחי עד לסיומו של תהליך אחר. בזמן שתהליך נמצא במצב חסום, הוא לא מקבל הקצאת CPU. static void Main(string[] args) { Thread thread = new Thread(DoSomething); thread.Start(); Console.WriteLine(thread.ThreadState); thread.Join(); Console.WriteLine("Application Ended successfully"); } התהליך הראשי ממתין עד לסיומו של התהליך thread public static void DoSomething() { int counter=0; while (counter<10) Thread.Sleep(2000); Console.WriteLine(DateTime.Now.ToLongTimeString()); counter++; } Blocking של 2 שניות קוד דוגמה: ThreadBlocking

Thread Synchronization Join – דוגמה נוספת מתבצע חישוב מסויים בשני תהליכים נפרדים, התהליך הראשי תלוי בתוצאת שני התהליכים: static decimal num1 = 1; static decimal num2 = 1; static Random rnd = new Random(); static void WorkerThread1() { var watch = Stopwatch.StartNew(); num1 = Fibonacci(rnd.Next(10,30)); watch.Stop(); Console.WriteLine("From WorkerThread1 : num1 = " + num1 + " , Working time: " + watch.ElapsedMilliseconds + " ms"); } static void WorkerThread2() num2=Fibonacci(rnd.Next(10,30)); Console.WriteLine("From WorkerThread2 : num2 = " + num2 + " , Working time: " + watch.ElapsedMilliseconds + " ms"); קוד דוגמה: ThreadJoinSample

Thread Synchronization Join – דוגמה נוספת (המשך) static void Main(string[] args) { Thread t1 = new Thread(new ThreadStart(WorkerThread1)); t1.Start(); Thread t2 = new Thread(new ThreadStart(WorkerThread2)); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine(num1 + num2); } המתנה לסיום שני התהליכים חישוב התלוי בתוצאת שני התהליכים קוד דוגמה: ThreadJoinSample

Thread Synchronization Critical Section מקטע קריטי (Critical Section) הוא מקטע קוד שצריך להתבצע ללא התערבות חיצונית של תהליך אחר שעלול להשפיע על תוצאות/תוצאות ביניים של משאב משותף. במילים אחרות, בכל מקום שיש משאב משותף אשר ניתן לשנות את ערכו הוא מקטע קריטי. דוגמה בעייתית: מערכת להזמנת חדר בבית מלון. המערכת צריכה לאפשר גישה אקסקלוסיבית למתודה שרושמת חדר בבית מלון אחרת יתכן ששני אנשים יזמינו את אותו החדר במידה והם ביצעו את ההזמנה בו זמנית. דוגמה לא בעייתית: דף אינטרנט מסוים יכול להיות מבוקש בו בעת על ידי מספר לקוחות או אפילו מספר פעמים על ידי אותו הלקוח. הדף מוצג בזמן הטעינה שלו לדפדפן וכאשר חלקים נוספים שלו מורדים. הדף הוא משאב משותף אבל הוא אינו מקטע קריטי.

Thread Synchronization Critical Section מה יהיה הפלט של הקוד הבא: class Program { static void Main(string[] args) Sample sample = new Sample(); Thread thread = new Thread(sample.DoTask1); thread.Start(); sample.DoTask1(); } class Sample private bool flag; public void DoTask1() if (!flag) flag = true; Console.WriteLine("Done - " + Thread.CurrentThread.Name); דוגמת קוד: CriticalSectionProblem01

Thread Synchronization למה? דוגמת קוד: CriticalSectionProblem01

Thread Synchronization class Program { static void Main(string[] args) Sample sample = new Sample(); Thread thread = new Thread(sample.DoTask2); thread.Start(); sample.DoTask2(); } class Sample private bool flag; public void DoTask2() if (!flag) Console.WriteLine("Done"); flag = true; ומה יהיה הפלט של הקוד הבא: דוגמת קוד: CriticalSectionProblem01

Thread Synchronization למה?

Thread Synchronization class Program { static void Main(string[] args) ThreadUnsafe sample = new ThreadUnsafe(); Thread thread = new Thread(sample.DoTask); thread.Start(); sample.DoTask(); } class ThreadUnsafe private int num1=10, num2=5; public void DoTask() if (num2 != 0) Console.WriteLine(num1 / num2); num2 = 0; מה הסכנה העלולה להיגרם מהקוד הבא: דוגמת קוד: CriticalSectionProblem02

Thread Synchronization קטע הקוד הבא הוא מסוכן: ההפעלה שלו במקביל על ידי שני תהליכים או יותר עלולה לגרום לחריגה/קריסה. הוא נקרא "מקטע קריטי" (Critical Section). הוא נובע משימוש במשאב משותף על ידי שני תהליכים או יותר. "מקטע קריטי" דורש מנגנון סנכרון שיבטיח שימוש בלעדי. public void DoTask() { if (num2 != 0) Console.WriteLine(num1 / num2); } num2 = 0;

Thread Synchronization class Program { static void Main(string[] args) ThreadUnsafe sample = new ThreadUnsafe(); Thread thread = new Thread(sample.DoTask); thread.Start(); sample.DoTask(); } class ThreadSafe private int num1=10, num2=5; private object lockThis = new object(); public void DoTask() lock (lockThis) if (num2 != 0) Console.WriteLine(num1 / num2); num2 = 0; Lock מנגנון נעילה הפשוט ביותר למקטעים קריטיים. מבטיח גישה אקסקלוסיבית למקטע קריטי, רק תהליך אחד יוכל לגשת למקטע הקריטי בו בעת. הפלט: למה? אובייקט הסנכרון/נעילה נעילה דוגמת קוד: LockSample01

Thread Synchronization בו זמנית אובייקט הסנכרון יכול להינעל רק על ידי תהליך אחד. שאר התהליכים נחסמים עד שאובייקט הסנכרון משוחרר. היתרון ברור – שמירה על משאבים משותפים. מה החיסרון? מה המסקנה? lock (lockThis) { if (num2 != 0) Console.WriteLine(num1 / num2); } num2 = 0; דוגמת קוד: LockSample01

Thread Synchronization Lock מקבל אובייקט סינכרון. אובייקט הסנכרון יכול להיות this. זו פרקטיקה גרועה משום שלא בשליטתנו מי עוד ישתמש באובייקט בשביל לבצע נעילות. כל מקטע קוד שיש לו גישה לאובייקט יוכל להשתמש בו לנעילה. מה שעלול להוביל למצב של DeadLock . מה שעלול להוביל למצב של איטיות מרגיזה ומיותרת (שני מקטעים שאינם משתפים משאבים ננעלים). הפיתרון שימוש בשדה פרטי: private object lockThis = new object(); מאחורי הקלעים של lock מסתתרת המחלקה Monitor. lock (lockThis) { if (num2 != 0) Console.WriteLine(num1 / num2); } num2 = 0; דוגמת קוד: LockSample01

Thread Synchronization מבלי להכיר את ה- Worker Thread , היכן מתבצעת נעילה? אפשרות ב' אפשרות א'

Thread Synchronization public static void DoSomething01() { lock (locker) for (int i = 0; i < 1000; i++) Console.ForegroundColor = ConsoleColor.Red; Console.Write("X"); } public static void DoSomething02() Console.ForegroundColor = ConsoleColor.Green; Console.Write("Y"); הפעם הנעילה מתבצעת על שתי מתודות. אובייקט שננעל באמצעות lock אינו מאפשר גישה גם מדובר על מתודה אחרת או אפילו מחלקה אחרת. דוגמת קוד: LockSample02

Thread Synchronization Deadlock – תהליך ראשון ממתין לתהליך שני שישחרר את החסימה בעוד שהתהליך השני ממתין לסיום החסימה בתהליך הראשון. public void Func1() { lock (lock1) Console.WriteLine("Func1 -> lock1 activated"); Calc1(); } public void Calc1() lock (lock2) Console.WriteLine("Func1 -> lock2 activated"); shared_num++; Console.WriteLine("From Func1: {0})", shared_num); דוגמת קוד: DeadlockSample01

Thread Synchronization המשך public void Func2() { lock (lock2) Console.WriteLine("Func2 -> lock2 activated"); Calc2(); } public void Calc2() lock (lock1) Console.WriteLine("Func2 -> lock1 activated"); shared_num++; Console.WriteLine("From Func2: {0})", shared_num); דוגמת קוד: DeadlockSample01

Thread Synchronization מתי נבצע חסימה? בתוך בלוק lock נתחום כל מקטע קוד אשר משנה ערך של שדה אחד או יותר ואשר נגיש למספר תהליכים. אין צורך לתחום ב-lock מקטעים שרק קוראים ערכים (אפילו מזיק). Lock הוא מהיר מאוד, לוקח רק 20ns (Nano Seconds).

Thread Synchronization Monitor המילה השמורה lock היא סה"כ קיצור למחלקה Monitor . כמו int ו-Int32. קריאה ל-Monitor.Exit מבלי לקרוא ל-Monitor.Enter תעורר חריגה. class ThreadSafe { private int num1 = 10, num2 = 5; private object locker = new object(); public void DoTask() Monitor.Enter(locker); if (num2 != 0) Console.WriteLine(num1 / num2); } num2 = 0; Monitor.Exit(locker); דוגמת קוד: MonitorSample

Thread Synchronization Mutex כמו lock אבל פועל מעבר לגבולות האפליקציה בה הוא הוגדר. Mutex הוא Computer Wide , דהיינו, יודע לבצע חסימות גם בין אפליקציות שונות. שימושי ב- IPC. איטי פי 50 מ- lock, זמן פעולה 1ms. שימוש מקובל – להבטיח שרק מופע אחד של אפליקציה תוכל לרוץ בו בעת. Semaphore "מועדון הלילה" של התכנות האסינכרוני. מאפשר גישה רק למספר מוגדר של תהליכים. דוגמת קוד: MutexSample דוגמת קוד: SemaphoreSample

את הסילבוס, חומרים, מצגות ניתן להוריד ב: www.corner.co.il