Kas ir kur yra kamino ir krūvos?

Knygos programavimo kalbomis paaiškina, kad verte sukuriamos vertės rūšys, o krūvoje sukuriami atskaitos tipai, nepaaiškinant šių dviejų dalykų. Aš neskaito aiškaus paaiškinimo. Aš suprantu, kas yra kamino. Bet

  • kur ir kas jie yra (fiziškai kompiuterio atmintyje)?
  • Kiek jie kontroliuojami operacine sistema ar kalba?
  • Kas yra jų apimtis?
  • Kas lemia kiekvieno iš jų dydį?
  • Kas greičiau?
7380
17 сент. 17 mat . 2008-09-17 07:18 '08, 07:18, 2008-09-17 07:18
@ 25 atsakymai

Sraigtas yra atmintis, nukreipta kaip įbrėžimų erdvė vykdymo sričiai. Skambinus funkcijai, blokas yra rezervuojamas vietinių kintamųjų ir kai kurių įgaliojimų viršuje. Kai ši funkcija grąžinama, blokas tampa nenaudojamas ir gali būti naudojamas kitą kartą, kai skambinama. Sraigtas visada rezervuojamas LIFO tvarka (paskutinis pirmos eilės tvarka); naujausias rezervuotas blokas visada yra kitas išleidžiamas blokas. Tai palengvina sekimo stebėjimą; bloko išleidimas iš kamino yra tik vienas rodyklės koregavimas.

Krūva yra atmintis, skirta dinaminiam paskirstymui. Skirtingai nuo kamino, nėra priverstinio šablono, skirto blokuoti ir išlaisvinti iš krūvos; Galite bet kuriuo metu pasirinkti bloką ir jį atleisti bet kuriuo metu. Dėl šios priežasties labai sunku stebėti, kurios krūvos dalys yra paskirstytos arba išlaisvintos bet kuriuo metu; Yra daug pasirinktinių „cum“ platintojų, norinčių sureguliuoti krūvos našumą skirtingiems naudojimo modeliams.

Kiekvienas sriegis gauna kamino, o taikymui paprastai naudojama tik viena krūva (nors neįprasta, kad yra keletas krūvų skirtingų tipų paskirties vietoms).

Norėdami tiesiogiai atsakyti į klausimus:

Kiek jie kontroliuojami operacine sistema ar kalba?

Sistemos kūrimo metu OS paskirsto kiekvienam sistemos lygio sriegiui kamino. Paprastai kalbų vykdymo aplinka OS kviečia paskirti krūvą programai.

Kas yra jų apimtis?

Sraigtas yra pritvirtintas prie sriegio, todėl kai siūlelis išeina iš kamino, jis yra fiksuotas. Paprastai krūva skiriama, kai programa paleidžiama vykdymo metu ir grįžta po programos (techninio proceso) išėjimo.

Kas lemia kiekvieno iš jų dydį?

Stack dydis nustatomas kuriant giją. Paleidimo dydis nustatomas, kai programa pradedama, bet gali pakilti, kai reikia (paskirstytojas prašo daugiau atminties iš operacinės sistemos).

Kas greičiau?

Sraigtas yra greitesnis, nes prieigos modelis leidžia trivialiai paskirstyti ir atlaisvinti atmintį (rodyklė / sveikasis skaičius tiesiog auga arba susitraukia), o krūva yra daug sudėtingesnių finansinių ataskaitų, susijusių su paskirstymu ar išleidimu. Be to, kiekvienas įkrovos baitas dažnai pakartotinai naudojamas, o tai reiškia, kad jis yra rodomas procesoriaus talpykloje, todėl jis labai greitai. Kitas krūvos rezultatas yra tas, kad krūva, kuri dažniausiai yra pasaulinis išteklius, paprastai turėtų būti daugiakryptis, t.y. Kiekvienas paskirstymas ir išleidimas turėtų būti sinchronizuojami su „visais“ kitais krūvio skambučiais programoje.

Aiški demonstracija: 2019

5436
17 сент. Atsakymas suteiktas Jeff Hill 17 sep. 2008-09-17 07:52 '08 at 7:52 am 2008-09-17 07:52

Stack

  • Išsaugota kompiuterio atmintyje kaip krūva.
  • Kintamieji, sukurti ant kamino, išeina iš taikymo srities ir automatiškai atleidžiami.
  • Daug greičiau paskirstyti, palyginti su kintamųjų krūva.
  • Įdiegta naudojant faktinę kamino duomenų struktūrą.
  • Išsaugo vietinius duomenis, grąžina parametrus perduodančius adresus.
  • Gali būti kamino perpildymas, kai naudojamas per daug kamino (daugiausia iš begalinio ar per gilaus rekursijos, labai dideli pasiskirstymai).
  • Duomenys, sukurti ant kamino, gali būti naudojami be rodyklių.
  • Jei norite tiksliai žinoti, kiek duomenų turite skirti prieš sudarydami duomenis, naudosite šį kaminą, o tai nėra per didelis.
  • Paprastai maksimalus dydis jau nustatomas, kai programa pradedama.

