munmaptest.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include <NdbOut.hpp>
  15. #include <NdbThread.h>
  16. #include <NdbMutex.h>
  17. #include <NdbCondition.h>
  18. #include <NdbSleep.h>
  19. #include <NdbTick.h>
  20. #include <NdbEnv.h>
  21. #include <NdbHost.h>
  22. #include <NdbMain.h>
  23. #include <getarg.h>
  24. struct ThreadData
  25. {
  26.   char * mapAddr;
  27.   Uint32 mapSize;
  28.   Uint32 chunk;
  29.   Uint32 idx;
  30.   
  31. };
  32. long long getMilli();
  33. long long getMicro();
  34. void* mapSegment(void * arg);
  35. void* unmapSegment(void * arg);
  36. void* mapSegment(void * arg) {
  37.   
  38.   ThreadData * threadArgs;
  39.   long long start=0;
  40.   int total=0;
  41.   int id = *(int *)arg;
  42.   threadArgs = new ThreadData [1];
  43.   Uint32 size=5*1024*1024;
  44.   struct NdbThread* unmapthread_var;
  45.   void *status = 0;  
  46.   int run = 1;
  47.   int max=0, min =100000000, sum=0;
  48.   while(run < 1001) {
  49.     start=getMicro(); 
  50.     char * ptr =(char*) mmap(0, 
  51.      size, 
  52.      PROT_READ|PROT_WRITE, 
  53.      MAP_PRIVATE|MAP_ANONYMOUS, 
  54.      0,
  55.      0);
  56.     total=(int)(getMicro()-start);
  57.     
  58.     ndbout << "T"  << id << ": mmap took : " << total << " microsecs. " 
  59.    << " Run: " << run ;
  60.     ndbout_c(" mapped @ %p n", ptr);
  61.     
  62.     if(total>max)
  63.       max = total;
  64.     if(total<min)
  65.       min=total;
  66.     
  67.     sum+=total;
  68.     
  69.     if(ptr<0) {
  70.       ndbout << "failed to mmap!" << endl;
  71.       exit(1);
  72.     }
  73.     
  74.     threadArgs[0].mapAddr = (char *)ptr;
  75.     threadArgs[0].mapSize = size;
  76.     threadArgs[0].chunk = 4096;
  77.     threadArgs[0].idx = 0;
  78.     
  79.     
  80.     for(Uint32 j=0; j<size; j=j+4096)
  81.       ptr[j]='1';
  82.     
  83.     unmapthread_var = NdbThread_Create(unmapSegment, // Function 
  84.        (void**)&threadArgs[0],// Arg
  85.        32768,        // Stacksize
  86.        (char*)"unmapthread",  // Thread name
  87.        NDB_THREAD_PRIO_MEAN); // Thread prio
  88.     
  89.     
  90.     if(NdbThread_WaitFor(unmapthread_var, &status) != 0) {
  91.       ndbout << "test failed - exitting " << endl;
  92.       exit(1);
  93.     }
  94.     run++;
  95.   }
  96.   
  97.   ndbout << "MAX: " << max << " MIN: " << min;
  98.   float mean = (float) ((float)sum/(float)run);
  99.   ndbout_c(" AVERAGE: %2.5fn",mean);
  100. }
  101. void* unmapSegment(void * arg)
  102. {
  103.   
  104.   char * freeAddr;
  105.   char * mapAddr;
  106.   ThreadData * threadData = (ThreadData*) arg;
  107.   int start=0;
  108.   int total=0;
  109.   Uint32 mapSize = threadData->mapSize;
  110.   Uint32 chunk = threadData->chunk;
  111.   mapAddr = threadData->mapAddr;
  112.  
  113.   
  114.   
  115.   freeAddr = mapAddr+mapSize-chunk;
  116.   NdbSleep_MilliSleep(100);  
  117.   for(Uint32 i=0;i<mapSize; i = i+chunk) {
  118.     start=getMicro(); 
  119.     if(munmap(freeAddr, chunk) < 0){
  120.       ndbout << "munmap failed" << endl;
  121.       exit(1);
  122.     }
  123.     total=(int)(getMicro()-start);
  124.     freeAddr = freeAddr - chunk;
  125.     NdbSleep_MilliSleep(10);
  126.     ndbout << "unmap 4096 bytes : " << total << "microsecs" << endl;
  127.   }
  128.   return NULL;
  129. }
  130. static int trash;
  131. static int segmentsize=1;
  132. static struct getargs args[] = {
  133.   { "trash", 't', arg_integer, &trash,
  134.     "trash the memory before (1 to trash 0 to not trash)", "trash"},
  135.   { "segment", 's', arg_integer, &segmentsize,
  136.     "segment size (in MB)", "segment"},
  137. };
  138. static const int num_args = sizeof(args) / sizeof(args[0]);
  139. NDB_MAIN(munmaptest) {
  140.    
  141.   const char *progname = "munmaptest"; 
  142.   int optind = 0;
  143.   if(getarg(args, num_args, argc, argv, &optind)) {
  144.     arg_printusage(args, num_args, progname, "");
  145.     exit(1);
  146.   }
  147.   
  148.   int size;
  149.   char * ptr;
  150.   if(trash) {
  151.     for(int i=0; i<100; i++) {
  152.       size=1+(int) (10.0*rand()/(RAND_MAX+1.0));
  153.       NdbSleep_MilliSleep(10);
  154.       ptr =(char*) mmap(0, 
  155. size*1024*1024, 
  156. PROT_READ|PROT_WRITE, 
  157. MAP_PRIVATE|MAP_ANONYMOUS, 
  158. 0,
  159. 0);      
  160.       for(int i=0;i<(size*1024*1024); i=i+4096) {
  161. *(ptr+i)='1';
  162.       }
  163.       NdbSleep_MilliSleep(10);
  164.      
  165.       munmap(ptr,size);
  166.     }
  167.     
  168.     
  169.   }
  170.   int noThreads = 1;
  171.   struct NdbThread*  mapthread_var;
  172.   int id[noThreads];
  173.   void *status=0;
  174.   ThreadData * threadArgs = new ThreadData[noThreads];
  175.   for(int i=0; i < noThreads; i++) {
  176.     threadArgs[i].mapSize = segmentsize*1024*1024;
  177.     threadArgs[i].idx = i;
  178.     mapthread_var = NdbThread_Create(mapSegment, // Function
  179.      (void**)&threadArgs[i],// Arg
  180.      32768,        // Stacksize
  181.      (char*)"mapthread",  // Thread name
  182.      NDB_THREAD_PRIO_MEAN); // Thread prio
  183.     
  184.   }
  185.   
  186.   
  187.   if(NdbThread_WaitFor(mapthread_var, &status) != 0) {
  188.     ndbout << "test failed - exitting " << endl;
  189.     exit(1);
  190.   }
  191. }
  192. long long getMilli() {
  193.   struct timeval tick_time;
  194.   gettimeofday(&tick_time, 0);
  195.   return 
  196.     ((long long)tick_time.tv_sec)  * ((long long)1000) +
  197.     ((long long)tick_time.tv_usec) / ((long long)1000);
  198. }
  199. long long getMicro(){
  200.   struct timeval tick_time;
  201.   int res = gettimeofday(&tick_time, 0);
  202.   long long secs   = tick_time.tv_sec;
  203.   long long micros = tick_time.tv_usec;
  204.   
  205.   micros = secs*1000000+micros;
  206.   return micros;
  207. }