mysqladmin -u root password '새암호'


WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  0개가 달렸습니다.
secret

nbtstat -a [ip address]


C:\Users\gunil>nbtstat -a 10.10.25.247


로컬 영역 연결:

노드 IpAddress: [10.10.25.247] 범위 ID: []


           NetBIOS 원격 컴퓨터 이름 테이블


       이름               유형         상태

    ---------------------------------------------

    GUNIL-PC       <00>  UNIQUE      등록됨

    WORKGROUP      <00>  GROUP       등록됨

    GUNIL-PC       <20>  UNIQUE      등록됨


    MAC 주소 = 00-00-00-00-00-00



자주 까먹는거라......

내부 네트웍에서만 사용 가능합니다.


WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  0개가 달렸습니다.
secret

발생원인중 일부겠지만......


1. 1대의 PC 에서 너무 많은 connect 를 시도하면 발생한다.

   한번 발생하면 계속 나므로 connect 는 부하만 발생시킬 뿐....


2. ConnectEx 사용을 위해  소켓을 bind 시낄때

    이미 사용중인 포트를 bind 시키면 발생한다.


이글 보시는 개발자분께서 도움되시길 빌면서.... ㄷㄷㄷ



WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  0개가 달렸습니다.
secret
bind 후에 하니 효과가 없습니다.
빨리할 수 록 좋습니다.

어떤 옵션(?)들은 bind 한 다음에 해야 한다는 군요.



 

WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  0개가 달렸습니다.
secret
ConnectEx 하려는 소켓은 bind 되어있어야합니다.

bind 한 다음 ConnectEx 하세요 

WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  0개가 달렸습니다.
secret
ajax 는 javascript 와 xml 을 이용한 데이터 교환인데
요즘은 xml 보다 json 을 더 많이 쓴다.. ajaj 라고 해야하나...

.ashx 는 asp.net 의 페이지 생성 방식중 하나이면 매우 간략하게 생성한다.
.aspx 처럼 init -> preload -> load -> ... 이 아니라 요청(req) 에 대한 응답(res) 만 존재하는 방식이다.

asp.net 의 ajax.net 을 이용하고 update panel 을 사용하면 간단하게 코딩할 수 있을지 모르나
나는 이런것에 관심이 없다. 

html5 로 아이폰에서도 되는 게임을 제작하는게 목표히기 때문이다.

http://thisisone.me 를 업데이트 해서 완성해갈 생각이다.

참고 사이트: 
1.  http://msdn.microsoft.com/ko-kr/library/ms178208(v=vs.80).aspx
이곳에서 표현한 방식은 aspx 를 이용해야한다. 그래서 원하는 결과가 아니므로 버렸다.

2.  http://www.devcurry.com/2010/11/call-aspnet-handler-ashx-using.html 
결과적으로 이곳을 참고 했으며 최종적으로 form 이라는 테그를 제거했다.
그래서 제작한 페이지에는 form 존재하지 않으며 확장자는 .html 이다. 즉 페이지 랜더링을 위해
서버 자원을 사용하지 않는다.(성능에 좋으려나? 확신은 없다)

3. http://blog.outsider.ne.kr/257
.ashx 에서 전송되는 데이터는 text 이다 이것을 javascript 에 맞게 json 형식으로 읽어야 한다.
이 페에서는 eval 방식으로 쉽게 읽는 법과 json2.js 라는 자바스크립트를 이용해 안전하게
json 으로 변환하는 방법을 제공한다.
현재 이곳에 링크된 http://json.org/json2.js 파일은 링크가 끊긴 상태이다.

4.  http://najsulman.tistory.com/598 
json2.js 를 다운받은 사이트이다.

내일부터는 html5 와 asp.net 을 이용한 원초적인 사이트 제작을 시작한다.


 

WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  0개가 달렸습니다.
secret

sqler.com : http://www.sqler.com/index.php?_filter=search&mid=bIISLec&search_target=title&search_keyword=url+re&document_srl=192870

iis 강좌 사이트 : http://www.iiskorea.net



WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  0개가 달렸습니다.
secret
iis 배포시 자꾸 기본문서 설정이 날아가길레
확인했더니 web.config 에 그냥 쓰는거 였구나..

http://najsulman.tistory.com/tag/Web.Config%20%EA%B8%B0%EB%B3%B8

WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  0개가 달렸습니다.
secret

Spin Lock 기술

개발/서버 2011.09.08 00:47

제가 쓴 포스팅은 lockless 가 아니고 spin lock 기술이라고 합니다.
익명님의 지적 감사드립니다.(아무도 관심안가져줄꺼라 생각했어요)


lockless 관련정보: http://xster.tistory.com/tag/Lockless
spinlock 관련정보: http://devnote.tistory.com/142