Šuolis:

border=0
  • Saugoma kompiuterio atmintyje taip pat, kaip ir kamino.
  • C + + kintamieji turi būti sunaikinti rankiniu būdu ir niekada nepatenka į taikymo sritį. Duomenys delete , delete[] arba free .
  • Lėtesnis paskirstymas, palyginti su kintamosiomis.
  • Naudojama pagal užklausą, kad būtų paskirstytas duomenų blokas, skirtas naudoti programoje.
  • Gali būti susiskaidymas, kai yra daug asignavimų ir išimčių.
  • C + arba C, duomenys, sukaupti ant krūvos, bus rodomi rodyklėmis ir priskiriami atitinkamai new arba malloc .
  • Ji gali nepavykti paskirstyti, jei reikia per daug buferio.
  • Jei nenorite tiksliai žinoti, kiek duomenų jums reikia vykdymo metu, arba jei norite skirti daug duomenų, naudosite krūva.
  • Atsakingas už atminties nutekėjimą.

Pavyzdys:

2164
17 сент. Atsakymą pateikė Brian R. Bondy 17 sep. 2008-09-17 07:20 '08 at 7:20 2008-09-17 07:20

Svarbiausia yra tai, kad krūva ir kaminai yra bendrosios atminties paskirstymo metodų sąlygos. Jie gali būti įgyvendinami įvairiais būdais, ir šios sąlygos taikomos pagrindinėms sąvokoms.

  • Elementų krūvoje elementai yra išdėstyti vienas ant kito į tą vietą, kurioje jie buvo patalpinti, ir jūs galite pašalinti tik viršutinę dalį (nesukeliant viso dalyko).

    2019

1294
19 марта '09 в 17:38 2009-03-19 17:38 atsakymą pateikė thomasrutter kovo 19 d. , 09:17, 2009-03-19 17:38

(Šį atsakymą perkėliau iš kito klausimo, kuris buvo daugiau ar mažiau apgaulingas.)

Atsakymas į jūsų klausimą yra konkretus įgyvendinimas ir gali skirtis atsižvelgiant į kompiliatorius ir procesoriaus architektūras. Tačiau tai supaprastintas paaiškinimas.

  • Tiek kamino, tiek krūvos yra atminties zonos, skiriamos iš bazinės operacinės sistemos (dažnai virtualiosios atminties, kuri priskiriama prie fizinės atminties pagal pareikalavimą).
  • Daugialypėje aplinkoje kiekviena siūlai turės savo visiškai nepriklausomą kaminą, tačiau jie bus padalinti. Lygiagrečioji prieiga turi būti kontroliuojama krūvoje ir neįmanoma ant kamino.

Krūva

  • Kasoje yra susietų naudotų ir nemokamų blokų sąrašas. Nauji krūvų paskirstymai ( new arba malloc ) yra įvykdyti sukuriant tinkamą bloką iš vieno iš laisvų blokų. Tam reikia atnaujinti krūvos blokų sąrašą. Ši meta informacija apie blokų blokus taip pat saugoma krūvoje, dažnai mažame plote prieš kiekvieną bloką.
  • Kai krūva auga, nauji blokai dažnai skiriami iš žemesnių adresų į aukštesnius adresus. Taigi, jūs galite galvoti apie krūvą kaip atminties blokų krūva, kuri didėja, kai priskiriama atmintis. Jei krūva yra per maža, kad ją būtų galima paskirstyti, dydis dažnai gali būti padidintas įgyjant daugiau atminties iš pagrindinės operacinės sistemos.
  • Daugelio mažų blokų skyrimas ir paleidimas gali palikti krūvą būsenoje, kurioje tarp naudojamų blokų yra daug mažų laisvų blokų. Prašymas paskirstyti didelį bloką gali nepavykti, nes nė vienas iš laisvų blokų nėra pakankamai didelis, kad patenkintų paskirstymo užklausą, net jei bendras laisvų blokų dydis gali būti pakankamai didelis. Tai vadinama krūvos fragmentacija.
  • Kai naudojamas laisvas blokas greta naudojamas blokas, naujas laisvas blokas gali būti sujungtas su gretimu laisvu bloku, kad būtų sukurtas didesnis laisvas blokas, efektyviai mažinantis krūvos fragmentaciją.

2019

681
31 июля '09 в 18:54 2009-07-31 18:54 Atsakymą pateikė Martin Liversage, liepos 31 d., 09:18, 2009-07-31 18:54

Toliau pateiktame kode C #

var _tmr = window._tmr || (window._tmr = []);_tmr.push({id: "2334768", type: "pageView", start: (new Date()).getTime()});(function (d, w, id) {  if (d.getElementById(id)) return;  var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;  ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";  var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};  if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }})(document, window, "topmailru-code");