رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران
  • 2
قاسم رمضانی منش

وضعیت اجرای برنامه‌ها در حالت Multi Threading

سوال

ارسال شده در (ویرایش شده)

با سلام !

آیا برنامه ها به صورت خودکار در حالت Multi Threading اجرا میشوند ؟

بنده قطعه کد زیر را کامپایل و اجرا گرفته ام :

main.cpp

#include <iostream>
int main(void){
	constexpr double long AnotherIndex = 999999999999999999;
	for(double long index=0;index <= AnotherIndex;++index){
		std::cout << index << std::endl;
	}
	return 0x0000;
}

بعد از اجرا ، خروجی برنامه ی htop به اینصورت بود :

1  [||||||||||||||||||||||       71.9% ]    Tasks: 166, 738 thr; 4 running
2  [|||||||||||||||||||          60.30%]    Load average: 2.94 1.88 1.61
3  [|||||||||||||||||||||||      74.1% ]    Uptime: 04:50:24
4  [||||||||||||||||||           56.6% ]
Mem[||||||||||||||||||||||||2.76G/3.71G]
Swp[|||                      790M/7.99G] 

  PID  USER   PRI  NI   VIRT   PES   SHR  S CPU%  MEM%    TIME+   Command
18991  ghasem  20   0   5616  1692  1544  R 89.1   0.0   1:13.01  /tmp/Opt/main

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

ویرایش شده در توسط قاسم رمضانی منش

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

6 پاسخ به این سوال تا کنون داده شده است

پست های پیشنهاد شده

  • 2
در 1 ساعت قبل، قاسم رمضانی منش گفته است :

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

نه هیچ برنامه‌ای به‌طور خودکار در چند ترد اجرا نمیشه. دلیل این که تعداد زیادی هسته رو درگیر می‌بینید سرعت بالای context switch هست. برای این که ببینید هر پردازه چند ترد ایجاد کرده از دستور زیر استفاده کنید:

 

ps huH p

با خوندن اطلاعات procfs هم میشه:

cat /proc//status | grep Threads

  • تشکر شده 2

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 2
در 13 ساعت قبل، قاسم رمضانی منش گفته است :

آیا برنامه ها به صورت خودکار در حالت Multi Threading اجرا میشوند ؟

تمام برنامه ها در زمان شروع در یک نخ به نام Main Thread اجرا می شوند. نخ های ایجاد شده توسط برنامه درسطح کاربر هستند. اصولا نخ ها در دو سطح کاربر و سطح هسته ایجاد می شوند. که هر پلت فرم برنامه نویسی هم برای خود از یک تکنولوژی برای مدیریت نخ ها استفاده میکند . برای اطلاعات بیشتر می تونید مباحث آپارتمان نخ ها و STA single thread apartement رامطالعه کنید.

در 14 ساعت قبل، قاسم رمضانی منش گفته است :

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

بنابراین وقتی که یک نخ اصلی برنامه اجرا می شود توسط سیستم عامل عملیات Timing , priority , state,... کنترل می شود  و اینکه شما بتونید برنامه ای بنویسید که از تمام هسته های پردازشگر در جهت اجرای بهتر برنامه خود استفاده نمایید باید برنامه شما قابلیت موازی کردن عملیات ها ویا همزمانی پروسه هارا داشته باشد در این صورت شما با استفاده از کتابخانه های همزمانی می توانید در زمان ایجاد حوضچه های نخ Thread Pool نحوه استفاده از هسته ها را برای این حوضچه ها تعریف کنید که مثال بتوانند از تمام هسته ها به طوری که هسته های دیگر در اجرای وظایف خود دچار اختلال نشوند، اجرا شوند.

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

parallel_merge_sort.jpg.aebe35827994720ec78966777973b394.jpg  

procedureparallelmergesort(id, n, data, newdata)

begin
   data = sequentialmergesort(data)
	
      for dim = 1 to n
         data = parallelmerge(id, dim, data)
      endfor
		
   newdata = data
