# Native Code > برنامه نویسی در Delphi > مباحث عمومی دلفی و پاسکال > آموزش: برنامه نویسی MultiThreading

## بهروز عباسی

درود به همه برنامه نویس های گل
در این تاپیک قصد دارم آموزش های در رابطه با برنامه نویسی MultiThreading  قرار بدم البته قبلاً یک مقاله درا این *تاپیک* ایجاد شده ولی قصد من آموزشی کلی تره.

*چند نکته:*
1- خواهشاً اگر برای دوستان سوال پیش امد اول در سایت جستجو کنن بعد اینجا عنوان کنن.
2- به هر حال اگر سوالی پرسیده شد بعد از گرفتن پاسخ و اضافه شدن اون به آموزش اقدام به حذف سوال کنید تا تاپیک در هم بر هم نشه.

*عناوین پست های تاپیک (مرحله به مر حله):

1-مقدمه
2- Thread چیست؟* *
3-چند نکته مهم : 
* *- توضیحاتی در مورد ProcessMessages*
*از رویدادها تا Thread ها (کپی از کتاب mastering delphi7)*


*
متاسفانه به خاطر کمبود وقت نمی تونم آموزش رو ادامه بدم
**لطفاً دوستانی که می تونن آموزش رو ادامه بدن.
* 
*موفق باشید*

----------


## بهروز عباسی

*مقدمه:*
اینکه چه موقع نیاز به استفاده از MultiThreading دارید بستگی مستقیم به برنامه شما و نحوه عملکرد آن دارد، MultiThreading برای برنامه های مناسب است که در ان برنامه قرار است دو یا چند عمل همزمان انجام شود که البته زمان پردازش یا خیلی زیاد است یا معلوم نیست ،مثلاً : یک آلگوریتم زمان بر که پردازشهای سنگینی را می طلبد.
مثل کد زیر:
procedure Tfrm_Main.btn_TestClick(Sender: TObject);
var
  I, J, L: Integer;
begin
  for I := 0 to 100000 do
    for J := 1 to 10000 do
      L := I div J * 500 - 8 div 2 * 2;

  ShowMessage(IntToStr(L));
end;

با اجرای نمونه کدی که در بالا قرار دادم UI برنامه قفل شده و عملاً از دسترس کاربر خارج می شود.
نکته مهم اینجاست که برنامه علاوه بر پردازش زیاد و همزمانی پردازش ها نباید از دسترس کاربر خارج شود و نارضایتی او را در بر داشته باشد یعنی کاربر قادر به اداره روند اجرای برنامه 
باشد اینجاست که تنها راه منطقی و مناسب یعنی برنامه نویسی MultiThreading مطرح می شود (البته راههای دیگری هم هست).
برای برطرف کردن این مشکل می توانیم متد ProcessMessages از شیء Application را در حلقه فراخوانی کنیم که هرچند اجرای برنامه را کند می کند اما از فریز شدن UI جلوگیری می کند.
مانند کد زیر:
procedure Tfrm_Main.btn_TestClick(Sender: TObject);
var
  I, J, L: Integer;
begin
  for I := 0 to 100000 do
  begin
    for J := 1 to 10000 do
    begin
      L := I div J * 500 - 8 div 2 * 2;
      Application.ProcessMessages;
    end;
  end;
  ShowMessage(IntToStr(L));
end;

*نکته مهم در مورد* *ProcessMessages** این است که صفی از پیامهای برنامه مورد نظر را مورد پردازش قرار می دهد مدت زمان اجرای برنامه متناسب با تعداد پیامهای موجود در صف کم یا زیاد می شود.*
*و روش دیگری هست که متد* *HandleMessage** را به جای* *ProcessMessages** در حلقه فراخوانی کنید تفاوت این متد با متد* *ProcessMessages** در این است حداکثر یک پیام را پردازش میکند .*

*یک نمونه* برای فهمیدن سرعت اجرای برنامه که به خاطر استفاده از *ProcessMessages* در برنامه هر بار نتیجه جدیدی بر می گرداند.

موفق باشید

----------


## Felony

قبل از اینکه مباحثتون ادامه پیدا کنه و وارد بحث اصلی پردازش چند نخی بشید بهتره در مورد چهره پنهان متد ProcessMessages از شئ Application کمی صحبت بشه ، البته بارها در این بخش در موردش صحبت کردم ولی توضیحاتی که دادم خیلی کوتاه و اجمالی بوده .

