אסף גליל
בשנים האחרונות חלה התפתחות עצומה בזמינות מעבדים מרובי ליבות. התפתחות זו מקיפה משפחות מעבדים שמאופינות בביצועים גבוהים וגם את אלו המאופינות על ידי הספקים נמוכים.
בישומי Embedded השאיפה הינה תמיד להשיג את הביצועים הטובים ביותר בהספק הנמוך ביותר האפשרי. עם התפתחות האפשרויות לריבוי ליבות וירידת הספקים – הפכו ישומי Embedded רבים לאפשריים בצורות שונת של ביזור ליבות – על אותה פלטפורמת PC ובין פלטפורמות PC.
השיטה המקובלת לצורת השימוש בריבוי הליבות במערכות Embedded במיוחד באלו הדורשות ביצועי זמן אמת הינה Asymmetrical Multi Processing – AMP. הסיבה היא שבישומי זמן אמת נתוני הטיפול בפסיקות חשובים ביותר, וב AMP משיגים שליטה מוחלטת ובידוד – כך שטיפול בפסיקות בליבה אחת אינו משפיע כלל על נתוני הטיפול בפסיקות בליבה אחרת. סכמת מערכת כזו מופיעה בשרטוט מס‘ 1.
כל ליבה מריצה עותק מלא של מע”ה כך שבמקביל רצות על הפלטפורמה מספר מע”ה מלאות. לכל ליבה מוקצים התקני ה I/O שבהם עליה לטפל – כך ניתן לטפל בכמה התקנים מבלי שתהיה כל הפרעה הדדית ביניהם.
חברת TenAsys שפעילה כבר שנים רבות בפיתוח ובהספקת מע”ה לזמן אמת על X86 – נעזרת בארכיטקטורת AMP עבור מע”ה שלה הקרויה INtime.
כדי לאפשר את ביצוע ה- AMP יש ל INtime שתי תכונות עזר:
1 – Embedded Virtualization
2 – Global Object Network
Embedded Virtualization
באמצעות כלי הקונפיגורציה של INtime מחולק הזכרון בין הליבות. מערכת הגנה ברמת חומרת המעבד – אינה מאפשרת לתוכנת ליבה אחת לגלוש – ובכך מושג הבידוד. בנוסף כל מרכיב I/O משוייך – יחד עם הפסיקות שלו – לליבה מסוימת שבה ירוצו התהליכים שיטפלו ברכיב.
תוך כדי ריצה – תישמור שיכבת הוירטואליזציה הזו – על מה שהוגדר. ניתן כמובן לשנות את הקצאות הזיכרון ושיוך ההתקנים לליבות – ולהגדיר אותם בצורה האופטימלית תוך כדי התפתחות הפרויקט ובהסתברות על כלים למדידת זמנים: זמני ביצוע, וזמני תגובה לפסיקות. הכלי האופטימלי לנושא הוא INscope שמסופק עם המערכת ומציג את התוצאות בצורה גרפית עבור כל ליבה – ברזולוציה של כמיקרו שניה אחת.
Global Objects Network – היכולת לתקשר במנגנוני זמן אמת בין ליבות.
כל מערכת לזמן אמת פועלת על אוביקטים (Mailbox Semaphore Shared Memory etc.) שבעבודה איתם מושגות התכונות הנדרשות. ל INtime הוסיפו יכולת לפעול על אובייקט שנמצא על ליבות אחרות ומוגדר כגלובלי.
האוביקט יכול להמצא על ליבה אחרת באותו ה- PC או על Host אחר המריץ INtime. האובייקט מכונה Global Object, והיכולת לתקשר באמצעותו קרויה Global Object Network או בקיצור GOBSnet.
בהסתכלות על המערכות המקושרות – לכל ליבה (Node) המריצה INtime ישנו שם לוגי המורכב ממספר ה- Host ומספר הליבה. למשל Host 2 Node B הינה מע”ה INtime שרצה על ליבה 1 במחשב Node) PC) מספר
שרטוט 2 ממחיש את השמות הלוגיים.
מעל ה- Intime Kernel שרץ על כל ליבה, רצים שני שרותים (מסומנים גם הם) בשרטוט מס‘ 2: האחד GOBS manager שמנהל את האינטראקציה בין ה- Objects. והשני DSM שמנהל את האינטראקציה בין ה- Processes למימשק ה- API. בכל ישום שרץ התווספו פניות לזיהוי Node וליצירת reference object שמשקף את ה- remote object שעליו פועלים.
האוביקטים הינם אלו הרגילים: Shared Memory ,Semaphore ,Mailbox וכל הפקודות הפועלות על אוביקט רגיל – פועלות גם על Global Object.
ביזור הפתרון
כל ישום בנוי מ- processes. ניתן לבזר את ה- processes בין Nodes שונים מהשיקולים הבאים:
ביצועים – אם ה- processes צורכים זמן cpu רב, ניתן לפזר אותם ל nodes אחרים.
דטרמיניסטיות – אם ישנם יותר מידי תהליכים שזמן התגובה של כל אחד מהם לטיפול של Interrupt Thread חשוב – אזי באמצעות הביזור של התהליכים – מאפשרים שכל ה- Interrupt thread לא יופרעו האחד מהשני וכמובן לא יפריעו לתהליכים שרצים על Node אחר.
מרחק – אם ההתקנים שבהם אמורה המערכת לטפל פרושים במרחק האחד ממשנהו – יש לשקול הקצאת Nodes על תוספת של PCs שמחוברים בחיבור LAN.
האמצעים לביזור התהליכים הם סטטיים או דינמיים, או שילוב של שניהם.
חלוקת סטטית פירושה שכאשר ה kernel מתחיל לרוץ הוא מטעין את התהליכים, בסדר הדרוש, כל אחד לליבה שהוגדרה עבורו.
חלוקה דינמית היא אפשרות לטעון תהליך תוך כדי ריצה בהתאם לקריטריונים מסוימים שקובע המתכנן.
בשרטוט מס‘ 3 מומחשת יכולת הביזור שהוזכרה. במצב הראשוני כל ליבה מריצה ישום המסומן במספר הליבה המקורית שהריצה אותו: APP1 APP2 וכו. APP1 מטפל גם בהתקן I/O.
תוך כדי פיתוח מבחינים ש APP1 אינו מספיק לעבד את המידע המתקבל מההתקן וחלקים ממנו אינם מסוגלים להשלים עבודתם במועד.
הפתרון הוא לחלק את APP1 לשני ישומים – האחד שמטפל בעיקר ב I/O והשני שמעבד את הנתונים שהתקבלו מההתקן. ההתקשרות בין חלקי APP1 היא באמצעות Global Objects. החלוקה אינה פוגעת כלל בדטרמיניסטיות שמקבל התקן ה I/O ומאפשרת יכולת עיבוד של הנתונים שאינה מופרעת כלל ע”י הטיפול בהתקן.
עבור ישומים 3 ו- 4 הכיוון הוא הפוך – במקום להתקשר על ידי אוביקטים גלובליים, הם מתקשרים ביניהם על ידי אוביקטים רגילים.
על ידי הוספת מספר קטן של שורות code לזיהוי ה Node , והקצאה שתלויה בזיהוי – מקבלים תוכנה שפועלת ללא כל שינוי אפילו אם מבצעים הקצאה שונה של התהליכים לליבות.
משמעות יכולות GOBSnet לתכנון מערכות.
התכונה החשובה שמתקבלת באמצעות השימוש ב Global Objects הינה יכולת ה scaling: התאמת מבנה המערכת מבחינת חומרה ותוכנה לדרישות גידול.
השימוש ב Global Objects מאפשר לכתוב את התוכנה פעם אחת עבור כל הגדלים הדרושים, ולבחור בצורה פשוטה בכלי קונפיגורציה את כל ההקצאות במערכת:
גידול זיכרון, פיזור תהליכים שרצו על ליבה אחת לכמה ליבות (גם על ליבות שרצות על PC אחר), העברת תהליכים מעבודה על כמה ליבות לליבה אחת.
השקיפות הזו שמושגת במערכת AMP – דומה לזו הטבעית כל כך במערכת SMP – אבל בשני יתרונות משמעותיים שאינם אפשריים ב SMP:
הביזור אינו פוגע בדטרמיניסטיות של המערכת בטיפול בהתקנים.
הביזור אפשרי לא רק לליבות שעל אותו ה- PC אלא גם על PC אחרים שנמצאים ברשת.
לסיכום
מעל מעבדים מרובי ליבות ניתן לשלב בין Nodes שמריצים את מע”ה Distributed INtime – ללא Windows עם Nodes שמריצים Intime for Windows.
אם ההתקשורת בין כל תהליכי זמן אמת מבוצעת מעל GOBSnet – יכול המתכנן להתאים את קונפיגורצית החומרה (מספר הליבות, קיום של Nodes שמחוברים ברשת) לדרישות הלקוח, ללא שינוי תכנה, ובשמירה מלאה על ביצועי זמן אמת של המערכת. שרטוט מס‘ 4 מציג מערכת כזו.
על המחבר: אסף גליל הוא מהנדס יישומים של חברת (TenAsys (www.TenAsys.com והחברה שבבעלותו מיצגת אותה בישראל.
לאסף למעלה מ 30 שנות נסיון במערכות משובצות מחשב עם דגש על מעבדים ותוכנות למשפחותX86.