שאלות הזויות שנשאלתי לאחרונה

הולכת צולעת עם נעל אחת...

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

user32

Well-known member
מנהל
אז הרי לך עוד שאלה

זה משהו שבטח היית שמח אם היו שואלים אותך: מה ההבדל בין Mutex לSemaphore? למי שתהה איך השאלה השתרבבה לראיון בג'אווה אז במקור זה היה: איך ממומש הסינכרון בג'אווה? ולמי שמתכוון לענות "סמפור מאפשר לכמה נימים לרוץ ביחד" זו לא תשובה מספקת כי אז כמובן שואלים אז מה ההבדל בין סמפור בינארי לMutex? בקיצור, מי שמכיר בג'אווה wait-notify אמור לדעת שsynchronize צריך להיות ממומש באמצעות סמפור.
 

zalomon

New member
אבל אפשר מצד שני לטעון

שאפשר לממש סמפור בעזרת mutex... אז אין כל כך משמעות למשפט האחרון...
 

guyadini

New member
אז מה ההבדל בין סמפור בינארי למיוטקס?

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

drivera

New member
ההבדל הוא ב-ownership

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

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

user32

Well-known member
מנהל
עד כמה שאני יודע

סמאפור ניתן "לפתוח" מבחוץ. הבעלות על הMutex היא אך ורק על ידי הthread הנועל ואי אפשר לשחרר אותו מthread אחר. בג'אווה כשעושים synchronize אפשר לשחרר את הנעילה בזמן שהthread הנועל מחכה בwait על ידי thread אחר ולכן אני מניח שהתשובה צריכה להיות שזה ממומש באמצעות סמפור. מודה שאני לא חזק בענייני מערכות הפעלה.
 

user32

Well-known member
מנהל
איפה ויני, דסלוק וצ'ו כשצריכים אותם?

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

user32

Well-known member
מנהל
השאלה היתה ההבדל בין מיוטקס לסמפור בינארי

 
באיזו מערכת הפעלה? אתה רוצה תשובה על ווינדוס, על VxWorks, או על MQX (מערכות הפעלה לסביבות RT)? המושגים "מיוטקס" ו"סמפור" אינם יצוקים בבטון וההגדרה שלהם משתנה בהתאם לסביבה. אני משער שבג'אווה, כדי להשיג התנהגות אחידה של המושג synchronized, על ה JVM להיות ממומש באופן שונה בכל מערכת הפעלה, כדי לבחור את האובייקט המתאים שמממש את ההתנהגות הרצויה.
 

zalomon

New member
זה עניין של מימוש בלבד

בלינוקס ההחלטה היא שלמיוטקס יש בעלות ולסמפור לא. יכלו גם לממש את זה אחרת. אין קשר למימוש הפנימי של JAVA. כשמישהו תופס synchronized אף אחד אחר לא יכול לשחרר את הנעילה שלו. כשמישהו נכנס ל-wait אזי הוא מוותר באופן זמני, מרצונו, על הנעילה. אבל זה לא שמישהו אחר לוקח לו אותה. כשזה שנכנס ל-wait רוצה להתעורר, הוא נאלץ להתמודד על הזכות לקבל את הנעילה כמו כולם, והעובדה שהוא החזיק אותה קודם לא נותנת לו יתרון. גם הוא לא יכול לחטוף את המנעול מאף אחד אחר. את כל מה שתיארתי לעיל אפשר לממש גם במיוטקס וגם בסמפור, ולמעשה כל השלושה שקולים. אפשר לעשות רדוקציה מאחד לשני לשלישי ובחזרה. ובכל מקרה -- את כל מה שתיארתי בחרו לעשות כך כי כך בחרו לעשות. יכלו לבחור לממש זאת אחרת. במימושים הגדולים -- של סאן ושל IBM, אמנם אין עדיפות עקרונית לאף אחד מהמתחרים על נעילה, אך במימוש מי שבא קודם הוא גם זה שיקבל קודם. אבל זה לא ב-spec. יכלו המהנדסים לבנות מערכת שונה, שבה יש קדימויות ודרגות, ויכול מישהו מדרגה גבוהה לחטוף נעילה ממישהו ברמה נמוכה. רק עניין של בחירה -- וזה לא קשור במישרין דווקא למיוטקס או דווקא לסמפור.
 

choo

Active member
יש רק דרך אחת לדעת - לראות מה רשום ב-spec

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

user32

Well-known member
מנהל
היתה פה אי הבנה

בג'אווה אין סמפור ולא מיוטקס. יש קוד מסונכרן עם מילת מפתח בשם synchronize. זהו. השאלה ששאלו היתה מה המימוש מאחורי הקלעים (כלומר בC++ שבו כתבו את הJVM)? והבוחנים שהם כאמור אנשי C שאלו במה המפתחים של הJVM השתמשו ומה באופן כללי ההבדל בין סמפור למיוטקס אם יש הבדל כזה בכלל (סמפור שמאפשר רק thread אחד כל פעם, יענו בינארי). הם אהבו לשאול עוד שאלות כאלה בראיון ולגלגל עיניים בסגנון של "אויש המתכנתי ג'אווה האלה לא יודעים איך עובד מחשב...".
 

choo

Active member
אם כך - התשובה של דסלוק היא התשובה הנכונה

שההבדל בין השניים הוא תלוי הגדרה ותלוי סביבה. יותר מזה - יש הגדרה של מיוטקס שפועל בין תהליכים (זו הרחבה של posix). ומצד שני - יש יותר מסוג אחד של סמפורים עם מימושים שונים באותה מערכת הפעלה (למשל בלינוקס - SystemV semaphores לעומת posix semaphores). ולגבי מה בחרו מפתחי ה-jvm - אני מניח שזה משתנה בין מימוש אחד לשני, ובין פורט של אותו המימוש על מערכות הפעלה שונות. כל נסיון לתת תשובה מוחלטת על שאלה כזו [מצידך או מצד המראיינים] מעיד על בורות, או שטחיות, או עצלנות ;) במובן הזה, השאלה הזו כלל לא מעניינת - שאלה טכנית-גרידא אודות "כיצד דברים פועלים", שהתשובה עליה היא "תלוי" - היא התפלספות גרידא - ולהתפלסף אתה יודע לפחות כמוני ;)
 
למעלה