מושגים - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

מושגים


ה*לה

Recommended Posts

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

בקוד משתמשים בסמפורים לרוב בשביל שתי שימושים, אחד הוא ה mutex שזה mutual exclusion (מתחיל מלא) שמשמש למנוע הרצה של חתיחת קוד בו זמנית כמו למשל להדפיס למדפסת (אם process אחר יבוא וידפיס בזמן שאתה מדפיס יצא מהמדפסת זבל) . הsignal הוא לרוב סמפור ריק שמחכים שיתמלא והוא משמש לסינכרון בין process אחד לשני.

קישור לתוכן
שתף באתרים אחרים

סמאפור בינארי מתנהג כמו מיוטקס.

הסמפורים מאפשרים לך לסנכרן בין תהליכים או תראדים בעלי משותף(שמכיל את ערך הסמפור). יש המון בעיות שדורשות פתרון ע"י סמפורים או מיוטקסים.

דוגמא פשוטה לצורך במיוטקס הוא המקרה הבא:


code()
{
create data
n<-get next record number to insert in db
insert data into db in rec n

}

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

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

אם זה באמת מעניין אותך, תיקח קורס בשם "מערכות הפעלה" באוניברסיטה\מכללה הקרובה לביתך. זה בערך רבע מהקורס.

קישור לתוכן
שתף באתרים אחרים

בסמפור בינארי- יש מצב 0 ו1 (תפוס או לא)

השאלה שלי: כל אחד יכול לשנות את המצב (גם מי שלא תפס את האוביקט המשותף?)

אם לא- לא הבנתי, אם כן- מה הקטע?

בסמפור מונה- מה אנחנו סופרים? את מספר הנגשים לאוביקט המשותף?

מוניטור נמצא במיוטקס?

קישור לתוכן
שתף באתרים אחרים

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

(כלומר כל אחד יכול לשנות את האובייקט ממצב לא תפוס למצב תפוס, אבל רק מי שהאובייקט אצלו יכול לשחרר ממצב תפוס למצב לא תפוס)

בסמפור מונה - בדיוק. סמפור בינארי הוא מקרה פרטי של סמפור מונה, כאשר מספר הניגשים לאובייקט הוא 1. המטרה של סמפור מונה היא לגרום לכך שמספר הניגשים לאובייקט מסויים מוגבל, בד"כ כדי למנוע עומס.

קישור לתוכן
שתף באתרים אחרים

אם לדוגמא יכולים 3 לגשת לאובייקט, ואחד רביעי רוצה לגשת אליו- הא מחכה בתור??

כן. ברגע שאחת הגישות לאובייקט תסתיים, הרביעי יוכל לגשת ולתפוס את המקום שלו.

מוניטור זה פשוט מנגנון מסוים למימוש Mutex.

קישור לתוכן
שתף באתרים אחרים

זה לא סותר את עקרון הבלעדיות, כי הוא לא מסתמך עליו.

קחי דוגמה - נניח שיש פונקציה מורכבת שאת יודעת שדורשת הרבה . היא דורשת כל כך הרבה , כך שאת לא רוצה שהיא תרוץ יותר מ-5 פעמים במקביל. אז מה תעשי? תיצרי סמפור מונה בגודל 5 ותגרמי לכך שהגישה לפונקציה תהיה תלויה בסמפור. זה יגרום לזה שלכל היותר, רק 5 אובייקטים יוכלו להריץ את הפונקציה בו זמנית. אם אובייקט שישי ינסה, אז הוא יאלץ לחכות שאחד האובייקטים יסיים את השימוש שלו בפונקציה.

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

נניח גם לצורך העניין שיש רק לכל היותר 10 אובייקטים שמנסים לגשת לאובייקט הזה בו זמנית.

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...