Difference between revisions of "LU-LSP-b11:L07"

From DiLab
Jump to: navigation, search
m (typos)
 
Line 1: Line 1:
 
===Praktiskais darbs #7 - atmiņas alokācija ===
 
===Praktiskais darbs #7 - atmiņas alokācija ===
  
1. Uzrakstīt programmu, ka alocē atmiņu (drīkst to pēc tam neatbrīvot). Par pamatu var izmantot šo skeletu:
+
1. Uzrakstīt programmu, kas alocē atmiņu (drīkst to pēc tam neatbrīvot). Par pamatu var izmantot šo skeletu:
  
 
  #include <stdio.h>
 
  #include <stdio.h>
Line 23: Line 23:
 
  }
 
  }
  
2. Eksperimentāli noskaidrot, cik daudz atmiņas iespējams alocēt ''heap'' segmentā (var lieto malloc()). Salīdziniet - vai un kā šis apjoms mainās, ja:
+
2. Eksperimentāli noskaidrot, cik daudz atmiņas iespējams alocēt ''heap'' segmentā (var lietot malloc()). Salīdziniet - vai un kā šis apjoms mainās, ja:
 
** Atmiņa tiek alocēta "vienā gabalā" (one chunk)
 
** Atmiņa tiek alocēta "vienā gabalā" (one chunk)
 
** Atmiņa tiek alocēta pa 1MB lieliem gabaliem (many chunks)
 
** Atmiņa tiek alocēta pa 1MB lieliem gabaliem (many chunks)

Latest revision as of 16:06, 18 October 2011

Praktiskais darbs #7 - atmiņas alokācija

1. Uzrakstīt programmu, kas alocē atmiņu (drīkst to pēc tam neatbrīvot). Par pamatu var izmantot šo skeletu:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE ...

#define ALLOC(size) ...

#define FILL(ptr) ...

int main(void)
{
        printf("allocating...\n");

        ...

        printf("done\n");
        return 0;
}

2. Eksperimentāli noskaidrot, cik daudz atmiņas iespējams alocēt heap segmentā (var lietot malloc()). Salīdziniet - vai un kā šis apjoms mainās, ja:

    • Atmiņa tiek alocēta "vienā gabalā" (one chunk)
    • Atmiņa tiek alocēta pa 1MB lieliem gabaliem (many chunks)
  • Secinājumi?

3. Salīdziniet programmu ātrdarbību:

    • 1. variants - atmiņa tiek alocēta, bet netiek izmantota.
    • 2. variants - atmiņa tiek alocēta un tiek izmantota (piemēram, aizpildīta ar 0)
  • Salīdziniet uz 100MB atmiņas alokāciju. Ieteicams izpildes laika novērtēšanai izmantot programmu "time".

Izmantojot proc failusistēmu, novērtējiet (1) kopējās alocētās virtuālās atmiņas (VmSize), (2) resident set size izmērus (VmRSS) abos gadījumos. Secinājumi?

4. Eksperimentāli noskaidrot, cik daudz atmiņas iespējams alocēt stekā. Padoms - atmiņas alokācijai stekā izmantot funkciju alloca()!

  • Kas notiks, ja programmas darbības laikā tiks izsaukta šāda funkcija:
void f() {
     char array[100 * 1024 * 1024];
     memset(array, 0, sizeof(array));
}
  • Izskaidrot, kāpēc. Kas mainītos, ja mainīgais array būtu deklarēts kā "static"?


5. Neobligāts papilduzdevums. Pieņemsim, ka kodā ir definēta konstante MAX_MEM_SIZE. Ierobežot programmas tālākajā izpildes gaitā maksimāli alocēto atmiņas apjomu ar šo konstanti.

Iesūtīšana

Risinājumus nosūtīt uz kursa asistenta e-pastu, rakstot atbildes vēstules tekstā. E-pasta "Subject" obligāti iekļaut burtus "LSP".