خوب با نوشتن کدی که بار پردازشی زیادی رو به سیستم تحمیل کنه به دلیل Single Thread بودن برنامه های نوشته شده به صورت پیش فرض این پردازش ها در نخ اصلی برنامه که وظیفه به روز رسانی رابط کاربری رو بر عهده داره انجام میشه و چون این Thread مشغول هست نمیتونه به پیغام های به روز رسانی رابط کاربری رسیدگی کنه و عملا UI برنامه فریز میشه و برنامه موقتا تا پایان عملیات پردازش از دسترس خارج میشه ؛ مثلا کد زیر :

var
  cycle: integer;
begin
  inc(worklevel);
  for cycle := 1 to 5 do
  begin
    Memo1.Lines.Add('- Work ' + IntToStr(worklevel) + ', Cycle ' +
      IntToStr(cycle));
    sleep(1000);
    // some other work
  end;
  Memo1.Lines.Add('Work ' + IntToStr(worklevel) + ' ended.');
  dec(worklevel);
end;

* متغییر worklevel رو در بخش private فرم برنامه از نوع Integer تعریف کنید .

خوب با نوشتن کد بالا داخل یک دکمه و زدن دکمه حلقه شروع به چاپ میکنه و رابط کاربری برنامه موقتا از دسترس خارج میشه ، ولی با این حال با کلیک دوباره روی دکمه برنامه از خودش عکس العملی نشون نمیده ولی سیستم عامل این کلیک رو در Message Queue برنامه ثبت میکنه تا برنامه در اولین فرصت بهش رسیدگی کنه ؛ یعنی شما اگر 3 بار روی دکمه کلیک کنید با اینکه رابطه کاربری برنامه غیر فعال هست ولی بعد از پایان هر دوره چاپ ( پایان حلقه ) به تعداد کلیک زده شده روی دکمه حلقه دوباره شروع به چاپ میکنه ، چون کلیک انجام شده روی دکمه به عنوان یک پیغام در Message Queue برنامه ثبت شده و تا زمانی که به این پیغام رسیدگی نشه از این صف حذف نمیشه .

حالا میخوایم با استفاده از متد ProcessMessage از شئ Application برنامه رو مجبور کنیم در هر بار دور زدن حلقه پیغام های داخل صف برنامه رو پردازش کنه و به اونها رسیدگی کنه تا رابط کاربری برنامه که پیغام های به روز رسانیش تو همین صف درج میشه از کار نیافته :

var
  cycle: integer;
begin
  inc(worklevel);
  for cycle := 1 to 5 do
  begin
    Memo1.Lines.Add('- Work ' + IntToStr(worklevel) + ', Cycle ' +
      IntToStr(cycle));
    Application.ProcessMessages;
    sleep(1000);
    // or some other work
  end;
  Memo1.Lines.Add('Work ' + IntToStr(worklevel) + ' ended.');
  dec(worklevel);
end;

خوب ؛ دوستان تازه وارد با مواجه شدن با هر نوع پردازش سنگینی که UI رو تحت تائثیر قرار میده بدون در نظر گرفتن شرایط خیلی راحت متد ProcessMessages رو صدا میزنن و پیش خودشون هم کلی کیف میکنن که همه چیز درست شد ؛ مثل کد بالا !

خوب حالا که کد بالا رو داخل یک دکمه نوشتید برنامه رو اجرا کنید و روی دکمه چند بار کلیک کنید ( با فاصله های زمانی مختلف ) ، خوب ؟ با چی مواجه شدید ؟! 

با اجرای کد بالا ترتیب اجرای کدها به صورت کامل به هم میریزه ، چون شما با صدا زدن متد ProcessMessages ماهیت صف رو زیر سوال بردید ، مثل این میمونه که در یک نانوایی صف طوری باشه که نانوا به جای اینکه هر کی زودتر اومده تو صف بهش نان زودتر بده ، به هر کی که وارد صف میشه و داد میزنه من نان میخوام نون بده ، حالا 10 نفر هم جلوی اون طرفی که داد زده بودن ولی نون به اونی که داد زده میرسه و بعد به افراد داخل صف !

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

----------


## vcldeveloper

