system에서 1GB, application에서 3GB를 사용.

command창에서

bcdedit /set increaseuserva 3072

실행한 후 재부팅

 

이 방법은 Windows7 이상에서만 동작합니다.

 

http://msdn.microsoft.com/ko-kr/library/windows/desktop/bb613473%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ff542202.aspx

 

 

 

select *  from sys.procedures as p

inner join sys.dm_exec_procedure_stats as q

on p.object_id = q.object_id

 

SetThreadAffinityMask function

 

출처 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247(v=vs.85).aspx

 

Applies to: desktop apps only

Sets a processor affinity mask for the specified thread.

Syntax

C++
DWORD_PTR WINAPI SetThreadAffinityMask(
  _In_  HANDLE hThread,
  _In_  DWORD_PTR dwThreadAffinityMask
);

Parameters

hThread [in]

A handle to the thread whose affinity mask is to be set.

This handle must have the THREAD_SET_INFORMATION or THREAD_SET_LIMITED_INFORMATION access right and the THREAD_QUERY_INFORMATION or THREAD_QUERY_LIMITED_INFORMATION access right. For more information, see Thread Security and Access Rights.

Windows Server 2003 and Windows XP:  The handle must have the THREAD_SET_INFORMATION and THREAD_QUERY_INFORMATION access rights.
dwThreadAffinityMask [in]

The affinity mask for the thread.

On a system with more than 64 processors, the affinity mask must specify processors in the thread's current processor group.

Return value

If the function succeeds, the return value is the thread's previous affinity mask.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

If the thread affinity mask requests a processor that is not selected for the process affinity mask, the last error code is ERROR_INVALID_PARAMETER.

Remarks

A thread affinity mask is a bit vector in which each bit represents a logical processor that a thread is allowed to run on. A thread affinity mask must be a subset of the process affinity mask for the containing process of a thread. A thread can only run on the processors its process can run on. Therefore, the thread affinity mask cannot specify a 1 bit for a processor when the process affinity mask specifies a 0 bit for that processor.

Setting an affinity mask for a process or thread can result in threads receiving less processor time, as the system is restricted from running the threads on certain processors. In most cases, it is better to let the system select an available processor.

If the new thread affinity mask does not specify the processor that is currently running the thread, the thread is rescheduled on one of the allowable processors.

Requirements

Minimum supported client

Windows XP

Minimum supported server

Windows Server 2003

Header

WinBase.h (include Windows.h)

Library

Kernel32.lib

DLL

Kernel32.dll

See also

GetProcessAffinityMask
Multiple Processors
OpenThread
Process and Thread Functions
Processor Groups
SetProcessAffinityMask
SetThreadIdealProcessor
Threads

 

외부라이브러리 추가시 링크 에러가 발생한다면
다음 페이지 참조

http://msdn.microsoft.com/ko-kr/library/6wtdswk0(v=VS.100).aspx

 

vsprops 활용하기

개발 2010.02.04 15:59 |
_default.vsprops
_debug.vsprops
_release.vsprops

로 활용하기.

<?xml version="1.0" encoding="ks_c_5601-1987"?>
<VisualStudioPropertySheet
     ProjectType="Visual c++"
     ...
     InheritedPropertySheets="./default.vsprops"
     >
     <Tool
        ...
       />
     <UserMacro
        Name="TestDir"
        Value="$(ProjectDir)../Test" />
     <UserMacro
        Name="Test2Dir"
        Value="$(TestDir)/Test2" />
</VisualStudioPropertySheet>

* 윈도우 서비스 활용하기

* 주의
 - 서비스로 실행시 GetCurrentDirectory 는 "C:\WINDOWS\system32" 임.


