C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

1プロセスあたりの共有メモリ数上限 /ホエホエ (17/04/11(Tue) 18:06) #83820
Re[1]: 1プロセスあたりの共有メモリ数上限 /774RR (17/04/12(Wed) 10:51) #83821
  └ Re[2]: 1プロセスあたりの共有メモリ数上限 /ホエホエ (17/04/12(Wed) 17:36) #83826
    └ Re[3]: 1プロセスあたりの共有メモリ数上限 /ニートプログラマ (17/04/12(Wed) 18:10) #83828


親記事 / ▼[ 83821 ]
■83820 / 親階層)  1プロセスあたりの共有メモリ数上限
□投稿者/ ホエホエ (6回)-(2017/04/11(Tue) 18:06:32)

分類:[C/C++] 

いつもお世話になっておりますm(_ _)m

タイトル通りなんですが、2つのプログラム間で共有メモリにて
データの受け渡ししたいのですが、2000バイトほどの共有メモリを
ある一定数(31500〜31900ぐらい)を超過すると作成できなくなってしまいます。

作成できなくなったのと同サイズの大きな共有メモリを1つ作成するのは
特に問題ないため、共有メモリ領域自体の数に上限あるのかな?と
思っているのですが、どうでしょうか?

ちなみに共有メモリの作成にはWIN32APIのCreateFileMappingおよび
MapViewOfFileを使用しています。

ご存知の方、ぜひ教えてください。

動作環境
OS:Windows7 32bit
言語:VisualStudio2010 VC++MFC
CPU:Core i5
メモリ:4GB
HDD:250GB
[ □ Tree ] 返信 編集キー/

▲[ 83820 ] / ▼[ 83826 ]
■83821 / 1階層)  Re[1]: 1プロセスあたりの共有メモリ数上限
□投稿者/ 774RR (506回)-(2017/04/12(Wed) 10:51:05)
ソースや GetLastError() の値の提示がないから判断できないけど、
あなたのプログラムのどこかがバグってるんだろう。

ウチの sandbox 用 XPSP3 32bit 物理メモリ 2.5G のマシンで下記コードはエラー無く終了している

int _tmain()
{
    HANDLE h;
    int n;
    for (n=0; n<500000; ++n) {
        h=CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 3192, 0);
        if (h==INVALID_HANDLE_VALUE) {
            _tprintf(_T("n=%d e=%d\n"), n, GetLastError());
            return 0;
        }
        MapViewOfFileEx(h, FILE_MAP_WRITE, 0, 3192, 0, 0);
    }
    return 0; // ここでブレイクして
}

プロセスのメモリ使用量 1216KiB ハンドル数 500013
システム全体での PF 使用量 2.25GiB コミットチャージ 2360036 KiB
ってとこか。


[ 親 83820 / □ Tree ] 返信 編集キー/

▲[ 83821 ] / ▼[ 83828 ]
■83826 / 2階層)  Re[2]: 1プロセスあたりの共有メモリ数上限
□投稿者/ ホエホエ (7回)-(2017/04/12(Wed) 17:36:38)
774RRさん>
ご返信ありがとうございます。

私も774RRさんのコードとほぼ同じ状態だと問題ありませんでしたが、
生成するだけでなく、実際使用する(何らかのデータを入れておく)と
一定数作成した段階で作成できなくなってしまい、GetLastErrorの
エラーコードは8(ERROR_NOT_ENOUGH_MEMORY)となっています。

以下にコードを記載しておきます。

#define SHARE_MEM_NUM    60000
#define SHARE_MEM_SIZE   (2 * 1024)
int _tmain()
{
    HANDLE arMemHandle[SHARE_MEM_NUM];
    void*  arMemAddress[SHARE_MEM_NUM];
    DWORD dwLength = SHARE_MEM_SIZE;
    DWORD dwErrCode;

    for( int nIndex = 0; nIndex < SHARE_MEM_NUM; nIndex++ )
    {
        //共有メモリ作成
        arMemHandle[nIndex] = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, dwLength, TEXT("ShareTestMem") );

        //作成成功?
        if( arMemHandle[nIndex] != NULL )
        {
            //共有メモリ割付
            arMemAddress[nIndex] = MapViewOfFile(arMemHandle[nIndex], FILE_MAP_ALL_ACCESS,0,0,0);
        }
        else
        {
            arMemAddress[nIndex] = NULL;
        }

        //作成成功&割付成功?
        if( arMemAddress[nIndex] != NULL )
        {
            //共有メモリエリアをゼロで初期化しておく
            ZeroMemory( arMemAddress[nIndex], dwLength );
        }
        else
        {
            //エラー取得
            dwErrCode = GetLastError();
            break;
        }
    }
    return 0;
}

[ 親 83820 / □ Tree ] 返信 編集キー/

▲[ 83826 ] / 返信無し
■83828 / 3階層)  Re[3]: 1プロセスあたりの共有メモリ数上限
□投稿者/ ニートプログラマ (3回)-(2017/04/12(Wed) 18:10:52)
プログラムは期待されたようにではなく
書かれたように動く

の典型ですな。バグってますよ。


[ 親 83820 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -