Ugrás a tartalomhoz

data segment

A Wikiszótárból, a nyitott szótárból


Főnév

data segment (tsz. data segments)

  1. (informatika) A data segment (adat szegmens) egy olyan fogalom, amely az alacsony szintű programozásban – különösen az assember, a C/C++, valamint az operációs rendszerek memóriakezelésében – játszik fontos szerepet. Az adat szegmens a folyamat (program) címtartományának azon része, amely a program globális és statikus változóit tárolja futásidőben.

Az adat szegmens a memória szegmentálás egyik fő eleme. Az operációs rendszer a program számára kiosztott memóriát logikai egységekre – például code, data, BSS, heap, és stack szegmensekre – osztja. Ezek a szegmensek különféle célokat szolgálnak, és a data segment azok közül az egyik legfontosabb.



A memória felosztása egy tipikus program esetén

Amikor egy program elindul, a memóriában a következő szegmensek jönnek létre:

+-----------------------+
|   Stack              | ← növekszik lefelé
+-----------------------+
|   Heap               | ← növekszik felfelé
+-----------------------+
|   BSS segment        | ← nem inicializált statikus/globális változók
+-----------------------+
|   Data segment       | ← inicializált statikus/globális változók
+-----------------------+
|   Code segment (text)| ← gépi utasítások
+-----------------------+
  • Code segment (text segment): maga a programkód (utasítások).
  • Data segment: globális vagy statikus változók, amelyek explicit értékkel vannak inicializálva.
  • BSS segment: ugyanilyen típusú változók, de nem inicializáltak, vagyis az értékük 0.
  • Heap: dinamikusan lefoglalt memória (malloc, new).
  • Stack: helyi változók, függvényhívási keretek.



Mi van a data szegmensben?

A data szegmens tartalmazza:

  • Minden globális változót, amelyet nem static függvényen belül, és nem extern-ként deklaráltunk.
  • Minden statikus változót (static kulcsszó), akár globális, akár függvényen belüli.
  • Ezeknek a változóknak van kezdeti értéke, amit a fordító ide írat be.

Példa (C nyelv):

#include <stdio.h>

int global_var = 42;         // Data segment
static int static_var = 7;   // Data segment
int uninitialized_var;       // BSS segment

int main() {
    int local_var = 10;      // Stack
    static int func_static = 5; // Data segment
    return 0;
}

Ebben a példában:

  • global_var, static_var, és func_static a data szegmensbe kerülnek, mert inicializáltak.
  • uninitialized_var a BSS szegmensbe kerül (nincs kezdőértéke).
  • local_var a veremben (stack) helyezkedik el.



A data szegmens jellemzői

  • Statikus méretű: a mérete a program indulásakor fixálódik, nem nő vagy csökken futásidőben.
  • Írható és olvasható: a benne lévő változók értéke módosítható futásidőben.
  • Közös élettartam: a benne lévő változók a program teljes futásideje alatt elérhetők.
  • Címzési lehetőség: a globális és statikus változók címe fix vagy relatíve fix, így közvetlenül is hivatkozhatunk rájuk.



Data szegmens vs. BSS szegmens

Tulajdonság Data segment BSS segment
Inicializált? Igen (explicit kezdőérték) Nem (implicit 0)
Példa int x = 5; int x;
Tárolási igény A bináris fájlban szerepel Csak méretben szerepel, nem adatban
Memóriakezelés RAM-ból foglalódik futásidőben RAM-ból, de üresként töltődik be
Cél Stabil állapotú változók Nullázandó változók



Platformfüggő megvalósítások

A data szegmens fizikai elhelyezése és mérete platformonként és operációs rendszerenként különbözhet:

  • Linux alatt a program binárisa (pl. ELF fájl) szegmensekre van bontva, amelyek a loader által kerülnek RAM-ba töltésre.
  • Windows alatt az .data és .rdata szegmensek tartalmazzák az inicializált adatokat.
  • Embedded rendszerekben a data szegmenset flash memóriából másolják RAM-ba induláskor.



Fejlesztői szempontból

A data szegmens túlzott használata problémás lehet:

  • Megnöveli a statikus memóriahasználatot.
  • Egy kis memóriájú rendszer esetén fontos a pufferelés vagy dinamikus memóriahasználat.
  • Thread safety: a globális változók nem szálbiztosak több szálas környezetben.
  • Iniciálás költsége: nagy adattömbök másolása induláskor lassíthatja a programot.



Ellenőrzés, vizsgálat

Különféle eszközökkel vizsgálható, hogy mely változó hova került:

  • Linuxon:

    nm program | grep ' D '
    

    A D (data) jelzi az adat szegmensbe került szimbólumokat.

  • Objdump:

    objdump -h program
    
  • GDB debuggerrel**:

    info variables



Optimalizálás

Optimalizálási lehetőségek:

  • Kis méretű, gyors adatok lehetőleg kerüljenek stackre vagy regiszterekbe.
  • Ritkán használt nagy adatok dinamikusan foglalhatók a heap-en.
  • Ha a program memóriaérzékeny, törekedni kell a static és global változók minimalizálására.



Speciális esetek

  • Const változók: gyakran a read-only data segmentbe (.rodata) kerülnek.
  • Embedded rendszerekben: RAM hiány miatt gyakori, hogy a data szegmenset flash-ből indítják, és csak a szükséges változók kerülnek RAM-ba.



Összefoglalás

A data segment a program memóriájának fontos része, amely az inicializált globális és statikus változókat tárolja. Bár sok modern programozási nyelv és környezet elrejti a memóriakezelés részleteit, rendszerszintű programozás, beágyazott fejlesztés vagy fordítóoptimalizálás esetén elengedhetetlen a data szegmens és társai megértése.

Az adat szegmens stabil, hosszú élettartamú adattárolásra szolgál futásidőben, és lehetővé teszi, hogy a program különböző részei közösen használjanak állapotinformációt. Ugyanakkor óvatosan kell bánni vele: a túlhasználata memóriazabáló és nehezen menedzselhető programokat eredményezhet. A jól optimalizált memóriahasználat alapja a különböző szegmensek ismerete – és ebben az adat szegmensnek kiemelt szerepe van.