* 적용
 1. 서비스 설치
 bool InstallService()
 {
   ...

   TCHAR stModuleFileName[_MAX_PATH] = {0,};
   ::GetModuleFileName(NULL, stModuleFileName, _MAX_PATH);
   // 초기 arg 값 필요시 stModuleFileName 추가 함.

   SC_HANDLE hSCManager;
   SC_HANDLE hService;

   hSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
   VERIFY_RETUN_VALUE(hSCManager != NULL, false);

   hService = ::CreateService(hSCManager
   , m_ServiceName.c_str()
   , m_ServiceName.c_str()
   , SERVICE_ALL_ACCESS
   , SERVICE_WIN32_OWN_PROCESS
   , SERVICE_DEMAND_START
   , SERVICE_ERROR_NORMAL
   , stModuleFileName
   , NULL
   , NULL
   , NULL
   , NULL
   , NULL);

   VERIFY_RETUN_VALUE(hService != NULL, false);
   ::CloseServiceHandle(hService);
  
   ...
  
   return true;
 }


 2. 서비스 삭제
 bool UnInstallService()
 {
   ...
  
   SC_HANDLE hSCManager;
   SC_HANDLE hService;
  
   hSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
   VERIFY_RETUN_VALUE(hSCManager != NULL, false);

   hService = ::OpenService(hSCManager
   , m_ServiceName.c_str()
    , SERVICE_ALL_ACCESS);
   VERIFY_RETUN_VALUE(hService != NULL, false);
   VERIFY_RETUN_VALUE(::DeleteService(hService), false);
 
   ::CloseServiceHandle(hService);
  
   ...
  
   return true;
 }

 3. 서비스 재설치
 bool ReInstallService()
 {
  ...
 }

 4. 실행 - _tmain 에서 직접 호출을 함.
 void RunService( LPSERVICE_MAIN_FUNCTION lpServiceStartMain, LPHANDLER_FUNCTION lpServiceCtrHandler )
 {
   ...
  
   // 현재의 디렉토리를 모듈의 디렉토리와 일치 시킴
   TCHAR stModuleFileName[_MAX_PATH] = {0,};
   TCHAR stFileName[_MAX_FNAME]      = {0,};
   TCHAR stDrive[_MAX_DRIVE]                = {0,};
   TCHAR stDirectory[_MAX_DIR]      = {0,};
   ::GetModuleFileName(NULL, stModuleFileName, _MAX_PATH);
   _tsplitpath_s( stModuleFileName
  , stDrive, _MAX_DRIVE
  , stDirectory, _MAX_DIR
  , stFileName, _MAX_FNAME
  , NULL, 0);

   TCHAR stModuleDirectory[_MAX_PATH] = {0,};
   _tmakepath_s(stModuleDirectory, _MAX_PATH
                , stDrive, stdirectory, NULL, NULL);
   ::SetCurrentDirectory(stModuleDirectory);

   ...

   SERVICE_TAVLE_ENTRY DispatchTable[] =
   {
     {m_ServiceName.c_str(), lpServiceStartMain},
     {NULL, NULL}
   };
  
   if (!::StartServiceCtrlDispatcher(DispatchTable))
   {
     // 실패처리
     ...
     return;
   }
  
   ...
   return;
 }


 5. Main Function - 서비스 시작후 Main
 void ServiceMain( DWORD argc, LPTSTR * argv )
 {
   ...

   m_ServiceStatus.dwServiceType              = SERVICE_WIN32;
   m_ServiceStatus.dwCurrentState             = SERVICE_START_PENDING;
   m_ServiceStatus.dwControlsAccepted         = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
   m_ServiceStatus.dwWin32ExitCode            = 0;
   m_ServiceStatus.dwServiceSpecificExiteCode = 0;
   m_ServiceStatus.dwCheckPoint        = 0;
   m_ServiceStatus.dwWaitHint                 = 1000;
  
   m_ServiceStausHandle = ::RegisterServiceCtrlHandler(m_ServiceName.c_str(), m_lpServiceCtrlHandler);
   if (m_ServiceStausHandle == (SERVICE_STATUS_HANDLE)NULL)
   {
     // 실패 처리
     ...
     return;
   }
  
   // 게임서버관련 초기화 부분 추가
   ...
  
   if (status != NO_ERROR)
   {
    m_ServiceStatus.dwCurrentState             = SERVICE_STOPPED;
    m_ServiceStatus.dwWin32ExitCode            = status;
    m_ServiceStatus.dwServiceSpecificExiteCode = specificError;
    m_ServiceStatus.dwCheckPoint            = 0;
 m_ServiceStatus.dwWaitHint                 = 0;

        ::SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus);
 return;
   }
   
   m_ServiceStatus.dwCurrentState             = SERVICE_RUNNING;
   m_ServiceStatus.dwCheckPoint        = 0;
   m_ServiceStatus.dwWaitHint                 = 0;
  
   if (!::SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus))
   {
     // 실패 처리
     ...
     return;
   }       
  
   // 메인루프 함수로 처리
   while(true)
   {
     ...
   }

   return;
 }


 6. Ctrl Handler - 서비스 명령어 처리
 void ServiceCtrlHandler( DWORD Opcode )
 {
    switch(Opcode)
    {
     case SERVICE_CONTROL_PAUSE:
        m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
        ...
        break;
     case SERVICE_CONTROL_CONTINUE:
        m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
        ...
        break;
     case SERVICE_CONTROL_STOP:
        m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
        m_ServiceStatus.dwCheckPoint        = 0;
        m_ServiceStatus.dwWaitHint            = 0;
    m_ServiceStatus.dwWin32ExitCode       = 0;
        ...     
        break;
     case SERVICE_CONTROL_SHUTDOWN:
        ...
        break;
     case SERVICE_CONTROL_INTERROGATE:
        ...
        break;

     default:
        return;
    }

   
    if (!::SetServiceStatus(m_ServiceStatusHandle, &m_ServiceStatus))
    {
      ...
    }
   
    return;
 }


   
 7. _tmain 처리 - 서비스의 Main과 Ctrl 함수를 선언, 서비스에 함수 포인트를 알려줌
 VOID WINAPI __SERVICE_MAIN_FUNCTION( DWORD argc, LPTSTR * argv )
 {
   SINGLETON(Service)->ServiceMain(argc, argv);
 }

 VOID WINAPI __SERVICE_CTRL_HANDLER( DWORD Opcode )
 {
   SINGLETON(Service)->ServiceCtrlHandler(Opcode);
 }


