تحقیق در مورد ویژگی های الگوریتمهای کنترل همروندی توزیعی

word قابل ویرایش
19 صفحه
8700 تومان
87,000 ریال – خرید و دانلود

ویژگی های الگوریتمهای کنترل همروندی توزیعی

چکیده : در این گزارش ما به بررسی ویژگی های الگوریتمهای کنترل همروندی توزیعی که بر پایه مکانیزم قفل دو مرحله ای(۲ Phase Locking) ایجاد شده اند خواهیم پرداخت. محور اصلی این بررسی بر مبنای تجزیه مساله کنترل همروندی به دو حالت read-wirte و write-write می‌باشد. در این مقال، تعدادی از تکنیکهای همزمان سازی برای حل هر یک از قسمتهای مساله بیان شده و سپس این تکنیکها برای حل کلی مساله با یکدیگر ترکیب می‌شوند.
در این گزارش بر روی درستی و ساختار الگوریتمها متمرکز خواهیم شد. در این راستا برای ساختار پایگاه داده توزیعی یک سطحی از انتزاع را در نظر می‌گیریم تا مساله تا حد ممکن ساده سازی شود.

 

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

۲٫ یک مکانیزم کنترل همروندی در یک کامپیوتر از وضعیت دسترسی در سایر کامپیوترها اطلاعی ندارد.
مساله کنترل همروندی در چندین سال قبل کاملا مورد بررسی قرار گفته است و در خصوص پایگاه‌داده‌های متمرکز کاملا شناخته شده است. در خصوص این مسال در پایگاه داده توزیعی با توجه به اینکه مساله در حوزه مساله توزیعی قرار می‌گیرد بصورت مداوم راهکارهای بهبود مختلف عرضه می‌شود. یک تئوری ریاضی وسیع برای تحلیل این مساله ارائه شده و یک راهکار قفل دو مرحله ای به عنوان راه حل استاندارد در این خصوص ارائه شده است. بیش از ۲۰ الگوریتم کنترل همروندی توزیعی ارائه شده است که بسیاری از آنها پیاده سازی شده و در حال استفاده می‌باشند.این الگوریتمها معمولا پیچیده هستند و اثبات درستی آنها بسیار سخت می‌باشد. یکی از دلایل اینکه این پیچیدگی وجود دارد این است که آنها در

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

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

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

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

شکل ۱ نمایش حالت بروز آوری از دست رفته

حالت دوم حالتی است که در آن اطلاعات صحیح از پایگاه داده استخراج نمی‌شود. در این حالت فرض کنید دو مشتری بخواهند کارهای ذیل را انجام دهند.
• مشتری ۱: بخواهد یک چک ۱ میلیونی را به حساب X واریز و از حساب Y برداشت نماید.
• مشتری ۲: بخواهد بیلان حساب مالی X و Y شامل کل موجودی را نمایش دهد.

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

شکل ۲ خواندن اطلاعات نادرست از سیستم

مساله کنترل همروندی در پایگاه داده های توزیعی تا حدودی شبیه مساله دوبه‌دو ناسزگاری در سیستم عامل می‌باشد. در مساله دوبه‌دو ناسازگاری، هماهنگی جهت دسترسی به منابع سیستم ائم از حافظه، ابزارهای ورودی و خروجی و CPU و …. بوجود می‌آید. در این حالت راه حلهای گوناگونی ائم از قفلها، سمافورها، مونیتورها و … پیشنهاد شده است.
کنرتل همروندی و دوبه‌دو ناسگاری از این جهت که هر دو دسترسی به منابع مشترک را کنترل میکنند با هم شباهت دارند. با این حال راه حلی که برای یکی بکار می‌رود قابل بهره برداری برای دیگری نیست. فرض کنید پردازه های P1 و P2 بخواهند از نقاط مختلف کدهای خود به منابع R1 و R2 دسترسی پیدا کنند. در سیستم عامل دسترسی مجزای ذیل قابل قبول است. P2 از R1 استفاده کند، P2 از R1 استفاده کند، P2 از R2 استفاده نموده و سپس P1 از R2 استفاده نماید. در پایگاه داده این روند اجرا مورد قبول نیست و مشکلاتی را ایجاد می‌کند. فرض کنید P1 بخواهد از R1 مبلغی را به R2 انتقال دهد. در این حالت اگر P2 مقادیر R1 وR2 را چک کند مقادیر غیر صحیح را دریافت می‌کند.

