-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Content-ID:
El 2010-02-02 a las 08:23 -0000, Camaleón escribió:
El Tue, 02 Feb 2010 00:36:42 +0100, Carlos E. R. escribió:
El 2010-02-01 a las 07:02 -0000, Camaleón escribió:
No hay ningún matiz que se escape ni la explicación está escrita en
algún lenguaje "oculto". La respuesta sólo admite /sí/ (un programa de
32 bits puede acceder a más de 2 GiB) o /no/ (un programa de 32 bits no
puede acceder a más de 2 GiB).
Acceder, sí. Direccionar, no.
Ya te ha costado.
Te recuerdo el origen de la discusión:
***
Hipótesis: en oS de 32 bits y 8 GiB, no mataría el sistema, al no poder
reservar más de 4 GiB por proceso >:-)
Con el "kernel-pae", lo dudo >>:-)
Precisamente con el pae. El sistema total puede pasar de los 4 gigas,
pero cada proceso no.
***
Un sistema con PAE y mediante mmap() *puede* pasar de los 4 GiB/proceso.
No te estaba diciendo más que eso. Cómo lo gestione el sistema operativo
es "transparente" para el proceso.
Sigues sin entenderlo :-(
En 32 bits (con PAE) puedes hacer estas cosas:
#include
#define TAM 2047*1024*1024-1
char b[TAM];
main()
{
printf("El tamaño de b es %u bytes (en %u registros de %i bytes)\n", sizeof(b), TAM, sizeof(char));
}
Y al ejecutarse responde:
El tamaño de b es 2146435071 bytes (en 2146435071 registros de 1 bytes)
Y no es posible aumentar el indice:
cer@nimrodel:~/bin/C> gcc hello.c
hello.c:9: warning: integer overflow in expression
hello.c:9: error: size of array ‘b’ is too large
hello.c: In function ‘main’:
hello.c:14: warning: integer overflow in expression
ni el tamaño del registro:
hello.c:9: error: size of array ‘b’ is too large
O puedo definir el arreglo así:
#include
#define TAM_LL 255*1024*1024-1
long long int a [TAM_LL];
long long int i;
main()
{
printf("El tamaño de a es %u bytes (en %u registros de %i bytes)\n", sizeof(a), TAM_LL, sizeof(i));
}
Y al ejecutarse responde:
El tamaño de a es 2139095032 bytes (en 267386879 registros de 8 bytes)
Y no es posible aumentar el tamaño, ni el indice, como antes. Tenemos un
limite de tamaño de 2 gigas. Es más, si creo dos arreglos, compila, pero
no ejecuta:
cer@nimrodel:~/bin/C> ./a.out
Killed
Lo máximo que puedo poner es:
#define TAM 2047*1024*1024-1
#define TAM2 896*1024*1024-1
char b[TAM];
char c[TAM2];
main()
{
printf("El tamaño de b es %u bytes (en %u registros de %i bytes)\n", sizeof(b), TAM, sizeof(char));
printf("El tamaño de c es %u\n", sizeof(c));
}
Puedo añadir una tercera variable:
char d[760000];
y en ese tamaño peta, con 740000 funciona:
cer@nimrodel:~/bin/C> gcc hello.c ; ./a.out
El tamaño de b es 2146435071 bytes (en 2146435071 registros de 1 bytes)
El tamaño de c es 939524095
El tamaño de d es 740000
Es decir, el tamaño máximo por variable es de 2 gigas, y por programa de
3. Y puedo direccionarlos:
b[15324]='b';
printf("compruebo que puedo direccionar %c\n", b[15324]);
Y, si pongo un bucle tonto:
for (ii=0;ii>>:-)
- --
Saludos
Carlos E. R.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.9 (GNU/Linux)
iEYEARECAAYFAkto4kUACgkQtTMYHG2NR9WVZQCcCns6BK+bLBYsSdbiYDl/KFkm
7osAoIqp9GxAVxwGudJquIXyZhPjpmcK
=3kve
-----END PGP SIGNATURE-----