آدرس دهی کلمه ای حافظه (word addressing)
در معماری کامپیوتر، آدرس دهی کلمه ای به این معنی است که آدرس های حافظه در یک کامپیوتر به طور منحصر به فرد کلمات حافظه را مشخص می کند. معمولاً در مقابل این روش آدرس دهی بایتی استفاده می شود ، جایی که آدرس ها به طور منحصر به فرد بایت ها را شناسایی می کنند. تقریباً تمام معماریهای رایانهای مدرن از آدرسدهی به صورت بایت استفاده میکنند و آدرسدهی کلمه عمدتاً تنها از منظر تاریخی بررسی می شود. رایانه ای که از آدرس دهی کلمه استفاده می کند، گاهی اوقات ماشین کلمه نامیده می شود.
مبانی و مفاهیم پایه[ویرایش]
کامپیوتری را در نظر بگیرید که می تواند 524،288 (2 19) بیت حافظه را فراهم کند. اگر آن حافظه با استفاده از بایتهای 8 بیتی در یک فضای آدرس مسطح آدرسدهی بایتی، با استفاده از بایتهای 8 بیتی مرتب شده باشد، آنگاه 65536 (2 16 ) آدرس معتبر، از 0 تا 65،535 وجود دارد که هر یک نشاندهنده 8 بیت حافظه مستقل است. اگر در عوض در یک فضای آدرس مسطح قابل آدرس دهی کلمه با استفاده از کلمات 32 بیتی مرتب شده باشد، 16384 (2 14 ) آدرس معتبر از 0 تا 16383 وجود دارد که هر کدام نشان دهنده 32 بیت مستقل است.
به طور کلی، حداقل واحد آدرس پذیر در رم (MAU: Minimum Addressable Unit) یک ویژگی خاص از حافظه است. انتزاع های مختلف در یک کامپیوتر ممکن است از MAU های متفاوتی استفاده کنند، حتی زمانی که آنها یک حافظه اصلی را نشان می دهند. به عنوان مثال، ممکن است یک کامپیوتر برای مجموعه دستورالعمل ها instruction set خود از آدرس های 32 بیتی استفاده کند، اما سیستم انسجام حافظه پنهان(cache coherence) CPU ممکن است با حافظه تنها با ریزدانگی(granularity) 64 بایت خطوط کش(cache lines)کار کند، که اجازه می دهد هر یک از خطوط کش با تنها یک آدرس 26 بیتی شناسایی شود و سربار حافظه نهان CPU کاهش یابد.
ترجمه آدرس که توسط حافظه مجازی(virtual memory) انجام شده است اغلب بر ساختار و عرض فضای آدرس تاثیر می گذارد، اما MAU را تغییر نمی دهد.
trade-off بین حداقل واحدهای آدرس پذیر مختلف[ویرایش]
تصمیم برای انتخاب اندازه حداقل واحد آدرس پذیر حافظه می تواند می تواند سخت باشد. استفاده از یک MAU بزرگتر اجازه می دهد تا همان مقدار حافظه را با یک آدرس کوچکتر آدرس دهی شود، که می تواند به میزان قابل توجهی نیازهای یک برنامه به حافظه را کاهش دهد. با این حال، استفاده از یک MAU کوچکتر، باعث آسانتر و بهینه تر شدن کار با داده های کوچک می شود.
فرض کنید برنامه ای می خواهد یکی از 12 نشانه سنتی طالع بینی غربی را ذخیره کند . یک علامت واحد را می توان در 4 بیت ذخیره کرد. اگر یک علامت در حداقل واحد آدرس پذیر خود ذخیره شود، اگر از آدرس دهی بایت استفاده شود 4 بیت استفاده نخواهد شد و 50% بازده خواهیم داشت، در حالی که در آدرس دهی کلمه 32 بیتی 28 بیت استفاده نخواهد شد و 12.5% بازده خواهیم داشت. اگر یک علامت در مینیمم واحد آدرس پذیر MAU با داده های دیگر "بسته بندی" شود، آنگاه ممکن است هزینه خواندن و نوشتن در حافظه به نسبت افزایش یابد. برای مثال، برای نوشتن یک علامت جدید در MAU که داده ی دیگری نیز در آن بسته بندی شده، کامپیوتر ابتدا باید مقدار فعلی داخل MAU را خوانده و تنها بیت های مناسب را بازنویسی کند و در نهایت مقدار جدید را مجددا ذخیره کند. در صورتی که برنامه نیاز داشته باشد تا به نخ (thread) های مختلف اجازه دهد تا داده های دیگر داخل MAU را به طور همزمان تغییر دهد این عملیات بسیار هزینه بر خواهد بود.
مثال رایج تر، رشته ای از متن است . فرمت های رایج برای ذخیره رشته ها مانند UTF-8 و ASCII رشته ها را به صورت دنباله ای از کد پوینت های 8 بیتی ذخیره می کنند. با آدرس دهی به صورت بایت، هر کد می تواند در MAU با آدرس دهی مستقل خود بدون هیچ سرباری ذخیره شود. با آدرس دهی کلمه ای 32 بیتی و قرار دادن هر کد پوینت داخل یک MAU جداگانه باعث افزایش استفاده از حافظه به میزان 300% می شود که برای برنامه هایی که با رشته های بزرگ کار میکنند مناسب و قابل اجرا نیست. دسته بندی کد های مجاور درون یک کلمه حافظه باعث جلوگیری از این هزینه می شود، هر چند الگوریتم های زیادی برای کار با رشته ها ترجیح می دهند تا بتوانند آدرس های مستقل برای کد ها در نظر بگیرند. برای اینکه این کار را بتوان با کد های دسته بندی شده انجام داد الگوریتم باید از یک آدرس "wide" یا گسترده یا عریض استفاده کند که همچنین آفست یا محل کاراکتر در کلمه حافظه را مشخص میکند. اگر قرار باشد این آدرس گسترده در جایی در حافظه برنامه ذخیره شود ممکن است به حافظه بیشتری نسبت به آدرس های معمولی نیاز داشته باشد.
برای ارزیابی تاثیر این روش ها در یک برنامه کامل، یک مرورگر را در نظر بگیرید که صفحه ای بزرگ و پیچیده را نمایش می دهد. برخی از قسمت های حافظه مرورگر برای ذخیره داده های ساده مانند عکس ها و یا متون استفاده می شود، مرورگر غالبا میخواهد که این داده ها به شکل بهینه ترین حالت ممکن ذخیره شوند، و در نتیجه تقریبا به همان مقدار داده حافظه اشغال شود بدون اینکه به اندازه MAU توجهی شود. قسمت دیگر حافظه برای ذخیره اشیا مختلف صفحه در مرورگر می باشد، و این اشیا شامل تعداد زیادی ارجاع هستند که این ارجاع ها می توانند به اشیا دیگر صفحه، متون و عکس ها و ... باشند. مقدار حافظه مورد نیاز برای ذخیره این اشیا بستگی زیادی به عرض آدرس کامپیوتر دارد.
فرض کنید اگر تمام آدرس های برنامه 32 بیتی بود، این صفحه وب حدود 10 گیگابایت حافظه اشغال می کرد.
- اگر مرورگر روی یک کامپیوتر با آدرس های 32 بیتی و حافظه آدرس پذیر به صورت بایت در حال اجرا باشد، فضای آدرس 4 گیکابایت از حافظه را پوشش خواهد داد که کافی نمی باشد. مرورگر یا قادر نخواهد بود که صفحه را نمایش دهد یا باید برخی داده ها را به حافظه کندتر منتقل کند، که در نتیجه این کارایی و عملکرد آن کاهش می یابد.
- اگر مرورگر در یک کامپیوتر با حافظه آدرس پذیر به صورت بایت و آدرس های 64 بیتی در حال اجرا باشد، به طور قابل ملاحظه ای به حافظه ی بیشتری برای ذخیره آدرس ها نیاز خواهد داشت. به طور دقیق تر، سربار بستگی به این دارد که چه مقدار از 10 گیگابایت داده به صورت داده های ساده و جه مقدار از آن به شکل اشیا (object) و رفرنس های متراکم می باشد، اما رقم 40 درصد غیر قابل قبول نیست وقتی در نهایت به 14 گیگابایت حافظه نیاز است. که البته این به خوبی در توانایی های فضای آدرس 64 بیتی است. اگر چه معمولا مرورگر وضعیت بدتری را نمایش می دهد و با فرض برابری منابع با گزینه های جایگزین، از حافظه نهان (cache) کامپیوتر استفاده بدتری می کند.
- اگر مرورگر روی یک کامپیوتر با آدرس های 32 بیتی و حافظه آدرس پذیر کلمه ای 32 بیتی باشد، به احتمال زیاد به دلیل دسته بندی های غیر بهینه و نیاز به تعدادی آدرس عریض "wide" به مقداری حافظه اضافی نیاز دارد. این کار به دلیل اینکه مرورگر برای اکثر کار ها از دسته بندی و آدرس های غیر عریض استفاده می کند و مرورگر به راحتی در محدوده آدرس پذیر حداکثر 16 گیگابایت قرار میگیرد تاثیر نسبتا کمی دارد. اگر چه ممکن است به دلیل استفاده گسترده از داده های بسته بندی شده برای عکس ها و متن سربار قابل توجی در زمان اجرا ایجاد شود. مهمتر از آن 16 گیگابایت محدودیت نسبتا کمی است و اگر صفحه مرورگر به طور قابل توجهی رشد کند، کاپیوتر فضای آدرس خود را تمام می کند و مشکلات مشابهی که در کامپیوتر های آدرس بایت داشتیم نمایان می شود.
- اگر مرورگر روی یک کامپیوتر با آدرس های 64 بیتی و حافظه آدرس پذیر کلمه ای 32 بیتی اجرا شود، از هر دو سربار زمان اجرا که در بالا گفته شد رنج خواهد برد: به طور قابل توجهی به حافظه بیشتری نیاز خواهد داشت تا آدرس ها 64 بیتی را ذخیره کند و در همین حال به دلیل کار با بسته بندی های بزرگ داده های عکس و متن باعث ایجاد سربار در زمان اجرا می شود. آدرس دهی کلمه ای به این معنی است که برنامه می تواند از نظر تئوری به جای 16 اگزابایت، 64 اگزابایت حافظه را آدرس دهی کند، هرچند به این دلیل که یک برنامه هیچ گاه نیاز به این مقدار حافظه ندارد (و در عمل هیچ کامپیوتری توانایی فراهم کردن آن را ندارد)، این ویژگی هیچ سودی ندارد.
بنابر این، آدرس دهی کلمه ای به کامپیوتر اجازه می دهد که به طور قابل ملاحظه ای میزان بیشتری از حافظه را آدرس دهی کند بدون اینکه عرض آدرس ها و درنتیحه آن میزان استفاده متناظر از حافظه افزایش یابد. هر چند این ویژگی تنها در محدوده نسبتا کوچکی از مجموعه اندازه کاری ارزشمند است و می تواند بسته به نرم افزار باعث سربار های قابل توجهی شود. برنامه هایی که به طور نسبی با کار های اندکی با داده هایی که به صورت بایت هستند مانند عکس، متن، فایل ها و ترافیک شبکه انجام می دهند می توانند بیشترین فایده را داشته باشند.
دسترسی های زیر کلمه و آدرس های گسترده[ویرایش]
برنامه ای که روی کامپیوتر در حال اجرا می باشد و از آدرس دهی کلمه ای استفاده می کند، همچنان می تواند با شبیه سازی دسترسی به واحد های کوجک تر، با واحد های کوچک تر حافظه کار کند. برای بارگذاری نیاز داریم کلمه را برداشته و سپس بیت های مورد نظر را استخراج کنیم. برای ذخیره نیز نیاز داریم کلمه را بارگذاری کنیم، مقادیر جدید را در آن قرار دهیم و پس از بازنویسی بیت های مورد نظر آن را مجددا در کلمه موجود در حافظه ذخیره کنیم.
فرض کنید چهار کد پوینت متوالی رشته با فرمت UTF-8 را میخواهیم در یک کلمه 32 بیتی دسته بندی کنیم. اولین کد ممکن است بیت های 0 تا 7، دومین کد 8 تا 15، سومین 16-23 و کد چهارم بین های 24-31 را اشغال کند. (اگر حافظه قابل آدرس دهی بایت بود، این یک ترتیب بایت انددی است. )
به منظور روشن شدن واضح کد لازم برای دسترسی به زیر کلمه بدون اینکه مثال را خیلی مشابه معماری آدرس دهی کلمه ای خاصی در نظر بگیریم، مثال های زیر از اسمبلی MIPS استفاده می کنند. در واقعیت MIPS یک معماری آردس دهی بایتی با پشتیبانی مستقیم از بارگذاری و ذخیره سازی مقادیر 8 و 16 بیتی است، اما مثال وانمود می کند که تنها از بارگذاری و ذخیره 32-بیتی که در یک کلمه 32 بیتی است باید جدا از یک آدرس ذخیره شود. معماری MIPS انتخاب شده است به دلیل اینکه یک زبان اسمبلی ساده و بدون امکانات تخخصی است که باعث راحت تر شدن این عملیات میشود.
فرض کنید یک برنامه میخواهد سومین کد را در ثبات r1 از کلمه ای داخل آدرسی در ثبات r2 بخواند. با در نظر گرفتن عدم وجود پشتیبانی از مجموعه دستورالعمل ها (instruction set)، برنامه باید تمام کلمه را بارگذاری کند، 16 بار شیفت به راست انجام دهد تا دو کد ابتدا را حذف کند و سپس کد چهارم را پنهان کند.
ldw $r1, 0($r2) # Load the full word srl $r1, $r1, 16 # Shift right by 16 andi $r1, $r1, 0xFF # Mask off other code points
اگر آفست به طور ایستا (استاتیک) مشخص نباشد، اما در عوض یک بیت-آفست در ثبات r3 ذخیره شده باشد، رویکرد کمی پیچیده تر نیاز است.
ldw $r1, 0($r2) # Load the full word srlv $r1, $r1, $r3 # Shift right by the bit offset andi $r1, $r1, 0xFF # Mask off other code points
فرض کنید بجای آن برنامه می خواهد کد پوینت داخل رجیستر r1 به سومین کد پوینت داخل کلمه در رجیستر r2 قرار دهد. با در نظر گرفتن عدم پشتیبانی از مجموعه دستورالعمل ها (instruction set)، برنامه باید تمام کلمه را بارگذاری کند، مقدار قدیمی آن کد پوینت را پنهان کند، مقدار جدید را در محل مورد نظر تغییر دهد و پس از ادغام کردن مقادیر، تمام کلمه را دوباره ذخیره کند.
sll $r1, $r1, 16 # Shift the new value left by 16 lhi $r5, 0x00FF # Construct a constant mask to select the third byte nor $r5, $r5, $zero # Flip the mask so that it clears the third byte ldw $r4, 0($r2) # Load the full word and $r4, $r5, $r4 # Clear the third byte from the word or $r4, $r4, $r1 # Merge the new value into the word stw $r4, 0($r2) # Store the result as the full word
مجددا، اگر افست به جای آن در ثبات r3
ذخیره شود، رویکرد پیچیده تری مورد نیاز است:
sllv $r1, $r1, $r3 # Shift the new value left by the bit offset llo $r5, 0x00FF # Construct a constant mask to select a byte sllv $r5, $r5, $r3 # Shift the mask left by the bit offset nor $r5, $r5, $zero # Flip the mask so that it clears the selected byte ldw $r4, 0($r2) # Load the full word and $r4, $r5, $r4 # Clear the selected byte from the word or $r4, $r4, $r1 # Merge the new value into the word stw $r4, 0($r2) # Store the result as the full word
این دنباله کد فرض می کند که یک نخ (thread) دیگر نمی تواند بایت های دیگر داخل کلمه را همزمان تغییر دهد. اگر تغییرات همزمان ممکن بود، آنگاه ممکن بود یکی از تغییرات صورت نگیرد. برای حل این مشکل، چند دستورالعمل آخر باید به یک حلقه مقایسه-تبدیل تجزیه ناپذیر (atomic) تبدیل شوند تا یک تغییر همزمان به راحتی باعث شود تا عملیات با مقادیر جدید تکرار شود. در این مورد هیج مانعی برای حافظه لازم نیست.
به یک جفت آدرس کلمه و یک آفست درون کلمه آدرس عریض یا گستره (wide - همچنین fat address یا fat pointer) گفته می شود. (این را نباید با دیگر کاربرد های آدرس های عریض برای ذخیره سازی انواع مختلف داده های تکمیلی مانند کران های یک آرایه اشتباه گرفت.) آفست ذخیره شده ممکن است یک بیت-آفست یا بایت-آفست باشد. دنباله کد های بالا از این مورد که آفست به صورت بیت ذخیره می شود سود می برند، زیرا از آن به عنوان تعداد شیفت استفاده میکنند. یک معماری با پشتیبانی مسقتیم برای انتخاب بایت، ممکن است ترجیح دهد تا فقط یک بایت آفست ذخیره کند.
در این دنباله های کد، آفست اضافی باید در کنار آدرس پایه ذخیره شود که در نتیحه آن عملا نیاز های کلی ذخیره سازی آدرس را دو برابر می کند. این همیشه در رابطه با ماشین های کلمه ای صادق نیست، عمدتا برای این که خود آدرس ها در کنار دیگر داده ها بسته بندی نمی شوند تا دسترسی به آن ها کارآمدتر باشد. برای مثال، Cray X1 از کلمات 64 بیتی استفاده می کند، اما آدرس ها تنها 32 بیت هستند. هنگامی که یک آدرس در حافظه ذخیره می شود، در کلمه مربوط به خودش ذخیره می شود و در نتیحه آفست بایت می تواند در 32 بیت با ارزش تر کلمه قرار گیرد. ناکارآمدی استفاده از آدرس های عریض در این سیستم تنها منطق اضافی برای دستکاری این آفست و استخراج و درج بایت ها داخل کلمات است و تاثیری در استفاده از حافظه ندارد.
مفاهیم مرتبط[ویرایش]
حداقل واحد قابل آدرس دهی در کامپیوتر لزوما با حداقل اندازه دسترسی به رم در مجموعه ی دستورالعمل های کامپیوتر یکی نیست. برای مثال یک کامپیوتر ممکن است از آدرس دهی بایت بدون اینکه هیچ دستوری برای خواندن و نوشتن روی یک بایت ارائه شود استفاده کند. از برنامه ها انتظار می رود که آن عملیات را به صورت نرم افزاری با تغییر دادن بیت ها انجام دهند، مانند دنباله کد هایی که در بالا آورده شد. این کار در کامپیوتر ها با معماری 64 بیتی که به عنوان جانشین ابر کامپیوتر ها یا مینی کامپیوتر های 32 هستند، مانند DEC Alpha و Cray X1 نسبتا رایج است.
استاندارد C بیان می کند که از یک اشاره گر انتظار می رود که نمایش معمول یک آدرس را در خود داشته باشد. C همپنین به یک اشاره گر اجازه می دهد که برای هر شی یا آبجکتی به جز یک فیلد بیت ایجاد شود. این شامل هر هر عنصر مجزا از آرایه ای از بایت ها می شود. کامپایلر های سی در کامپیوتر هایی که از آدرس دهی کلمه ای استفاده می کنند معمولا از نمایش های متفاوتی برای اشاره گر ها بسته به اندازه نوع آنها استفاده می کنند. یک اشاره گر به یک نوع داده که به اندازه کافی برای قرار گیری در یک کلمه بزرگ است به شکل یک آدرس ساده می باشد، در حالی که یک اشاره گر مانند char* یا void* یک آدرس عریض خواهد بود: یک جفت آدرس از یک کلمه و آفست یک بایت داخل آن کلمه. بنابراین، تبدیل میان انواع متخلف اشاره گر ها عملیات ساده ای نخواهد بود و ممکن است در صورت اشتباه انجام شدن آن، داده ها از بین بروند.
به دلیل اینکه اندازه یک struct در سی همواره موقع تصمیم گیری برای نمایش یک اشاره گر به آن struct مشخص نیست، نمی توان به طور قابل اعتمادی قوانین بالا را اعمال کرد. ممکن است کامپایلر ها نیاز داشته باشند که محل شروع یک struct را مشخص و تراز کنند تا بتوان از نمایش های کارا تری برای اشاره گر استفاده کنند.
مثال ها[ویرایش]
- ERA 1103 از آدرس دهی کلمه ای با کلمات 36-بیتی استفاده میکند. تنها آدرس های 0 تا 1023 به حافظه رم ارجاع می کنند، دیگر آدرس یا به حایی اشاره نمی کنند و یا برای ارجاع به حافظه drum استفاده می شود.
- PDP-10 از آدرس دهی کلمه ای با کلمات 36-بیتی استفاده و آدرس های 18 بیتی استفاده می کرد.
- اغلب ابر کامپیوتر های Cray بین سال های 1980 و 1990 از آدرس دهی کلمه ای با کلمات 64 بیتی استفاده می کردند. ابر کامپیوتر های Cray-1 و Cray X-MP از آدرس های 24 بیتی استفاده می کردند در حالی که اغلب دیگر ابر کامپیوتر ها آدرس های 32 بیتی استفاده می کردند.
- Cray X1 از ادرس دهی بایت با آدرس های 64 بیتی استفاده می کرد. این کامپیوتر به طور مستقیم از دسترسی به حافظه با کمتر از 64 بیت پشتیبانی نمی کرد، و دسترسی های این گونه باید به طور نرم افزاری شبیه سازی می شود. کامپایلر C برای X1 اولین کامپایلر Cray بود که از شبیه سازی برای دسترسی 16 بیتی به حافظه استفاده می کرد[۱].
- DEC Alpha از آدرس دهی بایت با آدرس های 64 بیتی استفاده می کرد. پردازنده های اولیه Alpha از دسترسی مستقیم 16 بیتی و 8 بیتی برای حافظه پشتیبانی نمی کردند و برای مثال نرم افزار ها نیاز داشتند تا یک بایت را با بارگذاری تمام 64 بیت کلمه و سپس استخراج آن یک بایت بارگذاری کنند. به دلیل اینکه Alpha از آدرس دهی بایت استفاده می کند، این آفست همچنان در کم ارزش ترین بیت های آدرس مشخص می شود (به حای اینکه به طور جداگانه به شکل آدرس عریض یا wide باشد)، و Alpha به راحتی از دستور های العمل های بدون تراز بارگذاری و ذخیره مانند (
ldq_u
وstq_u
) با نادیده گرفتن آن بیت ها و بارگذاری و ذخیره سازی کلمه تراز شده، فراهم می کند[۲]. با شروع از Alpha 21164a[۳] افزونه های بایت-کلمه بعدی به معماری (BWX: byte-word extensions) بارگذاری و ذخیره سازی های 8 و 16 بیتی را اضافه کرد. اضافه کردن مجدد این افزونه بدون ایجاد ناسازگاری های جدی ممکن بود زیرا Alpha همواره از آدرس دهی بایت استفاده میکرد.
همچنین ببینید[ویرایش]
منابع[ویرایش]
- ↑ Terry Greyzck, Cray Inc. Cray X1 Compiler Challenges (And How We Solved Them)
- ↑ "The Alpha AXP, part 8: Memory access, storing bytes and words and unaligned data". 16 August 2017.صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
- ↑ "Alpha: The History in Facts and Comments - Alpha 21164 (EV5, EV56) and 21164PC (PCA56, PCA57)".صفحه پودمان:Citation/CS1/en/styles.css محتوایی ندارد.
This article "آدرس دهی کلمه ای حافظه (word addressing)" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:آدرس دهی کلمه ای حافظه (word addressing). Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.