19-07-2017, 22:27
|
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
|
|
חבר מתאריך: 25.10.01
הודעות: 42,775
|
|
כשאתה קורא לפונקציה שפעילותה מבוססת על זמינות של משאב מסויים, כגון מידע זמין מערוץ תקשורת, פתיחה של ערוץ תקשורת, קיום של קובץ, או שמטרתה להמתין לכך שיקרה דבר כלשהו, נניח שתגיע שעה מסויימת, וכיוצ"ב, יש בעצם שלוש דרכים לממש את פעילות הפונקציה:
1. או שהפונקציה תמתין עד שהמאורע או התנאי המבוקש יתקיים - מה שאומר שייתכן ותהיה המתנה ללא הגבלה (כלומר, אם האירוע לא מתרחש לעולם, התוכנה תהיה תקועה לעולם), או
2. המתנה עם הגבלה כלשהי (כלומר, אם האירוע הרצוי לא יתרחש אבל לדוגמא יפקע טיימר מסויים, שזה בעצם מימוש של timeout - אז בסוף הפונקציה תחזור והתוכנה תמשיך להתבצע אפילו שהמאורע לא קרה - אבל היא תחזור עם שגיאה), או
3. אם הרצוי לא "ממתין" לכך שהפונקציה שנקראה "תשתמש" בו, הפונקציה חוזרת מיד, ללא המתנה, ומדווחת בעצם שהמאורע הרצוי לא התרחש (למשל - לא היה מידע לקריאה מה socket) - ובעצם היא מעבירה את הנטל לדגום שוב ושוב את המשאב לתוכנה שקוראת לפונקציה, כלומר אלייך.
מדוע קיימות שלושת השיטות?
שיטה #1 - אם נניח מה שאתה רוצה זה לקלוט קלט מהמשתמש, בד"כ אתה תהיה מעוניין להמתין לכך ללא הגבלת זמן. המשתמש יכול לקחת את הזמן שלו ולהקליד משהו בתוכנה שלך. אם הוא ירצה לצאת מהמצב הזה, הוא יוכל לשלוח לתוכנה סיגנל, למשל SIGINT (שאולי אתה מכיר כ"קונטרול + C"), ואז היא יכולה לטפל בזה כדי לצאת, אבל אחרת, היא תמתין ללא הגבלה.
שיטה #2 - אם נניח שהתוכנה מנסה ליצור קשר עם מחשב אחר - וזו מטרתה היחידה - כלומר אין לה משימה אחרת לבצע באותו זמן. במקרה זה, אפשר פשוט לתת לה לחכות וזה גם הכי יעיל (יחסית לדגימה החוזרת בשיטה #3). לעתים יש משימות אחרות לביצוע (תוכנה שעוסקת בהרבה דברים "בו זמנית") ואז אפשר לפתור את זה בשתי דרכים - או ללכת על שיטה #3, או לחלופין, לאפשר לתוכנה לבצע כמה פעולות בו זמנית על ידי הפרדתה למספר תהליכים או threads.
שיטה #3 - שבה נניח רוצים לעשות פעולות אחרות אם הפעולה המבוקשת עדיין לא אפשרית - למשל לעדכן את המסך לגבי הסטטוס בתדירות גבוהה, וכו', כדי להעביר חיווי על הפעולה המבוקשת. פעולה זו יכולה להיות יקרה מאוד בהתאם לתדירות הדגימה - היא בעצם דורשת מהתוכנה שלך "לעבוד" כל הזמן בשביל משהו שבעצם לא קורה - וככל שההמתנה בין הדגימות קצרה יותר - היא תעמיס יותר ויותר על המחשב, עד 100% ממשאבי ליבת המעבד שעליה היא רצה, כי זה בעצם סוג של לולאה אינסופית (אא"כ כמובן התנאי מתקיים בסוף ואז זו לולאה עם תנאי יציאה)
השיטות #1 ו #2 הן מה שנקרא שיטות blocking - התוכנה עוצרת את פעילותה עד שקורה משהו או עד שמגיע אירוע מסויים כגון שעבר זמן המתנה שנקבע מראש.
השיטה #3 היא "non blocking" או "asynchronous".
מקווה שהצלחתי להעלות על הכתב נכון את מה שאני מבין בראש :-)
|