> با اجرای کد بالا ترتیب اجرای کدها به صورت کامل به هم میریزه ، چون شما با  صدا زدن متد ProcessMessages ماهیت صف رو زیر سوال بردید ، مثل این میمونه  که در یک نانوایی صف طوری باشه که نانوا به جای اینکه هر کی زودتر اومده  تو صف بهش نان زودتر بده ، به هر کی که وارد صف میشه و داد میزنه من نان  میخوام نون بده ، حالا 10 نفر هم جلوی اون طرفی که داد زده بودن ولی نون به  اونی که داد زده میرسه و بعد به افراد داخل صف !


اجرای Application.ProcessMessages ارتباطی به بهم خوردن ترتیب اجرای کدها نداره. چه  ProcessMessages اجرا بشه، و چه اجرا نشه، ویندوز پیام های یک پنجره رو به صف پیام ها ارسال میکنه تا به ترتیب اجرا بشند. کاری که Application.ProcessMessages انجام میده اینه که وضعیت صف پیام ها رو بررسی میکنه، اگه پیامی در صف در انتظار پردازش باشه، اجرای کد بعدی را تا اتمام پردازش تمامی پیام های موجود در صف متوقف میکنه، و بعد از اتمام پردازش پیام های دریافتی، اجرای کد ادامه پیدا میکنه.
در یک برنامه دارای رابط گرافیکی کاربر، در هر ثانیه تعداد زیادی پیام برای رسم اجزاء گرافیکی برنامه و تعامل با کاربر به پنجره های برنامه ارسال میشه. استفاده از Application.ProcessMessages در یک tight loop باعث میشه که پردازش مربوطه مرتبا متوقف بشه تا رابط کاربر آپدیت بشه، و پاسخ درخواست های کاربر داده بشه. این توقف های متعدد موجب طولانی شدن زمان پردازش میشه.




> *2- توضیحاتی در مورد ProcessMessages*


Application.ProcessMessages ربطی به Multi-threading نداره.

----------


## Felony

> اجرای Application.ProcessMessages ارتباطی به بهم خوردن ترتیب اجرای کدها نداره. چه ProcessMessages اجرا بشه، و چه اجرا نشه، ویندوز پیام های یک پنجره رو به صف پیام ها ارسال میکنه تا به ترتیب اجرا بشند. کاری که Application.ProcessMessages انجام میده اینه که وضعیت صف پیام ها رو بررسی میکنه، اگه پیامی در صف در انتظار پردازش باشه، اجرای کد بعدی را تا اتمام پردازش تمامی پیام های موجود در صف متوقف میکنه، و بعد از اتمام پردازش پیام های دریافتی، اجرای کد ادامه پیدا میکنه.


من حرفی در مورد اینکه با صدا زدن ProcessMessages ویندوز کار قرار دادن پیغام ها در صف رو به اشتباه انجام میده یا همچین چیزی نزدم ، گفتم ترتیب اجرای کدها به هم میخوره ( به همون دلیل توقف اجرای کدها و پرداختن به پردازش پیغام های صف ) ؛ حرف هایی هم که زدم فکر نمیکنم با حرف های شما مغایرتی داشته باشه ( شاید منظورم رو بد متوجه شدید ) ؛ من بارها همین حرف هایی که شما زدید رو در پست های مختلف به کاربران گوشزد کردم ، مثلا : https://barnamenevis.org/showthread.p...rocessmessages

منظورم این بود که استفاده از متد ProcessMessages روند عادی پردازش ها رو مختل میکنه ، و مثال هم براش زدم ( نانوایی ) .

----------


## tdkhakpur

> منظورم این بود که استفاده از متد ProcessMessages روند عادی پردازش ها رو مختل میکنه ، و مثال هم براش زدم ( نانوایی ) .


آقا مجتبی همه مطالبی که فرمودی درسته اما این آخر کار که میگید مختل میکنه درست نیست.
اگه اصطلاح متوقف کردن پردازش و یا انتقال ip instruction به محل دیگه رو به کار ببرید بهتره.

----------


## بهروز عباسی

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

----------


## بهروز عباسی

