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

محیط نرم افزار کاربردی مدار. جعبه ابزار نرم افزار محیط کاربردی

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

انواع برنامه های کاربردی

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

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

انواع و نمونه برنامه های کاربردی

برنامه های کاربردی عبارتند از:

  • ویرایشگرهای متن طراحی شده برای ایجاد و ویرایش متن بدون تزئین.
  • واژه پرداز (MS Word). ویرایشگرهای متن پیشرفته تر که به شما امکان ویرایش متن با طراحی، تغییر فونت و اندازه آن، درج فایل های گرافیکی، جداول و غیره را می دهد. برای طراحی متن قابل ارائه تر؛
  • جداول الکترونیکی (MS Excell). آنها عمدتاً برای پردازش هرگونه داده موجود در این جداول استفاده می شوند. وظایف کاربردیاغلب آنها برای ذخیره اعتبار با تجزیه و تحلیل بعدی آنها انجام می شوند.
  • ویرایشگرهای گرافیکی شطرنجی و برداری (فتوشاپ، کورل)، "بینندگان". استفاده از برنامه های کاربردی از این نوع به شما امکان ایجاد، ویرایش و همچنین مشاهده تصاویر گرافیکی را می دهد.
  • پخش کننده های ویدئویی صوتی، ویرایشگرها (WinAmp). به شما امکان می دهد فیلم ها را مشاهده کنید، به موسیقی گوش دهید، آهنگ های موسیقی بسازید.
  • سیستم های مدیریت پایگاه داده (به عنوان مثال - MSQL). از چنین برنامه هایی برای کار با پایگاه های داده استفاده می شود. به عنوان مثال، یک برنامه حسابداری مشتری یک پایگاه داده ساده برای ذخیره اطلاعات مشتری، اطلاعات تماس آنها و غیره است. می توانید عملیاتی را برای یافتن، حذف و افزودن رکوردها به پایگاه داده انجام دهید.
  • مترجم یا فرهنگ لغت الکترونیکی. چنین برنامه های کاربردی به شما این امکان را می دهد که متن را بدون دردسر به زبان های مختلف خارجی بدون مطالعه مستقیم آنها ترجمه کنید.
  • بازی های کامپیوتری. برای سرگرمی یا برای توسعه به روشی بازیگوش استفاده می شود.

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

استفاده محیط های نرم افزار کاربردیکار اجرای برنامه های نوشته شده برای یک سیستم عامل روی دیگری را ساده می کند . اساساً، محیط برنامه باید شامل عملکردهای رابط درخواست برنامه و همچنین ابزارهای سازماندهی همزیستی بدون درگیری در یک سیستم عامل از چندین روش برای مدیریت منابع رایانه باشد.

یک محیط برنامه را می توان به عنوان یک برنامه معمولی پیاده سازی کرد و سپس در سطح کاربر عمل کرد.

برنج. 2.8. محیط های برنامه نویسی کاربردی که تماس های سیستمی را ترجمه می کنند

در پیاده‌سازی دیگری از محیط‌های کاربردی چندگانه، سیستم عامل دارای چندین رابط برنامه‌نویسی برنامه همتا است. در مثال نشان داده شده در شکل. سیستم عامل نمونه 2.9 از برنامه های نوشته شده برای OS1، OS2 و OS3 پشتیبانی می کند. برای انجام این کار، رابط های برنامه نویسی برنامه همه این سیستم عامل ها مستقیماً در فضای هسته سیستم قرار دارند: API OS1، API OS2 و API OS3.

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

برنج. 2.9. پیاده سازی قابلیت همکاری بر اساس چندین API همتا

نتیجه گیری

· تمامی نرم افزارهای یک سیستم کامپیوتری به دو دسته کاربردی (برای حل مشکلات کاربر) و سیستمی (برای استفاده از سخت افزار کامپیوتر) تقسیم می شوند.

· ساده ترین ساختار سیستم عامل شامل تقسیم تمام اجزای سیستم عامل به ماژول هایی است که عملکردهای اصلی سیستم عامل (هسته) را انجام می دهند و ماژول هایی که عملکردهای سیستم عامل کمکی را انجام می دهند. ماژول‌های سیستم‌عامل پشتیبانی یا به‌عنوان برنامه‌های کاربردی (ابزارها و برنامه‌های پردازش سیستم)، یا به‌عنوان کتابخانه‌هایی از رویه‌ها طراحی می‌شوند. ماژول های کمکی فقط برای مدت زمان عملکرد خود در RAM بارگذاری می شوند، یعنی گذرا هستند. ماژول های کرنل در رم مقیم هستند، یعنی مقیم هستند.