۲٫ مدل پردازش تراکنش: برای اینکه روند اجرای عملیات در سیستمهای پایگاه داده های توزیعی برای خواننده مشخص شود ما در اینجا یک مدل از پایگاه داده‌های توزیعی را ارائه می‌دهیم. سپس نحوه عملکرد مکانیزم کنترل همروندی را در این مدل بیان خواهیم نمود. در این مدل پایگاه داده، یک پایگاه داده توزیعی مجموعه از سایتهاست که توسط یک شبکه به هم متصل شده‌اند. هر سایت یک کامپیوتر است که یکی یا هر دوی برنامه های ذیل را اجرا می‌کند. برنامه‌ها شامل یک مدیر تراکنش یا TM و یک مدیر داده یا DM است. TM مسئول

مدیریت تعامل کاربر با پایگاه داده است و DM مسئول نگهداری داده‌ها است. شبکه نیز یک وسیله ارتباطی کامپیوتر – کامپیوتر است. فرض بر این است که شبکه کاملا امن می‌باشد و پیامها را با همان ترتیبی که وارد سیستم می‌شوند به مقصد ارسال می‌شود. فرض بر این است که تعداد داده های موجود در سیستم شامل X ، Y و Z است که داده های منطقی موجود در سیستم را تشکیل می‌دهند. داده های ذکر شده فقط واحد داده های منطقی هستند و ما با سایز و قالب و جزئیات آنها کاری نخواهیم داشت. هر پایگاه داده در این سیستم یک نسبت دهی مقادیر بصورت منطقی به این داده های منطقی است. هر داده منطقی می‌تواند در یک یا بیشتر از یک DM ذخیره شود. افزونگی داده در اثر ذخیره داده در چندین DM برای افزایش دسترسی به داده‌ها است. هر کپی از داده ذخیره شده آیتم داده نامیده می‌شود. نسخه های متعدد داده X را بصورت X1,X2,… نشان داده می‌شوند. کاربران با

DDBMS از طریق اجرای تراکنشها تعامل دارند. تراکنشها می‌توانند پرس و جو های ON-LINE باشند که با زبان استاندارد پرس و جو ارسال شده اند. از طرفی تراکنشها می‌توانند عملیاتی باشند که از طریق برنامه های نوشته شده به سیستم داده می‌شوند. الگوریتمهای کنترل همروندی، کاری با نوع تراکنشهای موجود در سیستم ندارند و محاسبات انحام شده در این تراکنشها تاثیری در روند این الگوریتمها ندارد. بر خلاف اینها این الگوریتمها تمام تصمیم گیری های خود را بر اساس داده هایی که این تراکنشها به آنها دسترسی پیدا می‌کنند انجام می‌دهند. دسترسی ها می‌توانند از نوع خواندن یا نوشتن باشند. فرض بر این است که محاسبات در تراکنشها کامل بوده و اگر تراکنش در یک پایگاه داده به تنهایی اجرا شود، پایگاه داده در حالت صحیح و مانا قرار گرفته و نتایج کاملا صحیحی در بر خواهد داشت. مجموعه منطقی خواندنی یک تراکنش مجموعه ای از آیتمهای داده ای است که تراکنش می‌خواند. این امر در شکل ۳ نمایش داده شده است.

شکل ۳ مدل اجرای تراکنشها

صحت یک الگوریتم کنترل همروندی بر اساس نیاز کاربران به اجرای تراکنشها تعریف می‌شود. در اینجا می‌توان دو شرط اساسی را می‌توان برای اجرای صحیح تراکنشها می‌توان در نظر گرفت. شرط اول این است که کاربران انتظار دارند تراکنشهایی را که در سیستم ثبت می‌کنند، نهایتا اجرا شود. شرط دو م این است که کاربران انتظار دارند تراکنشهای ارسالی دقیقا مانند زمانی که تراکنش در یک سیستم مجزا یا در یک محیط موازی چند برنامه، اجرا می‌شود اجرا شود و نتایج آن در هر دوحالت کاملا مشابه باشد. تحقق این شرایط دقیقا اهداف یک الگوریتم کنترل همروندی را مشخص می‌کنند. یک سیستم DDBMS چهار جزء اصلی را در برخواهد داشت: تراکنش، TM، DM و داده‌ها. تراکنشها با TM ارتباط دارند. TM ها با DM ها ارتباط برقرار می‌کنند و DM ها داده ها را مدیریت می‌کنند. TM ها با سایر TM ها ارتباط برقرار نمی‌کنند.

