Почетна » како да » Колико меморијских адреса може да РАМ у мом рачунару држи?

    Колико меморијских адреса може да РАМ у мом рачунару држи?

    Једнога дана је забавно гледати на површински ниво искуства на рачунару, а други дан је забавно прећи право у унутрашње функционисање. Данас ћемо погледати структуру рачуналне меморије и колико ствари можете упаковати у штап РАМ-а.

    Данашња сесија питања и одговора долази нам захваљујући СуперУсер-у - подјела Стацк Екцханге-а, груписане од стране заједнице веб-локација за питања и одговоре.

    Питање

    Читач СуперУсер Јохан Смохан се хвата у коштац с начином на који тип процесора и величина меморије раде заједно како би добили укупан број адреса. Пише:

    Колико меморијских адреса можемо добити са 32-битним процесором и 1ГБ рамом и колико са 64-битним процесором?

    Мислим да је то нешто овако:

    1ГБ рам подељен са 32 битна 4 бита (?) Да би се добио број меморијских адреса?

    Читао сам на Википедији да је 1 меморијска адреса 32 бита широка или 4 октета (1 октет = 8 бита), у поређењу са 64-битним процесором где је 1 меморијска адреса или 1 цео број 64 бита или 8 октета. Али не знам ни да ли сам исправно схватио.

    То су врсте питања која могу задржати знатижељног штребера ноћу. Колико је адреса доступно под сваком од Јоханових хипотетичких система?

    Одговор

    Доприносник СуперУсер-а Гроностај нуди увид у начин на који се РАМ дели и користи:

    Кратак одговор: Број доступних адреса је једнак броју мањих:

    • Величина меморије у бајтовима
    • Највећи непотписани интегер који се може сачувати у машинској речи ЦПУ-а

    Дуг одговор и објашњење горе наведеног:

    Меморија се састоји од бајтова (Б). Сваки бајт се састоји од 8 бита (б).

    1 Б = 8 б 

    1 ГБ РАМ-а је заправо 1 ГиБ (гибибит, а не гигабајт). Разлика је:

    1 ГБ = 10 ^ 9 Б = 1 000 000 000 Б 1 ГиБ = 2 ^ 30 Б = 1 073 741 824 Б 

    Сваки бајт меморије има своју адресу, без обзира на величину ЦПУ машине. На пример. Интел 8086 ЦПУ је био 16-битни и бавио се меморијом по бајтовима, као и модерни 32-битни и 64-битни процесори. То је узрок првог ограничења - не можете имати више адреса него бајтова меморије.

    Адреса меморије је само број бајтова које ЦПУ мора прескочити од почетка меморије да би дошао до онога што тражи.

    • Да бисте приступили првом бајту, морате прескочити 0 бајта, тако да је прва адреса бајта 0.
    • Да бисте приступили другом бајту, морате прескочити 1 бајт, тако да је његова адреса 1.
    • (и тако даље… )
    • Да бисте приступили последњем бајту, ЦПУ прескаче 1073741823 бајтова, тако да је његова адреса 1073741823.

    Сада морате знати шта 32-битни заправо значи. Као што сам већ поменуо, то је величина машинске речи.

    Машинска реч је количина меморије коју ЦПУ користи за држање бројева (у РАМ-у, кешу или интерним регистрима). 32-битни ЦПУ користи 32 бита (4 бајта) за држање бројева. Меморијске адресе су и бројеви, тако да се на 32-битном ЦПУ меморијска адреса састоји од 32 бита.

    Сада размислите о овоме: ако имате један бит, на њему можете сачувати двије вриједности: 0 или 1. Додајте још једну бит и имате четири вриједности: 0, 1, 2, 3. На три бита можете сачувати осам вриједности : 0, 1, 2… 6, 7. Ово је уствари бинарни систем и функционише тако:

    Бинари Децимал 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111 

    Ради баш као и обично, али максимална цифра је 1, а не 9. Децимална 0 је 0000, онда додајете 1 и добијате 0001, додајте још једном и имате 0010. Оно што се овде догодило је као са децималом 09 и додавање једног: промените 9 на 0 и увећајте следећу цифру.

    Из горе наведеног примера можете видети да увек постоји максимална вредност коју можете задржати у броју са константним бројем битова - јер када су сви битови 1 и покушате да повећате вредност за 1, сви битови ће постати 0, чиме ће се разбити број. Зове се целобројни оверфлов и изазива многе неугодне проблеме, како за кориснике тако и за програмере.

     11111111 = 255 + 1 ----------- 100000000 = 0 (9 бита овде, тако да је 1 обрезан) 
    • За 1 бит највећа вриједност је 1,
    • 2 бита - 3,
    • 3 бита - 7,
    • 4 бита - 15

    Највећи могући број је увијек 2 ^ Н-1, гдје је Н број битова. Као што сам већ рекао, меморијска адреса је број и такође има максималну вредност. Због тога је величина машинске речи такође ограничење за број доступних меморијских адреса - понекад ваш ЦПУ једноставно не може да обради бројеве довољно велике да би адресирали више меморије.

    Дакле, на 32 бита можете држати бројеве од 0 до 2 ^ 32-1, а то је 4 294 967 295. То је више од највеће адресе у 1 ГБ РАМ-а, тако да ће у вашем специфичном случају количина РАМ-а бити ограничавајући фактор.

    РАМ ограничење за 32-битни ЦПУ је теоријски 4 ГБ (2 ^ 32), а за 64-битни ЦПУ 16 ЕБ (ексабајта, 1 ЕБ = 2 ^ 30 ГБ). Другим речима, 64-битни ЦПУ може да адресира цео Интернет ... 200 пута;) (процењује ВолфрамАлпха).

    Међутим, у реалним оперативним системима 32-битни ЦПУ-ови могу адресирати око 3 ГБ РАМ-а. То је због интерне архитектуре оперативног система - неке адресе су резервисане за друге сврхе. Више о овој тзв. 3 ГБ баријери можете прочитати на Википедији. Можете да подигнете ово ограничење са Пхисицал Аддресс Ектенсион.

    Говорећи о адресирању меморије, треба споменути неколико ствари: Виртуелна меморијасегментација и пагинг.

    Виртуелна меморија

    Као што је @ Даниел Р Хицкс истакао у другом одговору, оперативни системи користе виртуалну меморију. То значи да апликације заправо не раде на стварним адресама меморије, већ на онима које обезбеђује ОС.

    Ова техника омогућава оперативном систему да премести неке податке из РАМ-а у такозвани Пагефиле (Виндовс) или Свап (* НИКС). ХДД је мало већи од РАМ-а, али то није озбиљан проблем за ретко приступане податке и омогућава ОС-у да пружи апликацијама више РАМ-а него што сте заправо инсталирали..

    Пагинг

    Оно о чему смо до сада говорили се зове схема равног адресирања.

    Пагинг је алтернативна шема адресирања која омогућава адресирање више меморије коју иначе можете са једном машином речи у равном моделу.

    Замислите књигу испуњену словима од 4 слова. Рецимо да на свакој страници има 1024 броја. Да бисте адресирали број, морате знати две ствари:

    • Број странице на којој се та ријеч исписује.
    • Која реч на тој страници је она коју тражите.

    То је управо начин на који модерни к86 процесори управљају меморијом. Подијељена је на 4 КиБ странице (1024 стројне ријечи свака) и те странице имају бројеве. (уствари странице могу бити 4 МиБ велике или 2 МиБ са ПАЕ). Када желите да се обратите меморијској ћелији, потребан вам је број странице и адреса на тој страници. Имајте на уму да је свака меморијска ћелија референцирана тачно једним паром бројева, што неће бити случај за сегментацију.

    Сегментација

    Па, ова је прилично слична пејџингу. Коришћен је у Интел 8086, само да наведемо један пример. Групе адреса се сада зову сегменти меморије, а не странице. Разлика је у томе што се сегменти могу преклапати и они се много преклапају. На пример, на 8086 већини меморијских ћелија је било доступно из 4096 различитих сегмената.

    Пример:

    Рецимо да имамо 8 бајтова меморије, сви држе нуле осим за 4. бајт који је једнак 255.

    Илустрација за модел равне меморије:

     _____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | ----- 

    Илустрација за меморисану страницу са 4-бајт странице:

     ПАГЕ0 _____ | 0 | | 0 | | 0 | ПАГЕ1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- 

    Илустрација за сегментирану меморију са 4-бајтним сегментима помакнутим за 1:

     СЕГ 0 _____ СЕГ 1 | 0 | _____ СЕГ 2 | 0 | | 0 | _____ СЕГ 3 | 0 | | 0 | | 0 | _____ СЕГ 4 | 255 | | 255 | | 255 | | 255 | _____ СЕГ 5 ----- | 0 | | 0 | | 0 | | 0 | _____ СЕГ 6 ----- | 0 | | 0 | | 0 | | 0 | _____ СЕГ 7 ----- | 0 | | 0 | | 0 | | 0 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- ----- ----- ----- 

    Као што видите, четврти бајт се може адресирати на четири начина: (адресирање од 0)

    • Сегмент 0, офсет 3
    • Сегмент 1, оффсет 2
    • Сегмент 2, офсет 1
    • Сегмент 3, офсет 0

    Увек је иста меморијска ћелија.

    У реалном животу имплементације сегменти се померају за више од 1 бајта (за 8086 је 16 бајтова).

    Оно што је лоше у сегментацији је то што је компликовано (али мислим да то већ знате;) Оно што је добро, је да можете користити неке паметне технике за креирање модуларних програма.

    На пример, можете учитати неки модул у сегмент, а затим се претварати да је сегмент мањи него што стварно јесте (довољно мали да држи модул), а затим изаберите први сегмент који се не преклапа са тим псеудо-мањим и учитајте следећи модула, и тако даље. У суштини, оно што добијете на овај начин су странице варијабилне величине.


    Имате ли нешто да додате објашњењу? Звучи у коментарима. Желите ли прочитати више одговора од других технолошки паметних Стацк Екцханге корисника? Погледајте цео дискусију овде.