حتما برداشت شما از نوشته های قبلی این بوده ،که استفاده از Thread باعث افزایش سرعت برنامه می شود.
اگر اینگونه بوده ممکن است شما اشتباه فکر کرده باشید.چرا؟
چون وقتی در برنامه ای از Thread استفاده می کنید سیستم عامل از منابع سیستم به همان اندازه که به Thread اصلی برنامه  اختصاص داده به Thread دیگری که شما ایجاد کرده اید منبع اختصاص می دهد ، حال اگر شما بدون داشتن دلیل کافی برای استفاده از Thread از آن در برنامه های خود استفاده کنید ممکن است نه تنها باعث افزایش کارائی و سرعت برنامه نشود بلکه نتیجه عکس بگیرید.
برنامه های که از Thread درون آنها استفاده می شود مدت زمان بیشتری CPU را در اختیار می گیرند چرا که سیستم عامل زمان CPU را بین Thread ها تقسیم می کند نه Process ها .
پس برنامه های که از Thread استفاده می کنند (بسته به تعداد Thread ها) بیشتر از CPU استفاده می کنند، و این استفاده بیشتر اگر بهینه تر هم شود باعث سریعتر انجام شدن الگوریتمی می شود به طور موازی توسط Thread ها در حال انجام است.
نکته : وقتی قرار است از MultiThreading استفاده کنید به صورت ناخواسته اجباری برای شما فراهم می شود : باید از *الگوریتم های موازی* استفاده کنید تا عمل زمان بر خود را به چند عمل 
کوچک تقسیم کنید و آنها را بصورت موازی پیش ببرید.
برای نمونه شما در برنامه ای 5 حلقه ی تودر تو دارید برای شکستن هریک این حقله ها به یک ترد و پردازش موازی آنها چکار می کنید؟

----------


## tdkhakpur

> برای نمونه شما در برنامه ای 5 حلقه ی تودر تو دارید برای شکستن هریک این حقله ها به یک ترد و پردازش موازی آنها چکار می کنید؟


همه موارد مربوط به استفاده از ترد رو بیان کردید اما این سوال اخرتان چه معنی داره؟
در کل درسته ترد برای موازی سازی به کار برده میشه اما در حقیقت هیچ چیز در سیستم کامپیوتر و سیستم عاملی مانند ویندوز موازی کار نمیکنه بلکه سرعت اجراست که موازی بودن اجرا رو نشون میده. cpu فقط ip داره و کلاک پالس که با استفاده از اون ip میره سراغ ram و کد موجود در اونجا رو اجرا میکنه.
اما در مورد اون موردی که گفتید برای حلقه 5 تایی ترد بسازید این باز برمیگرده به الگوریتم برنامه داخل کدهای بالا که ارسال کردید نیازی به استفاده از چند ترد نیست فقط نتیجه اصلی اجرا داخل ترد قرار میگیره یعنی همون 5 حلقه تودرتو.

----------


## بهروز عباسی

درود به همه 



> در حقیقت هیچ چیز در سیستم کامپیوتر و سیستم عاملی مانند ویندوز موازی کار نمیکنه


در صورتی که سیستم دارای چند پردازنده نباشه ، .




> اما در مورد اون موردی که گفتید برای حلقه 5 تایی ترد بسازید این باز  برمیگرده به الگوریتم برنامه داخل کدهای بالا که ارسال کردید نیازی به  استفاده از چند ترد نیست فقط نتیجه اصلی اجرا داخل ترد قرار میگیره یعنی  همون 5 حلقه تودرتو.


دوست عزیز هدف من تاکید بر این بود که برای تسلط پیدا کردن به  MultiThreading  نحوه عملکرد الگوریتم های موازی سازی هم لازمه و فقط MultiThreading نمی تونه به تنهایی مشکل رو حل کنه.
اگه طرف به برنامه نویسی چند نخی در دلفی آشنا باشه و بتونه اون رو پیاده سازی کنه اما ندونه چطور باید توسط تردها یک الگوریتم بزرگ رو به چند الگوریتم کوچیک بشکنه چه فایده ای داره؟

موفق باشید

----------


## tdkhakpur

> در صورتی که سیستم دارای چند پردازنده نباشه ، .


خسته نباشی!؟؟؟
از نرم افزار رفتی تو سخت افزار؟
ما اون مطالب رو در ارتباط با ترد عرض کردیم خدمتان.
مطمئن نیستم اما تا اونجایی که میدونم در مورد مادربردهای مالتی cpu آخر کار یه جایی پردازش میره داخل صف قرار میگیره اون همون حافظه مشترک بین cpu هاست که از اون برای ایجاد همزمانی استفاده میشه.

----------


## بهروز عباسی

درود به همه 



> در حقیقت هیچ چیز در سیستم کامپیوتر و سیستم عاملی مانند ویندوز موازی کار نمیکنه


من هنوز متوجه منظورتون نشدم پس تمام تعاریفی که چه اساتید این سایت و ... برای ترد داشتن و همین منظور رو می رسونن یه مشت خیال بافی و چیزای الکیه؟
لطفاً با پ-خ پاسخ بدید تا تاپیک شلوغ نشه.




> خسته نباشی!؟؟؟


خواهش می کنم نیستم !



> از نرم افزار رفتی تو سخت افزار؟


 :متفکر: 



> ما اون مطالب رو در ارتباط با ترد عرض کردیم خدمتان.


ممنون



> مطمئن نیستم اما تا اونجایی که میدونم در مورد مادربردهای مالتی cpu آخر  کار یه جایی پردازش میره داخل صف قرار میگیره اون همون حافظه مشترک بین cpu  هاست که از اون برای ایجاد همزمانی استفاده میشه.


بنده از این مباحث چیز زیادی نمیدونم شما با هرجاش مشکلی دارید با دلیل برای بنده ارسال کنید (پیام خصوصی) تا بنده برای اصلاح اقدام کنم.
چون اینطوری تاپیک زیادی شلوغ میشه.

موفق باشید.

----------


## tdkhakpur

> درود به همه 
> من هنوز متوجه منظورتون نشدم پس تمام تعاریفی که چه اساتید این سایت و ... برای ترد داشتن و همین منظور رو می رسونن یه مشت خیال بافی و چیزای الکیه؟
> لطفاً با پ-خ پاسخ بدید تا تاپیک شلوغ نشه.
> 
> خواهش می کنم نیستم !
> 
> ممنون
> بنده از این مباحث چیز زیادی نمیدونم شما با هرجاش مشکلی دارید با دلیل برای بنده ارسال کنید (پیام خصوصی) تا بنده برای اصلاح اقدام کنم.
> چون اینطوری تاپیک زیادی شلوغ میشه.
> ...


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

----------


## N30TheM4TRIX

سلام 
کسی نیست ادامه بده منم به خاطر برنامه نویسی شبکه با ترد ها سروکار دارم اما چیز زیادی نمی دونم گفتم این تاپیک کمکم می کنه که ظاهراً اینم مثل بقیه به فنا رفت!
سوالی که داشتم این بود که چطوری یک کامپوننت بسازم که برای کار با تردها باشه
یعنی کارهای مورد نظرمو(که توی برنامه هام تکراری هستن البته بیشتر اوقات) توسط متدها و پروپرتی های کامپوننت اجرا کنم؟

----------


## سعید صابری

> سلام 
> کسی نیست ادامه بده منم به خاطر برنامه نویسی شبکه با ترد ها سروکار دارم اما چیز زیادی نمی دونم گفتم این تاپیک کمکم می کنه که ظاهراً اینم مثل بقیه به فنا رفت!
> سوالی که داشتم این بود که چطوری یک کامپوننت بسازم که برای کار با تردها باشه
> یعنی کارهای مورد نظرمو(که توی برنامه هام تکراری هستن البته بیشتر اوقات) توسط متدها و پروپرتی های کامپوننت اجرا کنم؟


  JVthread  از مجموعه JVCL بصورت رایگان موجود هست

----------


## N30TheM4TRIX

> خسته نباشی!؟؟؟
> از نرم افزار رفتی تو سخت افزار؟
> ما اون مطالب رو در ارتباط با ترد عرض کردیم خدمتان.
> مطمئن نیستم اما تا اونجایی که میدونم در مورد مادربردهای مالتی cpu آخر کار یه جایی پردازش میره داخل صف قرار میگیره اون همون حافظه مشترک بین cpu هاست که از اون برای ایجاد همزمانی استفاده میشه.