TM ها بر ترکانش ها و اجرای آنها نظارت می‌کنند. هر تراکنش در پایگاه داده های توزیعی فقط با یک TM در ارتباط است. این بدین معنا است که هر تراکنش تمام عملیات پایگاه داده خود را به TM مربوط به خود ارسال می‌کنند. تمامی عملیاتهای توزیعی که بایستی توسط تراکنش انجام شود توسط TM مزبور مدیریت می‌شود. چهار عملیات مختلف توسط واسط TM برای تراکنشها قابل تعریف است. READ(X) مقدار جاری X را در وضعیت فعلی پایگاه داده های منطقی برمی‌گرداند. WRITE(X,NEWVALUE) مقدار X را در حالت جاری پایگاه داده‌های منطقی به مقدار NEWVALUE تغییر می‌دهد. همچنین با استفاده از BEGIN و END ابتدا و انتهای یک تراکنش برای یک TM مشخص می‌شود.

۳-تحلیل مساله کنترل همروندی : در اینجا ما با دو رویکرد به مواجه با مساله کنترل همروندی خواهیم پرداخت. در رویکرد اول به نحوه اجرای صحیح خواهیم پرداخت و در رویکرد دوم به تجزیه مساله به بخشهای قابل حل خواهیم پرداخت.

۳-۱- قابلیت توالی: فرض کنید E یک ترتیب اجرای تراکنشهای T1 تا TN باشد. در اینصورت E یک اجرای متوالی از تراکنشها است، در صورتیکه هر تراکنش قبل از اجرای تراکنش بعدی به طور کامل اجرا شده و خاتمه پذیرد. تمامی ترتیبهای اجرای متوالی از دیدگاه پایگاه داده‌ها صحیح تصور می‌شوند، چرا که خواص تراکنش اذعان می‌کند که در خاتمه اجرای متوالی صحت پایگاه داده حفظ می‌شود. یک ترتیب اجرای تراکنش قابل توالی (SERIALIZABLE) محسوب می‌شود در صورتیکه نتیجه خروجی اجرای آن برابر یک اجرای متوالی از تراکنشهای مشابه باشد. در نتیجه تمام اجراهای متوالی SERIALIZABLE محسوب می‌شوند و نتیجه صحیحی خواهند داشت.

هدف الگوریتم کنترل همروندی این است که تضمین کند که تمامی ترتیب های اجرای تراکنش ها قابل توالی می‌باشند. تنها عملیاتی که به داده‌های پایگاه داده دسترسی پیدا میکنند DM-READ و DM-WRITE می‌باشند. بنا براین برای پایش اجرای توالی لازم است فقط DM-READ و DM-WRITE های موجود در پایگاه داده توزیعی در DM ها مختلف مدل شده و رفتار آنها کنترل شود. LOG فایلها می‌توانند شرح دهنده توالی DM-READ ها و DM-WRITE ها باشند. در یک پایگاه داده توزیعی، یک ترتیب اجرا قابل توالی نامیده میشود در صورتیکه به ازای TI که قبل از TJ در توالی قرار دارد، تمامی عملیاتهای TI قبل از TJ در تمامی سایتها انجام شده باشند. این نشان دهنده این است که تمامی تراکنشها باید به ترتیب وارد شده در تمامی سایتها اجرا شوند.

دو عملیات با هم تداخل دارند اگر هر دو عملیات بر روی یک داده مشترک کار کرده و یکی از داده ها DM-WRITE باشد. در این حالت اگر دو عملیات با هم تداخل داشته باشند، ترتیب اجرای دو عمل بر روی نتیجه نهایی تاثیر مستقیم خواهد داشت. برای روشنتر شدن موضوع به بحث در خصوص یک مثال خواهیم پرداخت. فرض کنید ایتم داده‌ای X و تراکنشهای TI و TJ موجود باشند. اگر TI اقدام به خواندن مقدار X نموده و TJ اقدام به نوشتن مقدار جدیدی در X نماید. در اینصورت مقدار خوانده شده توسط TI به تقدم و تاخر عملیاتهای خواندن و نوشتن وابسته خواهد شد. بطور مشابه فرض کنید TI و TJ هر دو بخواهند مقدار جدید را در X بنویسند، در اینصورت مقدار X دقیقا به این امر وابسته می‌شود که کدام عملیات دیرتر انجام شده است. حالت اول را تداخل خواندن- نوشتن (RW) و حالت دوم را تداخل نوشتن – نوشتن (WW) می‌نامند.
نمایش تداخل های مختلف می‌تواند به ارائه یک تعریف فرموله شده برای ترتیبهای اجرای هم ارز کمک کند. دو ترتیب اجرای تراکنش از نظر محاسباتی زمانی معادل هستند که دو شرط ذیل در آنها صادق باشد:

