티스토리 툴바


'개발/서버'에 해당되는 글 10건

  1. 2012/03/18 SO_REUSEADDR 은 bind 전에 해야한다.
  2. 2012/03/17 ConnectEx, WSAINVAL(10022) 발생
  3. 2012/01/19 asp.net javascript 와 ashx 를 이용한 깜박임 없는 페이지 제작기
  4. 2011/12/29 URL rewriter 강좌 링크
  5. 2011/10/25 iis 기본문서 설정을 web.config 에서
  6. 2011/09/08 Spin Lock 기술 (8)
  7. 2011/08/30 GetLastError() 10013
  8. 2011/07/15 URL rewriting
  9. 2011/06/07 Microsoft SQL Server 2008 R2 RTM - Express with Management Tools
  10. 2011/03/31 서버종료시 메모리 회수 왜이케 안되...

SO_REUSEADDR 은 bind 전에 해야한다.

bind 후에 하니 효과가 없습니다.
빨리할 수 록 좋습니다.

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



 
저작자 표시
TRACKBACK 0 COMMENT 0

ConnectEx, WSAINVAL(10022) 발생

ConnectEx 하려는 소켓은 bind 되어있어야합니다.

bind 한 다음 ConnectEx 하세요 
저작자 표시
TRACKBACK 0 COMMENT 0

asp.net javascript 와 ashx 를 이용한 깜박임 없는 페이지 제작기

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 을 이용한 원초적인 사이트 제작을 시작한다.


 
저작자 표시
TRACKBACK 0 COMMENT 0

URL rewriter 강좌 링크

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


저작자 표시
TRACKBACK 0 COMMENT 0

iis 기본문서 설정을 web.config 에서

iis 배포시 자꾸 기본문서 설정이 날아가길레
확인했더니 web.config 에 그냥 쓰는거 였구나..

http://najsulman.tistory.com/tag/Web.Config%20%EA%B8%B0%EB%B3%B8
저작자 표시
TRACKBACK 0 COMMENT 0

Spin Lock 기술


제가 쓴 포스팅은 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 신봉자]가 되어야 겠습니다.

너무 허무하군요...
저작자 표시
TRACKBACK 0 Comment 8

GetLastError() 10013

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() 전에 사용할것! 
이부분은 헛갈린다


 
저작자 표시
TRACKBACK 0 COMMENT 0

URL rewriting

잘정리된 링크: http://www.addedbytes.com/for-beginners/url-rewriting-for-beginners/

 
[기존]
http://www.a.com/a.html?product_id=7
보통 이런 방식을 사용하는걸

[변경후]
http://www.a.com/product_id/7
이런식으로 변경하자는 이야기 

1. 이유로는 phone? 에서 읽기 힘들다 - URL 이 너무 길다
2. 검색엔진이 product_id=7 이 라고 저장했더라도  다시 와보면 다를 수 있다는 것 (제가 잘못 이해했을 수 있음)
3. 내용엔 없지만 사용자에게 a.html 이 존재한다는 사실을 알려주고 싶지 않기 때문이기도 한것 같습니다.

URL 줄이는건 아무튼 좋은 일이라 판단됩니다. Web API 랑도 잘 맞구요
구글앱엔진의 자바 서블릿(web.xml) 을 써보면서 방식이 얼마나 편한지 알 수 있었습니다.
MS 제품만 많이 썼더니 다른 언어쪽이 얼마나 발전했는지 알지못했군요

연관기술 : REST HTTP, IIRF rewriter

저작자 표시
TRACKBACK 0 COMMENT 0

Microsoft SQL Server 2008 R2 RTM - Express with Management Tools


http://www.microsoft.com/downloads/ko-kr/details.aspx?familyId=967225EB-207B-4950-91DF-EEB5F35A80EE&hash=fNO3KkVuOj2CrCqYP1aaTWzO%2flGI%2bMnVuxEbKRCUqS%2fK134X8b2zhYuiDZrMEsUHVWAaLi6XXXyEupjcpaZbmA%3d%3d

어째서 한번에 제대로 도는 버전 찾기가 이렇게 힘든거냐!
 
저작자 표시
TRACKBACK 0 COMMENT 0

서버종료시 메모리 회수 왜이케 안되...

서버 종료시 메모리회수가 제대로 안되네...
일단 버리고 기능이나 구현해야지...

-------- 추가-----------
if - continue 문장에 가려 메모리를 delete 하지 않고 넘어가는 코드가 발견됨 ㅠㅠ


while(m_message.size() > 0)
{
   auto msg= m_messages.front();
   m_messages.pop_front();

   //여기까진 좋았는데...
   if(!msg)
      continue;

   // 이거때문
   if(msg->islive() == false)
      continue;

   msg->process();
   delete msg);
}

TRACKBACK 0 COMMENT 0
prev 1 next