۱۳۹۲ اسفند ۲۲, پنجشنبه

از هسته مشکل داره، کاریشم نمی‌تونه بکنه

انگار نه انگار که می‌خواستم کمتر بیام نت، ولی خوب بازم شدتش کم شده

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

یه جنبشی راه افتاده که می‌گه آندروید کنده چون از هسته مشکل داره
ادعا؟!
این که کرنل آندروید که لینوکس باشه Monolithic یا یک پارچه هست و یک پارچه بودن خیلی بده. (به این خیلی بده توجه داشته باشید که اصلا طرف نمی‌دونه چرا داره می‌گه یک پارچه بودن خیلی بده) در ادامه می‌گه که لینوکس کاملا به صورت یه پروسه اجرا می‌شه و این یعنی کل هسته یه exe کامل هست و این هم خیلی بده.
اینه که اگه ایرانی باشی می‌گی «ببین با کیا شدیم ۷۵ میلیون»، اگرم انگلیسی زبان باشی می‌گی:
This is why aliens don't talk to us

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

اصلا بحث آندروید و وین‌فون و این چیزا نیست
می‌خوام بگم  Monolithic kernel چیه، Micro Kernel چیه.

بحث از اون‌جایی شروع شد که جناب Andrew S. Tanenbaum که یکی از اساتید معروف علم کامپیوتره و کتاب سیستم‌عاملش هم معروفه، شروع کرد از Linus Torvalds، نویسنده‌ی لینوکس ایراد بگیره که چرا لینوکس رو به صورت کرنل یک پارچه نوشتی و چرا میکرو کرنل ننوشتی. (این مباحثه رو می‌تونید از این لینک بخونید.)

بزارید توضیح بدم که اصلا تفاوت کرنل یک پارچه با میکرو کرنل چیه.

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

حالا تفاوت کرنل یک پارچه با میکرو کرنل چیه؟!
کرنل یک پارچه تمام اجزاش توی kernel space اجرا می‌شن ولی میکرو کرنل سعی می‌کنه تا بشه، kernel space رو کوچیک نگه داره و تا می‌تونه بخش‌های مختلف هسته‌ رو توی user space اجرا کنه



اگه توی عکس دقت کنید میکرو کرنل شامل یک مشت server هست که درواقع ارتباط بین kernel space و user space رو بر قرار می‌کنن.

این که کدوم روش بهتره، بحثیه که به بی‌راهه می‌کشه ولی شاید بشه گفت هر کدوم چه مزیت‌هایی دارن

کرنل یک پارچه چند درصدی سریع‌تر از میکرو کرنل هست، چون سربار server ها رو نداره
کرنل یک پارچه باگ پذیری کمتری داره، چون توی میکرو کرنل مجبورید با sever ها کار کنید و این باعث می‌شه صد‌ها مدل شرایط مختلف به وجود بیاد که باید مدیریت بشن
باگ توی کرنل یک پارچه به مراتب خطرناک‌تره، چون هر قسمتی از کرنل که باگ داشته باشه داره توی kernel space اجرا می‌شه و با درنظر گرفتن این که می‌تونه دستور سیستمی اجرا کنه، می‌تونه باعث کرش کردن کل سیستم بشه.
میکرو کرنل انعطاف بیشتری داره و می‌تونه اجزای خودشو در زمان اجرا دوباره راه اندازی کنه، درصورتی که کرنل یک پارچه اگه بخواد بخشی رو دوباره راه اندازی کنه باید کل سیستم دوباره از نو راه اندازی بشه.

حالا اگه توی عکس دقت کرده باشید می‌بیند که هیبرید کرنل، یه چیزی ما بین کرنل یک پارچه و میکرو کرنل هست.
در آخر بگم که هسته‌ی ویندوز قبل از سری NT یعنی ویندوزهای ۹۸ ، ME و پایین‌تر از نوع یک پارچه بودن، ولی از بعد از NT ، کرنل ویندوز بیشتر شبیه هیبرید کرنل‌ها هست.
لینوکس اولیه هم یک پارچه بوده ولی این روزها با این که هنوز خیلی شبیه کرنل‌های یک پارچه هست تغییرات زیادی کرده. بعضی از بخش‌ها وارد user space شده و چیزهایی مثل درایورها ماژولار شدن تا بتونن به راحتی موقع اجرای کرنل دوباره راه اندازی بشن. پس می‌شه گفت با کرنل یک پارچه‌ فرق می‌کنه.

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

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

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

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

بحثی در باب بازاریابی

با پروژه‌ی گنو آشنایی دارید؟! همونی که تلاش می‌کرد سیستم‌عامل و نرم‌افزارهای آزاد رو ایجاد بکنه.
این پروژه خودش کرنلی داشت که کاملا به صورت میکرو کرنل نوشته شده بود. از نظر تئوری و روی کاغذ خیلی خوب به نظر می‌یومد ولی وقتی بحث توسعه و کد زدن به میون می‌یومد، کار خیلی سخت می‌شد.
سخت بودن توسعه‌ی همچین کرنلی باعث شد تا این کرنل آماده نشه و وقتی linux به وجود اومد، تونست به راحتی هسته‌ی اولیه‌ی پروژه‌ی گنو رو کنار بزنه و خودش بشه اولین کرنل بدرد بخوره پروژه‌ی گنو.
این بود که گنو/لینوکس به وجود اومد

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

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

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

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

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

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

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

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

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

پ . ن
یه مطلب درست و حسابی درمورد این که چرا رابط کاربری آندروید کنده
البته مال دوران آندروید چهاره
تغییرات زیادی توی ۴.۱ و ۴.۴ ایجاد شده و خیلی چیزای دیگه توی آندروید ۵ در راهه مثل ART به جای Dalvik