· اگر پشتیبانی سخت افزاری برای حالت هایی با سطوح مختلف قدرت وجود داشته باشد، می توان با اجرای توابع هسته در حالت ممتاز و ماژول های کمکی سیستم عامل و برنامه ها در حالت کاربر، پایداری سیستم عامل را افزایش داد. این امکان محافظت از کدها و داده های سیستم عامل و برنامه ها را از دسترسی غیرمجاز فراهم می کند. سیستم عامل می تواند به عنوان یک داور در اختلافات برنامه بر سر منابع عمل کند.

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



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

· محیط نرم افزار کاربردی - مجموعه ای از ابزارهای سیستم عامل طراحی شده برای سازماندهی اجرای برنامه های ایجاد شده برای یک سیستم عامل در سیستم عامل دیگر. هر سیستم عامل حداقل یک محیط برنامه نویسی برنامه ایجاد می کند. مشکل در اطمینان از سازگاری چندین محیط نرم افزاری در یک سیستم عامل نهفته است.

در حالی که بسیاری از ویژگی های معماری سیستم عامل مستقیماً فقط به برنامه نویسان سیستم مربوط می شود، مفهوم ابزارهای کاربردی متعدد (عملیاتی) مستقیماً با نیازهای کاربران نهایی مرتبط است - توانایی سیستم عامل برای اجرای برنامه های کاربردی نوشته شده برای سایر سیستم عامل ها. این ویژگی سیستم عامل سازگاری نامیده می شود.

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

سازگاری منبع نیاز به یک کامپایلر مناسب در نرم افزار رایانه ای دارد که می خواهید برنامه را روی آن اجرا کنید و همچنین سازگاری با کتابخانه و تماس سیستم. در این مورد، لازم است کد منبع برنامه را مجدداً در یک ماژول اجرایی جدید کامپایل کنید.

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

نوع سازگاری ممکن به عوامل زیادی بستگی دارد. مهمترین آنها معماری پردازنده است. اگر پردازنده از مجموعه دستورالعمل‌های یکسانی استفاده کند (احتمالاً با اضافات، مانند مورد IBM PC: مجموعه استاندارد + چندرسانه‌ای + گرافیک + جریان) و محدوده آدرس یکسان، می‌توان به سادگی به سازگاری باینری دست یافت. برای انجام این کار، شرایط زیر باید رعایت شود:

  • API مورد استفاده توسط برنامه باید توسط سیستم عامل داده شده پشتیبانی شود.
  • ساختار داخلی فایل اجرایی برنامه باید با ساختار فایل های اجرایی سیستم عامل داده شده مطابقت داشته باشد.

اگر پردازنده‌ها معماری‌های متفاوتی داشته باشند، علاوه بر شرایط ذکر شده، باید شبیه‌سازی کد باینری را نیز سازماندهی کرد. به عنوان مثال، تقلید دستورات پردازنده اینتل در پردازنده موتورولا 680x0 کامپیوتر مکینتاش به طور گسترده مورد استفاده قرار می گیرد. سپس شبیه ساز نرم افزار به صورت متوالی دستور باینری پردازنده اینتل را انتخاب می کند و زیرروال معادل نوشته شده در دستورالعمل های پردازنده موتورولا را اجرا می کند. از آنجایی که پردازنده موتورولا دقیقاً همان ثبات ها، پرچم ها، ALU داخلی و غیره را مانند پردازنده های اینتل ندارد، باید تمام این عناصر را نیز با استفاده از ثبات یا حافظه خود شبیه سازی (شبیه سازی) کند.

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

