Автор работы: Пользователь скрыл имя, 02 Мая 2013 в 20:44, реферат
Табиғаттағы тірі жан-жануарлардың бәрі де өз тіршілігін өліммен аяқтайды, яғни мәйітке айналады. «Өмір сүру-өлу деген сөз» деп Ф.Энгельстің айтқаны осының дәлелі болса керек. Өлу заңдылықтарын, оның себептерін және өлімнен кейінгі өзгерістерді зерттейтін ілімді танатология деп атайды. Адам өлімін бүкіл организмнің өлімі деп қаару керек. Өлім белгілерін білу, өлім себептерін анықтау барлық дәрігерлер үшін, әсіресе, патологанатомдар үшін аса қажет. Патологанатом тек аурухана жағдайында қайтыс болған науқасты ашып көріп, өзінің қорытынды сөзін өлімнің қай ауру салдарынан болғанын, оның пайда болу механизмдерін ашып береді.
1. Үйме. HEAPORG, HEAPEND, HEAPPTR көрсеткіштері
2. Көрсеткішті пайдалану
3. DISPOSE процедурасы
Динамикалық жадыны
Жоспар:
1. Үйме. HEAPORG, HEAPEND, HEAPPTR көрсеткіштері
2. Көрсеткішті пайдалану
3. DISPOSE процедурасы
Программада анықталған
айнымалылардың барлығы оның орындалуы
кезінде компьютердің жедел жадының
мәліметтер сегменті деп аталатын бөлігінде
орналасады. Мәліметтер сегментінің ұзындығы
80х86 микропроцессор архитектурасымен
анықталады және 65536 байт құрайды. Мәліметтер
сегментінің аздығы программада өлшемі
үлкен массивтерді пайдалануда үлкен
қиындық туғызады. Бір жағынан, дербес
компьютердің (ДК) жады көлемі (әдетте
640 Кбайттан кем емес ) үлкен көлемді есептерді
сәтті шығаруға жеткілікті. Бұл жағдайдан
шығу үшін динамикалық ұғым принципі қолданылады.
Динамиканың ұғым принципі - ДК жедел жадысы,
Д.К. микропроцессорының сәулетіне байланысты,
көлемі 300 Кбайттан кем емес жедел жадының
арнайы бөлігіне мәліметтерді орналастыру
мүмкіндігі бар. Ол бөлік компьютер жедел
жадының мәліметтер сегментінен және
стектен тыс орналасады. Динамикалық ұғым
принципінде орналасқан мәліметтерді
динамикалық деп атайды. Оның статикалық
мәліметтен ерекшелігі, оларды кез келген
уақытта компьютер жадына орналастырып,
не одан өшіріп отыруға болады.
Динамикалық ұғым принципі бұл іс жүзінде
мәліметтері үлкен көлемді массивтерді
өңдеуде жалғыз мүмкіндік. Көп практикалық
есептерді динамикалық ұғым принципінсіз
шығару қиын немесе шығару мүмкін емес.
Мұндай қажеттілік автоматтандырылған
жобалау жүйесін құру (ААЖҚ) кезінде туындайды:
ААЖҚ - да қолданылатын бір қалыптылық
математикалық моделі басқа жобаларда
анағұрлым өзгешелеу болуы мүмкін; бұл
жағдайда статистикалық ұғым принципін
қолдану мүмкін емес. Ақыры, Дербес компьютердің
графикалық және дыбыстық тәсілдерімен
жұмыс кезінде мәліметтерді уақытша сақтау
үшін динамикалық ұғым кеңінен қолданылады.
Мәліметтерді динамикалық орналастыру
- динамикалық ұғым принципіне тікелей
программамен жұмыс істеу барысында қолдану.
Бұған қарағанда, мәліметтерді статикалық
орналастыру Турбо Паскаль компиляторымен
программа компиляциялау барысында іске
асады. Мәліметтерді динамикалық орналастыруда,
орналастырылатын мәліметтердің не типі,
не мөлшері белгілі болмайды, және оларға
статикалық айнымалылар сияқты аты бойынша
жүктеуге болмайды.
1. Үйме. HEAPORG, HEAPEND,
HEAPPTR көрсеткіштері
Турбо Паскалда барлық динамикалық жады
түгелімен үйме (куча)деп
аталатын байттардың массиві ретінде
қарастырылады. Үйме физикалық тұрғыдан
жоғарғы(в старших адресах) адрестерде,
программаның денесі орналасқан жады
облысынан соң бірден басталады. Үйменің
басы стандартты HEAPORG айнымалысында, ал
соңы HEAPEND айнымалысында сақталады. Динамикалық
жадының бос аймағының шекарасы HEAPPTR көрсеткішінде
сақталады.
Кез-келген динамикалық орналастырылатын
айнымалы үшін жады NEW процедурасы арқылы
бөлінеді. Бұл процедураны шақыруда қолданылатын
параметр – типтендірілген көрсеткіш
болып табылады. Процедураны шақыру нәтижесінде
көрсеткіш берілгендерді орналастыру
қайсы динамикалық ұяшықтан басталатын
болса сол динамикалық ұяшықтың адрестік
мәнін қабылдайды. Мысалы:
var
i, j : ^integer;
r : ^real;
begin
new(i);
……..
end.
Осы программа бөлігі орындалған соң і
көрсеткіші бұдан алдын үйменің көрсеткіші
HEAPPTR ие болған мәнді қабылдайды, ал HEAPPTR
болса өз мәнін 2-ге арттырады, integer типтің
жадыдан алатын орны – 2 байт.
new(r);
операторы HEAPPTR көрсеткішін тағы да 6 байтқа
жылжытады, өйткені real типі үшін 6 байт
орын бөлінеді.
|
|
|
|
| |
| ||
|
| |
|
|
ДК-ң жадысында үйменің
орналасуы
2. Көрсеткішті пайдалану
Көрсеткіш қайсыбір мәнге ие болған соң,
яғни нақты физикалық жады байтын көрсетіп
тұрған соң, осы адреске кез-келген типі
сәйкес келетін мәнді орналастыруға болады.
Бұл үшін көрсеткішке тіркеп ^ белгісі
қойылады. Мысалы:
i^ :=2; {і жады бөлігіне 2 мәні орналастырылды}
r^ :=2*pi {r жады бөлігіне 6.28 мәні орналастырылды}
Осылайша, көрсеткішке ^ белгісі тіркелсе
ол адресте орналасқан мәнді білдіреді.
Егер бұл белгі қойылмаса, онда көрсеткіш
осы мән орналасқан адресті білдіреді.
Динамикалық орналасқан берілгендерді
сәйкес типтің тұрақтылары ме айнымалылары
қолданылатын жерлердің барлығында пайдалана
беруге болады. Мысалы:
r^ := sqr(r^)+i^-17;
Ал, енді былай жазуға болмайды: r := sqr(r^)+i^-17;
Өйткені, r көрсеткішіне нақты мәнді беруге
болмайды. Дәл осылайша
r^ := sqr(r);
деп жазуға болмайды. Өйткені r-ң мәні адрес
болғандықтан оны квадраттауға болмайды.
Былай жазу да қате боп табылар еді. r^ :=
і;
Өйткені, r^ көрсетіп тұрған нақты мәндерге
көрсеткіш мәнін, яғни адресті меншіктеуге
болмайды.
3. DISPOSE процедурасы
Үймеден динамикалық жадыны тек алу ғана
емес, кері қайтаруға да болады. Бұл үшін
DISPOSE процедурасы қолданылады. Мысалы,
dispose (r) ;
dispose (і) ; операторлары і және r көрсеткіштері
үшін алдын бөлінген 8 байтты үймеге қайтарады,
ал көрсеткіштер мәнсіз, бос қалады. Осы
көрсеткіштерге операторды қайтара қолдану
программа орындалу барысында қателік
туғызады. Босаған көрсеткішті программист
NIL сөзі арқылы белгілеп қоюына болады.
Көрсеткіштердің біріне белгі қойылған
не қойылмағандығын былай тексеруге болады:
const
p: ^real = NIL;
begin
…….
if p = NIL then
new(p);
…………
dispose (p);
p := NIL;
……….
end.
Көрсеткіштерді салыстырудың басқа амалдарына
рұксат етілмеген.
Жоғарыда келтірілген программа бөлігі
көрсеткішті бірмезгілде типтелген және
NIL мәні меншіктелген константа ретінде
жариялау әдісін көрсетеді. Айта кету
керек, көрсеткіштің бастапқы мәні (айнымалылар
бөлімінде жарияланған уақытта) кез-келген
болуы мүмкін. NEW процедурасы арқылы немесе
басқа жолмен мәні меншіктелмеген көрсеткіштерді
пайдалану жүйе тарапынан қадағаланбайды,
сондықтан қолайсыз жағдайлар туғызуы
мүмкін.
NEW және DISPOSE процедураларын кезек-кезек
қолдану жадының «ұяшықты» құрылымына
әкеледі. Мәселе мынада, үймеге қатысты
барлық амалдар үйме администраторы деп
аталатын ерекше көмекшіпрограмманың
басқаруымен орындалады. Ол автоматты
түрде Турбо Паскальдің компоновщигі
арқылы қосылады да үймедегі барлық бос
фрагменттер есебін жүргізіп отырады.
NEW процедурасын кезекті рет шақырған
кезде осы көмекшіпрограмма берілген
айнымалы сиятындай ең кіші бос фрагментті
іздестіреді. Табылған фрагменттің басы
көрсеткішке меншіктеледі, ал фрагмент
толығымен не талап етілген бөлігі үйменің
бос емес бөлігі ретінде белгіленіп қойылады.
Динамикалық жады
Программада жарияланған барлық айнымалылар
жедел жадының берілгендер сегменті деп
аталатын бір үзіліссіз бөлігінде орналасады.
Берілгендер сегментінің ұзындығы 80х86
микропроцессорлер архитектурасымен
айқындалады және 65536 байтты құрайды. Мұндай
өлшем үлкен берілгендер массивін өңдеу
кезінде қиындықтар тудырады. Дербес компьютердің
жады көлемі үлкен көлемді берілгендерді
өңдеуге әбден жеткілікті. Жағдайдан шығудың
жолы динамикалық деп аталынатын жадыны пайдалану.
Динамикалық жады-бұл дербес компьютердің
программаға берілгендер сегментін(64
КБ), стекті(әдетте 16КБ) және программаның
өз денесін қоспағандағы пайдалануға
беретін оперативті жадысы. Динамикалық
жадының көлемі үнсіз келісім бойынша
ДК-ң барлық жады көлемін құрайды.
Көптеген мәселелерді динамикалық жадының
көмегінсіз шешу қиын немесе тіпті шешуге
келмейді. Бұдан бөлек, проект жасаудың
автоматтандырылған жүйелерін құруда,
ДК-ң графикалық және дыбыстық құралдарымен
жұмыс істеу барысында берілгендерді
уақытша сақтау үшін қолданылады.
Берілгендердің динамикалық орналастыру
дегеніміз – бұл программаның жұмысы
кезінде динамикалық жадыны тікелей пайдалану.
Ал, берілгендердің статикалық орналастыру
компилятор арқылы программаны компиляция
жасау кезінде орындалады. Динамикалық
орналасуда алдын ала орналастырылатын
берілгендердің не көлемі, не типі белгілі
болмайды, бұл берілгендерді статикалық
айнымалылар сияқты атауы бойынша қолдануға
болмайды.
2. Адрестер және көрсеткіштер
ДК-ң оперативті жадысы мәліметтерді сақтауға
арналған э лементар ұяшықтардың-байттардың
жиынтығынан тұрады. Олардың әрқайсысының
номері бар. Бұл номерлер адрестер деп аталады. Солардың арқасында жадының
кез-келген байтына пайдалануға болады.
Турбо Паскальда динамикалық жадыны басқарудың
жеңіл құралы – көрсеткіштер боп табылады. Көрсеткіш- бұл айнымалы,
оның мәні ретінде жадыдағы белгілі бір
байттың адресі алынады.
ДК-де адрестер сегмент және жылжу де аталатын
екі 16-разрядты сөздермен беріледі. Сегмент – бұл ұзындығы
65536 байтқа (64КБ) тең және 16-ға бөлінетін
(яғни 0, 16, 32, 48, т.с.с.) физикалық адрестен
басталатын жады бөлігі. Жылжу- бұл керекті адресті алу үшін сегменттің
басынан қанша байт тастап, жылжу керектігін
көрсетеді. ДК-ң адректік кеңістігі 1 Мбайтты
құрайды(ДК-ң стандартты деп аталатын
жадысына қатысты айтылып тұр, қазіргі
уақыттың адрестік кеңестігі 40-80Гбайтты
құрайды, алайда қосымша жадыны пайдалануға
мүмкіндік беретін құралы Турбо Паскальда
жоқ, Воrland Pascal with Objects 7.0 –те бар) 1 Мбайт
көлемін адрестеу үшін 20 екілік разряд
қажет. Ол екі 16 разрядты сөздерден (сегментжәне
жылжу) былайша құрылады: сегмент мәні
солға қарай 4 разрядқа жылжиды, босап
қалған оң жақтағы разрядтар нольмен толтырылады
да бұл мән жылжу мәнімен қосылады.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Сегмент
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Жылжу
=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Адрес
16 байттық жады фрагменті параграф деп
аталады. Сондықтан, сегмент параграфқа
дейінгі дәлдікпен, ал жылжу байтқа дейінгі
дәдікпен жадыны адрестейді. Әрбір сегментке
үздіксіз және жеке адрестелген жады облысы
сәйкес келеді. Жадыда сегменттер бірінен
кейін бірі жалғасып орналасуы, немесе
қайсыбір интервал тастап орналасуы, немесе
бірін бірі жауып(қиылыса) орналасуы мүмкін.
Осылайша, өзінің ішкі құрылымы бойынша
әрбір көрсеткіш екі сөзден (WORD типіндегі
берілген) сегмент және жылжудан тұрады.
Көрсеткіш көмегімен динамикалық жадыға
Турбо Паскалдағы кез-келген типтегі берілгендерді
орналастыруға болады. Олардың кейбіреулері
ғана жадыда бір байт иелейді(BYTE, CHAR, SHORTINT,
BOOLEAN), ал қалғандары –көрші орналасқан
бірнеше байттарды иелейді. Сондықтан
іс-жүзінде көрсеткіш берілгендердің
тек бірінші байтын ғана адрестейді.
Көрсеткіштерді жариялау
Әдетте Турбо Паскалда көрсеткіштер қайсыбір
берілгендер типімен байланыстырылады.
Мұндай көрсеткіштерді типтендірілген
Var
p1: ^integer;
p2: ^integer;
type
PerconPointer = ^PerconRecord;
PerconRecord = record
Name : string;
Job : string;
Next : PersonPointer
end;
Көңіл аударыңыз: PersonPointer типін жариялауда
PerconRecord типіне сілтедік, ал ол программада
алдын-ала жарияланбаған. Бізге белгілі,
Турбо Паскалда барлық айнымалылар қолданудан
алдын сипатталуы керек. Бұл ереже көрсеткіштер
үшін қолданылмайды. Көрсеткіштер әлі
жарияланбаған берілгендер типіне сілтеме
жасай алады. Осының арқасында динамикалық
жады берілгендерді тізім түрінде ұйымдастыру(кейбір
программаларда кеңінен қолданылады)
мүмкіндігін береді. Тізімнің әрбір элементінің
құрамында келесі элементтің көрсеткіші
бар болады. Бұл тізімді қарап шығу және
дұрыстауға мүмкіндік береді.
Турбо Паскалда көрсеткішті ешқандай
нақты бір берілгендер типімен байланыстырмай
жариялауға болады. Бұл үшін РОINTER стандартты
типі пайдаланылады. Мысалы:
var
p: pointer;
Мұндай көрсеткішті типтендірілмеген д
Айтылып кеткендей, көрсеткіш мәні бұл
айнымалының жадыдағы адресі, сондықтан
бір көрсеткіштің мәнін екіншісіне беруге
болады деп ойлауымыз мүмкін. Шын мәнінде
бұл басқашалау болады. Турбо Паскалда
бірдей берілгендер типімен байланыстырылған
көрсеткіштер арасында ғана бірінің мәнін
екіншісіне беруге болады. Мысалы, егер
var
p1, p2: ^integer;
p3 : ^real;
pp : pointer;
онда
p1:=p2; деп меншіктеуге болады,
ал
p1:=p3; деп меншіктеуге болмайды. Өйткені,
р1, р3 әртүрлі берілгендер типіне сілтеме
жасайды. Алайда, бұл шектеме типтендірілмеген
көрсеткіштер үшін қойылмайды. Сондықтан
былайша жаза аламыз:
рр:=p3;
p1:=pp;
Шектеме қойып және оны айналып өтудің
жолын тағы берудің қажеті барма екен
деуіңіз мүмкін. Мәселе мынада, кез-келген
шектеме бір жағынан программаның сенімділігін
арттыру үшін ендірілсе, екінші жағынан
тілдің қуатын шектейді, қайсыбір жағдайлар
үшін қолдануға жарамсыз етеді.
Әдебиеттер:
1.А.Г.Гольцев «Объектно-
2. В.В.Фараонов «Турбо Паскаль 7.0», Москва-2001
3. Электронный учебник: «Введение в объектно-ориентированное
программирование», 2006
Информация о работе Өлім және оның белгілері. Өлімнен кейінгі өзгерістер. Танатология негізі