* 실행순서는 7을 제외하고는 번호 순서대로 실행됨.
 
* 참고 자료 :


버그 보고 5단계

개발 2009.06.12 11:22 |
[기본정보]  : 클라이언트 버전, 발생시간, 대상 서버, 보고자, 버그 레벨

[설명] : 버그 현상 설명.

[재현 과정]  : 버그 발생을 위한 구체적인 재현 방법

[결과] 버그에 의한 결과, 스샷포함

[기대결과] 버그가 아닐시 정상적으로 나타나야하는 결과.

Event Message Manager

개발 2009.06.08 13:37 |

* Event Message Manager
: 프로그램에서 Update Frame의 효율을 위해, 시간정렬 Message를 사용.


* 필요 기능
 - 삽입시 auto 메모리풀을 사용, 실행될 시간순으로 정렬 삽입. 시간은 중복일수도 있다. (multimap)
 - 삭제시 해당 시간이 되었을때, 필요없을때 실행 하지 않고 삭제.(Ignore or Alive - ?? )
 - 필요 없어진 Message 한꺼번에 삭제 하는 방법 ?
 - 업데이트시 해당 시간까지실행 및 Update Frame 유지 및 체크 기능
 - [시간] = 객체주소 로 관리. 객체는 반드시 메모리 풀을 사용하여 Ignore 체크함.
 - 로그 , 시간당 메세지 처리 시간, 최대 메세지 갯수, one tick간 최대 처리가능한 메세지 수 및 총시간

기술 문서 샘플

개발 2009.06.05 15:15 |
* 제목
 - 기간 (총 작업시간) / 담당자 이름


* Scenario
   :  사용자 입장에서본 짧은 단위의 UI가 포함된 시나리오

* Issue
  :    타팀과의 고려사항, 기획적 내용, 프로그래머간의 작업 순서, 그래픽 데이터 스케줄.

* Goal
  :  작업의  최종 구현 기능.

* Work
  : 작업으 설계, 실제 코딩 예제의 설명. 중요 로직

* TODO
  :  추가할 기능, 추후 리팩토링 가능한 목록

* Reference
  : 참고 자료나 문서 링크

Performance Counter

개발 2009.02.19 17:27 |

* Use MS Performance Counters For Server Monitoring Of Application

출처 :Performance Counters


가. DLL 제작
 - Performance Data Format
 - 인스턴스 기능 추가
 - stl 변수의 공유

나. 레지스트리 정리
 -

다. 응용 프로그램 사용