spinlock 은 lock 을 걸어야할 자리에 for 문으로 무한루프를 걸어 "내가 써도되?" 하고 확인 하는 방식을 말합니다.
출처에는 윈도우즈에서는 cpu 100% 를 먹을 수 있기 때문에 비효율적이라고 하는군요.

아래부터 머신사이클 이란 용어를 사용하는데 이는 제 개인적인 단위 입니다.
(cpu 가 아무리 빨라져도 변함없는 처리단위 라고 생각합니다.)

mutex 는 5,000 머신사이클
criticalsection 은 2,500 머신사이클
정도로 생각하고 있습니다.

 사용할 수 있을때 까지 while(1) 무한루프를 걸어 다 썼는지 확인후 사용하도록 수정합니다.
이 방법은 멀티코어가 아니면 sleep 이 없기 때문에 쓰레드 전환이 발생할때까지 block 됩니다.
싱글코어에서는 테스트가 거의 불가능합니다.(cpu 를 혼자 다 먹어버리기 때문에 뻗은것 처럼 보입니다.)

요즘 서버는 16 ~ 32 코어 정도 되기 때문에 이젠 쓰는게 이득인 기술입니다.
2007년 당시에 겨우 2코어 제품이 보급되었기 때문에 "오~" 정도로 끝났었습니다.

이젠 대부분의 서버 기술자가 아는 방식이라 새로울 것도 없죠..

 대충 작성한 코드 올려봅니다.(아직 테스트 전입니다.)
<보편적인 CS 클래스>
class CSLock
{
private:
	CRITICAL_SECTION m_cs;
public:
	CSLock();
	~CSLock();

	void Enter();
	void Leave();
};

//------------------------------------------
//
CSLock::CSLock()
{
	::InitializeCriticalSection(&m_cs);
}

CSLock::~CSLock()
{
	::DeleteCriticalSection(&m_cs);
}

void CSLock::Enter()
{
	::EnterCriticalSection(&m_cs);
}

void CSLock::Leave()
{
	::LeaveCriticalSection(&m_cs);
}



<Lock-Free 클래스>
class LFLock
{
private:
	long m_threadid;
	long m_spin;

public:
	LFLock();
	~LFLock();

	void Enter();
	void Leave();
};


//------------------------------------------
//
LFLock::LFLock()
{
	m_threadid = 0;
	m_spin = 0;
}

LFLock::~LFLock()
{
	m_threadid = 0;
	m_spin = 0;
}

void LFLock::Enter()
{
	long tid = (long)GetCurrentThreadId();

	while(1)
	{
		//lock 이 걸려있지 않은 경우
		if(0 == ::InterlockedCompareExchange(&m_threadid, tid, 0))
		{
			::InterlockedIncrement(&m_spin);
			break;
		}

		//lock 이 걸려있지만 thread 가 같다면
		if(tid == ::InterlockedCompareExchange(&m_threadid, tid, tid))
		{
			::InterlockedIncrement(&m_spin);
			break;
		}
	}
}