اثربخشی این رویکرد به این دلیل است که اکثر برنامه‌های امروزی تحت رابط کاربری گرافیکی (واسط کاربری گرافیکی) مانند Windows، MAC یا UNIX Motif اجرا می‌شوند، در حالی که برنامه‌ها 60 تا 80 درصد از زمان را صرف اجرای توابع رابط کاربری گرافیکی و دیگر فراخوان‌های کتابخانه سیستم‌عامل می‌کنند. . این ویژگی برنامه‌ها است که به محیط‌های برنامه اجازه می‌دهد تا زمان زیادی را که صرف شبیه‌سازی برنامه‌ها در هر دستور می‌شود، جبران کنند. یک محیط نرم افزاری با دقت طراحی شده شامل کتابخانه هایی است که از کتابخانه های رابط کاربری گرافیکی تقلید می کنند، اما با کد "بومی" نوشته شده اند. بنابراین، شتاب قابل توجهی در اجرای برنامه ها با API یک سیستم عامل دیگر حاصل می شود. این رویکرد همچنین پخش نامیده می شود تا آن را از فرآیند شبیه سازی کندتر یک فرمان در یک زمان متمایز کند.

به عنوان مثال، برای یک برنامه ویندوز که روی مکینتاش اجرا می شود، هنگام تفسیر دستورات از یک پردازنده اینتل کاراییمی تواند بسیار کم باشد اما هنگامی که یک تابع رابط کاربری گرافیکی فراخوانی می شود، یک پنجره باز می شود و غیره، ماژول سیستم عاملی که محیط برنامه ویندوز را پیاده سازی می کند، می تواند این تماس را قطع کرده و آن را به روال باز کردن پنجره که برای پردازنده موتورولا 680x0 مجدد کامپایل شده است هدایت کند. در نتیجه، در چنین قسمت هایی از کد، سرعت برنامه می تواند به سرعت کار روی پردازنده خودش برسد (و احتمالاً از آن نیز پیشی بگیرد).

برای اینکه برنامه ای که برای یک سیستم عامل نوشته شده است روی سیستم عامل دیگری اجرا شود، فقط اطمینان از سازگاری API کافی نیست. مفاهیم پشت سیستم عامل های مختلف می توانند با یکدیگر تضاد داشته باشند. به عنوان مثال، در یک سیستم عامل ممکن است به یک برنامه اجازه داده شود دستگاه های I / O را کنترل کند، در دیگری - این اقدامات در انحصار سیستم عامل است.

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

گزینه های مختلفی برای ساخت چندین محیط برنامه وجود دارد که هم از نظر ویژگی های معماری و هم از نظر عملکرد متفاوت هستند که درجات مختلفی از قابلیت حمل برنامه را ارائه می دهند. یکی از واضح‌ترین گزینه‌ها برای پیاده‌سازی محیط‌های کاربردی چندگانه، بر اساس ساختار لایه‌ای استاندارد سیستم‌عامل است.

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

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

تمام مزایا و معایب معماری ریز هسته‌ای در این رویکرد برای ساخت محیط‌های کاربردی متعدد ذاتی است، به ویژه:

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

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

1.9. ماشین های مجازی به عنوان یک رویکرد مدرن برای پیاده سازی محیط های کاربردی چندگانه

مفهوم "مانیتور ماشین مجازی" (VMM) در اواخر دهه 60 به عنوان یک نرم افزار سرچشمه گرفت سطح انتزاعکه پلتفرم سخت افزاری را به چندین ماشین مجازی تقسیم کرد. هر یک از این ماشین‌های مجازی (VM) آنقدر شبیه ماشین فیزیکی زیربنایی بودند که موجود بودند نرم افزارمی تواند بدون تغییر روی آن اجرا شود. در آن زمان، وظایف محاسباتی عمومی بر روی مین‌فریم‌های گران قیمت (مانند IBM / 360) انجام می‌شد و کاربران از توانایی VMM برای توزیع منابع کمیاب در چندین برنامه قدردانی می‌کردند.

در دهه 80-90، هزینه تجهیزات کامپیوتری به طور قابل توجهی کاهش یافت سیستم عامل چند وظیفه ای، که ارزش VMM را در نظر کاربران کاهش داد. مین فریم ها جای خود را به مینی کامپیوترها و سپس رایانه های شخصی دادند و نیازی به VMM نبود. در نتیجه، معماری کامپیوتر به سادگی ناپدید شده است سخت افزاربرای اجرای موثر آنها تا پایان دهه 80، در علم و تولید، MVM چیزی بیش از یک کنجکاوی تاریخی تلقی نمی شد.

امروز MVM دوباره در کانون توجه قرار گرفته است. اینتل، AMD، Sun Microsystems و IBM در حال ایجاد استراتژی‌های مجازی‌سازی هستند و رویکردهای مبتنی بر ماشین مجازی در دانشگاه‌ها و دانشگاه‌ها برای رسیدگی به مسائل مربوط به تحرک، امنیت و مدیریت در حال تکامل هستند. بین استعفای MVM و احیای آنها چه گذشت؟

