تو پست قبلی قرار شد درباره یکی از مشکلات branch predictor، سایکل و پایپلاین ها صحبت بنویسم.
این روزا شدیدا درگیر توسعه
Devchan هستم واسه همین خیلی وقت نمیکنم چیزی بنویسم 🙂
کد زیر رو در نظر بگیرید:
if(x < array_size)
{
value= array[x];
}
سی پی یو نمیخاد منتظر بمونه که نتیجه x < array_size بیاد برای همین نتیجه رو حدس میزنه (true) و وارد بدنه شرط میشه. اینجا عملا دیتای array[x] رو خونده.
حالا نتیجه اومد و دست بر قضا نتیجه false بوده. حالا سی پی یو فهمیده اشتباه کرده و دیتایی که خونده رو اصطلاحا
rollback میکنه.
اما معمولا همیشه همه چی صد در صد رول بک نمیشه، مخصوصا اثراتی که روی
Cache مونده. 🧹
اینجا مهاجم میتونه با
Cache timingattack میتونه به دیتا دسترسی داشته باشه.
سایکل ها (Cycles) ها توی سی پی یو مثل واحد زمانی عمل میکنن.
این سایکل ها مثل ضربان قلب یا ساعت کار میکنن. بهتر بگم هر سایکل از سی پی یو مثل یه تیک تیک ساعت میمونه. 🫀
سی پی یو باید کلی کار انجام بده و هر کدوم این کار ها مدتی زمان میبرن.
البته این به معنی نیست که هر کار = یه سایکل
بلکه هر کار میتونه چند سایکل طول بکشه.
مثلا اگر یه CPU داشته باشی که فرکانس اجراییش
3GHz باشه ینی
3,000,000,000 تا سایکل در یک ثانیه میزنه، که هر سایکل میشه تقریبا 0.33 نانوثانیه.⏰
اگر
پایپلاین نداشته باشیم سی پی یو مجبوره هر پروسه رو کامل انجام بده. ینی اگر مثلا دو تا پروسه P1 و P2 رو داریم.
اگر پایپلاین نباشه پردازنده فقط میتونه فقط اینستراکشن های P1 رو اجرا کنه و P2 باید منتظر بمونه.
پایپلاین کمک میکنه سی پی یو پروسه رو به چند مرحله تقسیم کنه و توی سایکل های مختلف پخشش میکنه تا اجرای پروسه ها همزمان باشه.
یکم تو هم تو هم نوشتم ولی خب :)