Направено со
ТАРАТУРцеемес
none
ПЕТАР.КОТЕВСКИ.НЕТ
Новости и Настани
Содржини
Идеи и Коментари
Други Интереси
За Мене
Линкови





ВНИМАНИЕ: Написите и коментарите кои се изразени на овој сајт се лични и не претставуваат мислења на која било од компаниите за кои работам (или сум работел во минатото) или кои ги претставувам (или сум ги претставувал во минатото). Програмскиот код и инструкциите дадени на овој вебсајт се понудени онакви какви што се. Не сум одговорен за никаква штета која е резултат на користење на каков било код виден на овој сајт или следење на инструкции прочитани овде.

Меморија и мемориска адреса

    Честитки ако издржавте низ филозофскиот муабет во првите два написа - некогаш и сам се изненадувам колку многу филозофирање е потребно за да се покријат неколку прости работи. И овој пат дискусијата е малку генерална, но сепак многу битна за да разбереме некои суштински работи без кои не е возможно човек да стане добар програмер.

Пред да почнете да го читате овој текст, мало предупредување
    Понапредните читатели можеби ќе се малку зачудени зошто објаснувам вакви (наводно) тривијални концепти. Еве зошто: Обично програмерите кои се самоуки (иако достигнуваат добри резултати) ги прескокнале „тривијалните„ детали, и најчесто го научиле она што го знаат преку т.н. trial-and-error метод. Тоа значи дека научиле експериментално програмирање - програмирање преку експеримент: смени ја некоја непозната и види што ќе се случи со нечија друга програма како резултат на промената. На тој начин се формира знаење кое јас го нарекувам лабораториско: тоа е како на пример да не сте прочитале никаков учебник по физика, но имате модерна лабораторија во која што можете да ги набљудувате физичките феномени, и да донесувате заклучоци врз основа на тоа што ќе го видите. На тој начин нема да дојдете до погрешни резултати, но на правилата и законите кои сами ќе си ги формулирате ќе им недостига теоретска структура која ќе ги сврзува сите во една целина. Затоа, иако повеќето од овие работи можеби ви се познати, прочитајте ги уште еднаш - ако за ништо друго тогаш барем здраво да ми се изнасмеете за сите инстанци каде што неуспешно се обидувам да ставам малку хумор во четивово.

Компјутерот како машина
    Прва и најбитна работа да се расчисти е фактот дека компјутерот е само машина. И како секоја друга машина, за да произведе некој корисен резултат (на пример сликата која ја гледате на екранот во овој момент), на компјутерот му се потребни некакви влезни податоци. Никоја машина не може да измисли нови податоци самата од себе, нити да ги толкува примените податоци на начин на кој не е програмирана. Дури и програмирањето претставува внесување на нови податоци - самата програма претставува обичен влезен податок, пред компјутерот да почне да ја извршува.
    Компјутерот не дискриминира помеѓу влезните податоци - за него тоа е еден обичен доток на бајти (Ако сте седнале да учите да програмирате, ќе претпоставиме дека имате идеја што се тоа бајти). Дури кога тој доток на бајти ќе се најде во компјутерот, тогаш компјутерот може бајтите да ги толкува на различни начини (како програма (дури и непознатите во самата програма), или слика, музика, видео или што било друго). Што значи за еден бајт да се најде „внатре„ во компјутерот? За тоа по неколку пасуси - ајде да разговараме за тоа на кој начин податоци можат да влезат во компјутерот.
    Податоците во компјутерот влегуваат најчесто преку хард дискот. Сите компјутери стартуваат празни, и првото нешто што се случува откако ќе го притиснете "power" копчето на вашиот компјутер е пристап до хард дискот, од каде компјутерот почнува да се полни со првобитни податоци (тоа е најчесто оперативниот систем - веројатно Windows). Оперативниот систем овозможува доток на податоци и од другите извори - на пример тастатурата. Преку тастатурата вие ќе ја внесувате вашата нова програма, и на тој начин ќе креирате нови податоци за компјутерот. Преку мишот* можете да внесувате визуелни податоци, на пример да цртате слика, или секаков вид на други податоци што се креираат преку кликнување на разни опции во некоја програма што манипулира со податоци. За да не одиме надолу по цела листа (што е голема и стално се зголемува), да кажеме само дека податоци се внесуваат во компјутерот од многу различни извори, но сите имаат иста дестинација - внатрешноста на компјутерот, и таму сите се рамноправни - една голема количина на бајти.
    Што значи податокот да „влезе„ во компјутерот? Простиот одговор на тоа прашање е: податокот мора да биде ископиран некаде во работната меморија на компјутерот, таканаречена RAM. Затоа кога купувате компјутер ви е битно тој да има што повеќе рам меморија - повеќе меморија значи дека компјутерот ќе може да складира повеќе податоци одеднаш и да ги користи. За нешто да излезе на вашиот екран (или во погенерална смисла да може да биде изманипулирано од компјутерот), тоа мора да биде ископирано некаде во работната меморија.