end

 البته این الگوریتم اجرا برای شما نمایش میده! و از آنجائیکه نوشتن برنامه های موازی کار بسیار پیچیده ای می باشد و معمولا به تجربه ای زیاد نیاز دارید بهتر است از کتابخانه های موازی سازی که خیلی بهینه این قبیل موازی سازی را برای شما انجام می دهند استفاده نمایید

  • پسندیدن 2
  • تشکر شده 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در ۱ ساعت قبل، قاسم رمضانی منش گفته است :

با سلام !

آیا برنامه ها به صورت خودکار در حالت Multi Threading اجرا میشوند ؟

بنده قطعه کد زیر را کامپایل و اجرا گرفته ام :

main.cpp



 
 
#include <iostream>
 
int main(void){
 
constexpr double long AnotherIndex = 999999999999999999;
 
for(double long index=0;index <= AnotherIndex;++index){
 
std::cout << index << std::endl;
 
}
 
return 0x0000;
 
}

بعد از اجرا ، خروجی برنامه ی htop به اینصورت بود :



 
 
1 [|||||||||||||||||||||| 71.9% ] Tasks: 166, 738 thr; 4 running
 
2 [||||||||||||||||||| 60.30%] Load average: 2.94 1.88 1.61
 
3 [||||||||||||||||||||||| 74.1% ] Uptime: 04:50:24
 
4 [|||||||||||||||||| 56.6% ]
 
Mem[||||||||||||||||||||||||2.76G/3.71G]
 
Swp[||| 790M/7.99G]
 
 
 
PID USER PRI NI VIRT PES SHR S CPU% MEM% TIME+ Command
 
18991 ghasem 20 0 5616 1692 1544 R 89.1 0.0 1:13.01 /tmp/Opt/main

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

سلام

بستگی به محیط توسعه و ... داره ولی امکان مالتر ترد کامپایل شدن وجود داره میتونید با فلگ تنظیم کنید با چند ترد برنامه کامپایل بشه.

  • پسندیدن 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
ارسال شده در (ویرایش شده)
در 9 دقیقه قبل، بهنام صباغی گفته است :

محیط توسعه

دقیقا متوجه نشدم منظورتان را از محیط توسعه .

مشخصات سیستمی که این برنامه را اجرا کرده :

OS: Fedora release 29 (Twenty Nine) x86_64
Kernel: 4.19.6-300.fc29.x86_64
CPU: Intel i7 M 620 (4) @ 2.667GHz
GPU: NVIDIA NVS 3100M
Memory:  3801MiB

و کامپایلر g++ (GCC) 8.2.1 20181105 (Red Hat 8.2.1-5) بدون دستکاری فلگ‌ها استفاده 

 

در 9 دقیقه قبل، بهنام صباغی گفته است :

میتونید با فلگ تنظیم کنید

با چه فلگ هایی این  عمل صورت میگیره ؟

ویرایش شده در توسط قاسم رمضانی منش

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 7 دقیقه قبل، قاسم رمضانی منش گفته است :

دقیقا متوجه نشدم منظورتان را از محیط توسعه .

مشخصات سیستمی که این برنامه را اجرا کرده :



 
 
OS: Fedora release 29 (Twenty Nine) x86_64
 
Kernel: 4.19.6-300.fc29.x86_64
 
CPU: Intel i7 M 620 (4) @ 2.667GHz
 
GPU: NVIDIA NVS 3100M
 
Memory:  3801MiB

و کامپایلر g++ (GCC) 8.2.1 20181105 (Red Hat 8.2.1-5) بدون دستکاری فلگ‌ها استفاده 

 

با چه فلگ هایی این  عمل صورت میگیره ؟

-pipe

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 4 دقیقه قبل، سروش ربیعی گفته است :
در 1 ساعت قبل، قاسم رمضانی منش گفته است :

 

نه هیچ برنامه‌ای به‌طور خودکار در چند ترد اجرا نمیشه.

مرسی بابت پاسخ. بله الان که با خوندن فایل /proc/PID/status متوجه شدم که کلا این برنامه از یک thread بیشتر استفاده نمیکنه :).

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×