void LFLock::Leave()
{
	long tid = (long)GetCurrentThreadId();

	while(1)
	{
		if(tid == ::InterlockedCompareExchange(&m_threadid, tid, tid))
		{
			if(0 == ::InterlockedDecrement(&m_spin))
			{
				::InterlockedCompareExchange(&m_threadid, 0, tid);
			}
			break;
		}		
	}
}
<성능 테스트 결과>
테스트 조건:
for(int i=0; i<천만번; i++
{
   m_lock->Enter();
   g_count++;
   m_lock->Leave();
}
함수를 thread 갯수에 변화를 주어 계산했습니다.

테스트 환경은 : Intel Core2Duo 2.53Ghz (코어2개 입니다.) 로 했습니다.

   1thread 2thread 3thread 
 CriticalSection  0.411 0.720 0.767
 CS.SpinCount(1000)  0.414 1.010  1.001 
제가만든 SPLock  0.894 1.869  2.379 
       

CS.SpinCount(1000) 은 InitializeCriticalSectionAndSpinCount() 로 생성한 CriticalSection 입니다.

결론은 
1. 제가 만든 SPLock 은 형편없이 느렸습니다.
2. 그리고 CriticalSection 이 상당히 빠르군요.
3. CS.SpinCount(1000) 역시 느리게 나왔습니다.


Debug 빌드에서는 CS.SpinCount(1000) 이 CriticalSection 에 비해 30%정도 빠르게 나왔습니다.
Debug 빌드라 테스트는 따로 해보지 않았지만 이상한 현상이군요.

제가만든게 SPLock 이 왜 느린지 확인해 보니 Interlocked 함수들 자체가 EnterCriticalSection 함수보다 2배가량 느렸습니다.

MS 에서는 이미 Lock 을 제대로 만든것 같습니다.
이 결과에 책임을지고 [저는 MS 신봉자]가 되어야 겠습니다.

너무 허무하군요...

WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  9개가 달렸습니다.
  1. 이건 스핀락이라고 합니다. 락프리는 전혀 다른 겁니다.
  2. InitializeCriticalSectionAndSpinCount 라는 것도 있습니다. 스핀락 모드로 돌다가 안되겠다 싶으면 일반 크리티컬 섹션으로 후퇴하는 API입니다.
  3. 안녕하세요. 달아주신 댓글 보고 왔습니다.
    열심히 공부하시는 모습이 보기 좋으십니다. 저 이번 주말에 완전 놀았는데 자극이 되네요 ㅎㅎ
    짧은 글이지만 다양한 주제가 포함되어 있는 포스팅이네요. 저도 아직 한참 배워야 하는 수준이라 정확히는 모르지만 제가 이해한 바로는 Critical Section과 Spin Lock의 이런 단순비교는 조금 잘못된 것이 아닌가 하는 생각이 듭니다.
    SpinLock과 CS는 용도에 맞게 선택적으로 사용하는 것이 중요한 것 같습니다. 단순히 코어의 개수가 늘어났으니 Spinning을 마음놓고 사용해도 되는 것은 아닙니다. '코어 개수가 많은 머신에서 돌릴 서버니까 모두다 스핀락만 이용해서 짜자'고 하면 안됩니다.
    올려주신 테스트 결과는 순수 컨텍스트 스위칭 > 스위칭 + 스피닝 > 순수 스피닝 순서대로 좋은 결과가 나왔습니다. 이는 샘플코드의 케이스가 스피닝 락보다 스위칭 락이 더 좋은 케이스임을 증명하는 것일 뿐이 아닌가 하는 생각이 드네요. 샘플코드는 locking scope 안에서 정수값을 1 증가하는 아주 단순한 작업 뿐이지만, 아마도 다른 작업 없이 천만번의 루프 안에 이 작업만 들어있으니 스레드간의 경쟁(contention) 빈도가 심해져서 이런 결과가 나온것 같습니다.
    그러니 MS의 크리티컬 섹션이 무조건 좋은 것도, 제작하신 스핀락 클래스가 무조건 나쁜것도 아닙니다 ㅎㅎ
    참고로 이번에 Windows2008부터 사용 가능한 SRW라는 락도 있더군요. ( http://devnote.tistory.com/194 ) 함께 살펴보시면 좋을 것 같습니다.
  4. 저는 만약 나중에 성능에 민감한 멀티스레드 코드를 작성한다면 크리티컬 섹션을 가능한한 안쓰고 만들어보려고 합니다. 그 말은 기존에 크리티컬 섹션 쓰던 자리를 모두 스핀락으로 교체하겠다는 뜻이라기 보다는 '스레드 간의 경쟁이 아주 드물고 짧아서, 스핀락만 사용해도 크게 무리가 없을 구조로 설계한다'는 뉘앙스가 더 강합니다. 이런식의 설계를 생각해보면 구조가 점점 lockless와 유사해 지지요. 제가 적은 글에서 spin lock과 lockless-algorithm의 유사함을 말한 것은 그런 의미 입니다 ^^;
  5. 지나가는이 2013.02.06 23:08 신고
    우연히 들렸다가 글 남김니다.
    윈도 critical section에 비해 느린 것은 interlock 계열 operation을 너무 많이 써서 그런 것 같습니다.
    lock / unlock시에 interlock 계열 함수를 1번만 쓰도록 바꾸면 속도는 critical section과 동일할 것 같습니다.

    어짜피 intel계열에서 interlock 함수 이외의 방법으로 lock을 만드는 것은 불가능하고, 윈도우의 critical section의
    경우 여기서 spin count가 많을 경우, 스레드가 WaitForSingleObject등으로 잠들게 하고, 디버그 정보등이 추가되는
    정도입니다.

    boost::lock 코드를 보시면 도움이 되실듯

secret
WSAEACCES
액세스 권한에 의해 숨겨진 소켓에 액세스를 시도했습니다. 

bind() 호출시 발생함.
디버깅중 서버를 여러번 껏다켰다하면  유령 LISTENING 소켓이 발생하여 bind 할 수 없음
서버 소켓을 bind() 하기전에 SO_REUSEADDR 을 사용하자.


int ret = 0;
BOOL on = TRUE;
 
  on = TRUE;
ret = setsockopt(
Handle(),
SOL_SOCKET,
SO_REUSEADDR,
(char*)&on, sizeof(on)
);
if(0 != ret) {
LastError("setsockopt(SO_REUSEADDR)");
return false;
}

순서는 bind() 전에 사용할것! 
이부분은 헛갈린다


 

WRITTEN BY
그건일
게임개발자

트랙백  0 , 댓글  0개가 달렸습니다.
secret