Малку за меморија
    Работната меморија на компјутерот е физички една мала плочка со интегрирани кола на неа - концептуално таа е склад во кој компјутерот може да ги чува податоците со кои треба да работи за време на неговата работа. Меморијата складира само бајти (во суштина складира двојни зборови кај
32-битните процесори, бајт е само 8 бита), што значи меморијата не дискриминира кој податок е што. Таа е само едно огромно поле од бајти кои може да се битни за компјутерот во еден момент или не. Самата меморија не е свесна кој дел од бајтите што ги складира е битен за компјутерот, и рачуна на самиот компјутер и неговата логика да си побара некој податок од некоја адреса во меморијата и да знае што да прави со него. Всушност, животот на меморијата е доста едноставен - таа мора да ги почитува следните услови на правилно функционирање:
        1. Било кој податок може да се запише на која било адреса (податокот и адресата мора да бидат зададени од програмата што компјутерот ја извршува и нејзината логика);
        2. Било која адреса може да се прочита и да се добие податокот запишан во неа (адресата ја задава програмата);
        3. Кога еден податок ќе биде запишан на некоја адреса, тој нема да се промени ако програмата не го промени преку запишување на друг податок на истата адреса

    Некои програмери мислат дека меморијата при стартување на компјутерот содржи само нули. Тоа може но не мора да е случај - најчесто меморијата го содржи истиот податок на сите адреси (тој се запишува таму кога компјутерот ја тестира меморијата пред да стартува), или во некои случаеви содржи „шема„, на пример броевите 256 и 0 еден по еден. За време на работа на компјутерот, меморијата генерално не се ре-иницијализира, што значи иако некој податок не му е потребен повеќе на компјутерот, тој ќе си остане на мемориската адреса (освен ако не биде експлицитно променет од самиот компјутер). Ова значи дека колку подолго работи еден компјутер, меморијата се повеќе и повеќе се рандомизира (аплауз од клубот на љубители на американизми) - сакав да кажам меморијата се полни со „ѓубре„ - податоци кои некогаш биле битни за програмите кои компјутерот ги извршува, повеќе не се и никој не се помачил да ги избрише или реинизијализира (уште еден аплауз). Во принцип, концептот бришење на мемориска адреса не постои - адресата само престанува да биде битна за програмот кој моментално се извршува; самата меморија и мемориската адреса си се здрави и живи и очекуваат со душа да станат пак важни.
    Значи ајде да се договориме дека ентропијата во меморијата константно се зголемува и дека не треба да веруваме дека нешто ќе биде на некоја адреса освен ако не сме го запишале таму лично и персонално.

