GPars – מקבילים בלי מתח: מבוא

(ההומור הדלוח בכותרת באדיבות שידורי האולימפיאדה בערוץ 1)

החשיבות של תכנות מקבילי התחילה עם מערכות ההפעלה שפעלו בשיטה של חלוקת זמן. במערכות כאלה אמנם היה רק מעבד אחד, אבל מערכת ההפעלה חילקה את הקצאת הזמן שלו בין התהליכים השונים ובכך יצרה אשליה שהם רצים במקביל. כיום יש מקביליות אמיתית כשכל מחשב ביתי כבר מכיל מעבד עם לפחות שתי ליבות, ויש דעה רווחת שהעלייה במהירות המעבדים מיצתה את עצמה והמשך הצמיחה בכוח העיבוד יגיע דרך הגדלת מספר הליבות במעבד (מה דעתכם על מעבד עם 100 ליבות?). העניין הזה דורש שפות ופרדיגמות שיאפשרו ניצול של כח העיבוד הזה בצורה שהיא בטוחה וטבעית.

אחת התכונות ששפת ג'אווה התהדרה בה החל מהגרסאות הראשונות היא תמיכה מוטמעת בשפה בריבוי נימים ובתכנות מקבילי. בעוד שבשפות אחרות היה צורך לממש מנגנוני סנכרון בקוד מעל מנעולים כגון mutex וsemaphore (הנה דוגמא לתבנית שעושה את זה בשפת ++C), ג'אווה סיפקה את את synchronized כמילת מפתח בשפה, שיטות איתות בין נימים שונים במערכת (notify) וכו'.

אבל השכבה הגבוהה של אתמול היא השכבה הנמוכה של מחר.  ישנן פעולות רבות שדורשות סמנטיקה מורכבת של סינכרון. דוגמא פשוטה היא הוספת ערך למפה במידה והמפתח עדיין לא קיים (צריך לבצע את הבדיקה וההוספה ב'מכה אחת' אחרת יתכן שבין הבדיקה להוספה המצב ישתנה). דוגמא מורכבת יותר היא שליחת מספר פעולות לביצוע א-סינכרוני (ופוטנציאלית על ליבות אחרות של המעבד) וחיבור של כל התוצאות כאשר כל הפעולות הסתיימו. כאשר מזהים פעולות כאלה בתור 'תבניות' שחוזרות על עצמן נוצרת מוטיווציה להפריד בין שכבת התשתית (שאפשר לכתוב ממש טוב פעם אחת בצורה גנרית) ושכבת האפליקציה שהיא הרבה יותר פשוטה ומשתמשת בתשתית על מנת לפתור את הבעיות הקונקרטיות.

להפשטה כזו יש עוד מטרה והיא 'הסתרה' של השכבה הנמוכה יותר שמונעת טעויות ופעולות מסוכנות. כדוגמא אפשר להביא את נושא הזיכרון בג'אווה: מעבר לכך שהסביבה מנהלת את הקצאות ושחרור הזיכרון, הסמנטיקה של פניה לאובייקטים היא שונה לחלוטין בין ג'אווה וC. בשפת C מצביע מציין את הכתובת האמיתית בזיכרון שבה מאוחסן אוביקט מסוים, ואפשר לבצע תרגילים כמו אריתמטיקת מצביעים וכו'. בשפת ג'אווה המצביע מכונה גם object handle והוא למעשה הדרך היחידה בה ניתן להשיג אחיזה באוביקט כלשהוא. כל ההתעסקות המוחשית עם הכתובות האמיתיות של האובייקטים בזיכרון מוסתרת מהקוד ולא ניתן לגשת אליה (אלא אם מחליטים להשתגע).

ואכן בגרסה 5 של ג'אווה ספריית util.concurrent שהייתה ספרייה פופולארית בקוד פתוח הפכה לחלק אינטגרלי מהשפה והכניסה מבני מקביליות שמאפשרים להתעלם משכבה הנמוכה של תהליכים, חוטים וסנכרון ולהתייחס למבנים יותר מופשטים כגון Future, ConcurrentMap ועוד. התמיכה לאחור מחייבת את התמיכה גם ברמה הנמוכה של חוטים וסינכרון, אבל בקוד חדש מומלץ תמיד לחפש את המחלקות המתאימות בספרייה util.concurrent (אגב, בנושא הזה יש כל הזמן התקדמות וחידושים).

Gpars, ספרייה לתכנות מקבילי בשפת groovy, לוקחת את הדברים האלה צעד אחד קדימה ומציעה הפשטות ומבנים בעלי עוצמה לתכנות מקבילי שמוגשים בצורה פשוטה לשימוש. בפוסטים הבאים בסידרה נראה כמה דוגאמות לשימוש בGPars ואת העקרונות שעומדים מאחוריהם.

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s