2010-11-29 4 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

Linuxおよび互換システムでは、おそらくmmap()を使用してコードスペースを割り当ててから、気分どおりのものを入力してください(おそらく1MBのNOP)あなたのコードスペースに追加されます。

1

C++メタプログラミングに触発された私は、Cプログラムから大きなCソースコードを生成すると考えました。 "max"変数を必要な関数の数に変更します。このコードをコンパイルして実行すると、largefile.cというCプログラムが作成されます。最適化をオフにしてこのプログラムをコンパイルします。生成されたprintfも削除することをお勧めします。それは、あなたが何をしたいのかに依存します。がんばろう!

#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; 
} 
2

ではなくCの組み立てすることができた場合:(としてGNUを使用して)

.text 
.space 0x7FFFFFFF 

私はあなたがプログラムを書きたいんなぜそれほど大きな

1

に行くお勧めしませんけれども大規模なコードセグメントでは、比較的大きなオープンソースソフトウェアのソースコードを借りることができます。コードセグメントのサイズはまともです。

0

マクロを使用して繰り返しコードの大きなセクションを生成することは可能です。例えば、以下は、大規模なコードセグメントとCプログラム(また、C++コンパイラでコンパイルすることができる)である。

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 
} 

これは、コード・セグメントのサイズにかなり正確な制御を与えます。例えば、私のシステムでは、main関数のサイズは15000006バイトです(それぞれDO_0は15バイトを生成します)。

P.S.ちょうどその質問が3年前に尋ねられたことに気づいた

関連する問題