تفاوت بین Processو Threadچیست؟

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

یک فرایند به معنای اجرای یک برنامه است. زمانی که یک برنامه در حافظه بارگذاری شده و فعال می‌شود، آن برنامه به یک Process تبدیل می‌شود. Process به برخی منابع ضروری مانند رجیسترها، شمارنده برنامه و پشته(stack) نیاز دارد

یک رشته (Thread) کوچکترین واحد اجرایی درون یک Process است. فرآیند زیر رابطه بین برنامه، Process و Thread را توضیح می‌دهد.

  • برنامه شامل مجموعه‌ای از دستورالعمل‌ها است.
  • برنامه در حافظه بارگذاری می‌شود. به یک یا چند Process در حال اجرا تبدیل می‌شود.
  • زمانی که یک Process شروع می‌شود، حافظه و منابع به آن اختصاص داده می‌شود. یک Process می‌تواند دارای یک یا چند Thread باشد. به عنوان مثال، در برنامه مایکروسافت ورد، یک Thread ممکن است مسئول بررسی املا و Thread دیگر مسئول وارد کردن متن به سند باشد.

تفاوت‌های اصلی بین Process و Thread:

  • Process ها معمولا مستقل هستند، در حالی که Thread ها به عنوان زیرمجموعه‌هایی از یک Process وجود دارند.
  • هرProcess دارای فضای حافظه خود است. Thread هایی که به یک Process تعلق دارند، حافظه مشترکی را به اشتراک می‌گذارند.
  • یک Process دار سربار عملیاتی سنگین است. ایجاد و خاتمه دادن به آن زمان بیشتری می‌برد.
  • تغییر زمینه(Context switch) بین Processها هزینه برتر است.
  • ارتباط بین Thread ای برای Thread ها سریع‌تر است.


برخی از زبان های برنامه نویسی از coroutine پشتیبانی می کنند. تفاوت coroutine و thread چیست؟

اصلی‌ترین تفاوت‌های بین کوروتین‌ها و رشته‌ها به شرح زیر است:

1. مدل همزمانی (Concurrency Model):

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

2. زمان‌بندی (Scheduling):

  • رشته‌ها: رشته‌ها توسط زمان‌بندی کننده سیستم عامل برنامه‌ریزی می‌شوند، که بر اساس عواملی مانند زمان CPU، اولویت و دردسترس بودن منابع، تصمیم می‌گیرد که چه زمانی باید بین رشته‌ها جابه‌جا شود.
  • کوروتین‌ها: کوروتین‌ها توسط زمان‌بندی کننده کوروتین یا پیاده‌سازی زبان برنامه‌نویسی برنامه‌ریزی می‌شوند، که تعیین می‌کند چه زمانی باید بین کوروتین‌ها جابه‌جا شود. این جابه‌جایی معمولاً به صورت همکارانه انجام می‌شود، جایی که کوروتین کنترل را به طور صریح به زمان‌بندی کننده بازمی‌گرداند.

3. تغییر زمینه (Context Switching):

  • رشته‌ها: جابه‌جایی بین رشته‌ها شامل Context Switching پر هزینه تری است، زیرا سیستم عامل باید وضعیت اجرای کامل رشته را ذخیره و بازیابی کند، از جمله ثبت‌های CPU، پشته و حافظه.
  • کوروتین‌ها: جابه‌جایی بین کوروتین‌ها معمولاً کم‌هزینه‌تر است، زیرا زمان‌بندی کننده فقط باید وضعیت محلی کوروتین، مانند شمارنده برنامه و پشته را ذخیره و بازیابی کند.

4. استفاده از منابع (Resource Utilization):

  • رشته‌ها: رشته‌ها می‌توانند از چندین هسته CPU بهره‌برداری کنند، که به موازی‌سازی واقعی و بهبود عملکرد در سیستم‌های چندهسته‌ای کمک می‌کند.
  • کوروتین‌ها: کوروتین‌ها معمولاً در یک رشته واحد محدود هستند، بنابراین نمی‌توانند از چندین هسته CPU استفاده کنند. با این حال، آن‌ها می‌توانند یک مدل همزمانی سبک‌تر و کارآمدتر را در یک رشته واحد ارائه دهند.

5. مدیریت خطا (Error Handling):

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


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


چگونه می توان پروسس های در حال اجرا در لینوکس را لیست کرد؟

در لینوکس، می‌توانید پروسه‌های در حال اجرا را با استفاده از دستورات زیر لیست کنید:


1. ps (Process Status):

دستور ps اطلاعات مربوط به پروسه‌های در حال اجرا را نمایش می‌دهد.

استفاده پایه: ps

برای مشاهده همه پروسه‌های در حال اجرا: ps -ef یا ps aux

گزینه -e همه پروسه‌ها را نمایش می‌دهد و گزینه -f یک لیست فرمت کامل ارائه می‌دهد.

گزینه aux پروسه‌های همه کاربران را نمایش می‌دهد.


2. top:

دستور top یک نمای پویا و آنی از پروسه‌های در حال اجرا را ارائه می‌دهد.

پیش‌فرض به ترتیب استفاده CPU مرتب می‌شوند.

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

برای خروج از top دکمه q را فشار دهید.


3. htop:

htop نسخه بهبود یافته‌ای از دستور top است که یک رابط کاربری دوست‌داشتنی‌تر و تعاملی‌تر را ارائه می‌دهد.

امکانات اضافی مانند مرتب‌سازی، فیلتر کردن و انجام اقدامات روی پروسه‌ها را فراهم می‌کند.

htop باید جداگانه نصب شود، زیرا یک دستور پیش‌فرض در بیشتر توزیع‌های لینوکس نیست.


4. pgrep (Process Grep):

دستور pgrep امکان جستجوی پروسه‌های در حال اجرا بر اساس نام یا سایر معیارها را فراهم می‌کند.

مثال: pgrep firefox برای یافتن همه پروسه‌های با نام "firefox".


5. pidof:

دستور pidof شناسه پروسه (PID) یک برنامه در حال اجرا را پیدا می‌کند.

مثال: pidof firefox برای دریافت PID پروسه Firefox.


6. systemctl:

systemctl یک ابزار خط فرمان است که برای کنترل سیستم init systemd استفاده می‌شود، که سیستم init پیش‌فرض در بسیاری از توزیع‌های مدرن لینوکس است.

می‌توانید از systemctl list-units --type=service برای لیست کردن همه سرویس‌های در حال اجرا استفاده کنید.


این رایج‌ترین روش‌ها برای لیست کردن پروسه‌های در حال اجرا در لینوکس است