آیا شده تا به حال در ویندوز، یکی از پنجرههای Windows Explorer (یعنی همان چیزی که ما به غلط آن را My Computer مینامیم) قفل کند و یک دفعه همه پنجرهها بسته شود؟
دوست دارید از این معضل جلوگیری کنید؟ دوست دارید بدانید چرا در Google Chrome اگر یک تب قفل کند، فقط همان تب با مشکل مواجه میشود، اما در فایرفاکس باید کلاً فایرفاکس را ببندید؟
تصویری از یک پنجره Windows Explorer در ویندوز 7 که قفل کرده است.
کمی مقدمه: بحث شیرین مدیریت پردازهها
دوستانی که دانشجوی رشته کامپیوتر باشند و درس زیبای «سیستم عامل» را پاس کرده باشند، مطمئناً میدانند که ما مبحث مفصلی داریم به نام « Process Management » یا مدیریت پردازهها.
یکی از زیرشاخههای این مبحث، بحث انشعاب پردازهها (یا همان چنگال: Fork) است.
در این بخش گفته میشود که ممکن است یک پردازه به دلایل مختلف، پردازههای دیگری را ایجاد یا فراخوانی کند که به پردازه اول، پدر یا والد (Parent) و به بقیه پردازهها، فرزند (Child) گفته میشود.
حالا موضوع این است که اگر پردازه پدر با مشکل مواجه شد، ما چه رفتاری با فرزندها داشته باشیم؟ و همینطور، برعکس. یعنی اگر فرزند با مشکل مواجه شد، پدر و دیگر فرزندان را چه کار کنیم؟
به طور خلاصه، در بحث اول، یکی از راه حلها این است که اگر پردازه پدر با مشکل مواجه شد، فرزندان را نیز بکشیم (در ویندوز میگوییم End Task در لینوکس میگوییم Kill و در مک میگوییم Quit)
حالا پاسخ به سؤال اصلی:
چرا با قفل کردن یک پنجره کل Windows Explorer بسته میشود؟
وقتی یک پنجره اکسپلورر باز میکنید و مثلاً به درایو C میروید، شما هسته برنامه Windows Explorer را یک بار اجرا کردهاید. حالا اگر یکی دیگر باز کنید و به درایو D بروید، سیستم عامل چک میکند که اگر هسته برنامه در حال اجرا بود، فقط یک نمونه از پنجره (یک فرزند) ایجاد میکند و در آن درایو D را نشان میدهد. در حقیقت این، فرزندِ همان Windows Explorer قبلی است. حالا هر کدام از اینها که با مشکل مواجه شوند، در حقیقت هسته اکسپلورر که همان پدر است با مشکل مواجه شده. در سیستم عامل ویندوز اینطور تنظیم شده است که اگر پدر مرد، تمام فرزندان را نیز بکش!
به همین دلیل است که با قفل کردن یک پنجره (یعنی مختل شدن کار هسته)، تمام پنجرهها بسته میشود.
راه حل؟
ادامه متن... را ببینیدخیلی ساده است! ما به ویندوز خواهیم گفت که هر پنجره را در یک پردازه جداگانه اجرا کن. یعنی در حقیقت هر پنجره را به عنوان یک پدر در نظر بگیر!
برای اینکه بحث را بهتر درک کنید، ابتدا چند پنجره مختلف باز کنید و در هر یک، به پوشهها و درایوهای مختلف بروید.
کلیدهای Ctrl+Alt+Delete را بزنید تا Task Manager باز شود. اگر به تب Processes بروید و دنبال پردازه explorer بگردید، خواهید دید که با اینکه ما مثلاً سه پنجره داریم، اما فقط یک پردازه به نام explorer داریم:
برای این که هر پنجره در پردازه مختص به خودش باز شود و کار او در دیگری اختلال ایجاد نکند، مراحل زیر را طی کنید:
1- به Control Panel بروید.
2- روی Folder Options دابل کلیک کنید.
3- به تب View بروید.
4- دنبال گزینهای به نام Launch folder windows in separate process بگردید و آنرا فعال کنید و OK کنید. (معنی عبارت: هر پنجره مربوط به پوشهها را در یک پردازه جداگانه اجرا کن)
حالا از این پس، هر پنجره جدیدی که از Windows Explorer باز کنید در یک پردازه جدید اجرا میشود. اگر یکی قفل کرد، فقط همان پنجره بسته میشود نه کل پنجرهها.
نکته: مثل قبل میتوانید مثلاً ده پنجره را به عنوان فرزند یکی و چند پنجره را به عنوان فرزند دیگری باز کنید. برای اینکه یک پنجره فرزند دیگری شود، وقتی یک پنجره باز است، کلیدهای Ctrl+N را بزنید تا یک فرزند از آن ایجاد شود. به تصویر زیر دقت کنید:
میبینید که سه پنجره باز است، اما دو پردازه داریم. چون پنجرههای 2 و 3 فرزند یک پردازه هستند. اگر یکی از این دو دچار مشکل شود، هر دو بسته میشوند، اما آن یکی باز میماند.
خوب یا بد؟
سؤال این است که این کار، اگر خوب است، چرا مایکروسافت خودش به طور پیشفرض این گزینه را فعال نکرده؟
ابتدا به این تصویر نگاهی بیندازید:
همانطور که میبینید، Google Chrome برای هر یک از تبهایی که من باز کردهام، یک پردازه مختص به خود ایجاد کرده است. به همین دلیل است که وقتی یک تب قفل میکند، کل گوگل کروم بسته نمیشود. اما متأسفانه فایرفاکس در حالی که انتظار میرفت در نسخه 4 این امکان را پشتیبانی کند، نکرد و شاید به همین دلیل است که من الان که در حال نوشتن این مطلب در فایرفاکس هستم، دائماً اضطراب دارم که نکند یکی از این تبها به هر دلیلی به مشکل بربخورد و کل فایرفاکس بسته شود و تمام آنچه نوشتهام از دست برود! (البته من برای رفع این مشکل در Google Docs مینویسم که خودش به طور خودکار دائماً ذخیره کند ;) )
اینکه این کار خوب است یا بد به قدرت سیستم شما (رم و سی.پی.یو) بستگی دارد. باز کردن هر پنجره در یک پراسس جدید، رم شما را به شدت اشغال میکند! مثلاً همین الان، 49 تب در فایرفاکس من باز است! اگر قرار بود با گوگل کروم این تبها را باز کنم، احتمالا فضایی برای فتوشاپ، ویژوال استودیو، برنامه رایت و ... که همه در حال کار هستند نمیماند.
گوگل کروم، احتمالاً با بررسی دقیق کاربران فعلیاش، به این نتیجه رسیده است که این روزها به طور میانگین هر کاربر 10 تب باز میکند و از طرفی حداقل دو گیگ رم و سی.پی.یوی قوی دارد. پس به طور پیشفرض هر تب را در یک پردازه جدید باز میکند و هیچ کمبود رمی هم احساس نمیشود. دائماً هم نسخههای جدید ارائه میکند. اگر روزی به این نتیجه رسید که کاربرانش کروم را مرورگر پیشفرض خود کردهاند و 49 تب باز میکنند، شاید این را از حالت پیشفرض برداشت!
به هر حال، این مطلب بحثی بود در مورد پردازههای پدر و فرزند و شاید هم به نوعی، Multi-Threading (چند نخی) و در عین حال ترفندی بود برای آنها که ممکن است با اکسپلورر خود مشکل داشته باشند و مثل من با ورود به پوشههای شامل ویدئو (با نمای Thumbnails)، یک دفعه اکسپلوررشان قفل میکند.
امیدوارم اساتید درس «سیستم عامل» با آوردن این نوع مثالها در کلاس، این درس مهم و زیبا را برای دانشجویان کمی ملموستر کنند. نه اینکه یک دایره بکشند و چند نخ مثل مار، داخل آن و بگویند که چند نخی یعنی این! (شکلی که فکر میکنم در کتاب تننباوم وجود دارد) و یا یک چنگال بکشند و بگویند پردازه پدر و فرزند یعنی این!
موفق باشید؛
حمید رضا نیرومند