windows threads

Rשף

New member
windows threads

כתבתי תוכנה שמממשת פרוטוקול כלשהו. התוכנה משתשמת ב threads-ים כדי לממש פונקציות blocking (בדומה לsocket-ים) וב thread נוסף כדי לשלוח את ההודעות לרשת, מטבע הדברים מתנקזות אליו הרבה הודעות ולכן בעומס גבוה זמני התגובה מתארכים (מוזר כי ה CPU לא מתקרב ל 100%) השאלה- אני רוצה למנוע את העיכוב שהוזכר, אבל העלאת priority לא תעזור כי אז thread אחר יתעכב ולא הרווחנו כלום. עיצות יתקבלו בברכה
 

Fingertip

New member
לא מבין הרבה, אבל...

... למה אתה מופתע שהתהליכון ששולח את ההודעות לרשת עמוס? תגובת הרשת איטית בהרבה מהמעבד שלך. כלומר, יכול להיות שצוואר הבקבוק שלך הוא הרשת (חיבור ה-TCP) ולא התהליכון עצמו. אהד.
 

Rשף

New member
אז ככה

אני ממש לא מופתע, רק רוצה לשפר... אני עובד non-blocking ומתעלם משגיאות מהרשת (חוסר מקום) כך שהרשת עצמה לא מגבילה אותי יותר מדי. אותה תוכנה כאשר השליחה לרשת התבצעה מכל thread בנפרד עבדה טוב יותר.
 

Fingertip

New member
כאן אני כבר ממש לא בטוח, אבל...

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

voguemaster

New member
תשמע

אם יש לך איזשהו queue של מידע שמגיע מכמה threads אל thread אחד והוא זה שאחראי על השליחה ברשת, תחת עומס יווצר תמיד מצב שהוא לא עומד בקצב, אין מה לעשות. זה מודל לא נכון. למה אתה מתכוון שאתה מתעלם משגיאות של הרשת ? וד"א, לעבוד NB זה לא תמיד הכי טוב שאפשר, זה מאוד תלוי...
 

Rשף

New member
זה לא כל כך פשוט

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

voguemaster

New member
תראה

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

Rשף

New member
יכול, אבל זה ידרוש הרבה מקום

ושאלת המשך- האם שימוש ב dual processor יכול לעזור, הפרטים הם: -windows 2000/xp -visual c++ -שני thread-ים ירוצו על מעבד אחד והיתר על האחר (זה אפשרי בכלל ?)
 

אלדד28

New member
הערות.

1. לא תוכל לקבוע במדויק איזה THREAD ירוץ על איזה מעבד. 2. עדיף לעבוד blocking ועם select. 3. כמו שאלי אמר, THREAD בודד שמקבל פניות מ-THREAD-ים נוספים ועושה I/O תמיד יהיה צוואר הבקבוק. זה לא מתבטא ב-CPU כיוון שהבעיה היא בעיית I/O ולא בעיית חישוב.
 
למעלה