⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 munmaptest.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
字号:
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <ndb_global.h>#include <NdbOut.hpp>#include <NdbThread.h>#include <NdbMutex.h>#include <NdbCondition.h>#include <NdbSleep.h>#include <NdbTick.h>#include <NdbEnv.h>#include <NdbHost.h>#include <NdbMain.h>#include <getarg.h>struct ThreadData{  char * mapAddr;  Uint32 mapSize;  Uint32 chunk;  Uint32 idx;  };long long getMilli();long long getMicro();void* mapSegment(void * arg);void* unmapSegment(void * arg);void* mapSegment(void * arg) {    ThreadData * threadArgs;  long long start=0;  int total=0;  int id = *(int *)arg;  threadArgs = new ThreadData [1];  Uint32 size=5*1024*1024;  struct NdbThread* unmapthread_var;  void *status = 0;    int run = 1;  int max=0, min =100000000, sum=0;  while(run < 1001) {    start=getMicro();     char * ptr =(char*) mmap(0, 			     size, 			     PROT_READ|PROT_WRITE, 			     MAP_PRIVATE|MAP_ANONYMOUS, 			     0,			     0);    total=(int)(getMicro()-start);        ndbout << "T"  << id << ": mmap took : " << total << " microsecs. " 	   << " Run: " << run ;    ndbout_c(" mapped @ %p \n", ptr);        if(total>max)      max = total;    if(total<min)      min=total;        sum+=total;        if(ptr<0) {      ndbout << "failed to mmap!" << endl;      exit(1);    }        threadArgs[0].mapAddr = (char *)ptr;    threadArgs[0].mapSize = size;    threadArgs[0].chunk = 4096;    threadArgs[0].idx = 0;            for(Uint32 j=0; j<size; j=j+4096)      ptr[j]='1';        unmapthread_var = NdbThread_Create(unmapSegment, // Function 				       (void**)&threadArgs[0],// Arg				       32768,        // Stacksize				       (char*)"unmapthread",  // Thread name				       NDB_THREAD_PRIO_MEAN); // Thread prio            if(NdbThread_WaitFor(unmapthread_var, &status) != 0) {      ndbout << "test failed - exitting " << endl;      exit(1);    }    run++;  }    ndbout << "MAX: " << max << " MIN: " << min;  float mean = (float) ((float)sum/(float)run);  ndbout_c(" AVERAGE: %2.5f\n",mean);}void* unmapSegment(void * arg){    char * freeAddr;  char * mapAddr;  ThreadData * threadData = (ThreadData*) arg;  int start=0;  int total=0;  Uint32 mapSize = threadData->mapSize;  Uint32 chunk = threadData->chunk;  mapAddr = threadData->mapAddr;       freeAddr = mapAddr+mapSize-chunk;  NdbSleep_MilliSleep(100);    for(Uint32 i=0;i<mapSize; i = i+chunk) {    start=getMicro();     if(munmap(freeAddr, chunk) < 0){      ndbout << "munmap failed" << endl;      exit(1);    }    total=(int)(getMicro()-start);    freeAddr = freeAddr - chunk;    NdbSleep_MilliSleep(10);    ndbout << "unmap 4096 bytes : " << total << "microsecs" << endl;  }  return NULL;}static int trash;static int segmentsize=1;static struct getargs args[] = {  { "trash", 't', arg_integer, &trash,    "trash the memory before (1 to trash 0 to not trash)", "trash"},  { "segment", 's', arg_integer, &segmentsize,    "segment size (in MB)", "segment"},};static const int num_args = sizeof(args) / sizeof(args[0]);NDB_MAIN(munmaptest) {     const char *progname = "munmaptest";   int optind = 0;  if(getarg(args, num_args, argc, argv, &optind)) {    arg_printusage(args, num_args, progname, "");    exit(1);  }    int size;  char * ptr;  if(trash) {    for(int i=0; i<100; i++) {      size=1+(int) (10.0*rand()/(RAND_MAX+1.0));      NdbSleep_MilliSleep(10);      ptr =(char*) mmap(0, 			size*1024*1024, 			PROT_READ|PROT_WRITE, 			MAP_PRIVATE|MAP_ANONYMOUS, 			0,			0);            for(int i=0;i<(size*1024*1024); i=i+4096) {	*(ptr+i)='1';      }      NdbSleep_MilliSleep(10);           munmap(ptr,size);    }          }  int noThreads = 1;  struct NdbThread*  mapthread_var;  int id[noThreads];  void *status=0;  ThreadData * threadArgs = new ThreadData[noThreads];  for(int i=0; i < noThreads; i++) {    threadArgs[i].mapSize = segmentsize*1024*1024;    threadArgs[i].idx = i;    mapthread_var = NdbThread_Create(mapSegment, // Function				     (void**)&threadArgs[i],// Arg				     32768,        // Stacksize				     (char*)"mapthread",  // Thread name				     NDB_THREAD_PRIO_MEAN); // Thread prio      }      if(NdbThread_WaitFor(mapthread_var, &status) != 0) {    ndbout << "test failed - exitting " << endl;    exit(1);  }}long long getMilli() {  struct timeval tick_time;  gettimeofday(&tick_time, 0);  return     ((long long)tick_time.tv_sec)  * ((long long)1000) +    ((long long)tick_time.tv_usec) / ((long long)1000);}long long getMicro(){  struct timeval tick_time;  int res = gettimeofday(&tick_time, 0);  long long secs   = tick_time.tv_sec;  long long micros = tick_time.tv_usec;    micros = secs*1000000+micros;  return micros;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -