PDA

View Full Version : الگوریتمی برای زمانبندی قفلگزاری



FastCode
پنج شنبه 18 مهر 1392, 20:36 عصر
سلام.
دارم روی یک lock manager برای یک transaction manager کار میکنم.
و مساله ای که الان باهاش روبرو هستم اولیوت بندی قفلهاست, هر تراکنش ممکنه چند سری قفل نیاز داشته باشه.که میتونن readonly باشن یا read-write.این قسمتها همه حل شده.چیزی که از صبح ذهنم رو مشغول کرده اینه که با توجه به:
۱.وجود timeout
۲.وجود وابستگی
۳.اطلاع از بزرگی قفل
۴.اطلاع از زمان نسبی بسته بودن قفل
۵.اطلاع از اشیاء قفل شده
چطوری درخواست ها رو طوری زمانبندی کنم که
۱.درخواست های زیادی دچار timeout نشوند.
۲.هزینه زیادی صرف زمانبندی نشود.
۳.درخواستهایی که زودتر آمده اند نسبتا زودتر پاسخ داده بشوند.

لطفا هر نوع کتاب یا مقاله ای که سراغ دارید حتی اگر خودتون مطالعه نکردید رو معرفی کنید.

ممنونم.

مصطفی ساتکی
شنبه 20 مهر 1392, 16:28 عصر
سلام.
به نظرم File Locking Linux یا File locking NTFS رو استفاده کن که جوابشو پس داده و دردسرم هم نکشی بشینی هی باگاشو بگیری بعضی از موارد هم که گفتید رو میشه اون الگوریتم موجود رو سفارشی کرد. این sample (http://www.thegeekstuff.com/2012/04/linux-file-locking-types/)هم شاید کمکتون کنه.

FastCode
شنبه 20 مهر 1392, 17:35 عصر
سلام.
به نظرم File Locking Linux یا File locking NTFS رو استفاده کن که جوابشو پس داده و دردسرم هم نکشی بشینی هی باگاشو بگیری بعضی از موارد هم که گفتید رو میشه اون الگوریتم موجود رو سفارشی کرد. این sample (http://www.thegeekstuff.com/2012/04/linux-file-locking-types/)هم شاید کمکتون کنه.
این قفلها میتونن فقط یک قسمت فایل رو قفل کنند؟
در ضمن اطلاعاتی که قرار هست قفل بشن خیلی زیاد و گسترده هستن و بیشترشون توی ram هستن و ممکنه اصلا در هارد موجود نباشن.
چیزی که فعلا بهش رسیدم اینه:
priority=(log(union)-log(intersect))/elapsed_time
مشکلی که داره اینه که باعث میشه توی تعداد بالا همه ی تراکنش ها دچار تاخیر بشوند و هیچ تراکنشی رو بدون تاخیر رد نمیکنه.

FastCode
شنبه 20 مهر 1392, 21:53 عصر
فعلا کد این شکلیه:
internal float CompareWith(LockGroup lockGroup)
{
float sum=0;
SortedSet<LockState> Except=this.LockStates;
Except.ExceptWith(lockGroup.LockStates);
foreach(LockState ls in Except){
sum+=ls.Size;
}
return sum;
}


float size;
public float Size{
get{
if(size==0)
size=Math.Log(baseDataObjectStateTrackers.Count,2) ;
return size;
}
}

قسمت اول توی کلاس "گروه قفل" ه که لیست قفلهایی رو نگهداری میکنه برای هر تراکنش لازمه.
قسمت دوم توی کلاس "وضعیت قفل" ه که لیست اشیا هر قفل رو نگهداری میکنه و وضعیت قفل بودن فعلیش و اینکه میتونه بدون باز شدن یک گروه دیگه منتقل بشه یا نه.و یک عدد نسبی برای نمایش اندازه.
در کلاس LockManager گروه قفل های در صف با گروه های قفل شده فعلی مقایسه میشن و هر کدوم که به صرفه تر باشن اولویت بیشتری میگیرن.

تنها مشکلی که الان دارم اینه که نمیتونه با هزینه کم تشخیص بده که مثلا دو تا قفلی که الان الویت بالا گرفتن نمیتونن همزمان بسته بشن چون یک State مشترک دارن.
که البته راه این هم اینه که قفل شدن قفل ها رو هم سینک کنم که دوست دارم نکنم.

ایده ای دارید؟