Што беше овде насловот...?
    Утврдивме дека сите сакаат меморија (програми, слики, музика, видеа, игри...), но меморијата е секогаш практично ограничена. Во типичен компјутер што можеби го имате денес дома има 500 гига-бајти хадр диск меморија и само (б)еден гига-бајт работна меморија. Очигледно е дека се не може да собере одеднаш, и не само тоа: не треба меморија само за видеото што сакате да го гледате, туку треба меморија и за видео-плеерот што го користите за таа намена. А видео-плеерот мора да работи во некој оперативен систем, на кому исто така му е потребно парче од меморијата. Оперативниот систем пак треба да има некој кернел (тоа е јадрото што комуницира со хардверот на компјутерот) - и тој сака малку меморија.
    Истата меморија не може да биде користена од два различни програми, без едниот да знае за другиот. Ако двете програми мислат дека имаат ексклузивен пристап до меморијата тогаш нема начин да се загарантира точно работење на ниедна програма. Замислете едната програма си запишува една вредност на некоја мемориска адреса... Неколку секунди подоцна другата програма си запишува друга вредност во истата мемориска адреса. Кога првата програма ќе се обиде да ја прочита вредноста која таа ја запишала на мемориската адреса, ќе добие некоја друга, сосема неповрзана вредност. Ова скоро секогаш ќе доведе до грешка во програмата, бидејќи меморијата не го гарантира третиот услов на правилно функционирање.
    Затоа, меморијата работи на принцип на резервација. Секоја програма што треба да се извршува на компјутерот може да побара онолку меморија колку што `и е потребна, и таа меморија е резервирана и не смее да биде користена од друга програма се додека работи програмата што ја резервирала. Обично, една програма ќе побара неколку блокови со различна големина да и бидат резервирани во текот на своето работење: прво, ќе побара меморија за да го смести својот програмски код (она што ние ќе го пишуваме); потоа ќе побара меморија за да ги смести непознатите кои постојат во програмскиот код; потоа меморија за ресурси кои и се потребни на програмата за работа (можеби програмата треба да прикажува некоја слика - таа ќе побара меморија во која ќе треба да ја смести таа слика), итн.

    Ако меморијата се резервира, тогаш полека полека количината на меморија која останува нерезервирана постојано се намалува. По одредено време, целокупната меморија ќе биде резервирана од некоја програма, и повеќе нема да има простор за резервација. Во тој случај, сите други обиди да се резервира меморија ќе бидат одбиени и програмите кои се обидуваат да резервираат ќе престанат да функционираат. Ова е најлошото сценарио, и на наша (програмерска) несреќа - и најчесто. Денешните програми побаруваат голема количина на меморија и способноста таа да се организира добро и ефикасно е една од најбитните кај надежните програмери.
    Значи меморијата мора некако да се организира. Самата меморија не го прави тоа - организирањето е оставено на дискреција на програмата, и со тоа во рацете на програмерот. Луѓето долго мислеа дека тоа е добра идеја, верувајќи во бескрајната доблест на програмерот да биде дисциплиниран и цивилизиран. И некои 10% од програмерите ја оправдаа таа доверба. Ние другите 90% се однесувавме како компјутерот да постои само за нашата програма, и бидејќи најчесто тоа не беше случај, компјутерите често заглавуваа,
crash-уваа и генерално се однесуваа идиотски. Подоцна организацијата на меморијата се пресели во оперативниот систем, каде што е и денес - тоа е впрочем причината зошто денешните оперативни системи заглавуваат доста поретко од раните верзии. Но тоа не значи дека одговорноста на програмерот за користење на апсолутниот минимум меморија која што и е потребна на програмата која тој ја пишува е намалена. Разликата меѓу добар и лош програмер е принципиелно во однесувањето кон меморијата - дали таа се користи на умен начин или на лош начин.


    Затоа зборуваме прво за меморијата. Таа е најважниот ресурс во компјутерот и сите програмери треба да разбираат како таа работи. Во следниот напис во оваа тема ќе зборувам за конкретни начини за организирање на меморија и за брзината на пристап кон меморијата. Немојте да ве обесхрабри тоа што веднаш не се впуштаме во анализа на код - овие концепти се многу важни бидејќи треба да го изградат темелот врз кој ќе можеме да ги ставиме покомплицираните и поапстрактни работи кои доаѓаат.

* Мишот е се разбира миш - маус, mouse, или како што го нарекувате. Се разбира дека нема да го наречам глушец бидејќи тоа ми звучи глупаво. Сум се научил на миш, па така ќе си пишувам - ионака миш звучи доволно блиску до изворното маус.

КОМЕНТАРИ:
Коментар од Dragan , на Ïåòîê, 8 Ôåâðóàðè 2008 (2:28:12 PM)
Ìè ñå äîïà’à íà÷èíîò íà êî¼ ãè îá¼àñíóâàø ðàáîòèòå. Ìèñëàì äåêà ñåêî¼ ïî÷åòíèê áè áèë çàäîâîëåí ñî äîñåãàøíîòî îá¼àñíóâàSå. £àñ áè ñàêàë äà ïðîáàì äà íàó÷àì íåøòî âî âðñêà ñî Ö++, ïà àêî èìàø âðåìå äà ïðîäîëæèø, òóêà ñóì. Ïîçäðàâ!

Име:
Email:
Коментар:

(Можете да ги користите сите HTML тагови. По дефаулт, никакво форматирање не се памети, ни нова линија.)

 

Ова е reCaptcha загатка! Твојот одоговор ќе биде корисен за човештвото, и ќе ми го заштити сајтов од автоматизирани бот програми.

Внеси ги двата зборови од сликата:

НАЗАД КОН ЛИСТАТА ОД НАПИСИ