در دهه 1990، محققان دانشگاه استنفورد شروع به کاوش در مورد استفاده از ماشین های مجازی برای غلبه بر محدودیت های سخت افزار و سیستم عامل کردند. مشکلاتی با کامپیوترهای دارای پردازش موازی انبوه (MPP) به وجود آمد که برنامه‌نویسی آنها دشوار بود و نمی‌توانستند سیستم‌عامل‌های موجود را اجرا کنند. محققان دریافته‌اند که ماشین‌های مجازی می‌توانند این معماری نامناسب را به اندازه کافی شبیه پلتفرم‌های موجود کنند تا از سیستم‌عامل‌های خارج از قفسه استفاده کنند. از این پروژه افراد و ایده‌هایی که به ذخیره طلایی VMware (www.vmware.com)، اولین فروشنده VMM برای رایانه‌های اصلی تبدیل شدند، نشأت گرفتند.

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

برای کاهش تأثیر خرابی سیستم و محافظت در برابر هک، مدیران سیستم دوباره به تک کار روی آوردند مدل محاسباتی(با یک برنامه در یک دستگاه). این منجر به هزینه های اضافی به دلیل افزایش نیازهای سخت افزاری شد. انتقال برنامه‌ها از ماشین‌های فیزیکی مختلف به ماشین‌های مجازی و ادغام این ماشین‌های مجازی در چند پلتفرم فیزیکی باعث افزایش استفاده از تجهیزات، کاهش هزینه‌های مدیریت و کاهش فضای کف شده است. بنابراین توانایی VMM در مالتیپلکس کردن سخت افزار - این بار به نام یکپارچه سازی سرور و محاسبات ابزار - آنها را دوباره زنده کرده است.

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

مجازی سازی یک فناوری در حال تکامل است. به طور کلی، مجازی سازی به شما اجازه می دهد تا نرم افزار را از زیرساخت سخت افزاری زیرین جدا کنید. در واقع، ارتباط بین یک مجموعه خاص از برنامه ها و یک کامپیوتر خاص را قطع می کند. مانیتور ماشین مجازی جدا می شود نرم افزاراز سخت افزار و یک لایه میانی بین نرم افزارهای در حال اجرا توسط ماشین های مجازی و سخت افزار تشکیل می دهد. این سطح به VMM اجازه می دهد تا به طور کامل استفاده از منابع سخت افزاری را کنترل کند. سیستم عامل مهمان (GuestOS)که روی VM اجرا می شوند.

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

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

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

VMM به عنوان یک واسطه برای تمام تعاملات بین VM و سخت افزار زیربنایی عمل می کند، چندین ماشین مجازی را بر روی یک پلت فرم سخت افزاری در حال اجرا نگه می دارد و ایزوله قابل اعتماد را فراهم می کند. VMM به شما این امکان را می دهد که گروهی از ماشین های مجازی را با نیاز به منابع کم بر روی یک کامپیوتر جداگانه جمع آوری کنید و هزینه آن را کاهش دهید. سخت افزارو نیاز به فضای تولید.

جداسازی کامل نیز برای قابلیت اطمینان و ایمنی مهم است. برنامه‌هایی که قبلاً روی یک دستگاه اجرا می‌شدند، اکنون می‌توانند در ماشین‌های مجازی مختلف توزیع شوند. اگر یکی از آنها در نتیجه یک خطا باعث از کار افتادن سیستم عامل شود، سایر برنامه ها از آن جدا شده و به کار خود ادامه می دهند. اگر یکی از برنامه ها توسط یک حمله خارجی تهدید شود، حمله در VM "در معرض خطر" محلی سازی می شود. بنابراین، VMM ابزاری برای بازسازی سیستم برای افزایش انعطاف‌پذیری و امنیت آن، بدون فضای اضافی و تلاش اداری مورد نیاز هنگام اجرای برنامه‌ها بر روی ماشین‌های فیزیکی جداگانه است.

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

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

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

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

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

کد تبدیل شده بسیار شبیه به نتایج paravirtualization است. دستورات معمولی بدون تغییر اجرا می‌شوند و دستوراتی که نیاز به پردازش ویژه دارند (مانند POPF و دستورات برای خواندن رجیسترهای بخش کد) توسط مترجم با دنباله‌ای از دستورات مشابه با دستورات مورد نیاز برای اجرا در یک ماشین مجازی مجازی جایگزین می‌شوند. با این حال، یک تفاوت مهم وجود دارد: به جای تغییر کد منبع سیستم عامل یا برنامه های کاربردی، مترجم باینری کد را در اولین باری که اجرا می شود تغییر می دهد.

در حالی که برای ترجمه کد باینری مقداری سربار اضافی مورد نیاز است، در حجم کاری معمولی ناچیز است. مترجم تنها بخشی از کد را پردازش می کند و سرعت اجرای برنامه با سرعت اجرای مستقیم قابل مقایسه است - به محض اینکه حافظه پنهان پر شود.

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

اثربخشی این رویکرد از این واقعیت ناشی می‌شود که امروزه اکثر برنامه‌ها بر روی رابط‌های کاربری گرافیکی (GUI) مانند ویندوز، مک، یا موتیف یونیکس اجرا می‌شوند و برنامه‌ها بیشتر وقت خود را صرف انجام برخی رفتارهای قابل پیش‌بینی می‌کنند. آنها به طور مداوم برای دستکاری پنجره و سایر فعالیت های مرتبط با رابط کاربری گرافیکی با کتابخانه های رابط کاربری گرافیکی تماس می گیرند. امروزه، در برنامه‌های معمولی، 60 تا 80 درصد زمان صرف اجرای توابع رابط کاربری گرافیکی و دیگر تماس‌های کتابخانه سیستم‌عامل می‌شود. این ویژگی برنامه‌ها است که به محیط‌های برنامه اجازه می‌دهد تا زمان زیادی را که صرف شبیه‌سازی یک برنامه در یک زمان می‌شود، جبران کنند. یک محیط برنامه نرم افزاری با دقت طراحی شده شامل کتابخانه هایی است که کتابخانه های داخلی رابط کاربری گرافیکی را تقلید می کنند، اما با کد "بومی" نوشته شده اند، و این به طور قابل توجهی اجرای برنامه ها را با API های یک سیستم عامل دیگر تسریع می کند. این رویکرد گاهی اوقات به عنوان ترجمه نامیده می شود تا آن را از روند کندتر شبیه سازی کد یک دستورالعمل در یک زمان متمایز کند.

به عنوان مثال، برای یک برنامه ویندوزی که روی مکینتاش اجرا می شود، تفسیر دستورات از یک پردازنده 80x86 اینتل می تواند بسیار کند باشد. اما هنگامی که یک فراخوانی به عملکرد رابط کاربری گرافیکی باز کردن یک پنجره انجام می شود، یک ماژول سیستم عامل که محیط برنامه ویندوز را پیاده سازی می کند، می تواند این تماس را قطع کرده و آن را به روال باز کردن پنجره که برای پردازنده موتورولا 680x0 دوباره کامپایل شده است، هدایت کند. در نتیجه، در چنین قسمت هایی از کد، سرعت برنامه می تواند به سرعت کار بر روی پردازنده "بومی" خود برسد (و احتمالاً از آن فراتر رود).

برای اینکه برنامه ای که برای یک سیستم عامل نوشته شده است روی سیستم عامل دیگری اجرا شود، فقط اطمینان از سازگاری API کافی نیست. مفاهیم پشت سیستم عامل های مختلف می توانند با یکدیگر تضاد داشته باشند. به عنوان مثال، در یک سیستم عامل، یک برنامه ممکن است اجازه داشته باشد مستقیماً دستگاه های I / O را کنترل کند، در دیگری، این اقدامات در انحصار سیستم عامل است. هر سیستم عامل مکانیزم های حفاظت از منابع خاص خود، الگوریتم های رسیدگی به خطا و استثناء، ساختار فرآیند و طرح مدیریت حافظه خاص، معناشناسی دسترسی به فایل و رابط کاربری گرافیکی خود را دارد. برای اطمینان از سازگاری، سازماندهی همزیستی بدون درگیری در یک سیستم عامل از چندین روش مدیریت منابع رایانه ضروری است.

3. 7. 3. روش های پیاده سازی محیط های نرم افزار کاربردی

