Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 72

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° malloc ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘:

#include <stdlib.h>

void *malloc(size_t size);

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ОБ Linux (ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ трСбованиям стандарта X/Open) отличаСтся ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ UNIX Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° malloc.h. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ size, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ количСство выдСляСмых Π±Π°ΠΉΡ‚ΠΎΠ², β€” это Π½Π΅ простой Ρ‚ΠΈΠΏ int, хотя ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ задаСтся Ρ‚ΠΈΠΏΠΎΠΌ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ (unsigned integer).

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм Linux Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ большой объСм памяти. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΎΡ‡Π΅Π½ΡŒ простой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· упраТнСния 7.1, которая, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ сорСвнованиС со старыми ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ ОБ MS-DOS, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ памяти Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Ρ‹ памяти ПК объСмом 640 ΠšΠ±Π°ΠΉΡ‚.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.1. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ распрСдСлСниС памяти

НабСритС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ memory1.с:

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#define A_MEGABYTE (1024 * 1024)


int main() {

 char *some_memory;

 int megabyte = A_MEGABYTE;

 int exit_code = EXIT_FAILURE;

 some_memory = (char*)malloc(megabyte);

 if (some_memory ! = NULL) {

  sprintf(some_memory, "Hello World\n");

  printf("%s", some_memory);

  exit_code = EXIT_SUCCESS;

 }

 exit(exit_code);

}

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄:

$ ./memory1

Hello World

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° malloc ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ памяти. Π’Ρ‹ провСряСтС, ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ Π²Ρ‹Π·ΠΎΠ² malloc, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‡Π°ΡΡ‚ΡŒ памяти, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅. Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄ Ρ„Ρ€Π°Π·Ρ‹ "Hello World", ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ malloc Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΠ» ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ памяти. ΠœΡ‹ Π½Π΅ провСряСм Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ; ΠΌΡ‹ приняли Π½Π° Π²Π΅Ρ€Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ malloc!

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция malloc Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° void*, Π²Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π²Π°ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° char*. Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½ΡƒΡŽ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π° Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ любого Ρ‚ΠΈΠΏΠ°.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ основаниС β€” соврСмСнныС систСмы Linux ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ 32-разрядныС Ρ†Π΅Π»Ρ‹Π΅ ΠΈ 32-разрядныС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ позволяСт Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΎ 4 Π“Π±Π°ΠΉΡ‚. Π­Ρ‚Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ адрСса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 32-разрядного указатСля Π±Π΅Π· нСобходимости примСнСния рСгистров сСгмСнтов ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ², называСтся простой 32-разрядной модСлью памяти. Π­Ρ‚Π° модСль Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ Π² 32-разрядных вСрсиях ОБ Windows Π₯Π  ΠΈ Vista. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ слСдуСт Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° 32-разрядныС Ρ†Π΅Π»Ρ‹Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°ΡŽΡ‰Π΅Π΅ количСство 64-разрядных вСрсий Linux находится Π² ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠΈ.

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ… объСмов памяти

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ ОБ Linux ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π²Π°Π΅Ρ‚ ограничСния ΠΌΠΎΠ΄Π΅Π»ΠΈ памяти ОБ MS-DOS, Π΄Π°Π²Π°ΠΉΡ‚Π΅ услоТним Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Ρƒ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 7.2 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ объСма памяти, большСго, Ρ‡Π΅ΠΌ физичСски Π΅ΡΡ‚ΡŒ Π² машинС, поэтому ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция malloc Π½Π°Ρ‡Π½Π΅Ρ‚ Π΄Π°Π²Π°Ρ‚ΡŒ сбои ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ физичСской памяти, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ядру ΠΈ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΡΡ процСссам Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.2. Запрос Π½Π° всю Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ memory2.с ΠΌΡ‹ собираСмся Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ большС памяти, Ρ‡Π΅ΠΌ физичСски Π΅ΡΡ‚ΡŒ Π² машинС. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ PHY_MEM_MEGS Π² соотвСтствии с физичСскими рСсурсами вашСго ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°.

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#define A_MEGABYTE (1024 * 1024)

#define PHY_MEM_MEGS 1024 /* ΠžΡ‚ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ это число

                             Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ */

int main() {

 char *some_memory;

 size_t size_to_allocate = A_MEGABYTE;

 int megs_obtained = 0;

 while (megs_obtained < (PHY_MEM_MEGS * 2)) {

  some_memory = (char *)malloc(size_to_allocate);

  if (some_memory != NULL) {

   megs_obtained++;

   sprintf(somememory, "Hello World");

   printf("%s β€” now allocated %d Megabytes\n", some_memory, megs_obtained);

  } else {

   exit(EXIT_FAILURE);

  }

 }

 exit(EXIT_SUCCESS);

}

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ сокращСнный Π²Ρ‹Π²ΠΎΠ΄:

$ ./memory3

Hello World β€” now allocated 1 Megabytes

Hello World β€” now allocated 2 Megabytes

...

Hello World β€” now allocated 2047 Megabytes

Hello World β€” now allocated 2048 Megabytes

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π­Ρ‚ΠΎ просто Ρ†ΠΈΠΊΠ»Ρ‹, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ всС большС ΠΈ большС памяти Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ памяти Π²Π΄Π²ΠΎΠ΅ большС, Ρ‡Π΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π²Π°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ опрСдСлСния PHY_MEM_MEGS объСм памяти, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ Ρƒ вашСго ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹, ΠΊΠ°ΠΊ оказалось, создали ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π°ΠΉΡ‚ физичСской памяти Π½Π° машинС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π°Π²Ρ‚ΠΎΡ€ΠΎΠ². ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² нашСм Π²Ρ‹Π·ΠΎΠ²Π΅ malloc примСняСтся Ρ‚ΠΈΠΏ size_t.

Другая интСрСсная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π½Π° Π΄Π°Π½Π½ΠΎΠΉ машинС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСтся Π² ΠΌΠ³Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΎΠΊΠ°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½Π΅ сомнСния использовали всю ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½ΠΎ ΠΈ сдСлали это Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΡ‡Π΅Π½ΡŒ быстро.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ исслСдованиС ΠΈ посмотрим, сколько памяти ΠΌΡ‹ смоТСм Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° этой машинС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ memory3.c (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.3). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΆΠ΅ понятно, Ρ‡Ρ‚ΠΎ систСма Linux способна ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠΌΠ½ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ с запросами памяти, ΠΌΡ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ 1 ΠšΠ±Π°ΠΉΡ‚ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°ΠΌΠΈ Π±Π»ΠΎΠΊ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.3. Доступная ΠΏΠ°ΠΌΡΡ‚ΡŒ

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° memory3.c. По своСй истинной ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ ΠΎΠ½Π° ΠΊΡ€Π°ΠΉΠ½Π΅ нСдруТСствСнная ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ. Если вас бСспокоит ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ риск, Π»ΡƒΡ‡ΡˆΠ΅ совсСм Π½Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΅Π΅; Ссли Π²Ρ‹ ΠΎΠΊΠ°ΠΆΠΈΡ‚Π΅ΡΡŒ ΠΎΡ‚ выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΡƒΡΠ²ΠΎΠ΅Π½ΠΈΡŽ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° это Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚.

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#define ONE_K (1024)


int main() {

 char *some_memory;

 int size_to_allocate = ONE_K;

 int megs_obtained = 0;

 int ks_obtained = 0;

 while (1) {

  for (ks_obtained = 0; ks_obtained < 1024; ks_obtained++) {

   some_memory = (char *)malloc(size_to_allocate);

   if (some_memory == NULL) exit(EXIT_FAILURE);

   sprintf(some_memory, "Hello World");

  }

  megs_obtained++;

  printf("Now allocated %d Megabytes\n", megs_obtained);

 }

 exit(EXIT_SUCCESS);

}

На этот Ρ€Π°Π· Π²Ρ‹Π²ΠΎΠ΄, Ρ‚Π°ΠΊΠΆΠ΅ сокращСнный, выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

$ ./memory3

Now allocated 1 Megabytes

...

Now allocated 1535 Megabytes

Now allocated 1536 Megabytes

Out of Memory: Killed process 2365

Killed

ПослС этого ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Она выполняСтся нСсколько сСкунд ΠΈ сущСствСнно замСдляСтся ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ, Ρ€Π°Π²Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ физичСской памяти Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ТСсткий диск. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выдСляла ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»Π° доступ ΠΊ области памяти, большСй ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ объСма физичСской памяти, которая Π±Ρ‹Π»Π° установлСна Π½Π° машинС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Π²ΠΎ врСмя написания этой Π³Π»Π°Π²Ρ‹. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², систСма Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ сСбя ΠΎΡ‚ этой довольно агрСссивной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ Π΅Π΅. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… систСмах ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΈΡ…ΠΎ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° функция malloc Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΠ°ΠΌΡΡ‚ΡŒ, выдСляСмая ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, управляСтся ядром систСмы Linux. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ, пытаСтся Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ· памяти, которая Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π°, ядро Linux Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ этот запрос.

Π‘Π½Π°Ρ‡Π°Π»Π° ядро ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ для удовлСтворСния запроса прилоТСния Π½Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° физичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ исчСрпана, ядро Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ свопинга ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Ρ‡ΠΊΠΈ. Π’ ОБ Linux это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ диска, выдСляСмая Π²ΠΎ врСмя инсталляции систСмы. Если Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с ОБ Windows, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ области свопинга Π² Linux Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΏΠΎΠ΄ΠΊΠ°Ρ‡ΠΊΠΈ Π² Windows. Но Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ОБ Windows ΠΏΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ Π½ΠΈ ΠΎ локальной, Π½ΠΈ ΠΎ глобальной динамичСской памяти (heap), Π½ΠΈ ΠΎ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… сСгмСнтах памяти β€” ядро Linux всС ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ для вас.

Π―Π΄Ρ€ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρƒ физичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ свопинга Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈΠ· памяти ΠΈΠ»ΠΈ записи Π² Π½Π΅Π΅ Π΄Π°Π½Π½Ρ‹Π΅ каТутся находящимися Π² физичСской памяти, Π³Π΄Π΅ Π±Ρ‹ ΠΎΠ½ΠΈ Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π½Π° самом Π΄Π΅Π»Π΅ ΠΏΠ΅Ρ€Π΅Π΄ вашСй ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π½ΠΈΠΌ.