رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران
  • 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 کد را کامپایل میکند ؟ یا اینکه این‌کار به عهده سیستم عامل می‌باشد ؟

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

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


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

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

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

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

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

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

 

ps huH p

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

cat /proc//status | grep Threads

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 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 کد را کامپایل میکند ؟ یا اینکه این‌کار به عهده سیستم عامل می‌باشد ؟

سلام

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

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 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 بیشتر استفاده نمیکنه :).

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


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

به گفتگو ملحق شوید

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

مهمان
پاسخ به این سوال ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


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

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

×
×
  • جدید...