ایجاد یک محیط برنامه کامل، کاملاً سازگار با محیط یک سیستم عامل دیگر، یک کار نسبتاً پیچیده است که ارتباط نزدیکی با ساختار سیستم عامل دارد. گزینه‌های مختلفی برای ساختن محیط‌های کاربردی متعدد وجود دارد که هم از نظر ویژگی‌های راه‌حل‌های معماری و هم در عملکردی که درجات مختلفی از قابلیت حمل برنامه را فراهم می‌کنند، متفاوت هستند.

در بسیاری از نسخه های سیستم عامل یونیکس، مترجم محیط برنامه به عنوان یک برنامه معمولی پیاده سازی می شود. در سیستم عامل هایی که با استفاده از مفهوم میکروکرنل ساخته شده اند، مانند ویندوز NT، محیط های برنامه به عنوان سرورهای حالت کاربر اجرا می شوند. و در OS / 2، با معماری ساده تر، ابزارهای سازماندهی محیط های برنامه در اعماق سیستم عامل تعبیه شده است.

یکی از واضح‌ترین گزینه‌ها برای پیاده‌سازی محیط‌های کاربردی چندگانه، بر اساس ساختار لایه‌ای استاندارد سیستم‌عامل است. در شکل 3. 8 سیستم عامل OS1 علاوه بر برنامه های کاربردی "بومی" خود، برنامه های کاربردی سیستم عامل OS2 را نیز پشتیبانی می کند. برای این، شامل یک برنامه ویژه - یک محیط نرم افزار کاربردی است که رابط سیستم عامل "خارجی" - API OS2 را به رابط سیستم عامل "بومی" خود - API OS1 ترجمه می کند.

برنج. 3. 8. محیط نرم افزار کاربردی که تماس های سیستمی را ترجمه می کند

در پیاده سازی دیگری از محیط های کاربردی چندگانه، سیستم عامل دارای چندین API همتا است. در مثال نشان داده شده در شکل. 3. به عنوان مثال، سیستم عامل از برنامه های نوشته شده برای OS1، OS2 و OS3 پشتیبانی می کند. برای انجام این کار، رابط های برنامه نویسی برنامه همه این سیستم عامل ها مستقیماً در فضای هسته سیستم قرار دارند: API OS1، API OS2 و API OS3.

برنج. 3. 9. پیاده سازی قابلیت همکاری مبتنی بر API های متعدد همتا

در این تغییر، توابع سطح API به توابع سیستم عامل سطح پایین اطلاق می شود که باید از هر سه محیط برنامه به طور کلی ناسازگار پشتیبانی کنند. سیستم عامل های مختلف زمان سیستم را به طور متفاوتی مدیریت می کنند، از فرمت زمان متفاوتی در روز استفاده می کنند، زمان پردازشگر را بر اساس الگوریتم های خود به اشتراک می گذارند، و غیره. اگر هدف مشابهی دارند.

راه دیگری برای ساختن محیط های کاربردی چندگانه بر اساس رویکرد میکروکرنل است. در عین حال، جداسازی مکانیسم های اساسی سیستم عامل مشترک برای همه محیط های برنامه از عملکردهای سطح بالا خاص برای هر یک از محیط های برنامه که مشکلات استراتژیک را حل می کنند بسیار مهم است.

با توجه به معماری میکروکرنل، تمام عملکردهای سیستم عامل توسط سرورهای میکروکرنل و حالت کاربر پیاده سازی می شوند. مهم است که هر محیط برنامه به عنوان یک سرور حالت کاربر جداگانه طراحی شده باشد و مکانیسم های اساسی را در بر نگیرد (شکل 3. 10). برنامه‌هایی که از API استفاده می‌کنند، از طریق میکروکرنل به محیط برنامه مناسب فراخوانی می‌کنند. محیط برنامه درخواست را پردازش می‌کند، آن را اجرا می‌کند (شاید با استفاده از توابع اولیه میکروکرنل برای کمک)، و نتیجه را به برنامه برمی‌گرداند. در طول اجرای یک درخواست، محیط برنامه باید به نوبه خود به مکانیزم های سیستم عامل اصلی پیاده سازی شده توسط میکروکرنل و سایر سرورهای سیستم عامل دسترسی داشته باشد.

برنج. 3. 10. رویکرد میکروکرنل برای پیاده سازی محیط های کاربردی چندگانه

این رویکرد برای ساخت محیط های کاربردی چندگانه دارای تمام مزایا و معایب معماری میکروکرنل است، به ویژه:

    افزودن و حذف محیط های برنامه بسیار آسان است، که نتیجه توسعه پذیری خوب سیستم عامل های میکروکرنل است.

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

    عملکرد پایین سیستم عامل های میکروکرنل بر سرعت محیط های برنامه و در نتیجه سرعت اجرای برنامه تاثیر می گذارد.

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

