[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:21933] 物理メモリサイズを取得する方法を教えて下さい



汐崎と申します。(長文失礼)
下記の様なプログラムで,PCに実装されているRAMの内,
ユーザプログラムから使えるサイズを取得したいのですが,
どうも,RAM領域を越えてしまいます。
64MBを持つPCで,実効しますと。
Linuxでは,SWAP分も加わるような傾向です。(約200MB)
FreeBSDでは,511MBが得られました。
出来れば,使用可能なRAMメモリだけに限定したいのですが,
ご教授頂けますでしょうか?

----以下はプログラムです----(約80行)
/* chk-ram2.c : check_ram_size in MB unit
Compile:
gcc -Wall -o chk-ram2-lx24 chk-ram2.c (linux)
gcc -Wall -o chk-ram2-fb47 chk-ram2.c (FreeBSD) 
*/
/* Memo: 
1. 1MB: 1024 * 1024 = 1,048,576 
2. calloc in FreeBSD. really get ram and clear
   ... very slow(at 64MB) ... high cost
3. gcc waring:(in FreeBSD)
   warning "this file includes <malloc.h> 
   which is deprecated, use <stdlib.h> instead"
4. tested with 64MB Machine
   in Linux: 
   RAM_size RAM(usable) + SWAP(usable) ?
   in FreeBSD ...511MB 
   it's larger than 64MB + Swap size ??
*/
#include <stdio.h>  /* stdin, printf, fflush */  
#include <string.h>
#include <ctype.h>  /* isdigit, */

#ifdef __linux__
#include <malloc.h>
/* use <stdlib.h> for malloc in FreeBSD */
#endif
#include <stdlib.h> /* exit, atexit, atoi, malloc, getenv, qsort, */

int check_ram_size(int n, int v);
void usage(void)
{
    printf("\n Usage: chk-ram ms v\n");
    printf("\n ms: expected max. memory_size in MB");
    printf("\n v : verbose level 0 to 1 \n");
    printf("\n refer results and comment at MEMO in chk-ram2.c ");
    exit(1);
}
int main(int argc, char **argv)
{
    int i;
    int ms, v;
    
    ms=1; v=0;

    if(argc==1) usage();
    if(argc>1) ms=atoi(argv[1]);
    if(argc>2) v =atoi(argv[2]);

    printf("\n command_line: ");
    for(i=0; i<argc; i++) printf("%s ", argv[i]);
    printf("\n chk-ram ms=%d, v=%d", ms, v);

    i = check_ram_size(ms, v);
    printf("\n check_ram_size (result): %d[MB]\n", i);
    return(0);
}

/***************************************/
int check_ram_size(int n, int v)
{
  char *p;
  int  i, f, g;
  f=g=0;
  for(i=1; i<=n; i++){
    g=0;
    p = (char *) malloc(1048576 * i);
    //p = (char *) calloc(i, 1048576); 
    /* very slow: high cost in FreeBSD */
    if(p) { g=1; free(p); } 
    if(p==NULL) {f=1; break;}
    if(v)printf("\n**chk_ram_size: malloc successed at size %3d[MB]", 
i);
  }
  if(v && f)printf("\n**chk_ram_size: malloc failed at %3d[MB]", i);
  //if(p)free(p);
  return(i-1);
}

- - -
汐崎:H.Shiozaki
E-Mail: sios_hs(at)ybb.ne.jp
URL: http://www.geocities.jp/sios_hp/
note: (at)部分を'@'に読替えてください。

Follow-Ups
[plamo:21934] Re: 物理メモリサイズを取得する方法を教えて下さい, Iwasa Dai
[plamo:21936] Re: 物理メモリサイズを取得する方法を教えて下さい, K.Kodama

[検索ページ] [メール一覧]
Plamo ML 公開システム