נתון:
1. RAM עם 64 entries כל אחד בגודל 4byte
2. רגיסטר של 32bit לשימוש עזר
צריך לממש את הפונקציות הבא הנותן ללקוח יכולת לבצע הקצאה ושחרור של זיכרון מהRAM:
1. init- פונקציה שנקראת בתחילת העולם
2. alloc(entry_num) - הקצאת entry מסויים (יש להחזיר שגיאה אם הentry כבר מוקצה)
3. free(entry_num) - שחרור entry אחד שנמצא באינקס מסויים (יש להחזיר שגיאה אם הentry לא מוקצה)
תשובות
הוסף תשובה
|
לצפיה בתשובות
אוקטובר 2017
init- צריך לבחור entry אקראי (נניח הראשון) שיהיה bitmap של הentries שמוקצים בכל שלב. האינדקס של הentry הזה ישמר ברגיסטר העזר. לצורך העניין נקרא לו "entry X"
alloc- ע"י ערכו של entry X, הפונקציה תבדוק אם האינדקס המבוקש לא מוקצה. אם כן- תעדכן את entry X בהתאם. אם לא- תחזיר שגיאה.
במידה והאינדקס המבוקש הוא האינדקס של entry X אז יש לבחור אינדקס של entry פנוי אחר ולעדכן את הentry החדש ואת רגיסטר העזר בהתאם.
במידה וכל הentries מוקצים- יש לשים ברגיסטר העזר ערך מיוחד (נניח 0xffffffff) שמסמל שכל הentries תפוסים
free- ע"י ערכו של entry X, הפונקציה תבדוק אם האינדקס המבוקש מוקצה. אם כן- תעדכן את entry X בהתאם. אם לא- תחזיר שגיאה.
במידה והערך של רגיסטר העזר הוא 0xffffffff אז הentry המבוקש ישוחרר והוא יהפוך להיות entry X (וערכו רגיסטר העזר יעודכן בהתאם להיות אותו אינדקס)
ינואר 2018
תשובה יפה אבל לא הבנתי איך כניסה אחת (4 בתים, כלומר 32 ביט) יכולה להיות bitmap ל64 כניסות..
פברואר 2018
נראה לי שצריך להשתמש ברגיסטר הנוסף כעוד BITMAP וככה יש מקום ל 64 כניסות
יולי 2018
הפתרון הנכון היעיל:
לנצל את התאים הפנויים בזכרון כדי לממש רשימה מקושרת. כל תא ריק מצביע על הבא בתור.
הרגיסטר הנוסף יצביע על ראש הרשימה.
בעת הקצאה: מוציאים את האיבר שבראש הרשימה
בעת שחרור: מכניסים לראש הרשימה
1. לממש פונקציה שמקבלת מספר דצימלי ומחזירה מספר עם ספרות בסדר הפוך
2. להוסיף 1 למספר המיוצג ברשימה מקושרת (כל node זה ספרה) כאשר ראש הרשימה מצביע לספרה הכי משמעותית
3. בעיין היצרן-צרכן עם רשימה מקושרת. לממש את היצרן והצרכן. ותת-שאלה איך אפשר לפתור בלי סמפורים
תשובות
הוסף תשובה
|
לצפיה בתשובות
נובמבר 2017
int reverse(int num) {
char c_num[32];
snprintf(c_num,32,"%d",num);
int len = strlen(c_num);
for (int i = 0; i < strlen(c_num)/2; i++) {
// 100
char t = c_num[i];
c_num[i] = c_num[--len];
c_num[len] = t;
}
return atoi(c_num);
}
פברואר 2018
int num = 12345;
int newNum=0;
int div;
while(num){
newNum *= 10;
newNum += num%10;
num/= 10;
}
חברה אמריקנית רב-לאומית, ממציאת תחום כרטיסי זיכרון הבזק, שמתכננת, מייצרת ומשווקת כרטיסים אלו למגוון רחב של התקנים. חברת אם סיסטמס ממציאת הדיסק און קי, התמזגה לתוכה בסוף 2006