سوالات خودآزمایی

    منظور از معماری سیستم عامل چیست؟

    سه لایه اصلی در ساختار یک سیستم محاسباتی کدامند؟

    نقش سیستم عامل در رابط تماس سیستم چیست؟

    در طراحی سیستم عامل چه شرایطی باید رعایت شود تا سیستم عامل به راحتی قابل حمل باشد؟

    تفاوت بین معماری میکروکرنل و معماری سنتی سیستم عامل چیست؟

    چرا یک میکروکرنل برای پشتیبانی از محاسبات توزیع شده مناسب است؟

    منظور از مفهوم محیط های کاربردی چندگانه چیست؟

    ماهیت روش ترجمه کتابخانه ای چیست؟

سازگاری و محیط های کاربردی متعدد

مفهوم محیط های کاربردی چندگانه به نیازهای کاربر نهایی مربوط می شود - توانایی یک سیستم عامل برای اجرای برنامه های کاربردی از سایر سیستم عامل ها. این ویژگی سیستم عامل نامیده می شود سازگاری.

سازگاری باینری و منبع

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

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

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

اینکه یک سیستم عامل باینری یا سازگار با منبع باشد به عوامل زیادی بستگی دارد. مهمترین آنها معماری پردازنده ای است که سیستم عامل جدید روی آن اجرا می شود. اگر پردازنده از همان مجموعه دستورالعمل (احتمالاً با برخی موارد اضافه) و محدوده آدرس یکسان استفاده کند، می توان به سادگی به سازگاری باینری دست یافت. برای انجام این کار، رعایت شرایط زیر کافی است:

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

ساختار داخلی فایل اجرایی برنامه باید با ساختار فایل های اجرایی سیستم عامل مطابقت داشته باشد.

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

ایجاد یک محیط کاربردی کامل، کاملاً سازگار با محیط یک سیستم عامل دیگر، وظیفه ای است که با ساختار سیستم عامل مرتبط است. گزینه‌های مختلفی برای ساختن محیط‌های کاربردی متعدد وجود دارد که هم از نظر ویژگی‌های راه‌حل‌های معماری و هم در عملکردی که درجات مختلفی از قابلیت حمل برنامه را فراهم می‌کنند، متفاوت هستند.


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

در شکل 6، سیستم عامل OS1 علاوه بر کاربردهای خود، از برنامه های کاربردی سیستم عامل OS2 و OS3 نیز پشتیبانی می کند.

برای این، شامل برنامه های ویژه - محیط های نرم افزار کاربردی - است که رابط های سیستم عامل های "خارجی" API OS2 و API OS3 را به رابط سیستم عامل خود - API OS1 ترجمه می کنند.

شکل 6 - محیط های نرم افزار کاربردی که تماس های سیستمی را ترجمه می کنند

در اجرای دیگری از محیط‌های کاربردی چندگانه، سیستم عامل دارای چندین API همتا است (شکل 7). در مثال نشان داده شده، سیستم عامل از برنامه های کاربردی برای OS1، OS2 و OS3 پشتیبانی می کند.

برای انجام این کار، رابط های برنامه نویسی برنامه همه این سیستم عامل ها مستقیماً در فضای هسته سیستم قرار دارند: API OS1، API OS2 و API OS3.

شکل 7 - پیاده سازی قابلیت همکاری بر اساس API های متعدد همتا

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

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

این رویکرد برای ساخت محیط های کاربردی چندگانه دارای تمام مزایا و معایب معماری میکروکرنل است، به ویژه:

افزودن و حذف محیط های برنامه بسیار آسان است، که نتیجه توسعه پذیری خوب سیستم عامل های میکروکرنل است.

قابلیت اطمینان و پایداری در این واقعیت بیان می شود که اگر یکی از محیط های برنامه با مشکل مواجه شود، بقیه محیط های کاربردی باقی می مانند.

عملکرد ضعیف سیستم عامل های میکروکرنل بر سرعت محیط های برنامه و در نتیجه سرعت اجرای برنامه تاثیر می گذارد.

شکل 8 - رویکرد میکروکرنل برای پیاده سازی محیط های کاربردی چندگانه

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

مقالات مرتبط برتر