2010-11-29 2 views
2

큰 코드 세그먼트 크기 (적어도 일부 MB)를 갖는 C 프로그램이 필요합니다. 어떤 동작을 체크 아웃하고 싶습니다.큰 코드 섹션을 가진 C 프로그램을 작성하는 방법

실행 두 개의 프로세스 : 단지까지 먹는 :

프로세스 A : 시스템 RAM

프로세스 B에 거주 큰 코드 세그먼트 크기를 갖는 한 다음

는 시나리오 시스템 RAM (간단한 malloc + memset).

메모리가 고갈되기 전에 프로세스 A의 상주 세트 크기가 줄어들거나 일부 페이지가 스 와이프 아웃되는지 아닌지 확인하십시오. 간단한 프로그램을 작성하면 코드 세그먼트 크기가 1 페이지 (4KB)의 경계 내에 유지됩니다.

+4

이 작업을 수행 할 운영 체제를 지정해야합니다. – unwind

+2

숙제 태그가 없습니다. –

+3

@R - 아니요 - 메타 태그가 [공식적으로 죽었습니다] (http://blog.stackoverflow.com/2010/08/the-death-of-meta-tags/) – Justin

답변

1

C++로 작성하면 템플릿을 사용하여 조언 해 드릴 수 있습니다. 예를 들어

:

template <int i> 
struct PlainOfCode 
{ 
    template <int j> 
    static int Worker(int x) 
    { 
     return j^(x + i)^Worker<j-1>(x+j); 
    } 

    template <> 
    static int Worker<0>(int x) { return x; } 

    static int Batch(int x) 
    { 
     return PlainOfCode<i-1>::Batch(x)^Worker<i*i>(x); 
    } 
}; 

template <> 
struct PlainOfCode<0> 
{ 
    static int Batch(int x) 
    { 
     return x; 
    } 
}; 

// main 
int j = PlainOfCode<30>::Batch(GetTickCount()); 
if (25 != j) 
    GetTickCount(); 

이 (따라서 - 코드 크기) 막대한 음함수 카운트를 생성한다. 모든 최적화를 비활성화합니다.

+0

코드는 꽤 인상적이지만 g ++ 3.4.4에서는 컴파일하지 못했습니다. 그것은 : largecode.cc:10 : error : '>'token' 앞에 명시 적 전문화가 잘못되었습니다. –

1

리눅스 및 호환 시스템에서 mmap()을 사용하여 코드 공간을 할당 한 다음 기분이 어떤 것이 든 (어쩌면 단지 1MB의 NOP) 코드를 입력 한 다음 실제로 코드가 있는지 확인하십시오 코드 공간에 추가되었습니다.

1

C++ 메타 프로그래밍에서 영감을 얻은 저는 C 프로그램에서 큰 C 소스 코드를 생성한다고 생각했습니다. "최대"변수를 원하는 함수의 수만큼 변경하십시오. 이 코드를 컴파일하고 실행하면 largefile.c이라는 C 프로그램이 생성됩니다. 최적화가 해제 된 상태에서이 프로그램을 컴파일하십시오. 생성 된 printfs도 제거하는 것이 좋을지도 모르겠다. 행운을 빕니다! 대신 C의 조립 될 수있는 경우

#include <stdio.h> 

void writefunc(FILE *fp, int i) 
{ 
    fprintf(fp, "void f%d()\n{\n\tprintf(\"%d\\n\");\n\tf%d();\n}\n", i, i, i+1); 
} 

int main(int argc, char** argv) 
{ 
    FILE *fp = fopen("largecode.c", "w"); 
    int i; 
    int max = 100; 

    fprintf(fp, "#include<stdio.h>\n"); 

    fprintf(fp, "\nint f%d()\n{\n}\n", max + 1); 

    for (i = max; i > 0; i--) { 
     writefunc(fp, i); 
    } 

    fprintf(fp, "\nint main(int argc, char** argv){\n\tf1();\n}\n"); 

    fclose(fp); 

    return 0; 
} 
1

이 왜이 프로그램을 작성하고 싶어 꽤 큰 것 권하고 싶지 않다지만

.text 
.space 0x7FFFFFFF 

(같은 GNU를 사용하여) 큰 코드 세그먼트를 사용하면 상대적으로 큰 오픈 소스 소프트웨어의 소스 코드를 빌릴 수 있습니다. 코드 세그먼트 크기가 적절해야합니다.

0

매크로를 사용하여 반복적 인 코드의 큰 섹션을 생성 할 수 있습니다.

volatile int x; // "volatile" to forbid compiler optimization 

#define DO_0 ++x; 
#define DO_1 {DO_0; DO_0; DO_0; DO_0; DO_0; DO_0; DO_0; DO_0; DO_0; DO_0} 
#define DO_2 {DO_1; DO_1; DO_1; DO_1; DO_1; DO_1; DO_1; DO_1; DO_1; DO_1} 
#define DO_3 {DO_2; DO_2; DO_2; DO_2; DO_2; DO_2; DO_2; DO_2; DO_2; DO_2} 
#define DO_4 {DO_3; DO_3; DO_3; DO_3; DO_3; DO_3; DO_3; DO_3; DO_3; DO_3} 
#define DO_5 {DO_4; DO_4; DO_4; DO_4; DO_4; DO_4; DO_4; DO_4; DO_4; DO_4} 
#define DO_6 {DO_5; DO_5; DO_5; DO_5; DO_5; DO_5; DO_5; DO_5; DO_5; DO_5} 
#define DO_7 {DO_6; DO_6; DO_6; DO_6; DO_6; DO_6; DO_6; DO_6; DO_6; DO_6} 
#define DO_8 {DO_7; DO_7; DO_7; DO_7; DO_7; DO_7; DO_7; DO_7; DO_7; DO_7} 
#define DO_9 {DO_8; DO_8; DO_8; DO_8; DO_8; DO_8; DO_8; DO_8; DO_8; DO_8} 

int main() 
{ 
    DO_6; // do trivial stuff 1 million times 
} 

이것은 코드 세그먼트의 크기에 매우 정밀한 제어를 제공한다 : 예를 들어, 다음의 큰 코드 세그먼트와 C 프로그램 (또한, C의 ++ 컴파일러로 컴파일 될 수있다)이다. 예를 들어, 우리 시스템에서 main 함수의 크기는 15000006 바이트입니다 (각 DO_0은 15 바이트를 생성합니다).

P. 단지 3 년 전에 질문을 받았다는 것을 깨달았습니다.

관련 문제