2011-11-22 31 views
40

Đôi khi, việc sử dụng một bộ nhớ tĩnh lớn có thể giúp bạn tạo ra một thứ gì đó với một chương trình C nhỏ. Tôi nhận thấy sau khi chuyển sang Fedora 15, chương trình mất thời gian dài để biên dịch. Chúng ta đang nói 30s so với 0.1s. Ngạc nhiên hơn nữa là ld (liên kết ) đã tối đa CPU và từ từ bắt đầu ăn tất cả bộ nhớ có sẵn . Sau khi một số khó khăn tôi quản lý để tìm một mối tương quan giữa vấn đề mới này và kích thước của tập tin hoán đổi của tôi . Dưới đây là một chương trình ví dụ cho các mục đích của cuộc thảo luận này:Hiệu suất của trình liên kết liên quan đến không gian hoán đổi?

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#define M 1000000 
#define GIANT_SIZE (200*M) 

size_t g_arr[GIANT_SIZE]; 

int main(int argc, char **argv){ 
    int i; 
    for(i = 0; i<10; i++){ 
     printf("This should be zero: %d\n",g_arr[i]); 
    } 
    exit(1); 
} 

Chương trình này có một mảng khổng lồ trong đó có một kích thước tuyên bố khoảng 200 * 8MB = 1.6GB bộ nhớ tĩnh. Biên soạn chương trình này có một lượng quá nhiều thời gian:

[[email protected]]$ time gcc HugeTest.c 

real 0m12.954s 
user 0m6.995s 
sys 0m3.890s 

[[email protected]]$ 

13s Đối với một ~ 13 dòng chương trình C !? Điều đó không đúng. Số khóa là kích thước của không gian bộ nhớ tĩnh. Ngay sau khi nó lớn hơn không gian hoán đổi tổng cộng , nó bắt đầu biên dịch lại nhanh chóng. Ví dụ, tôi có 5.3GB không gian trao đổi, vì vậy thay đổi GIANT_SIZE tới (1000 * M) cho gian sau:

[[email protected]]$ time gcc HugeTest.c 

real 0m0.087s 
user 0m0.026s 
sys 0m0.027s 

Ah, đó là giống như nó! Để tiếp tục thuyết phục bản thân mình (và chính mình, nếu bạn đang cố gắng ở nhà) không gian hoán đổi đó thực sự là số ma thuật , tôi đã thử thay đổi không gian hoán đổi có sẵn thành một số lớn thực sự là 19GB và cố gắng biên dịch (1000 * M) phiên bản một lần nữa:

[[email protected]]$ ls -ali /extraswap 
5986 -rw-r--r-- 1 root root 14680064000 Jul 26 15:01 /extraswap 
[[email protected]]$ sudo swapon /extraswap 
[[email protected]]$ time gcc HugeTest.c 

real 4m28.089s 
user 0m0.016s 
sys 0m0.010s 

Nó thậm chí không hoàn thành sau 4,5 phút!

Rõ ràng mối liên kết đang làm điều gì đó sai ở đây, nhưng tôi không biết cách để làm việc xung quanh việc này ngoài viết lại chương trình hoặc gây rối xung quanh với không gian hoán đổi. Tôi rất muốn biết nếu có một giải pháp, hoặc nếu tôi đã vấp phải một số lỗi phức tạp.

Nhân tiện, các chương trình đều biên dịch và chạy một cách chính xác, độc lập với mọi hoạt động trao đổi.

Để tham khảo, dưới đây là một số thông tin có thể có liên quan:

[]$ ulimit -a 

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 27027 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 1024 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

[]$ uname -r 

2.6.40.6-0.fc15.x86_64 

[]$ ld --version 

GNU ld version 2.21.51.0.6-6.fc15 20110118 
Copyright 2011 Free Software Foundation, Inc. 
This program is free software; you may redistribute it under the terms of 
the GNU General Public License version 3 or (at your option) a later version. 
This program has absolutely no warranty. 

[]$ gcc --version 

gcc (GCC) 4.6.1 20110908 (Red Hat 4.6.1-9) 
Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