سلام 
من چیز زیادی در این باره نمی دونم اما ظاهراً حق با آقای  بود .
من امروز اتفاقی به این مطلب برخوردم امید وارم مفید باشه.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
هایپرتردینگ یا فراریسمان‌بندی (به انگلیسی: Hyper Threading یا به  اختصار HT یا HTT) نام فناوری «چندریسمانی همزمان» پیاده سازی شده در پردازنده‌های Atom، core i۳/i۵/i۷، Itanium، Pentium ۴، Xeon کمپانی اینتل است.
 چندریسمان‌بندی یا مولتی تردینگ (MultiThreading) به معنی توانایی تقسیم  یک پردازش به بخش‌های کوچک تر (که به «ترد» یا رشته معروف هستند) و انجام  آنها به صورت همزمان است. در این صورت سرعت اجرای یک پروسه افزایش می‌یابد.
 مولتی تردینگ همزمان (Simultaneous multithreading -SMT) تکنیکی برای  افزایش بازدهی کلی پردازنده‌هایی که بیش از یک دستورعمل را همزمان اجرا  می‌کنند (که به superscalar معروف هستند) همراه با «مولتی تردینگ سخت  افزاری» است. این فناوری به ترد‌های مستقل اجازه می‌دهد که از منابعی که در  طراحی پردازنده در اختیار آنها قرار داده شده‌است، بهتر استفاده کنند.}
 هایپرتردینگ یک فناوری اختصاصی کمپانی اینتل است که برای بهبود «موازی  کاری پردازشات» (انجام چند دستورعمل به طور همزمان) در پردازنده به کار  رفته‌است. با این فناوری، برای هر هسته پردازشی (هسته‌های واقعی) سیستم عامل  به دو هستهٔ مجازی ادرس دهی می‌کند و در هنگامی که امکان داشته باشد حجم  کار را بین آنها تقسیم می‌کند. برای این فناوری نه تنها لازم است که سیستم  عامل از چند پردازنده پشتیبانی کند بلکه باید برای آن بهینه سازی شده باشد؛  و شرکت اینتل توصیه می‌کند که در صورتی که از سیستم عاملی استفاده می‌کنید  که هایپرتردینگ را پشتیبانی نمی‌کند، این فناوری را غیر فعال کنید.
 هایپرتردینگ به وسیلهٔ دوبل کردن قسمت‌های از پردازنده (قسمت‌هایی حالت  یک پروسه را ذخیره می‌کنند) عمل می‌کند. به این ترتیب یک پردازنده با این  فناوری می‌تواند به صورت دو پردازنده منطقی به سیستم عامل میزبان شناسانده  شود و سیستم عامل به طور همزمان دو رشته عملیاتی را برای آنها زمان بندی  کند. هنگامی که منابع پردازشی توسط یک پردازنده استفاده نمی‌شود و مخصوصا  هنگامی که پردزنده (به دلایل مختلف) معلق شده‌است، یک پردازنده مجهز به این  فناوری قادر است از این منابع پردازشی برای اجرای پروسه‌های زمان بندی  شدهٔ دیگر استفاده کند. برای استفاده از مزایای هایپرتردینگ بایستی سیستم  عامل از «چند پردازشی متقارن» یا «مولتی پراسسینگ متقارن»  (Symmetric MultiPricessing - SMP) پشتیبانی کند. {مولتی پراسسینگ به معنی  سیستمی با بیش از یک پردازنده (حال پردازنده‌ها یا هسته‌هایی متقارن یا  نامتقارن) است که مشترکا به یک حافظه اصلی ارتباط دارند و توسط یک سیستم عامل کنترل می‌شوند. اکثرا سیستم‌های چند پردازنده‌ای یا چند هسته‌ای امروزی دارای یک معماری مولتی پراسسینگ متقارن هستند.}




منبعhttp://fa.wikipedia.org/wiki/%D9%87%...8C%D9%86%DA%AF


*از دوستان و اساتید خواهش دارم ادامه بدن.*
با تشکر.

----------


## joker

حالا که بحث به اینجا کشیده برام سوال شده چطور در cpu های بیش از یک هسته یا سیستم هایی با بیش از یک cpu چطوری تقسیم کار برای پردازشهای سنگین انجام میگیره؟
آیا خود cpu این تقسیم بندی و انجام وظیفه پردازش را به دیگر cpu ها میده یا موقع برنامه نویسی نکات خاصی برای این موضوع هست که باید رعایت بشه؟

----------


## Felony

> آیا خود cpu این تقسیم بندی و انجام وظیفه پردازش را به دیگر cpu ها میده یا موقع برنامه نویسی نکات خاصی برای این موضوع هست که باید رعایت بشه؟


