تفاوت گوروتین‌ها با Thread وکمی بررسی Process

وقتی که یه برنامه اجرا میشه یه پراسس ایجاد میشه و یه PID اختصاصی داره مثلا فرض کنید برنامه note رو باز کردید یه پراسس ایجاد میشه و یه PID خواهد داشت.

اما داخل هر پراسس Process چیا وجود داره؟ اول این تصویر رو ببینید

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

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

۱. هر Process مستقل هستش و میتونه یک یا چند Thread (ترد رو چند خط پاییینتر توضیح میدم) داخل خودش داشته باشه

۲. هر Process حافظه اختصاصی خودش رو داره

۳. هر Process شامل یک برنامه و PID انحصاری هستش و درواقع یک Task هستش

۴. بطور کلی Process توسط CPU کنترل میشه

۵. پراسس ریسورس‌های خودش رو با تردها برای اجرا برنامه به اشتراک میذاره.

۶. پراسس‌ها در فضای separate memory اجرا میشه


اما Threadها چی هستن؟ هر Thread بخشی از یک پراسس هستش و در واقع یک Light wight process میباشد و شامل اطلاعات و دستورالعملهایی هستش که cpu برای اجرای برنامه به آنها نیاز داره. Threadها توسط cpu کنترل میشن و هر ترد stack اختصاصی خودش رو داره تردهای در فضای Shared memory اجرا میشن.

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

تا اینجا من نخ‌ها یا Threadهای سطح هسته رو توضیح دادم، اما بریم سراغ نخ‌ها یا Threadهای سمت user که توی گولنگ بهشون میگیم گوروتین Goroutine.

گورویتن‌ها خیلی خیلی سبک و کم هزینه هستن و وقتی ایجاد میشن حدود ۲ کیلوبایت حافظه رو اشغال میکنن (که قابل افزایش هستش) و توسط runtime گولنگ مدیریت میشن (درحالی که تردهای سطح هسته مقدار پیش فرض حافظه ای (استک) که بهشون اختصاص داده میشه حدودا یک مگابایت یا بیشتر هست) . توی golang به این تردهای سطح یوزر گوروتین میگن البته با greenthread ها هم شناخته میشن. یه برنامه نویس میتونه چندین میلیون گوروتین رو ایجاد کنه بدون اینکه مشکلی پیش بیاد. گوروتین ها توسط زمان بند رانتایم گولنگ به thread های سیستم عامل یا هسته map میشن .

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


تو این مقاله میتونی در مورد تفاوت‌های حافظه هیپ و استک بیشتر بخونی

کانال تگلرام

https://t.me/uncodev