Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
ארגון המחשב מהדר - 4שלבים למהדר – pre processing → compiler → assembler → linker ( )1המהדר מבצע פקודות ב #והופך הכל לקובץ headerיחיד. ()2מתבצע תרגום של שפות עיליות לשפת אסמבלר (שפת מכונה ,שונה בין מחשב למחשב). ( Reduced Instruction Set Computer – RISCמספר מופחת של פעולות) Complex Instruction Set Computer – CISC סיביות ובתים – *בית = 8ביטים -ניתן לייצג אותו עם 2תווים ב.Hex *אין הבדל בין intל long int סידור מילים – – Big Endianהבית הימני בכתובת הגבוהה( .מימין) – Little Endianהבית הימני בכתובת הנמוכה( .משמאל) * printf intאינו רגיש לסדר הבתים בזיכרון – כלומר מדפיס את המילה כראוי ללא קשר סידורה בזיכרון. *מהדרים שונים מסדרים כתובות באופן שונה ( .בקוד שמסתמך על כתובות יכול להיווצר בעיית portingבגלל פונקציות גיבוב (קיצור המילה שתתאים לאורך הזיכרון)). פקודות מכונה – 4 – RISCבתים מספיקים לייצוג כל הפקודות – CISC .גודל משתנה של פקודה. *לכל פקודה קידוד מספרי .מחשבים שונים משתמשים בשיטות קידוד שונות. לוגיקה פסוקית – 𝑛 ניתן לבנות 22שערים לוגיים מעל nמשתנים. ANDו ORקומוטטיבי ואסוציאטיבי. השוואה בין אלגברה מתמטיקה לבוליאנית 3,6,8( .לא ניתנים להשוואה) עוד דוגמאות לא נכונות במעבר – ביטוי של ^ על ידי | & - חיבור במספרים בינאריים – – half adderמחבר שני ביטים ומעביר את השארית השמאלית הלאה. – full adderמקבל את השארית מהמחוברים מימינו ומעביר את השארית השמאלית הלאה. השארית השמאלית ב(a&b) – HA השארית השמאלית ב((a&b)|((a^b)&i) – FA פעולת זיזה ()shifting *בהזזה אריתמטית ( )signedמשכפלים את הספרה השמאלית – על מנת לשמור על הסימן של המספר בשיטת המשלים ל.2 *מגבלה על גודל זיזה – אם 𝑛 > 32אז מזיזים ב )(𝑛%32 *זיזה שמאלה ב( 𝑥 ⋅ 2𝑦 - yאם אין גלישה /החלפת סימן) *זיזה ימינה בfloor)𝑥 ∕ 2𝑦 ) - y קידוד – int טווח ייצוג ב 32סיביות – מעברי בסיסים – מספר Kבבסיס 10לבסיס .B לוקחים את שארית החלוקה בBעל תוצאת החלוקה ב Bמהשלב הקודם. שיטת המשלים ל– two's complement – 2 *אם xחיובי −𝑥 = ~𝑥 + 1 - המספרים הקיצוניים בייצוג ()signed Tmax = 2𝑤−1 − 1 Tmin = −2𝑤−1 *קבועים נחשבים כברירת מחדל בתור .signed * בביטויים מעורבים – signedמומרים להיות .unsigned *הרחבה – sign extensionמכפילים את הסיבית המשמעותית (סיבית הסימן) וכך הערך המספרי והסימן נשארים זהים. אריתמטיקה מודולרית *בחיבור unsignedמשתמשים באריתמטיקה מודולרית ואם תוצאת החיבור יוצאת גדולה יותר מ 𝑤 2אז עושים לתוצאה : (שזה כמו לחשב את שארית החלוקה) *בחיבור – signedשני סוגי גלישות : 𝑤𝑢 + 𝑣 − 2 צריך להמיר ל unsignedואז לבצע פעולות אריתמטיות ואז לבצע המרה בחזרה ל.signed מסכות שברים – floating point . 𝑏𝑖𝑎𝑠 = 2 גדלים של הייצוג – * מבצעים הטיה של האקספוננט למספר unsignedעל ידי − 1 קטגוריות של מספרים – • אם כל המספר אפסים – התוצאה תהיה ±0בהתאם לסיבית הסימן. • אם כל האקספוננט אפסים ו –frac>0התוצאה מייצגת מספרים שנקראים )0.frac( denormalized • אם כל האקספוננט אחדים ו – frac>0התוצאה מייצגת ( . NaNלמשל 𝑖) • אם כל האקספוננט אחדים ו – frac=0התוצאה מייצגת ∞ ±בהתאם לסיבית הסימן. * פעולות חישוביות עם FPיותר איטיות מאשר עם שלמים. *אסוציאטיביות אינה נשמרת( .יש אופטימיזציות שאינן מתבצעות). * - double intהמרה מדויקת. * -float intהייצוג משתנה – תלוי בגודל ה fracואז מתבצע עיגול. נוסחת מעבר ( 𝐸 + 𝑏𝑖𝑎𝑠 = 𝑒𝑥𝑝 -כאשר denorm :אזי – 𝑠𝑎𝑖𝑏 )𝐸 = 1 − " – Eהמשקל" לפני ההטיה. |ⅇ|−1 שפת מכונה – אסמבלי קבוצה מינימלית של סוגי נתונים (שלמים בגודל 1,2,4ערכים עם כתובות) ,פעולות בסיסיות בלבד. מחסנית – לכל פונקציה נעשית הקצאה של מסגרת חדשה במחסנית .המסגרת מכילה – משתנים מקומיים ,פרמטריים מקומיים ,כתובת לחזרה. R8 → frame pointer( . R7 → stack pointerהמקום האחרון שנכתב למחסנית) ,כתיבה במחסנית מלמעלה למטה (כתובות יורדות)* .בכל תחילה וסוף של פונקציה יש לבצע פקודות אדמיניסטרטיביות (תחילה – לשמור R8במחסנית ,לעדכן לפי הצבעה של R7(.R7של הקוראת הופך ל R8של הנקראת) ,סוף – שחזור של )R7, R8 – Addפקודת חיבור ,אין הבדל בין signedל. unsigned – Moveהזזת מידע .אין אפשרות להעביר מזיכרון לזיכרון במעבר אחד. שיטות מיעון – • – )R( – Normalרגיסטר Rמכיל כתובת בזיכרון. • R – D(R) – Displacementמציין התחלה של כתובת D ,מציין offset • מערכים R4 – (R4,R6,4) -כתובת לתחילת מערך R6 ,מספר הקפיצות (מיקום) 4 ,מציין את גודל הקפיצה (טיפוס) -Lealמעבירה כתובת של זיכרון במקום את תוכנו. – Flag registersרגיסטר ייעודי בין סיבית אחת .מופעלים בעת חישוב פעולות אריתמטיות. בפעולת ה OF ,a-b<0 SF ,a==b ZF( compareאם יש גלישה ב )signedוה ZF( testכאשר SF ,a==0כאשר ש )a&b<0ניתן לשנות את ערכי דגלים אלו .ב compare a,bבודקים . b-a>0 פקודת switchעדיפה על ifכאשר אין חורים בטווח ערכים .אך גודל הטבלה יכול להיות לא פרופורציונלי למספר הכניסות לטבלה .ה jump tableמכיל לייבלים שממורים לכתובות – jmp *.L57( ,R1,4) .מידע הנמצא במיקום R1בטבלה (בקפיצות של 4כי כתובות) .כאשר ה switchדליל מיישם את הערכים בעץ בינארי ומבצע חיפוש לוגי (ממיין בזמן ההידור וחוסך זמן). CISCמכילים רגיסטרים מיוחדים לתנאים ,בעוד ש RISCמשתמשים ברגיסטרים כללים. אופטימיזציה אופטימיזציה לא תלוית מכונה- • מהדרים מתרגמים מרובי אופטימיזציה – מיפוי יעיל של תכניות לשפת מכונה (הקצאת רגיסטרים ,והקלות "זולות" לחישוב מקומיות ושמרניות). לא יכולים להשפיע על סיבוכיות אסימפטוטית ,אלא בפקטור קבוע ( .לא ניתן לבצע שיפור על מרכיבים רבים בקוד מחשש של תוצאות לווי). **מגבלות של מהדרים – אסור לשנות סמנטיקה של תכנית – מונע ביצוע שינויים של מקרי קיצון מיוחדים( .התנהגות תכנית לא מובן למחשב רק למתכנת). רוב הניתוח מבוצע על ידי המהדר בתוך פרוצדורות ולא ביניהן (לא יעיל ומעשי לעבור על כל התכנית) ,בדיקה ע"י פעפוע קבועים inlining ,בקבצים .מבוסס על מידע סטטי (לא מזהה קלט בזמן ריצה) ,חייב להיות שמרני!. • הקטנה של מספר פעמים שקוד רץ ,לדוגמה הוצאת קוד זהה מלולאה. • החלפה של אופרטורים יקרים – להחליף כפל וחילוק בזיזה וחיבור. • שימוש ברגיסטרים -שימוש ברגיסטרים הרבה יותר מהיר מגישה לזיכרון .נותן עדיפות למשתנים זמניים (ניתן לקבוע אילו משתנים ייקח ע"י )register • צירוף ביטויים משותפים – בדר"כ לא מנצלים ידע אריתמטי. מדידת ביצועים – חישוב זמן ריצה הנצרך על ידי קטע קוד מסוים ,שימוש ב( profilerמספר הקריאות לפונקציה) (שלבים – הרץ תכנית לאיסוף סטטיסטיקות ,הידור מחדש) יתרונות ל – profilingעוזר לזהות צווארי בקבוק בביצועים ,שימוש בעיקר במערכת מרוכבת עם רכיבים רבים .מגבלות – תלוי קלט ,מנגנון חישוב זמן לא מאוד מדויק. מדדי זמן – זמן אבסולוטי :בדר"כ ננו-שניות (למשל ,) clock period=0.5ns – 2GHzניתן למדוד זמן ע"י פונקציית ספריה (מזן מההתחלה עד לסוף ,וזמן בתוך ה)CPU – CPEדרך נוחה למדוד ביצועים במקרה של רשמית נתונים. חוסמי אופטימיזציה ( – )Memory aliasingשני מצביעים יצביעו לאותה כתובת. אופטימיזציה תלוית מכונה – שימוש במצביעים – מצביעים במקום גישות למערך( .מאפשר להפטר מהמונה) .לא בהכרח עוזר ,תלוי במבנה מעבד. • פרישת לולאה –חוסך תקורה של הלולאה pipeline( .ל – loadעד . )3בלוק בסיסי יותר של פעולות (יותר חופש למהדר לבצע אופטימיזציה). • הצנרה ( – )pipelineניתן לבצע מספר רכיבים של פקודות שונות בו זמנית( .חלקים שונים של אותה פעולה מבוצעים ע"י רכיבים שונים). • ביצוע מקבילי – לפרק את המכפלה הסדרתית לשתי מכפלות סדרתיות .מגבלות – שימוש רב ברגיסטרים ( 6ל 8 intל floatושיש חוסר מועבר לזיכרון ראשי). • הסתעפויות – חוזים מצב של הסתעפות – חיזוי סטטי ,דינמי (לא בהכרח נכון)( .הסתעפות בפונקציות וב)if • היררכית זיכרון יחידת זיכרון בסיסית (תא) יכולה לאחסן סיבית אחת. ) – Static RAM(SRAMאחסון סיבית בעזרת מעגל של 6טרנזיסטורים ,מאחסן מידע באופן בלתי מוגבל ,יחסית לא רגיש להפרעות חשמליות. • ) – Dynamic RAM (DRAMאחסון הסיביות בעזרת קבל וטרנזיסטור ,יש "לחזק" מחדש את המידע כל 0.1שניות ,רגיש להפרעות ,איטי וזול יותר מה.SRAM • ה SRAMוה DRAMהם זיכרונות נדיפים – מאבדים מידע כשאין חשמל. זיכרונות לא נדיפים נקראים )– Read-Only-Memory(ROM Programmable ROM – PROM • Erasable programmable ROM – EPROM • Electrical erasable PROM – EEPROM • זיכרונות הבזק ( – )Flash memoryדומה ל EEPROMאבל מאפשר כתיבה/מחיקה של בלוקים קטנים. • – Firmwareמאחסנים תכנית ב – ROMתכניות העולות בזמן עליית המחשב. *ההיררכיה נובעת מהלוקאליות -לתכניות שכתובות היטב יש לוקאליות (זמן–אותם משתנים בהפרשי זמן קטנים ,מקום-מידע סמוך בזיכרון) זיכרון מטמון -זיכרון קטן ומהיר ,משמש "מבוא" לזיכרון גדול ואיטי יותר( .כל Kמשמש זיכרון מטמון עבור הרמה ה k+1בהיררכיה). :write-throughבעת קריאה של ערכים–מביא את הערכים מרמות נמוכות עד לרמות קרובות ל K( CPUקטנים)– יוצר עותקים קרובים יותר על מנת ליצור גישה מהירה יותר. בעת כתיבה של ערכים – משנה את ערכם ב CPUואז מעדכן עד למטה לדיסק (לערכי Kגדולים יותר) כדי שהעדכון ישמר ולא יימחק (בגלל שאם נשמור רק במקומות עם K קטנים אז השינוי יכול להימחק) :write-back .בעת כתיבת ערכי ם לא מעדכן ישר לרמות נמוכות ( Kגדול) ,אלא מחכה עד לרגע שבו נצטרך לדרוס אותם ורק אז יוצר עותק שלהם ברמה נמוכה יותר. בחירה של בלוק לפינוי – • :Direct-mapלפי שיוך ידוע מראש של בלוק ברמה ה k+1לבלוק ברמה ה( .kאחד לאחד) • :Associative mapללא מגבלה .למשל לפי מדיניות – LRUמפנה את הבלוק שהשתמשו • בו לפני הכי הרבה זמן( .הכל לכולם) • משהו באמצע 4-way-associative :בלוק ברמה k+1משויך לאחד מ 4מקומות בבלוק .k גודל הבלוק משתנה בין רמות. :Cache-misses • – Cold missזיכרון המטמון ריק. • – Capacity missזיכרון המטמון קטן מדי ,התכנית זקוקה למידע זמין יותר מגודל זיכרון המטמון. • )direct map( Conflict missבזיכרון מיפוי ישיר הזיכרון ברמה Kמגביל את המיקום של הבלוקים מרמה k+1ולכן ייתכן שייווצר מצב שרמה Kמספיקה לתכנית מסוימת אך תמיד יקראו אותם בלוקים מ k+1כי המיקום המיועד להם ברמה החדשה הוא זהה. מדדים לביצועים של זיכרון מטמון – • – Miss rateמספר הפעמים שהמידע שחופש לא נמצא ב / cacheמספר הפניות הכללי לזיכרון. • – Hit timeהזמן שלוקח להעביר שורה מה cacheלמעבד (כולל הזמן לקבוע אם המידע נמצא שם). • – Miss penaltyהזמן הנוסף כאשר המידע לא נמצא ב.cache מערכות הפעלה תהליך( – )processתכנית שכרגע רצה. לכל תהליך של מזהה שנקרא – process ID – PID אפשר להפעיל תהליך – מתוך תהליך של מערכת הפעלה ( ,cmdדאבל קליק) מתוך תהליך משתמש (קריאה ל ,systemקריאה ל) fork תת-תהליך(( )threadחוט*) אפשר להפעיל תת תהליך רק מתוך תהליך בזמן ריצה. כל התתי תהליכים עובדים באותו מרחב כתובות וירטואלי( .ניתן לחלוק מידע על ידי משתנים גלובלים) הזיכרון של כל התתי תהליכים מוגבלים בזיכרון של התהליך הראשי. – forkמשכפל את הקוד בזיכרון ויוצר תת תהליך (נפרד לראשי) שמתבצע בו זמנית ובאותו מרחב וירטואלי. *בתור משתמש אין שליטה על סדר התור בין התהליכים – .הסדר הוא "שרירותי" ,תלוי במערכת ההפעלה. ריבוי תהליכים ()multitasking החלף בין תהליכים מספיק מהר כדי שייראה כאילו רצות במקביל. נעשה על ידי סירוג תהליכים ( – )interleavingמערכת ההפעלה מאפשרת זאת על ידי זמנון ( ) CPU schedulingהוגן .מתבצעת הגנה על ידי כך שתהליכים לא יכולים לשנות תהליכים אחרים (מתבצע על ידי הפרדה לזיכרון וירטואלי ופיזי) החלפת הקשר ( )context switchמריצה תהליך לקוונטה ( )Quantumשל זמן. עוצרת אותו ושומרת על מצבו ומכניסה את התהליך הבא בתור. המידע שנשמר בהחלפת הקשר (נשמר במבנה נתונים שנקרא – )Process Control Block • הכתובת בזיכרון של הפקודה הבאה לביצוע ()Program Counter • המצב של הרגיסטרים ()CPU registers • אם יש קריאה של קובץ ()File access pointer החלפת הקשר מתבצעת כאשר – • המתנה לקלט • כניסה למצב המתנה ( waitלמשל על ידי סמפור) • כניסה למצב השעיה .למשל על ידי sleep *זמנון מסודר -מערכות הפעלה מודרניות מאלצות תהליכים לוותר על ה CPUאם הם נשארים שם זמן רב. קוצב קבוע ( – )fixed timerכל Xיחידות זמן מחליפים תהליך. קוצב משתנה ( – )variable timerמערכת ההפעלה קובעת אחרי כמה זמן מחליפים תהליך. ביצוע החלפת התהליך – ההחלפה נעשית על ידי רוטינה ייעודית–ניגשת למקום ידוע מראש בזיכרון ושולפת את הכתובת של התהליך עם העדיפות הגבוהה ביותר. למערכת ההפעלה יש טבלת תהליכים ( )PCB – Process Control Blockשבה יש רשומה לכל תהליך (מזהה תהליך הוא . )PID *תור הממתינים לריצה – תור דו -כיווני הממוין לפני העדיפות (מחושבת לפי ,base priority ,PCBופקטורים נוספים). המיקום הראשון מוגדר בזיכרון וכך מערכת ההפעלה י ודעת לאן לגשת בשביל לקחת את התהליך עם העדיפות הגבוהה ביותר. זמן שהייה במעבד ( )Quantumלא אחיד בין תהליכים שונים. *הפונקציה המתארת את העדיפות של תהליך jלפי פרק הזמן iלא תהיה קבועה (שיניים). ניתן "להחליק" אותה על ידי פונקציה החלקה : 𝑦𝑖 = 𝑎𝑥𝑖 + (1 − 𝑎)𝑦𝑖−1 : כאשר a=0הגרף יהיה קו ישר מקביל לציר , xוכאשר a=1הפונקציה לא תשתנה מהמקור. כל ערך בין 0ל 1ייצור גרף "חלק" יותר ויאפשר לנו לקבל מגמתיות ברורה יותר (קו מגמה). בחירת מדיניות זמנון – • ניצול מקסימלי • מזעור תקורה (זמן שמנוצל על ידי משאבים אך לא תורם באופן ישיר לביצוע המשימה – "זמן מבוזבז של החלפות הקשר") • זמן תגובה מינימלי (לטבלת משתמשים אינטראקטיבית) • הספק – מספר תהליכים שמסיימים בפרק זמן נתון. אלגוריתמי זמנון אופטימיזציה ללא כל הקלט מראש – online algorithm * – FIFO – )FCFS( First Come First Serveנותן עדיפות לתהליכים צורכי מעבד ,העדיפות ניתנת למי ששולח הרבה ע בודות מוקדם ,לא מספק רציפות מדומה. * – )SJF( Shortest Job Firstמוסדר או לא מוסדר ,תהליך בעל יתרת זמן נמוכה ביותר ייכנס ראשון ,דורש ניבוי של זמן ריצה של תהליך. יכול ליצור בעיות רבות עם תהליכים ארוכים .פתרון :מדיניות , bypass and freezeהוותק מחושב ע"יכאשר Kהוא קבוע שמעיד על החשיבות שהענקנו לזמן ההמתנה .לוקחים את התהליך עם ' cהנמוך ביותר. *אלגוריתם מוסדר – אלגוריתם שבו תהליך נכנס למעבד ולא מסיים את כל ריצתו בפעם אחת (נותן מקום לתהליך עם עדיפות גבוהה משלו ,או הולך ל)IO * – )RR( Round Robinמחלקים את הזמן למרחבי זמן קבועים ( ,)Quantumכל התהליכים מאורגנים בתור מעגלי ,נכנסים לעיבוד לפי סדר הופעתם בתור ,כל תור מקבל לכל היותר Quantumבסיבוב. תכונות – מוסדר ,תלוי ב ,Quantumעבור Quantumגדול שקול ל q . FCFSקוונטה n ,תהליכים לביצוע לפני תהליך נוכחי nq ,זמן תגובה (עד התחלת התהליך) ,נרצה להקטין את הקוונטה מבלי להגדיל מדי את התקורה של החלפות ההקשר. אם תהליך הוא קצר מהממוצע עדיף לו להיות ב.RR * n-1 – multilevel feedbackתורי של FCFSולמטה תור של . RR נותן עדיפות לתהליכים אטרקטיביים Base-priority ,קובע כמה נמוך אפשר לרדת. סנכרון בין תהליכים תהליכים יכולים להתחרות על משאבים ביניהם (מ"ה מתזמנת ומגנה עליהם) ,והם יכולים לשתף פעולה ולהתחלק במשאבים (מ"ה מספקת אמצעים לחלוקה ולקשר ,שיתוף הפעולה נעשה על ידי שיתוף זיכרון או תקשורת). דרישות בסיסיות מתהליכים למען שיתוף פעולה על dataמשותף – • מניעת הדדיות ( – )mutual exclusionאם תהליך אחד מבצע את הקטע הקריטי ,אף תהליך אחר לא מבצע אותוsafety– . • חוסר הרעבה – תהליך שרוצה להיכנס לקטע הקריטי בסופו של דבר נכנס אליו .תכונה liveness דורש ,בין היתר ,שלא יהיה חבק ( :) deadlockמעגל של תהליכים בו כל אחד ממתין לשני. הוגנות תהליכים ( – )process fairnessאם תהליך רוצה ויכול להתקדם אינסוף פעמים ,הוא מתקדם. צריך להגן על קטעים קריטיים צריכים להיות סופיים ,קטעים לא קריטיים לא דורשים הגנה ויכולים להיות אינסופיים. האלגוריתם של פטרסון – אלגוריתם נכון אך סובל משתי בעיות עיקריות – קשה להרחיב ליותר משני תהליכים ,דורש לדעת מראש כמה תהליכים יש .אלגוריתם המאפייה – -יש בעיית גלישה עם מונה אינסופי . יכולה להיות בעיה של סירוג ואז שני תהליכים מקבלים את אותו מספר בתור .פקודות אוטומטיות של המעבד – פקודות מכונה – exchange – XCHG compare and swap – CAS test and set – TAS סמפורים באמצעות ה TASניתן למשש סמפורים – מנגנון לתאום בין תהליכים ובין תתי תהליכים .מאפשר לכך שרק (תת) תהליך אחד יריץ אץ הקטע הקריטי של הקוד .תור הממתינים מנוהל ב. FIFO המנגנון מורכב מ – מונה ,signal , wait ,פקודות נוספות לאתחול וכו' .חוסך – busy waitמצב בו מתבצעות דגימות מרובות לבדיקת זמינות המעבד .חוסך על ידי הכנסת תהליכים למצב .sleep !*כשיש יותר מסמפור אחד צריך להי זהר ממצב של חבק – מעגליות בין הסמפורים השונים תיצור חבק. * כאשר רוצים לנהל מבנה זיכרון משותף בין תהליכים ניתן ליצור structחדש שבנוסף למאפיינים הרגילים שומר סמפור עצמי שמאפשר בכל פעם רק לתהליך אחד לגשת לזיכרון של האובייקט. ישנה טבלה של סמפורים ששומרת את -מצב הסמפור (בשימוש /לא) ,המונה המשויך לסמפור ,מצביעים לתור הממתינים של הסמפור. פקודת ה waitמורידה את ערך המונה באחד – אם ערך המונה שלילי התהליך נכנס למצב WAITעד שיתאפשר לו להיכנס למעבד-( .מונה חיובי :מספר המשאבים הפנויים .מונה שלילי : מספר ממתינים ).מכניסה לרשומת התהליך את מזהה הסמפור. פקודת ה signalמעלה את המונה באחד .אם לפני ההוספה המונה היה שלילי (תור הממתינים אינו ריק) מוציאה את הראשון בתור ,ומכניסה אותו לתור ה( .readyיש גם signal_nשקולה לביצוע n signalפעמים אך יעיל יותר) .פעולת s_createיוצאת סמפור ומאתחלת את ערך המונה .המערכת קובעת את המספר המזהה של כל סמפור .פעולת s_deleteבודקת שהסמפור חוקי ואינו משוחרר .מעבירה את כל התהליכים בתור הממתינים לתור ה. readyמסמנת בטבלת הסמפורים שהסמפור משוחרר .פעולת s_resetמעדכנת את המונה לערך חיובי (שקולה ל deleteוcreate אך יעילה יותר) .מעבירה את כל התהליכים מתור הממתינים לתור ה( .readyלא ניתן לעדכן לערך שלילי – אמור לשקף את מספר התהליכים בתור הממתינים) . העברת הודעות בין תהליכים מאפשר העברת מידע בין תהליכים ,הפצת מידע ברשת מחשבים ,תאום בין תהליכים. אופני שליחת הודעה – • מתהליך לתהליך – Unicast • מתהליך לקבוצה – Multicast • מתהליך לכולם – Broadcast • מתהליך לתיבת דואר – Mailbox אופנים לקבלת הודעות – • מתהליך מסוים one-to-one : • מתהליך כלשהו any-to-one : • מתהליך כלשהו לקבוצה any-to-any : *אם תהליך שולח הודעה לתהליך אחר יש צורך לדעת את המציין של המקבל. גישות סנכרון בין משלוח וקבלה • גישה סינכרונית – השולח ממתין עד שהמקבל קורא את ההודעה. המקבל ממתין עד למשלוח הודעה (עדיין לא נשלחה). • גישה אסינכרונית – השולח לא ממתין עד לקריאת ההודעה ע"י המקבל. המקבל בודק אם קיימות עבורו הודעות וממשיך בתהליכו ללא המתנה. גישות מעורבות - *שולח סינכרוני ומקבל אסינכרוני. *שולח אסינכרוני ומקבל סינכרוני (שולח לא ממתין ,מקבל ממתין – בשימוש רב) בגרסה זו ניתן להעתיק את ההודעה ישירות ללא במתווכים. תיבות דואר – אינה דורשת מהשולח לדעת מיהו התהליך המקבל אלא רק להכיר את תיבת הדואר .את ההודעה יקבל התהליך הראשון שיקרא מהתיבה. באמצעות תיבת הדואר ניתן ליצור מספר תהליכי שירות המקבלים הודעות ,שאינם נדרשים לבחור את המקבל( .דוגמא – ניהול תור למדפסת) שרתים – המשתמש רואה ביצוע סדרתי .המערכת דואגת לביצוע נכון של פעולות. זיכרון וירטואלי יש הפרדה בין הכתובת הוו ירטואלית (שהתהליך מכיר) לבין הכתובת הפיזית בה המידע נשמר. הקצאות זיכרון לוגי(בזמן הידור -משתנים גלובאליים ,או בזמן ריצה – ) new, mallocנעשות ברמת תהליך (אין מודעות לתהליכים אחרים). * נדרש מנגנון תרגום בין וירטואלי לפיזי (טבלאות תרגום) .תמיכה מבחינת החומרה ומערכת ההפעלה. ה MMUמפרש את הכתובת הווירטואלית לכתובת פיזית**( .טבלת דפים=טבלת תרגום) *הפרדה זו עולה בזמן – גישה כפולה לזיכרון (לטבלת תרגום ולהבאת הערך) * לכל תהליך טבלת דפים משלו – בזמן החלפת הקשר טבלת הדפים של התהליך עולה למקום מוגדר בזיכרון. *עמוד (לוגי) מועתק למסגרת (פיזי) כאשר התוכן אינו משתנה – ה offsetשל התוכן הפנימי של העמוד נשאר זהה. *טבלת הדפים יכולה להכיל רשומות ריקות (חורים בזיכרון הווירטואלי) – ניתן לתקן על ידי היררכית של טבלאות דפים * .מ"ה שומרת טבלת מסגרות בה מפרטת לכל מסגרת האם מוקצית (למי) או פנויה. אם המסגרת בדיסק ולא ב – RAMנוצרת פסיקה page faultומ"ה – מעבירה את התהליך למצב המתנה (בשל אריכות ההחלפה) ,ואז מבצעת paging( swappingדפדוף בין דפים) ( swap-outמוציא מסגרת מ RAMלפי ,LRUו swap-inמכניס מסגרת חלופית ל )RAMומעדכנת ,valid-bitולבסוף מחזירה את התהליך למצב ריצה( .בזמן הוצאת המסגרת לדיסק ,הזיכרון הפיזי אבד ,והערכים שהיו ב cacheהופכים ל.)invalid ) – Translation Lookaside Buffer (TLBמשמש כזיכרון מטמון לתרגומים .בגלל הגישה הכפולה לזיכרון נרצה לשמור את הכתובות בטבלת התרגום שבהן משתמשים הרבה (לצמצום התקורה) ועל כן נחזיק cacheשבו ישמרו הכתובות השימושיות יותר( .כאשר מתבצעת החלפת הקשר ה TLBיימחק – בגלל שלכל תהליך טבלת תרגום שונה). * תקורה של זיכרון מדומה .כאשר מביאים דפים מהדיסק מביאים זמן גישה לזיכרון – מחושב ע"י– מפנים מקום לפי ה ,LRUמנסים לשמור על working setקטן. מספר דפים שקרובים זה לזה, יתרונות לזיכרון וירטואלי – מפשט את ניהול הזיכרון (תהליך לא יכול לכתוב על זיכרון של תהליך אחר) ,משלב את הדיסק כהרחבה של הזיכרון הראשי (מהווה זיכרון מטמון לדיסק – זמן גישה לדיסק גדול פי )1000עובד בשיטת .write-backכל תהליך יכול להשתמש במרחב כתובות רציפות של עד ( 4GBב 32סיביות). הקצאת זיכרון דינאמי – Mallocבודקת האם נשאר בלוק בגודל הרצוי ,אם אין מבקש דף חדש (מבקש מסגרת חדשה פנויה) .הערך שנמצא בזיכרון שהוקנה לנו הוא שרירותיint *ip = (int*) . ))malloc(100*sizeof(int – Callocכמו mallocרק שמאפס את ערכי הזיכרון לפני שמחזיר אותו לשימושint *ip = (int*) calloc(100, sizeof(int)) . – Reallocמנסה להקנות זיכרון נוסף לזיכרון שכבר הוקנה .אם קטן יותר משחרר חלק מהזיכרון (מאפשר להקצאות חדשות שם) ואם גדול יותר מחפש מקום ואם אין מקצה זיכרון חדש ומעתיק את התוכן הקיים לשם*ip = realloc(void * ptr, new size) . – Heapכאשר מתבצעות הקצאות דינאמיות במהלך ריצה ,הם נכתבות בתחתית הזיכרון ,כאשר המחסנית נכתבת מלמעלה. * - stack overflowכאשר יש מצב בו מגיעים להתנגשות בין המיקום כתיבה של המחסנית לבין מיקום הכתיבה של ההקצאות הדינאמיות. * mallocמחזיקה רשימה מקושרת של השטחים הפנויים בזיכרון (שנקראת – memlistלכל מקום פנוי הרשימה מחזיקה את גדול השטח, ומצביע לשטח הפנוי הבא. *לא יופיעו ברשימה שני שטחים פנויים רצופים (יאוחדו לאחד) .כתובות ואורכים הם בכפולות של .8 שיטות הקצאה • :First-fitהשטח הפנוי המתאים הראשון שנמצא ברשימה. • : Next-fitהשטח הפנוי הבא (מתחילים את הסריקה מהמקום האחרון שהוקצה) • :Best-fitהשטח הפנוי הקטן ביותר האפשרי. • :Worst-fitהשטח הפנוי הגדול ביותר. שחרור שטחי זיכרון – צריך לאחד אותו עם שטחים פנויים צמודים כדי ליצור את השטח הפנוי הגדול ביותר שניתן לקבל (אין ברשימה שני שטחים פנויים צמודים). שברור של הזיכרון (– )fragmentation שברור פנימי – שטחי זיכרון מוקצים שאין בהם שימוש על ידי התהליך הנוכחי. שברור חיצוני – שטחי זיכרון לא מוקצים ,אך קטנים מידי להקצאה( .בדיסק יש בעיה דומה אך שם יש גם הקצאה לא רציפה). !* כך נוצרת בעיה שלא ניתן לבצע הקצאה גדולה למרות שסכום השטחים מספיק. פתרונות - הידוק זיכרון ( – )compactionפתרון אפשרי לשברור חיצוני – פעם בכמה זמן או לפי דרישה ניתן "לאגד" את כל הזיכרון כך שיישאר יותר זיכרון רציף .הידוק דורש עדכון מצביעים לכתובות החדשות( .פתרון אפשרי -אם ל mallocאין זיכרון רציף להחזיר ,מבצעים הידוק). ** הידוק בדרכ מתייחס לזיכרון ,אבל יכול להתייחס גם לדיסק. איחוי ( – )defragmentationבדרכ מתייחס לפעולות על הדיסק ,פעולה שמסדרת מחדש את 'שברי' הקבצים כדי שיהיו רציפים( .לא בהכרח יזיז קבצים שלמים על מנת ליצור שטח פנוי גדול). *בקבצים ,לא כמו ב mallocאין חובת רציפות ,ולכן דה -פרגמנטציה נחוצה רק בשביל להאיץ את הסריקה שלהם. – Garbage collectionאיסוף של בלוקים מה heapשהוקצו אך אינם בשימוש. ניתן לדעת לאיזה בלוק קיים מצביע .הנחות על המצביעים – ניתן לזהות אותם ,מצביעים לתחילה של בלוק ,לא מבצעים החבאה (המרה). • – Mark and sweep collectionלא מזיז בלוקים ,אלא אם מבצעים הידוק. מסמנים את כל הבלוקים בסיבית סימון האם הם ישיגים או לא ,ואז מבצעים מעבר על כל הבלוקים ומוחקים את אלה הלא ישיגים. אלגוריתם שמרני – יכול להסתכל על מספר שלם ככתובת ,אין פגיעה בנכונות רק ביעילות. • – Reference countingלא מזיז בלוקים. • – Copying collectionמזיז בלוקים. שגיאות אופייניות הקשורות לזיכרון • – Dereferencing and bad pointersבעיה נפוצה בשימוש ב scanfכאשר מכניסים ערך למשתנה במקום לכתובת של המשתנה. • – Reading uninitialized memoryהנחה שגויה שהזיכרון שהוקצה מה heapמאותחל ל.0 • – Portabilityהקצאה לפי גודל לא נכון malloc( .מקבל כפרמטר גם את הגודל של סוג הזיכרון ) השמה של קלט באורך לא מתאים .קיימת פונקציה שבודקת את תקינות אורך הקלטfgets(char *str, int max_length, FILE *stream) . • אריתמטיקה שגויה של מצביעים – לדוגמא לקדם את המצביע של intב 4במקום לאיבר הבא. • – Referencing nonexistent variablesלדוגמא משתנים מקומיים של פונקציה נעלמים בעת היציאה מהפונקציה. • – Freeing blocks multiple timesשחרור זיכרון יותר מפעם אחת. • – Referencing freed blocksכאשר משתמשים במידע שנמצא בזיכרון ששוחרר. • – Failing to free blocksשחרור חלקי של מבנה הנתונים. גודל דף הוא 0x1000( 4KB בתים) זיכרון משותף – כאשר שני תהליכים ניגשים לכתובות שונות וירטואליות ,אשר מתורגמות לאותה כתובת פיזית. דפדוף – כאשר הכתובת הייעודית אינה ואלידית ,ולוקחים אותה מהדיסק. כינויים ( – )aliasingתהליך אחד כותב לכתובת פיזית מסוימת ,ותהליך אחר קורא ממנה. Exceptions & interrupts - Control flowמהדלקה לכיבוי ה CPUמבצע במחזוריות – קריאה של פקודה ,פירושה וביצועה. – Exceptional Control flow • ברמה נמוכה – חריגות /פסיקות (שינוי סדר הפעולות כתגובה לאירוע כלשהו) ,שינוי של חומרה עם תוכנה. • הרמה גבוהה – החלפת הקשר ,אותות ( , )signalפעולות נוספות. חריגות – חריגה היא העברת השליטה למ"ה כתגובה לאירוע כלשהו. וקטורים של פסיקות – לכל סוג אירוע יש מספר חריגה אופייני ,מהווה אינדקס ל.jump table כניסה לפי אינדקס שגיאה :מצביעה על הפונקציה המיועדת להתמודד עם אותה שגיאה)handler( . *חריגות אסינכרוניות – נגרם על ידי אירועים חיצוניים למעבד (כלומר יכול להגיע בכל זמן שהוא) אחרי הפעלת הפונקציה המטפלת חוזרים לפקודה הבאה. *חריגות סינכרוניות – נוצר כתוצאה מהפעלת פקודה : • מלכודות – מכוון ,breakpoints ,לאחר הטיפול מחזירה שליטה לפקודה הבאה. *דוגמה – פתיחת קובץ ,המערכת חייבת למצוא או לקרוא לקובץ ולהגדיר קריאה/כתיבה. • – Faultsלא מכוון ,אבל ייתכן שניתן לתיקון ,page faults ,אם ניתן לתקן חוזרים לפקודה ,אם לא מפסיקים את התכנית. המעבד מאפשר למ"ה לתת הוראות " הזדמנות שנייה" לביצוע פעולות מסוימות. *דוגמה – גישה לזיכרון (המשתמש כותב למקום בזיכרון אך הדף הרלוונטי נמצא בדיסק .כאשר הוא מועלה לזיכרון זה בעצם "הזדמנות שנייה" לביצוע הפעולה – ).הצלחנו לתקן *דוגמה – גישה לזיכרון – המשתמש כותב למקום לא חוקי בזיכרון ,התהליך יוצא עם שגיאה – .לא הצלחנו לתקן. • – Abortsלא מכוון ולא ניתן לתיקון , parity error,machine check ,מפסיק את התכנית. *אחרי כל סיום ביצוע פקודה ,נבדק האם יש חריגה ממתינה (חלק ממחזור הפקודה) שני סוגי פסיקות – nonmaskableשמור עבור מאורעות דחופים כמו חריגות מזיכרון מסונכרנות maskable ,ניתן לכיבוי ע"י המעבד למשל לפני ביצוע סידרת פקודות קריטיות. אותות –אירועי תוכנה ,נשלחים על ידי תהליכים ומ"ה לתהליך אחר .לכל אות יש מספר ייחודי (ללא אינפורמציה נוספת). טיפול באותות – לכל אות יש טיפול ברירת מחדל (לדוגמה -לסיים תהליך) ,ניתן לשנות אותו על ידי : ) – Signal(sig, handlerמודיע למ"ה שכעת סיגנל מסוג sigיפעיל פונקציית handlerובסיומה יחזור לנקודה בה קרה האות. אין תור של אותות – לכל סוג של אות יש סיבית שאורמת האם האות קרה או לא (גם אם מספר תהליכים שלחו אותו). שגרת טיפול בפסיקה – קורה בזמן שהתהליך רץ אבל אינו בהכרח קשור לתהליך .קוד הטיפול בפסיקה שייך ל kernelולא לתהליך .לא מתב צעת החלפת תהליכים כדי לטפל בפסיקות (קוד טיפול בפסיקה לא מתייחס לתהליך נוכחי אלא למבנה נתונים גלובליים של מערכת) מודל שרת-לקוח מודל השכבות – פרוטוקול תקשורת מאפשר העברת נתונים ברשת ,ופועל בשכבות שונות כאשר לכל שכבה תפקיד משלה. כל שכבה מקבלת שירותים מהשכבה מתחתיה ,מספקת שירותים לשכבה מעליה ו"מדברת" עם השכבה ה מקבילה במחשב השני או מחשבי הביניים. – Data Linkמעבירה חבילה מהתחנה לתחנה שכנה באותה רשת .מטפלת בכל הפרטים הקשורים בחומרה ובמנשק עם הרשת הפיזית .תלוי חומרה של הרשת הפיזית. – Internetאחראית על ניתוב חבילות מתחנת המקור לתחנת היעד .פרוטוקול בשם IPמנתב חבילות בין רשתות שונות באמצעות .giveawayלא מבטיח שהחבילה תגיע ליעדה .כל חבילה מנותבת ללא קשר לניתוב החבילות האחרות. *תקשורת בין מחשבים. כתובת – IPמספר ייחודי המזהה כל מנשק תקשורת המחובר לרשת .כתובת בגודל 32סיביות (כיום 4 .)128מספרים עשרוניים .הניתוב מתבסס על IPשל החבילה ועל טבלאות ניתוב מיוחדות הקיימות בכל ( routerמחשב דרכו עוברות חבילות שלא למחשב עצמו)Ipconfig . – Transportמאפשרת תקשורת בין תהליכים )Transport Connection Protocol( TCP .יוצר sessionבין שני תהליכים ומבטיח – סדר (החבילות יגיעו באותו סדר שנשלחו), אמינות (כל החבילות יגעו ליעדן – אם חבילה הלכה לאיבוד היא תשלח מחדש). )User Datagram Protocol( UDPמעביר הודעה בודדת בין שני תהליכים ,מבלי להבטיח סדר או אמינות. – Applicationמכילה פרוטוקולים של אפליקציות ( )httpאשר משתמשות בפרוטוקולי transportלתקשורת עם מחשבים מרוחקים. מודל שרת לקוח – – Socket.מנשק תכנות ( ) APIלשליחת הודעות בין תהליכים על מחשבים שונים דרך האינטרנט .לכל socketמשויך – כתובת IPו( portזיהוי התהליך עשוי להריץ מספר תהליכים המתקשרים דרך ברשתport number( . המתקבל – מחשב קצה 16סיביות) פורטים שניתן להבדילם לפי מספר מזהה** .לאפליקציות פופולריות **בשרת ישנם מספר יש מספר פורט ידוע .לשרת יש מספר פורט ידוע ,בעוד שללקוח יש מספר פורט זמני ( )65535 – 1024חלוקת עבודה – הרשת מעבירה את ההודעה למחשב היעד 0על סמך כתובת )IPמערכת ההפעלה – מעבירה את המידע ל socketעל סמך פרוטוקול ומספר סוקט .האפליקציה – קוראת מידע מה socketומטפלת בו. מבנה לקוח טיפוסי – הכנה לתקשורת (יצירת ,socketמציאת כתובת השרת ומספר פורט ,אתחול תקשורת לשרת) ,החלפת מידע עם השרת (כתוב מידע ל ,socketקרא מידע מה ,socketטפל במידע למשל להציג דף) ,סגור את ה.socket שרתים אינם לקוחות – פאסיביים לתקשורת ,שומעים מכמה לקוחות (תור) ,יצירת socketלכל לקוח (בקשה מלקוח חדש socket חדש .מבנה שרת טיפוסי -הכנה לתקשורת (יצרית ,socketקשר כתובת עצמית ומספר פורט עם ה .)socketהמתן לשמוע מלקוח (ציין כמה יש בתור) ,מקבל בקשת התקשרות מלקוח ויוצר socketייעוד ,החלפת מידע עם הלקוח על ה socketהחדש (קורא מידע מה ,socketמטפל בבקשה – למשל הבאת קובץ ,כותב מידע לsocket סוגר את ה .socketטיפול בבקשות – טיפול סידרתי לא יעיל ,יוצר המתנה בתור .לכן השרת עובד על כמה בקשות במקביל – קצת על כל משימה ,פירוק למשימות קטנות, יצירת תהליך לטיפול ,שימוש בתתי תהליכים Berkley socket.ספריות סטנדרטיות לשליחת הודעות בין מחשבים פונקציות מרכזיות – socketיוצר סוקט חדש. – connectצד לקוח ,מקצה מס' פורט פנוי לסוקט. – Acceptצד שרת ,מקבל בקשת התחברות מלקוח ,יוצר סוקט מתאים. – Closeמשחרר הקצאה לסוקט – recvfrom ,sendto ,recv ,Sendמידע לסוקט וממנו