اصولا در سطح پائین ( هسته سیستم عامل ) باید موارد خاصی رعایت بشه ولی در برنامه نویسی سطح بالا نیازی نیست نکته خاصی رعایت بشه ، سیستم عامل این توزیع پردازش رو به صورت خودکار مدیریت میکنه ؛ البته یکسری موارد استثنا وجو دارند که برنامه نویس مجبور میشه با جزئیات این پروسه تعامل داشته باشه ، مثل برنامه نویسی سیستم های توزیع شده یا برنامه های پردازش موازی ( Parallel Processing ) که Performance در اون ها اهمیت ویژه ای داره و برنامه نویس بسته به نوع کار و الگوریتم های به کار رفته ممکنه نیاز داشته باشه توزیع پردازش رو به روش خاصی بین هسته ها و پردازنده ها انجام بده .

پیشنهاد میکنم سری به فصل اول کتاب Fundamentals Of Parallel Processing نوشته Harry Jordan بزنید .

----------


## tdkhakpur

> سلام 
> من چیز زیادی در این باره نمی دونم اما ظاهراً حق با آقای بود .
> من امروز اتفاقی به این مطلب برخوردم امید وارم مفید باشه.
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> هایپرتردینگ یک فناوری اختصاصی کمپانی اینتل است که برای بهبود «موازی  کاری پردازشات» (انجام چند دستورعمل به طور همزمان) در پردازنده به کار  رفته‌است. با این فناوری، برای هر هسته پردازشی (هسته‌های واقعی) سیستم عامل  به دو هستهٔ مجازی ادرس دهی می‌کند و در هنگامی که امکان داشته باشد حجم  کار را بین آنها تقسیم می‌کند. برای این فناوری نه تنها لازم است که سیستم  عامل از چند پردازنده پشتیبانی کند بلکه باید برای آن بهینه سازی شده باشد؛  و شرکت اینتل توصیه می‌کند که در صورتی که از سیستم عاملی استفاده می‌کنید  که هایپرتردینگ را پشتیبانی نمی‌کند، این فناوری را غیر فعال کنید.
>  هایپرتردینگ به وسیلهٔ دوبل کردن قسمت‌های از پردازنده (قسمت‌هایی حالت  یک پروسه را ذخیره می‌کنند) عمل می‌کند. به این ترتیب یک پردازنده با این  فناوری می‌تواند به صورت دو پردازنده منطقی به سیستم عامل میزبان شناسانده  شود و سیستم عامل به طور همزمان دو رشته عملیاتی را برای آنها زمان بندی  کند. هنگامی که منابع پردازشی توسط یک پردازنده استفاده نمی‌شود و مخصوصا  هنگامی که پردزنده (به دلایل مختلف) معلق شده‌است، یک پردازنده مجهز به این  فناوری قادر است از این منابع پردازشی برای اجرای پروسه‌های زمان بندی  شدهٔ دیگر استفاده کند. برای استفاده از مزایای هایپرتردینگ بایستی سیستم  عامل از «چند پردازشی متقارن» یا «مولتی پراسسینگ متقارن»  (Symmetric MultiPricessing - SMP) پشتیبانی کند. {مولتی پراسسینگ به معنی  سیستمی با بیش از یک پردازنده (حال پردازنده‌ها یا هسته‌هایی متقارن یا  نامتقارن) است که مشترکا به یک حافظه اصلی ارتباط دارند و توسط یک سیستم عامل کنترل می‌شوند. اکثرا سیستم‌های چند پردازنده‌ای یا چند هسته‌ای امروزی دارای یک معماری مولتی پراسسینگ متقارن هستند.}
> منبعhttp://fa.wikipedia.org/wiki/%D9%87%...8C%D9%86%DA%AF
> *از دوستان و اساتید خواهش دارم ادامه بدن.*
> با تشکر.


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

----------


## hp1361

سلام

به دوستان استاد پیشنهاد می کنم روند آموزش رو با ارائه ی یک مثال ادامه بدن.تا قبل از بروز حواشی بحث خوب پیش رفته بود.

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

ممنون

----------


## بهروز عباسی

درود به همه
قرار بود این آموزش رو ادامه بدم اما متاسفانه دوباره مشکلات کاری باعث شد حسابی سرم شلوغ بشه
باخودم گفتم این چند صفحه رو تایپ کنم تا دوستانی که ازه کاربا Thread هارو شروع کرده (یا دوست دارن یاد بگیرن) از این تاپیک استفاده ای کرده باشند)

From Events to Threads.rar
*منبع این مطالب کتاب mastering delphi7 ترجمه فرهاد قلی زاده نوری می باشد.*

*لطفاً دوستانی که می تونن آموزش رو ادامه بدن.*
موفق باشید

----------

