مَکبِدِغ - قسمت سوم

کشور افتاده در ددلاک را نجات دهید!

نویسنده: سید علیرضا هاشمی


مکبدغ چیست؟

اگر حال ندارید تا شماره‌ی اول بروید و ببینید مکبدغ چیست، همین‌جا می‌گویم که این کلمه، سرآیندِ «مفاهیم کامپیوتری برای دنیای غیرکامپیوتری» است. در سری متن‌های مکبدغ به دنبال این هستیم که کمی، از دریچه‌ی کلمات کامپیوتری به دنیای اطرافمان نگاه کنیم.

آنچه گذشت

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

ادعای بزرگ

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

به نظرتان لپ‌تاپ من فقط همین سه مورد (برق، اینترنت و فشار انگشتان) را ورودی می‌گیرد؟ چه می‌دانم، مثلاً آیا رطوبت اتاق تأثیری در متن من ندارد؟ به نظرتان اگه رطوبت اتاق خیلی‌خیلی زیاد باشد، مثلاً من رفته باشم در سونای بخار و این متن را تایپ کنم، آیا بازهم متن من تایپ می‌شود؟

جواب سؤال بالا مشخص است؛ احتمالاً در سونای بخار، این‌قدری هوا بد هست که قطعات داخل لپ‌تاپ من بسوزند و من دیگر نتوانم این متن را تایپ کنم. پس می‌بینیم که اگر رطوبت هوا تغییر پیدا کند، خروجی کار (متن من) هم عوض می‌شود.

خب تا حالا ۴ تا ورودی برای تابعِ لپ‌تاپ من پیدا شده. به نظرتان ورودی‌های دیگری وجود ندارند؟ تا حالا به «توپ فوتبال بچه‌ی همسایه» فکر کرده‌اید؟ آیا آن هم یک ورودی برای تابع لپ‌تاپ من محسوب می‌شود؟ اگه درحالی‌که من این متن را تایپ می‌کنم، بچه‌ی همسایه توپ فوتبالش را شوت کند و بزند پنجره‌ی اتاق من را بشکاند و توپ بیفتد روی صفحه‌کلید لپ‌تاپم، آیا بازهم همان متنی که الان داشتم تایپ می‌کردم، تایپ می‌شود؟ با افتادن توپ روی صفحه‌کلید لپ‌تاپم، احتمالاً یک سری حروف درهم‌برهم و اضافی تایپ می‌شوند که البته می‌توانم پاکشان کنم، ولی بازهم روی متن من تأثیر داشتند. اصلاً این هم ممکن است که وقتی توپ فوتبال بچه‌ی همسایه افتاد روی صفحه‌کلید لپ‌تاپم، بزند و تعدادی از دکمه‌های صفحه‌کلید را خراب کند و دیگر نتوانم در متنم از بعضی حروف استفاده کنم.

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

بگذارید یک مثال دیگر هم بزنم: فرض کنید رفته‌اید سر جلسه‌ی کنکور. شما در آن لحظه یک تابع هستید؛ تابعی که پارامترهای میزان درسِ خوانده‌شده، میزان استرس و خیلی چیزهای دیگر را ورودی می‌گیرد و در پایان، رتبه‌ی کنکور شما را خروجی می‌دهد.

همان‌طور که در مثال لپ‌تاپ هم دیدیم، تابعِ شما سر جلسه‌ی کنکور ورودی‌های زیادی داشته که اصلاً به آن‌ها فکر هم نکرده‌اید؛ مثلاً پارامترِ «نشتی سقف اتاق»! از کجا معلوم که دقیقاً سقف بالای سر شما زمان کنکور نشتی نداشته باشد و آب از آن نچکد و نریزد روی پاسخ‌نامه‌تان و خرابش نکند؟ یک عامل دیگر هم هست به نام «مراقبین حرّاف»! از کجا معلوم سر جلسه‌ی کنکور دو تا مراقب که انگار شونصد سال است همدیگر را ندیده‌اند، کنار دست شما نیفتند و در مورد خاطرات کودکی‌شان تا عروسی فلانی، باهم حرف نزنند؟ می‌بینید؟ بازهم یک سری ورودی هست که کمتر به آن‌ها توجه کرده بودیم.

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

توکل

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

هیچ موقع فکر می‌کردید «تابع» و «توکل» به هم ربط داشته باشند؟

