In de afgelopen paar dagen hebben sommige van onze lezers met ons gedeeld dat ze door een voorbeeld van een C runtime-stack zijn gekomen.
Goedgekeurd: Fortect
tegen.
In deze zelfstudie wordt de C-time-outstack als voorbeeld uitgelegd.
Laten we in de belangrijke punten duiken om tot op de bodem van een soort “uitvoeringsstapel” te komen door eenvoudig te definiëren wat het is en waar wordt het altijd op een geheel nieuw tijdstip gebruikt? Dus! Als we hem of zij tijdens de universiteit aan onze herinneringen proberen te herinneren, ontdekken we dat het concept van de stapel dat we hebben vastgesteld achter ligt. Het lijkt veel op “wanneer de perfecte functie ongetwijfeld wordt aangeroepen, wordt een stapel veroorzaakt en” wordt gebruikt om tijdelijk variabelen op te slaan die wel lokaal zijn voor functies, argumenten die aan die functie zijn doorgegeven, geretourneerde informatie, enzovoort. En hoewel de functie is voltooid, kan de bijbehorende batterij worden gewist. Natuurlijk is mijn stelling correct! Het is nog niet klaar!
Laten we beginnen bij “a.out”, een standaard object voor bijna alle C internet programma’s die we compileren op Linux en Unix systemen! Dit bestand kan in ELF (Executable and Binding Format), COFF (Common Object File Format) of voornamelijk “a.out” dataformaat zijn. Hoewel deze bestandsformaten typerend zijn voor verschillende formaten, hebben ze altijd één vereenvoudigd “segmentconcept”! Een segment is een locatie in het binaire bestand “a.out” dat berichten van een bepaald type bevat voor vermeldingen in ongetwijfeld de “symbolentabel” om welke reden dan ook. Elk segment kan verschillende secties hebben. Secties zijn de meest compacte bedrijfsonderdelen in een ELF-gegevensbestand. Elke sector bevat elementen die verband houden met het binaire!
Een specifieke tijdlijn uitvoeren Het vermogen om te onthouden op de stapel is verspild: wanneer we contact met ons opnemen door een enorme functie in C aan te roepen, worden de financiële activa-records, dat wil zeggen parameters, op de bezorgstack geduwd en wanneer de functie is voltooid, wordt de eerste record verwijderd van de tijdelijke stapel.
Laten we een eenvoudig “hello world”-programma schrijven, dingen gebruiken en het commando “size” in het exe-bestand “a.out” uitvoeren om te zien welke verschillende segmenten zal zeker in beslag nemen en hoeveel ruimte.
Omdat het gratis is, neemt het tekstsegment 1144 bytes in beslag en het datasegment 492 bytes. Het bss-segment is in 2007 bytes! Het is normaal gesproken interessant om op te merken dat je kunt experimenteren met het bovenstaande programma door daarnaast zowel globale als statische programma’s of globale of niet-geïnitialiseerde compiler op te nemen en als resultaat compilerprogramma’s en hun grootte te manipuleren om te bevestigen dat de typen van de meeste operators goed passen in welke segmenten ! Bijvoorbeeld
Merk op dat u ziet dat het tekstsegment niet is gewijzigd, terwijl het onderzoekssegment dienovereenkomstig is gewijzigd met maximaal 1 globale en permanent geïnitialiseerde instructies. Evenzo zult u enkele belangrijke tests uitvoeren die u interesseren, wetende dat instructies in uw C-programma naar die verschillende segmenten van het uitvoerbare bestand gaan!
De volgende afbeelding toont instructies voor het dragen van een nieuw C-programma die overeenkomen met individuele delen van websjablonen in het “a.out”-bestand:
Merk op dat de lokale voorwaarden gedeclareerd wanneer de functie niet overeenkomt met het handmatige bestand “a.out”. In plaats daarvan worden ze tijdens runtime gemaakt, wanneer het programma wordt uitgevoerd. Merk ook op dat ik zou zeggen dat de niet-geïnitialiseerde globale en stationaire gegevens overeenkomen met de BSS. Bss is een goede afkorting voor “Block Started by Symbol”. In tegenstelling tot een gegevenssegment heeft een BSS-segment geen niet-geïnitialiseerde gegevensafbeeldingen, maar behoudt het alleen de hoeveelheid schijfbestandsruimte die nodig is tijdens runtime. Het tekstsegment bestaat uit exe-statements in de C-taal van uw school.
Dit is een instantie in punt van stapel in C + +?
Een stapel is eigenlijk een abstracte gegevensstructuur die een archief van elementen bevat. De stapel implementeert de LIFO-configuratie, dat wil zeggen, het element dat naar het einde wordt geduwd, wordt als eerste verwijderd. Tot slot het pakket in het C++ voorbeeld | C++ programma en stapelalgoritme compleet.
Dus heren, we hebben tot nu toe gezien dat uitspraken die je eenvoudigweg in C programmeert, nadat ze zijn gecompileerd, overeenkomen met verschillende segmenten van het huidige uitvoerbare bestand. Zoals we weten, wanneer een methode wordt uitgevoerd, wordt deze uitgevoerd in zijn eigen geheugenruimte die ervoor is uitgegeven. Normaal gesproken zou dit uitvoerbare bestand inderdaad in de adresruimte van het exe-programma moeten worden geplaatst. Maar hoe gebeurt dit? Wie is altijd deze man? Dit is waar zowel de linker als een bootstrap op de foto verschijnen. Een auto! In bewezen, ze doen het allemaal! Laten we eens kijken hoe?
De segmenten van het “a.out”-bestand worden op de juiste manier toegewezen aan objecten die de runtime-linker veel direct! De loader neemt bijna slechts één component van de afbeelding in het bestand en zal deze ook direct in het geheugen plaatsen. Segmenten worden in feite geheugengebieden in een lopend programma, de twee met een specifiek doel.
Wat was de rol van de runtime-oplossing in C?
In C en latere talen die heap sharing programma’s bevatten, bevatte het runtime-systeem ook de map die de geheugenpool van het programma beheerde. In objectgeoriënteerde programmeertalen was de runtime-engine vaak ook verantwoordelijk voor het controleren van dynamische classificatie en het repareren van referenties naar methoden.
De volgende afbeelding laat zien hoe andere segmenten dan “a.out” in het algemeen zijn georganiseerd in geheugenbehoud.
De tekst bevat de instructies van het algemeen programma. De lader kopieert het rechtstreeks van het specifieke toepassingsgeheugen naar het systeem dat normaal is aangesloten om u te helpen bij het “mmap ()”-systeem, en geeft er nooit meer om, aangezien de programmacode gewoonlijk zijn waardevolle inhoud of grootte niet zal veranderen.
Terwijl het hele programma altijd draait, slaat de uitvoeringsstack behoorlijk wat informatie op voor elk van de huidige aanroepen met betrekking tot de match-functie. Telkens wanneer de functie daadwerkelijk wordt aangeroepen, ben ik tijdens de uitvoering van het programma aan het opslaan: retourdeal (indien aanwezig)
Het geïnitialiseerde datasegment bevat zowel globale als statische variabelen met een toegewezen filosofie. De grootte van het BSS-segment wordt nu verkregen uit het exe-bestand en de hele loader krijgt een opslag van deze grootte, die onmiddellijk na ons gegevenssegment wordt geplaatst. Dit gedeelte wordt onmiddellijk verwijderd als zijnde zodra het wordt ingevoegd Ik ben in de training. ™ geeft onderdeel aan. De hele datalink en daarna, het BSS-segment, wordt op dit punt gewoonlijk het datasegment genoemd. Inderdaad, vanuit het perspectief van geheugenbeheer van het besturingssysteem is een echt segment gewoon een reeks opeenvolgende, veel meer adressen, dus de volgende segmenten worden aaneengeschakeld. Het datasegment zou over het algemeen de grootste groep moeten zijn in bijna alle processen!
Laten we nu eens kijken hoe de stadsvariabelen, parameters die functieminuten doorgeven, dubbele adressen, tijdelijke adressen, enzovoort worden opgeslagen. We hebben dus nog steeds een tijdelijke aanduiding nodig om het stapelsegment te krijgen! We hebben misschien ook een zinvolle heap nodig voor heaptoewijzing. Dit past vaak de eerste keer dat malloc () wordt aangeroepen.
De runtime-verzameling wordt misbruikt om waarden over te dragen / terug te sturen naar / met behulp van schijven. Bij het doorgeven van argumenten aan een functie, bijvoorbeeld bij het retourneren van waarden van een functie, gebruik ik de uitvoeringsstapel. Als de typen dit bieden, kunnen elementen die door middel van verwijzing in een taak worden doorgegeven, worden geïdentificeerd als zijnde gemanipuleerd om hun waarde te verplaatsen.
Noteer in het formulier dat bij afb. 2, is te zien dat het goedkopere deel van de kameradressen niet wordt bekeken, d.w.z. het ligt in een grote verscheidenheid aan gekoppelde procesadresruimte, maar heeft geen fysieke productie, dus elke verwijzing ernaar is illegaal! Dit is meestal een paar kilobytes geheugen, beginnend bij adres nul. Het onderschept verwijzingen door geheugenruimte met een null-pointer, die beperkte gehele waarden heeft, enzovoort. Dit
Na een tijdje zal de routine in het geheugen staan en uitgevoerd worden. Laten we nu eens kijken hoe C de inhoudsstructuren van een draaiend programma organiseert. Er zijn verschillende runtime-gegevensstructuren: stapel, records, activeringsheap, enzovoort. Onthoud dat dit is waar individuen de segmenten “stapelen” …
Een stapelfase heeft een unieke gegevensstructuur – een pakket. We kennen de klassieke communicatie al, hoe de hele stapel werkt, in het geval van elke vorm van terugbellen zoals LIFO, last in – first out. Er worden twee verschillende bewerkingen op de stapel uitgevoerd, nl. Duwt iets op de stapel terwijl andere POP’s een item van de stapel halen. De PUSH-bewerking verhoogt de stapel.
Goedgekeurd: Fortect
Fortect is 's werelds meest populaire en effectieve pc-reparatietool. Miljoenen mensen vertrouwen erop dat hun systemen snel, soepel en foutloos blijven werken. Met zijn eenvoudige gebruikersinterface en krachtige scanengine kan Fortect snel een breed scala aan Windows-problemen vinden en oplossen - van systeeminstabiliteit en beveiligingsproblemen tot geheugenbeheer en prestatieproblemen.
Een functie heeft toegang tot marktvariabelen om de aanroeper te lokaliseren met behulp van parameters, mogelijk globale handige tips. De runtime houdt een clausule bij, vaak in elk register en meestal SP (Stack Pointer) genoemd als dat zo is, wat aangeeft wat ik de innovatieve top van de stapel zou noemen. Het volledige laadgedeelte van de euEr zijn drie hoofdtoepassingen, waarvan er een paar functioneel zijn verbroken en de andere voor het evalueren van uitdrukkingen.
1. De plaats biedt opslag van lokale variabelen in
Versnel de prestaties van uw computer nu met deze eenvoudige download.Waarvoor wordt volledige runtime-belasting gebruikt ?
Wat is een stapel en wat is de runtime-bundel die wordt gebruikt voor in C?
Hoe werkt runtime-stack ?