[]$ cat /proc/meminfo 
MemTotal:  3478272 kB 
MemFree:   1749388 kB 
Buffers:   16680 kB 
Cached:   212028 kB 
SwapCached:  368056 kB 
Active:   489688 kB 
Inactive:   942820 kB 
Active(anon):  401340 kB 
Inactive(anon): 803436 kB 
Active(file):  88348 kB 
Inactive(file): 139384 kB 
Unevictable:   32 kB 
Mlocked:    32 kB 
SwapTotal:  19906552 kB 
SwapFree:  17505120 kB 
Dirty:    172 kB 
Writeback:    0 kB 
AnonPages:  914972 kB 
Mapped:   60916 kB 
Shmem:    1008 kB 
Slab:    55248 kB 
SReclaimable:  26720 kB 
SUnreclaim:  28528 kB 
KernelStack:  3608 kB 
PageTables:  63344 kB 
NFS_Unstable:   0 kB 
Bounce:    0 kB 
WritebackTmp:   0 kB 
CommitLimit: 21645688 kB 
Committed_AS: 11208980 kB 
VmallocTotal: 34359738367 kB 
VmallocUsed:  139336 kB 
VmallocChunk: 34359520516 kB 
HardwareCorrupted:  0 kB 
AnonHugePages: 151552 kB 
HugePages_Total:  0 
HugePages_Free:  0 
HugePages_Rsvd:  0 
HugePages_Surp:  0 
Hugepagesize:  2048 kB 
DirectMap4k:  730752 kB 
DirectMap2M:  2807808 kB 

TL; DR: Khi (lớn) bộ nhớ tĩnh của chương trình ac là hơi ít hơn so với không gian hoán đổi có sẵn, các mối liên kết sẽ mãi mãi để liên kết chương trình. Tuy nhiên, nó khá linh hoạt khi không gian tĩnh hơi nhỏ hơn lớn hơn so với không gian hoán đổi có sẵn. Có chuyện gì thế !?

+0

Sao y câu hỏi này: http://stackoverflow.com/questions/4978664/long-compilation-time-for-program-with-static-allocation –

+1

@praetoriandroid Tuyệt vời tìm thấy, tôi xin lỗi tôi không thấy rằng sớm hơn. Câu trả lời trong câu hỏi đó giải thích lý do tại sao điều này có thể xảy ra, nhưng tôi sẽ chỉ ra điều gì đó hơn nữa mà câu hỏi của tôi ngụ ý - tại sao nó lại liên kết quá lớn so với không gian hoán đổi có sẵn? – Rooke

+0

@Rooke: Có vẻ như khi không có đủ không gian hoán đổi, việc phân bổ toàn bộ đối tượng thất bại và trình liên kết rơi ngược lại trên một phương thức khác thực sự chạy nhanh hơn (do không nhúng vào trao đổi). – caf

Trả lời

23

Tôi có thể tạo lại phiên bản này trên hệ thống Ubuntu 10.10 (GNU ld (GNU Binutils for Ubuntu) 2.20.51-system.20100908) và tôi nghĩ rằng tôi có câu trả lời của bạn. Đầu tiên, một số phương pháp luận.

Sau khi xác nhận điều này xảy ra với tôi trong một máy ảo nhỏ (512MB ram, 2GB trao đổi), từ đây tôi quyết định điều dễ nhất là làm strcc gcc và xem chính xác những gì đang xảy ra khi mọi thứ đến địa ngục:

~# strace -f gcc swap.c 

nó được chiếu sáng như sau:

vfork()         = 3589 
[pid 3589] execve("/usr/lib/gcc/x86_64-linux-gnu/4.4.5/collect2", ["/usr/lib/gcc/x86_64-linux-gnu/4."..., "--build-id", "--eh-frame-hdr", "-m", "elf_x86_64", "--hash-style=gnu", "-dynamic-linker", "/lib64/ld-linux-x86-64.so.2", "-o", "swap", "-z", "relro", "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., ...], [/* 26 vars */]) = 0 

... 

[pid 3589] vfork()      = 3590 

... 

[pid 3590] execve("/usr/bin/ld", ["/usr/bin/ld", "--build-id", "--eh-frame-hdr", "-m", "elf_x86_64", "--hash-style=gnu", "-dynamic-linker", "/lib64/ld-linux-x86-64.so.2", "-o", "swap", "-z", "relro", "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., ...], [/* 27 vars */]) = 0  

... 

[pid 3590] lseek(13, 4096, SEEK_SET) = 4096 
[pid 3590] read(13, ".\[email protected]\0\0\0\0\0>\[email protected]\0\0\0\0\0N\[email protected]\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 
[pid 3590] mmap(NULL, 1600004096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1771931000 
<system comes to screeching halt> 

nó sẽ xuất hiện, như chúng ta có thể nghi ngờ, có vẻ như ld là thực sự cố gắng để nặc danh mmap toàn bộ không gian bộ nhớ tĩnh của mảng này (hoặc có thể e ntire chương trình, thật khó để nói kể từ khi phần còn lại của chương trình là quá nhỏ, nó có thể tất cả phù hợp trong đó thêm 4096).

Vì vậy, đó là tất cả tốt và tốt, nhưng tại sao nó hoạt động khi chúng tôi vượt quá hoán đổi có sẵn trên hệ thống? Chúng ta hãy quay swapoff và chạy strace -f một lần nữa ...

[pid 3618] lseek(13, 4096, SEEK_SET) = 4096 
[pid 3618] read(13, ".\[email protected]\0\0\0\0\0>\[email protected]\0\0\0\0\0N\[email protected]\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 
[pid 3618] mmap(NULL, 1600004096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory) 
[pid 3618] brk(0x60638000)    = 0x1046000 
[pid 3618] mmap(NULL, 1600135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory) 
[pid 3618] mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7fd011864000 

... 

ngạc nhiên, ld dường như làm điều tương tự nó đã cố gắng lần cuối cùng, để mmap toàn bộ không gian. nhưng hệ thống không còn có thể làm điều đó, nó không thành công! ld cố gắng một lần nữa, và nó thất bại một lần nữa, sau đó ld làm một cái gì đó bất ngờ ... nó di chuyển trên với bộ nhớ ít hơn.

Lạ lùng, tôi đoán chúng ta nên xem xét the ld code sau đó. Drat, nó không làm rõ ràng mmap. Điều này phải đến từ bên trong của một đồng bằng cũ malloc. Chúng tôi sẽ phải xây dựng ld với một số biểu tượng gỡ lỗi để theo dõi điều này. Thật không may, khi tôi xây dựng bin-utils 2.21.1 vấn đề đã biến mất. Perhap nó đã được cố định trong phiên bản mới hơn của bin-utils?

+0

Đây chính là điều tôi muốn biết, cảm ơn bạn! Tôi sẽ làm một số điều tra thứ hai, vì vậy hãy tha thứ một chút chậm trễ với phần thưởng. Thật vậy, "với thư viện GNU C, malloc bao gồm tự động sử dụng mmap khi thích hợp" mà tôi tin là 2MB hoặc hơn (tôi quên nơi tôi nhận được con số đó, tha thứ cho tôi). http://www.gnu.org/s/hello/manual/libc/Memory_002dmapped-I_002fO.html – Rooke

0

Tôi không quan sát hành vi này (với Debian/Sid/AMD64 trên máy tính để bàn 8Gb, gcc 4.6.2, binutils vàng ld (GNU Binutils cho Debian 2.22) 1.11). Đây là chương trình đã thay đổi (hiển thị bản đồ bộ nhớ của nó với pmap).

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#define M 1000000 
#define GIANT_SIZE (2000*M) 
size_t g_arr[GIANT_SIZE]; 
int main(int argc, char **argv){ 
    int i; 
    char cmd[80]; 
    for(i = 0; i<10; i++){ 
     printf("This should be zero: %d\n",g_arr[i*1000]); 
    } 
    sprintf (cmd, "pmap %d", (int)getpid()); 
    system(cmd); 
    exit(0); 
} 

Dưới đây là tổng hợp của nó:

% time gcc -v -O big.c -o big 
Using built-in specs. 
COLLECT_GCC=/usr/bin/gcc-4.6.real 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.2-4' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.6.2 (Debian 4.6.2-4) 
COLLECT_GCC_OPTIONS='-v' '-O' '-o' 'big' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-linux-gnu/4.6/cc1 -quiet -v -imultilib . -imultiarch x86_64-linux-gnu big.c -quiet -dumpbase big.c -mtune=generic -march=x86-64 -auxbase big -O -version -o /tmp/ccWThBP5.s 
GNU C (Debian 4.6.2-4) version 4.6.2 (x86_64-linux-gnu) 
    compiled by GNU C version 4.6.2, GMP version 5.0.2, MPFR version 3.1.0, MPC version 0.9 
warning: MPFR header version 3.1.0 differs from library version 3.1.0-p3. 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" 
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc/x86_64-linux-gnu/4.6/include 
/usr/local/include 
/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed 
/usr/include/x86_64-linux-gnu 
/usr/include 
End of search list. 
GNU C (Debian 4.6.2-4) version 4.6.2 (x86_64-linux-gnu) 
    compiled by GNU C version 4.6.2, GMP version 5.0.2, MPFR version 3.1.0, MPC version 0.9 
warning: MPFR header version 3.1.0 differs from library version 3.1.0-p3. 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
Compiler executable checksum: 4b128876859f8f310615c7040fa3cb67 
COLLECT_GCC_OPTIONS='-v' '-O' '-o' 'big' '-mtune=generic' '-march=x86-64' 
as --64 -o /tmp/ccm7905b.o /tmp/ccWThBP5.s 
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../:/lib/:/usr/lib/ 
COLLECT_GCC_OPTIONS='-v' '-O' '-o' 'big' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-linux-gnu/4.6/collect2 --build-id --no-add-needed --eh-frame-hdr -m elf_x86_64 --hash-style=both -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o big /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. /tmp/ccm7905b.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o 
gcc -v -O big.c -o big 0.07s user 0.01s system 90% cpu 0.089 total 

và thực hiện của nó:

% time ./big 
This should be zero: 0 
This should be zero: 0 
This should be zero: 0 
This should be zero: 0 
This should be zero: 0 
This should be zero: 0 
This should be zero: 0 
This should be zero: 0 
This should be zero: 0 
This should be zero: 0 
8835: ./big 
0000000000400000  4K r-x-- /home/basile/tmp/big 
0000000000401000  4K rw--- /home/basile/tmp/big 
0000000000402000 15625000K rw--- [ anon ] 
00007f2d15a44000 1512K r-x-- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f2d15bbe000 2048K ----- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f2d15dbe000  16K r---- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f2d15dc2000  4K rw--- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f2d15dc3000  20K rw--- [ anon ] 
00007f2d15dc8000 124K r-x-- /lib/x86_64-linux-gnu/ld-2.13.so 
00007f2d15fb4000  12K rw--- [ anon ] 
00007f2d15fe4000  12K rw--- [ anon ] 
00007f2d15fe7000  4K r---- /lib/x86_64-linux-gnu/ld-2.13.so 
00007f2d15fe8000  4K rw--- /lib/x86_64-linux-gnu/ld-2.13.so 
00007f2d15fe9000  4K rw--- [ anon ] 
00007ffff5b5b000 132K rw--- [ stack ] 
00007ffff5bff000  4K r-x-- [ anon ] 
ffffffffff600000  4K r-x-- [ anon ] 
    total   15628908K 
./big 0.00s user 0.00s system 0% cpu 0.004 total 

Tôi tin rằng cài đặt một GCC gần đây (ví dụ như một GCC 4.6) với vàng binutils linker là quan trọng đối với các chương trình như vậy.

Tôi không nghe thấy bất kỳ trao đổi nào có liên quan.

+0

Lưu ý rằng tôi đã hỏi tối ưu hóa '-O' cơ bản. –

+0

Nhưng ngay cả khi không có bất kỳ tối ưu hóa, việc biên dịch và chạy vẫn gần như tức thời. –

+0

Cảm ơn bạn đã thử nghiệm điều này, Basile. Hãy nhớ rằng tôi không quan tâm đến các đặc tính thời gian chạy như tôi với lý do tại sao người liên kết quyết định làm những việc nhất định. Việc biên dịch cài đặt này với cài đặt GIANT_SIZE (2000 * M) của bạn cũng linh hoạt trên hộp của tôi. Điều quan trọng là cố gắng để thiết lập kích thước của mảng cho một cái gì đó chỉ dưới tổng kích thước * swap *. Cũng lưu ý phiên bản binutils của tôi là 2.21.51.0.6-6.fc15, mà tôi tin rằng bao gồm cái gọi là liên kết vàng.Tôi không biết nếu nó thực sự được sử dụng, mặc dù. – Rooke

1

tôi bị tra tấn thử nghiệm OpenSuse tôi 11,4 (sẽ cho 12,1 trong một tuần)

Tôi có 4GiB ram + 2GiB hoán đổi và không để ý nghiêm trọng làm chậm, hệ thống có thể làm dơ bẩn vào những thời điểm, nhưng vẫn là thời gian biên dịch Ngắn.

Dài nhất là 6 giây trong khi hoán đổi mạnh.

[[email protected] ~]$ free -m 
      total  used  free  shared buffers  cached 
Mem:   3456  3426   30   0   4  249 
-/+ buffers/cache:  3172  284 
Swap:   2055  1382  672 
[[email protected] ~]$ time cc -Wall -O test2.c 
test2.c: In function ‘main’: 
test2.c:13:2: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘size_t’ 

real 0m6.501s 
user 0m0.101s 
sys  0m0.078s 
[[email protected] ~]$ free -m 
      total  used  free  shared buffers  cached 
Mem:   3456  3389   67   0   5  289 
-/+ buffers/cache:  3094  362 
Swap:   2055  1455  599 
[[email protected] ~]$ free -m 
      total  used  free  shared buffers  cached 
Mem:   3456  3373   82   0   4  264 
-/+ buffers/cache:  3104  352 
Swap:   2055  1442  612 
[[email protected] ~]$ time cc -Wall -O test2.c 
test2.c: In function ‘main’: 
test2.c:13:2: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘size_t’ 

real 0m1.122s 
user 0m0.086s 
sys  0m0.045s 
[[email protected] ~]$ time cc -Wall -O test2.c 
test2.c: In function ‘main’: 
test2.c:13:2: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘size_t’ 

real 0m0.095s 
user 0m0.047s 
sys  0m0.032s 
[[email protected] ~]$ free -m 
      total  used  free  shared buffers  cached 
Mem:   3456  3376   79   0   4  252 
-/+ buffers/cache:  3119  336 
Swap:   2055  1436  618 
[[email protected] ~]$ time cc -Wall -O test2.c 
test2.c: In function ‘main’: 
test2.c:13:2: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘size_t’ 

real 0m0.641s 
user 0m0.054s 
sys  0m0.040s 

Giữa chạy Tôi đã tải và dỡ bỏ Virtualbox Box VM, Eclipse, tệp pdf lớn, mi firefox một mình bằng 800+ MiB. Tôi didi không đi giới hạn, nếu không nhiều ứng dụng sẽ bị hệ điều hành giết. Nó có một sở thích cho giết Firefox .. :-)

Tôi cũng đã đi đến Định nghĩa cực đoan:

#define M 1048576 
#define GIANT_SIZE (20000*M) 

và thậm chí sau đó không có gì thay đổi đáng kể.

[[email protected] ~]$ time cc -Wall -O test2.c 
test2.c:7:14: warning: integer overflow in expression 
test2.c:7:8: error: size of array ‘g_arr’ is negative 
test2.c:7:1: warning: variably modified ‘g_arr’ at file scope 
test2.c: In function ‘main’: 
test2.c:13:2: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘size_t’ 

real 0m0.661s 
user 0m0.043s 
sys  0m0.031s 

Edit: tôi đang thử nghiệm sử dụng Fedora16 trên một máy ảo với 512MiB RAM và 1.5GiB hoán đổi, và những thứ tương tự, ngoại trừ một thông báo lỗi trên "phiên bản căng thẳng tối đa" của tôi, nơi 20000 MB đã được giao cho các mảng. Lỗi nói kích thước mảng là số âm.

[[email protected] ~]$ time gcc -Wall test2.c 
test2.c:7:14: warning: integer overflow in expression [-Woverflow] 
test2.c:7:8: error: size of array ‘g_arr’ is negative 
test2.c:7:1: warning: variably modified ‘g_arr’ at file scope [enabled by default] 
test2.c: In function ‘main’: 
test2.c:13:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘size_t’ [-Wformat] 

real 0m1.053s 
user 0m0.050s 
sys  0m0.137s 

Phản hồi tương tự xảy ra trong máy ảo 12.1 mở. Việc cài đặt Fedora 16 verry chậm và thiếu bộ nhớ (trong khi cài đặt tôi phải sử dụng 800MiB so với OpenSuse 512 MiB), tôi không thể sử dụng swapoff trên Fedora vì nó đang sử dụng rất nhiều không gian hoán đổi. Tôi đã không chậm chạp cũng không phải vấn đề bộ nhớ trên OpenSuse 12.1 và. Cả hai đều có cùng phiên bản hạt nhân, gcc, v.v. Cả hai đều sử dụng lượt cài đặt cổ phiếu với KDE làm môi trường Desktop

Tôi không thể tạo lại vấn đề cho bạn, Có thể là vấn đề liên quan đến gcc. Thử tải xuống phiên bản cũ hơn 4.5 và xem điều gì xảy ra

Các vấn đề liên quan