사용자 삽입 이미지


#define _WIN32_WINNT 0x0501 // GetSystemTimes를 사용하기 위한 정의
#include <iostream>
#include <ctime> // 시간출력을 위한 헤더파일
#include <windows.h> // Windows API 함수를 위한 헤더파일
#include <conio.h> // kbhit(아무키나 누르면 종료)를 위한 헤더파일
using namespace std;
__int64 getCPU();
void Print_Current_Time();
int main()
{
 int jhs[9999], mm[10]; // jhs는 초단위 데이터를 위한 배열, mm을 버블정렬에 쓰일 배열
 int a, b, temp; // 버블정렬을 위한 인수
 for(int i=0; !_kbhit(); i++)
 {
  cout << "\n(" << i << ") ";// 1초마다 번호 매김
  Print_Current_Time();
  jhs[i]=getCPU(); // 현재 cpu사용률을 배열에 저장
  cout <<"[CPU Load: "<< jhs[i] <<"]";
 
  if(i>=9) // 10번째부터 최소값, 평균값, 최대값 계산
  {
   mm[0] = jhs[i-9];
   mm[1] = jhs[i-8];
   mm[2] = jhs[i-7];
   mm[3] = jhs[i-6];
   mm[4] = jhs[i-5];
   mm[5] = jhs[i-4];
   mm[6] = jhs[i-3];
   mm[7] = jhs[i-2];
   mm[8] = jhs[i-1];
   mm[9] = jhs[i];
   for(a=1; a<10; a++) // 버블정렬
   {
    for(b=10-1; b>=a; b--)
    {
     if(mm[b-1] > mm[b])
     {
      temp = mm[b-1];
      mm[b-1] = mm[b];
      mm[b] = temp;
     }
    }
   }
   cout << " - [Min : " << mm[0] << "]"; // 최소값
   cout << " - [Ave : " << (mm[0]+mm[1]+mm[2]+mm[3]+mm[4]+mm[5]+mm[6]+mm[7]+mm[8]+mm[9])/10 << "]";
   cout << " - [Max : " << mm[9] << "]"; // 최대값
  }
 }
 return 0;
}

// ********** getCPU 함수는 외국사이트에서 참조했습니당 **********************
__int64 getCPU(void) {
 FILETIME idleTime;   // ┐
 FILETIME kernelTime; // │ GetSystemTimes's parameter
 FILETIME userTime;   // ┘
 GetSystemTimes(&idleTime, &kernelTime, &userTime);
 DWORD kernel1_high = kernelTime.dwHighDateTime;  // In first kernel's HighDataTime
 DWORD kernel1_low = kernelTime.dwLowDateTime;    // In first kernel's LowDataTime
 DWORD user1_high = userTime.dwHighDateTime;      // In first user's HighDataTime
 DWORD user1_low = userTime.dwLowDateTime;        // In first user's LowDataTime
 DWORD idle1_high = idleTime.dwHighDateTime;      // In first idle's HighDataTime
 DWORD idle1_low = idleTime.dwLowDateTime;        // In first idle's LowDataTime
 DWORD high1 = kernel1_high + user1_high + idle1_high; // Add each first HighTime
 Sleep(1000); // 1000 is 1초
 GetSystemTimes(&idleTime, &kernelTime, &userTime);
 DWORD kernel2_high = kernelTime.dwHighDateTime;  // In second kernel's HighDataTime
 DWORD kernel2_low = kernelTime.dwLowDateTime;    // In second kernel's LowDataTime
 DWORD user2_high = userTime.dwHighDateTime;      // In second user's HighDataTime
 DWORD user2_low = userTime.dwLowDateTime;        // In second user's LowDataTime
 DWORD idle2_high = idleTime.dwHighDateTime;      // In second idle's HighDataTime
 DWORD idle2_low = idleTime.dwLowDateTime;        // In second idle's LowDataTime
 DWORD high2 = kernel2_high + user2_high + idle2_high; // Add each second HighTime
 DWORD high = high2 - high1; // differ to first HighTime and second HighTime
 __int64 kernel = kernel2_low - kernel1_low; // In used kernel time in 1 sec
 __int64 user = user2_low - user1_low;       // In used user time in 1 sec
 __int64 idle = idle2_low - idle1_low;       // in used idle time in 1 sec
 
 if(high) { // if high != 0
  if(high==1) { // many times tested -> high no more than 3
   kernel = (kernel/10)+10000000000; // ┐ Effection of "high & low" ex) high=2, low=100 -> 210 (& : connection operator)
   user = (user/10)+10000000000;     // │ Why 210 not 2100? : Because only compare to 3 values(kernel,user,idle) for get CPU rate
   idle = (idle/10)+10000000000;     // ┘  (ex> 100/210 = 1000/2100)
  }
  if(high==2) {
   kernel = (kernel/10)+20000000000;
   user = (user/10)+20000000000;
   idle = (idle/10)+20000000000;
  }
 }
 
 // get CPU rate
 // Why __int64?
 // Because DWORD < __int64 (compare to data size) / DWORD + DWORD -> sometimes overflow occurrence
 __int64 delta = ((user+kernel)-idle) * 100 / (user+kernel);
 return delta;
}

void Print_Current_Time()
{
 struct tm *st;
 time_t t;
 t = time(NULL); // t에 초단위의 시간이 저장됨
 st = localtime(&t); // 초단위의 시간을 구조체로 바꿈
 cout << st->tm_year+1900 << "."; // 1900을 더해야 서기년도가 표시됨
 cout << st->tm_mon+1 << "."; // 1월=0, 2월=1 이기 때문에 +1을 해야됨
 cout << st->tm_mday << " ";
 cout << st->tm_hour << ":";
 cout << st->tm_min << ":";
 cout << st->tm_sec << " - ";
}


매 초마다 현재 CPU 사용률입니다.
기본적으로 무한루프이고, 아무키나 누르면 빠져나옵니다.

10번째 출력부터 최근 10개의 최소값, 평균값, 최대값을 출력합니다.


p.s
고려대학교 컴퓨터정보학과, 운영체제 듣고 있는 학생들 졸라 똥줄 타죠...
이번 숙제는, 제가 지능형웹서비스 숙제하느라 뒤질뻔해서 시간이 너무많이 부족했습니다...
그래서 아예 시작을 늦게하느라
마감기한을 넘기지 않으려고 시간없어서 부랴부랴 main문 안에다가 대충 처박았습니다.

더 좋은 프로그램을 만들고 싶다면
각 기능들(버블소트 등...)을 함수로 따로 만들면 좋을 것 같습니다.
그리고 버블소트가 가장 간단해서 버블소트로 했는데, 퀵소트 같은것들로 바꿔도 좋은 방법이겠지요



마지막으로 다른 학생들에게 이 소스가 똥줄타는 가슴에 촉촉하게 스며드는 단비가 되길 바랍니다
Posted by 정훈승