ددلاک

بعد از مفهوم تابع، به سراغ مفهوم دیگری در دنیای کامپیوتر به نام ددلاک «DeadLock» می‌رویم که ترجمه‌شده‌اش می‌شود «قفل مرگ»! بگذارید این مفهوم را با یک مثال توضیح دهم:

علی و محمد دوتا دوست هستند که می‌خواهند باهم ناهار بخورند. هرکدام از آن‌ها غذای خودش را دارد، ولی متأسفانه برای خوردن غذاها روی‌هم ۱ قاشق و ۱ چنگال بیشتر ندارند. فرض کنید هر یک از این دو نفر وقتی می‌خواهد غذای خودش را بخورد، باید هم قاشق و هم چنگال داشته باشد (یعنی کارش با یک قاشق خالی یا یک چنگال خالی راه نمی‌افتد). اگر در همان لحظه که آن‌ها شروع به غذا خوردن می‌کنند، علی قاشق را و محمد چنگال را بردارد، قبول دارید که هیچ‌کدامشان نمی‌توانند غذایشان را بخورند؟ چون هرکدامشان فقط یکی از ابزارهای لازم برای خوردن غذا را دارد و نمی‌تواند با همان ابزار غذایش را بخورد.

در مثال بالا، علی و محمد در «ددلاک» یا همان «قفل مرگ» گیر افتاده‌اند؛ می‌گویم قفل مرگ، چراکه علی و محمد در این وضعیت قفل شدند و اگر هیچ‌کدامشان هیچ اقدامی انجام ندهد (مثلاً از خودگذشتگی نکند و قاشق یا چنگالش را به نفر مقابل ندهد)، جفتشان از گرسنگی خواهند مرد! این مثال از مسئله‌ی معروف «غذا خوردن فیلسوفان» گرفته شده بود که می‌توانید از این‌جا بیشتر درموردش بخوانید.

قحطی در کامپیوتر

به نظرتان ددلاک کجای کامپیوتر اتفاق می‌افتد؟ نظری ندارید؟ طبیعی است. من هم خودم ترم ۵ دانشگاه با مفهوم ددلاک آشنا شدم، در درسی به نام سیستم‌های عامل. احتمالاً می‌دانید که همین لپ‌تاپ، کامپیوتر یا موبایلی که دارید از آن استفاده می‌کنید، رویش یک سیستم‌عامل نصب است. معمولاً سیستم‌عامل لپ‌تاپ‌ها و کامپیوترها ویندوز است و سیستم‌عامل گوشی‌ها اندروید. اگر خیلی پول‌دار باشید و ماشاءالله هزار ماشاءالله بزنم به تخته وضعتان خوب باشد، سیستم‌عامل لپ‌تاپتان مک و سیستم‌عامل موبایلتان IOS است.

از دید سیستم‌عامل، ما یک سری «پردازه» و یک سری «منبع» داریم. کارهای مختلفی که در کامپیوتر یا موبایل انجام می‌شود، هرکدامش یک پردازه است؛ مثلاً همین‌الان اگر شما یک تب جدید در مرورگرتان باز کنید، پردازه‌ی جدیدی ایجاد کرده‌اید، یا مثلاً من که دارم این متن را تایپ می‌کنم، از ویرایشگری استفاده می‌کنم که آن هم یک پردازه است. اگه دوست داشتید، می‌توانید فهرستی از پردازه‌های در حال اجرا روی سیستم‌عامل ویندوز را با کمک این نوشته، مشاهده کنید.

از آن طرف، کامپیوتر یک سری منبع هم دارد؛ مثلاً CPU یک منبع است که محاسبات کامپیوتر را انجام می‌دهد یا RAM یک منبع برای ذخیره‌سازی اطلاعات است. ظرفیت CPU یا RAM محدود است و این‌طور نیست که CPU بتواند بی‌شمار عملیات محاسبه کند و یا مثلاً RAM بتواند بی‌نهایت اطلاعات در خودش ذخیره کند.

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

کوچه تنگه؟

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

برای یافتن پاسخ این پرسش‌ها تا شماره‌ی بعدی مکبدغ منتظر باشید. ان‌شاءالله منِ نویسنده هم توی ددلاک نیفتم و بتوانم متن بعدی را بنویسم. :)

**طرح‌های این متن، اثر مهربان رضوانی است.