۱٫ هر DM-READ در تراکنش، داده ای را بخواند که از ابتدا به تراکنش داده شده باشد یا داده ای باشد که توسط یک DM-WRITE از همین تراکنش نوشته شده باشد.
۲٫ نتیجه نهایی نوشته شده در آیتم داده‌ای در هر دو ترتیب اجرا یکسان باشد.
قضیه ۱: فرض کنید T که بصورت ذیل تعریف شده است مجموعه ای از تراکنشها در یک پیگاه داده باشد:

آنگاه اگر E یک ترتیب اجرا از این تراکنشها در LOG های L1 تا LM باشد، E قابل توالی خواهد بود اگر به ازای هر دو عملیات OI و OJ که با یکدیگر تداخل دارند به ازای تمامی LOG ها ترتیب یکسانی نسبت به یکدیگر داشته باشند.

قضیه فوق الذکر برای حل مسائل مربوط به ترتیب توالی در سیستم بکارمی‌رود.
۳-۲- یک الگو برای کنترل همروندی: در قضیه فوق تداخلهای خواندن- نوشتن و نوشتن – نوشتن بصورت مشترک در یک تعریف عمومی از تداخل ظاهر شده اند. در هر حال ما می‌توانیم مساله قابلیت توالی را با تفکیک این دو نوع تداخل بهتر بررسی کنیم. فرض کنید E یک مجموعه از LOG های ثبت شده در یک توالی باشد. ما چند رابطه را می‌توانیم بین تراکنشهای موجود در E تعریف کنیم. برای هر جفت تراکنش TI و TJ خواهیم داشت:
شرح رابطه نوع رابظه

اگر LOG وجود داشته باشد که در آن TI داده‌ای را می‌خواند که بلافاصله TJ در آن می‌نویسد. RW
اگر LOG وجود داشته باشد که در آن TI در داده‌ای را می‌نویسد که بلافاصله TJ از آن می‌خواند. WR
اگر LOG وجود داشته باشد که در آن TI در داده‌ای را می‌نویسد که بلافاصله TJ در آن می‌نویسد WW
اگر TI->RW TJ با TI->WR TJ RWR
اگر TI->RWR TJ با TI->WW TJ

قضیه ۲: اگر روابط RWR و WW بصورت غیر حلقوی بوده و یک ترتیب کلی برای این روابط بتوان متصور شد.
بنا بر قضیه فوق می‌توان الگوریتمهای کنترل همروندی را مورد ارزیابی و بررسی قرار داده و صحت آنها را از طریق اثبات ریاضی محک زد. تشخیص تداخلهای RW و WW برای کشف ایراد در الگوریتمهای کنترل همروندی کاربرد فراوانی دارد. قضیه ۲ به ما اجازه می‌دهد تا مساله کنترل همروندی را به قسمتهای کوچکتر تقسیم نموده و بتوان هر یک از این قسمتها را بطور مستقل بررسی نمود.

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

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

۲٫ یکی قفل نوشتنی و دیگری قفل خواندنی باشد.
برای حالت WW دو قفل زمانی با هم تداخل دارند که دو شرط در آنها صدق کند:
۱٫ هر دو قفل بر روی یک داده واحد باشند.

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

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

۵-پیاده سازی پایه قفل دو مرحله‌ای : در پیاده سازی پایه الگوریتم قفل دو مرحله‌ای یک ماژول نرم افزاری ایجاد می‌شود که روند دریافت و آزاد سازی قفلها را بر اساس ویژگی های الگوریتم قفل دو مرحله‌ای کنترل می‌کند.

یک روش برای پیاده سازی توزیعی این الگوریتم این است که ماژولهای نرم افزاری را بین اجزای پایگاه‌داده توزیع نمائیم. برای اینکار هر ماژول را در DM یعنی آنجائیکه X داده تحت کنترل است قرار دهیم. اگر یک قفل قابل تخصیص نباشد، درخواست برای قفل در یک صف انتظار قرار داده می‌شود. قفلهای نوشتن بطور خودکار با انجام عمل WRITE آزاد می‌شوند. در اینصورت برای آزاد نمودن قفلهای خواندنی بایستی عملیات اضافه تعریف نمود. آزاد نمودن قفلها با نوشتن اطلاعات و آغاز فاز تخلیه آغاز می‌شود. هرگاه یک قفل آزاد می‌شود عملیاتهای موجود در صف شروع به ادامه می‌کنند.

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

این فقط قسمتی از متن مقاله است . جهت دریافت کل متن مقاله ، لطفا آن را خریداری نمایید
word قابل ویرایش - قیمت 8700 تومان در 19 صفحه
87,000 ریال – خرید و دانلود
سایر مقالات موجود در این موضوع
دیدگاه خود را مطرح فرمایید . وظیفه ماست که به سوالات شما پاسخ دهیم

پاسخ دیدگاه شما ایمیل خواهد شد