تبليغاتX
گرید کامپیوتینگ-Grid computing

گرید کامپیوتینگ-Grid computing

سایت تخصصی در مورد گرید کامپیوتینگ-grid computing-globus و سیستم های توزیع شده و علوم جديد كامپيوتر

اينترنتII

 

آيكون ساعت شنى با وجود گسترش و بزرگ شدن هر لحظه اينترنت (World wide web) هنوز كند مى چرخد و اينترنت به (World wide wait) تبديل شده است. كاربران چه قديمى و چه جديد فهميده اند بازى درحال عوض شدن و قواعد اينترنت در حال تغيير و نو شدن است تا راه خود را به سوى آنچه اينترنت II ناميده مى شود، پيداكند.
اينترنت كنونى قابليت اجراى برنامه هاى كاربردى نسل بعد را ندارد و درحال جان كندن است.
آيا سرعت كنونى اينترنت براى دريافت و ارسال فايل ها در سال هاى آينده قابل قبول خواهدبود؟ آيا نمى توان در سطح جهان از رايانه هايى كه در حال كار نيستند براى پردازش اطلاعات سنگين استفاده كرد؟ پاسخ سؤالات فوق به راهى ختم خواهدشد با عنوان اينترنت II.
اينترنت برتر از تمام فناورى هايى ظاهر شده است كه جهان را به هم مرتبط مى سازد. اما اين فناورى نيز مانند ساير فناورى هاى ديگر آفت هايى دارد مانند هكرها، ويروسها و غيره.
اينترنت كنونى را در حقيقت مى توان نسخه توسعه يافته شبكه ARPANET ناميد. شبكه اى كه در سال ۱۹۶۹ توسط سازمان ناسا پايه گذارى شد و سپس چند دانشگاه آمريكا به اين شبكه پيوستند و بعد نيز به مرور كشورها عضو اين شبكه يكپارچه شدند.
هدف اصلى و ابتدايى از راه اندازى شبكه آرپانت امورتحقيقاتى و پژوهشى بود. اما اين شبكه بعدها در جهت اهداف سياسى، اقتصادى، فرهنگى و غيره نيز به كار گرفته شد.
تعمير و رفع مشكلات شبكه كنونى اينترنت سخت و دشوار شده است، بنابراين محققان برروى امكان ايجاد شبكه جهانى جديد درحال مطالعه و تحقيق هستند كه اين شبكه با نام اينترنت II شناخته مى شود.
اينترنت كنونى از پروتكل IPV4 استفاده مى كند كه نزديك به ۲۰ سال قدمت دارد و به عقيده بعضى عمر اين پروتكل به سر آمده است. مشكل اصلى در اين پروتكل تعداد محدود آدرس هاى IPV4 براى پشتيبانى از اينترنت فعلى و اينترنت II است. پديده اينترنت II يا Grid Technology پديده اى است كه به عنوان جانشين اينترنت فعلى در بعضى از كشورها شناخته شده است. اينترنت II با داشتن بهترين و سريع ترين ابزارهاى جست وجو (Search)، سرعت بسيار بالا و داشتن امكانات قوى براى تحقيق و پژوهش جايگزين شايسته اينترنت در سال هاى آتى خواهدبود. سرعت انتقال اطلاعات در يك پايگاه اينترنت II ده ها گيگابايت در ثانيه خواهدبود، البته هنوز زمان زيادى براى رسيدن به اينترنت II وجوددارد. اين فناورى حاصل همكارى ۱۳۰ دانشگاه و مركز تحقيقاتى به منظور توسعه اينترنت به صورت شبكه اى با قابليت هاى پيشرفته تر براى تحقيقات و آزمايش هاى دانشگاهى است.

مبناى كار اينترنت II

طراحى اينترنت II كه با اينترنت كنونى نيز سازگار است، مسيرى را در جهت دستيابى به پهناى باند بيشتر و نرخ انتقال اطلاعات افزون تر مهيا مى كند. لذا امتيازات اينترنت II توانايى يكپارچه كردن شبكه هاى محلى و بومى، افزايش اطمينان و افزايش ظرفيت شبكه است.
در اينترنت II برخلاف اينترنت كنونى از پروتكل IPU6 به جاى پروتكل IPU4 استفاده مى شود. (internet protocol version). در اصل شماره IP كه در حال حاضر از ۴ بخش تشكيل شده است در اينترنت II شش بخشى خواهدبود كه اين تغيير پروتكل افزايش پهناى باند را به دنبال خواهدداشت و زمان دسترسى به اطلاعات به زمان حقيقى بسيار نزديك تر مى شود.

كاربردهاى اينترنت II

با تبديل اينترنت كنونى به اينترنت II در تمام گرايش هاى فنى، مهندسى، علوم و غيره مى توان شاهد تغييرات شگرفى بود كه در زير به عنوان نمونه به چند مورد از آنها اشاره مى شود.

* پزشكى: تصويربردارى سه بعدى از اعضاى بدن و معاينه تخصصى پزشكى از راه دور، بدون حضور پزشك در محل بيمار
* سرگرمى: ارائه تصاوير ويديويى با سرعت و كيفيت بسيار بالا به صورت دو طرفه
* آموزشى: ايجاد امكانات آموزشى ميان دو مؤسسه دور از هم و تعامل استاد و دانشجو بدون نياز به حضور استاد و دانشجو در كلاس درس
* نجوم: كنترل تلسكوپ از راه دور و مشاهده اطلاعات دريافتى از تلسكوپ به صورت بلادرنگ

مزاياى اينترنت II

درحقيقت مى توان گفت اينترنت II براى سه منظور مهم طراحى شده است:

۱- افزايش پهناى باند اطلاعاتى
(Band width)
۲- چندكاره بودن شبكه (Multi task)
۳- امنيت بالاى دريافت و اجراى اطلاعات (Securiety)

افزايش پهناى باند

اگر جزو كاربران اينترنت كنونى هستيد، حتماً از كندى سرعت اينترنت شاكى و گله مند هستيد. شما در بهترين حالت dial up سرعتى حدود ۴۴mbps را خواهيد داشت و در صورت استفاده از سرويس هاى ADSL اين سرعت اندكى افزايش يافته و تا ۵۱۲mbps و يا بيشتر هم خواهد رسيد (البته با افزايش هزينه هاى شما) - ممكن است سرعت دريافت و ارسال اطلاعات براى شما اهميت حياتى داشته باشد - در اين موقع مجبور خواهيد بود كه بيشتر هزينه كرده و به سراغ سرويس هاى vsat برويد كه بعد از گرفتن مجوزهاى لازم، اين سرويس براى شما فعال خواهدشد و البته هزينه هاى زيادى را نيز بايد براى استفاده از اين سرويس به صورت ماهيانه پرداخت كنيد.
مواردى كه در بالا عنوان شد تنها گوشه هايى از مشكلات دستيابى به اينترنت كنونى است، يكى از مهم ترين اهداف اينترنت II دستيابى به پهناى باند بيشتر براى كاربران است كه همزمان با افزايش سرعت دريافت و ارسال اطلاعات درخواستى، پهناى باند تخصيص يافته به كاربران و مشتركان نيز در اين سرويس افزايش پيداكند.

چندكاره بودن شبكه

تنها مزيت اينترنت II در افزايش پهناى باند خلاصه نمى شود. آيا نمى توان از سرعت و قدرت رايانه ها در مواقعى كه كاربران با آن كارى انجام نمى دهند براى انجام امور محاسباتى دقيق و سريع بهره گرفت؟
در اينترنت II امكانى فراهم شده است تا كاربران در صورت تمايل و اعلام آمادگى شخصى جهت دراختيار گذاشتن منابع سخت افزارى خود در شبكه به صورت رايگان قادر به انجام اين كار باشند.
كافى است كه شما با وصل شدن به آدرس يك پايگاه اينترنتى كه از پروتكل هاى اينترنت II پشتيبانى مى كند، Screen saver دلخواه خود را نصب كرده و در مواقعى كه از رايانه خود استفاده نمى كنيد به ساير كاربران اجازه دهيد كه از منابع سخت افزارى رايانه شما جهت پردازش هاى سنگين استفاده كنند و درحقيقت رايانه خود را درمواقع بيكارى وقف امور پژوهشى و تحقيقاتى كنيد تا شما نيز در پيشرفت علم نقشى برعهده داشته باشيد و نيز با ايجاد امكان استفاده از منابع سخت افزارى ساير رايانه ها، رايانه خانگى خود (pc) را به ابرقدرتى بى رقيب تبديل كنيد.

امنيت بالاى دريافت و ارسال

اينترنت فعلى با مشكلات امنيتى بسيارى دست به گريبان است. هكرها، فيشرها و غيره همواره در كمين نشسته اند تا در صورت كوچك ترين غفلت شما و يا سرويس دهنده شما اطلاعات شما را دزديده و به حراج بگذارند.
هر از چندگاهى نسخه هاى اصلاح شده آنتى ويروس ها، آنتى اسپم ها، آنتى تروژن ها و غيره برروى شبكه دراختيار كاربران قرارمى گيرد و شما مجبور خواهيدبود براى در امان ماندن از شر اين ميهمان هاى ناخواسته آنتى ويروس خود را به روز كنيد (up to date) با هكرها چه مى كنيد؟ هكرها هميشه يك قدم از شما جلوتر هستند و هر زمان كه اراده كنند سدهاى پولادين را شكسته و به web site شما نفوذ خواهندكرد و اطلاعات شما را در چشم برهم زدنى به يغما مى برند. براى جلوگيرى از نفوذ اين دزدان دنياى ديجيتال چه فكرى كرده ايد؟
اينترنت II سعى كرده است تا حدودى مشكلات امنيتى موجود در اينترنت كنونى را برطرف نمايد و با شش بخشى شدن آدرس هاى اينترنتى تا حدودى امنيت در شبكه ها بالاتر خواهدرفت و از نفوذ هكرها نيز جلوگيرى به عمل خواهدآمد.

فرايندهاى اصلى اينترنت II

در اينترنت II فرايندهاى زيادى وجودخواهدداشت. اما سه فرايند اصلى اين پديده تكنولوژيك عبارتند از:

۱- گريدهاى اطلاعاتى (Data grid)
۲- گريدهاى جوينده (Scavenging Grid)
۳- گريدهاى محاسباتى (Computing Grid)

*
Data grid

اين gridها وظيفه ذخيره سازى اطلاعات و سپس ارائه آن به كاربران را برعهده دارند.
مشتريان اين گريدها بدون توجه به موقعيت مكانى قابليت دسترسى به اين اطلاعات را دارا خواهندبود.
در اين نوع گريد دستگاه هايى كه با سيستم ارتباط دارند مسئول به اشتراك گذارى اطلاعات هستند.

*
Scavenging Grid

اين گريدها به صورت مداوم به دنبال ظرفيت هاى خالى در اينترنت هستند تا از منابع آزاد درجهت پردازش هاى سنگين بهره بگيرد و البته با كسب اجازه قبلى از صاحبان سيستم ها

*
Computing Grid

اين گريدها كه بعضى آن را جزئى از scavenging Grid مى دانند، وظيفه استفاده از منابع بلااستفاده رايانه هاى شخصى را در جهت پردازش هاى نرم افزارى برعهده دارد و سرعت پردازش اطلاعات در اين سيستم ها افزايش چشمگيرى خواهدداشت و لذا مى توانيم نرم افزارهاى سنگين را برروى رايانه هاى قديمى اجرا كرده و نياز به ارتقاى سيستم ها تا حدودى كاهش پيداخواهدكرد.

+ نوشته شده در  چهارشنبه بیست و ششم دی 1386ساعت 18:26  توسط یوسف عبدلیان باریکرسفی  | 

به نام خدا

 

 

پايگاه داده پيشرفته

دكتر رهگذر

 

 

پدرام قدس نيا

اشكان بياتي

 

 

 

گزارش شماره 1

فايل persentation

در اين گزارش مباحثي كلي در مورد بانكهاي اطلاعاتي توزيع شده، معماريهاي آنها و مسائل و مشكلاتي كه هنگام حركت از بانكهاي اطلاعاتي متمركز به سمت بانكهاي اطلاعاتي توزيع شده با آنها روبرو هستيم صحبت شده و تعدادي از كارهاي جديدي كه در زمينه برطرف شدن مشكلات مربوطه انجام شده شرح داده شده است. از جمله يك كار جديدي كه در زمينه سنكرون كردن داده هاي كپي شده انجام شده در انتهاي اين گزارش شرح داده شده است.

فهرست مطالب اين گزارش :

1. ذخيره اطلاعات به صورت توزيع شده

2. تراكنشهاي توزيع شده

3. مديريت همزماني در بانكهاي اطلاعاتي توزيع شده

4. مديريت بن بست

5. سنكرون كردن اطلاعت كپي شده

6. منابع

 

گزارش شماره 2

فايل presentatoin

در اين گزارش در مورد مكانيزمهاي همزماني صحبت شده است. در ابتدا مكانيزمهاي هم زماني در حالت متمركز معرفي شده اند و مشكلات بكارگيري اين روشها در حالت توزيع شده بررسي شده است و در انتها يك مكانيزم جالب و جديد به نام DSGT براي كنترل همزماني در حالت توزيع شده معرفي شده است و جزئيات آن شرح داده شده است.

فهرست مطالب اين گزارش :

1. مكانيزمهاي سنتي براي كنترل همزماني

1-1. روش S2PL

1-2. روش خوشبينانه (Optimistic)

2. روشهاي جديد و بهبود يافته براي كنترل توزيع شده همزماني

2-1. گراف توالي پذيري

2-2. روش تست گراف توالي پذيري نامتمركز (DSGT)

3. مقايسه DSGT‌ با S2PL

4. Replication و پروتكل DSGT

5. منابع

 

گزارش شماره 3

فايل presentation

در اين گزارش در مورد سيستمهاي توزيع شده همتا به همتا و كاربردهاي آنها توضيحاتي داده شده است. در ادامه يك الگوريتم جالب و قوي براي حل مساله انتخاب چندگانه به صورت توزيع شده بيان شده است و در انتها در مورد معماري data grid ها و مديريت replication‌ در آنها مطالبي از مقالات جديد ارائه شده است.

فهرست مطالب اين گزارش :

1.بررسي الگوريتمهاي انتخاب چندگانه در سيستم هاي همتا به همت

2-1.مشكلات موجود در استفاده از بانكهاي اطلاعاتي توزيع شده مبتني بر P2P

2-2.الگوريتم توزيع شده انتخاب چندگانه

2-3-مراحل الگوريتم

2-4.محاسبات پيچيدگي الگوريتم

2-5.آزمايشات تجربي

3.الگوريتم پوياي Replication براي Data Grid هاي چند لايه

3-1.انواع الگوريتمهاي موجود

3-2.معماري سيستم

3-3.پيشنهاد بهبود معماري

3-4.الگوريتمهاي replication‌ به صورت پويا

3-4-1.روش SBU

3-4-2.روش ABU

4.منابع

 

پروژه1

در پروژه انجام شده شبيه سازي كه توسط آقاي باصدا طراحي شده بود، به گونه اي تغيير داده شد كه براي آزمايش يك پروتكل جديد به نام BGBR آماده شود. اين شبيه ساز كه به زبان جاوا نوشته شده است يك سيستم بانك اطلاعاتي توزيع شده همتا به همتا را كه داده هاي آن به روش Fragmentation‌ بين سايت هاي مختلف توزيع شده اند شبه سازي مي كند. الگوريتم BGBR روشي براي تصميم گيري در مورد چگونگي جا به جا كردن Data Fragment‌ ها بين سايت ها با توجه الگوي دستيابي كاربران سيستم به صورت پويا و هوشمند است. اين الگوريتم به گونه اي تصميم گيري مي كندكه در در حاصل كار هزينه جابجايي Data Fragment‌ ها و همچنين هزينه پرس و جوهاي انجام شده كمينه شود. طبق آزمايشاتي كه انجام شد، مشخص گرديد كه اين روش نسبت به دو روش قبلي يعني روش Optimal و روش NNA‌ بسيار بهتر عمل مي كند.

مستندات پروژه

پروژه 2

فايل exe

فايل swf

در اين پروژه كه با استفاده از زبان Action Script‌ و به صورت تحت وب پياده سازي شده است امكان رسم توپولوژي توزيع شده دلخواه به صورت گرافيكي وجود دارد. به كمك اين ابزار كه Topology Editor‌ نام دارد مي‌توان از توپولوژي رسم شده فايل xml استخراج كرد و از فايل استخراج شده براي آزمايشات مربوط به تغيير Topology استفاده نمود و در واقع تاثير تغيير توپولوژي را بر نتايج آزمايش كرد. در حال حاضر تنها نسخه مقدماتي از اين پروژه پياده سازي شده است و در آينده اي نزديك پياده سازي نسخه نهايي به پايان خواهد رسيد.

 

Conference Paper

فايل presentation

نسخه doc‌ از مقاله

در اين مقاله الگوريتم BGBR توضيح داده شده است و در مورد ساختار آن و همچنين علت برتري آن بحث شده است. در نهايت نتايج آزمايشات تجربي انجام شده با شبيه ساز تغيير يافته آورده شده و به كمك اين نتايج ادعاهاي صورت پذيرفته به اثبات رسيده است.

 

گزارش فني در مورد جزئيات پروژه

نسخه doc

 

آدرس این سایت این است برای گرفتن پاورپویت و پی دی اف به سایت زیر بروید

http://ece.ut.ac.ir/DBRG/seminars/BaiatiAshkan-GhodsniaPedram/CD1/index.html

 

+ نوشته شده در  چهارشنبه بیست و ششم دی 1386ساعت 18:15  توسط یوسف عبدلیان باریکرسفی  | 

بانكهاي اطلاعاتي توزيع شده-گزارش 3

بانكهاي اطلاعاتي توزيع شده

(گزارش شماره 3)

 

پدرام قدس نيا

اشكان بياتي

 

دانشکده مهندسی برق و کامپيوتر

دانشگاه تهران

 

 

فهرست مطالب

 

1.بررسي الگوريتمهاي انتخاب چندگانه در سيستم هاي همتا به همتا 1

2-1.مشكلات موجود در استفاده از بانكهاي اطلاعاتي توزيع شده مبتني بر P2P.. 2

2-2.الگوريتم توزيع شده انتخاب چندگانه. 3

2-3-مراحل الگوريتم.. 4

2-4.محاسبات پيچيدگي الگوريتم.. 8

2-5.آزمايشات تجربي.. 9

3.الگوريتم پوياي Replication براي Data Grid هاي چند لايه. 11

3-1.انواع الگوريتمهاي موجود. 11

3-2.معماري سيستم.. 12

3-3.پيشنهاد بهبود معماري.. 13

3-4.الگوريتمهاي replication‌ به صورت پويا 14

3-4-1.روش SBU... 14

3-4-2.روش ABU... 15

4.منابع. 15

 

 

 

 

1.بررسي الگوريتمهاي انتخاب چندگانه در سيستم هاي همتا به همتا

در بخش اول اين گزارش در مورد الگورتمهاي انتخاب چندگانه در سيستمهاي توزيع شده همتا به همتا صحبت خواهيم نمود. عمده مطالب اين بخش از مقاله [1] برگرفته شده است.

امروزه بحث محاسبات همتا به همتا (peer-to-peer) يكي از مباحث داغ در زمينه سيستم هاي توزيع شده به شمار مي‌رود. به كمك معماري هاي موجود در اين زمينه مي توان قدرت پردازش و همچنين اطلاعات موجود در تعداد زيادي كامپيوتر را كه در گستره جغرافيايي پهناوري وجود دارند و تنها از طريق شبكه و يا اينترنت به هم متصل هستند به اشتراك گذاشت و در نتيجه سيستم توزيع شده اي داشت كه به كمك آن بتوان به قدرت پردازشي بالايي دست يافت و يا به حجم عظيمي از اطلاعات توزيع شده در سيستم هاي مختلف دسترسي پيدا نمود. در سالهاي گذشته بيش از نيم بيليون دلار در شركتهايي كه در اين زمينه فعاليت مي كنند سرمايه گذاري شده است. شدت علاقه به اينگونه سيستمها از موفقيت چشمگير نرم افزارهاي شناخته شده و معروفي مثل Napster (نرم افزار به اشتراك گذاري فايل هاي موزيك) و يا پروژه ضد سرطان دانشگاه آكسفورد(به اشتراك گذاري قدرت پردازش براي شركت در محاسبات لازم براي تحقيقات بيولوژيك در زمينه سرطان) نشات مي گيرد. به دنبال محبوبيت اين نرم افزار ها تعدادي پروژه به اشتراك گذاري فايل و پردازش ديگر هم شكل گرفت كه از جمله آنها مي توان به نرم افزار هاي Kaza، Emull، Edonkey و ... براي به اشتراك گذاري فايل و پروژه شبيه سازي ژنتيكي گوگل براي استفاده از قدرت پردازش كامپيوتر هاي دنيا در انجام تحقيقات ژنتيكي نام برد.

از كاربردهاي ديگري كه مي توان براي اينگونه سيستم ها در نظر گرفت به اشتراك گذاشتن اطلاعات مفيد بين كمپاني هاي مختلف است. تعدادي كمپاني كه رقيب هم هستند براي به دست آوردن اطلاعات آماري كه منافع مشتركي را براي همه آنها در بر دارد مي توانند از سيستمهاي همتا به همتا مابين كامپيوتر هاي يكديگر استفاده كنند. تفاوت اين مورد را با موارد قبلي مي توان در موارد زير خلاصه كرد :

-         نياز به امنيت اطلاعات بيشتر براي جلوگيري از فاش شدن اطلاعات خصوصي كمپاني در هنگام به اشتراك گذاري فايلها و قدرت پردازش.

-         كمتر بودن تعداد كامپيوتر هاي شركت كننده در كل سيستم

-         پيچيده تر بودن دستورالعملهاي بانك اطلاعاتي و نياز به الگوريتمهاي توزيع شده بهينه

-         تعلق كامپيوتر هاي شركت كننده به كمپاني به جاي افراد حقيقي

اين تغييرات مواردي هستند كه مشكلات جديدي را مطرح مي كنند كه براي حل آنها پنجره جديدي از تحقيقات باز شده است.

2-1.مشكلات موجود در استفاده از بانكهاي اطلاعاتي توزيع شده مبتني بر P2P

اگر چه سيستم هاي P2P‌ موفقيت چشمگيري داشته اند ولي هنوز به كار بردن آنها در بعضي از كاربردها با مشكلاتي روبروست. يكي از جدي ترين اين مشكلات در حوزه عمليات بانك اطلاعاتي حاكم است. بسياري از دستورالعملهاي بانك اطلاعاتي در روي يك كامپيوتر در زمان كوتاهي قابل اجرا هستند ولي اجراي همين دستورالعملها در يك بانك اطلاعاتي توزيع شده ممكن است به رد و بدل شدن پيامهاي ارتباطي زيادي نياز داشته باشد و در نتيجه زمان بيشتري ببرد.

يكي از اين دستورالعملهاي زمانبر Selection است مثالي براي عمل Selection‌ در [1] آمده است.

يك راه حل براي اين مشكل اين است كه همه اطلاعات را روي يك كامپيوتر بياوريم و سپس عمل Select‌ را به شكل بهينه اي روي آن كامپيوتر اعمال كنيم. ولي اين راه حل مشكلات زير را دارد :

- امنيت : انتقال همه اطلاعات به يك كامپيوتر ممكن است مشكل امنيتي به دنبال داشته باشد. همانطور كه در مثال قبلي گفتيم ممكن است يك كمپاني علاقه اي به ارسال همه اطلاعات خود به كامپيوتر كمپاني رقيبش نداشته باشد ولي ارائه نتيجه يك جستجو يا select بدون دادن جزئياتي كه اين نتيجه را حاصل كرده به رقيب مشكلي برايش ايجاد نكند. مثلا شايد فيلدهاي خاصي از ركوردهاي مشتريانش داراي اهميت امنيتي باشند ولي ارائه ساير فيلدها مشكلي در بر نداشته باشد ويا ارائه برخي ركوردها به رقيب مشكل امنيتي داشته باشد و ارائه بقيه آنها مشكلي نداشته باشد.

-      ظرفيت ذخيره سازي كامپيوترها : ممكن است حجم اطلاعاتي كه عمل select‌ روي آنها انجام مي شود آنقدر زياد باشد كه امكان انتقال همه آنها به يك كامپيوتر وجود نداشته باشد.

-         پهناي باند مصرفي : انتقال حجم زيادي از اطلاعات در شبكه مي تواند بار زيادي را به شبكه تحميل كند و ترافيك شبكه را به شدت بالا ببرد.

 

با توجه به دلايلي كه گفته شد انتقال همه اطلاعات روي يك كامپيوتر و انجام عمل select‌ روي آن مقرون به صرفه نمي باشد. در اين مقاله الگوريتم بهتري ارائه شده است كه از اين روش و ساير روشهايي كه تا كنون ارائه شده اند بسيار بهينه تر عمل مي كند.

2-2.الگوريتم توزيع شده انتخاب چندگانه

الگوريتم توضيح داده شده در اين مقاله از الگوريتم انتخاب تكي اي گرفته شده است كه توسط نويسنده همين مقاله قبلا ارائه شده است. نكته حائز اهميت اين است كه اين الگوريتم از لحاظ پيچيدگي و بازدهي مقدار كمي با الگوريتم قبلي تفاوت دارد و از اين لحاظ بهبود قابل توجه اي صورت گرفته است.

از آنجايي كه قبل از شروع عمليات الگوي آماري توزيع كليدهاي مورد جستجو مشخص است لذا از دانش آماري موجود مي توان در جهت افزايش سرعت اين الگوريتم استفاده نمود. به عبارت ديگر مي توان با تغييرات مختصري در الگوريتم با توجه به چگونگي توزيع كليدها در سايت هاي مختلف به سرعت بالاتري دست يافت.

در الگوريتم انتخاب تكي، هدف پيدا كردن يك كليد در فايل بزرگي است كه در سايت هاي مختلف توزيع شده است. براي نمونه پيدا كردن 30 امين كوچكترين كليد. از آنجايي كه در كاربرد هاي واقعي اصولا نياز به پيدا كردن سلسله وار تعداد بيشتري كليد است، لذا وجود يك الگوريتم بهينه بسيار پرفايده مي باشد.

يك مورد خاص از پيدا كردن(انتخاب) كليدهاي چند گانه كه در اين مقاله مورد بحث قرار گرفته و مثالهاي ارائه شده از اين الگو پيروي مي كنند به اين صورت است كه هدف پيدا كردن p-1 كليد است (كليدهايي با مرتبه هاي n/p، 2n/p، ... و (p-1)n/p ) در سيستمي با n ركورد و p‌ كامپيوتر (سايت). براي مثال پيدا كردن 30 امين و 60 امين كليد در سيستمي با 90 ركورد و 3 كامپيوتر.

شرايط و فرضياتي كه در نظر گرفته شده است عبارتند از :

-         همه كامپيوتر ها با قابليت broadcast/multicast به يكديگر متصل شده اند.(مثلا در يك LAN)

-      يك فايل بزرگ به صورت فيزيكي مابين p كامپيوتر توزيع شده است و تعداد n ركورد به صورت تقريبا uniform بين اين n كامپيوتر تقسيم شده است(يعني n/p ركورد در هر كامپيوتر)

-      كليدهاي موجود در فايل به صورت X(i,k) نمايش داده مي شوند كه k عددي بين 1 و n/p‌ است و i شماره كامپيوتر را مشخص مي كند. كليدها در هر كامپيوتر مرتب شده اند و لذا داريم :

X(i,1) < X(i,2) < ...< X(i, k) < ... < X(i, n/p)

 

-         هيچ ترتيبي مابين كليدها در سايت هاي مختلف وجود ندارد. يعني مثلا دليلي ندارد كه كليد اول سايت اول از كليد اول سايت دوم كوچكتر باشد.

-         نحوه توزيع كليدها در كامپيوتر هاي مختلف مي تواند از هر توزيع آماري دلخواهي پيروي كند ولي در اين مقاله براي راحت تر شدن فهم مثالها از توزيع ساده uniform‌ استفاده شده است.

هدف اين الگوريتم پيدا كردن p-1 كليد هدف است. مرتبه كليدهاي مورد نظر در كل فايل jn/p است به طوري كه (1 . براي مثال پيد اكردن 30 امين و 60 امين كليد در سيستم 90 ركوردي با 3 كامپيوتر.

اين الگوريتم قابليت پيدا كردن تعداد بيشتري كليد را هم دارد ولي براي راحتي فهم مثالها و از آنجايي كه كاربرد واقعي‌اي براي اين مورد وجود داشته است از اين تعداد خاص استفاده شده است.

2-3-مراحل الگوريتم

فاز اول :

مرحله اول : يك كامپيوتر به عنوان coordinator انتخاب مي شود. هر كامپيوتري بزرگترين و كوچكترين كليد خود را به coordinator‌ اعلام مي كند. coordinator از روي مقادير دريافت شده MAX (بزرگترين كليد كل فايل) و MIN (كوچكترين كليد كل فايل) را پيدا مي كند و از روي آنها با استفاده از فرمول زير مقادير آغازين جدا كننده ها را پيدا مي كند:

DELIMITERj = MIN + (MAX-MIN)j / p (1 <= j <= p-1)

 

مرحله دوم :

coordinator‌ مقادير p-1‌ جداكننده را به همه كامپيوتر ها ارسال مي كند.

مرحله سوم :

هر كامپيوتر p-1‌ محور (pivot) انتخاب مي كند. Pivot i,j بزرگترين مقدار در كامپيوتر iام است كه از DELIMITERj كوچكتر است(يا با آن برابر است).

مراحل اول و دوم در صورتي كه MIN‌ و MAX‌ از قبل براي همه كامپيوتر ها مشخص باشد اختياري است و لذا ارسال پيامهاي مربوط به اين دو مرحله قابل كاهش است. در شكل زير مراحل 1 و 2 را مشاهده مي كنيد.

فاز دوم :

در اين فاز هر كامپيوتر به طور همزمان دو وظيفه را بر عهده دارد. اين دو وظيفه عبارتند از محاسبه محور و محاسبه رتبه. در هر مرحله هر كامپيوتر محور و رتبه محاسبه شده توسط خودش را منتشر مي كند. اين كار به صورت نوبتي و پشت سر هم انجا مي شود.

محاسبه رتبه :

r[i,j] را به صورت تعداد كليدهاي كوچكتر از محور i,j‌ در كامپيوتر i‌ تعريف مي كنيم. هر كامپيوتر p-1‌ محور از ساير كامپيوتر ها به صورت broadcast دريافت مي كند. و كامپيوتر ها مقادير كليدهاي محلي خود را با اين كليدها مقايسه مي كنند و به ترتيب و پشت سرهم كامپيوتر ها رتبه خود را نسبت به اين محور هاي اعلام شده به همه منتشر مي‌كنند.

محاسبه محور:

همانطور كه مشخص است هر كامپيوتر (p-1)2 رتبه از ساير كامپيوتر ها دريافت مي كند. بعد از دريافت اين رتبه ها با استفاده از رابطه زير رتبه خود را در فايل سراسري محاسبه مي كند. در اين رابطه رتبه همه كامپيوتر ها با هم جمع مي‌شود و به راحتي رتبه سرتاسري به دست مي آيد. چنانچه رتبه به دست آمده همان رتبه مورد نظر بود كه كليد پيدا شده و كار تمام است. در اين شرايط با پيغام خاصي پيدا شدن كليد به اطلاع همه خواهد رسيد و از اين پس كسي به دنبال آن كليد خاص نخواهد گشت.

در صورتي كه كليد پيدا نشده باشد هر كامپيوتر محور جديدي با استفاده از متدي كه در زير معرفي شده است محاسبه مي كند.

محاسبه محور جديد :

در واقع بعد از هر مرحله هر فايل محلي به دو زير فايل تقسيم مي شود. همه كليدهاي موجود در زير فايل اول كوچكتر يا مساوي با محور i,j‌ هستند در حالي كه همه كليدهاي موجود در زير فايل دوم از اين مقدار بزرگتر هستند.

اگر رنگ سرتاسري محاسبه شده از محور كوچكتر باشد فايل اول مورد استفاده قرار مي گيرد و در غير اين صورت فايل دوم مورد استفاده قرار مي گيرد. محور جديد به طريق زير محاسبه مي شود :

كه Offsetj به صورت زير محاسبه مي شود.

كوچكترين كليد در زير فايل دوم كه بزرگتر يا مساوي با NP‌ باشد به عنوان محور جديد در نظر گرفته مي شود. در صورتي كه به سراغ فايل اول رفته باشيم بزرگترين كليد در فايل اول كه كوچكتر يا مساوي با NP باشد به عنوان محور جديد در نظر گرفته مي شود.

در واقع الگويتم به صورت لگاريتمي عمل مي كند و هر دفعه فايل هاي محلي كامپيوتر ها را به دو قسمت تقسيم مي‌كند و در واقع مجازا در كل فايل چنين عملي در حال انجام است.

براي روشن تر شدن موضوع به مثال زير توجه كنيد :

مثال :

در شكل زير سه جدول Table1، Table2و Table3 كه در كامپيوتر هاي 1 و 2 و3 قرار دارند به همراه كليدهاي موجود در هر كدام مشاهده مي كنيد.

 

پيغام هاي رد و بدل شده بين كامپيوتر هاي مختلف در مراحل اجراي الگوريتم را در جدول زير مشاهده مي نماييد.

 

 

همانگونه كه مشاهده مي كنيد 30 امين كليد بعد از سه مرحله پيدا شد و از آنجا به بعد با ارسال حرف E‌ به ديگران گفته مي شود كه عمليات پيدا كردن اين كليد به پايان رسيده و نيازي به ادامه محاسبات روي اين كليد نيست. ولي همانگونه كه مشاهده مي كنيد كليد 60 ام هنوز پيدا نشده است، لذا عمليات براي پيدا كردن آن همچنان ادامه مي يابد تا اينكه در 5 مرحله اين كليد هم پيدا ميشود و عمليات كلا به پايان مي رسد.

در شكل زير نحوه انتقال پيغام ها بين كامپيوتر ها را در اولين مرحله‌ مشاهده مي كنيد.

 

2-4.محاسبات پيچيدگي الگوريتم

در ادامه مقاله به بررسي پيچيدگي زماني اين الگوريتم و همچنين تعداد پيامهاي رد و بدل شده لازم بين كامپيوتر ها پرداخته شده است. در قسمت سلسله اي از ادعا ها به همراه اثبات آنها آورده شده است. براي نمونه ثابت شده است كه حد بالاي همه پيامهاي ارسالي عبارت است از :

 

حد بالاي تعداد كل مراحل عبارت است از :

حد بالاي مجموع كليدهايي كه هر كامپيوتر نياز دارد تا براي ساير كامپيوتر ها در حين پروسه الگوريتم اعلام كند عبارت است از :

همچنين در مورد سيستمي كه قابليت Broadcast‌ ندارد نيز محاسبات پيچيدگي زماني و تعداد پيامها صورت گرفته است.

براي مثال حد بالاي تعداد پيغامهاي لازم براي پيدا كردن كليدي با رتبه J‌ در سيستمي بدون قابليت Broadcasting به صورت زير است :

 

2-5.آزمايشات تجربي

در بخش بعدي مقاله در ابتدا كارهاي مشابه انجام شده به صورت مختصر معرفي شده اند و سپس نتايج تجربي اين الگوريتم به صورت تعدادي نمودار بيان شده است. در اين نمودارها نشان داده شده است كه در تجربه نتيجه بهتري از محاسبات تئوري انجام شده در مورد پيچيدگي به دست آمده است. البته اين بدان دليل است كه در محاسبات تئوري حد بالا براي پيچيدگي ها محاسبه شده بود. در زير نمودارهاي مربوطه حاصل از نتايج تجربي را مشاهده مي نماييد :

 

 

نمودار تعداد مراحل بر حسب تعداد كامپيوتر ها

 

همانطور كه مشاهده مي كنيد بالا رفتن تعداد كامپيوتر ها تاثيري بر تعداد مراحل ندارد.

 

 

نمودار تعداد پيغامها بر حسب تعداد كامپيوتر ها

 

همانگونه كه مشاهده مي كنيد با بالا رفتن تعداد كامپيوترها تعداد پيغامها به صورت خطي بالا مي رود.

 

نمودار تعداد مراحل بر اساس حجم فايل (تعداد ركوردها) در تعداد كامپيوتر هاي مختلف

 

نمودار تعداد پيامها بر حسب حجم فايل (تعداد ركوردها) در تعداد كامپوتر هاي مختلف

 

نمودار زمان بر حسب تعداد ركوردها در تعداد كامپيوتر هاي مختلف

 

در ادامه مقايسه اي صورت گرفته است مابين روشهاي قبلي و اين روش آماري ارائه شده.

 

 

همانگونه كه در اين نمودار مشاهده مي كنيد از لحاظ تعداد مراحل، پيشرفت قابل توجهي در اين الگوريتم نسبت به روشهاي قبلي حاصل شده است. نكته ديگري كه وجود دارد اين است كه برعكس الگوريتمهاي قبلي تعداد كامپيوتر ها در اين الگوريتم تاثيري در تعداد مراحل ايجاد نمي كند.

 

 

3.الگوريتم پوياي Replication براي Data Grid هاي چند لايه

 

الگوريتم Dynamic Replication اي كه در اين قسمت معرفي مي شود برگرفته از [2] است. با اين حال براي بهبود كارايي الگوريتم پيشنهادهايي ارائه شده است كه در ادامه ذكر خواهيم نمود. data grid‌ ساختاري براي نگهداري فايلهاي اطلاعاتي با ابعاد بزرگ است و قابليت محاسباتي قدرتمندي براي سازمانهاي بزرگ و يا سيستمهاي اطلاعاتي مبتني بر community بزرگ فراهم مي كند. در data grid‌ اصولا كپي هاي متعددي از هر داده نگهداري مي شود و كاربران براي دسترسي به اطلاعات به در دسترس ترين و نزديك ترين و سريعترين كپي هدايت مي شوند. براي مديريت data grid ها مكانيزمهاي مختلفي تا كنون پيشنهاد شده است. يكي از مهمترين مسائلي كه در مديريت data grid‌ ها مطرح است ، چگونگي سيستم برخورد با replicate ها است. اينكه از كدام فايلها replicate ‌ بسازيم، چه موقع از داده ها replicate‌ ايجاد كنيم و اين replicate را در كجاي سيستم قرار دهيم تا بازدهي كلي data grid بالا برود از جمله مسائلي است كه پيرامون آنها بحث و تبادل نظر و تحقيقات وسيعي در جريان است. همچنين رعايت سازگاري ميان كپي هاي مختلف داده ها در سيستم هاي مبتني بر replication ازجمله مسائلي است كه تحقيقاتي براي حل مشكلات مربوط به آن صورت گرفته است [3].

3-1.انواع الگوريتمهاي موجود

با نگاهي به سوابق تحقيقاتي در اين زمينه روشهاي replication‌ را به دو دسته كلي تقسيم كرده اند.

دسته اول Static Replication است كه در آن سياست Replication از ابتدا به صورت ثابت و ايستا مشخص مي گردد و در واقع جزئي از پيكربندي سيستم محسوب مي شود. مسلما با تغيير توپولوژي شبكه data grid و يا تغيير الگوي درخواستها تغييري در اين سياست داده نخواهد شد. لذا بازدهي سيستم به شدت پايين مي آيد و ممكن است از منابع به شكل مناسب و مطلوب استفاده نشود. به عنوان مثال ممكن است تعداد استفاده كنندگان از سيستم در زمان تعيين سياست ها به صورت ايستا 50 عدد در نظر گرفته شده باشد، در حالي كه پس از گذشت مدتي تعداد كاربران به 500 عدد برسد و يا تعداد كاربران متصل به يك نود خاص بيشتر از بقيه بوده باشد و بعد از گذشت مدتي اين الگو تغيير كند و ترافيك نود ديگري بالا برود.

در مقابل اين روش، روش دايناميك وجود دارد كه در آن data grid‌ با توجه به تغيير الگوهاي دسترسي و موارد متغير ديگر به صورت اتوماتيك در زمان نياز به ساخت replicate‌ مي پردازد و آن را در جاي مناسب قرار مي دهد تا فركانس دسترسي به آن بهينه باشد و باعث بالا رفتن هزينه نگردد.

3-2.معماري سيستم

معماري سيستمي را كه از replication به صورت پويا استفاده مي كند در شكل زير مشاهده مي كنيد.

 

همانطور كه در شكل مشاهده مي كنيد، وقتي يك كاربر مي خواهد به يك فايل داده اي دسترسي داشته باشد، براي دسترسي به آن فايل نام آن را به RS(Replica Selector) ارسال مي دارد. وظيفه RS‌ انتخاب يك replica‌ مناسب براي سرويس دهي با درخواست اين كاربر است. معيارهايي كه براي انتخاب replica مناسب در نظر گرفته مي شود عموما نزديكي replica‌ به كاربري كه درخواست داده است و همچنين ميزان ترافيك فعلي replica‌ ها براي دسترسي است. يعني بايد replica‌ اي كه نزديكتر است و سرش خلوت تر است انتخاب شود. به اين ترتيب پهناي باند شبكه كمتر مصرف خواهد شد و زمان پاسخگويي به درخواست هم بالا خواهد رفت.

وقتي كه RS‌ مكان درست فايل داده اي را به درخواست كننده اعلام كرد، درخواست كننده با LRM(Local Replica Manager) مربوط به آن نود ارتباط برقرار مي كند. وظيفه LRM مديريت replica هاي موجود در يك سايت است.

براي هر انتقال فايل موفقيت آميزي كه صورت مي گيرد، LRM ، DRS(Dynamic Replica Scheduler) را صدا ميزند و اين انتقال موفق را به او خبر مي دهد.

DRS مسوول زمانبندي Replication‌ است. يعني تعيين مي كند كه چه زماني نياز است يك replication‌ جديد از فايل داده اي خاصي ايجاد شود. هرگاه كه خبر انتقال موفقيت آميزي به DRS‌ داده مي شود، اين خبر را log‌ مي كند. درواقع شمارنده تعداد دسترسي هاي انجام شده به آن فايل داده اي را يكي افزايش مي دهد.

در واقع DRS‌ وظيفه دارد كه اين log‌ ها را نگهداري كند و در بازه هاي زماني خاصي فايلهاي داده اي با محبوبيت بيشتر را شناسايي كند و براي آنها يك مكان كناسب در نظر بگيرد و دستور ساخت replica از آنها را صادر نمايد و سپس تعداد دسترسي هاي انجام شده را صفر كند و اين كار را دوباره ادامه بدهد. هر گاه DRS تشخيص بدهد كه بايد جابجايي صورت بگيرد دستور لازم را به LRM‌ سايت مربوطه ارسال مي كند و LRM خودش ساخت Replica‌ جديد را انجام مي دهد و نتيجه را به DRS‌ خبر مي دهد. DRS‌ با شنيدن خبر ساخت موفقيت آميز يك replica‌ جديد موضوع را به RC (Replica Catalogue)‌ خبر مي دهد تا خود را بروزرساني كند و ظهور replica‌ جديد را در سيستم در نظر بگيرد. RC‌ همانند يك name server‌ عمل مي كند و نگاشتي مابين فايلهاي منطقي و مكان فيزيكي آنها اعمال مي كند. براي اطمينان از سازگاري سيستم، خبر ساخت و يا حذف replica‌ ها بايد به RC‌ اعلام شود. توجه داشته باشد كه lock‌ ها هم در RC نگهداري مي شود ولي توسط DRS‌ مديريت مي شوند. هنگامي كه عمل نوشتن در يكي از replica‌ ها مي خواهد صورت بگيرد، DRS روي داده Lock مي گذارد و بعد از اينكه نوشتن به پايان رسيد DRS‌ همه replica‌ هاي متناظر را با تغيير داده شده هماهنگ مي كند و پس از اطمينان از اينكه كپي هاي مختلف نگهداري شده در سيستم با هم سازگار شدند، Lock‌ را از روي داده بر مي دارد.

3-3.پيشنهاد بهبود معماري

از آنچه كه تا كنون گفتيم اينگونه مي توان نتيجه گرفت كه وظايف DRS، RS و RC روي يك نود قرار گرفته است و همانطور كه مشخص است، سيستم وابستگي زيادي به اين اجزا دارد. لذا از بين رفتن يا خراب شدن هر كدام از اين اجزا مي تواند كل سيستم را از كار بيندازد. براي رفع اين مشكل پيشنهاد مي كنيم معماري ارائه شده در اين مقاله به صورت زير تغيير كند.

همانطور كه مشاهده مي كنيد در اين معماري بهبود يافته براي اين اجزاي حساس، كپي هاي متعددي در نظر گرفته شده و به كمك اين كي ها سيستم توزيع شده تر مي گردد. اين كپي ها در بازه هاي زماني خاصي نسخه فعلي را بررسي مي كنند و چنانچه متوجه شوند كه از كار افتاده است با استفاده از الگوريتم توزيع شده bully [4] از بين خود يكي را انتخاب مي كنند و از اين پس وظيفه بر عهده كپي منتخب خواهد بود. به اين ترتيب تحمل سيستم در برابر خرابي بالا خواهد رفت سيستم توزيع شده تر عمل خواهد نمود.

حال كه با معماري سيستم آشنا شديم به بررسي الگوريتم هاي ارائه شده براي زمانبندي replication‌ خواهيم پرداخت.

3-4.الگوريتمهاي replication‌ به صورت پويا

3-4-1.روش SBU

اولين روشSBU يا Single Bottom Up‌ نام دارد. ايده اصلي نهفته در اين الگوريتم قرار دادن replica‌ ها تا جايي كه ممكن است، نزديك نودهايي است كه استفاده بيشتري از اين replica دارند.

وقتي كه تعداد درخواستهاي كاربران از حد آستانه مشخصي مي گذرد، عمل replication‌ صورت مي گيرد. در واقع الگوريتم در DRS انجام مي شود و در دوره هاي زماني خاصي log‌ هاي گرفته شده جستجو مي شوند و دسترسي هايي كه از حد آستانه خود گذشته اند براي انتقال replica‌ به سمت آنها در نظر گرفته مس شوند. در اين الگوريتم ساده در ساختار درختي data grid سعي بر اين است كه replica‌ دقيقا در والد نودي كه درخواست كننده بيش از حد آستاده داشته قرار داده شود. ولي چنانچه اين نود پر بود و جا نداشت به سراغ والد آن مي رويم و اين كار را تا ريشه درخت ادامه مي دهيم. چنانچه در حال حاضر replica‌ در والد نود مورد نظر قرار داشت از انجام عمليات replication خودداري مي كنيم و به صفر كردن تعداد دسترسي ها در فايل log‌ مبادرت مي ورزيم.

3-4-2.روش ABU

در اين روش به جاي اينكه تعداد دستيابي هاي كاربران مختلف متصل به يك والد را به يك فايل داده اي مشخص به صورت مجزا شمارش كنيم، آنها را با هم در نظر مي گيريم.

شكل زير را در نظر بگيريد :

 

همانگونه كه در اين شكل مشاهده مي كنيد نود C1 به فايل داده اي x‌ تعداد 10 بار دستيابي كرده است و نود c2‌ به فايل داده اي Y تعداد 9 بار دستيابي كرده و فايل داده اي y توسط C3 تعداد 8 بار مورد دستيابي قرار گرفته است. همانگونه كه مي بينيد فايل داده اي y‌ مجموعا توسط نودهايي كه به والد S1 متصل هستند 17 بار مورد دستيابي قرار گرفته شده است. پس انتقال Y‌ به S1‌ ضروري به نظر مي رسد. چنانچه از روش SBU با حد آستانه 10 استفاده كنيم، فايل X‌ به S1‌ منتقل مي شود در حالي كه نود Y كه انتقال آن ضروري تر به نظر مي رسد منتقل نخواهد شد. به همين منظور از روش ABU به عنوان روش بهبود يافته SBU استفاده مي شود. در اين روش دسترسي هايي كه به فايل داده‌اي يكساني انجام شده است با هم جمع مي شوند حد آستانه براي مجموع در نظر گرفته مي شود. به اين ترتيب معيار بهتري براي تشخيص زمان و مكان replication به دست مي آيد كه كارايي سيستم را بالاتر خواهد برد.

 

4.منابع

 

  1. A. Loo, “Distributed multiple selection algorithm for peer-to-peer systems” Elsevier, 25 Agust 2004
  2. M. Tang, B. Lee, C. Yeo, X. Tang, “Dynamic Replication Algorithms For The Multitier Data Grid” Elsevier, October 2004.
  3. A. Domenici, F. Donnob,G. Pucciani, H. Stockingerc,K. Stockinger, Replica consistency in a Data Grid” Elsevier, July 2004
  4. Ramkrishnan, Gehrke, “Database Management Systems Third Edition”

 

 

+ نوشته شده در  چهارشنبه بیست و ششم دی 1386ساعت 18:13  توسط یوسف عبدلیان باریکرسفی  | 

بانكهاي اطلاعاتي توزيع شده -گزارش 2

بانكهاي اطلاعاتي توزيع شده

(گزارش شماره 2)

 

پدرام قدس نيا

اشكان بياتي

 

دانشکده مهندسی برق و کامپيوتر

دانشگاه تهران

 

فهرست مطالب

 

1. مكانيزمهاي سنتي براي كنترل همزماني

1-1. روش S2PL

1-2. روش خوشبينانه (Optimistic)

2. روشهاي جديد و بهبود يافته براي كنترل توزيع شده همزماني

2-1. گراف توالي پذيري

2-2. روش تست گراف توالي پذيري نامتمركز (DSGT)

3. مقايسه DSGT‌ با S2PL

4. Replication و پروتكل DSGT

5. منابع

 

 

 

 

 

 

 

1. مكانيزمهاي سنتي براي كنترل همزماني

 

بانكهاي اطلاعاتي توزيع شده و يا متمركز به صورت سنتي براي اطمينان از توالي پذير بودن و قابل برگشت بودن زمانبندي ها از مكانيزمها و پروتكل هاي قفل گذاري (Locking) استفاده مي كنند. پروتكلهاي قفل گذاري تضمين مي كنند كه تراكنشهاي برگ برگ شده(interleaved) و يا توزيع شده در اثر تاثير شبكه اي به وجود آمده مجازا به صورت معادل با تراكنشهايي كه نظم سريالي دارند اجرا شوند. يكي از متداولترين پروتكلهاي قفل گذاري كه در سيستمهاي متمركز و توزيع شده استفاده مي شود قفل گذاري محدود در دو فاز ياstrict two phase locking نام داردكه به اختصار به آن S2PL مي گويند[1].

 

1-1. روش S2PL

در فاز اول اين پروتكل، يك تراكنش T‌، روي اشياي داده اي مورد نيازش، قفلهاي اشتراكي و يا انحصاري لازم را مي‌گيرد. يك مكانيزم پيش فرض براي گرفتن قفل توسط تراكنش T اين است كه تراكنش براي گرفتن قفل بلاك مي‌شود تا زماني كه امكان گرفتن قفل به وجود آيد. خود DBMS‌ شروط Mutual Exclusion را تضمين مي كند و از گرفته شدن يك قفل انحصاري توسط دو تراكنش جلوگيري به عمل مي آورد.

در فاز دوم تراكنش پس از پايان كارش تمام قفلهايي را كه گرفته بود آزاد مي كند.

 

S2Pl بانك اطلاعاتي را در يك وضعيت سازگار نگه مي دارد. اگر دو تراكنش به دو بخش مستقل از اطلاعات بانك اطلاعاتي دسترسي داشته باشند مي توانند به صورت همزمان قفل هاي مورد نياز خود را دريافت كنند و كار خود را با موفقيت ادامه داده و به پايان ببرند. از طرف ديگر اگر دو تراكنش به داده هاي يكساني دسترسي داشته باشند و بخواهند اين داده ها را تغيير دهند فعاليتهاي آنها به صورت سريال يا پشت سر هم انجام خواهد شد. يعني تراكنشي كه زودتر براي تغيير آن اطلاعات قفل دريافت كرده همه عمليات درون خود را انجام مي دهد و به پايان مي رساند و سپس كنترل به دست تراكنش ديگر مي افتد و كارهايش را از اول تا آخر انجام مي دهد. از آنجايي كه در S2PL‌ تراكنشهايي كه زودتر قفل را گرفته اند تا زماني كه commit نشوند قفلهاي در اختيار خود را آزاد نمي كنند، لذا در صورتي كه تراكنشهاي بزرگي باشند، ساير تراكنشها كه منتظر اين قفلها هستند ممكن است مدت انتظارشان خيلي طولاني بشود.

 

1-2. روش خوشبينانه (Optimistic)

به دليل ساختاري كه اين پرتوكل در فاز دوم خود دارد يك پروتوكل محافظه كار به شمار مي رود كه بازدهي خوبي ندارد . به همين دليل به سراغ روش ديگري مي روند كه يك روش خوشبينانه است و با فرض اينكه در سيستم تعداد تداخل ها پايين يا متوسط است خيلي بهتر از روش قبلي عمل مي كند و بازدهي بيشتري را براي سيستم به همراه دارد.

اين روش كه در [2] آمده است مزاياي زير را به همراه دارد:

1-    از آنجايي كه روش خوشبينانه بر مبناي قفل گذاري كار نمي كند، لذا امكان به وجود آمدن بن بست وجود نخواهد داشت و لذا سيستم به علت بروز بن بست در يك توقف كامل نخواهد افتاد و لذا ديگر نيازي به بكارگيري الگوريتمهاي تشخيص بن بست و همچنين رفع بن بست نخواهيم داشت. همانطور كه مي دانيم استفاده از اين الگوريتم ها سر بار زيادي را براي سيستم به دنبال دارد و اين سربار زماني كه بن بست وجود ندارد و بيهوده الگوريتم تشخيص بن بست اجرا مي شود بيشتر باعث اتلاف منابع سيستم مي شود[3].

2-    روش خوشبينانه به خصوص وقتي فايده عدم استفاده از قفل را نمايان مي سازد كه بخش بزرگي از بانك اطلاعاتي در حافظه جانبي باشد و اين بدان دليل است كه يك شي داده اي تحت فشار از لحاظ دسترسي مي‌تواند توسط يك تراكنش قفل شده، و به تراكنشهاي ديگر اجازه استفاده از اين شي‌ء داده نشود در حالي كه تراكنشي كه قفل را در دست دارد در حال بازيابي اطلاعات از حافظه جانبي است.

3-    استفاده از روشهاي مدرن كه درشت دانگي قفل ها را امكانپذير مي سازند در زماني كه در پروتكل مبتني بر قفل تداخل به وجود مي آيد زياد مقرون به صرفه نيست. در چنين شرايطي اولا قفل گذاشتن روي سطوح بالاتر ميزان همزماني را پايين خواهد آورد و در ثاني قفل گذاشتن روي سطوح پايين نيز با سربار بسيار زيادي روبرو خواهد بود و بازدهي سيستم را به شدت پايين خواهد آورد.

 

ايده اصلي مكانيزم خوشبينانه حول محور برگرداندن (rollback) تراكنشي كه با تراكنش ديگر تداخل پيدا كرده است به حالت اول مي گردد. براي تشخيص تراكنشي كه با تراكنش ديگر تداخل كرده است روش خوشبينانه سه فاز را در نظر مي‌گيرد. اين سه فاز عبارتند از read، validationو write. البته ممكن است فاز write‌ وجود نداشته باشد.

 

‌شكل 1

 

در شكل 1 سه فاز مذكور را مشاهده مي نماييد. در حين فاز read‌ همه نوشتنها روي كپي هاي محلي از اطلاعات انجام مي گيرد. در فاز validation‌ چنانچه تشخيص داده شود كه انتقال كپي هاي محلي به سرجاي خودشان در بانك اطلاعاتي اصلي يكپارچكي داده ها را به هم نمي زند فاز write آغاز مي شود و اطلاعات محلي به صورت سرتاسري در خواهند آمد و در غير اين صورت تراكنش برگشت داده خواهد شد. در مقايسه با روشهاي قفل گذاري مي توان گفت كه قفل گذاري هر جا كه احتمال تداخل وجود داشت انجام مي شد واگر تراكنشي به قفلي مي رسيد كه نمي‌توانست آن را بگيرد بلاك مي شد ولي در اينجا تراكنش تا فاز validation‌ به اميد اينكه تداخلي وجود نخواهد داشت پيش مي‌رود و لذا همزماني بيشتري در اين روش مابين تراكنشها امكانپذير خواهد شد. در ضمن برگشت تراكنش حتما به ابتداي آن صورت نمي گيرد بلكه ممكن است به يك checkpoint صورت گيرد و به اين ترتيب كارايي را بالاتر هم ببرد. نكته حائز اهميت اين است كه كپي محلي اي كه براي انجام تغييرات در فاز read در نظر گرفته شده است براي ساير تراكنشها سرتاسري نخواهد شد تا زماني كه فاز write‌ كاملا به پايان برسد. در واقع كل فاز write‌ بايد به صورت درشت دانه و يكجا انجام شود و در حين عمل write‌ تراكنش ديگري به اين اطلاعات در حال تغيير دست نزند تا از به وجود آمدن ناسازگاري در اطلاعات جلوگيري شود.

 

براي اينكه يك تراكنش بتواند فاز validation‌ را با موفقيت به پايان برساند بايد يكي از شرايط زير برقرار باشد :

1- T(i) فاز write خودر را به پايان ببرد، پيش از اينكه T(j) فاز read خود را آغاز كند.

2- مجموعه نوشتنهاي T(i) با مجموعه خواندنهاي T(j) اشتراكي نداشته باشد و T(i) فاز write خود را به پايان برساند قبل از اينكه T(j)‌ فاز write خود را آغاز كند.

3- مجموعه نوشتنهاي T(i) با مجموعه نوشتنها و يا خواندنهاي T(j)‌ اشتراكي نداشته باشد و T(i)‌ قبل از T(j) فاز read خود را به پايان ببرد.

شرايط شماره 1 بيانگر اين است كه T(i) قبل از شروع T(j)‌ به طور كامل به پايان مي رسد و لذا به كلي تداخلي وجود نخواهد داشت.

شرايط شماره 2 حالتي را نشان مي دهد كه در آن نوشتنهاي T(i)‌ تاثيري روي فاز خواندن T(j)‌ نخواهند داشت و T(i)‌ نوشتن خود را قبل از شروع نوشتن T(j)‌ به پايان مي برد و لذا T(j)‌ را بازنويسي نخواهد كرد.

و در نهايت شرايط شماره 3 حالتي را نشان مي دهد كه در آن T(i) فازهاي read يا write‌ مربوط به T(j)‌ را تحت تاثير قرار نخواهد داد . دياگرام هاي شكل 2 براي روشن تر شدن موضوع شرايط بالا را نشان مي دهند:

 

شكل 2

 

در اينجا يك سوال مهم اين است كه در اين روش چه زماني بايد شماره تراكنش را به آن تخصيص داد؟

در نگاه اول اينگونه به نظر مي رسد كه اين شماره بايد در ابتداي فاز read اختصاص يابد. به طور كلي تراكنشي كه شماره بالاتري دارد بايد منتظر تراكنشهاي با شماره پايين تر از خود بماند و اين صبر كردن به اين دليل است كه فاز validation‌ در يك تراكنش به مجموعه نوشتن هاي تراكنشهايي كه قبل از آن شروع شده اند و در واقع شماره كوچكتري از آن دارند وابسته است.بنابراين براي اينكه اين مجموعه را كاهش بدهيم بهتر است كه تخصيص شماره به يك تراكنش را تا پايان فاز read يا شروع فاز validation به تعويق بيندازيم. به اين ترتيب، ترتيب دو تراكنشي كه زمان شروع آنها حدودا با هم برابر است به اين بستگي پيدا مي كند كه كدام يك فاز read‌ خود را زودتر به پايان برسانند. در شكل 3 شرايطي را مي بينيد كه در آن T1‌ زودتر از T2 شروع شده است ولي فاز read‌ خود را ديرتر از T2‌ به پايان برده است.

 

شكل 3

 

انتخاب پايان فاز read به عنوان زمان اختصاص شماره تراكنش موجب مي شود كه زمان لازم براي فاز validation كاهش يابد و در كل بازدهي را بهبود خواهد بخشيد.

 

2. روشهاي جديد و بهبود يافته براي كنترل توزيع شده همزماني

 

با وجود اينكه مي توان از متدهاي ذكر شده (S2PL و روش خوشبينانه) در سيستمهاي توزيع شده بهره جست، با اين حال اين روشها مشكلاتي را به دنبال دارند. براي اسنفاده از روش قفل گذاري محدود دو مرحله اي در يك محيط توزيع شده بايد از يك پروتكل توزيع شده مديريت بن بست و يك پروتكل commit دو مرحله اي (2PC) ياري جست. لذا استفاده از اين روش هنگامي كه تراكنشها طولاني هستند با كاهش بازدهي جدي روبرو خواهد بود. روش خوشبينانه نيز زماني در يك محيط توزيع شده قابل استفاده است كه در اين محيط مكانيزمي براي انجام فاز validation به صورت توزيع شده وجود داشته باشد. بعلاوه اين روش در زماني كه طول تراكنشها زياد است با مشكل پايين بودن بازدهي شديد روبرو خواهد بود زيرا ممكن است به rollback هاي زيادي بيانجامد. مكانيزم ديگري كه در [4] بحث شده است از مهر زماني (timestamp) كمك مي گيرد. هر تراكنشي هنگام ورودش به سيستم زمان ورودش را ثبت مي كند. در توالي اجراي دستكاري هاي اشياء اطلاعاتي بايد اين ترتيب ورود در نظر گرفته شود. اين مكانيزم نيز با مشكل تعداد rollback‌ هاي زياد در هنگام طولاني بودن طول تراكنشها روبروست. علاوه بر مشكل بازدهي، اين روش با مشكل شناخته شده و معروف ديگري تحت عنوان زمان سراسري و همزمان سازي ساعت در سيستمهاي توزيع شده نيز دست و پنجه نرم مي كند[4]. در ادامه اين گزارش به بحث پيرامون يك روش اشتقاقي از روش تست گراف توالي پذيري نا متمركز يا Decentralized Serialization Graph Test(DSGT) پرداخته خواهد شد. اين روش در [5] توضيح داده شده است و بازدهي آن در مقايسه با روش S2PL‌ در محيط توزيع شده مورد بررسي قرار گرفته است.

 

2-1. گراف توالي پذيري

قبل از اينكه DSGT‌ توضيح داده شود، شرح مختصري خواهيم داشت درباره گراف توالي پذيري. اين گراف براي مشخص كردن همه تداخلات ممكن (بالقوه)‌ ميان تراكنشها مورد استفاده قرار مي گيرد. يك گراف توالي پذيري براي يك زمانبندي S مشتمل است بر :

1-     يك گره براي هر تراكنش commit شده در S.

2-     يك يال از T(i) به T(j) اگر يكي از اعمال T(i)‌ قبل از يكي از اعمال T(j) انجام شود و در عين حال با آن تداخل هم داشته باشد [1].

 

با يك مثال با موضوع بيشتر آشنا خواهيم شد.زمانبندي شكل 4 را در نظر بگيريد:

 

شكل 4

گراف توالي پذيري اين زمانبندي در شكل 5 مشخص شده است:

 

شكل 5

 

مهمترين نكته در مورد گراف توالي پذيري اين است كه يك زمانبندي توالي پذير متداخل (conflict serializable) است، اگر و فقط اگر گراف توالي پذيري آن دور داشته باشد[1].

 

2-2. روش تست گراف توالي پذيري نامتمركز (DSGT)

حال كه با مقدمات لازم آشنا شديم مي توانيم نگاه عميقتري به پروتكل DSGT داشته باشيم. در اين پروتكل هر تراكنش گراف توالي پذيري محلي مربوط به خود را نگهداري مي كند كه بيانگر تداخل هايي است كه اين تراكنش در آنها شركت دارد. اساسا، اين گراف حداقل شامل همه تداخل هايي است كه باعث مي شود تراكنش به تراكنشهاي ديگر وابسته باشد. به زودي خواهيم ديد كه چرا همين اطلاعات مختصر براي تصميم گيري در مورد اينكه چه موقع تراكنش commit‌ بشود كافي است. به خاطر داشته باشيد كه به تراكنشها زماني اجازه داده مي شود commit بشوند كه تمام تراكنشهايي كه اين تراكنش به آنها وابسته بوده است commit شوند.

پروتكل DSGT مبتني بر ملاحضات زير است :

1-    وابستگيهاي مابين تراكنشها توسط خود آنها قابل تشخيص و مديريت است، لذا به هيچ هماهنگ كننده مركزي اي نيازي وجود ندارد و پروتكل كاملا به صورت توزيع شده عمل مي كند.

2-    اجراي درست همه تراكنشها به صورت سراسري با وجود همان اطلاعات ناقصي كه تراكنشهاي وابسته به هم با رد و بدل كردن پيغام بين هم به دست مي آورند حاصل خواهد شد و نيازي نيست كه همه تراكنشها از كل گراف توالي پذيري سرتاسري اطلاع داشته باشند.

در ادامه اين ملاحضات DSGT تضمين مي كند كه يك تراكنش تنها زماني commit‌ شود كه همانند روش خوشبينانه همه تراكنشهاي قبل از آن commit شده باشند. يك تراكنش اطلاعات مربوط به تراكنشهاي پيش از خود را از طريق برقراري ارتباط و رد و بدل كردن پيغامهايي با سايتهايي كه تراكنشهاي پيش از خودش مشغول خواندن و يا اعمال تغييرات در آنها هستند به دست مي آورد. اصولا هر سايتي كه كه شامل تعدادي شيء داده اي براي درخواست و يا تغيير است ليستي از داده هايي كه روي آنها تداخل وجود دارد و تراكنشهايي كه موجب اين تداخلات روي اين اشياء داده اي شده اند نگهداري مي كند. تراكنشي كه اين اشياء داده اي را براي خواندن و يا تغيير از سايت مربوطه درخواست مي كند اطلاعات جانبي مربوط به تداخلات را نيز از ليست تداخلات آن سايت دريافت مي كند و از روي اين اطلاعات گراف محلي خود را تكميل مي كند. اين اطلاعات براي اين منظور استفاده مي شود كه تراكنش به صورت اتوماتيك خودش بتواند تصميم بگيرد كه commit بشود يا نه. اگر در زمان commit يك تراكنش متوجه بشود كه به تراكنش ديگري وابسته است صبر مي كند تا commit آن تراكنش را از سايت مربوطه دريافت كند. بنابراين به عنوان يك بخش ضروري در اين پروتكل هر تراكنش موظف است كه پس از commit شدن، اين مطلب را به همه تراكنشهايي كه منتظر commit شدن او هستند اطلاع دهد.

از آنجايي كه اين روش نيز يك روش خوشبينانه است همه خواندن ها و تغييرات قبل از چك كردن براي تداخل انجام مي گيرد و چك كردن تداخل بعدا صورت مي گيرد(مثل روش خوشبينانه سنتي). همانند روش خوشبينانه سنتي براي حل وابستگيهاي دوري انجام عمل rollback در بسياري موارد ضروري مي شود. همچنين به دليل خوشبينانه بودن اين روش همانند روش سنتي از rollback هاي موضعي استفاده مي شود تا زماني كه وابستگيهاي دوري خود را نشان دهند. توجه داشته باشيد كه در اين مكانيزم برعكس همه فعاليت ها نيز مي تواند انجام پذيرد. اين سرويسها تحت عنوان سرويسهاي جبران شناخته مي شوند و در حين rollback‌ هاي موضعي مورد استفاده قرار مي گيرند. وقتي تراكنشي تصميم به commit مي گيرد پيغامي به همه سايتهايي كه داده هاي آنها را دست كاري كرده يا خوانده ارسال مي كند و در پاسخ ليستي از تراكنشهايي كه منتظر او هستند را از آن سايتها دريافت مي كند و از اين ليست براي مطلع كردن آنها از commit‌ شدن خود استفاده مي كند.

در شكل 6 وضعيت هاي مختلفي كه يك تراكنش در حين اجراي سرويسهاي موجود روي سايت هاي مختلف مي‌تواند به خود بگيرد را مشاهده مي نماييد:

شكل 6

تغيير وضعيت هاي زير در اين دياگرام در نظر گرفته شده اند:

-      تغيير ازforward execution به validation : اگر يك تراكنش اجراي همه سرويسهاي درخواستي خود را با موفقيت به پايان برساند وارد فاز validation مي شود.

-      تغيير از validation‌ به backward execution : اگر تراكنشي تشخيص بدهد كه در يك دور قرار گرفته و بايد rollback شود به وضعيت backward execution‌ مي رود.

-      تغيير از forward execution‌ به backward execution : اين تغيير وقتي رخ مي دهد كه تراكنش بايد rollback‌ شود به دليل rollback شدن يكي از تراكنش هايي كه به آنها وابسته است و يا وقتي كه گراف توالي پذيري محلي شامل دور است و اين تراكنش طعمه rollback‌ شناخته مي شود.

-      تغيير از backward execution‌ به forward execution : به محض اينكه تمام سرويسهاي احضار شده مورد نياز جبران شدند تراكنش دوباره به وضعيت forward execution‌ باز مي گردد.

-      تغيير از validation به inform peers : اين تغيير وضعيت زماني رخ مي دهد كه در حاصل validation‌ مشخص شود كه اين تراكنش در گراف توالي پذيري محلي داراي يال ورودي است و به عبارت ديگر تراكنشهاي ديگري منتظر commit‌ شدن اين تراكنش هستند.

-      تغيير از inform peers به inform Txs : اين تغيير وضعيت زماني رخ مي دهد كه تمام سايتهايي كه خبر commit‌ شدن به آنها ارسال شده بود پاسخ بدهند.

 

از آنجايي كه هيچ تراكنشي قبل از اينكه تمام تراكنشهايي كه به آنها وابسته است commit‌ نشوند، commit نمي‌شود، لذا اين پروتكل يك زمانبندي توالي پذير را تضمين مي كند[7].

 

در يك جمع بندي كلي پروتكل DSGT اجراي سرتاسري درست تراكنشها را بدون نياز به يك هماهنگ كننده مركزي (coordinator) امكانپذير مي سازد. ايده اصلي اين پروتكل اين است كه وابستگيهاي مابين تراكنشها توسط خود آنها مديريت شود. فرايند موجود شباهت زيادي به روش خوشبينانه سه مرحله اي دارد، البته از اين لحاظ كه هيچ مكانيزم قفل گذاري اي براي نوشتن و يا خواندن اشياء داده اي در آن استفاده نمي شود، در عوض تراكنشها انجام مي‌شوند تا به فاز validatoin‌ برسند و در آنجا بر اساس اينكه تداخلي با تراكنشهاي ديگر دارند يا خير rollback‌ يا commit‌ مي شوند. مكانيرم تشخيص تداخل با ساير تراكنشها از طريق گراف توالي پذيري صورت ميگيرد. يكي از نكات حائز اهميت در اين روش استفاده از rollback‌ هاي موضعي است. استفاده از اين پروسه به خصوص زماني اهميت خود را نشان مي دهد كه از انتشار abort در سيستم جلوگيري مي كند و به اين ترتيب در بازدهي كار تاثير به سزايي بر جاي خواهد گذاشت.

 

 

3. مقايسه DSGT‌ با S2PL

در ادامه مقاله نتايج تجربي پروتكل توزيع شده DSGT‌ با تكيه بر rollback‌ ها موضعي آورده شده است اين نتايج با S2PL مقايسه شده است. در دياگرام زير مقايسه بازدهي DSGT‌ را با S2PL در شرايطي كه تداخلي نداريم مشاهده مي كنيد.

شكل 7

همانطور كه در نمودار شكل 7 مي بينيد، DSGT (منحني بالايي) در بالاي S2Pl‌ (منحني پاييني) قرار دارد. در شرايطي كه تداخل وجود ندارد همانگونه كه مي بينيد با بالا رفتن تعداد سرويسها بازدهي بالا مي رود. در اين شرايط S2PL به دليل سربار ناشي از گرفتن قفل هاي بيهوده(با اينكه تداخل وجود ندارد باز هم قفل مي گيرد) همواره پايين‌تر از DSGT است. در شرايطي كه تداخل وجود داشته باشد بديهي است باز هم كارايي روش DSGT‌ از S2PL پايين تر خواهد بود. در اين شرايط پايين بودن كارايي S2PL به اين دليل است كه با گرفتن قفلها ساير تراكنشها نمي توانند ادامه پيدا كنند و تراكنشهاي كوچك ممكن است پشت تراكنشهاي طولاني تر منتظر بمانند و اين پديده با افزايش تعداد سرويسها شدت بيشتري خواهد گرفت و بازدهي را پايين تر خواهد آورد. بعلاوه ميزان رد و بدل شدن پيامها نيز در روش S2PL بسيار بيشتر از روش DSGT‌ خواهد بود كه اين واقعيت پهناي باند زيادي را از شبكه هدر خواهد داد.

 

4. Replication و پروتكل DSGT

در پروتوكل DSGT‌ اي كه شرح داده شد فرض بر اين است كه در سيستم نوعي partitioning‌ صورت گرفته و هر بخش از اطلاعات در سايت به خصوصي قرار دارد و در يك سيستم peer2peer‌ سايت ها با يكديگر ارتباط دارند. آنچه حائز اهميت است اين است كه در چنين سيستمي نمي توانيم replication‌ داشته باشيم. لذا روش ارائه شده براي سيستمهاي توزيع شده اي كه مبتني بر replication‌ هستند مناسب نمي باشد. علت اين مطلب اين است در روش شرح داده شده هر تراكنش براي دستيابي به اطلاعات يك وب سايت محدوديتي ندارد و عمل چك كردن محدوديتها تنها در فاز validation صورت مي گيرد. فرض كنيد داده اي در چند سايت replicate‌ شده باشد و سه تراكنش مختلف هر كدام يكي از replica‌ ها را دستكاري اطلاعاتي كنند. در چنين شرايطي مكانيزمي براي ايجاد سازگاري ميان كپي هاي مختلف داده اجباري است و در غير اين صورت مفهوم replication را نخواهيم داشت. براي بهبود اين روش و تغيير آن به گونه اي كه از replication نيز پشتيباني نمايد تا روشي ارائه نشده است. در گزارش بعدي در صورت پيدا كردن روشي مناسب براي حل اين مشكل، روش ارائه شده شرح داده خواهد شد.

 

 

5. منابع

 

[1] Ramkrishnan, Gehrke, “Database Management Systems Third Edition”

[2] H. T Kung, J. T. Robinson, “On Optimistic Methods for Concurrency

Control”, ACM 0362-5915/81/0600 1981.

[3] S. Chen, Y. Ling, “Stochastic Analysis of Distributed Deadlock Scheduling” ACM 1-58113-994-2/05/0007 2005.

[4] G. Coulouris, J. Dollimore, T. Kindberg, “Distributed Systems Concepts and Design” third Edition 2001

[5] K. Haller, H. Schuldt, C. Turker, “Decentralized Coordination of Transactional Processes in Peer-to-Peer Environments.

ACM 1-59593-140-6/05/0010 2005.

[6] A.Silberschatz, H.F.Korth, S. Sudarshan, Database System Concepts(Book)

[7] K. Haller, H. Shuldt, C. Turker. A fully Decentralized approach to coordionating Tranactional processes in peer-to-peer environments. Technical report 463, ETH Zurich, Switzerland, 2004.

 

 

+ نوشته شده در  چهارشنبه بیست و ششم دی 1386ساعت 18:10  توسط یوسف عبدلیان باریکرسفی  | 

بانكهاي اطلاعاتي توزيع شده

بانكهاي اطلاعاتي توزيع شده

(گزارش شماره 1)

 

پدرام قدس نيا

اشكان بياتي

 

دانشکده مهندسی برق و کامپيوتر

دانشگاه تهران

 

 

فهرست مطالب :

 

مقدمه

1. ذخيره اطلاعات به صورت توزيع شده

2. تراكنشهاي توزيع شده

3. مديريت همزماني در بانكهاي اطلاعاتي توزيع شده

4. مديريت بن بست

5. سنكرون كردن اطلاعت كپي شده

6. منابع

 

 

مقدمه

بانك هاي اطلاعاتي توزيع شده متشكل از سايتهايي غير وابسته هستند كه هيچ منبعي را به صورت فيزيكي به اشتراك نمي گذارند. هر سايت مي تواند در اجراي تراكنشي كه منجر به دستيابي به اطلاعات يك يا تعداد بيشتري سايت ديگر مي شود شركت نمايد. تفاوت اصلي مابين بانكهاي اطلاعاتي متمركز و توزيع شده اين است كه در بانكهاي اطلاعاتي متمركز همه اطلاعات در يك نقطه متمركز شده است در حالي كه در بانكهاي اطلاعاتي توزيع شده ممكن است قسمتهاي مختلف اطلاعات در نقاط مختلف توزيع شده باشند و يا اينكه كپي هاي مختلفي از اطلاعات در نقاط مختلف نگهداري شوند[1].

 

1. ذخيره اطلاعات به صورت توزيع شده

 

ذخيره اطلاعات به صورت توزيع شده به دو روش Replication يا Fragmentationو يا تركيبي از اين دو روش انجام مي گيرد. در روش Replication دقيقا يك كپي فيزيكي از اطلاعات در نقاط مختلف سيستم يعني ساير سايتها ذخيره مي گردد ولي در روش Fragmentation‌ اطلاعات به چند بخش يا پارتيشن تقسيم مي شود و هر بخش در يكي از سايتها نگهداري مي شود. در روش تركيبي اطلاعات به چند بخش تقسيم مي شوند و از تعدادي از بخشها و يا همه آنها كپي هايي در سايتهاي مختلف نگهداري مي شود. روش Fragmentation به دو طريق عمودي و افقي صورت مي گيرد. در روش عمودي تقسيم بندي يك Relation روي فيلدها صورت مي گيرد. يعني هر بخش از اطلاعات مشتمل بر تعدادي از فيلدهاي Relation‌ است ولي در روش افقي تقسيم بندي روي ركوردهاي Relation‌ صورت مي گيرد. براي مثال ركوردهاي مربوط به ماه خرداد در يك بخش و ركوردهاي مربوط به ماه تير در بخش ديگري ذخيره مي گردند. در روش عمودي براي دستيابي به Relation اوليه بايد بين بخش هاي مختلف join‌ بزنيم و در روش افقي براي دستيابي به آن بايد از اجتماع استفاده نماييم.

محاسن روش Replication عبارتند از:

·    در دسترس بودن :‌ در شرايطي كه يكي از سايتها بنا به دليلي از بيفتد حداقل يك سايت ديگر وجود دارد كه مي تواند دسترسي به اطلاعات سايت از كار افتاده را امكان پذير سازد. پس اگر درخواست دسترسي به اطلاعاتي كه مربوط به يك سايت از كار افتاده است، صادر شود، پاسخگويي به اين درخواست از طريق سايت ديگري كه replication اي از سايت از كار افتاده را در اختيار دارد امكان پذير مي شود.

·    افزايش توانايي موازي سازي : در صورتي كه چندكپي از اطلاعات در سايتهاي مختلف وجود داشته باشد در هنگام درخواست خواندن اين اطلاعات مي توان به صورت موازي بخشي از اطلاعات را از يك سايت و بخشهاي ديگر آن را از سايتهاي ديگر خواند و به اين طريق عمل خواندن حجم زيادي از اطلاعات را به صورت موازي و با هزينه اي كمتر انجام داد.

معايب روش Replication :

·    افزايش سربار بروزرساني اطلاعات :‌ به دليل اينكه از يك داده كپي هاي مختلفي در سايتهاي مختلف وجود دارد در هنگام تغيير دادن اين داده بايد همه كپي هاي آن را نيز تغيير داد تا سازگاري در كل سيستم حفظ شود كه اين كار سرباز زيادي به همراه دارد.

·    پيچيدگي در مديريت همزماني :‌ به دليل اينكه از يك داده چند كپي وجود دارد مديريت Lock در اين روش پيچيدگي بيشتري را نسبت به روش متمركز به همراه خواهد داشت.

به طور كلي روش Replication بازدهي عمل خواندن را بالا برده و در دسترس بودن ايجاد مي كند ولي براي عمل نوشتن بهينه نيست و سربار اضافي دارد.

 

2. تراكنشهاي توزيع شده

 

هر سايتي يك مدير تراكنش دارد كه وظيفه آن حفظ خصوصيت هاي ACID در همان سايت است. همچنين هر سايت يك هماهنگ كننده تراكنش (Transaction Coordinator) دارد كه وظيفه آن اين است كه در مورد تراكنشهايي كه از آن سايت شروع مي شوند:

-        تراكنش را شروع كند

-        تراكنش را به تعدادي زير تراكنش تقسيم كند و آنها را بين مديران تراكنش سايتهاي مربوطه توزيع كند.

-    تراكنش را به پايان برساند يعني يا آن را commit كند و يا در صورت commit نشدن تراكنش را در همه سايتهاي شركت كننده در آن Abort‌ كند.

 

علاوه بر مشكلاتي كه در سيستمهاي متمركز به وجود مي آيد مانند خطاي نرم افزاري، خطاي سخت افزاري، خطاي ديسك و ... نوع ديگري از خطاها در سيستم هاي توزيع شده وجود دارد كه از اين دست مي توان به از كار افتادن يك سايت، گم شدن پيغامها، قطع شدن يك لينك ارتباطي و يا تقسيم شدن شبكه به دو بخش نا متصل اشاره نمود.

در سيستم توزيع شده ممكن است يك پيغام گم شود و يا خراب شود كه براي رفع اين مشكل از پروتكل هاي انتقالي مانند TCP استفاده مي شود.

 

3. مديريت همزماني در بانكهاي اطلاعاتي توزيع شده

 

همانطور كه در يك سيستم متمركز براي برقراري همزماني مابين فراروندها از يك پروتكل Lock‌ استفاده مي كنيم در سيستمهاي توزيع شده نيز از يك پروتكل Lock استفاده مي كنيم با اين تفاوت كه اين پروتكل براي سيستم هاي توزيع شده طراحي شده است. برخي از اين پرتكل ها عبارتند از Single Lock Manager، Primary Copy، Majority Protocol، Biased Protocol و ...

در Single Lock Manager يكي از سايتها را Lock Manager مي كنيم. هر كس كه بخواهد Lock يا Unlock بكند از اين سايت درخواست مي كند. وقتي سايتي درخواست Lock‌ مي كند اگر بتواند Lock را به آن مي دهد و در غير اين صورت آن را در صف آن Lock قرار مي دهد.

محاسن اين روش عبارتند از : سادگي پياده سازي و مديريت Deadlock همانند روش متمركز.

معايب اين روش عبارتند از :‌ تبديل سايتي كه مدير Lock روي آن قرار دارد به گلوگاه سيستم و از كار افتادن كل سيستم در صورت از كار افتادن مدير Lock.

در Primary Copy‌ به ازاي هر داده اي كه از آن چند كپي در سيستم وجود دارد يك Primary Copy‌ داريم و زماني كه مي خواهيم Lock را بگيريم به سراغ Primary Copy ‌ مي رويم.

عيب اين روش اين است كه ممكن است سايتي كه Primary Copy‌ را در اختيار دارد از كار بيفتد ولي كپي آن موجود باشد. در اين شرايط به دليل اينكه Lock فقط بايد روي Primary Copy‌ گرفته شود لذا امكان تغيير داده وجود نخواهد داشت در حالي كه بايد بتوان داده را در كپي هاي آن در سايت هاي سالم تغيير داد.

در Majority Protocol بايد براي گرفتن Lock از داده اي كه n كپي از آن وجود دارد حد اقل به سراغ n/2+1 كپي از آن برويم و از آنها Lock‌ بگيريم.

عيب اين روش اين است كه ممكن است در حين Lock گرفتن روي يك داده هم بن بست به وجود بيايد. فرض كنيد مي خواهيم روي داده اي Lock بگيريم كه 4 كپي از آن وجود دارد. اگر از دوتا از كپي ها Lock بگيريم و قبل از گرفتن Lock‌ از سومي پروسه ديگري از دوتاي ديگر Lock بگيرد در اين شرايط دو پروسه منتظر همديگر مي مانند و براي دسترسي به يك داده بن بست به وجود مي آيد. اين در حالي است كه حتي در سيستم هاي متمركز نيز براي دستيابي به يك داده به تنهايي به اين شكل هيچگاه بن بست به وجود نمي آيد.

در Biased Protocol‌ بين خواندن و نوشتن تفاوت قائل مي شويم. براي خواندن گرفتن Lock‌ از هر كدام از سايتها كافي است اما براي نوشتن بايد از تمام كپي ها Lock بگيريم. بازدهي اين مكانيزم خود را در سيستمي به خوبي نشان مي دهد كه توالي خواندن در آن بيشتر از توالي نوشتن باشد.

 

 

 

4. مديريت بن بست

 

همانگونه كه در سيستم متمركز از wait for graph استفاده مي شود در اينجا نيز از همين روش استفاده مي شود با اين تفاوت كه در اينجا بايد wait for graph‌ مربوط به همه سايتها را جمع كنيم و يك global wait for graph‌ بسازيم. اين كار بر عهده يكي از سايتها گذاشته مي شود. در global wait for graph‌ به دنبال دور مي گرديم. چنانچه دوري پيدا شد يك يا چند تا از تراكنش ها را Abort‌ يا Rollback‌ مي كنيم. مشكل اينجاست كه اين wait for graph‌ به صورت آنلاين ساخته نمي شود و لذا ممكن است براي مثال دوري تشخيص داده شود در حالي كه يكي از تراكنشها بنا به دليلي Abort‌ كرده باشد و در واقعيت دوري وجود نداشته باشد و به خاطر تشخيص اشتباهي كه داده شده است يكي از تراكنشهاي مفيد كه مي توانسته به پايان برسد بيهوده Abort شود.

در هنگام به وجود آمدن بن بست براي اينكه بتوانيم بهترين و مناسب ترين تراكنش را براي Abort كردن انتخاب كنيم بايد همه تراكنش ها و همه منابعي كه آنها براي commit‌ شدن نياز دارند را بشناسيم. به اين كار مساله پيدا كردن مجموعه مينيمم Abort‌ مي گويند كه در[2] به آن اشاره شده است. همچنين براي بالا بردن بازدهي كار مي توان از مكانيزم check pointing‌ استفاده نمود. در اين روش به جاي Abort‌كردن تراكنش در قسمتي از آن check point‌ قرار مي دهيم و در صورت لزوم به آن check point‌ ، rollback‌ مي كنيم[3] . اين روش موجب مي شود كه حداقل تا حدودي از انجام دوباره كارهايي كه تا به اينجا انجام شده است جلوگيري شود.

براي رفع مشكل Deadlock‌ سه روش وجود دارد: Deadlock Prevention ، Deadlock Avoidance و Deadlock Detection and Resolution . تجربه نشان داده است كه روشهاي اول و دوم راههاي مقرون به صرفه اي نيستند و در برخي از موارد نمي توان حتي آنها را عملي نمود. در عمل در جاهايي كه مساله بن بست موضوع مهمي به شمار مي رود از روش سوم يعني Deadlock Detection and Resolution استفاده مي شود. چنانچه در يك سيستم توزيع شده مرتبا از اين مكانيزم استفده شود به دليل رد و بدل شدن پيغامهاي زياد، بازدهي سيستم تا حد زيادي كاهش پيدا خواهد كرد و اين در حالي است كه ممكن است بن بست وجود نداشته باشد و مكانيزم جستجوي بن بست كار بيهوده اي انجام داده باشد. اگر هم اين مكانيزم دير به دير استفاده شود، در زماني كه بن بست وجود دارد، بدون توجه به آن تراكنشهاي جديد ديگري ممكن است به سيستم اضافه شوند و deadlock را توسعه دهند و لذا زمان Deadlock Resolution در چنين شرايطي به شدت افزايش خواهد يافت. در [4] ثابت شده است پريود زماني خاصي جود دارد كه چنانچه عمل جستجوي بن بست مطابق با آن صورت گيرد بازدهي عمل مديريت بن بست به حداكثر خود خواهد رسيد. اين توالي بهينه از O((αn)1/3) تبعيت مي كند كه در آن α نرخ به وجود آمدن بن بست در سيستم و n تعداد تراكنشها است.

 

5. سنكرون كردن اطلاعت كپي شده

 

در اين بخش به بررسي روشهايي كه براي سنكرون كردن تعدادي client كه به يك سرور مركزي متصل مي شوند و اطلاعات خود را با آن سنكرون مي كنند مي پردازيم. فرض كنيد تعدادي client داريم كه هر كدام به بخشي از اطلاعات سرور نياز دارند و اين اطلاعات را پس از دريافت از سرور درون خود به صورت Local نگهداري مي كنند. هر client‌ بنا به نياز اطلاعات Local خود را update‌ مي كند. در بازه هاي زماني خاصي client ها update‌ هاي خود را به سمت سرور مي‌فرستند. update ها حتي مي توانند بلافاصله به سمت سرور فرستاده شوند كه اين بستگي به مبايل يا غير مبايل بودن آنها دارد زيرا در سيستم هاي مبايل اصولا براي هر بار ارسال مقداري انرژي سربار مصرف مي شود ممكن است به صرفه اين باشد كه اطلاعات هر چند گاه يكبار به سمت سرور ارسال شود. حال فارغ از اينكه سياست ارسال Update‌ ها از سوي client‌ ها به سمت سرور چگونه است به اين مساله مي پردازيم كه سرور چگونه client ‌ ها را با هم سنكرون مي كند.براي روشن تر شدن مساله فرض كنيد client1‌ و client2 هر دو جدول A را از سرور دريافت كرده و در حافظه محلي خود نگه داشته اند. client1‌ سه ركورد به جدول محلي خود اضافه مي كند و client2 چهار ركورد به جدول محلي خود اضافه مي كند و يكي از ركوردهاي جدول محلي خود را نيز update مي كند بعد از مدتي و يا به طور همزمان با تغييرات هر كدام از client‌ ها اطلاعات update‌ شده خود را به سرور مي فرستند. سرور بايد بعد از اينكه اطلاعات همه را دريافت كرد، در بازه هاي زماني خاصي اطلاعات به روز شده را به همه client‌ ها ارسال كند تا client1‌ از تغييراتي كه client2 در جدول محلي خود داده بود با خبر شود و برعكس client2‌ نيز از تغييراتي كه client1 در جدول محلي خود داده بود آگاهي يابد. حال مشكل اينجاست كه عمل ارسال اطلاعات از سرور به client ها چگونه و به چه روشي صورت گيرد تا بهترين بازده را داشته باشد. همانطور كه مي دانيم سرور بايد اطلاعات بروز شده را به تك تك client‌ ها ارسال كند و چون اين عمل به صورت سريال انجام مي‌شود لذا افزايش تعداد client‌ ها مي تواند مدت زمان عمل synchronization را بسيار طولاني نمايد. فرض كنيد كه client‌ها مبايل باشند و پهناي باند ارتباطي نيز كم باشد و ارسال اطلاعات به روز شده به سمت هر client حدود 30 ثانيه طول بكشد. در چنين شرايطي چنانچه 100 عددclient داشته باشيم زمان synchronization در بهترين حالت 3000 ثانيه به طول مي‌انجامد. البته اين در حالتي است كه سرور تمام جدول بروز شده جديد را براي تك تك client‌ ها ارسال كند. علت اين امر اين است كه سرور نمي داند كه هر كدام از client ها نسبت به قبل چه تغييري كرده اند. اگر بخواهيم كاري كنيم كه سرور قادر باشد اين مطلب را بفهمد بايد به ازاي هر client يك نسخه جدول را روي سرور نگهداري كنيم و اين نسخه از جدول همواره با محتواي موجود در حافظه محلي client‌ مطابقت داشته باشد. يعني هر بار كه سرور اطلاعات update‌ از يك client ‌ دريافت مي كند قبل از اينكه update را روي جدول اصلي اعمال كند آن را روي جدول معادل با آن client روي سرور update كند. به اين ترتيب هميشه در سمت سرور مي دانيم كه جدول محلي client‌ نسبت به جدول سرور چه تغييري بايد بكند و لذا فقط تغييرات را براي آن مي فرستيم و اين عمل صرفه جويي زيادي در پهناي باند مي كند و سرعت synchronization‌ را نيز افزايش مي دهد ولي اين روش نياز به فضاي زيادي روي Hard Disk دارد و در عين حال I/O‌ بيشتري دارد واين فضاي مورد نياز با افزايش تعداد client ها افزايش مي يابد.

با توجه به مطالبي كه گفته شد در مي يابيم كه در عمل synchronization ‌ دو پارامتر پهناي باند و I/O نقش كليدي بازي مي كنند كه اين دو پارامتر در مقابل يكديگرند. يعني چنانچه پهناي باندكمي داشته باشيم براي رسيدن به سرعت synchronization‌ بالا بايد فضاي ديسك بيشتري داشته باشيم و برعكس چنانچه فضاي ديسك كمي با نرخ I/O پايين داشته باشيم بايد براي رسيدن به سرعت بيشتر در synchronization پهناي باند بيشتري داشته باشيم.

علاوه بر پارامترهايي كه ذكر شد پارامترهاي ديگري نيز در سرعت synchronization دخالت دارند . براي مثال تعداد فايلهايي كه باز ميشود به علت سرباري كه اطلاعات بخش header هر فايل دارد اهميت دارد و براي كاهش تعداد فايلها و در نتيج كاهش ميزان نقل و انتقال سربار مي توان چند فايل را با هم يكي كرد. پارامتر ديگر تعداد connection‌ هايي است كه به سرور صورت مي گيرد. اگر تعداد فايلها زياد باشد تعداد connection‌ ها نيز ممكن است زياد باشد. لذا به كمك برخي تكنيكها مي توان تعداد اين connection‌ ها را كم كرد. براي مثال چنانچه يكي از client‌ها سه جدول را در اختيار دارد اگر فايل مربوط به آن سه جدول در سمت سرور يك فايل باشد و به ازاي هر جدول فايل جداگانه اي در نظر گرفته نشده باشد، در چنين شرايطي با يك connection و با يكبار باز كردن آن فايل مي توان محتواي هر سه جدول را به يكباره و بدون سربارهاي اضافي header و connection به سمت سرور فرستاد. حال با در نظر داشتن دو پارامتر اول به بررسي دو پارامتر اخير مي پردازيم و با فرض اينكه مساله چگونگي پيدا كردن تفاضل ميان داده هاي روي سرور و داده هاي محلي روي client‌ حل شده است و الان اطلاعات مورد نياز براي update‌ كردن هر كدام از client‌ ها آماده است به بررسي متدهاي مختلفي مي پردازيم كه با تكيه بر آنها مي توانيم به حداكثر سرعت و در نتيجه كاهش زمان synchronization در شرايط مختلف بپردازيم. در مقاله [5] به بررسي سه مدل موجود براي گروه بندي جدولها يا به طور كلي آبجكت هاي اطلاعاتي بينclient هاي مختلف در سيستمي كه معرفي شد پرداخته شده است و قدرت و ضعف اين روشها در شرايط مختلف مورد تحليل قرار گرفته است.

 

اين سه مدل عبارتد از :

·        One-Per Object [OP]

·        Client-Centric [CC]

·        One-Giant [OG]

 

اين مدلها بر اساس دسته بندي Update File‌ ها بنا شده اند و علت اين دسته بندي يكي كردن Update file هايي است كه به صورت فيزيكي توسط هر client‌ مورد دسترسي قرار خواهند گرفت . همانطور كه قبلا هم گفته شد چنانچه يك client‌ با n جدول سر و كار داشته باشد به ازاي هر كدام از آن جدول ها در سمت سرور update file اي وجود خواهد داشت كه اطلاعاتي كه بايد به سمت client‌ فرستاده شود پس از محاسبات مربوطه در اينupdate file ‌ قرار دارد. حال مساله اي كه وجود دارد اين است كه چنانچه اين update file‌ ها از همديگر مجزا باشند براي ارسال آنها به صورت تك تك هزينه سربار براي connection و header فايل خواهيم داشت. از طرفي برخي از اين Update file‌ ها بين client هاي مختلف مشترك اند. براي روشن تر شدن موضوع فرض كنيد Update file ‌ هاي 1تا 5 ‌موجود باشند. client اول شماره هاي 1و2 را نياز داشته باشد. client دوم شماره هاي 1و2و3و5 ‌را نياز داشته باشد و client سوم شماره هاي 4و5 را . در چنين شرايطي يكي كردن اين Update file‌ ها درون يك فايل ممكن نيست مگر اينكه به صورت فيزيكي شماره هاي 1و2 را در يك فايل قرار دهيم و در فايل ديگري شماره هاي 1و2و3و5 را و در فايل ديگري 4و5 را . اين راه حل موجب افزونگي در نگهداري اطلاعات مي شود و در نهايت 3 فايل خواهيم داشت كه بخشهايي از آنها تكراري خواهد بود ولي در عوض هر كدام از client‌ ها مي‌توانند با ايجاد يك connection‌و باز كردن يك فايل همه اطلاعات update‌ خود را دريافت كنند. مسلما افزونگي ايجاد شده ممكن است در مواردي كه با تنگناي ديسك روبرو هستيم مشكل آفرين باشد. پس راه حل ديگر اين است كه همه update file‌ ها را در يك فايل بريزيم و آن فايل را به همه client ها ارسال كنيم و خود client‌ ها اطلاعات به درد بخور را از آن استخراج كنند كه اين روش مسلما مشكل پهناي باند را به دنبال خواهد داشت . زيرا در هر بار فايل بزرگي كه مقدار زيادي از آن بلا استفاده است به سمت client‌ها ارسال مي شود. حال به مدل هاي ارائه شده در مقاله بازمي گرديم.

همانگونه كه در شكل مي بينيد در اولين مدل كه OP‌ نام دارد هر Update file‌ در فايل مجزايي نگه داشته مي شود و لذا به ازاي دسترسي به هركدام از آنها بايد يك connection‌ برقرار شود. در دومين مدل به ازاي هر client‌ يك فايل در نظر گرفته مي شود كه update file‌ هاي مربوط به آن client در آن فايل ريخته مي شود و client كافي است كه براي دسترسي به همه اطلاعات مورد نيازش فقط همان فايل را باز كند. در سومين مدل همه update file‌ ها در يك فايل ريخته مي شوند و همه client‌ ها يك connection‌ براي دسترسي به آن فايل ايجاد مي كنند و همه فايل را دريافت مي كنند و بخشهاي مربوط به خود را استفاده مي كنند.

همانگونه كه گفته شد پارامترهاي ديسك ، نرخ I/O، تعداد connection ها ، تعداد فايلها، پهناي باند و حجم Update file‌ ها پارامترهاي تعيين كننده اي هستند كه مشخص مي كنند استفاده از كدام مدل مناسب تر است.

 

در ادامه مقاله به مقايسه مدلهاي ارائه شده با توجه به اين پارامترها پرداخته شده است. ابتدا اين مدلها از لحاظ ميزان مصرف ديسك در تعداد client‌ هاي مختلف با يكديگر مقايسه شده اند.

 

 

همانطور كه دراين نمودار مي بينيم فقط در حالتي كه يك client داريم روش CC از دو روش ديگر بهتر است. در اين حالت روش OG به دليل سربارheader فايل كمتر از OP بهتر است. اما همانگونه كه مشاهده مي نماييد با بالا رفتن تعداد client ها روش CC از دو روش ديگر بدتر مي شود و اين بدان دليل است كه به ازاي هر client يك فايل كه شامل تعدادي Update file است در سرور ساخته مي شود و در واقع Update file‌ ها تكراري تر مي شوند. در اين حالت مشاهده مي شود كه روش OG‌ همواره اندكي از OP بهتر است و اين به دليل سربار ناشي از header‌ فايلها است.

 

 

در اين نمودار به مقايسه مدلها از لحاظ زمان لازم براي Synchronization‌با توجه به تعداد client ها در پهناي باند 57.6Kbps پرداخته شده است. همانگونه كه مي بينيد در حالتي كه يك Client‌ داريم OP‌ از دو مدل ديگر بدتر است و علت آن، تعداد connection هاي زياد و زماني است كه براي برقراري اين connection ها صرف مي شود. در اين حالت CC‌ از OG بهتر است زيرا فقط Update file‌ هاي مربوط به client را به يكباره براي آن ارسال مي دارد ولي OG همه update file‌ها را به يكباره براي آن ارسال مي دارد و بايد از بين آنها update file‌ هاي مربوط به خود را جدا نمايد. در واقع اين اختلاف اندك مابين ايندو به دليل حجم اطلاعات ارسالي است.

با افزايش تعداد client‌ ها مشاهده مي شود كه OG‌ از دو روش ديگر به شدت بدتر مي شود و اين به دليل پهناي باند پايين و ارسال همه update file‌ ها به همه client ها مي باشد. درواقع پهناي باند كمي داريم و در اين پهناي باند كم اطلاعات اضافي زيادي فرستاده مي شود كه زمان Synchronization را به شدت افزايش مي دهد. دو روش ديگر در اين شرايط تقريبا مانند هم عمل مي كنند.

 

در اين نمودار به مقايسه مدلها از لحاظ زمان لازم براي Synchronization‌با توجه به تعداد client ها در پهناي باند 10Mbps پرداخته شده است. همانگونه كه مشاهده مي فرماييد در اينجا به دليل اينكه پهناي باند افزايش يافته تاخير مدل OG كاهش يافته است. در واقع در اينجا فرستادن همه update file‌ ها براي همه client‌ ها يك ضعف محسوب نمي شود زيرا به علت بالا بودن پهناي باند اين عمل سريع انجام مي شود. در اين حالت پارامتري كه اهميت خود را بيش از پارامترهاي ديگر نشان مي‌دهد زمان ساخته شدن update file‌ ها است. در مدل CC‌ به دليل تكرار شدن زياد داده ها عمل كپي كردن در ديسك زمانبر است. و در واقع حال كه پهناي باند زياد شده سرعت ديسك از آن عقب مانده است. پس مدلي كه سرعت ديسك كمتري نياز دارد موفق تر خواهد بود. به همين دليل مدل CC در اين حالت از دو مدل ديگر به شدت نا موفق تر است.

در واقع از اين مقاله نتيجه مي شود كه مدل سنتي CC‌ به دليل نداشتن قابليت گسترش مدل مناسبي نمي‌باشد زيرا نياز دارد كه سرور افزونگي زيادي را در ساخت Update file‌ ها تحمل كند و در شرايطي كه سرعت افزايش پهناي باند از سرعت افزايش نرخ I/O‌ بيشتر است اين مدل موفقيت كمتري خواهد داشت. در شرايطي كه تعداد client زيادي داريم مدل OP‌ بهتر عمل مي كند و چنانچه پهناي باند خيلي بالايي داشته باشيم مدل OG بر خلاف انتظار به دليل اينكه كمترين فشار را براي ساختن update file‌ ها به سرور تحميل مي نمايد بهترين بازدهي را دارد.

 

6. منابع :

[1] A.Silberschatz, H.F.Korth, S. Sudarshan, Database System Concepts(Book)

[2] I. Terekhov,T.Camp, Time Efficient Deadlock Resolution Algorithms

[3] R.Ramakrishnan, J.Gehrke (2000) Database Management Systems(Book)

[4] S. Chen, Y. Ling, Stochastic Analysis of Distributed Deadlock Scheduling

[5] W. Yee, O. Freider, Scalable Synchronization of Intermittently Connected

Database Clients

 

+ نوشته شده در  چهارشنبه بیست و ششم دی 1386ساعت 17:55  توسط یوسف عبدلیان باریکرسفی  | 

پیشرفت‌های لینوکس در Oracle 10g

اوراکل9i دارای انتخابی به نامVLM است که به اوراکل اجازه می‌دهد تا روی ماشین‌های 32 بیتی به واسطه استفاده از فایل سیستم اشتراکی (که بزرگ‌تر از چیزی هستند که سیستم‌های 32 بیتی می‌توانند آدرس‌دهی کنند) یک بانک اطلاعاتی و فضای حافظه ایجاد کند. با این حال اینگونه نتیجه‌گیری شده است که استفاده از این ویژگی می‌تواند باعث fragmentation در حافظه کرنل شود و این به‌خاطر نحوه معادل‌سازیmap) شدن) نواحی معین است. نتیجه این بود که در آنجا، روی تعداد پردازش‌هایی که می‌توانند پیوست شوند محدودیت وجود دارد. به وسیله همکاری باRedHat وSuSE ، اوراکل امکان پیشنهاد یک API به نام Remap File Pages که اکنون در RedHat Enterprise Linux 3 و در آینده در SuSE Linux Enterprise Server 9 وجود خواهد داشت را یافت Remap File Pages . ازfragmentation و نیز مورد استفاده قرارگرفتن مقدار زیادی از حافظه جلوگیری می‌کند. بنابراین سازمان‌ها می‌توانند اتصالات بیشتر و سریع‌تری داشته باشند و نیز پایداری‌شان افزایش یابد. Wim Coekaerts مدیر مهندسان شرکت اوراکل در زمینه لینوکس می‌گوید: “اگر چه این API به صورت یکpatch برای اوراکل9i در دسترس است، اما با اوراکل10g به درون خود برنامه آمده است.” او اضافه می‌کند:"بنابراین در حال حاضر، به صورت پیش‌فرض، وقتی شما پشتیبانی از VLM را فعال می‌کنید، این ویژگی به صورت اتوماتیک با استفاده از قابلیتRemap File Page راه‌اندازی خواهد شد". Direct I /O Support در گذشته، بانک اطلاعاتی اوراکل فقط در Oracle Cluster File System (OCFS) ازI /O های مستقیم پشتیبانی می‌کرد، ولی الان با اوراکل نسخه10g ، Network File System (NFS) نیزI /O مستقیم را در فایل سیستم پشتیبانی می‌کند. Coekaerts می‌گوید:"با اوراکل10g ، شما بدون نیاز داشتن به اعمالpatch ، پشتیبانی از I /O مستقیم در بانک اطلاعاتی خواهید داشت.” و اضافه می‌کند: " این می‌تواند کارآیی را واقعاً بهبود بخشد- به ویژه برایNFS که سرعت همه چیز را بالا می‌برد و واقعاً برای اجرایRAC مناسب است". بنابر گفته‌هایCoekaerts ، این ویژگی حتی روی یک سیستم تنها نیز واقعاً خوب است؛ چرا که شما مجبور نیستید در کاشه (cache) فایل سیستم OS خودend up caching data داشته باشید، اما در عوض می‌توانید از الگوریتم اوراکل برای آن استفاده کنید. نصب ساده و موثر Coekaerts می‌گوید:"در اوراکل10g ، نصب بانک اطلاعاتی فقط یکCD است؛ بنابراین شما می‌توانید در مدت 5 دقیقه یا کمی بیشتر، مراحل نصب را آغاز کنید که واقعاً زیبا و دیدنی است". برنامه سادهِ نصب‌کننده، برای نسخه‌های جدید لینوکس از جمله RedHat Enterprise Linux 3 و یا SuSE Service Pack 3 نیز به روز شده است، بنابراین مدیران سیستم هیچگونه نیازی به اعمال‌کردنpatch های ویژه سیستم عامل ندارند. ASM اوراکل10g دارای ویژگی جدیدی است که Automatic Storage Management نام دارد و به اوراکل اجازه می‌دهد تا بر روی کل فضاهای استفاده نشدهِ باقیمانده مدیریت داشته باشد. Coekaerts توضیح می‌دهد:"ما یک ماژول لینوکس اضافه کردیم که عملکرد جدید ASM را بالا می‌برد.” او ادامه می‌دهد:"ما یکDriver داریم که دیسک‌های در دسترس را اسکن می‌کند و آنها را برای اوراکل به صورت اتوماتیک آماده ساخته و مدیریت آنها را به آسانی انجام می‌دهد. اینDriver بر رویOTN در دسترس است، بنابراین مشتریانی که از اوراکل10g استفاده می‌کنند، می‌توانند از آن ماژولِ کرنل استفاده کرده و فقط دیسک‌هایی که والیوم های ‌ASM هستند را به سیستم متصل کنند. سپس وقتی اوراکل شروع به کار کرد، آنDriver فقط خبرش را به ماژول کرنل می‌دهد و همه دیسک‌ها را تعریف کرده و یکdevice ویژه می‌سازد و آن را برای انجام I /O به اوراکل اختصاص می‌دهد که خیلی شبیه است به I /O های آسنکرون (غیر همزمان) و به ما این امکان را می‌دهد که بعضی از کاوش‌های اتوماتیک دیسک‌ها را انجام دهیم و مسیرI /O را بهینه کنیم. Oracle Cluster File System اگر چه OCFS نسخه 1 همانطوری که با اوراکل9i کار می‌کرد، به خوبی با اوراکل10g نیز کار می‌کند، ولیOCFS نسخه 2 می‌تواند هر دوی Oracle Database وOracle Code را خودش بر روی لینوکس مدیریت کند. به عنوان مثال، یکAdmin ، روی چهار سیستم کهcluster شده‌اند (از معماریclustering استفاده می‌کنند) فقط باید یک نصب Oracle DB 10g انجام دهد و برنامه نصب‌کننده (installer) ، فایل سیستمcluster را متوجه خواهد شد و برنامه را در محل مناسبش بارگذاری خواهدکرد و خیلی راحت آن را گسترش داده و به‌روز رسانی می‌کند. Coekaertsتوضیح می‌دهد:"تصور کنید که شما هشت سیستم cluster شده دارید. قبل از OCFS نسخه 2، شما باید اوراکل را هشت مرتبه نصب کرده و هشت بار نیز patch ها را اعمال می‌کردید و حالا به جای آن، دارای یک home مشترک هستیم و شما می‌توانید تنها یکبار از روی یک فایل سیستم اوراکل را نصب وpatch های مورد نیاز را اعمال کنید- بنابراین OCFS مدیریت را تا حد بسیار زیادی ساده می‌سازد”.
+ نوشته شده در  سه شنبه بیست و پنجم دی 1386ساعت 12:8  توسط یوسف عبدلیان باریکرسفی  | 

گرید کامپیوتینگ در اوراکل

Oracle 10g  Available

Grid Computing

 یکی از معماری‌های جدید Computing  است. این معماری انجام محاسبات و سرویس دهی به جای استفاده از ابر کامپیوترها با فضاهای دیسک بالا و مقادیر زیادی از حافظه که خود مستلزم صرف هزینه های بالا‌ جهت خرید و نگهداری آنها است، می‌توان از کامپیوترهایی با پردازشگرها و هارد دیسک‌های معمولی و با تجهیزات عادی با هزینه‌هایی بسیار ارزان‌تر در تعداد بیشتر استفاده کرد. در نهایت، می توان این دستگاه‌ها را با ساختاری مناسب تبدیل به واحدی برای پردازش اطلاعات کرد. حتی در روشComputing  امکان استفاده از سیستم‌ عامل های متفاوت وجود دارد و مهم تر از همه آنکه انعطاف‌پذیری در تعویض هر کدام از اجزای اینGrid  موجب ایجاد هیچ گونه خللی در سرویس دادن به کاربران نمی‌شود.
 ORACLE 10gتوسط محیطEnterprise  خود، امکان دادن سرویس‌های گسترده‌ای را روی محیطGrid  فراهم آورده است. این تکنولوژی باعث کاهش هزینه‌های مرتبط در قسمت تکنولوژی فناوری اطلاعات شده است به طوری که با هر هزینه‌ای امکان استفاده از معماریGrid  وجود دارد. یکی از رقابت‌های موجود در بین پیاده‌سازی ساختارهای Grid توسط شرکت ها در فناوری‌اطلاعات، پیش‌بینیDowntime  های پایگاه داده و ارایه راه‌حل‌های متفاوت بسته به —نوع مشکل به وجود آمده —با استفاده از تکنولوژیGrid Computing است.
ORACLE 10g
با توجه به تقسیم‌بندی عواملی که باعث در دسترس نبودن یک پایگاه داده می‌شود راه‌حل‌های متفاوتی را ارایه کرده است.

Unplanned Downtime -1

مواردی که نمی‌توان کنترلی بر رویDown   بودن یک سیستم داشت، به عنوانUnplanned Downtime  شناخته می‌شوند.

1-1- Computer Failures:

از دلایلی که به طور ناخواسته سیستم و یا پایگاه داده را خارج از سرویس دهی می‌کند، مشکلاتی است که برای سخت افزار به وجود می‌آیدORACLE 10g . راه‌حلی را که برای این نوع خطا ارایه می‌دهد استفاده از

Fast Database Recovery وReal Application Cluster  است.

1-1-1- Real Application Cluster

در بحثClustering ، اوراکل قابلیت نصب به روی چند سیستم با معماری‌های متفاوت را دارد، در حالیکه تمام آنها به یکsingle shared database  دسترسی دارند و این مساله از دید کاربران سیستم وApplication  هایی که باDatabase  کار می‌کنند پنهان است و همه آنها چند سیستم را در قالب یکUnified Systemm می‌بینند. حسنClustring  در این است که بسته به بالا رفتنload  سیستم، امکان اضافه کردنnode  جدید بدون نیاز به جایگزین کردن کل پایگاه داده با یک مقیاس بزرگ تر وجود دارد. وجود دیسک‌های آرایه‌ای قدرت بیشتری به ORACLE 10g  جهت پیاده‌سازی Real Application Cluster   بخشیده است. در تکنولوژیApplication Clustering  به وجودآمدن مشکل برای یکی ازnode  های سیستم هیچ مانعی برای ادامه کار سایرnode ها به وجودنخواهد آورد و سایرnode  ها از در دسترس نبودنnode  مشکل دار، به سرعت آگاه خواهند شد و این آگاهی درORACLE 10g  در چند لحظه کوتاه مشخص خواهد شد و دیگر نیازی بهtime ou t  مربوط به پروتکلTCP/IP  نخواهد بود.

2-1-1- Fast Database Recovery :

Fast Database Recovery از امکانات دیگر اوراکل در مورد خطاهای ناشی از سخت افزار مانندcrash  کردن سیستم عامل است. که با بهینه‌سازی که درORACLE 10g  صورت گرفته، پایگاه داده به صورت اتوماتیک تعداد دفعات عملیاتcheck point  را جهتstartup  شدن سیستم بعد از حالتcrash  در دفعه بعد محاسبه خواهد کرد. به طوری که درORACLE 10g  سیستم به جای دقیقه‌ها انتظار برای در دسترس بودن برای کاربران ظرف چند ثانیه قادر به سرویس دادن مجدد خواهد بود.

2-1- Data Failure :

مواردی که باعث از بین رفتن اطلاعات مربوط به کاربران می‌شوند متفاوت است و می‌توان علت آن را در Storage hardware   ،  Human error ،Corruption  وSite Failure  جست وجو کرد.

1-2-1- Storage Hardware:

 Automatic Storage Management که به اختصارASM  نامیده می‌شود، ازVolume Manager های قوی مربوط بهDatabase ORACLE 10g  است که بدون نیاز به نصب نرم‌افزار جدید و یا تهیه سخت افزاری خاص به صورت مستقیم باKernel Oracle  کار می‌کند. این‌Volume Manager امکان پخش کردن همه فایل ها به رویStorage های متفاوت و همچنین امکان(Stripe Aَnd Mirror Everything) SAME  که نوعیmirroring  است را نیز فراهم می‌آورد کهDBA  را قادر به مدیریتStorage  های پایگاه داده خود به صورت ساده می‌کند.

2-2-1- Human Error:

برای رفع مشکل کاربرانی که اطلاعات خود را به صورت ناگهانی و ناخواسته توسط خودشان از دست می‌دهند،ORACLE 10g  راه حلی را با نام تکنولوژی Flash Back ارایه کرده است. این تکنولوژی ازOracle 9i  وجود داشته است ولی در نسخه01g  امکانات بیشتری به آن اضافه شده است.

از جمله می‌توان به:

    Flashback ,Transaction Query,

   Flashback  Versions  Query

Flashback   Database,

اشاره کرد که بسته به حالت های مختلف حتی یک کاربر بدون مراجعه بهDBA  این امکان را برای خود فراهم می‌کند که اطلاعات از دست رفته خود را باز گرداند بدون اینکه نیاز به ایجاد وقفه در کار کاربران دیگر و همچنینDown  کردن پایگاه داده جهت برگرداندن نسخه پشتیبان باشد.

تکنولوژی که در Flashback  استفاده می‌شود، نوعی گرفتنContinuous Backup  یا Storage Snapshot توسط خودDatabase Oracle  است که باعث می‌شودRecovery  یک پایگاه داده01g  از ساعت ها و روزها به چند دقیقه تقلیل پیدا کند.

3-2-1- Data Corruption:

Data corruption زمانی به وجودمی‌آید که یک دستورI /O  از طرف پایگاه داده جهت دسترسی به یک رکورد داده می‌شود ولی آدرس مقصد برای دسترسی به اطلاعات که توسط سیستم عامل بهDatabase Oracle  داده می‌شود اشتباه استOracle Hardware Assisted Resilient Data (HARD)  برنامه‌ای است که قبل از رجوع به نقطه‌ای از هارد دیسک جهت بازیابی اطلاعات با الگوریتم خاص مسیرdata  ذخیره شده روی دیسک توسط پایگاه داده را ارزیابی می‌کند و از صحت مسیر اطمینان حاصل می‌کند تا از به وجودآمدن مشکل فوق جلوگیری کند.

4-2-1- Site Failures :

از جمله مشکلاتی که پایگاه داده را در مقیاسی بزرگ تر غیر قابل دسترسی می‌کند، می‌توان به بلایای طبیعی از جمله زلزله و سیل اشاره کرد که باعث از دست رفتن اطلاعات می‌شوند که جهت رفع مشکلoracle  امکانData Guard  خود را به عنوان یک راه‌حل ارایه می‌دهد که در واقع نوعیStandby copy  از پایگاه داده می‌شود که این امکان را برایDatabase Administrator  فراهم می‌آورد که نسخه کپی را در مکانی خارج از سایت و پایگاه داده اصلی آن سوی دنیا پیاده‌سازی کند. در این روش کلیه تغییراتی که بر روی پایگاه داده اصلی انجام می‌شود ، یک نسخه از آن به رویStandby Database  کپی می‌شود، تا هنگام بروز مشکل برای پایگاه داده اصلی، پایگاه دادهStandby Database  جایگزین آن شود بدون کمترین مقدار در از دست دادن اطلاعات.

Pianned Down Time -2

تغییراتی که در جهت ارتقای سیستم ها و یا موارد عملیاتی مانند تهیه نسخه پشتیبان و مدیریت بهینه سیستم هستند، جز زمان های در دسترس نبودن پایگاه داده به صورت قابل پیش‌بینی به حساب می‌آیند. از جمله بهData Changes  وSystem Changes  می‌توان اشاره کرد که برای حالت Data Changes ‌می‌توان به امکاناتPARTITION TABLE  و ساختنINDEX  اشاره کرد که وجود این امکانات باعث افزایش مدیریت بهتر حافظه و بالا رفتن سرعت می‌شودSystem Changes . از موارد دیگری است که به عنوانPlanned Down Time  به حساب می‌آید. در این حالت پایگاه داده برای اضافه کردن و یا حذف کردن سخت‌افزار در دسترس نخواهد بود کهORACLE 10g  از امکاناتی به نامDynamic Resource Provisioning  استفاده می‌کند و عملیاتی از جمله اضافه کردن و یا کم کردن پردازشگر را بهSMP Server  فراهم می‌کند و یا اضافه کردن و یا کم کردنnode  به Real Application Cluster  و حذف و اضافه هارددیسک بدون ایجاد و اختلال در فعالیت پایگاه داده را انجام می دهد.

+ نوشته شده در  سه شنبه بیست و پنجم دی 1386ساعت 11:53  توسط یوسف عبدلیان باریکرسفی  | 

اصول هسته Grid Computing :

دو اصل در هسته Grid Computing آنرا به طور منحصربفردی از دیگر روشهای Computing ازقبیل Mainframe ، Client/Server یا چند لایه ای (Multi-tier) متمایز می سازد : مجازی سازی و تأمین.


 

    * با مجازی سازی ، منابع خاص (مانند رایانه ها ، دیسکها ، اجراء نرم افزاری و منابع اطلاعاتی) به عنوان منابع درهم آمیخته و مشترک جهت دسترسی مصرف کنندگان (از قبیل افراد و برنامه های نرم افزاری) بطور انتزاعی در نظر گرفته می شود.مجازی سازی یعنی شکستن اتصالاتی که بسختی بین ارائه کننده و مصرف کننده (مشتری) منابع برقرار شده است و مهیا ساختن منابع برای سرویس دهی به نیازهای خاص ، بدون اینکه مشتری نگران چگونگی انجام آن باشد.
    * تأمین یعنی اینکه ، وقتی مشتری از طریق لایه مجازی سازی نیاز به منبع خاصی دارد ، در پشت پرده ، آن منبع جهت انجام در خواست ،شناسایی شده و به مشتری تخصیص داده شود.تأمین بعنوان بخشی از Grid Computing به این معنی است که سیستم تعیین می کند چگونه نیاز مشتری را برآورده سازد در حالیکه عملیات در کل ، به صورت بهینه انجام شود.
 


 

برای نمونه می توان از Oracle 10g به عنوان تنها DBMS پیشتاز در این زمینه یاد کرد که در مقاله بعدی این جنبه ار Oracle 10g را بررسی خواهیم نمود.


 

+ نوشته شده در  سه شنبه بیست و پنجم دی 1386ساعت 11:28  توسط یوسف عبدلیان باریکرسفی  | 

پیاده سازی محیط Grid و برنامه نویسی موازی

سیستم های Grid   نوعی از سیستم های توزیع شده یا موازی هستند که اشتراک ، انتخاب و جمع آوری منابع را در فواصل جغرافیایی فراهم می اورد. بر اساس این تعریف ملاحظه میشود که امکان اجام کارها بصورت موازی وجود دارد.شاید مهمترین دلایل استفاده از سیستم های موازی  را بتوان در 4 مورد زیر خلاصه نمود:

1-  Application ها بطور حریضانه به دنبال منابع هستند .

2-       کامپیوترهای موجود معماری تک پردازنده و ترتیبی دارند .

3-       پیشرفت تکنولوژی شبکه های کامپیوتری .

4-       محدودیت فیزیکی سخت افزارها در افزایش سرعت .

با توجه به موارد فوق درمی یابیم موازی سازی یک امر ضروری برای انجام کارهای بزرگ و سنگین می باشد.با انجام موازی سازی  قابلیتهایی نظیر ،توازن سازی ،همپام سازی ، در دسترس بودن ، انعطاف پذیری و کاهش هزینه  امکان پذیر میشود.اما برای نوشتن برنامه های موازی به محیطی نیاز است که این کار انجام گیرد .در این مورد کلا" دو دیدگاه وجود دارد .

الف Implicit parallelism

در این دیدگاه موازی سازی توسط زبانها و کمپایلرهای موازی پشتیبانی میشوندو تمامی عملیات مربوط به موازی سازی در آن زبانها یا کمپایلرها حمایت می شوند.این زبانها و کمپایلرها خاص ابر رایانه ها طراحی میشوند.

ب Explicit parallelism

در این دیدگاه زبان موازی نداریم ، در واقع از همان زبانهای سریال استفاده میشود و این برنامه نویس است که موازی سازی را انجام می دهد.برای این منظور برنامه نویس می بایست قسمتهای موازی را تشخیص داده و بکمک ابزار برنامه نویسی آنها را از هم جدا کند. این روش که در سیستم های Grid و Cluster کاربرد دارد برنامه به بخشهای زیر تقسیم می شود :

1-       تقسیم بندی فرایندها 

2-       نگاشت روی پردازنده ها

3-       ساختارهای ارتباطی

سپس می بایست مدل برنامه نویسی موازی تعیین گردد .بطور کلی مدلهای برنامه نویسی موازی بصورتهای زیر وجود دارد :

1-  Share memory

در این حالت معماری مابصورت  حافظه مشترک بوده و دستورات بصورت Read  و Write می باشند.برخی از این ابزار  عبارتند از : DSM ، Java ، Openmp.

2-       Message passing

در این حالت در محیط شبکه هر سیستم حافطه و پردازنده خودش را دارد و از دستورات Send و Receive  استفاده میشود. برخی از این ابزار  عبارتند از : MPI و PVM

تذکر: نسخه تحت ویندوز MPICH می باشد که شامل توابع کتابخانه ای برای نوشتن برنامه های موازی است .در پروژه نیز ما از این ابزار استفاده کرده ایم .

3-       Hybrid

به ترکیبی از دو مدل فوق اشاره دارد .برخی از این ابزار  عبارتند از MPI,Openmp.

4-       Object & Service Oriented

این ابزار در سطح کاربر بوده و بالاتر از Middleware قرار می گیردولی کارایی کم میشود.برخی از این ابزار  عبارتند از Dcom و Corba .

برای انجام برنامه نویسی موازی می بایست بخشاهای زیر را در کد ایجاد کرد و رعایت نمود:

1-  Partitiong  که برای بخش بخش کردن Task بکار می رود.

2- Communication  برای برقرای ارتباط بین بخشهای جدا شده در فاز اول می بایست رعایت شود.

3- Agglomeration که نحوه اتصال دو بخش فوق را بعد از برقرای ارتباط و بخش بندی را مشخص می کند.

4-      Mapping/Scheduling که نسبت دادن کارها به پردازندها را انجام میهد بطوریکه زمان انجام کار حداقل شده و راندامان بالایی داشته باشیم .

برنامه نویسی موازی یک Task  پیچیده است زیرا برنامه هایی را که مینویسیم شامل بخشهای موازی است .ابزارهای برنامه نویسی کمک می کنند تا حدی این پیچیده گی کاهش یابد.برای نوشتن برنامه ای موازی به چنین محیطهایی نیاز داریم .مهمترین نکته ای که از دیدگاه کاربر مهم است آنستکه برخی از چیزها را Transparence کنیم و همچنین بتوانداز مفاهیم قبلی برنامه نویسی استفاده نماید.

در این روش برنامه به یکسری زیر برنامه تقسیم می شود و هر بخش از آن بین گره های شبکه اجرای می گردد.هر زیر برنامه بصورت ترتیبی نوشته شده است ولی چون همه پردازنده ها موازی برنامه را اجرا می کنند در نتیجه برنامه موازی اجرای میشود.متغیرهایی که روی هر پردازنده اجرا میشوند کاملا"Private هستند و برای ارتباط فقط از مبداء به مقصد پیام ارسال میشود.

همانطور که اشاره شد برای انجام برنامه نویسی موازی از ابزار MPICH که کتابخانه ای از توابع موازی را فراهم می آورد استفاده شده است .هدف از این پروژه انجام عملیات ضرب ماتریس بصورت موازی است .همانطور که در نمودارملاحظه میشود این پروسه روی چندین ماشین اجرا شده است .با افزایش تعداد ماشینها سرعت انجام عملیات نیز افزایش می یابد.

MPICH  ابزاری است که توابع استاندارد  کتابخانه ای MPI را برای اجرا در انواع سیستم ها فراهم می آورد. این ابزار در سیستم های عامل NT4,window 2000,windows xp  و Windows server قابل استفاده است و هر جا که ارتباطات بصورت TCP/IP وجود دارد قابل بکارگیری است.همچنین برای کمپایل برنامه های نوشته شده از محیط    6.x++ VC بهره می بریم .

در این برنامه عمدتا از دستورات انتقال پیام استفاده شده است و باتوجه به کاربرد این دستورات در برنامه این دستورات را بصورت زیر شرح می دهیم .

همانطور که ذکر شده این برنامه براساس Message passing کار می کند .بطور کلی به دو صورت گروهی (Collective) و نقطه به نقطه (Point to point) انتقال پیام انجام میشود.در حالت اول یک فرستنده به چندین گیرنده پیام را ارسال می کند.و در حالت نقطه به نقطه یک فرستنده و یک گیرنده داریم که پیام را بیکدیگر ارسال می نمایند.این روش خود بصورتهای زیر انجام میشود:

1-     سنکرون : در این حالت دقیقا وقتی که گیرنده می خواهد داده را بردارد، فرستنده متوجه میشود.به عبارتی وقتی کار ارسال  پیام تمام شد فرستنده متوجه میشود و ادامه کار منوط به این است گیرنده داده را بردارد. برای مثال ماشین فاکس چنین خصوصیتی دارد.

2-     آسنکرون :در این حالت فرستنده از برداشتن داده توسط گیرنده آگاه نیست .به عبارتی وقتی پیام سیستم را ترک می کند متوجه نمی شویم که رسیده است یا نه . برای مثال سیستم پست نامه را میتوان نام برد.

3-       عملیات بلوک کردن :وقتی انجام میشود و نتیجه را باز می گرداند که عملیات تکمیل شده باشد.

4-     عملیات بدون بلوک کردن : در این حالت عملیات  شروع شده و معلوم نیست چه زمانی خاتمه می یابد.به عبارتی برای اطمینان از انجام عملیات باید تست انجام شود.برای مثال سمافور در سیستم عامل اینچنین است .

با توجه به مطالب فوق می توان دریافت که ارسال سنکرون Blocking و ارسال آسنکرون Non blocking است .

در مقابل ارتباطات گروهی قادر هستند که عملیات زیر را انجام دهند :

1-       میتوان از آنها بعنوان ارتباطات نقطه به نقطه  استفاده نمود.

2-       امکان انجام پردازشهای سنکرون ( Barrier) را دارد .

3-       قابلیت انجام ارتباطات یک به چند ( Broadcast ) را دارد.

4-       قابلیت انجام عملیات Reduction بدین معنی که ترکیب داده از پردازنده های متعدد  برای تولید نتیجه نهایی و بر آیند.

 

همانطور که اشاره شده MPI یک زبان نیست بلکه یک کتابخانه از توابع به منظور نوشتن برنامه های  موازی است و می بایست هدر فایلهای آن را در سورس برنامه معرفی نمود.فرمت توابع MPI  که بهنگام برنامه نویسی بکار گرفته میشود بصورت زیر است :

MPI_Xxxxx(parameter,…);

 

عمده توابعی که در برنامه استفاده شده است تقریبا" مشابه برنامه محاسبه عدد P می باشد.با این تفاوت که در این جا عملیات ضرب ماتریس انجام میشود. به منظور تمایز پروسس های مختلف اولین روتین که بکار می رود  MPI_Initاست .این روتین یک گروه یا Communicator ایجاد می کند و به تمام پردازنده هایی که در یک گروه هستند شماره ای اختصاص می دهد.به این شماره اصطلاحا" Rankگفته میشود.بصورت پیش فرض Masterشماره Rank صفر را می گیرد و بقیه پردازندهها به ترتیب شماره گذاری میشوند.در واقع Rank به پروسه IDاست .

الگوریتم کار  بدین صورت است که بعد از تعریف متعیرها ی مورد نیاز ،زمان شروع برنامه را ثبت می کنیم سپس برای نمایش شماره و نام ماشین پردازش گر از فرمان Fprintf استفاده کرده ایم که در واقع MyID و processor name را بر می گرداند.سپس تعداد سطر و ستون ماتریس مورد نظر را تعریف می کنیم .این مقادیر ثابت می باشند و انجام تغییرات آن منوط به دستکاری در سورس برنامه است.در واقع دو ماتریس 1000 در  1000 در  این برنامه  در  هم ضرب شده اند .که بصورت ریاضی بصورت 1000*1000*1000 تعریف میشود. در ادامه بعد از تخصیص حافظه مورد نیاز ماتریسها را بصورت تصادفی مقدار دهی می کنیم و در بخش آخر عملیات ضرب ماتریسها انجام میشود.برای این منظور ابتدا توسط تابع  MPI_Bcast اندازه  هر یک  از ماتریسها  برای بقیه گره ها معرفی می کنیم . در واقع در شرط اول فقط اطلاعات ماتریس ها برای ID صفر و رد شرط دوم اطلاعات مورد نیاز سایر گره ها مشخص میشود.در بخش عمل ضرب ماتریسها بدین صورت انجام میشود هر پروسس یک سطر از ماتریس را در کل ماتریس بعدضرب می کند .در این جا نتایج خروجی توسط تابع Printf چاپ نشده است و تنها زمان محاسبه وپردازش  چاپ گردیده است .

      سورس برنامه به پیوست تقدیم شده است ( برنامه و توضیحات روی CD نیز وجود دارد). برای       درک بیشتر برنامه توابعی که در  بکار رفته است را در ادامه به تفکیک شرح می دهیم :

1- MPI_Comm_Rank  : این تابع شماره Rank را بر می گرداند .برای مثال روی Master شماره صفر را میدهد .

2-       MPI_Comm_size : این تابع سایز گروه در Communicator را بر می گرداند به عبارتی تعداد پروسه هایی که در گروه وجود دارند را می دهد.

3-     MPI_Send : این تابع که به ارسال استاندارد مشهور است و مهم آنستکه که عملیات ارسال تکمیل شده باشد.به عبارتی زمانی کامل میشود که پیام ارسال شده باشد و از نوع Blocking  است .

4-       MPI_Recv : در تابع دریافت استاندارد  بااجرای Send ،طرف گیرنده ،بهنگام اجرای  Receive یک پیام به فرستنده ارسال می کند .

5-       MPI_Wtime : این تابع Wall clock رابر می گرداند .هر وقت بخواهیم زمان را اندازه گیری کنیم این تابع را بعد از Send  و بعد از Receive  صدا می زنیم .

6-       MPI_Bcast :از این تابع برای ارسال یک به چند استفاده می کنیم .به عبارتی از گره ریشه پیام را به یک سری از زیر گره های  ارسال می کنیم .

7-       MPI_Reduce : این تابع وظیفه ارسال نتایج حاصل از پردازش زیرگره ها را به گره ریشه را دارد.

8-       MPI_Barrier :از این تابع برای سنکرون کردن گره ها استفاده میشود. به عبارتی منتظر می ماند  تا الباقی گره ها نتایج را ارسال نمایند .

این برنامه در یک محیط شبکه Workgroup با 5 سیستم اجرا شده است . مشخصات این سیستم ها طبق جدول زیر است .

نام ماشین

نوع پردازنده

میزان حافظه اصلی

Laptop

1.6 centrino

512MB DDR

Hossini

1.83 dual core napa

512 MB DDR2/533

Hasani

3000 full cache LGA

512 MB DDR2/677

Ruhi

3000 full cache LGA

512 MB DDR2/677

Sabser(Server HP ML370)

Dual Xeon 3.6 2MB L2

2GB DDR2/677 ECC

 

همانطور که از جدول فوق پیداست  این 5 سیستم برای اجرای ماتریس 1000*1000 در نظر گرفته شده اند.همانطور که از نتایج خروجی و نمودار پیداست .با اجرای مرحله به مرحله برنامه زمان اجرای پردازش ثبت شده است .برای اینکه بتوانیم برنامه ها را بصورت موازی اجرا نمامیم می بایست در ابتدا MPICHرا در تمامی ماشینها نصب کنیم .بعد از نصب برای اینکه تمامی سیستم ها با هم کار کنند اولا یک کاربر مشترک با رمز عبور یکسان باید تعریف گردد و ثانیا در صورتیکه Firewall روی کارت شبکه سیستم فعال است باید غیر فعال گردد.در مرحله بعد با کاربر و رمزی که برای آن تعریف کرده ایم MPI registerرا اجرا می کنیم تا رجیستر گردد.سپس فایل کمپایل شده (فایل اجرایی برنامه ) در تمامی کامپیوترهای شبکه در یک پوشه که نام آن در تمامی سیستم ها یکسان است و به اشتراک گذاشته شده کپی می کنیم سپس از طریق MPIch Configure tool. لیست ماشینهای شبکه را اضافه می کنیم و برنامه را در ماشین Master اجرا می کینم در اولین مرحله با 1 ماشین بیشترین زمان انجام محاسبه ثبت شده است .با افزایش تعداد پردازنده ها تا 5 عدد کاملا" زمان پردازش بهینه شده و در کمترین مقدار خود قرار گرفته است .اما با زیاد کردن تعداد ماشین ها چون هر ماشین ممکن بوده است بیشتر از یک عمل را انجام دهد به علت وجود پروسه های مختلف برای تقسیم کار و همچنین به علت وجود سربار در ارتباطات زمان انجام پردازش سیر صعودی به خود میگیرد.همچنین نمودار نشان می دهد که همیشه با افزایش تعداد پردازنده ها زمان  پردازش افزایش نمی یابد و به علت وجود سربار سیستم بصورت None dedicate عمل خواهد کرد.

+ نوشته شده در  سه شنبه بیست و پنجم دی 1386ساعت 11:17  توسط یوسف عبدلیان باریکرسفی  | 

نحوه نصب گلوباس

به دلیل قولی که به بچه ها داده بودم قسمت اول نصب را برایتان می نویسم و

 

قسمت بعد را بعد از امتحانات مینویسم 

 

 لطفا نظر دهید چه مطالبی در این وبلاگ قرار دهم

 

برای نصب Globusموارد زیر را باید در نظر بگیریم

نسبت به نرم افزاری که از Globus دانلود کردیم باید linux مربوط به آن را نصب کرده

حال برای پیاده سازی باید ورژن جاوا در linux و gcc آن را چک کنیم که اگر آن ورژن ها را ساپورت نمی کرد آنها را نصب کنیم ورژن جاوا باید 1.6 باشد

 

برای چک کردن ورژن جاوا دستور زیر را در ترمینال تایپ می کنیم

 

Java -version

و برای update  ورژن جاوا مراحل زیر را انجام می دهیم

 

با این دستور java 1.6   از zip خارج می شود    

                                   

  (اسم فایل (java    tar xzvf

 

نکته: می توان برای سریعتر نوشتن اسم فایل حرف اول را نوشته و بعد Tabرا بزنید با این کار سریع بقیه اسم فایل را به صورت اتوماتیک می آورد

 

بعد محتویات java 1.6  را در شاخه HOME\USER  که رفته ایم OverWrite      می کنیم

به این ترتیب ورژن جاوا update  می شود

 

بعد ورژن gcc   را چک میکنیم با دستور زیر

 

gcc –v

باید ورژن gcc   4.1 نباشد چون باگ دارد می توان از ورژنهای

  3.2. 3.2.1 و  2.95.x استفاده کرد

و gccرا نمی توان  updateکردو نسخه ایی از linuxکه این ورژن را دارد نصب می کنیم

 

نرم افزار Tomcatرا هم باید نصب کرد ولی در زمان کامپایل به آن نیاز نداریم و در زمان Runtime  به آن نیاز داریم

اگراز لینوکس suse  استفاده میکنید به هیچ نرم افزار جانبی احتیاجی نداریم

با دستور زیر یک user به نام Globus  درست می کنیم

root# useradd globus

 

و از شاخه system \group and user.. می توان user  مورد نظر را ساخت

 

ودر شاخه usr/local/globus   محتویاتی که دانلود کردیم از  globusکپی     می کنیم و در آن شاخهf4  میزنیم و ترمینال باز میشود و دستورات زیر را تایپ می کنیم

 

نسبت به نام فولدری که در شاخه usr/local است نام آخرین فولدر را انتخاب می کنیم اگر فولدری که در این مسیر بود usr/local/globus-4.0.1  بود

این پیغام را باید تایپ کنیم

 

# mkdir /usr/local/globus-4.0.1
# chown globus:globus /usr/local/globus-4.0.1

حالا از user root خارج می شویم و به user Globus می رویم با سویچ کردن

و دستورات زیر را در کنسول تایپ می کنیم

 

معنی globus$ این است که از مسیری که هستیم این دستور را اجرا کنیم

و مثلا برای اجرای ./configure نباید اولش globus$ را تایپ کنیم و بعد از آن را. در اینجا  globus$یعنی در مسیر usr/local/globus-4.0.1 باشیم و

./configure --prefix=$GLOBUS_LOCATION را تایپ کنیم

 

globus$ export GLOBUS_LOCATION=/usr/local/globus-4.0.1
globus$ ./configure --prefix=$GLOBUS_LOCATION

 

اگر در root بودیم و ./configure می کردیم error می داد.

ولی حالا باید این پیغام را بدهد

1.      Optional Features:
2.        --enable-prewsmds       Build pre-webservices mds. Default is disabled.
3.        --enable-wsgram-condor  Build GRAM Condor scheduler interface. Default is disabled.
4.        --enable-wsgram-lsf     Build GRAM LSF scheduler interface. Default is disabled.
5.        --enable-wsgram-pbs     Build GRAM PBS scheduler interface. Default is disabled.
6.        --enable-i18n           Enable internationalization. Default is disabled.
7.        --enable-drs            Enable Data Replication Service. Default is disabled.
8.        [...]
9.      Optional Packages:
10.   [...]
11.   --with-iodbc=dir        Use the iodbc library in dir/lib/libiodbc.so.
12.                           Required for RLS builds.
13.   --with-gsiopensshargs="args"
14.                           Arguments to pass to the build of GSI-OpenSSH, like
15.                           --with-tcp-wrappers

 

 

 

در مرحله چهارم

 

     globus$ make

 

نکته :اگر شما یک log file  بخواهید  داشته باشید باید تایپ کنید

 

globus$ make 2>&1 | tee build.log

 

در مرحله پنجم و آخر

 

globus$ make install

 

در این مرحله کامل شده است Install و حالا شما باید پیکربندی کنید قسمتهایی که در زیر شرح داده شده است

 

توصیه میکنیم که Install  کنید هر security

حالا شما مراحل security را طبق این step ها باید نصب کنید

که در بر می گیرد   به دست آوردن host certificates و user certificates  و ساختن

grid-mapfile  که در صفحات بعدی به آن اشاره می شود

با security setup شما میتوانید شروع کنید سرور GridFTP

پیکربندی DB برای RFT  و پیکربندی  WS-GRAM

و شما همچنین میتوانید  شروع کنید یک GSI-OpenSSH daemon

و setup کنید یک سرور MyProxy و اجرا کنید RLS  و استفاده کنید CAS

 

 

قسمت security  را بعد از امتحانات می نویسم

 

 نوشته شده توسط:

یوسف عبدلیان باریکرسفی

 

Yousef_abdolian@yahoo.com

 

 

 

+ نوشته شده در  دوشنبه بیست و چهارم دی 1386ساعت 18:14  توسط یوسف عبدلیان باریکرسفی  | 

نحوه نصب Globus

به دلیل قولی که به بچه ها داده بودم قسمت اول نصب را برایتان می نویسم و

 

قسمت بعد را بعد از امتحانات مینویسم 

 

 لطفا نظر دهید چه مطالبی در این وبلاگ قرار دهم

 

برای نصب Globusموارد زیر را باید در نظر بگیریم

نسبت به نرم افزاری که از Globus دانلود کردیم باید linux مربوط به آن را نصب کرده

حال برای پیاده سازی باید ورژن جاوا در linux و gcc آن را چک کنیم که اگر آن ورژن ها را ساپورت نمی کرد آنها را نصب کنیم ورژن جاوا باید 1.6 باشد

 

برای چک کردن ورژن جاوا دستور زیر را در ترمینال تایپ می کنیم

 

Java -version

و برای update  ورژن جاوا مراحل زیر را انجام می دهیم

 

با این دستور java 1.6   از zip خارج می شود    

                                   

  (اسم فایل (java    tar xzvf

 

نکته: می توان برای سریعتر نوشتن اسم فایل حرف اول را نوشته و بعد Tabرا بزنید با این کار سریع بقیه اسم فایل را به صورت اتوماتیک می آورد

 

بعد محتویات java 1.6  را در شاخه HOME\USER  که رفته ایم OverWrite      می کنیم

به این ترتیب ورژن جاوا update  می شود

 

بعد ورژن gcc   را چک میکنیم با دستور زیر

 

gcc –v

باید ورژن gcc   4.1 نباشد چون باگ دارد می توان از ورژنهای

  3.2. 3.2.1 و  2.95.x استفاده کرد

و gccرا نمی توان  updateکردو نسخه ایی از linuxکه این ورژن را دارد نصب می کنیم

 

نرم افزار Tomcatرا هم باید نصب کرد ولی در زمان کامپایل به آن نیاز نداریم و در زمان Runtime  به آن نیاز داریم

اگراز لینوکس suse  استفاده میکنید به هیچ نرم افزار جانبی احتیاجی نداریم

با دستور زیر یک user به نام Globus  درست می کنیم

root# useradd globus

 

و از شاخه system \group and user.. می توان user  مورد نظر را ساخت

 

ودر شاخه usr/local/globus   محتویاتی که دانلود کردیم از  globusکپی     می کنیم و در آن شاخهf4  میزنیم و ترمینال باز میشود و دستورات زیر را تایپ می کنیم

 

نسبت به نام فولدری که در شاخه usr/local است نام آخرین فولدر را انتخاب می کنیم اگر فولدری که در این مسیر بود usr/local/globus-4.0.1  بود

این پیغام را باید تایپ کنیم

 

# mkdir /usr/local/globus-4.0.1
# chown globus:globus /usr/local/globus-4.0.1

حالا از user root خارج می شویم و به user Globus می رویم با سویچ کردن

و دستورات زیر را در کنسول تایپ می کنیم

 

معنی globus$ این است که از مسیری که هستیم این دستور را اجرا کنیم

و مثلا برای اجرای ./configure نباید اولش globus$ را تایپ کنیم و بعد از آن را. در اینجا  globus$یعنی در مسیر usr/local/globus-4.0.1 باشیم و

./configure --prefix=$GLOBUS_LOCATION را تایپ کنیم

 

globus$ export GLOBUS_LOCATION=/usr/local/globus-4.0.1
globus$ ./configure --prefix=$GLOBUS_LOCATION

 

اگر در root بودیم و ./configure می کردیم error می داد.

ولی حالا باید این پیغام را بدهد

1.      Optional Features:
2.        --enable-prewsmds       Build pre-webservices mds. Default is disabled.
3.        --enable-wsgram-condor  Build GRAM Condor scheduler interface. Default is disabled.
4.        --enable-wsgram-lsf     Build GRAM LSF scheduler interface. Default is disabled.
5.        --enable-wsgram-pbs     Build GRAM PBS scheduler interface. Default is disabled.
6.        --enable-i18n           Enable internationalization. Default is disabled.
7.        --enable-drs            Enable Data Replication Service. Default is disabled.
8.        [...]
9.      Optional Packages:
10.   [...]
11.   --with-iodbc=dir        Use the iodbc library in dir/lib/libiodbc.so.
12.                           Required for RLS builds.
13.   --with-gsiopensshargs="args"
14.                           Arguments to pass to the build of GSI-OpenSSH, like
15.                           --with-tcp-wrappers

 

 

 

در مرحله چهارم

 

     globus$ make

 

نکته :اگر شما یک log file  بخواهید  داشته باشید باید تایپ کنید

 

globus$ make 2>&1 | tee build.log

 

در مرحله پنجم و آخر

 

globus$ make install

 

در این مرحله کامل شده است Install و حالا شما باید پیکربندی کنید قسمتهایی که در زیر شرح داده شده است

 

توصیه میکنیم که Install  کنید هر security

حالا شما مراحل security را طبق این step ها باید نصب کنید

که در بر می گیرد   به دست آوردن host certificates و user certificates  و ساختن

grid-mapfile  که در صفحات بعدی به آن اشاره می شود

با security setup شما میتوانید شروع کنید سرور GridFTP

پیکربندی DB برای RFT  و پیکربندی  WS-GRAM

و شما همچنین میتوانید  شروع کنید یک GSI-OpenSSH daemon

و setup کنید یک سرور MyProxy و اجرا کنید RLS  و استفاده کنید CAS

 

 

قسمت security  را بعد از امتحانات می نویسم

 

 نوشته شده توسط:

یوسف عبدلیان باریکرسفی

 

Yousef_abdolian@yahoo.com

 

 

 

+ نوشته شده در  یکشنبه بیست و سوم دی 1386ساعت 16:16  توسط یوسف عبدلیان باریکرسفی  | 

فناوري‌ Grid - انقلابي در فناوري اطلاعات كه به ‌وعده‌هاي اينترنت عمل مي‌كند!

Grid Computing يا شبكه‌هاي متصل كامپيوتري مدل شبكه‌اي جديدي است كه با استفاده از پردازشگرهاي متصل به هم امكان انجام‌دادن عمليات‌ حجيم محاسباتي را ميسر مي‌سازد. Gridها در واقع از منابع كامپيوترهاي متصل به‌شبكه استفاده مي‌كنند و مي‌توانند با استفاده از برآيند نيروي اين منابع، محاسبات بسيار پيچيده را به‌راحتي انجام دهند. آن‌ها اين كار را با قطعه قطعه كردن اين عمليات و سپردن هر قطعه به‌كامپيوتري در شبكه انجام مي‌دهند. به عنوان مثال وقتي شما از كامپيوترتان براي مدتي استفاده نمي‌كنيد و كامپيوتر شما به‌ اصطلاح به‌وضعيت محافظ نمايشگر يا Screensaver مي‌رود، از پردازشگر كامپيوتر شما هيچ استفاده‌اي نمي‌شود. اما با استفاده از شبكه‌هاي Grid مي‌توان از حداكثر توانايي‌هاي پردازشگر‌ها استفاده نمود و برنامه‌اي را در كامپيوتر قرار داد كه وقتي از سيستم استفاده‌اي نمي‌شود، اين برنامه بتواند از نيروي بلااستفاده دستگاه بهره بگيرد و قسمتي از محاسبات بزرگ عملياتي را انجام دهد. در اين مقاله اين پديده در فناوري اطلاعات مورد بحث قرار مي‌گيرد و اهميت استفاده از اين فناوري، پيچيدگي‌ها، اجزاي تشكيل دهنده و استانداردهاي اين مدل بررسي مي‌شود و نشان داده خواهد شد كه با استفاده از اين مدل چگونه در وقت و زمان شما صرفه‌جويي مي‌شود. گفتني است در حال حاضر بزرگ‌ترين شبكه Grid جهان در خدمت پروژه SETI@home براي يافتن حيات هوشمند فرازميني قرار دارد. در شماره 55 ماهنامه شبكه مصاحبه‌اي اختصاصي با دكتر دان ورتيمر، دانشمند ارشد اين پروژه توسط سردبير ماهنامه انجام شده‌بود.


امروزه فناوري جديدي به‌ نام Grid به ‌عرصه ارتباطات الكترونيك قدم نهاده است كه براساسآن با دانلود كردن يك محافظ نمايشگر مخصوص مي‌توانيم به‌كامپيوترهاي شخصي خود اجازه دهيم كه وقتي از آن استفاده نمي‌كنيم، به ‌شبكه جهاني متصل شوند و به ‌سيستم‌هاي بزرگ تحقيقاتي اجازه دهند از منابع آزاد و بلااستفاده سيستم ما استفاده نمايند.

Grid computing چيست ؟
حدود 33 سال از به ‌وجود آمدن اينترنت مي‌گذرد و از سال 1989 كه وب پديد آمد، بيشتر مردم از آن استفاده مي‌كنند و به‌صورت بخشي از زندگي ايشان در آمده است. شايد علت اين استفاده زياد از اينترنت، استاندارد باز آن بوده است كه امكان ارتباط كامپيوترهاي مختلف را با يكديگر مهيا مي‌سازد. با استفاده از اينترنت مي‌توانيد از هر كامپيوتري كه به‌آن متصل است، ايميل بفرستيد و شخصي در آن طرف دنيا با كامپيوتري كاملاً متفاوت با كامپيوتر شما، آن ايميل را به ‌راحتي بخواند و به ‌شما ايميل ديگري بفرستد. امروزه تقريباً تمامي ‌شركت‌ها و سازمان‌هاي بزرگ، براي تبادل اطلاعات و فرستادن ايميل به‌مشتريان خود از اينترنت استفاده مي‌كنند. پرسش اين است كه آيا به‌راستي امكاناتي كه اينترنت در اختيار ما قرار مي‌دهد، فقط در فرستادن ايميل و داشتن وب‌سايت خلاصه مي‌شود؟ آيا اينترنت امكان استفاده از منابع سخت‌افزاري سيستم‌هاي ديگر را نيز به‌ ما مي‌دهد؟ پس از اينترنت چه ابزار يا بستري خواهد آمد؟

امروزه فناوري جديدي به‌ نام Grid به ‌عرصه ارتباطات قدم نهاده است كه براساس آن با دانلودكردن يك محافظ نمايشگر مخصوص مي‌توانيم به‌كامپيوترهاي شخصي خود اجازه دهيم كه وقتي از آن استفاده نمي‌كنيم، به ‌شبكه جهاني متصل شوند و به ‌سيستم‌هاي بزرگ تحقيقاتي اجازه دهند از منابع آزاد و بلااستفاده سيستم ما استفاده نمايد. كامپيوترهاي امروزي مانند مغز انسان معمولا از بخش كوچكي از توانايي‌هاي خود استفاده مي‌كنند و اغلب به‌ صورت غيرفعالند و منتظر اطلاعات ورودي مي‌مانند. تصور كنيد كه اگر از منابع سخت‌افزاري اين همه كامپيوتر غيرفعال استفاده شود و همه در يك كامپيوتر جمع شود، چه دستگاه پرقدرتي خواهيم داشت. Grid Computing با ‌كمك به اينترنت زمينه‌اي را فراهم آورده است كه بتوان با استفاده از آن، از منابع سخت‌افزاري سيستم‌هاي ديگر نيز استفاده نماييم.

ممكن است Grid براي افراد مختلف معاني متفاوتي داشته باشد، اما اگر بخواهيم تعريف ساده‌اي از آن داشته باشيم، مي‌توانيم بگوييم Grid Computing در واقع به‌شما اجازه مي‌دهد با استفاده از منابع سيستم‌هاي متصل به‌ شبكه و ايجاد يك منبع بزرگ از سرويس‌ها و امكانات اين سيستم‌ها، مركزي بزرگ و قدرتمند به‌ وجود آوريم كه توانايي انجام‌دادن عمليات بسيار پيچيده‌اي را داشته باشد كه يك سيستم به‌تنهايي نمي‌تواند انجام دهد. به‌نحوي كه از ديد استفاده‌كنندگان اين سيستم‌هاي بزرگ، اين عمليات تنها از طريق يك سيستم انجام مي‌شود.

Grid Computing در حقيقت نسل جديدي از شبكه‌هاي توزيع يافته است و همانند اينترنت به‌ كاربران خود اجازه مي‌دهد فايل‌ها را به ‌اشتراك بگذارند. به‌علا‌وه، منابع مشتركي از اطلاعات را براي استفاده‌كنندگان فراهم مي‌كند. با استفاده از اين سيستم‌ها مي‌توان منابع كامپيوترهاي ناهمگون را به‌اشتراك گذاشت. هدف اصلي Grid استفاده از اين منابع مشترك مانند قدرت پردازنده، پهناي باند، پايگاه اطلاعاتي و در اختيار گذاردن آن براي ‌كامپيوتر مركزي است.


انواع Grid
سيستم‌هاي Grid با توجه به‌ نيازهاي كاربران مي‌توانند در انواع مختلف مورداستفاده قرار گيرند. اغلب اين سيستم‌ها بر اساس نوع كاري كه انجام مي‌دهند، طبقه بندي مي‌شوند. از سه نوع اصلي اين سيستم مي‌توان از Gridهاي اطلاعاتي، Gridهاي جوينده منابع و Grid‌هاي محاسباتي نام برد.

Gridهاي اطلاعاتي يا Data Grid موظفند اطلا‌عات را ذخيره كنند و آن‌ها را در اختيار كاربران قرار دهند. كاربران اين سيستم‌ها بدون آن‌كه از موقعيت جغرافيايي و مكاني اين اطلاعات آگاه باشند، به ‌اطلاعات دسترسي دارند. مثلاً تصور كنيد كه دو دانشگاه در دو سوي دنيا يكي در ايران و ديگري در انگلستان روي يك مطلب علمي‌مشترك تحقيق مي‌كنند و هر يك از آن‌ها اطلاعات خاص خود را ذخيره مي‌كند و مي‌خواهد دانشگاه ديگر نيز به ‌برخي از ‌اين اطلاعات (نه تمامي‌آن) دسترسي داشته باشد. اين دانشگاه‌ها مي‌توانند از يك Data Grid استفاده كنند و اطلاعات خود را با ضريب امنيتي بالايي با هم به‌اشتراك بگذارند.

در اين نوع Grid دستگاه‌هاي متصل به‌سيستم نياز به‌قدرت زياد ندارند و فقط مسئول به ‌اشتراك گذاشتن اطلاعات هستند. از طرف ديگر Grid ‌هاي محاسباتي يا Computational Grid از آن جا كه نياز زيادي به ‌قدرت پردازنده‌ها دارند، بايد از ماشين‌هايي با قدرت بسيار بالا استفاده نمايند.

يكي ديگر از انواع Gridها، سيستم‌هاي جوينده منابع يا Scavenging Grid است. اين سيستم‌ها از تعداد زيادي كامپيوتر شخصي استفاده مي‌كنند و به‌صورت مداوم به‌دنبال ظرفيت‌ها، منابع آزاد و چرخه پردازنده (CPU cycle) كامپيوتر‌هاي متصل به ‌Grid هستند و از اين منابع استفاده مي‌نمايند. البته صاحبان اين كامپيوترهاي شخصي بايد قبلا‌ً اجازه استفاده از منابع بدون استفاده خود را بدهند.

اهميت Grid Computing
تقريبا در همه سازمان‌ها و شركت‌هاي بزرگ تعدادي كامپيوتر بدون استفاده وجود دارد. مثلاً سرورهاي يونيكس از تقريباً ده تا بيست درصد از ظرفيت حقيقي خود استفاده مي‌كنند و كامپيوترهاي شخصي حدوداً از 95 درصد از ظرفيت خود اصلاً استفاده نمي‌كنند. با استفاده از Grid Computing در يك سازمان يا شركت بزرگ مي‌توان از منابع بلا‌استفاده كامپيوترهاي سازمان كمال استفاده را برد و سرعت پردازش اطلاعات در سيستم‌هايي كه با كمبود حافظه مواجهند را جبران نمود. از طرف ديگر، سرعت نرم‌افزارهايي كه از اين منبع بزرگ سخت‌افزاري استفاده مي‌كنند، بسيار بالاتر خواهد بود و در نتيجه مي‌توانيم به ‌فكر درست كردن نرم‌افزارهايي با قابليت‌هاي بالاتر باشيم و منابع بيشتري را در اختيار استفاده‌كنندگان قرار دهيم.

Grid Computing مي‌تواند مزاياي زيادي براي مديران و برنامه‌نويسان داشته باشد. مثلاً با آن مي‌توان برنامه‌هايي كه نياز به‌حافظه زيادي دارند را اجرا نمود و به ‌اطلاعات، دسترسي آسان‌تري پيدا كرد. اصولا ًGrid Computingمي‌تواند به‌سازمان‌ها و شركت‌هاي بزرگي كه سرمايه هنگفتي را در IT هزينه كرده‌اند، كمك كند از سيستم‌هاي خود حداكثر استفاده را ببرند.

فناوري‌هاي Grid در واقع مي‌توانند از منابع و سيستم‌هاي غيرمتمركز پشتيباني كنند و امكان ارتباط سيستم‌ها را با هم فراهم ‌سازند. وقتي براي اولين بار فناوري Grid ابداع شد، هدف آن تنها به‌اشتراك گذاشتن منابع سيستم و در اختيارداشتن سيستمي‌قدرتمند بود و به‌طور كلي بيشتر در اختيار مؤسسات تحقيقاتي قرار داشت. اما امروزه از Grid توقع بيش‌تري مي‌رود و اهميت بيشتري پيدا كرده است؛ به‌ويژه در تجارت الكترونيك و سيستم‌هاي تجاري غيرمتمركز و توزيع‌يافته. به‌ عنوان نمونه، مدل تجارت الكترونيك B2B را در نظر بگيريد كه دو مؤسسه تجاري اطلاعات خود را از طريق اينترنت با هم مبادله مي‌كنند. Grid نيز مي‌تواند كاري مشابه ‌را انجام دهد و دو يا چند سيستم تجاري را به‌هم مرتبط سازد. به‌طوري كه بتوانند اطلاعات خود را به‌اشتراك بگذارند. فناوري Grid همچنين مي‌تواند راه‌حل مناسبي براي افزايش دسترسي، قابليت اطمينان و امنيت سيستم‌هاي غيرمتمركز نيز باشد.


ابزار قدرتمند Globus
يكي از قدرتمند‌ترين ابزارهاي ايجاد، كنترل و مديريت سيستم‌هاي Grid، ابزار Globus است. پروژه Globus حدود سال 2003 به‌صورت عملي درآمد. اين پروژه حاصل تلاش مشترك محققان و برنامه‌نويسان Grid در سرتاسر دنياست كه بر حول چهار محور بنا شده است: تحقيق، ابزارهاي نرم‌افزاري، آزمون و نرم‌افزار‌ها. اين ابزار در نسخه 2.2 خود خدمات بسياري به‌مديران سيستم‌هاي Grid ارائه مي‌كند كه مي‌توان به امنيت، مديريت منابع و مديريت دقيق اطلاعات اشاره كرد. Globus با در اختيار گذاشتن APIها و فايل‌هاي Header زبان C براي ساختن و كامپايل برنامه‌ها به ‌برنامه‌نويسان اجازه مي‌دهد سيستم‌هاي خود را به Grid متصل نمايند و به ‌مديران امكان مي‌دهد منابع متصل به Grid را به‌راحتي مديريت كنند.

اضافه براين، Globus با در اختيار گذاشتن Componentهايي مخصوص، كار مديران Grid را آسان‌تر مي‌كند. مثلاًGlobus يك ابزار بسيار كارا به‌نام Commodity Grid) COG) كه زبان‌هاي برنامه‌نويسي مانند Python، جاوا و فناوري‌هاي روز مانند سرويس‌هاي وب، كوربا و RMI را مي‌شناسد و مي‌تواند در دو بخش تهيه نرم‌افزارهاي سازگار با Grid و مديريت سيستم‌هاي Grid به ‌ما كمك كند. البته نسخه 2.2 ابزار Globus در برخي موارد ضعف‌هايي نيز دارد. اين نسخه از سرويس‌هايي مثل مديريت Life-Cycle يا چرخه زندگي نرم‌افزار و سيستم‌هاي ذخيره و بازيابي پشتيباني نمي‌كند. البته نسخه جديد Globus يعني نسخه 3 از آن جا كه سعي داشته است با معماري باز سرويس‌هاي Grid يا همان the Open Grid Services Architecture) OGSA) هم‌خواني داشته باشد، توانسته‌است بسياري از نقاط ضعف نسخه قبلي را رفع كند.


نگاهي به‌اجزاي Grid
اجزاي تشكيل دهنده grid عبارتند از:

- رابط كاربر

- اجزاي امنيت‌

- مديريت كنترل كار سيستم (Workload management)

- زمانبند (Scheduler)

- مديريت اطلاعات (Data Management)

- مديريت منابع (Resource management)

در اين قسمت به‌صورت مختصر در مورد هر يك از اين اجزا توضيح داده مي‌شود. دسترسي به ‌اطلاعات در Grid اهميت شاياني دارد و رابط كاربر يا User Interface اين مسئوليت مهم را عهده‌دار است. رابط كاربر مي‌تواند يا در برنامه‌اي كه كاربر از آن مستقيما استفاده مي‌كند يا در ابزارهاي مديريتي Grid كه مورد استفاده مدير سيستم است، نقش ايفا كند. همانطور كه شما براي استفاده از برق فقط وسيله برقي خود را به ‌پريز برق متصل مي‌كنيد و لازم نيست از مكان منبع يا منابع اصلي اين قدرت اطلاعي داشته باشيد، استفاده كننده سيستم Grid نيز الزاماً نبايد از پيچيدگي‌هاي داخل اين سيستم‌ها مطلع باشد. مثال ديگر اين‌كه، شما از مرورگر وب جهت استفاده از اينترنت استفاده مي‌كنيد؛ بدون اين‌كه از مكان سرور وب سايت اطلاعي داشته باشيد و تنها با وارد كردن آدرس سايت موردنظر، وب سايت آن در مرورگر نمايش داده مي‌شود. اينترفيس Grid نيز بايد مانند مرورگر باشد. يعني استفاده‌كننده Grid نيز از پيچيدگي‌هاي اين سيستم اطلاعاتي ندارد و فقط با ورود يك پارامتر ورودي، يك خروجي دريافت مي‌كند. (شكل 1)



شکل1- سيستم‌هاي Gird از ديد استفاده کنندگان

كامپيوترها در Grid به ‌شبكه متصلند. اين سيستم‌ها همچنين مي‌توانند حاوي اطلاعات بسيار مهم و حساسي باشند. در نتيجه امنيت را مي‌توان يكي از مهم‌ترين اجزايي اين سيستم‌ها دانست كه خود حاوي اجزاي فرعي مانند احراز هويت (authentication)، اختيارات (authorization) و رمزدهي (encryption) است.

مثلاً ابزار Globus حاوي يك Component به‌ نام Grid Security Infrastructure) GSI) يا ساختار زير بنايي امنيت Grid است كه مسئوليت امنيت در محيط را برعهده دارد. GSI حاوي يك SSL باز است. در نتيجه وقتي يك استفاده كننده يك بار به‌صورت مجاز به‌ سيستم راه پيدا كرد، يك Proxy Certificate براي كاربر به‌ وجود مي‌آيد و براي آن كاربر در نظر گرفته مي‌شود. GSI در درگاه Grid قرار دارد. (شكل 2)



شكل2- GSI در Gird

استفاده كننده از يك سيستم Grid بايد از منابع موجود و قابل دسترس در سيستم اطلاع داشته باشد. مديريت كنترل كار سيستم يا Workload Management مي‌تواند اين كار را به‌ راحتي انجام دهد. درخواست‌كننده سرويس مي‌تواند با ارتباط با اين قسمت از منابع آزاد سيستم، ظرفيت هر منبع و موقعيت آن‌ها اطلاع حاصل نمايد. در سيستم‌هاي Grid كه توسط Globus هدايت مي‌شوند، زماني كه يك استفاده كننده شناسايي شد و برنامه موردنظر آن كاربر اجرا گرديد، با توجه به ‌نوع نرم‌افزار و پارامترهاي ورودي كاربر، سيستم Grid به‌دنبال منابع آزاد موجود در شبكه مي‌گردد.

اين وظيفه اغلب به‌ عهده Broker ها است. Globus به‌صورت عادي، ‌Broker ندارند، اما از سرويس‌هايي مانند
Grid Information Service) GIS) و Monitoring and Discovery Service) MDS) را پشتيباني مي‌كنند كه به‌سيستم اطلاع مي‌دهند كدام منبع يا منابع قادرند منابع خود را در اختيار بگذارند. شكل 3 موقعيت اين سرويس‌ها را نمايش مي‌دهد.



شكل 3- موقعيت سرويس‌هاي MDS در Gird

يكي ديگر از اجزايي كه در سيستم‌هاي Grid بسيار اهميت دارد، زمانبند يا Scheduler است. در اين سيستم‌ها از آن جايي كه بايد هر كاري را كامپيوتر مشخصي به‌عهده بگيرد و هر كامپيوتر بايد مدت زماني را در اختيار Grid قرار دهد، سيستم نياز به‌ يك زمانبند دارد. اين زمانبند مي‌تواند بسيار ساده باشد، اما اكثر زمانبند‌ها بايد بتوانند كارها را اولويت‌بندي كنند و سيستم را كنترل نمايند. در ابزار Globus زمانبند‌هايي با قابليت بالا وجود ندارند، اما تعدادي سازوكار زمانبند وجود دارد كه كار زمانبندهاي دقيق را تا حدي انجام مي‌دهد. شكل 4 موقعيت زمانبند‌ها را در Grid نشان مي‌دهد.



شكل 4- موقعيت زمانبند‌ها در Grid

جزء ديگر Grid‌ها، مديريت اطلاعات اين سيستم‌ها است كه وظيفه ذخيره‌سازي اطلاعات را در سيستم به عهده‌ دارد. اين بخش وظيفه محافظت از اطلاعات و جابه‌جايي اين اطلاعات در تمامي‌دستگاه‌هاي متصل به ‌Grid را عهده‌دار است. جابه‌جايي و انتقال اطلاعات كار بسيار مشكلي است و اطلاعات بايد از كانالي مطمئن منتقل شود.

با استفاده از ابزار Globus و بخش مديريت اطلاعات اين ابزار، مي‌توان محيطي امن براي انتقال اين اطلاعات به ‌وجود آورد. اين قسمت از Globus به Grid Access to Secondary Storage) GASS) معروف است كه امكاناتي مانندGridFTP را دربردارد كه مانند FTP است، اما امكانات امنيتي مانند GSI را نيز دربرمي‌گيرد. در نتيجه وقتي يك كاربرProxy Certificate را داشته‌باشد، مي‌تواند از GridFTP جهت انتقال فايل‌ها استفاده كند؛ بدون آن كه نياز داشته باشد دوباره به‌ سيستم وارد شود. شكل 5 موقعيت GASS را در Grid نشان مي‌دهد.






شكل5- GASS در Gird

از ديگر بخش‌هاي مهم Grid، بخش مديريت منابع است كه به‌ Grid Resource Allocation Manager) GRAM) شهرت دارد. اين بخش وظايف هر دستگاه را مشخص مي‌كند و باعث هماهنگي دستگاه‌هاي متصل به ‌شبكه در انجام‌دادن امور محوله است. شكل 6 محل قرار گرفتن GRAM را نشان مي‌دهد.



شكل 6- بخش مديريت منابع در Grid

Grid از ديد برنامه نويسان


از ديد برنامه‌نويسان، Grid از سازمان‌هاي مجازي‌اي تشكيل شده است كه از پروتكل‌هاي مخصوصي براي ارتباط با هم استفاده مي‌كنند. اين پروتكل‌ها به ‌استفاده‌كنندگان Grid و برنامه‌ها اجازه مي‌دهند سرويس‌هاي خود را در محيطي كنترل شده و امن اجرا كنند. اين سازمان‌هاي مجازي مي‌توانند يك كامپيوتر شخصي، سروري قدرتمند يا كامپيوترهاي متصل به‌ شبكه باشند كه از آن جا كه پروتكل يكساني دارند، مي‌توانند با هم متصل باشند و از منابع يكديگر استفاده نمايند.

گروه جهاني Grid با ارائه معماري باز سرويس‌هاي Grid يا Open Grid Services Architecture) OGSA) و جمعآوري استانداردهاي باز، مانند زبان تعريف سرويس‌هاي وب يا Web Services Description Language) WSDL) توانسته است استانداردي آسان و در عين حال دقيق براي سيستم‌هاي Grid تعريف كند. از آن گذشته، OGSA از تجربيات به‌ دست آمده از پروژه‌هاي بزرگي مانند Globus نيز بهره‌مند است. شكل 7 ساختار معماري اين استاندارد را نشان مي‌دهد.



شکل 7- ساختار معماري باز سرويس هاي Grid


استانداردهاي باز و پروتكل‌هاي اين معماري راه توليد سرويس‌ها را نشان مي‌دهند. اين سرويس‌ها قلب Grid هستند و در واقع به ‌استفاده‌كننده اجازه مي‌دهند با Grid كار كند. اين سرويس‌ها عبارتند از:

- سرويس درخواست‌هاي پردازنده مركزي

- سرويس مديريت كنترل كار سيستم و sessionها

- سرويس جست‌وجوي اطلاعات

- سرويس تعيين پهناي باند شبكه‌

- سرويس مديريت اطلاعات‌

وقتي متخصصان Grid درباره شروع شدن يك سرويس صحبت مي‌كنند، مثلاً شروع شدن سرويس جست‌وجوي اطلاعات، منظور يك نمونه يا Instance سرويس است كه مي‌تواند تكاليف بلند مدت يا موقتي داشته باشد. اين سرويس‌ها مي‌توانند به‌صورت فعال يا غير فعال باشند و زمان فعاليت را مي‌توان با زمانبند يا به‌صورت اختياري تعيين نمود. ‌سرويسي خوب است كه بتواند به‌راحتي امكانات خود را در اختيار استفاده كننده قرار دهد. مثلاً وقتي يك وسيله الكترونيكي را به ‌پريز برق متصل مي‌كنيد، براي شما هيچ اهميتي ندارد كه برق مورد نيازتان از كجا مي‌آيد؛ فقط مي‌خواهيد از برق استفاده كنيد.

سرويس خوب Grid نيز سرويسي است كه بتواند سرويس موردنظر ‌استفاده‌كننده را به‌راحتي دراختيار او قرار دهد و استفاده‌كننده بتواند به ‌سادگي از آن استفاده كند. مثلا سرويس بانك‌اطلاعاتي در Grid بايد به‌صورتي عمل كند كه استفاده كننده فقط يك جست‌وجو وارد كند و جواب جست‌وجوي خود را بگيرد؛ بدون اين‌كه از جايگاه و عمليات بانك‌اطلاعاتي خبر داشته باشد.


پيچيدگي‌ها
اگر تصور مي‌كنيد سيستم‌هاي Grid پيچيده‌اند و ممكن است كار با آن‌ها مشكل باشد، كاملاً درست فكر مي‌كنيد. مثلاً سيستم‌هاي Grid بايد به‌سرعت قادر باشند منابع سيستم‌هاي متصل به‌آن‌ها را شناسايي كنند و در عين حال نبايد از سرعت و كارايي اين سيستم‌ها بكاهند. نكته بسيار مهم ديگري كه مشخصاً ارتباطي به ‌Grid ندارد ولي در اين سيستم‌ها تأثير‌گذار است، ساختن نرم‌افزارهايي است كه بتوانند با سيستم‌هاي Gird كار كنند.

امروزه بيشتر نرم‌افزارها مي‌توانند روي كامپيوتر‌هاي شخصي يا حتي سرور‌ها كار كنند. يعني در واقع اين نرم‌افزارها از يك پردازنده مركزي استفاده مي‌كنند، اما در سيستم‌هاي Gird، ممكن است چند پردازنده اين كار را به‌عهده بگيرند و چند سيستم با هم كار كنند. البته هر سيستم يك كار را انجام مي‌دهد. سپس نتايج محاسبات جمع مي‌شود و به ‌درخواست كننده سرويس برگشت داده مي‌شود.

وقتي يك نرم‌افزار يا مجموعه‌اي از نرم‌افزارها بخواهند از Grid استفاده كنند، مسئله به‌اشتراك گذاشتن اطلاعات، تكه تكه كردن اين اطلاعات، ‌انتقال آن با امنيت كامل و مديريت اين اطلاعات كار دشواري است و كاربر Grid فقط اطلاعاتي را وارد مي‌كند و نمي‌داند در داخل سيستم چه مي‌گذرد. در نتيجه اين سيستم‌ها بايد طوري اين كار را انجام دهند كه كاربران Grid بدون نگراني از انتشار اطلاعات سري خود يا بروز اشتباه در محاسبات، به ‌Grid اطمينان كنند.

امنيت سيستم‌هاي Grid نيز بسيار حائز اهميت است. كاربران اين سيستم‌ها بايد از دسترسي به‌منابع ايشان در سيستم اطلاع حاصل كنند و بدانند كدام كاربر به‌اطلاعات آن‌ها دسترسي دارد. اضافه بر اين، قابليت اطمينان و سرعت اين سيستم‌ها بسيار اهميت دارد. اگر سيستم‌هاي Grid از سرعت كافي برخوردار نباشد، كاربران Grid از استفاده از اين سيستم‌ها دلسرد مي‌شوند.

چگونه Grid بسازيم ؟
ممكن است پس از خواندن مطالبي كه تا اينجا گفته شد، به‌ اين فكر افتاده باشيد كه آيا مي‌توانيد خودتان يك Grid بسازيد؟ البته كه مي‌توانيد! مي‌توانيد از نرم‌افزارهاي منبع آزاد يا اپن‌سورس استفاده كنيد و يك محيط Grid بسازيد. اولين قدم براي شروع، دانلود كردن ابزار Globus است. Globus همان‌طور كه قبلاً نيز بحث شد، ابزاري است قدرتمند براي ايجاد و مديريت محيط Grid. همچنين، به‌ سرويس‌هايي براي ساختن Grid نياز داريد كه شامل سرويس مديريت اطلاعات، سرويس پرس‌و‌جوي اطلاعات، درخواست‌كننده نيروي پردازشگر، زمانبند و سرويس تقسيم‌كننده پهناي‌باند ‌باشند. اين سرويس‌ها به‌سرويس‌هاي Grid معروفند و در واقع همان سرويس‌هاي وب هستند؛ البته با قابليت‌هاي بيشتر و مرتبط با Grid. برخي از كامپيوترهاي شما كه به ‌شبكه Gird متصلند، ميزبان سرويس‌هاي Grid خواهند بود و كامپيوترهاي ديگر از اين سرويس‌ها استفاده مي‌كنند.

به علا‌وه، براي ساختن يك Grid به‌ابزارهايي نيز نياز خواهيد داشت: ابزارهاي زيربنايي مثل زمانبندها، ابزارهاي مديريت منابع، مديريت امنيتي و ابزارهاي انتقال فايل مانند GridFTP كه قبلاً توضيح داده شد. ابزار ديگري كه حتما به‌آن نياز خواهيد داشت، Grid Directory Services) GDS) است كه فهرست سرويس‌هاي آماده را در اختيار دارد. به‌علا‌وه، به ‌API‌هايي نيز نياز داريد كه برنامه‌هاي شما را با Grid هماهنگ سازند و به‌برنامه‌هاي شما امكان دهند در محيط Grid كار كنند. خواندن منابع زير نيز شما را در يادگيري بيشتر Grid Computing ياري مي‌نمايد:


www.gridcomputing.com/ingplanet.com

computingplanet.com/features/article.php/3396741

www-128.ibm.com/developerworks/grid/library/grfuture.html

+ نوشته شده در  یکشنبه شانزدهم دی 1386ساعت 11:3  توسط یوسف عبدلیان باریکرسفی  | 

طریقه نصب برنامه محاسبات شبكه‌ای را با كمك ابزارهای open-source فرا بگيريد

چارچوبی برای محاسبات شبكه‌ای

 

ساخت برنامه محاسبات شبكه‌ای را با كمك ابزارهای open-source فرا بگيريد

 چكيده

چارچوب‌هاي محاسباتي شبكه‌اي در مقياس بزرگ را مي‌توان براي ايجاد زير‌ساختارهاي شبكه‌اي محاسباتي بكار برد، اما پيچيدگي اين چارچوبها مي‌تواند مانعي براي طراحان نرم‌افزار در آزمايش محاسبات شبكه‌اي سطح ورودي باشد.

اين مقاله با كمك ClassLoader سفارشي جاوا، كانتينر سرولت Tomcat، Axis SOAP (Simple object Access protocol)، چارچوب ساده‌اي را براي پشتيباني از حداقل نيازمندهاي شبكه‌اي (گرير) نظير استقلال ماشين، توزيع محاسبه فعاليت انتزاعي شده و اجرا، و زيرساختار امن و اندازه‌پذيري، تشريح مي‌كند.

محاسبات اينترنتي اصطلاحي است كه براي توصيف كاربرد چند كامپيوتر شبكه‌بندي شده براي اجراي برنامه‌هاي محاسباتي انحصاري بكار مي‌رود. پروژه The search for Extraterrestrial Intelligence SETI مشهورترين مثال اين مورد است كه در آن پروژه، نيم ميليون كاربر خانگي و سازماني از توان پردازشي براي تحليل داده‌هاي تلسكوپ راديويي براي SETI استفاده مي‌كردند.

پروژه SETI نمونه‌اي از قلمرو محاسبات اينترنتي است كه برنامه انحصاري و انسجام عمودي دارد. به عبارتي استفاده عمومي از منابع محاسباتي وجود ندارد و جريان داده‌اي بين منبع محاسبات و سرور داده‌اي از APIهاي اختصاصي استفاده مي‌كند. هنگامي كه ارتقا يك برنامه لازم است، بايد در فواصلي اجراهاي جديد download شوند، و در واقع هيچ لايه مديريتي براي قرار دادن ديناميكي فعاليت‌هاي محاسباتي جديد وجود ندارد.

تبديل: اينترنت به محاسبات شبكه‌اي

با اين تبديل كه حاصل موفقيت پروژه SETI است، محققان تصميم گرفته‌اند براي بهره‌برداري از حجم عظيم منابع محاسبات متصل به اينترنت، اما به گونه‌اي امن، قابل مديريت و قابل توسعه، كارهايي را انجام دهند. در چند سال گذشته، چارچوب‌هاي متعددي با تاكيد بر مديريت منابع اشتراكي،‌ توسعه يافتند. اين چارچوبها گونه‌هاي زير را فراهم مي‌آورند:

- استقلال ماشين در حين استفاده از جاوا و سرويس‌هاي وب

- امنيت در پياده‌سازي‌هاي سرويس وب نظير SOAP با تركيب پيش ساخته HTTP و كنترل اعتبار كاربر

- تجرد فعاليت، كه قابليت سيستم مديريت براي سپردن وظايف اختياري به منابع مبتني بر شبكه است.

- مديريت منابعي به جز پردازنده نظير فضاي ذخيره‌سازي فايل

- مديريت پوياي همه موارد فوق با ارزيابي بيدرنگ وضعيت شبكه

بعضي از چارچوب‌ها در اين زمينه موفق عمل كردند به طوري كه طراحان اينگونه چارچوبها، آنها را در قالب تول‌كيت عرضه نمودند. Globus Toolkit 3.0 نمونه‌اي از اين تول‌كيت‌هاست. اين تول‌كيت توسعه OGSA (Open Grid Services Architecture) را تحت تاثير قرار مي‌دهد. محققان سان ميكروسيستمز نيز چارچوب محاسبات ديگر مبتني بر API ارتباطي jxta peer-to-peer توسعه داده‌اند. اين چارچوبها با وجود توانمندي كه دارند نيازمند دانش بسار بالايي براي بهره‌برداري موفقيت‌آميزشان هستند. اين امر مانعي براي افراد يا گروه‌هايي است كه قصد دارند از اين طريق تجربه بيندوزند. اين چارچوب‌ها براي برنامه‌نويسان جديد همانند استفاده از struts براي اولين برنامه وب است.

 

شكل 1. توالي ساده اجراي گريد

 

 

 

 

 

 

حداقل چارچوب محاسبات شبكه‌اي

من يك چارچوب كوچكي را در اين مقاله نشان مي‌دهم كه به سادگي محيط محاسباتي شبكه‌اي را مي‌سازد. اين چارچوب را مي‌توان به سرعت با كمك TomCat، Axis توسعه داد. چارچوب مذكور با وجود سادگي، حداقل نيازمنديهاي شبكه را برآورده مي‌سازد:

 

شكل 2. خروجي فرمان IS در يونيكس

 

 

- استقلال ماشين از طريق به كار‌گيري جاوا، Tomcat و Axis حاصل مي‌شود.

- زيرساختار امن و اندازه‌پذير كه با بكارگيري سرويس‌هاي وب مبتني بر SOAP براي ارتباطات كلاينت سرور حاصل مي‌شود.

- اجراي فعاليت انتزاعي كه با بكارگيري ClassLoader به دست مي‌آيد. كلاينت با كمك ClassLoader مي‌تواند كلاسهاي thread اختياري جاوا را شناسايي و اجرا كند.

شكل 1 نماي ساده‌اي از معماري چارچوب و توالي اجرا را به تصوير مي‌كشد.

 

 

 

ساخت يك برنامه نمونه

من در اين مقاله بر ساخت و آزمايش چارچوب مذكور متمركز مي‌شوم و مثال‌هايي را به ترتيب زير ارائه مي‌دهم:

1. ساخت سرويس Server-side SOAP با كمك TomCat و Axis

2. برقراري stubs ارتباطي براي پشتيباني از كاربرد client-side سرويس SOAP.

3. ساخت ClassLoader سفارشي Client-side

4. ساخت برنامه اصلي كلاينت

5. ساخت فعاليت محاسباتي براي تمرين كردن ClassLoader

 

 

شكل 3. مشاهده WSDL از اينترنت اكسپلورر

 

ساخت سرويس SOAP

سرويس SOAP كه در اين مقاله مي‌سازم، رابطه تنگاتنگي با لايه مديريت دارد. سرويس SOAP به برنامه محاسباتي شبكه‌اي امكان مي‌دهد تا كلاسهاي مورد نياز خود را از سرور SOAP بگيرد. در حاليكه مثال من يك فايل Jar خاص را ارائه مي‌دهد، نسخه واقعي اين سرويس به چند فايل jar (كه هر يك حاوي فعاليت محاسباتي متفاوتي هستند) دسترسي خواهد داشت و منطقي براي كنترل JAR دارد.

 

شكل 4. نتايج WSDL2Java

 

 

اولين گام در فراهم آوردن سرويس SOAP، تنظيم زيرساختار SOAP است. من TomCot را به عنوان سرور كانتينر سرولت /HTTP برگزيدم، زيرا يك پروژه open-source

 قابل اعتماد و كاربرد آن آسان است. من Axis را به عنوان سرويس‌دهنده SOAP برگزيدم، زيرا از Service installer با كاربرد آن drap and drop پشتيباني مي‌كند و همراه با ابزاري است كه SOAP client-side stubs را از فايلهاي (web services Description Language) WSDL مي‌سازد.

پس از download و نصب Tomcat 4.0.6 و Axis 1.0، كلاس Grid Connection سرويس SOAP را نوشتم. اين سرويس فايل Jar شناخته شده‌اي را استخراج، آن را در آرايه بايت بارگذاري نموده و آرايه بايت را به فراخوان باز مي‌گرداند، كد زير فايل كلي Grid connection Java است:

 

////  GridConnection.java
//
import java.util.*;
import java.io.* ;

public class GridConnection {

  public byte[] getJarBytes () {

    byte[] jarBytes = null ;
          
    try {
      FileInputStream fi = new FileInputStream("/Users/tkarre/MySquare/build/MySquare.jar");
      jarBytes = new byte[fi.available()];
      fi.read(jarBytes);
      fi.close() ;
    }
    catch(Exception e) {}
    
    return jarBytes ;
  }
}

نصب سرويس SOAP

طرح نصب (Axis Java web Service) JWS، نصب سرويس جديد ما را آسان مي‌سازد. شما مي‌توانيد يك سرويس ساده (مانند كلاس GridConnection فوق) را با Axis بنويسيد، پسوند java. فايل را به JWS تغيير دهيد و آن را به دايكتوري Axis Webapp، درگ و drop كنيد. Axis، .jws جديد را شناسايي و و تفسير نموده و آن را به صورت نقطه انتهايي SOAP، در دسترس قرار مي‌دهد. شكل 2 اين فايل و فايل‌هاي ساخته شده كلاس JWS را نشان مي‌دهد. در خروجي فرمان IS يونيكس، فايل GridConnection .JWS را بيابيد.

 

ساخت Stubهاي ارتباطي Client-side

به محض اينكه سرويس جديد SOAP را نصب نمودم، بايد كد Client-side را براي استفاده از سرويس توليد مي‌كردم. من از ابزار خط فرمان Axis WSDL2Java براي توليد فايلهاي جاوا استفاده نمودم. اين فايل‌ها، stubهاي لازم براي درخواست سرويس SOAP را فراهم مي‌آورند.

اين ابزار فرايند كد‌نويسي دستي كلاسهاي مورد نياز براي پياده‌سازي client-side واسط SOAP را حذف مي‌كند. ابزار WSDL2Java به فايل WSDL نياز دارد، لذا از گونه ديگر Axis براي سرويسمان استفاده مي‌كنم. Axis مي‌تواند WSDL قابل رويت را با استفاده از مرورگر وب براي هر گونه سرويسي كه به طور محلي نصب شده است، توليد كند. من در كلاس GridConnection از URL.

http://localhost:8080/axis/GridConnection.JWS?wsdl استفاده نمودم.

شكل 3، WSDL را كه Axis براي مشاهده در اينترنت اكسپلورر توليد مي‌كند، نشان مي‌دهد. شما مي‌توانيد پس از ذخيره فايل WSDL (بدين منظور مي‌تواند از فرمان View Source استفاده و آن را ذخيره نماييد)، ساخت stub را ادامه دهيد. من WSDL را به صورت Grid Connection.wsdl ذخيره و سپس فرمان زير را انجام دادم.

 

Java org. apache. axis. wsdl. WSDL2Java - 0 -pcom. perficient. grid. client Grid Connection.wsdl

 

پارامتر –p به WSDL2Java مي‌گويد كه ساختار پكيج را براي com.perficient.grid.client بسازد. من براي ساخت برنامه واقعي كلاينت، از اين پكيج استفاده نمودم. شكل 4 اجراي اين فرمان را نشان مي‌دهد. (توجه نماييد كه مسير كلاس را به گونه‌اي تنظيم نماييد كه شامل JARهاي متعدد نصب شده با Axis باشد.) WSDL2Java در شكل 4، ساختار دايركتوري پكيج و چهار فايل جاوا ساخته است. محتواي چهار فايل‌ جاوا كه با ابزار WSDL2Java ساخته شده، در ذيل آمده است:

/**
* GridConnection.java
*
* This file was auto-generated from WSDL
* by the Apache Axis WSDL2Java emitter.
*/

package com.perficient.grid.client;

public interface GridConnection extends java.rmi.Remote {
  public byte[] getJarBytes() throws java.rmi.RemoteException;
}


/**
* GridConnectionService.java
*
* This file was auto-generated from WSDL
* by the Apache Axis WSDL2Java emitter.
*/

package com.perficient.grid.client;

public interface GridConnectionService extends javax.xml.rpc.Service {
  public java.lang.String getGridConnectionAddress();

  public com.perficient.grid.client.GridConnection getGridConnection() throws javax.xml.rpc.ServiceException;

  public com.perficient.grid.client.GridConnection getGridConnection(java.net.URL portAddress) throws javax.xml.rpc.ServiceException;
}


/**
* GridConnectionServiceLocator.java
*
* This file was auto-generated from WSDL
* by the Apache Axis WSDL2Java emitter.
*/

package com.perficient.grid.client;

public class GridConnectionServiceLocator extends org.apache.axis.client.Service implements com.perficient.grid.client.GridConnectionService {

  // Use to get a proxy class for GridConnection.
  private final java.lang.String GridConnection_address = "http://localhost:8080/axis/GridConnection.jws";

  public java.lang.String getGridConnectionAddress() {
    return GridConnection_address;
  }

  // The WSDD service name defaults to the port name.
  private java.lang.String GridConnectionWSDDServiceName = "GridConnection";

  public java.lang.String getGridConnectionWSDDServiceName() {
    return GridConnectionWSDDServiceName;
  }

  public void setGridConnectionWSDDServiceName(java.lang.String name) {
    GridConnectionWSDDServiceName = name;
  }

  public com.perficient.grid.client.GridConnection getGridConnection() throws javax.xml.rpc.ServiceException {
    java.net.URL endpoint;
      try {
        endpoint = new java.net.URL(GridConnection_address);
      }
      catch (java.net.MalformedURLException e) {
        return null; // unlikely as URL was validated in WSDL2Java
      }
      return getGridConnection(endpoint);
  }

  public com.perficient.grid.client.GridConnection getGridConnection(java.net.URL portAddress) throws javax.xml.rpc.ServiceException {
    try {
      com.perficient.grid.client.GridConnectionSoapBindingStub _stub = new com.perficient.grid.client.GridConnectionSoapBindingStub(portAddress, this);
      _stub.setPortName(getGridConnectionWSDDServiceName());
      return _stub;
    }
    catch (org.apache.axis.AxisFault e) {
      return null;
    }
  }

  /**
   * For the given interface, get the stub implementation.
   * If this service has no port for the given interface,
   * then ServiceException is thrown.
   */
  public java.rmi.Remote getPort(Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException {
    try {
      if (com.perficient.grid.client.GridConnection.class.isAssignableFrom(serviceEndpointInterface)) {
        com.perficient.grid.client.GridConnectionSoapBindingStub _stub = new com.perficient.grid.client.GridConnectionSoapBindingStub(new java.net.URL(GridConnection_address), this);
        _stub.setPortName(getGridConnectionWSDDServiceName());
        return _stub;
      }
    }
    catch (java.lang.Throwable t) {
      throw new javax.xml.rpc.ServiceException(t);
    }
      throw new javax.xml.rpc.ServiceException("There is no stub implementation for the interface:  " + (serviceEndpointInterface == null ? "null" : serviceEndpointInterface.getName()));
  }

  /**
   * For the given interface, get the stub implementation.
   * If this service has no port for the given interface,
   * then ServiceException is thrown.
   */
  public java.rmi.Remote getPort(javax.xml.namespace.QName portName, Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException {
    java.rmi.Remote _stub = getPort(serviceEndpointInterface);
    ((org.apache.axis.client.Stub) _stub).setPortName(portName);
    return _stub;
  }

  public javax.xml.namespace.QName getServiceName() {
    return new javax.xml.namespace.QName("http://localhost:8080/axis/GridConnection.jws", "GridConnectionService");
  }

  private java.util.HashSet ports = null;

  public java.util.Iterator getPorts() {
    if (ports == null) {
      ports = new java.util.HashSet();
      ports.add(new javax.xml.namespace.QName("GridConnection"));
    }
    return ports.iterator();
  }

}


/**
* GridConnectionSoapBindingStub.java
*
* This file was auto-generated from WSDL
* by the Apache Axis WSDL2Java emitter.
*/

package com.perficient.grid.client;

public class GridConnectionSoapBindingStub extends org.apache.axis.client.Stub implements com.perficient.grid.client.GridConnection {
  private java.util.Vector cachedSerClasses = new java.util.Vector();
  private java.util.Vector cachedSerQNames = new java.util.Vector();
  private java.util.Vector cachedSerFactories = new java.util.Vector();
  private java.util.Vector cachedDeserFactories = new java.util.Vector();

  public GridConnectionSoapBindingStub() throws org.apache.axis.AxisFault {
    this(null);
  }

  public GridConnectionSoapBindingStub(java.net.URL endpointURL, javax.xml.rpc.Service service) throws org.apache.axis.AxisFault {
    this(service);
    super.cachedEndpoint = endpointURL;
  }

  public GridConnectionSoapBindingStub(javax.xml.rpc.Service service) throws org.apache.axis.AxisFault {
    if (service == null) {
      super.service = new org.apache.axis.client.Service();
    } else {
      super.service = service;
    }
  }

  private org.apache.axis.client.Call createCall() throws java.rmi.RemoteException {
    try {
      org.apache.axis.client.Call _call =
        (org.apache.axis.client.Call) super.service.createCall();
      if (super.maintainSessionSet) {
        _call.setMaintainSession(super.maintainSession);
      }
      if (super.cachedUsername != null) {
        _call.setUsername(super.cachedUsername);
      }
      if (super.cachedPassword != null) {
        _call.setPassword(super.cachedPassword);
      }
      if (super.cachedEndpoint != null) {
        _call.setTargetEndpointAddress(super.cachedEndpoint);
      }
      if (super.cachedTimeout != null) {
        _call.setTimeout(super.cachedTimeout);
      }
      if (super.cachedPortName != null) {
        _call.setPortName(super.cachedPortName);
      }
      java.util.Enumeration keys = super.cachedProperties.keys();
      while (keys.hasMoreElements()) {
        java.lang.String key = (java.lang.String) keys.nextElement();
        if(_call.isPropertySupported(key))
          _call.setProperty(key, super.cachedProperties.get(key));
        else
          _call.setScopedProperty(key, super.cachedProperties.get(key));
      }
      return _call;
    }
    catch (java.lang.Throwable t) {
      throw new org.apache.axis.AxisFault("Failure trying to get the Call object", t);
    }
  }

  public byte[] getJarBytes() throws java.rmi.RemoteException {
    if (super.cachedEndpoint == null) {
      throw new org.apache.axis.NoEndPointException();
    }
    org.apache.axis.client.Call _call = createCall();
    _call.setReturnType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "base64Binary"), byte[].class);
    _call.setUseSOAPAction(true);
    _call.setSOAPActionURI("");
    _call.setOperationStyle("rpc");
    _call.setOperationName(new javax.xml.namespace.QName("http://localhost:8080/axis/GridConnection.jws", "getJarBytes"));

    java.lang.Object _resp = _call.invoke(new java.lang.Object[] {});

    if (_resp instanceof java.rmi.RemoteException) {
      throw (java.rmi.RemoteException)_resp;
    }
    else {
      try {
        return (byte[]) _resp;
      } catch (java.lang.Exception _exception) {
        return (byte[]) org.apache.axis.utils.JavaUtils.convert(_resp, byte[].class);
      }
    }
  }

}

اين كدها بايد با برنامه كلاينت لحاظ شوند آنها كلاسهاي لازم براي اتصال به انتهاي SOAP را فراهم مي‌آورند و ClassLoader سفارشي از آنها استفاده خواهد نمود.

 

ساخت ClassLoader سفارشي

ClassLoader سفارشي مهمترين جز برنامه كلاينت گريد است - كه فايل jar را از طريق سرويس SOAP بازيابي نموده و سپس كلاسهاي لحاظ شده در JAR را براي اجرا در دسترس قرار مي‌دهد. من با ساختار ClassLoader مستحكمي كه در ابتدا توسط كن‌مك‌كراري در Creat a Custom Java 1.2- style ClassLoader منتشر گرديد، آغاز نمودم. سپس ClassLoader را با كد ويژه‌اي براي برنامه كامل كردم. كد اصلي Grid Connection ClassLoader.Java در ذيل آمده است.

 

//
//  GridConnectionClassLoader.java
//
//  Created by Anthony Karre on
Wed Dec 11 2002.
//  Copyright (c) 2002 Perficient. All rights reserved, except for Ken McCrary stuff.
//
//  Structure of this class was kick-started by published Ken McCrary examples:
//  Here is his copyright notice:
//
/* Copyright (c) 1999 Ken McCrary, All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies.
*
* KEN MCCRARY MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. KEN MCCRARY
* SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT
* OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/


package com.perficient.grid.client ;

import java.util.Enumeration;
import java.util.NoSuchElementException;
import java.util.zip.* ;
import java.util.jar.Manifest;
import java.util.jar.JarInputStream ;
import java.util.jar.JarFile ;
import java.util.jar.JarEntry ;
import java.util.jar.Attributes;
import java.util.jar.Attributes.Name;
import java.util.Hashtable ;
import java.io.* ;
import java.net.URL ;

public class GridConnectionClassLoader extends ClassLoader {

  // Provide normal constructor.
  
  GridConnectionClassLoader() {
    super();
    init();
  }
  
  // Provide delegation constructor.

  GridConnectionClassLoader(ClassLoader parent) {
    super(parent);
    init();
  }

در اينجا اولين متد آمده است: .init() اين متد با استفاده از SOAP stubs، سعي دارد به انتهاي SOAP متصل شود. بدين ترتيب آرايه بابت محتوي فايل Jar را استخراج مي‌كند. اين متد دو فعاليت ديگر را نيز انجام مي‌دهد. مشخص نمودن اندازه هر منبع JAR به بايت و شناسايي كلاس اصلي كه بايد اجرا شود.

در اين طراحي بايد كلاس اصلي آبجكت thread جاوا باشد. و از طريق صفت Task-Thread (مشابه با مفهوم صفت Main-Class كه در كلاسهاي اصلي ايستا به كار مي‌رود) شناسايي شود.

 

  //******************************************
  // Initialize the ClassLoader by using Web

  // services (SOAP) to fetch our JAR.
  // This jar file will contain the classes that

  // compose our grid task.
  // *****************************************
  
  private void init() {
  
    byte[] localjarbytes = null ;
    File tempfile = null ;
    FileInputStream tempfis = null ;
    JarInputStream jis = null ;
    
    try {
    
      // Make a SOAP service to start the process of fetching the JAR.
        
      com.perficient.grid.client.GridConnectionService service =
        new com.perficient.grid.client.GridConnectionServiceLocator() ;
          
      // Now use the service to get a stub to the SOAP service itself.
        
      com.perficient.grid.client.GridConnection gc = service.getGridConnection() ;
        
      // Make the actual call and fetch the bytes.
          
      localjarbytes = gc.getJarBytes() ;
          
      //  If localjarbytes is null, then the grid connection failed.  One possibility
      //  is that a jar file could not be found or loaded by the grid server.
      //  Print a message and exit.
          
      if (localjarbytes == null) {
        System.out.println("Class Loader: The grid connection returned no bytes.  No Jar file is currently available.") ;
        return ;
      }
      
      //  At this point we can store our bytes into a temp file.  This temp file
      //  will be a repository for the JAR, allowing the classloader to fetch
      //  classes as necessary.
        
      System.out.println("Class Loader: the grid connection returned " + localjarbytes.length + " bytes") ;
      
      // Save the size of the JAR for later use.
      
      this.jarsize = localjarbytes.length ;
          
      try {
          
        //  Create a temp jar file for these bytes.  Having an actual file will
        //  allow us to retrieve various resources more easily.
          
        tempfile = File.createTempFile("grid", ".jar") ;
          
        //  Make sure our file is deleted when the VM exits.
          
        tempfile.deleteOnExit() ;
          
        // Get an output stream and dump our bytes to the file.
          
        FileOutputStream tempfileos = new FileOutputStream(tempfile) ;
        tempfileos.write(localjarbytes) ;
        tempfileos.close() ;
            
      }
      catch (IOException e) {
        System.out.println("Class Loader: Problem with temp Jar file: " + e.getMessage()) ;
      }
        
          
    }
    catch (Exception e) {
      System.out.println("Class Loader: a grid connection failure occurred:\n" + e.toString() + "\n" + e.getMessage()) ;
    }

      
    try {

      // Save the filename for later reference.
      
      jarfilename = new String(tempfile.getCanonicalPath()) ;
      
      // Try to get a manifest, if one exists.  This will
      // let us know what the main task thread class is.
      // The main task thread is the primary work unit
      // that we will be executing in our grid.
        
      tempfis = new FileInputStream(tempfile) ;
      jis = new JarInputStream(tempfis) ;
            
      manifest = jis.getManifest() ;
      Attributes attr = manifest.getMainAttributes();
            
      if (attr != null) {
        taskthread = attr.getValue("Task-Thread") ;
      }
        
      // Now scan all of the entries in the file and
      // get the size of each resource/class.  This is the
      // only way to get the true size when the JAR is compressed.
        
      ZipFile zipfile = new ZipFile(tempfile);
      enum = zipfile.entries() ;
                            
      while (enum.hasMoreElements()) {          
        ZipEntry ze = (ZipEntry) enum.nextElement() ;
        htSizes.put(ze.getName(), new Integer((int)ze.getSize())) ;
      }

    } // Try.
      
    catch (Exception e) {
      System.out.println("Class Loader: " + e.toString() + " : " + e.getMessage()) ;
    }
    finally {
      if ( tempfis != null ) {
        try {
          tempfis.close();
        }
        catch (Exception e){}
      }
      if ( jis != null ) {
        try {
          jis.close();
        }
        catch (Exception e){}
      }
        
    } // Finally.
        
  }

 

متد findclass() همانگونه كه در ذيل آمده است، توسط ClassLoader براي رديابي و بارگذاري كلاس خاصي بكار مي‌رود. من در اين پياده‌سازي كلاس مورد نظر را در فايل Jar جستجو مي‌كنم. در صورتي كه ان را نيابم، از ClassNot Found Exception استاندارد استفاده مي‌كنم.

 

  /**
   *  This is the method where the task of classloading
   *  is delegated to our custom loader.
   *
   * @param  name the name of the class
   * @return the resulting Class object
   * @exception ClassNotFoundException if the class could not be found
   */
  
  protected Class findClass(String name) throws ClassNotFoundException {
  
    FileInputStream fis = null ;
    ZipInputStream zis = null ;
  
    try {
    
      String path = name.replace('.', '/') + ".class" ;
      fis = new FileInputStream(jarfilename) ;
      zis = new ZipInputStream(fis) ;
      ZipEntry ze = null ;
      boolean classfound = false ;
      
      while ((ze = zis.getNextEntry()) != null) {
      
        if (path.equals(ze.getName())) {
        
          classfound = true ;
        
          // Get the size of the classfile so we know how many bytes
          // to read.  If the size appears to be -1, then the
          // jar file is compressed, and we need to consult our
          // hashtable to get the uncompressed size.
          
          int size = (int) ze.getSize() ;
          
          if (size == -1) {
            size = ((Integer) htSizes.get(path)).intValue() ;
          }
          
          // Now that we know the actual size of the class,
          // fetch the data.
          
          byte[] classBytes = new byte[size] ;
          int rb = 0 ;
          int chunk = 0 ;
          
          while ((size - rb) > 0) {
            chunk = zis.read(classBytes, rb, size - rb) ;
            if (chunk == -1) {break ;}
            rb += chunk ;
          }
          
          // Now that we have our class data, define the class.
          
          System.out.println ("Class Loader: Found class " + name) ;
          definePackage(name);
          return defineClass(name, classBytes, 0, classBytes.length);

        }
        
      }
      
      if (!classfound) {
        // We apparently failed to locate the class within the jar file,
        // so indicate the problem with an exception.
        
        throw new ClassNotFoundException(name) ;
      }
      
    }
    catch (Exception e) {
      // We could not find the class, so indicate the problem with an exception.
      throw new ClassNotFoundException(name);
    }
    finally {
      if ( fis != null ) {
        try {
          fis.close();
        }
        catch (Exception e){}
      }
      if ( zis != null ) {
        try {
          zis.close();
        }
        catch (Exception e){}
      }
    }
    
    return null ;
  }

 

متدهاي find Resource()، find Resurces() همانگونه كه در ذيل آمده‌اند، براي يافتن منابعي كه احتمالا در JAR هستند، به كار مي‌روند. از آنجاييكه همه منابع در JARهاي محصور شده، بسته‌بندي شده‌اند نه در فايل سيستم، در دسترس URL قرار دارند، لذا اين متدها همواره سودمند نيستند.

 

  /**
   *  Identify where to load a resource from.
   *  Normally the resources will be extracted

   * from a JAR and reside in a filesystem

   * somewhere.  Since we are loading our classes

   * directly from a jar file, they won't really

   * be available via URL.
   *
   *  We'll always return a null to indicate
   *  that the resource can't be found, i.e.,

   * unavailable.
   *  You could also dump all of the resources

   * into a local/temp filesystem and "find" them

   * there.
   *
   *  @param name the resource name
   *  @return URL for resource or null if not

   * found
   */
  
  protected URL findResource(String name) {
    return null;
  }

  /**
   *  Used for identifying resources from multiple URLS.
   *  We will return a null for the same reasons as above.
   *
   *  @param name the resource name
   *  @return Enumeration of one URL
   */
  
  protected Enumeration findResources(final String name) throws IOException {
    return null ;  
  }

 

متد defindpackage()، متد استاندارد نهايي را براي ClassLoader ما فراهم مي‌كند و از مثال كن مك كراري، بدون تغيير اقتباس شده است:

 

  /**
   *  Minimal package definition
   *
   */
  
  private void definePackage(String className) {
  
    // Extract the package name from the class name.
    
    String pkgName = className;
    int index = className.lastIndexOf('.');
    
    if (index != -1) {
      pkgName =  className.substring(0, index);
    }

    // Preconditions -- need a manifest and the package
    // is not previously defined.
    
    if ( null == manifest ||
      getPackage(pkgName) != null) {
        return;
    }

    String specTitle,
           specVersion,
           specVendor,
           implTitle,
           implVersion,
           implVendor;

    // Look up the versioning information.
    // This should really look for a named attribute.
    
    Attributes attr = manifest.getMainAttributes();

    if (attr != null) {
      specTitle   = attr.getValue(Name.SPECIFICATION_TITLE);
      specVersion = attr.getValue(Name.SPECIFICATION_VERSION);
      specVendor  = attr.getValue(Name.SPECIFICATION_VENDOR);
      implTitle   = attr.getValue(Name.IMPLEMENTATION_TITLE);
      implVersion = attr.getValue(Name.IMPLEMENTATION_VERSION);
      implVendor  = attr.getValue(Name.IMPLEMENTATION_VENDOR);

      definePackage(pkgName,
                    specTitle,
                    specVersion,
                    specVendor,
                    implTitle,
                    implVersion,
                    implVendor,
                    null); // No sealing for simplicity.
    }
  }

 

سه متدي كه در ذيل آمده‌اند، ClassLoaderمان را كامل مي‌كنند. متد get Task Thread Name() نام thread فعاليتي كه مايلم اجرا شود (مبتني بر اطلاعات manifest) باز مي‌گرداند. متد isloaded مشخص مي‌كند كه آيا ClassLoader با موفقيت واكنشي و در فايل Jar بارگذاري شده است يا خير. كلاس main  از اين متد براي تعيين در دسترس بودن thread فعاليت اصلي‌ كه بايد اجرا شود، استفاده مي‌كند. متد getResourceEntries()، شماره اسامي منبع را در JAR بر مي‌گرداند و براي خطايابي بكار مي‌رود.

 

  //  The getTaskThreadName is a getter for the taskthread field.
  
  public String getTaskThreadName() {
    return this.taskthread ;
  }
  
  // If a JAR has been loaded, then we will have
  // a nonzero jarsize.
  
  public boolean isLoaded() {
    return (this.jarsize > 0) ;
  }
  
  //  getResourceEntries returns an enumeration of the keys
  //  in the hashtable.  The keys are the names of the JAR
  //  entries we picked up earlier.  This is useful for
  //  printing the list of JAR resources.
  
  public Enumeration getResourceEntries() {
    return htSizes.keys() ;
  }
    
  
  
  private Manifest manifest = null ;
  private String taskthread = null ;
  private String jarfilename = null ;
  private int jarsize = 0 ;
  private Enumeration enum = null ;
  private Hashtable htSizes = new Hashtable() ;

 

ساخت برنامه اصلي كلاينت

اين برنامه مسوول آغاز نمودن فوري Classloader است، سپس از آن براي بارگذاري thread فعاليت اصلي استفاده مي‌كند. من در اين مثال thread را به يكباره بارگذاري و اجرا مي‌كنم. توليد برنامه تلاش براي آغاز مجدد thread به محض اينكه اجرا مي‌شود يا حتي آبجكت ClassLoader را خراب مي‌كند و بارگذاري thread جديد است. (احتمالا با واكنشي JAR جديد) كد برنامه اصلي در ذيل آمده است.

//
//  GridClientMain.java
//

package com.perficient.grid.client ;

import java.util.*;
import java.io.* ;

public class GridClientMain {

  public static void main (String args[]) {
    
    // Start by creating our custom classloader. The classloader, during
    // initialization, will use Web services to attempt to download a JAR
    // containing the grid task we will execute.
        
    try {
      GridConnectionClassLoader gcloader = new GridConnectionClassLoader () ;
          
      //  Check to see if any bytes of data were received.  If the classloader is not loaded,
      //  then the classloader was unable to initialize properly.
          
      if (!gcloader.isLoaded()) {
        System.out.println("GridClientMain: No bytes were loaded by the classloader, so no grid task is available to be executed.") ;
      }
          
      //  A JAR has been loaded by the classloader, but
      //  the JAR manifest may not have a registered Task-Thread attribute.  This means
      //  that we have no way of knowing which class we are supposed to run.
      //  If our classloader does not have a Task-Thread name, print a message,
      //  then print the list of resources found in the JAR for reference.
          
      else if (gcloader.getTaskThreadName() == null) {
        System.out.println("GridClientMain: The Jar manifest did not have a Task-Thread attribute.\nPlease identify the Task-Thread and re-jar the data.  Here are the known Jar resources:\n") ;
            
        Enumeration enum = gcloader.getResourceEntries() ;
    
        while (enum.hasMoreElements()) {
          System.out.println((String) enum.nextElement()) ;
        }
            
      }
      else {
          
        // We have a Task-Thread, so let's try to load it.  Again, note that we assume
        // that the Task-Thread class is a Thread class.  This is a design decision for building
        // the grid.
            
        System.out.println("GridClientMain: Attempting to load " + gcloader.getTaskThreadName()) ;
        Thread task = (Thread) gcloader.loadClass(gcloader.getTaskThreadName()).newInstance();
        System.out.println("GridClientMain: Attempting to start Thread...") ;
        task.start();
      }
    }
    catch (ClassNotFoundException e) {
      System.out.println("GridClientMain: Could not find class:\n" + e.toString() + "\n" + e.getMessage()) ;
    }
    catch (Exception e) {
      System.out.println("GridClientMain: exception:\n" + e.toString() + "\n" + e.getMessage()) ;
    }
                
  }  // Main.
    
}

ساخت thread محاسباتي آزمايشي

من براي آزمايش چارچوب گرير به thread محاسباتي آزمايشي نياز دارم. البته لازم نيست اين thread كاري انجام دهد، اما بايد به گونه‌اي ساخته شود كه بتواند Classloader را آزمايش كند. Thread، آزمايشي را به گونه‌اي طراحي نمودم كه از چند كلاس استفاده كند و حداقل يك كلاس داخلي داشته باشد. وقتي برنامه اصلي را اجرا مي‌كنم، بايد ClassLoader سفارشي در صورت لزوم درخواست شود. كد thread آزمايشي در ذيل آمده است.

//
//  TestThread.java
//

package com.perficient.tasks ;

import java.util.*;
import com.perficient.tasks.TestThreadHelper ;

public class TestThread extends Thread {

  public TestThread () {
    super() ;
  }

  public void run() {

    System.out.println("TestThread: You are now inside the TestThread thread.");
    System.out.println("TestThread: Accessing another class in this jar...") ;
      
    // Demonstrate the ability to access another class in the
    // same jar file.
      
    try {
      TestThreadHelper tth = new TestThreadHelper() ;      
      System.out.println("TestThread: tth.getDemoString() returned " + tth.getDemoString()) ;
    }
    catch (Exception e) {
      System.out.println("TestThread: Failed to create TestThreadHelper.") ;
      System.out.println(e.toString() + " : " + e.getMessage()) ;
    }
      
    System.out.println("TestThread: Exiting TestThread thread.") ;
  }

}

//
//  TestThreadHelper.java
//  TestThread
//
//  Created by Anthony Karre on Sun Jan 05 2003.
//  Copyright (c) 2003 Perficient. All rights reserved.
//

package com.perficient.tasks ;

public class TestThreadHelper {

  public String getDemoString () {
  
    // demonstrate correct inner class load
    
    TTHInnerClass myinner = new TTHInnerClass() ;    
    return myinner.getInnerClassString() ;
  }
  
  class TTHInnerClass {
  
    public String getInnerClassString () {
      return "innerclassworked" ;
    }
  
  }

}

به دليل اينكه از Apple Mac OS X Project Builder IDE براي ساخت اين برنامه استفاده نمودم، JAR آزمايشي حاوي، فايل متني ديگري به نام mainfest.txt است. شما بايد با اين ابزار به وضوح فايل مبدايي حاوي اطلاعات mainfest كه مثلا Project Builder قبلا آن را فراهم نكرده، تهيه كنيد. البته در صورتي كه بخواهيد داده‌هاي اضافي ديگري را در mainfest ادغام كنيد. اين فايل يك خطي به صورت ذيل است:

Task-Thread: com.perficient.tasks.TestThread

 

 

شكل 5. خروجي كنسول جاوا

 

 

آزمايش چارچوب محاسباتی شبكه‌ای

من اين چارچوب را با روشن كردن سرور Tomcat/Axis SOAP بر روي مكينتاش آزمايش نمودم سپس برنامه اصلي را از Apple Mac OS X project Builder IDE اجرا كردم. شرايط متعدد بروز خطا را نظير عدم وجود JARها، عدم وجود صفات Task-Thread و مشكلات. SOAP كه در اثر خطاهاي ارتباطي حاصل مي‌شوند را شبيه سازي كردم. Classloader در همه موارد همانگونه كه طراحي شده بود، رفتار كرد. شكل 5 اجراي عادي برنامه كلاينت گرير را نشان مي‌دهد. به نحوه درخواست ClassLoader براي پشتيباني از آغاز نمودن كلاس در thread توجه كنيد.

 

آغاز تجربه با محاسبات شبكه‌ای

در حاليكه تول‌كيت‌هاي محاسبات شبكه‌اي موجود و اثربخش هستند، پياده‌سازي آنها نيازمند تجربه است. شايد منحني يادگيري براي توسعه‌دهندگاني كه مي‌خواهند به سرعت معماري محاسباتي شبكه‌اي را آزمايش كنند، مانعي به شمار رود چارچوب محاسبات شبكه‌اي كه در اين مقاله تشريح شد، ابزار ساده‌اي براي تجربه اصول اينگونه محاسبات است. اين ابزار از مولفه‌هاي open-source متداول كه براي اكثر برنامه‌نويسان جاوا آشناست، استفاده مي‌كند، در حاليكه اصول اين محاسبات يعني: استقلال ماشين، اجراي فعاليت انتزاعي و زير ساختار امن و اندازه‌پذير را حفظ مي‌نمايد. t

 

 

منابع:

·         Learn about the Search for Extraterrestrial Intelligence (SETI@home) project:
http://setiathome.ssl.berkeley.edu/

·         Global Grid Forum:
http://www.ggf.org/

·         Open Grid Services Architecture Working Group (OGSA WG):
http://www.ggf.org/ogsa-wg/

·         The Globus Project:
http://www.globus.org

·         Sun Microsystems Research Paper: "Framework for Peer-to-Peer Distributed Computing in a Heterogeneous, Decentralized Environment," Jerome Verbeke, Neelakanth Nadgir, Greg Ruetsch, Ilya Sharapov:
http://wwws.sun.com/software/jxta/mdejxta-paper.pdf

·         Project Jxta:
http://wwws.sun.com/software/jxta

·         Apache Tomcat homepage:
http://jakarta.apache.org/tomcat/

·         SOAP W3C (World Wide Web Consortium) specification:
http://www.w3.org/TR/SOAP/

·         The Apache Axis SOAP implementation:
http://ws.apache.org/axis/

·         "Create a Custom Java 1.2-Style ClassLoader," Ken McCrary (JavaWorld, March 2000):
http://www.javaworld.com/javaworld/jw-03-2000/jw-03-classload.html

·         The Apache Struts Web application framework:
http://jakarta.apache.org/struts/

·         Apple Mac OS X Project Builder IDE:
http://developer.apple.com/tools/projectbuilder/index.html

·         Learn more about Macintosh OS X development:
http://developer.apple.com/macosx/

·         More JavaWorld stories on Axis:

o        "Axis-Orizing Objects for SOAP," Mitch Gitman (April 2003)

o        "Axis: The Next Generation of Apache SOAP," Tarak Modi (January 2002)

·         For SOAP basics, read "Clean Up Your Wire Protocol with SOAP," Tarak Modi (JavaWorld)

o        "Part 1: An introduction to SOAP basics" (March 2001)

o        "Part 2: Use Apache SOAP to create SOAP-based applications" (April 2001)

o        "Part 3: Create SOAP services in Apache SOAP with JavaScript" (June 2001)

o        "Part 4: Dynamic proxies make Apache SOAP client development easy" (July 2001)

·         For an overview of grid computing, read "IBM's Grid Conversion," Robert McMillan (JavaWorld, September 2002):
http://www.javaworld.com/javaworld/jw-09-2002/jw-0906-grid.html

·         Browse the Enterprise Java section of JavaWorld's Topical Index:
http://www.javaworld.com/channel_content/jw-enterprise-index.shtml

·         Browse the Java and Web Services section of JavaWorld's Topical Index:
http://www.javaworld.com/channel_content/jw-webserv-index.shtml

 

 

+ نوشته شده در  شنبه پانزدهم دی 1386ساعت 11:59  توسط یوسف عبدلیان باریکرسفی  | 

نحوه پیاده سازی گرید کامپیوتینگ(گلوباس)

با سلام

به زودی در این سایت نحوه پیاده سازی گرید کامپیوتینگ(گلوباس) را برایتان می گذارم

به دلیل  امتحانات من نتوانستم مباحث اصلی را در این سایت بارگذاری کنم که  از همه دوستان معذرت می خواهم

ما در حال نصب گلوباس هستیم و داریم مشکلاتی که در سر نصب گلوباس است را بر طرف می کنیم و بعد از امتحانات نتیجه کار خود را در این وبلاگ می گذارم

لطفا نظر دهید

 

ایمیل من

yousef_abdolian@yahoo.com

+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 13:19  توسط یوسف عبدلیان باریکرسفی  | 

کلاستر لینوکس تحت آزمایش


کلاستر لینوکس زیر بار
خوب با پیگیری و انجام مراحل شرح داده شده در بخش‌های پیشین مقاله کلاسترها، اکنون یک کلاستر آماده به کار دارید که می‌توانید قدرت آنرا آزمایش کرده و به نحوه کلی عملکرد کلاسترها پی ببرید.
برای شروع، از روی ایستگاه کاری که بعنوان مانیتور آنرا در نظر گرفته‌ام، از روی کنسول وارد گره شماره ۱ و گره شماره ۲ می‌شوم. روی گره شماره ۱ با استفاده از دستور mosmon برنامه مانیتور کلاستر را که میزان بار هر گره را بصورت نمودارهای میله‌ای نمایش می‌دهد، اجرا می‌کنم. روی گره شماره ۲، دستور زیر را در خط فرمان تايپ می‌کنم:

# for x in 1 2 3 4
do
awk 'BEGIN {for(i=0;i<10000;i++)for(j=0;j<10000;j++);}' &
done

دستور فوق، ۴ اسکریپت awk را که شدیدا بار CPU را بالا خواهند برد، بطور همزمان اجرا می‌کند. به کنسول گره شماره ۱ بازگشته و نمودار بار را زیر نظر می‌گیرم:




بیچاره گره شماره ۲! نمودار به سقف رسیده است! انتظار می‌رود پس از چند لحظه پردازش‌ها به گره‌های بعدی کلاستر (که ما فقط گره شماره ۱ را داریم) منتقل شوند. بسیار جالب است. پس از چند ثانیه پردازش‌ها به گره شماره ۱ منتقل شده و بار آن به سرعت بالا می‌رود:




همانطوری که در تصویر بالا مشاهده می‌کنید، میزان بار گره شماره ۱ به شدت بالا رفته و از بار گره شماره ۲ کاسته می‌شود. خوب این آزمایش بدی برای حصول اطمینان از کارکرد کلاستر نیست، ولی برای بررسی دقیق‌تر و گرفتن نتایج عملی‌تر، نیاز داریم تا تعدادی عملیات واقعی پردازشی را روی کلاستر انجام دهیم. یکی از بهترین عملیات پردازشی که می‌تواند به خوبی کارایی کلاستر را در بوته آزمایش قرار دهد، عملیات کد کردن فایل‌های موسیقی است.
به این منظور، ما دو نرم‌افزار کد کردن فایل‌های موسیقی با فرمت
wav را انتخاب کرده و آزمایشات را به کمک آنها انجام خواهیم داد.

نصب نرم‌افزارهای لازم
نرم‌افزارهای مورد نیاز را تنها در گره‌ای که مایلید آزمایشات را از طریق آن انجام دهید نصب نمایید و نصب آن در سایر گره‌ها ضروری نیست
. این قابلیت کلاستر سازی نامحسوس OpenMosix است که باعث می‌شود تا ما نیازی به نصب این نرم‌افزارها و قرار دادن فایلهای هدف روی یک اشتراک قابل دسترس در تمام شبکه نداشته باشیم.
نرم‌افزاری که ما از آن برای آزمایشات خود استفاده خواهیم کرد، نرم‌افزار کدینگ فایلهای صوتی به فرمت
MP3 به نام Lame می‌باشد که یکی از سریعترین کد کننده‌های MP3 در جهان بوده و یک نرم‌افزار بازمتن است. این نرم‌افزار را از لینک زیر دانلود نمایید. ضمنا حجم آن کمی بیشتر از ۱ مگابایت می‌باشد:

http://unc.dl.sourceforge.net/sourceforge/lame/lame-3.93.1.tar.gz

پس از دانلود بسته کد منبع، جهت نصب نرم‌افزار دستورات زیر را در خط فرمان اجرا نمایید:

# gunzip lame-3.93.1.tar.gz
# tar -xf lame-3.93.1.tar
# cd lame-3.93.1
# ./configure
# make
# make install

نرم‌افزار Lame پس از چند دقیقه کامپایل و به راحتی نصب می‌شود. من نرم‌افزار را روی هر دو گره کلاستر نصب کرده‌ام، چون می‌خواهم دقیقا نحوه عملکرد آنرا در شرایط مختلف بررسی کنم. مورد دیگری که به آن نیاز است، تعدادی فایل wav است که باید آنها را تهیه کنید. من ۵ عدد فایل wav برای انجام آزمایشات تهیه کرده‌ام که حجم آنها حدود ۱۹۶ مگابایت می‌باشد (در حقیقت فایلهای MP3 بوده‌اند که توسط XMMS به فرمت wav برگردانده شدند).
من در دایرکتوری
root هریک از گره‌ها یک دایرکتوری به نام wav ایجاد کرده و فایلهای wav را در آنجا قرار دادم. در مرحله نخست آزمایش، هر یک از گره‌ها بصورت فردی فایلهای MP3 را کد می‌کنند. برای انجام آزمایش، دستور زیر را در خط فرمان وارد می‌کنم:

# cd /root/wav
# for x in *.wav
do
lame $x
done

در حقیت یک حلقه عملیات تبدیل فایل‌ها را یک به یک انجام می‌دهد. نتیجه حاصل مطابق جدول زیر می‌باشد:

نام گره

زمان انجام

Cyber

18:46 s

Debian

5:01 s



خوب نتیجه قابل انتظار است، ماشین پنتیوم ۸۰۰ مگاهرتزی باید هم سریعتر از سلرون ۳۳۳ مگاهرتزی باشد. پس از این مرحله OpenMosix را اجرا کرده و کلاستر را زیر بار می‌گذارم. دستور عملیات به صورت زیر است:

# cd /root/wav
# for x in *.wav
do
lame $x &
done

با اضافه شدن کاراکتر & تمامی ۵ عملیات به صورت همزمان و در پس زمینه اجرا خواهند شد. اجرای همزمان ۵ پروسه باعث مهاجرت پروسه‌ها به گره دیگر کلاستر و وارد شدن کلاستر در عملیات می‌گردد. خوب همانطور که انتظار می‌رفت، کلاستر واقعا کار می‌کند! بسیار هیجان انگیز است. نتیجه کار مطابق جدول زیر می‌باشد:

نام گره آغاز کننده پروسه‌ها

زمان انجام

Cyber

4:11 s

Debian

3:36 s


همانطور که می‌بینید، نتیجه عملیات بسیار جالب است. زمان ۵ دقیقه‌ای عملیات در دستگاه قویتر به سه دقیقه و نیم و زمان ۱۸ دقیقه و ۴۶ ثانیه‌ای دستگاه ضعیف‌تر به چهار دقیقه و ۱۱ ثانیه کاهش یافته است!

+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 13:11  توسط یوسف عبدلیان باریکرسفی  | 

راهنمای مقدماتی GIMP

راهنمای مقدماتی GIMP
به دنیای گیمپ خوش‌آمدید! دنیایی که برای آشنایی کامل با آن به یک کتاب کامل نیاز است. ولی من سعی دارم در یک مقاله جمع و جور شما را با این ابزار شگفت انگیز دنیای لینوکس و بازمتن آشنا سازم تا بتوانید کار کردن با آن را شروع کنید.

GIMP چیست؟
خوب در ابتدای امر شاید سوال کنید که گیمپ چیست و به چه دردی می‌خورد؟ امروزه برنامه‌های گرافیکی مانند Adobe Photoshop در زمینه‌های مختلف کاربردهای زیادی دارند. اگر بخواهیم ساده بیان کنیم، گیمپ فوتوشاپ دنیای لینوکس است. در صورتی که با این برنامه آشنا باشید، در استفاده کردن و درک مفاهیم موجود در گیمپ بسیار جلو هستید. گیمپ یک برنامه قدرتمند ایجاد فایل‌های گرافیکی و پردازش تصویر در لینوکس می‌باشد. آغاز پروژه گیمپ به ایجاد GTK باز می‌گردد. در حقیقت GIMP ایجاد شد تا GTK ایجاد شود. گیمپ مخفف Gnu Image Manipulation Program می‌باشد.

GIMP را از کجا تهیه کنیم؟
قبل از شروع به کار باید مطمئن شوید که گیمپ در سیستم‌تان نصب می‌باشد. امروزه اکثر توزیع‌های روی میزی لینوکس مانند ردهت، زوزه، لیبرانت و... این برنامه را بطور استاندارد نصب می‌کنند. بنابراین می‌توانید مطمئن باشید که این برنامه را نصب شده و آماده روی سیستم‌تان دارید. همواره می‌توانید آخرین نسخه‌های GIMP را از سایت آن در آدرس http://www.gimp.org تهیه کنید.

اصول اولیه
در صورتی که با برنامه فوتوشاپ آشنا باشید، می‌دانید که روش کارکرد این برنامه بر لایه‌های تصویری استوار می‌باشد. گیمپ نیز از همین اصل پیروی می‌کند و در آن با لایه‌های تصویری سر و کار خواهید داشت. بسیاری از اصطلاحات و ابزارهایی که در گیمپ آنها را مشاهده خواهید کرد با فتوشاپ مشابه بوده و واژه‌های و اصطلاحات فنی موجود در آنها نیز مشابه می‌باشند. من فکر می‌کنم که یک کاربر متوسط فتوشاپ با صرف کمتر از ۸ ساعت زمان قادر خواهد بود همان سطح توانایی که در فتوشاپ از آن برخوردار بوده، در گیمپ هم بدست آورد.
همانطور که Pluginهای فتوشاپ آنرا قدرتمند ساخته‌اند، در .گیمپ نیز این Pluginها وجود دارند. البته تعداد آنها بستگی به نسخه و توزیع لینوکس شما دارد. ولی بخشی زیادی از آن در تمام توزیع‌ها مشترک هستند.
گیمپ در یک محسط پنجره‌ای واحد قرار ندارد. یعنی هر بخش از برنامه در یک پنجره جداگانه روی میز کار باز می‌شوند. شاید این مسئله در ابتدا کمی شما را اذیت کند، ولی بعدا به آن عادت خواهید کرد. ما در این مقاله زیاد وارد مباحث فنی گیمپ نخواهیم شد و فقط به نکاتی اشاره خواهیم کرد که راه‌گشای شما برای استفاده از این برنامه قدرتمند باشد.

اجرای GIMP
خوب، از هم‌اکنون کار را با گیمپ آغاز می‌کنیم. در ابتدا لازم است که برنامه گیمپ را اجرا کنید. در محیط KDE یا Gnome می‌توانید با باز کردن پنجره RUN فرمان gimp را تایپ نمایید و یا در محیط کنسول فرمان gimp را وارد کنید تا این برنامه اجرا شود. در صورتی که برای اولین بار این برنامه را اجرا کنید، یک ویزارد برای تنظیم آن از شما سوالاتی خواهد پرسید که کافی است تمام گزینه‌های پیش‌گزیده را انتخاب نموده و آنرا به پایان برسانید. پس از چند لحظه چند پنجره باز خواهند شد. پنجره اصلی برنامه گیمپ دارای عنوان The GIMP می‌باشد. (تصویر ۱)




همانطور که می‌بینید، بسیاری از ابزارها کاملا آشنا هستند.برای شروع کار و پیشرفت در مطلب، یک تصویر آزمایشی ایجاد نموده و تا پایان مقاله آنرا تکمیل خواهیم کرد. کافی است کلیدهای Ctrl+N را فشار دهید و یا از منوی File گزینه New را انتخاب کنید. اکنون می‌توانید در پنجره‌ای که باز می‌شود، تنظیماتی مانند اندازه تصویر، حالت رنگ‌ها، وضوح و ... را تعیین کنید. پنجره آشنا به نظر می‌رسد. اینطور نیست؟ (تصویر ۲)




خوب، پس از اتمام تنظیمات، روی OK کلیک کنید تا تصویر جدید ایجاد شود. در گیمپ برای اجرای فرامین روی تصویر، باید روی تصویر کلیک راست کرده و فرمان مورد نظرتان را پیدا و اجرا کنید. بنابراین به دنبال این نباشید که در منوی File برنامه به دنبال فرامین باشید! تصویر ۳ یکی از این منوها را به شما نشان می‌دهد.




ما قصد داریم تا کار را از ایجاد یک متن شروع کنیم. در حال حاضر گیمپ از متون فارسی پشتیبانی نمی‌کند. دلیل آن این است که در حال حاضر بر پایه GTK 1.x قرار دارد. بزودی نسخه 2.0 گیمپ که مبتنی بر GTK 2.0 است ارائه خواهد شد که در آن از زبان فارسی نیز پشتیبانی خواهد شد. در حال حاضر برای کار روی متون فارسی می‌توانید متون را بوسیله یک برنامه دیگر تایپ کرده و بصورت تصویر به گیمپ منتقل کرده و روی آنها کار کنید. من برای این کار از OpenOffice Draw استفاده می‌کنم. یک متن آزمایشی آماده کرده و آن را به فرمت PNG صادر (Export) کرده و در گیمپ با فشردن کلیدهای Ctrl+O آنرا باز می‌کنم. سپس Ctrl+A و Ctrl+C و تصویری که در حال کار روی آن هستیم را انتخاب کرده و Ctrl+V را فشار می‌دهم. با این کار تصویری که حاوی متن فارسی بود تبدیل به یک Floating Selection خواهد شد. در گیمپ هرچه را که Paste نمایید، مستقیما تبدیل به یک لایه نخواهد شد. برای اینکه آنرا تبدیل به یک لایه نمایم، پنجره لایه‌ها را با کلیک راست روی تصویر و انتخاب Layers>Layers, Channels and paths بار می‌کنم و در این پنجره روی آیکون New Layer که شبیه یک کاغذ می‌باشد، کلیک می‌کنم. (تصویر ۴)




سپس تصویر را با فشردن دگمه‌های Ctrl+S ذخیره می‌کنم. همانند فرمت PSD در فتوشاپ که فرمت لایه‌ها در آن حفظ می‌شود، در صورتی که فرمت XCF را انتخاب کنید، تصویرتان اطلاعات لایه‌ها را به همراه خواهد داشت. فرمت XCF را انتخاب کرده و سپس نام فایل را وارد می‌کنم. در اینجا لازم است به این نکته اشاره کنم که گیمپ قادر است بسیاری از فایل‌های PSD فتوشاپ را بخواند. البته فایل‌هایی که در آنها عملیات خاصی مانند انیمیشن و... انجام شده است را نخواهد خواند. این قابلیت بسیار جالب است. پس می‌توانید از فایلهای PSD که قبلا ایجاد کرده‌اید، در گیمپ استفاده کنید.
برای ادامه کار، بخش سفید رنگی را که دور متن فارسی قرار دارد، با استفاده از ابزار Fuzzy Select گیمپ که مشابه Magic Wand فتوشاپ عمل می‌کند، انتخاب می‌کنیم. سپس با فشردن دگمه‌های Ctrl+X آنها را حذف می‌کنیم. (تصویر ۵ بخش انتخاب شده را نمایش می‌دهد)




برای برداشتن حالت انتخاب یا انتخاب یک لایه، از دگمه‌های Ctrl+T استفاده کنید. همانند برنامه‌های دیگر برای Undo کردن یک عمل می‌توانید از کلیدهای Ctrl+Z استفاده نمایید. کلیدهای Ctrl+R برعکس این کار یعنی عمل Redo را انجام می‌دهند. اکنون بخش عمده قسمت سفید رنگ حذف شده و تعدادی لکه جزیی باقی مانده است. برای پاک کردن آنها با استفاده از ابزار ذره بین و یا کلیک راست روی تصویر و انتخاب منوی View بزرگنمایی تصویر را تغییر داده و آنها را نیز مطابق روش گفته شده در بالا حذف می‌کنیم. البته برای این کار می‌توانید از دگمه‌های = و – نیز استفاده کنید.
کاربرد سایر ابزارهای گیمپ مانند ابزار متن، ابزار برش، ابزار انتقال، پاک کن، قلم و نیز بسیار آسان است. اکنون بخش‌های اضافی تصویر را با استفاده از ابزار برش (Crop) حذف می‌کنیم. تصویر ۶ تنظیم ابزار برش را نمایش می‌دهد.




پش از پایان روی Crop کلیک می‌کنیم تا تصویر به اندازه دلخواه در آید. در صورتی که نیاز داشتید تا کل تصویر را بصورت هماهنگ مقداری کوچک کنید، روی تصویر کلیک راست کرده و از منوی Image بخش Scale Image را انتخاب کرده و در آن اندازه دلخواه را تنظیم کنید. برای تغییر اندازه در یک یا چند بعد خاص، از منوی image گزینه Canvas Size را انتخاب کنید. برای تغییر اندازه یک لایه خاص، می‌توانید از پنجره لایه‌ها روی لایه مورد نظر کلیک راست کرده و گزینه Scale Layer را انتخاب کنید.
همانند برنامه فتوشاپ، در گیمپ هم می‌توانید از پنجره لایه‌ها، لایه‌ها را تغییر محل داده، به هم متصل نموده، آنها را حذف و اضافه کنید.
اکنون ما قصد داریم تا رنگ متن را که در حال حاضر مشکی می‌باشد، به رنگ دیگری تغییر داده و سپس عملیات دیگری روی آن انجام دهیم. برای این کار، ابتدا در پنجره اصلی گیمپ روی رنگ پیش‌زمینه که مشکی است کلیک کرده و در پنجره‌ای که باز می‌شود، رنگ مورد نظر را انتخاب می‌کنیم. (تصویر ۷)




سپس با استفاده از Fuzzy select و کلید shift تمام بخش‌های مورد نظر را انتخاب می‌کنیم و با استفاده از ابزار سطل رنگ، رنگ منطقه انتخاب شده را تغییر می‌دهیم. (تصویر ۸)




خوب! عجب کار قشنگی! خوب اکنون تعدادی از فیلترهای گیمپ را روی تصویرمان آزمایش می‌کنیم. در ابتدا، روی تصویر کلیک راست کرده و منوی Filter را انتخاب می‌کنیم. چقدر فیلتر! از منوی فیلتر گزینه Rebder و سپس Add Glow را انتخاب می‌کنم. در پنجره کوچک تنظیمات فیلتر، می‌توانید رنگ حاشیه را تعیین کنید. پس از اتمام تنظیمات، روی OK کلیک می‌کنم. خوب! نتیجه را در تصویر ۹ مشاهده می‌کنید.




زیبا است نه؟ خوب الان عملیات دیگری انجام می‌دهیم. یک رنگ جدید برای پیش‌زمینه انتخاب کرده، پنجره لایه‌ها را باز کرده و یک لایه جدید با رنگ پیش‌زمینه (Foreground) ایجاد می‌کنم. لایه را با کلیک روی آن در پنجره لایه‌ها انتخاب کرده و سپس با فشردن کلیدهای Ctrl+A تمام لایه را انتخاب می‌کنم. سپس روی تصویر کلیک راست کرده و از منوی Filter بخش Artistic و سپس Cubism را انتخاب می‌کنم. سپس لایه را به پایین‌ترین مکان منتقل می‌کنم. (با استفاده از فلش‌های موجود در پنجره لایه‌ها) نتیجه کار را در تصویر ۱۰ می‌بینید.




تعداد زیادی فیلتر برای بکارگیری در تصاویر وجود دارند که برای آشنایی با تمام آنها باید مقداری وقت صرف کرده و با گیمپ سر و کله بزنید. یکی دیگر از قابلیت‌های جالب گیمپ بخش Extensions آن می‌باشد. اگر دقت کرده باشید در پنجره اصلی Gimp یک منوی با نام Xtns وجود دارد. در این بخش تعدادی اسکریپت قرار داده شده که بطور خودکار کارهایی برای شما انجام می‌دهند. مانند پردازش تصویر، ایجاد دگمه برای وب و دهها امکان دیگر. تعدادی از ابزارهای این بخش را نیز بررسی می‌کنیم. برای شروع از منوی Xtns بخش Script Fu و سپس Logos و سپس 3DOutline را انتخاب می‌کنم. در پنجره تنظیمات که باز می‌شود، متن مورد نظرم را تایپ کرده و قلم دلخواه را انتخاب می‌کنم. حاصل کار بصورت تصویر ۱۱ خواهد بود.




در همین منو، اسکریپت Cool Metal تصویری بسیار زیبا ایجاد می‌کند که در تصویر شماره ۱۲ آنرا می‌بینید.




و یا اسکریپت Frosty تصویری مشابه با شکل ۱۳ ایجاد می‌کند. مطمئن هستم در صورتی که کمی حوصله و شور و ذوق و صد البته وقت داشته باشید، با استفاده از Gimp قادر خواهید بود تصاویر و گرافیک‌هایی ایجاد کنید که تا بحال در خواب هم آنها را ندیده‌اید.




بطور کلی اگر بخواهم همینطور قابلیت‌های مختلف GIMP را توضیح دهم، این مقاله به یک کتاب تبدیل خواهد بود. هدفم از نوشتن این مقاله تنها آشنا سازی شما برخی از قابلیت‌های کلیدی گیمپ بود و کشف ادامه قابلیت‌ها را به عهده خودتان می‌گذارم. گیمپ دارای قابلیت‌هایی است که برخی متخصصین در برخی موارد آنرا قویتر از فتوشاپ می‌دانند. این برنامه دائما در حال توسعه بوده و قابلیت‌های جدیدی به آن اضافه می‌شود. ضمنا برای دستیابی به راهنمای کامل برنامه گیمپ به آدرس http://manual.gimp.org مراجعه کنید.

+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:59  توسط یوسف عبدلیان باریکرسفی  | 

نگاهی به لینوکس Ubuntu 4.10

در دنیای لینوکس، تولد برخی از توزیع‌ها یا ارائه نسخه‌های جدید آنها با سر و صدای زیادی همراه است. توزیع Ubuntu نیز یکی از این توزیع‌هاست که ارائه آن سر و صدای زیادی برپا کرد که هر فرد کنجکاوی را تحریک به آزمایش آن می‌کند.
Ubuntu
نامی است آفریقایی به معنی انسانیت و بهتر روح انسانیت و هدف از آن ارائه سیستم‌عاملی است رایگان و آزاد برای همه با بهترین کیفیت و پشتیبانی. این توزیع هر ۶ ماه بروز خواهد شد و هر نسخه منتشر شده تا ۱۸ ماه از پشتیبانی امنیتی برخوردار خواهد بود. این توزیع یک توزیع مبتنی بر دبیان بوده و از میزکار GNOME 2.8 که به تازگی ارائه شده، استفاده می‌کند. مجموعه اداری بکار رفته در آن نیز مجموعه OpenOffice.org است. برخلاف اکثر توزیع‌ها، Ubuntu تنها بر روی یک دیسک ارائه می‌شود. دلیل آنهم روشن است. Ubuntu تنها نرم‌افزارهای کاربردی لازم را به همراه خود دارد. بدون هیچ چیز اضافی و از میزکار KDE هم که خبری نیست.

نصب Ubuntu
برنامه نصب Ubuntu همان Debian installer جدید است که قرار است همراه با Debian Sarge ارائه شود. البته با کمی دستکاری. نصب آن بسیار شبیه به نصب Debian Sarge است و کل عملیات نصب در عرض چند دقیقه و بدون مشکل یا دشواری خاصی انجام می‌شود. کاربران تازه‌کار هم به راحتی خواهند توانست آنرا نصب کنند. در Ubuntu کلمه عبوری که برای نخستین کاربر تنظیم می‌کنید، همان کلمه عبور ریشه شما خواهد بود. ضمنا شما نخواهید توانست به عنوان کاربر ریشه وارد سیستم شوید و یا از دستور su استفاده کنید. بجای su باید از دستور sudo به همراه دستوری که مایل به اجرای آن هستید، استفاده نمایید.

ورود به سیستم
فرایند نصب با یک بوت و نصب بسته‌های نرم‌افزاری همراه است. پس از اتمام آن، GDM اجرا شده و می‌توانید وارد محیط میزکار GNOME شوید. نخستین چیزی که جلب توجه می‌کند، ظاهر ساده، سبک و زیبای Ubuntu به همراه جلوه‌های زیبای صوتی آن است. اگر کاربری هستید که معمولا با KDE کار می‌کنید، کمی طول می‌کشد تا به GNOME عادت کنید. زبان فارسی را می‌توانید به راحتی از بخش تنظیمات صفحه‌کلید فعال کرده و قلم‌های اضافی را نیز در پوشه fonts. دایرکتوری خانگی خود کپی نمایید و با یکبار راه‌اندازی Xfree86، قلم‌ها بارگذاری خواهند شد. تصویر زیر محیط میزکار Ubuntu را نمایش می‌دهد.

اتصال به اینترنت
شما با یک دبیان سر و کار دارید! به راحتی می‌توانید با استفاده از دستور pppconfig اتصال‌های اینترنتی تلفنی را تعریف و با استفاده از دستورهای pon و poff اتصال خود را برقرار و قطع کنید. مجموعه ابزارهای کاملی برای ارتباطات اینترنتی در اختیار شماست. مرورگر فایرفاکس، برنامه پیام رسان gaim، برنامه پست الکترونیکی Evolution، ابزارGnomeeting برنامه چت Xirc و حتی یک Terminal Server Client.

گرافیک
Ubuntu
دارای ابزارهای گرافیکی تقریبا کاملی است. دو برنامه نمایش تصویر، برنامه GIMP 2.0، نرم‌افزار GV برای نمایش فایل‌های PDF و ابزار اسکن Xsane.

چند رسانه‌ای
مختصر و مفید. برنامه پخش CD محیط GNOME، برنامه پخش موزیک Rhytmbox، یک ابزار CDRipper برای تبدیل دیسک‌های صوتی، پخش کننده ویدئوی Totem که از هسته Xine استفاده می‌کند و برنامه کنترل Volume و میکسر.

ابزارهای اداری
کل ابزارهای اداری Ubuntu شامل مجموعه اداری قدرتمند OpenOffice.org و مجموعه Evolution Groupware است.

ابزارهای مدیریتی
ابزارهای مدیریتی Ubuntu شامل ابزارهایی است که به همراه GNOME 2.8 ارائه شده است. برای مدیریت بسته‌های نرم‌افزاری نیز ابزار خوش دست Synaptic ارائه شده است. البته سیستم apt-get دبیان قدرت و انعطاف پذیری زیادی به کاربر خواهد داد.

نتیجه‌گیری
Ubuntu
قطعا یک میزکار سبک، سریع، با کیفیت، سهل الاستفاده و قدرتمند است. میزکاری تمیز بدون ذره‌ای نرم‌افزار اضافه که کل آن در ۱.۵ گیگابایت فضا نصب خواهد شد. ولی در این میزکار کمبودهایی نیز احساس می‌شود. از جمله اینکه بسیاری از نرم‌افزارهای جانبی و محیط‌های رومیزی مانند KDE وجود ندارند و این کمبود به شدت احساس می‌شود. مثلا یک برنامه درست و حسابی برای ایجاد CD/DVD بر روی آن وجود ندارد و تنها برنامه درونی نگارنده دیسک Nautilus موجود است که برای نیازهای حرفه‌ای چیز چندان جالبی نیست. من شخصا ترجیح می‌دهم که از XMMS برای پخش موسیقی استفاده کنم، ولی حتی این ابزار محبوب نیز در آن گنجانده نشده است. با Ubuntu شما یک سیستم دبیان مدرن با تمامی ویژگی‌های فنی آن مانند پایداری، شناسایی خودکار سخت‌افزار و... را بدون نرم‌افزارهای کافی خواهید داشت. البته Ubuntu یک مخزن از بسته‌های نرم‌افزاری جانبی به نام Universe دارد که شما می‌توانید با تنظیم apt از آن برای دریافت بسته‌های نرم‌افزاری مورد نیازتان استفاده کنید، ولی باید توجه داشته باشید که این بسته‌های اضافی از طرف Ubuntu پشتیبانی نمی‌شوند و اصلاحیه‌های امنیتی نیز برایشان ارائه نخواهد شد. با اینکه استفاده از Ubuntu بسیار راحت است، ولی آنرا برای کاربرانی که تازه می‌خواهند کار با گنو/لینوکس را شروع کنند، توصیه نمی‌کنم. وجود هسته 2.6 و محیط GNOME این امکان را ایجاد می‌کند تا بتوانید آنرا در کامپیوترهای قدیمی‌تر نیز نصب و استفاده کنید.

+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:58  توسط یوسف عبدلیان باریکرسفی  | 

برپا سازی کلاسترهای OpenMosix

برپا سازی کلاسترهای OpenMosix
جهت برپا سازی یک کلاستر، شما به حداقل دو دستگاه مبتنی بر لینوکس که به یک شبکه داخلی متصل بوده و قادر به کامپایل کردن و اجرای هسته‌های سری 2.4 باشند، نیاز دارید. همچنین شبکه شما باید دارای حداقل سرعت ۱۰۰ مگابیت باشد. این سرعت به شما سرعت بسیار خوبی را اعطا خواهد نمود. سرعت اترنت استاندارد یعنی ۱۰ مگابیت به شما سرعت چندان جالب توجهی نخواهد داد. البته در صورتی که شبکه شما از این نوع است و مایل هستید تا فقط OpenMosix را تجربه نمایید، پاسخ‌گو خواهد بود. استفاده از اترنت‌های گیگابیت مفید بوده ولی انتخابی است. البته ممکن است واقعا به آن نیاز نداشته باشید و اترنت ۱۰۰ مگابیت امور شما را به خوبی انجام دهد.
اتصال گره‌های کلاستر به یک سوئیچ پرسرعت سیستم‌های شما را قادر خواهد ساخت تا در حالت Full Duplex عمل نموده و پهنای باند شما دو برابر گردد. همچنین می‌توانید در یک کلاستر ۲ یا ۳ گره‌ای از سیم کشی مخصوص جهت اتصال مستقیم گره‌ها به هم استفاده نمایید.
داشتن فضای Swap کافی قویا توصیه می‌شود. به این صورت شما قادر خواهید بود تا گره‌ها را بصورت دینامیک از کلاستر خارج نمایید بدون اینکه با کمبود حافظه مواجه شوید. این موضوع نیز انتخابی بوده و ممکن است در شرایط خاصی که کلاستر تحت فشار کاری بالایی قرار دارد، به شما کمک کند.
در کنار مطالب بالا، باز هم اضافه می‌کنم که امکان ایجاد یک کلاستر مبتنی بر فقط دو دستگاه لینوکس و یک اترنت استاندارد نیز وجود دارد.
لازم نیست که تمام کامپیوترهایی که در یک کلاستر قرار می‌گیرند قوی باشند و یا مهم نیست که دارای سخت‌افزارهای متنوعی باشند. هر قدرت پردازشی می‌تواند به سرعت جمعی کمک کند!

شروع کار
فرایند برپاسازی کلاسترهای لینوکس بسیار ساده می‌باشد. ابتدا باید هسته‌هایی که OpenMosix روی آنها فعال شده‌اند را روی گره‌های کلاسترها نصب کرده و سپس ابزارهای کاربری را روی همه آنها نصب کرده و یک تنظیم کوچک در یک فایل پیکربندی انجام دهیم.
به عنوان نخستین مرحله از کار، باید ابزارهای نرم‌افزاری لازم را فراهم آورید. نخستین چیزی که به آن نیاز دارید، کد منبع هسته‌ای است که مایلید روی آن کار کنید. کد منبع هسته خود را می‌توانید از http://kernel.org دریافت نمایید. من برای اجرای پروژه، از هسته 2.4.23 استفاده کرده‌ام. در قدم بعدی باید وصله‌های هسته OpenMosix و سپس ابزارهای نرم‌افزاری OpenMosix را دریافت نمایید. برای دانلود وصله‌های هسته OpenMosix می‌توانید به سایت رسمی آن در آدرس http://openmosix.sf.net یا http://openmosix.org مراجعه کنید و یا از لینک‌های زیر برای هسته‌های مورد نظرتان استفاده کنید:

هسته 2.4.21:http://tab.tuxfamily.org/download/openmosix/releases/patch-2.4.21-om-20030825.bz2
هسته 2.4.22:http://tab.tuxfamily.org/download/openmosix/releases/patch-2.4.22-om-20031215.bz2
هسته 2.4.23:http://tab.tuxfamily.org/download/openmosix/stable/patch-2.4.23-om-20031215.bz2
هسته 2.6.0 (آزمایشی):http://tab.tuxfamily.org/download/openmosix/unstable/patch-2.6.0-om-0.20031202.1.bz2
ابزارهای نرم‌افزاری:http://umn.dl.sourceforge.net/sourceforge/openmosix/openmosix-tools-0.3.5.tar.bz2

فراموش نکنید که همیشه می‌توانید جدیدترین نسخه‌های وصله هسته و ابزارهای نرم‌افزاری OpenMosix را از سایت رسمی آن دریافت نمایید. پس از اتمام دریافت تمامی اقلام مورد نیاز (تنها کد منبع هسته دارای حجم زیادی است و بقیه ابزارها همگی بین ۲۰۰ تا ۳۰۰ کیلوبایت ظرفیت دارند!) باید تجهیز گره‌‌های کلاستر را شروع کنید. ابتدا لازم است در شبکه محلی خود کامپیوترهایی را که مایلید به عنوان گره‌های کلاستر استفاده کنید، تعیین نمایید. من در دفتر کار خود دو دستگاه را برای این منظور انتخاب کردم. (تصویر زیر)




همانطوری که قبلا اشاره کردم، لازم نیست که گره‌های کلاستر حتما قویترین ایستگاه‌های کاری روی شبکه باشند. دستگاه‌های انتخابی من دارای مشخصات زیر هستند:

Node No.1 : Debian (LAN SERVER)
CPU : P-III 800 MHz
RAM: 128 MB SD-RAM
NIC : SIS 100 Mbps
HDD: 2x40GB
Distro : Debian GNU/Linux 3.0 (woody)
Kernel: 2.4.23 (will be 2.4.23-om)

Node No.2 : Cyber (Workstation)
CPU : Celeron 333 MHz
RAM: 160 MB SD-RAM
NIC : D-Link 100 Mbps
HDD: 1x6.4GB
Distro : Libranet GNU/Linux 2.8.1
Kernel: 2.4.21 (will be 2.4.23-om)


پس از تعیین گره‌های کلاستر، شروع به نصب نرم‌افزارهای لازم برای این کار می‌کنیم. این عملیات را برای تمام گره‌ها باید تکرار کرد. برای شروع هسته OpenMosix را نصب می‌کنیم. ابتدا کد منبع هسته را در آدرس usr/src کپی کرده و آنرا با استفاده از دستورهای زیر باز می‌کنیم:

# cd /usr/src
# bzip2 -d linux-2.4.23.tar.bz2
# tar -xf linux-2.4.23.tar
# mv linux linux.old
# ln -s linux-2.4.23 linux

سپس وصله هسته را در کد منبع خود اعمال می‌کنیم:

# cd linux
# cat /home/alan/patch-2.4.23-om-20031215.bz2 | bzip2 -d | patch -p1 -l

کد منبع هسته در چند ثانیه وصله خواهد شد. اکنون می‌توانید طبق روال‌های گذشته هسته را پیکربندی و کامپایل نمایید. فقط اطمینان حاصل کنید که گزینه‌های زیر را در بخش OpenMosix پیکربندی هسته انتخاب کنید:

[*] openMOSIX process migration support
[*] Stricter security on openMOSIX ports
[*] openMOSIX File-System
[*] Poll/Select exceptions on pipes

برای شروع پیکربندی هسته، دستور زیر را وارد نمایید:

# cd /usr/src/linux
# make menuconfig

پس از اتمام پیکربندی و ذخیره تغییرات، برای کامپایل شدن هسته دستورات زیر را وارد نمایید:

# make-kpkg clean
# make-kpkg --revision=8:MOSIX01 kernel_image

و یا خیلی ساده‌تر:

# make-kpkg clean
# make-kpkg kernel_image

این نحو عملیات کامپایل هسته به یک بسته دبیان ختم خواهد شد که قادرید آنرا به راحتی روی سیستم نصب نمایید. مدت زمان انجام عملیات کامپایل هسته به سرعت پردازنده سیستم بستگی دارد. پس از اتمام عملیات کامپایل هسته، بسته‌ای را که ایجاد شده است، نصب می‌کنیم:

# dpkg -i kernel_image-2.4.23-om_MOSIX01_i386.deb

هنگام نصب این بسته، مدیر بوت Lilo به طور خودکار پیکربندی خواهد شد. در صورتی که از گراب استفاده می‌کنید، باید تغییرات را بطور دستی در فایل پیکربندی آن اعمال نمایید. برای این منظور باید فایل boot/grub/menu.lst را ویرایش کرده و خطوط زیر را اضافه نمایید. البته مقادیری مانند پارتیشن‌های قابل بوت و سایر آدرس‌ها ممکن است روی سیستم‌های شما متفاوت باشد که آنها را باید تغییر دهید:

title Libranet GNU/Linux, kernel 2.4.23 OpenMosix
root (hd0,1)
kernel /vmlinuz-2.4.23-om root=/dev/hda3 ro hdb=scsi
savedefault
boot

پس از اتمام نصب هسته‌ها، اکنون باید ابزارهای نرم‌افزاری OpenMosix را نصب نماییم. برای این منظور، فایلی را که دانلود کرده بودیم، باز کرده و کامپایل و نصب می‌کنیم:

# bzip2 -d openmosix-tools-0.3.5.tar.bz2
# tar -xf openmosix-tools-0.3.5.tar
# cd openmosix-tools-0.3.5
# ./configure --with-kerneldir=/usr/src/linux-2.4.23/
# make
# make install

کامپایل و نصب ابزارهای نرم‌افزاری مدت زیادی طول نمی‌کشد (۱-۲ دقیقه یا کمتر روی پردازنده‌های قویتر). پس از اتمام آن، باید در یکی از فایل‌های پیکربندی مربوطه لیست گره‌های کلاستر را تعریف کرده و سپس سرویس OpenMosix را طوری تعریف کنیم تا هر بار بصورت خودکار اجرا شود. به این منظور ابتدا دستور:

# vi /etc/openmosix.map

اجرا کرده و باید مشخصات گره‌ها را بصورت <شماره گره> <آدرس IP گره> <تعداد> وارد نماییم:


1 192.168.0.1 1
1 192.168.0.7 1

آرگومان شماره هنگامی مفید است که بخواهیم چند آدرس IP پشت سرهم را تعریف نماییم. مثلا در صورتی که ۱۰ گره داشته باشیم که آدرس آنها از ۲۵ شروع می‌شود، وارد خواهیم کرد:

1 192.168.0.25 10

و عملیات تایپ ما را بسیار کمتر خواهد کرد. این فایل پیکربندی روی تمام گره‌ها یکسان است. بنابراین می‌توانید آنر روی تمام گره‌ها کپی کنید. پس از انجام این کار به راه‌اندازی خودکار OpenMosix می‌پردازیم. ابتدا باید تعیین کنید که سطح اجرایی پیش‌گزیده هر یک از گره‌ها کدام است. به این منظور دستور زیر را وارد نمایید:

# runlevel
N 2

خوب سطح اجرایی پیش‌گزیده ما ۲ است (سیستم‌های مبتنی بر دبیان). بنابراین وارد دایرکتوری etc/rc2.d می‌شویم. در صورتی که سطح اجرایی شما متفاوت شد، این عملیات را با دایرکتوری مربوط به آن که می‌تواند rc3.d، rc4.d و... باشد انجام دهید:

# cd /etc/rc2.d
# ln -s ../init.d/openmosix S20openmosix

در اینجا نمی‌خواهم فلسفه دستورات بالا را توضیح دهم زیرا از مسیر اصلی دور خواهیم شد. پس از اتمام عملیات بالا و بوت سیستم‌ها، سیستم‌هایی داریم که مبتنی بر OpenMosix بوده و سرویس آن نیز بطور خودکار اجرا می‌شود. برای بکار افتادن کلاستر، گره‌ها را بوت می‌کنیم. گره شماره ۱ با موفقیت OpenMosix را اجرا می‌کند، ولی گره شماره ۲ با پیغام Invalid Map File قادر به اتصال به کلاستر نیست. پس مقداری جستجو و بررسی فایل پیکربندی، متوجه می‌شوم که در فایل etc/hosts یک ورودی به صورت زیر موجود است:

127.0.0.1 cyber

آنرا تبدیل به ورودی زیر می‌کنم:

192.168.0.7 cyber

مجددا سرویس OpenMosix را با دستور etc/init.d/openmosix restart اجرا می‌کنم. اکنون بدون مشکل اجرا می‌شود. برای حصول اطمینان از شناخته شدن تمام گره‌های کلاستر، با دستور زیر آنها را آزمایش می‌کنم:

# mosctl status 1
up.
# mosctl status 2
up.

بسیار عالی! هر دو گره کلاستر در حال اجرا هستند. اکنون کلاستر ما آماده است. با استفاده از دستور mosmon می‌توانید وضعیت کلی کلاستر را بررسی نمایید. اینکه کدام سیستم‌ها دارای چه مقدار بار فعال هستند و با گذاشتن بار روی یکی از آنها چه اتفاقی خواهد افتاد و ...

+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:57  توسط یوسف عبدلیان باریکرسفی  | 

مفاهیم کلاسترها و OpenMosix

پیش‌درآمد
مبحث کلاسترها در لینوکس یکی از جذاب‌ترین و جالب‌ترین مباحث برای افراد علاقه‌مند به پردازش‌های موازی است. بدلیل علاقه بسیار زیاد خودم به این مبحث تصمیم به تهیه مقاله‌ای در این مورد گرفتم و بهتر دیدم یکی از بهترین مقالات موجود را ترجمه کرده و تجربه‌های خودم را نیز به آن اضافه کنم. مقاله حاضر برگرفته از نوشته‌های دانیل رابینز (Daniel Robbins) می‌باشد. این نوشته‌ها را می‌توانید از این نشانی دریافت نمایید. دانیل رابینز طراح و خالق لینوکس Gentoo می‌باشد. همانطور که اشاره کردم، این یک ترجمه تنها نیست. من خود تمام آنرا عملا انجام داده و بخش‌های عملی راهنمای فوق را کاملا تغییر داده و روش آسان‌تری را برای اجرای کلاستر پیشنهاد کرده‌ام. در بخش نخست این مقاله که اکنون در حال خواندن آن هستید، با مفاهیم کلاسترهای لینوکس تا حدودی آشنا خواهید شد. در بخش بعدی به طور عملی اقدام به برپاسازی یک کلاستر لینوکس خواهیم کرد.

کلاسترها چه هستند؟
به طور عمومی هنگامی که صحبت از کلاسترها می‌شود، مقصود فناوری‌هایی است که از طریق آن کامپیوترهای مختلف بتوانند با هم و با اشتراک قدرت پردازش هم، بتوانند امور پردازشی را که به آنها محول شده است، انجام دهند. این امور پردازشی همه چیز می‌تواند باشد. از پردازش‌های سنگین علمی تا تبدیل فایل‌های موسیقی و یا رندر کردن جلوه‌های ویژه فیلم‌های سینمایی. برای مثال، تمامی جلوه‌های ویژه فیلم‌های ارباب حلقه‌ها توسط کلاسترهای لینوکس رندر و پردازش شده‌اند.
انواع مختلفی از فناوری‌های کلاستر سازی برای سیستم‌عامل لینوکس وجود دارند. یکی از شناخته شده ترین آنها کلاستر Beowulf است. این کلاستر حاوی چندین ماشین است که توسط یک شبکه محلی پرسرعت به هم متصل شده‌اند. برای استفاده از این سیستم‌های کلاستر، برنامه‌های کاربردی باید مجددا برای استفاده از آن با استفاده از کتابخانه‌های کلاستر سازی نوشته شوند. عمومی‌ترین کتابخانه‌های کلاستر سازی عبارتند از PVM و MPI. هر دوی این کتابخانه‌ها بسیار عالی کار می‌کنند. با استفاده این کتابخانه‌ها، برنامه نویسان قادر به نوشتن برنامه‌هایی هستند که از منابع روی کلاستر همانند منابع روی یک کامپیوتر، بهره گیری نمایند.برای بسیاری از برنامه‌های کاربردی، PVM و MPI امکان افزایش خطی قدرت پردازش کلاسترها را با توجه به تعداد ماشین‌های روی آن فراهم می‌نمایند.

PVM و MPI به درد همه نمی‌خورد!
با اینکه کلاسترهای Beowulf بسیار قدرتمند هستند، ولی به درد همه کس نمی‌خورند! بزرگترین اشکال آنها نیاز به نرم‌افزارهای خاص می‌باشد که با استفاده از PVM و MPI نوشته شده باشند تا بتوانند از مزایای کلاستر استفاده کنند. البته این برای مراکز علمی و تحقیقاتی که برنامه‌های کاربردی خاص خود را از ابتدا می‌نویسند، اشکال مهمی نیست. آنها به راحتی قادرند تا از MPI و PVM استفاده کنند.
حقیقتا درصد افراد و موسساتی که برنامه‌های کاربردی خود را از ابتدا می‌نویسند بسیار پایین است. برای کسانی که مایل هستند تا یک کلاستر بنا کرده و از مزایای آن در اجرای برنامه‌های کاربردی عادی استفاده کنند، این یک مسئله بزرگ است! برنامه‌های کاربردی این دسته از موسسات بدون استفاده از کتابخانه‌های کلاستر سازی نوشته شده‌اند، بنابراین این گونه موسسات قادر نیستند تا از مزایای کلاسترها بهره‌گیری نمایند.
آیا جالب نیست که یک فناوری وجود داشته باشد تا بتوانید با استفاده از آن از مزایای کلاسترهای لینوکس استفاده کنید، بدون آنکه نیاز داشته باشید تا برنامه‌های کاربردی خود را از ابتدا نوشته و یا حتی آنها را مجددا کامپایل نمایید؟ خوشبختانه چنین فناوری وجود دارد و نام آن OpenMosix است!

ورود به OpenMosix
OpenMosix
قابلیت‌های کلاستر سازی را به هسته لینوکس اضافه می‌کند، بنابراین هر پروسه استاندارد لینوکس قادر خواهد بود تا از مزایای منابع کلاستر استفاده نماید. با استفاده از تکنیک‌های موازنه بار تطبیقی (Adaptive Load Balancing) پردازش‌های در حال اجرا بر روی یک گره (node) از کلاستر، قادرند تا بطور نامحسوس به یک گره دیگر از کلاستر مهاجرت کرده و بتوانند سریعتر اجرا شوند. بدلیل اینکه OpenMosix بطور کاملا نامحسوس (Transparent) عمل می‌کند، پردازش‌هایی که از یک گره به گره دیگر مهاجرت می‌کنند، حتی نمی‌دانند (لازم هم نیست بدانند) که در یک ماشین دیگر در حال اجرا هستند!
نامحسوس بودن OpenMosix به این معنی است که برای استفاده از مزایای موازنه بار تطبیقی آن، نیازی به برنامه نویسی خاصی نیست. در حقیقت، یک نصب پیش‌گزیده OpenMosix به طور خودکار پردازش‌ها را به بهترین گره منتقل خواهد کرد. این قابلیت OpenMosix را تبدیل به یک راه‌حل کلاستر سازی می‌کند که می‌تواند برای بخش عظیمی از برنامه‌ها مفید باشد.

OpenMosix دقیقا چکار می‌کند؟
بزرگترین کاری که OpenMosix انجام می‌دهد، تبدیل دسته‌ای از ماشین‌های لینوکس به یک سیستم بزرگ مجازی چند پردازنده‌ای متقارن (SMP=Symmetric MultiProcessor) است. هرچند نحوه عملکرد آن با سیستم‌های SMP واقعی مقداری تفاوت دارد. نخست اینکه سیستم‌های واقعی SMP که مبتنی بر ۲ یا چند پردازنده هستند، می‌توانند اطلاعات را با سرعت بسیار بالا تبادل نمایند، در صورتی که در OpenMosix سرعت ارتباط بین گره‌های کلاستر، محدود به سرعت شبکه محلی است که گره‌ها در آن قرار دارند. استفاده از ارتباطات اترنت گیگابیت و یا سایر انواع پر سرعت اترنت باعث خواهد شد تا تبادل داده‌ها با سرعت بالاتری صورت گرفته و کارایی کلاستر بالاتر باشد.
البته OpenMosix دارای مزایایی نسبت به سیستم‌های چند پردازنده‌ای سنتی داراست. با استفاده از OpenMosix شما قادر به ایجاد کلاسترهایی حاوی دها و حتی صدها کامپیوتر با سخت‌افزار ارزان هستید در حالی که سیستم‌های SMP که حاوی تعداد زیادی پردازنده باشند، می‌توانند بسیار گرانقیمت باشند. برای بسیاری از برنامه‌های کاربردی، OpenMosix نسبت به سیستم‌های SMP یا Mainframe، حرف بیشتری برای گفتن دارد. البته دلیلی وجود ندارد که شما نتوانید OpenMosix را بر روی سیستم‌های قدرتمند چند پردازنده‌ای اجرا نمایید. حتی این امکان وجود دارد تا OpenMosix را به همراه برنامه‌های کاربردی که با MPI یا PVM توسعه یافته‌اند، اجرا نمایید تا سرعت کلاستر خود را بهینه نمایید.
همانند سیستم‌های SMP سنتی، OpenMosix قادر نیست تا یک پروسه را روی چند پردازنده فیزیکی اجرا نماید. واضح‌تر اینکه نباید انتظار داشته باشید تا اجرای برنامه‌ای مانند مرورگر موزیلا روی یک کلاستر سریعتر از یک سیستم تک پردازنده‌ای باشد، مگر اینکه اجرا پروسه آنرا به یک گره سریعتر روی کلاستر منتقل نمایید. بعلاوه در حال حاضر OpenMosix امکان جداسازی رشته‌های متعدد به هم پیوسته را از یکدیگر فراهم نمی‌کند.
OpenMosix
قادر است تا پروسه‌های استاندارد لینوکس را بین گره‌های کلاستر بدون مشکل مهاجرت دهد. در صورتی که یک برنامه کاربردی تعداد زیادی زیر پروسه داشته باشد، آنگاه OpenMosix قادر است تا هر یک از آنها را به یک گره مناسب در کلاستر منتقل کند. شما می‌توانید از این قابلیت حتی در برنامه‌های کاربردی که دارای زیر پروسه نیستند نیز استفاده کنید. برای مثال، در صورتی که نیاز دارید تا تعدادی فایل موسیقی را از فرمت wav به mp3 تبدیل نمایید، تبدیل هر فایل یک پروسه خواهد بود. شما می‌توانید تمام این پروسه‌ها را یکجا اجرا نمایید. در آنصورت عمل پردازش بین کلاستر پخش خواهد شد (بجای اینکه عملیات تبدیل فایل‌ها را یک به یک انجام دهید). در صورتی که شما ۱۲ فایل موسیقی و ۱۲ گره همسان داشته باشید، عملیات تبدیل ۱۲ بار سریعتر انجام خواهد شد.

Mosix در برابر OpenMosix
پروژه OpenMosix جدیدترین شعبه پروژه Mosix می‌باشد که یکی از اهداف آن فراهم کردن کلاستر سازی نامحسوس روی لینوکس است. پس چرا ما از OpenMosix استفاده کنیم؟ دلایل خوبی برای این امر وجود دارد. در اواخر سال ۲۰۰۱ رهبری پروژه Mosix تصمیم به انتشار نسخه‌های جدیدی از Mosix تحت مجوزهای غیر GPL گرفت (کدهایی که قبلا GPL بودند). بنابراین نسخه‌های جدید Mosix دیگر نرم‌افزار آزاد نبودند و حقوق کاربران نیز در آنها نامشخص بود و هیچ مانعی برای نویسنده Mosix وجود نداشت تا از کاربران درخواست پرداخت وجه نماید.
این تغییر مجوز باعث ایجاد نگرانی‌هایی در میان کاربران Mosix شد و برداشته شدن کدهای منبع و حذف لیست‌های پستی Mosix بدون توضیح موجه، این نگرانی را تشدید نمود. خوشبختانه این کاربران تنها کسانی نبودند که در باره این تغییرات جدید نگران بودند. موشه بار (Moshe Bar) یکی از مدیران پروژه Mosix با این تغییر مجوز از GPL موافق نبود. بنابراین وی پروژه OpenMosix را شروع کرد تا این اطمبنان حاصل شود که ارائه نسخه آزاد و رایگان Mosix به عموم مردم ادامه پیدا خواهد کرد. سایت رسمی پروژه OpenMosix در آدرس http://openmosix.sf.net یا http://openmosix.org قرار دارد.
پس از آغاز این پروژه، تعداد زیادی از کاربران Mosix به OpenMosix روی آوردند. سیاست توسعه باز موشه باعث شد تا توسعه OpenMosix سرعت بیشتری بگیرد. در حال حاصر ۱۴ نفر بطور فعال روی پروژه OpenMosix کار می‌کنند در حالی که تعداد افراد پروژه Mosix تنها ۴ نفر است. در حال حاضر تعداد زیادی رفع اشکال، بهینه سازی سرعت و بهینه سازی در کدهای OpenMosix صورت گرفته است و تعدادی قابلیت جدید و بهینه سازی مجدد در سرعت نیز بزودی ارائه خواهند شد. در حقیت جدا شدن پروژه OpenMosix از Mosix باعث ارائه راه‌حل‌های بهتری برای کلاستر سازی تحت سیستم‌عامل لینوکس فراهم نموده است.

+ نوشته شده توسط یوسف عبدلیان باریکرسفی در پنجشنبه سیزدهم دی 1386 و ساعت 12:1 | نظر بدهید

فرض كنيد شما يك برنامه با كاربرد بسيار حرفه اي داريد كه توانايي هاي زيادي مانند حافظه ُ سرعت و غيره از كامپيوتر شما مي طلبد و شما در دفتر كار خود چند پي.سي داريد. خوب شما در آن واحد نمي توانيد معمولا با چند پي سي به طور همزمان كار كنيد مگر اين كه يك هشت پا با مغزي Multi thread باشيد. پس معمولا شما پشت فتوشاپ يا اتوكد يا هر نرم افزار كند ديگري نشسته ايد و بيشتر وقت خود را به حرص خوردن و نگاه كردن به ساعت شني ويندوز / مك يا لينوكس تان مي گذرانيد و اين در حالي است كه دو يا سه كامپيوتر ديگر در محل كار شما بيكار هستند.

البته راه حل هاي Grid Computing وجود دارند كه اجازه مي دهند شما چندين ماشين را به هم متصل كرده و از حافظه و توان محاسباتي آنها به شكل يك پارچه استفاده كنيد ولي اين راه حل ها براي كاربران عادي بسيار گران / مشكل و دور از دسترس هستند. اينجاست كه این را ه حل ساده مفهوم پیدا می کند.

هدف من اين است حالا كه اين امكان وجود ندارد كه از توان چند كامپيوتر به شكل يكپارچه براي اجراي يك برنامه - فرضا فتوشاپ - استفاده كنيم بياييم چند نسخه از آن را در چند كامپيوتر جدا گانه راه اندازي كنيم كه هر كدام منابع خودشان را مصرف كنند و در نهايت كنترل همه آنها را به دست شما بدهيم. به اين ترتيب شما در حالي كه مشغول باز كردن يك فايل بزرگ در فتوشاپ هستيد مي تواني يك نسخه ديگر فتو شاپ را به شكل از راه دور -Remote- بر روي يك كامپيوتر ديگر باز كنيد و به كار خود ادامه دهيد.

حالا نقشه اجرايي

بياييد فرض كنيد شما يك كامپيوتر Master ويندوز اكس پي و چندين ماشين Slave لينوكس ارزان قيمت داريد. قرار است شما مديريت كل سيستم را از پشت ويندوزتان كه خوش دست تر و كار با آن راحت تر است انجام دهيد. فرض مي كنيم شما يك شبكه اترنت 100 مگابيتي هم براي اتصال اين ماشين ها به يكديگر داريد و همه اين ماشين ها يكديگر را در شبكه TCP/IP شما مي بينند.


نرم افزار مورد نياز به غير از سيستم عامل

Real VNC
Client and Server Versions for Both Windows XP and Linux

Cross Over office
Linux

خوب حالا بر روي ماشين هاي لينوكس Cross Over office را نصب كرده و بر روي آن فتوشاپ نصب مي كنيم. حالا ما چندين ماشين لينوكس داريم كه فتوشاپ بر روي آنها نصب شده و بدون افت توان كار مي كند. حالا مساله اين است كه چگونه همه آنها را از ماشين ويندوزمان كنترل كنيم؟

كافيست كه سرويس VNC را بر روي ماشين هاي لينوكس اجرا كنيد :

vncserver

وي.ان.سي چند سوال ساده از شما مانند اسم و كلمه عبور و نام مشتري اكس.ويندو مي پرسد.

اين كار را بر روي تمام ماشين هاي لينوكس تكرار كرده و به هر كدام نام جديدي بدهيد.

در ماشين ويندوز VNC client را نصب و اجرا كنيد و به تمام ماشين هاي لينوكس تك تك Login كنيد. حالا كافي است كه در ترمينال TWM اين دستور را اجرا كنيد:

Photoshop

حالا شما چندين كپي از فتو شاپ داريد كه بر روي پردازنده هاي جدا گانه اي اجرا مي شوند و با هم در بدست آوردن منابع سيستم رقابت نمي كنند.

اكنون مي توانيد كمي از طعم شيرين Virtualization و Grid Computing را بدون داشتن سرور هاي گران قيمت بچشيد.
+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:56  توسط یوسف عبدلیان باریکرسفی  | 

اصول هسته Grid Computing :

تعیین و تعریف Grid Computing :

شیوه و روش Grid Computing رفتارکردن با مجموعه ای از منابعIT یکسان در حالت کلی به عنوان یک مخزن و انبار واحد ، و بهره برداری کردن از هر یک از این منابع به عنوان یک نوع مجزا و متمایز می باشد.

برای رفع مسائل و مشکلات سیستمهای یکپارچه بهمراه منابع پراکنده ، Grid Computing بک تعادل بین مزایای مدیریت منابع در دید کلی از یک سو و کنترل هر یک از منابع بطور انعطاف پذیر از سوی دیگر، برقرار می کند.

که این منابع مدیریت شده در Grid Computing عبارتند از :

* زیرساخت : مجموعه ای از سخت افزارها و نرم افزارها که محیطی را جهت ذخیره داده ها و اجرای برنامه ها فراهم می کنند.

* برنامه های کاربردی : که منطق و جرایان فرآیندهای خاص مؤسسات را تعریف می کنند.

* اطلاعات : مفاهیم اصلی در مدیریت تجارت.

اصول هسته Grid Computing :

دو اصل در هسته Grid Computing آنرا به طور منحصربفردی از دیگر روشهای Computing ازقبیل Mainframe ، Client/Server یا چند لایه ای (Multi-tier) متمایز می سازد : مجازی سازی و تأمین.

* با مجازی سازی ، منابع خاص (مانند رایانه ها ، دیسکها ، اجراء نرم افزاری و منابع اطلاعاتی) به عنوان منابع درهم آمیخته و مشترک جهت دسترسی مصرف کنندگان (از قبیل افراد و برنامه های نرم افزاری) بطور انتزاعی در نظر گرفته می شود.مجازی سازی یعنی شکستن اتصالاتی که بسختی بین ارائه کننده و مصرف کننده (مشتری) منابع برقرار شده است و مهیا ساختن منابع برای سرویس دهی به نیازهای خاص ، بدون اینکه مشتری نگران چگونگی انجام آن باشد.

* تأمین یعنی اینکه ، وقتی مشتری از طریق لایه مجازی سازی نیاز به منبع خاصی دارد ، در پشت پرده ، آن منبع جهت انجام در خواست ،شناسایی شده و به مشتری تخصیص داده شود.تأمین بعنوان بخشی از Grid Computing به این معنی است که سیستم تعیین می کند چگونه نیاز مشتری را برآورده سازد در حالیکه عملیات در کل ، به صورت بهینه انجام شود.

برای نمونه می توان از Oracle 10g به عنوان تنها DBMS پیشتاز در این زمینه یاد کرد که در مقاله بعدی این جنبه ار Oracle 10g را بررسی خواهیم نمود.
+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:54  توسط یوسف عبدلیان باریکرسفی  | 

سوپر کامپیوتر خانگی

سوپر کامپیوتر خانگی

سوپر کامپیوتر خانگی نرم افزار OpenMosix شبکه ای از کامپیوتر های گنو/لینوکس را تبدیل به یک کلاستر می کند. حفظ تعادل بار بین گره ها به صورت اتوماتیک انجام می شود. گره ها می توانند عضو کلاستر شوند یا از گروه خارج شوند بدون این که وقفه ای در سیستم به وجود بیاید. آدرس : http://openmosix.sourceforge.net
+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:50  توسط یوسف عبدلیان باریکرسفی  | 

در جستجوی ماشین مجازی ناهمگن موازی

در جستجوی ماشین مجازی ناهمگن موازی

در جستجوی ماشین مجازی ناهمگن موازی قیمت سخت افزار و سیستم های "بازمانده" -Legacy با سرعت زیادی کاهش می یابد.، این روز ها می توانید سرورهایی با چهار پردازنده پنتیوم 3 را در سایت Ebay.com با قیمت زیر هشتصد دلار بخرید. ماشین های سری ایندیگو و ایندی سیلیکان گرافیکس به قیمت های باورنکردنی پایین فروخته می شوند و هکر ها را وسوسه می کنند که چند تا از این ماشین های افسانه ای را بخرند، مگر بر روی همین ماشین ها مهم ترین اتفاقات مرتبط به رسانه و تکنولوژی اطلاعات در دهه پیش رخ نداده است؟ ولی حقیقت تلخی که وجود دارد این است که تا زمانی که یک واسط برنامه نویسی کاربرد -Application Programming Interface-API- منسجم وجود نداشته باشد که این ماشین ها را در یک کلاستر به هم متصل کند این ماشین ها تنها جنبه افسانه ای خواهد داشت و دردی را از کسی دوا نخواهند کرد. تکنولوژی موسوم به ماشین مجازی ناهمگن موازی -Heterogeneous Parallel Virtual Machine- برای حل این مساله طراحی و معرفی گردیده است. HPVM تلاش می کند مفهوم کلاسترینگ را از چنگ دانشگاه ها و مراکز تحقیقاتی خارج کرده و در اختیار همگان قرار دهد.
+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:49  توسط یوسف عبدلیان باریکرسفی  | 

آی.بی.ام : نرم افزار کلاسترینگ در یک سی دی

آی.بی.ام : نرم افزار کلاسترینگ در یک سی دیآی.بی.ام : نرم افزار کلاسترینگ در یک سی دی در یکی از عجیب و غریب ترین مقالاتی که به زندگی ام دیده ام، مایانک شارما -Mayank Sharma - از آی.بی.ام روشی برای راه اندازی یک سیستم کلاسترینگ را پیشنهاد می کند که نه از نرم افزار های چند هزار دلاری اچ.پی ، سان و آی.بی.ام، و نه از سرور های سوپردام، اولترا اسپارک و پاور استفاده نمی کند. نسخه مایانک شامل یک سی دی Knopix ( قابل تهیه از سوپر مارکت محل شما در تهران) و پی سی های معمولی می شود. این مقاله به طرز عجیبی من را به یاد ماجرای گداخت سرد -Cold Fusion- می اندازد. یعنی واقعا به همین سادگی است؟

Craft a load-balancing cluster with ClusterKnoppix

+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:49  توسط یوسف عبدلیان باریکرسفی  | 

ویندوز هم کلاسترینگ را پشتیبانی خواهد کرد

ویندوز هم کلاسترینگ را پشتیبانی خواهد کرد

ویندوز هم کلاسترینگ را پشتیبانی خواهد کرد بلاخره بعد از سالها انتظار (دقیقا از زمانی که ویندوز ان.تی 4 به بازار آمد، که قرار بود پوزه سولاریس را به خاک بمالد(!))مایکروسافت نسخه ویندوز با قابلیت کلاسترینگ واقعی را پاییز امسال (میلادی) به بازار خواهد داد. سایت نیوز دات کام عنوان خبر را به این شکل نقل کرده است: " نسخه ویندوز برای سوپرکامپیوتر ها این پاییز به بازار می آید". این عنوان که واقعا قابل تمسخر است نشان دهند این است که احتمالا خبرنگار نیوز دات کام یا موضوع کلاسترینگ را (که تبدیل کردن کامپیوتر های معمولی به نوعی سوپر کامپیوتر است، نه سیستم عاملی برای سوپرکامپیوتر ها)نفهمیده یا این که این متد بازاریابی جدیدی از مایکروسافت است. (خدای من ، از فردا مشتریان از ما سوپر کاپیوتر ویندوز که دات نت هم داشته باشد خواهند خواست.)
حدس بزنید این نقشه های "سوپر کامپیوتر" (چه اسم پر طمطراقی، بازار یاب های سان، اچ.پی، اراکل، رد هت و اپل باید از مایکروسافت یاد بگیرند)فعلا حول چه موضوعی می گردد؟ البته مسئله مهم و بسیار فنی و عالمانه پولی که مایکروسافت می خواهد برای هر گره کلاستر از مشتریان دریافت کند.
خبر نیوز دات کام را خودتان بخوانید و بخندید.
+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:48  توسط یوسف عبدلیان باریکرسفی  | 

Enable existing applications for grid

Enable existing applications for grid

Introduction

Before using the techniques described in this article, make sure you are familiar with the six strategies for grid application enablement described in the following "Six strategies for grid application enablement" series of articles:

  • Part 1 provides a series overview of the six strategies, and summarizes the characteristics and benefits of each strategy.
  • Part 2: Strategy 1 Batch Anywhere and Strategy 2 Independent Concurrent Batch shows how to enable applications for the grid using these two strategies. In the first strategy, the application can run as single job on any of many computers in a grid. In the second strategy, multiple independent instances of the application can be running concurrently.
  • Part 3: Strategy 3 Parallel Batch and Strategy 4 Service discusses grid enablement using these two mutually exclusive strategies. In Strategy 3, a batch job is subdivided. Its many independent subjobs run concurrently on behalf of the user who submitted the aggregate job. Strategy 4 discusses implementations of a service-oriented architecture in a grid environment.
  • Part 4: Strategy 5 Parallel Service shows how to make many instances of a service available at once and available to be exploited in parallel by each client.

In this article, we introduce the basic architectural pattern that fits most cases when you enable existing code. Next, we discuss a few strategies to enable existing code based on the most common architectures we have encountered over the years. We introduce two basic scenarios for platform-specific distributed applications, and we will study the most common architectural variations of each scenario and the most common way to make these architectures fit into the enablement pattern. We conclude with two scenarios for Web-enabled applications (servlet-centric and database-centric).

There's a pattern

Most enablement efforts for existing code using batch-oriented grid infrastructure software are similar. There's a pattern you can follow. You can use this pattern to achieve the first three strategies of grid adoption.

The base case for these three strategies for grid adoption is a program that takes command-line parameters and uses files or databases as specified in the command-line parameters. If the program is licensed, the grid infrastructure will require license management capabilities.

In general, the first three strategies to enable an existing application to run on a grid all require the user to send requests to a client application, which acts as a requester to the grid infrastructure. The client to the client application can be the actual user or a portal. The grid infrastructure takes care of deploying the actual application, which becomes a provider to the grid infrastructure. See Figure 1.


Figure 1. Integration pattern for enabling existing code
Integration pattern for enabling existing code

The key point is that the client program (job submission driver) should talk to the grid infrastructure as if it is talking directly to the application. The simplest way to do this is by having the client program issue command-line type instructions to the virtualized application.

Implementing this scenario is easy when the application is a stand-alone program with minimal deployment requirements. But when you're dealing with integrated applications, the whole thing might require a little creativity.

Known scenarios

Enabling existing code using batch-oriented grid infrastructure software involves a finite number of known scenarios because of the state of the software industry today. Two scenarios exist, both involving essentially the same type of application:

  1. Enabling platform-specific distributed applications, which includes client/server, transactional, and batch-oriented applications written before Web applications existed.
  2. Enabling Web-enabled applications, which includes those platform-specific distributed applications that were given Web "front ends" or "wrappers" to make them work as Web applications. In most cases, the integration strategy involves enabling servlet-centric or database-centric applications.



Back to top


Enabling platform-specific distributed applications

As previously mentioned, this scenario applies to client/server, transactional, and batch-oriented applications. Two architectural tendencies prevail in these three types of applications: monolithic and modular.

The case of monolithic applications

In general, deploying platform-specific monolithic applications on batch-oriented grid infrastructure software is as simple as installing the application on all grid nodes and writing some "glue code" that will integrate user requests, parameter passing, and program calls from the grid infrastructure. See Figure 2.


Figure 2. Deploying monolithic applications using the standard enablement pattern
Deploying monolithic applications using the standard enablement pattern

This "glue code" we're talking about is what makes this an integration job. In most cases, you can integrate a monolithic application and a batch-oriented grid infrastructure product through scripting. You can use Perl, Python, or ordinary shell scripts to integrate user requests, parameter passing, and application calls within the context of the grid infrastructure software.

There's a caveat

The caveat has to do with what a monolithic application does and how it does it. Monolithic applications tend to try to be all things to all people. That's one reason they're monolithic (modules are not trustworthy to some people). Sometimes, monolithic applications have, among other things, embedded grid functionality. Embedded items and the way in which such functionality was implemented will determine whether the application can run on a grid.

For instance, a monolithic application that does not have any built-in grid infrastructure functionality will be easier to enable than others. An example would be a similar application that, on top of doing what it is supposed to do, also takes care of tasks such as scheduling which instance processes what request, or which database tables need to be locked on behalf of a given user, or when transaction affinity needs to be enforced. However, we still need to look into how the built-in grid functionality was implemented.

If the built-in grid functionality can be turned off from within the application, then this monolithic piece of code will be able to run on top of batch-oriented grid infrastructure software with no problem. If, on the other hand, the grid functionality is built deep into the application and it cannot be turned off, then we have a problem.

In general, the extent of the work needed to turn off built-in grid infrastructure functionality is very high. When programmers were learning to reuse code, they also learned to abstract functionality both ways: up and down. Embedding grid infrastructure features in business logic frameworks is an example of abstracting functionality down.

We can't blame programmers for doing this. At the time when most platform-specific distributed applications were written, very few people were thinking about grid computing. At the time, nobody even considered the possibility of finding ready-made containers for their applications, much less complete grid infrastructures where they could just deploy their code and move on with their lives.

The case of modular applications

In general, enabling modular platform-specific distributed applications will be easier than enabling monolithic applications. The reason I say this is that modular applications give you choices on how to deploy them. There are caveats just as in the previous case, but with modular applications, easier ways to get around them.

Turning off modules

One of the main advantages modular applications have is the possibility of turning off modules when necessary. This way, any environment-related functionality can be rendered to the grid infrastructure.

As in the case of monolithic applications, the existence of built-in grid features and whether they can be turned off or stripped out will also determine the degree of difficulty for the grid enablement effort.

The difference is that most modular applications, when they have any built-in grid features, will most likely concentrate that functionality in a single module, or a group of specialized modules. This should make it easier (in theory) to turn those modules off or to just eliminate them altogether.

There's another caveat

This caveat is inter-module communication. The degree of difficulty in turning off, or stripping out, application modules depends on how the designers implemented inter-module communication. In general, the simpler the transport, the lower the degree of difficulty.

For instance, it is common for applications of this kind to have a dedicated module to handle all database calls. In some cases, the module not only acts as a universal database client by supporting ODBC or JDBC drivers for several vendors but also does something we can call "table access scheduling," which is sort of an intra-application table-locking mechanism that allows the application to handle table locking independent of the database.

Having a universal database client is a good idea. However, if the application is to be grid-enabled, it is better to leave table locking to the data grid infrastructure (let's assume that's what we're doing with the application). So, all we need to do is substitute the module for a regular database client, deploy the RDBMS into the data grid, and we've got ourselves a grid-enabled application.

Most database clients and listeners rely on TCP/IP sockets to get their orders from a program. The DB2® client listens by default on port 50000, for example. But what if the application designers decided that the tried-and-true way of TCP/IP sockets was not fancy enough for their application? What if they decided to go with a proprietary mechanism for inter-module? Then the problem is not so straightforward anymore.

There is another aspect to inter-module communication that can turn out to be a show-stopper. If the application is to be deployed on a computational grid, there can be several instances of several modules running concurrently on the grid. If the grid infrastructure software cannot relay the transport mechanism, or if the transport mechanism itself cannot function on a grid environment, the application simply will not work as expected.

Then, the degree of difficulty for the grid enablement project will be directly proportional to the effort of replacing the inter-module communication mechanism.

Deployment strategies: best-case scenario

An ideal modular application should handle inter-module communication with a dispatcher -- or broker -- module. This plan would allow modules to be deployed anywhere on the grid because inter-module communication will always happen through the broker. See Figure 3.


Figure 3. Ideal deployment for modular applications
Ideal deployment for modular applications

The best-case scenario has two very desirable behaviors. First, application modules should be atomic to allow independent deployment from one another. The dispatcher-broker module should take care of all inter-module communication and data exchange.

As for shared libraries, the grid infrastructure should be able to handle them if they're installed as part of a system-wide installation. If not, they can be included as part of the provisioning policy for all modules so that all nodes have a local copy.

Second, application modules should be granular enough to allow for multiple instances of the same module to run concurrently (at least) on the same machine. A module should take care of its own results aggregation. Application-level results aggregation can be handled by the dispatcher-broker module or by through the database.

Deployment strategies: most-common scenario

Unfortunately, most modular applications are not that well behaved. In some cases, module encapsulation is not atomic enough to allow for true independent deployment. In other cases, the dispatcher-broker module doesn't take care of all inter-module communication and data exchange. Instead, some modules call on each other directly, which forces them to reside on the same machine.

Results aggregation also represents a problem, especially when the dispatcher-broker doesn't fully own the task of managing inter-module communication. Some modules might feed their results into other modules instead of just passing them back to the broker. Whatever the situation, the most common scenario is to deploy the entire application on all grid nodes as shown in Figure 4.


Figure 4. Most common scenario for deploying modular applications
Most common scenario for deploying modular applications

To an extent, the most common scenario means that a modular application can be deployed as a monolithic application if worse comes to worst. It should work but the advantage of being modular will be lost because it won't be exploited by the grid infrastructure as in the ideal case.

In the same vein, think of a monolithic application as a single-module modular application and treat it as such when devising a strategy for managing results aggregation in the case of multiple concurrent instances.

These two cases, monolithic and modular applications, represent the simplest scenario when it comes to grid enabling platform-specific distributed applications. The situation changes dramatically when we deal with Web-enabled applications, as you'll see in the next section.



Back to top


Enabling Web-enabled applications

A Web-enabled application is not a true J2EE application. We call "Web-enabled" those applications that were written originally as platform-specific distributed applications but run as Web applications, thanks to a Web front end.

The most common architectures are known as servlet-centric and database-centric, and each poses its own challenges to grid enablement.

Servlet-centric applications

Servlet-centric applications, in general, follow the architectural pattern illustrated in Figure 5.


Figure 5. Most common Servlet-centric architectural pattern
Most common servlet-centric architectural pattern

The platform-specific application in Figure 5 is, in some cases, patched up to support things such as XML and other technologies. It is enabled to talk to a Java™ Virtual Machine via JNI or a proprietary connector framework. As for database support, it is common to use ODBC-to-JDBC bridges or to just stay with ODBC.

When "ported" to run on J2EE application servers, servlet-centric applications interact with clients via a gateway servlet, which relays requests to the connector and thus to the actual application. A typical porting to an application server, such as IBM® WebSphere® Application Server, looks like the one illustrated in Figure 6.


Figure 6. Typical servlet-centric Web enablement strategy
Typical servlet-centric Web enablement strategy

Enabling an application that follows this execution pattern run on a grid would require at least the following steps:

  1. Modify the deployment descriptor so that the only component being actually deployed on WebSphere Application Server is the gateway servlet, which will become the portal for the users.
  2. Take the Java piece of the connector framework (JNI or proprietary) that acts as an interface to the core application and deploy it as a stand-alone Java application. This will be the client program or job submission driver.
  3. Deploy the core of the application as a monolithic, or a modular application (whichever term applies) on a batch-oriented grid infrastructure.

The resulting scenario is illustrated in Figure 7.


Figure 7. Typical servlet-centric grid deployment
Typical servlet-centric grid deployment

It might be necessary to change some of the original assumptions when implementing this scenario. For instance, a deployment like the one shown in Figure 7 would probably be easier to manage if the gateway Servlet ran on WebSphere Application Server Express, which doesn't include an EJB Container, as opposed to WebSphere Application Server Advanced Edition, or Apache Tomcat. A change of this nature would actually benefit your customers because it could lower the total cost of the application.

Keep in mind this is just one way of doing it. There may be better ways to architect the deployment pattern depending on the characteristics of the application. The best solution should provide the best returns in terms of feasibility, effort, usability, and administration.

Caveats

The issues affecting monolithic and modular applications can also affect servlet-centric grid enablements. In addition, issues related to application performance can also arise.

Servlet-centric applications, in most cases, will experience performance problems at the Web container level. The use of a gateway servlet can create a sometimes nasty bottleneck that stems from, among other reasons:

  • The servlet execution model, especially if the servlet bottleneck relies on Java Server Pages (JSPs) for presentation logic
  • The latency created by connector frameworks such as JNI -- In some JVM implementations (ours, for example), JNI calls cause the JVM to have to create pointers to allocate the requested platform-specific processes. Sometimes these pointers occupy large chunks of memory and the JVM needs to refresh them continuously to avoid the garbage collection thread from picking them up while they're still active (you don't want that to happen). This creates additional overhead on the JVM, which translates into higher CPU and memory heap utilization by the Java process in which the JVM is running.

These issues have nothing to do with the grid infrastructure. They can cause problems even if the application is not running on a grid. You need to be aware that you will have to tune the application server under the new conditions once the application is deployed on a grid. Other issues can stem from the interaction of the application server and the grid infrastructure. For instance:

  • The overhead for security between the application server and the grid infrastructure. Given that grids are security freaks, and given that JNI calls don't always like to be asked to authenticate, the result sometimes is that the application has to log on to the grid infrastructure every single time it makes a connector call. This can slow things down.
  • Network latency between the application server and the grid infrastructure, especially on geographically disperse deployments.

Sometimes these problems, when they all surface at the same time, make the whole grid enablement exercise too complicated and too costly to be worth the effort. Sometimes it's better to consider the possibility of deploying the platform-specific piece of the application as a regular monolithic or modular application (whichever applies), or to rewrite the platform-specific piece as a J2EE-compliant set of components and look for an SOA-based grid infrastructure.

Database-centric applications

Database-centric applications became the de-facto standard back in the day of the client/server paradigm. Tools such as PowerBuilder, Oracle 2000, PacBase, Progress, and other products were widely used to create monolithic, footprint-heavy, and large applications that required proprietary languages and specialized skills to understand them.

Some products of this type managed to adapt to the new distributed paradigm and gave us these Web-enablement hybrids we know now as database-centric applications. Some vendors claim having re-engineered their products to be truly distributed and Web-native, but for some products, under the wraps, the old client/server, monolithic architecture remains untouched.

This situation is understandable given that most vendors even invented their own languages to describe highly complex frameworks aimed to facilitate what was called in those days "Rapid Application Prototyping and Development."

Regardless of the technical value of these products, vendors need to preserve this intellectual capital for one simple reason: A lot of money was invested in their development. Therefore, database-centric applications are going to be around for a long time.

Common implementations of database-centric applications revolve around proprietary frameworks. In most cases, these frameworks have been "patched" to support Java technology, XML, and JMS, on other now-popular industry standards. Figure 8 illustrates the most common flavor of this architecture.


Figure 8. Most common database-centric architectural pattern
Most common database-centric architectural pattern

In most cases, the application and the database are bound together in a single package, and there's no difference between business logic and database operational logic. Because of this, added support modules do not interact natively with the original application.

Porting scenarios for database-centric applications are usually done through the Web container, as shown in Figure 9.


Figure 9. Typical database-centric Web enablement scenario
Typical database-centric Web enablement scenario

The strategy is similar to the one used for servlet-centric applications. It involves writing a gateway servlet that accesses the proprietary framework through the add-on Java support modules as dependent classes, or through XML files.

Treat it as a monolithic application

The easiest way to grid-enable a database-centric application is to treat it as a monolithic application. In this case, you would need to implement the deployment pattern shown in Figure 9.

But there's an interesting characteristic about database-centric applications that might provide a more efficient way to deploy certain applications on a grid.

Virtualizing data

Database-centric applications use the database not just to store data but also to keep configuration information, workflow data, and even presentation metadata. This dependency on the database is sometimes so tight that it is impossible to separate the database from the runtime environment. In some cases, the application actually runs on top of the database engine.

In cases where the database run time is the application run time, what can be virtualized is not the business logic but the data. You need to use a data grid instead of a computational grid as in the previous scenarios.

By virtualizing a database-centric application on a data grid, you would be indirectly virtualizing the application run time and, thus, the application itself. All the data the application needs to run will be made available locally on all nodes on the grid and, whenever the application changes, the modifications will be propagated automatically.

What happens is that you get location independence for the requests going to the database while the data is propagated all across the grid. To the requesting program, the data seems to be local all the time when, in reality, it can be located anywhere on the grid. So, what runs as a single-instance batch job is the request broker (the Java interface and a driver for the thick client) while the data is virtualized by the grid infrastructure.

Depending on how the business logic is written, you might be able to virtualize the data and the business logic as shown in Figure 10.


Figure 10. Data virtualization scenario for database-centric applications
Data virtualization scenario for database-centric applications

Note that you can virtualize data and business logic on a data grid only if the business logic runs in processes triggered by the database engine, which is the case of most proprietary frameworks.

If, on the other hand, the business logic can be triggered by an outside process, such as the job submission driver, you might be able to actually separate data from business logic in what would be a combination of a computational grid for the business logic and a data grid for the database. This approach, however, might not be a feasible solution in some cases because it could introduce too much complexity into the deployment model.

Caveats

Database-centric applications usually have a characteristic of being heavy on CPU and memory usage. This demand becomes especially visible when the database run time also runs applications.

In some cases, a grid deployment exercise might not work as expected due to the overhead created by the data grid itself, plus the overhead caused by a resource-hungry database runtime environment. In other cases, when it is possible to separate the data and the application, the situation resembles the case of monolithic applications and the same issues will apply.



Back to top


Conclusion

The information in this article should give you enough ammunition to start brainstorming about the best way to grid-enable your product. If you want to grid-enable platform-specific distributed applications (both monolithic and modular) and Web-enabled applications (both servlet-centric and database-centric), this article shows you what to think about.



 

Resources

+ نوشته شده توسط یوسف عبدلیان باریکرسفی در شنبه نوزدهم آبان 1386 و ساعت 14:45 | نظر بدهید
Grid components: A high-level perspective

In this section, we describe at a high level the primary components of a grid environment. Depending on the grid design and its expected use, some of these components may or may not be required, and in some cases they may be combined to form a hybrid component. However, understanding the roles of the components as we describe them here will help you understand the considerations when developing grid-enabled applications.

Portal/user interface

Just as a consumer sees the power grid as a receptacle in the wall, a grid user should not see all of the complexities of the computing grid. Although the user interface can come in many forms and be application-specific, for the purposes of our discussion, let's think of it as a portal. Most users today understand the concept of a Web portal, where their browser provides a single interface to access a wide variety of information sources. A grid portal provides the interface for a user to launch applications that will use the resources and services provided by the grid. From this perspective, the user sees the grid as a virtual computing resource just as the consumer of power sees the receptacle as an interface to a virtual generator.


Figure 1. Possible user view of a grid
Figure 1. Possible user view of a grid

The current Globus Toolkit does not provide any services or tools to generate a portal, but this can be accomplished with tools such as WebSphere® Portal and WebSphere Application Server.

Security

A major requirement for grid computing is security. At the base of any grid environment, there must be mechanisms to provide security, including authentication, authorization, data encryption, and so on. The Grid Security Infrastructure (GSI) component of the Globus Toolkit provides robust security mechanisms. The GSI includes an OpenSSL implementation. It also provides a single sign-on mechanism, so that once a user is authenticated, a proxy certificate is created and used when performing actions within the grid. When designing your grid environment, you may use the GSI sign-in to grant access to the portal, or you may have your own security for the portal. The portal will then be responsible for signing in to the grid, either using the user's credentials or using a generic set of credentials for all authorized users of the portal.


Figure 2. Security in a grid environment
Figure 2. Security in a grid environment

Broker

Once authenticated, the user will be launching an application. Based on the application, and possibly on other parameters provided by the user, the next step is to identify the available and appropriate resources to use within the grid. This task could be carried out by a broker function. Although there is no broker implementation provided by Globus, there is an LDAP-based information service. This service is called the Grid Information Service (GIS), or more commonly the Monitoring and Discovery Service (MDS). This service provides information about the available resources within the grid and their status. A broker service could be developed that utilizes MDS.


Figure 3. Broker service
Figure 3. Broker service

Scheduler

Once the resources have been identified, the next logical step is to schedule the individual jobs to run on them. If a set of stand-alone jobs are to be executed with no interdependencies, then a specialized scheduler may not be required. However, if you want to reserve a specific resource or ensure that different jobs within the application run concurrently (for instance, if they require inter-process communication), then a job scheduler should be used to coordinate the execution of the jobs. The Globus Toolkit does not include such a scheduler, but there are several schedulers available that have been tested with and can be used in a Globus grid environment. It should also be noted that there could be different levels of schedulers within a grid environment. For instance, a cluster could be represented as a single resource. The cluster may have its own scheduler to help manage the nodes it contains. A higher level scheduler (sometimes called a meta scheduler) might be used to schedule work to be done on a cluster, while the cluster's scheduler would handle the actual scheduling of work on the cluster's individual nodes.


Figure 4. Scheduler
Caption for sample figure

Data management

If any data -- including application modules -- must be moved or made accessible to the nodes where an application's jobs will execute, then there needs to be a secure and reliable method for moving files and data to various nodes within the grid. The Globus Toolkit contains a data management component that provides such services. This component, known as Grid Access to Secondary Storage (GASS), includes facilities such as GridFTP. GridFTP is built on top of the standard FTP protocol, but adds additional functions and utilizes the GSI for user authentication and authorization. Therefore, once a user has an authenticated proxy certificate, he can use the GridFTP facility to move files without having to go through a login process to every node involved. This facility provides third-party file transfer so that one node can initiate a file transfer between two other nodes.


Figure 5. Data management
Figure 5. Data management

Job and resource management

With all the other facilities we have just discussed in place, we now get to the core set of services that help perform actual work in a grid environment. The Grid Resource Allocation Manager (GRAM) provides the services to actually launch a job on a particular resource, check its status, and retrieve its results when it is complete.


Figure 6. GRAM
Figure 6. GRAM

Other facilities

There are other facilities that may need to be included in your grid environment and considered when designing and implementing your application. For instance, inter-process communication and accounting/chargeback services are two common facilities that are often required.

+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:47  توسط یوسف عبدلیان باریکرسفی  | 

زبان برنامه نویسی D قسمت اول

چشم انداز

D چیست؟

D یک زبان برنامه‌سازی سیستمی و کاربردی همه منظوره است . D یک زبان سطح بالاتر از ++C است اما توانایی نوشتن کدهای قدرتمند و تعامل مستقیم با APIهای سیستم عامل و سخت‌ افزار را حفظ می‌کند.D به خوبی برای نوشتن برنامه‌های متداول و برنامه‌های بزرگ چند میلیون خطی با تیمهای برنامه نویسی مناسب است . D به آسانی قابل آموختن است ، توانائیهای زیادی را برای کمک به برنامه ‌نویس فراهم می‌کندوبه خوبی برای فناوری پرتکاپوی بهینه‌سازی کامپایلر مناسب است.

D یک زبان اسکریپتی(متنی) یا دارای مفسر(interpreter) نیست. همچنین دارای ماشین مجازی ، مذهب خاص یا فلسفه برتری‌جویی نمی باشد. بلکه یک زبان عملی است برای برنامه‌ نویسان حرفه‌ای که به انجام سریع و قابل اعتماد پروژه و کد قابل فهم آسان نیاز دارند و مسئول عملکرد صحیح برنامه هستند.

D اوج چند دهه تجربه به کارگیری کامپایلرهایی از زبانهای گوناگون و تلاش برای بنانهادن پروژه های بزرگ توسط آن زبان‌ها است.

D از زبانهای دیگر مخصوصاً ++C الهام می‌گیرد و آن را با تجربه و کاربرد به معنای واقعی درهم می‌آمیزد.

چرا D ؟

واقعاً چرا؟ چه کسی نیاز به زبان برنامه ‌نویسی جدید دارد؟

صنعت نرم‌ افزار راه درازی از زمان اختراع زبان C تا کنون پیموده است. به وسیله ++C تعداد زیادی مفاهیم جدید به زبان C افزوده شد. اما سازگاری با گذشته C در آن ادامه یافت ، شامل سازگاری با تقریباً تمام ضعفهای طراحی اصلی زبان C .

تلاشهای زیادی برای برطرف ساختن آن ضعفها تاکنون صورت گرفته است اما در پی پا فشاری بر حفظ سازگاری با گذشته خنثی شده است. در ضمن هر دوی C و ++C دستخوش یک رشد پیوسته خصوصیات جدید شده ‌اند.

این خصوصیات جدید باید به دقت و بدون نیاز به بازنویسی کد قدیمی به ساختار موجود خورانده شود. نتیجه نهایی بسیار پیچیده است ؛ C استاندارد تقریباً 500 صفحه است و ++C استاندارد حدود 750 صفحه ! در زمینه کامپایلر های ++C واقعیت این است که تعداد اندکی از کامپایلر های موجود ،استاندارد این زبان را به صورت مؤثر و کامل پیاده سازی می کنند.

برنامه نویسان ++C گرایش می‌ یابند که در جزایر خاصی از زبان برنامه بسازند ، از بعضی خصوصیات ماهرانه بهره می گیرند در حالی که از به کار بردن بسیاری از خصوصیات دیگر اجتناب می کنند. با وجود اینکه کد ++C از یک کامپایلر به کامپایلر دیگر قابل حمل است می‌تواند به سختی از برنامه نویسی به برنامه نویس دیگر منتقل شود.

توانایی بزرگ ++C این است که می‌تواند تعداد زیادی سبک های اصلی برنامه‌نویسی را پشتیبانی کند. اما در کاربرد طولانی مدت ، سبکهای دارای اشتراک یا تناقض یک مانع و در نتیجه وقت گیرند.

ناامید کننده است که زبانی چنین قدرتمند ، اعمال پایه‌ا ای مانند تغییر اندازه آرایه‌ها و الحاق رشته‌ها را انجام نمی‌دهد. البته ++C توانایی برنامه نویسی قدرتمند برای پیاده سازی آرایه های قابل تغییر اندازه و رشته ها را فراهم می‌کنند (مانند نوع بردار در STL ) . اما به هرحال چنین خصوصیات بنیادی ، بایستی جزء قسمتهای زبان باشد. آیا قدرت و قابلیتهای ++C ، قابل گسترش ، طراحی مجدد و پیاده‌سازی به یک زبان ساده وارتگنال (منحصر به فرد و مستقل) و کاربردی می‌ باشد؟ آیا تمامی آنها می‌ تواند داخل بسته‌ ای قرار گیرد که برای کامپایلرنویسان به آسانی قابل پیاده‌سازی صحیح باشد و کامپایلرها را قادر کند که به نحوی کارا ، کدهای بهینه شده و پرتکاپو ایجاد کند؟

فناوری پیشرفته کامپایلر به نقطه‌ای رسیده است که خصوصیاتی از زبان که به منظور جبران کردن ناتوانی فناوری ابتدایی کامپایلر وجود دارند ، می‌توانند حذف شوند. (مثالی ازاین نمونه می‌تواند واژه کلیدی 'register' در C باشد ، مثالی ظریفتر ماکروی پیش‌پردازنده در C است) . ما می‌توانیم به فناوری پیشرفته‌ی بهینه سازی کامپایلر اعتماد کنیم تا دیگر به خصوصیاتی از زبان که برای دست یافتن به کیفیت کد قابل‌قبول (جدای از کامپایلرهای ابتدائی) لازم است نیاز نداشته باشیم.

D درنظر دارد که هزینه‌های گسترش نرم‌افزار را حداقل %10 کاهش دهد توسط افزودن خصوصیات بهینه‌سازی بالابرنده میزان سودمندی و تولید ، همچنین با تعدیل کردن خصوصیات زبان ، به طوری که اشکالات وقت‌گیر متداول از ابتدا حذف می‌شوند.

منظره کلی D شبیه C و ++C است . این موضوع آموختن D و انتقال کد به آن را آسانتر می‌کند. گذر از C/++C به سوی D باید طبیعی حس شود و برنامه نویس مجبور نخواهد بود که یک راه کاملاً جدید انجام کارها را فراگیرد. استفاده از D به این معنا نیست که برنامه نویس به یک ماشین مجازی خاص زمان اجرا محدود شود مانند ماشین مجازی جاوا یا Smalltalk . هیچ ماشین مجازی D وجود ندارد .D یک کامپایلر سرراست است که Objectfile های قابل پیوند (Link) تولید می‌کند. D دقیقاً مانند C به سیستم عامل متصل می‌شود . ابزارهای آشنای متداول مانند make مستقیماً در برنامه‌نویسی D گنجانده شده است.

منظره عمومی و احساس موجود در C/++C ابقا خواهد شد . همان املای جبری به کار خواهد رفت و اغلب عبارات و فرمهای دستورات و طرح‌بندی عمومی. برنامه‌های D هم به سبک C (توابع و داده‌ها) و هم در سبک ++C (شیءگرا) یاترکیبی از هردو قابل نوشتن است .



D برای چه کسانی مناسب است؟

۱. برنامه نویسانی که به طور مداوم از ابزارهای تجزیه و تحلیل کد استفاده می‌کنند تا خطاها را حتی قبل از کامپایل شدن ازبین ببرند.

۲. افرادی که عمل کامپایل را با بالاترین سطح هشدارها انجام می‌دهند یا از کامپایلر می‌خواهند که هشدارها را به منزله خطا تلقی کند.

۳. مدیران برنامه‌نویسی که مجبورند به راهنماییهای سبک برنامه‌نویسی برای اجتناب از اشکالات معمول C اعتماد کنند.

۴. افرادی که براین باورند که وعده‌های سبک شییءگرای ++C به خاطر پیچید‌گی هایش برآورده نمی‌شود.

۵. برنامه‌نویسانی که از قدرت زبانزد ++C لذت می‌برند اما به خاطر نیاز به صرف تلاش زیاد برای اداره حافظه و یافتن اشکالات اشاره‌گرها ، ناامید شده‌اند.

۶. پروژه‌هایی که نیاز به تست همراه و تصدیق و تأیید دارند.

۷. برنامه‌نویسانی که فکر می کنند زبان باید دارای خصوصیات کافی باشد . برای رفع نیاز دائمی اداره دستی و مستقیم اشاره‌گرها.

۸. برنامه‌نویسان محاسبات عددی . D دارای خصوصیات زیادی برای پشتیبانی مستقیم اعمال مورد نیاز برنامه نویسان محاسبات می‌باشد ، مانند پشتیبانی مستقیم از نوع داده مرکب و اعمال تعریف شده برای بی‌نهایت و NAN’S (این خصوصیات در استاندارد C99 اضافه شد ولی در ++C نه)

بخش تجزیه لغوی و تجزیه نحوی D از یکدیگر در نهایت مجزا هستند و همچنین از تجزیه‌گر معنایی.

این بدین معناست که نوشتن ابزارهای ساده برای اداره کردن کد منبع D در سطح عالی آسان است بدون این که مجبور به ساختن یک کامپایلر کامل باشیم . همچنین بدین معناست که کد منبع ،برای کاربردهای خاص قابل انتقال به فرم tokenها می باشد.


+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:38  توسط یوسف عبدلیان باریکرسفی  | 

زبان برنامه نویسی D قسمت دوم

D برای چه کسانی مناسب نیست؟

    ۱. به طور واقع بینانه ، هیچکس قصد تبدیل میلیونها خط از C/++C به D ندارد و از آنجا که D کد منبع اصلاح نشده C/++C را کامپایل نمی‌کند ، برای این مورد مناسب نیست. (D به هرحال API های C را به خوبی پشتیبانی می‌کند).

    ۲. برنامه های خیلی کوچک : یک زبان اسکریپتی یا دارای مفسر مانند Perl , Dmdscript , Python احتمالاً مناسبتر است.

    ۳. به عنوان زبان برنامه‌نویسی برای شروع: برای مبتدی‌ها Python یا java مناسبتر است . D برای برنامه نویسان متوسط تا پیشرفته یک زبان دوم عالی است .

    ۴. زبان به کاربرد کلمات صحیح وسواس دارد. D یک زبان عملی است و هر خصیصه از آن ترجیحاً قابل مقایسه و ارزیابی در همان حداست تا در حد ایده‌آل . به طور مثال D ساختارها و مفاهیمی دارد که به طور مجازی نیاز به اشاره‌گرها را برای امور پیش ‌پا افتاده ازبین می‌برد. به طور مشابه تغییر نوعها هنوز وجود دارد برای آن جایی که سیستم نوع ، نیاز به نادیده گرفتن دارد.



خصوصیات اصلی D

این قسمت برخی خصوصیات جالب‌تر D(نسبت به C) را در دسته‌های مختلف طبقه‌بندی می‌کند.

برنامه‌نویسی شییءگرا

کلاسها : طبیعت شییء گرای D از کلاسها آغاز می‌شود. مدل وراثت ، وراثت یگانه است که با روابط تقویت می‌شود. شییء کلاس در ریشه‌ی درخت وراثت می نشیند. بنابراین تمام کلاسها یک مجموعه متداول تابعی را اجرا می‌کنند. کلاسها به وسیله ارجاع معرفی می‌شوند و چنان کد پیچیده‌ای برای آنکه پس‌از استثناها پاک شود نیاز نیست.

تعریف مجدد عملگرها: می‌توان کلاس را برآن واداشت که با استفاده از عملگرهای موجود ، سیستم نوع را برای پشتیبانی نوعهای جدید گسترش دهد. مثلاً ایجاد کلاس اعداد بزرگ و سپس تعریف مجدد عملگرهای (/,*,_,+) برای توانایی استفاده از آن ها در املای عبارات جبری معمولی.

فراوری( Productivity)

پیمانه‌ها : فایلهای منبع دارای ارتباطی یک‌ به ‌یک با پیمانه‌ها هستند. به جای include# نمودن یک فایل از اعلان ها ، فقط پیمانه را import می‌نماییم. هیچ نگرانی در مورد importهای متعدد از همان پیمانه نیست همچنین نیازی به پوشاندن فایلهای header با ifndef# یا endif# یا pragma once# و از این قبیل نیست.

اعلان در برابر تعریف

++C معمولاً نیاز دارد که توابع و کلاسها دوبار اعلان شوند یک اعلان که در فایلهای header صورت می‌گیرد و تعریف که در فایل منبع با پسوند “C.” . این یک روند مستعد خطا و کسل کننده است . به طور واضح برنامه‌نویس فقط نیاز دارد که یک بار آن را بنویسد و سپس کامپایلر باید داده‌های اعلان را بسط دهد و برای وارد کردن نمادین در دسترس قرار دهد. دقیقاً آن گونه که D می‌کند:

مثال:

class ABC

{

int func() { return 7; }

static int z = 7;

}

int q;

دیگر نیاز به تعریف جدای توابع عضو، اعضای استاتیک ، extern ها یا املاهایی مانند زیر نیست:

int ABC::func() { return 7; }

int ABC::z = 7;

extern int q;

تذکر : البته در ++C توابع جزیی مانند {;return 7} به صورت inline هم نوشته می‌شوند اما توابع پیچیده نه. علاوه برآن اگر یک ارجاع بعد از آن موجود باشد تابع نیاز به الگو دارد که از قبل موجود باشد مثال زیر در ++C کار نمی کند.

class Foo

{

int foo(Bar *c) { return c->bar; }

};

class Bar

{

public: int bar() { return 3; }

};

اما کد هم‌ارز در D کار می کند:

class Foo

{

int foo(Bar c) { return c.bar; }

}

class Bar

{

int bar() { return 3; }

}

اینکه یک تابع D به صورت inline است یا نه توسط تنظیمات بهینه‌ساز قابل کنترل است .



قالب‌ها

قالبهای D روشی واضح برای پشتیبانی برنامه‌سازی عمومی همراه با قدرت اختصاصی‌سازی به صورت قسمت به قسمت ، پیشنهاد می‌کند.

آرایه‌های شرکت‌پذیر

آرایه‌های شرکت‌پذیر آرایه‌هایی هستند با یک نوع داده قراردادی (اختیاری) به عنوان ایندکس به جای آنکه به یک ایندکس از نوع اعداد صحیح محدود باشند. در اصل آرایه‌های شرکت‌پذیر جدولهای در هم سازی(hash ) هستند. این آرایه‌ها ساختن سریع ، کارا و خالی از اشکال جدول‌های سمبل را آسان می‌نماید.



تعریف نوعهای واقعی

تعریف نوعهای C و ++C در حقیقت نام مستعار نوع هستند طوریکه هیچ نوع جدیدی به طور واقعی مطرح نمی‌شود. D ، تعریف نوعهای واقعی پیاده‌سازی می‌کند جایی که:

typedef int handle;

به طور واقعی یک نوع جدید به نام handle ایجاد می‌کند . بر کنترل نوع تأکید شده است و تعریف نوعها در تعریف مجدد توابع شریک می‌شوند. برای مثال :

int foo(int i);

int foo(handle h);



نوع bit

نوع داده پایه بیت است و D یک نوع داده با نام bit دارد . این امر بیش از همه در ساخت آرایه‌هایی از بیتها مفید است:

bit [ ] foo;

توابع

D توقع پشتیبانی از توابع معمول از جمله توابع عمومی ، توابع مجدد تعریف شده ، توابع inline ، توابع عضو ، توابع مجازی ، اشاره‌گرها به توابع و … را داشته است علاوه برآن :

توابع تودرتو

توابع می‌توانند درون توابع دیگر قرار گیرند. این امر در ساخت کد ، خاصیت locality و تکنیکهای بسته‌بندی توابع بسیار مفید است.

لفظ‌های توابع Functionliterals

توابع بی‌نام می‌توانند به طور مستقیم در یک عبارت جای داده شوند.

وکالت(Closure) دینامیک

توابع محصور شده و توابع عضو کلاس بوسیله وکالت (delegate) می‌توانند ارجاع داده شوند که این باعث آسان تر شدن و type safe شدن برنامه‌سازی عمومی می‌شود.

پارامترهای ورودی، خروجی ، ورودی-خروجی

این خصوصی‌سازی نه تنها کمک می‌کند که توابع خود مستندتر شوند بلکه بسیاری از موارد لزوم اشاره‌گرها را بدون قربانی کردن هیچ چیز حذف و امکاناتی را برای کمک بیشتربه کامپایلر در پیدا کردن اشکالات کد فراهم می‌کند.

بدین ترتیب برای D این امکان فراهم میشود که مستقیماً با یک بازه وسیعتری از APIهای بیگانه ارتباط برقرار کند. و هیچ نیازی برای کارهای جانبی مانند زبانهای تعریف ارتباطات وجود ندارد.

آرایه‌ها

آرایه‌های C اشتباهات متعددی دارند که می‌توانند تصحیح شوند:

    ۱. اطلاعات بعد با آرایه همراه نیست و بنابراین باید ذخیره‌شده و جداگانه ارسال شود . مثال کلاسیک این مورد پارامترهای argc و argv هستند که به main فرستاده می‌شوند.

main (int argc , char*argv[])

    ۲. آرایه‌ها اشیاء سطح اول نیستند. وقتی یک آرایه به عنوان پارامتر به یک تابع فرستاده می‌شود به یک اشاره‌گر برگردانده می‌شود . حتی با اینکه الگوی تابع به طور گیج کننده‌ای می گوید که این آرایه است. وقتی این برگرداندن انجام می‌شود تمام اطلاعات نوع آرایه گم می‌شود.

    ۳.آرایه‌های C قابل تغییر اندازه نیستند . این بدان معنی است که حتی چیزهای ساده ،انبوه و متراکم می‌گردد. مانند یک پشته که نیازدارد به عنوان یک کلاس پیچیده ساخته شود.

    ۴.مرز یک آرایه C قابل کنترل نیست چون اصلاً مرز آرایه مشخص نیست.

    ۵.آرایه‌ها در C با علامت [ ] پس از شناسه اعلان می‌شوند . این به یک املای بی‌خود و گیج کننده در اعلان اشیایی مانند اشاره‌گر به یک آرایه می‌انجامد :

int (*array ) [3];

در D علامت [ ] در سمت چپ قرار می‌گیرد که فهم آن بسیار ساده‌تر است.

int [3] * array; // اعلان یک اشاره‌گر به یک آرایه سه‌تایی از اعداد صحیح

Long [ ] func (int x); //تابعی که آرایه ای از اعداد صحیح بلند را برمی گرداند

آرایه‌های D در چهار نوع می‌آیند : اشاره‌گرها ، آرایه‌های استاتیک ، آرایه‌های دینامیک و آرایه‌های شرکت‌پذیر ،‌قسمت آرایه‌ها را ببنید !

رشته‌ها

پردازش رشته‌ها آن قدر متداول است (و آن قدر در C و ++C زمخت و بدترکیب) که نیازمند پشتیبانی مستقیم در زبان برنامه سازی است. زبانهای مدرن از جمله D ، الحاق رشته‌ها ، کپی کردن و … را در دست می‌گیرند . رشته‌ها رهاورد مستقیم پردازش بهینه شده آرایه‌ها هستند.

+ نوشته شده در  پنجشنبه سیزدهم دی 1386ساعت 12:37  توسط یوسف عبدلیان باریکرسفی  | 

زبان برنامه‌نویسی D بخش سوم

کنترل منابع

جمع آوری زباله (Grabage Collection)

تخصیص حافظه در D کاملاً با جمع‌آوری زباله همراه است. تجربه شهودی بیان می‌کند که تعداد زیادی از خصوصیات ++C برای کنترل رهاسازی حافظه لازم است .با وجود جمع‌آوری زباله، زبان بسیار ساده‌تر می‌شود.

گروهی می‌گویند جمع‌آوری زباله برای جوجه برنامه‌نویس ها و تنبل‌ها است. زمانی این حرف در مورد ++C گفته می‌شد. اما شاید هیچ چیز در ++C نیست که با C یا اسمبلر قابل انجام نباشد .

جمع‌آوری زباله ، کد خسته کننده پیگیری تخصیص حافظه‌های مستعد خطا که در C و ++C لازم است را حذف می‌کند. این نه تنها بدین معناست که گسترش برنامه‌ها سریعتر انجام می‌گیرد و هزینه‌های نگهداری کاهش می یابد ، بلکه برنامه به میزان زیادی در دفعات اجرا سریع تر است.


کنترل حافظه ساده و واضح

با وجود اینکه D یک زبان دارای جمع‌آوری زباله است ، اعمال new و delete می‌توانند طوری تعریف شوند که به عنوان یک تخصیص دهنده حافظه ی سفارشی به کار ‌روند.

RAII

RAII یک تکنیک پیشرفته گسترش نرم‌افزار برای کنترل تخصیص منابع و آزادسازی آنها است ، D از RAII در یک روش کنترل شده قابل پیش‌بینی که مستقل از چرخه جمع‌آوری زباله است پشتیبانی می‌کند.

کارایی

توده سبک وزن

D ساختمان‌های سبک ساده C را پشتیبانی می‌کند هم برای سازگاری با ساختمان داده‌های C و نیز به خاطر اینکه آنها در جاهایی که قدرت کامل کلاسها کارایی ندارد مفیدند.

Inline Assembler

درایور سخت افزار ، کاربردهای سیستمی با کارایی بالا ، سیستم های تعبیه شده و کدهای خصوصی شده ، بعضی وقتها نیاز به غرق شدن در زبان اسمبلی دارند تا کار انجام شود . در حالی که پیاده سازی های D نیاز به کارگیری اسمبلر خطی ندارند ، این خصوصیت،در زبان تعریف شده و قسمتی از آن است . اغلب نیازهای کد اسمبلی به وسیله این بخش قابل برآوری است که نیاز به اسمبلرهای جداگانه و DLL ها را مرتفع می سازد .

همچنین بسیاری از پیاده سازی های D توابع اصلی را (شبیه به پشتیبانی ذاتی C از پردازش درگاههای ورودی خروجی ، دسترسی مستقیم به عملیاتهای ممیز شناور و …) پشتیبانی می کند .

قابلیت اعتماد

یک زبان پیشرفته باید برنامه نویس را در رفع تمامی اشکالات از کد یاری کند . این کمک به چندین صورت می تواند ارائه شود . از آسان سازی کاربرد تکنیکهای قدرتمند تر ، تا گوشزد کردن کد غلط به طور آشکارا توسط کمپایلر و کنترل زمان اجرا .



معاهدات ( Contracts )

طراحی به وسیله کنتراکت (اختراع B.Meyer ) یک تکنیک انقلابی برای کمک به مطمئن شدن از صحت برنامه است و نسخه DBC زبان D شامل پیش شرطهای توابع ، پس شرطهای توابع ، یکسانی های کلاس و کنتراکتهای ثابت کننده است .


آزمایش واحد

آزمایش قسمت ها می تواند به یک کلاس افزوده شود طوری که به صورت خودکار در آغاز اجرای برنامه ، اجرا شود . این در هشدار دادن اینکه پیاده سازی کلاس در هر بار ساخته شدن ،‌سهواً‌‌‌‌‌‌‌‌ با شکست مواجه نشده است مفید است . آزمایش واحد قسمتی از کد کلاس را تشکیل می دهد. ایجاد آنها یک بخش طبیعی پروسه ی گسترش کلاس ها خواهد شد برخلاف پشت گوش انداختن کد تمام شده از دسترس گروه آزمایش.

آزمایش واحد در دیگر زبان ها قابل انجام است. اما تا خود زبان شامل این مفهوم نباشد، نتیجه جالب از آب در نمی آید . آزمایش واحد یک خصوصیت اصلی و بارز در D است . برای توابع کتابخانه ای به خوبی عمل می کند، هم ضمانت می کند که تابع حقیقتاً کار می کند و هم با مثال بیان می کند که تابع چگونه کار می کند . خیل کثیرمنابع کدهای کاربردی و کتابخانه های ++C موجود در اینترنت برای دانلود را در نظر بگیرید . چه تعداد از آنها با تستهای کلی همراه است ( تست واحد را هم در نظر نگیرید ) ؟ کمتر از یک درصد . روش معمول این است که اگر کامپایل شده است اجرا هم می شود و شگفت زده خواهیم شد اگر هشدارهای کامپایلر اشکالات واقعی باشند .

در کنار طراحی با کنتراکت ، آزمایش واحد ، D را به مراتب به بهترین زبان برای نوشتن قابل اعتماد و کاربردهای سیستمی قدرتمند تبدیل می کند.


مشخصه اشکال زدایی در دستورات زبان

اکنون اشکال زدایی بخشی از املای زبان است ( debug ) . که در زمان کامپایل قابل فعال یا غیر فعال شدن است بدون کاربرد دستورات پیش پردازنده یا ماکروها . املای debug یک ابزار تشخیص سازگار، استوار و قابل حمل و قابل فهم را فعال می کند که بفهمد آیا نیاز است که کد منبع قادر بر ایجاد هر دو کامپایل اشکال زدایی و کامپایل نهایی باشد ؟

پردازش استثناء

مدل برتر try–catch-finally به جای مدل فقط try–catch به کار رفته است .دیگر هیچ نیازی نیست که اشیای زائد ایجاد کنیم فقط برای اینکه معناهای نهایی را توسط مخرب ( destructor ) پیاده سازی کنیم .

هماهنگی و هم روندی(Synchronization)

برنامه سازی چند رشته ای (Multi Thread Programming) متداول تر می شود و D مبناهایی برای ساخت برنامه های چند رشته ای فراهم می کند . هم روند سازی می تواند هم در سطح متد و هم در سطح شیئ انجام شود .

synchronize int func ( ) {.}

توابع هم روند (سنکرون) در هر زمان فقط به یک رشته (Thread) اجازه می دهند که آن تابع را اجرا کند . عبارت synchronize در اطراف قطعه ای از عبارات انحصار متقابل(mutex)ایجاد می کند و دسترسی به وسیله شیئ یا به صورت عمومی را کنترل می کند .


پشتیبانی تکنیک های قدرتمند

    ۱. آرایه های دینامیک به جای اشاره گر ها

    ۲. متغیرهای ارجاعی به جای اشاره گر ها

    ۳. اشیای ارجاعی به جای اشاره گرها

    ۴.جمع آوری زباله به جای کنترل دستی حافظه

    ۵. مبانی پیش ساخته موجود برای هم روندی رشته ها

    ۶. عدم وجود ماکرویی که به طور غیر عمدی به کد آسیب بزند .

    ۷. توابع inline به جای ماکروها

    ۸. کاهش وسیع نیاز به اشاره گرها

    ۹. سایز انواع مرکب واضح و مشخص است

    ۱۰. عدم شک در مورد علامت دار بودن کاراکتر ها

    ۱۱. عدم نیاز به دو بار اعلان در کد منبع و فایلهای header

    ۱۲. پشتیبانی واضح از تجزیه و تحلیل برای افزودن کد اشکال زدایی