본문 바로가기

전체 글

(95)
우선순위큐(Priority Queue) 알고리즘.... 프로그램을 하다 보면, 실시간 소팅일 필요한 경우가 있다. 이때 문제점이 데이터의 값 하나가 바뀔때 마다 qsort()을 하더라도 엄청난 자원을 필요로 한다는 것이다. 이러한 문제점을 해결하기 위한 방법이 소개할 우선순위큐(Priority Queue)라는 알고리즘 이다. 이 알고리즘은 일반적인 소팅알고리즘과 틀리게 전체를 소팅하지 않는다는 특징을 가지고 있어 실시간 소팅을 할때 상당히 유용하다. (문제는 전체를 소팅하지 않기 때문에 최상의 값 만이 의미를 갖는다는 것이다.) 이 알고리즘이 STL에도 존재한다. 그러나 STL과 같은 알고리즘은 데이터를 push()하고 pop()하는 것에 맞춰져 있다. 즉, 저장된 데이터의 값이 변경되거나 데이터를 삭제하고자 할 경우 전체를 다 꺼냈다가 다시 집어넣어야 하는..
GCC에서 자동실행 함수 만드는 방법... 예전 Borland C++로 프로그램을 할때 많이 사용하던 명령이 있었다.. 바로, #pragma startup function-name #pragma exit function-name 대충 어떤 역활을 하는 pragma 인지 알것이다~ 리눅스(GCC) 기반으로 프로그램을 할때 이러한 기능이 필요 할때가 있다. 그런데, 나는 이러한 기능을 pragma에서 열심히 찾았었다. 그런데, 이러한 기능이 별도의 속성으로 설정해 사용할수 있다는 것을 알고 참으로 고마웠었다... 나처럼 이런 수고를 하려는 개발자에게 간단한 Tip을 소개한다. static void FUNC(void) __attribute__ ((constructor)); static void FUNC(void) __attribute__ ((destr..
Lucene Java 2.3.1 Release Apache 프로젝트에서 진행하는 Lucene 검색엔진이 2.3.1으로 업데이트 되었습니다. 마이너업그레이드 이므로, 새로운 기능 보다는 기존 2.3.0의 버그수정입니다. 변경 내용 1. LUCENE-1168: Fixed corruption cases when autoCommit=false and documents have mixed term vectors (Suresh Guvvala via Mike McCandless). 2. LUCENE-1171: Fixed some cases where OOM errors could cause deadlock in IndexWriter (Mike McCandless). 3. LUCENE-1173: Fixed corruption case when autoCommit=..
원형큐 형태의 캐싱버퍼 구현~ 네트워크(TCP) 프로그램을 하다보면, 데이터를 받아 관리하는 버퍼가 필요하게 된다. 이 버퍼을 구현하기위해 많은 방법이 존재하지만, 대부분의 개발자는 원형큐 형태의 버퍼를 선호하는 경향이 있다. 그런데, 캐싱버퍼 구현에 있어 가장 중요한 부분이 바로 데이터를 얼마나 빨리 저장하고, 읽어 들이느냐에 대한 구현 방법이다. -- 이러한 처리를 위한 일부 개발자는 바이트단위로 복사하는 방법을 사용하기도 하고, 일부 개발자는 블럭단위로 복사하기도 한다. 나는, 여기에서 이 부분을 구현하기 위해 memcpy() 함수를 사용하였다. memcpy()함수는 데이터를 가장 빨리 복사하기 위해 내부적으로 레지스터리 단위로 데이터를 복사한다. 그럼 가장 먼저 데이터를 저장하는 부분부터 보자~ int cache_put( st..
쓰레드의 활용~ 윈도우즈 기반의 개발에 익숙해져 있는 개발자라면 IOCP의 강력함과 고마움을 리눅스 개발자 만큼 절실히 느끼는 개발자는 드물것이라 생각한다. 내가 이 글을 쓰는 이유는 리눅스에서 윈도우의 IOCP와 비슷한 기능을 구현해, 쓰레드의 효율성을 높이고 싶어하는 개발자를 위한 팁을 소개하기 위해서이다.. 조건, - N개의 쓰레드로 하여금 프로세싱 처리를 하게 하고 싶다. - 그런데, 문제는 어떤 쓰레드에 작업을 줘야 할지 판단하기 어렵다~ 여기에서 가장 큰 관건은, 바로 작업을 수행해야 하는 쓰레드를 결정하는 것이다. 보편적으로 많이 소개되는 방법은 pthread_cond_wait() 함수를 사용하는 방법이 있다. 이 방법으로 개발해본 개발자라면 이러한 경우를 당해 봤을 것이다.. 쓰레드의 CPU 사용 점유율 ..
AcceptEx를 사용한 listen() 처리 구현시... 일반적으로 사용되는 listen() 함수를 통해, 일정 갯수의 backlog 수 만큼 미리 accept를 받을수 있다. 그러나, IOCP로 개발을 하면서 AcceptEx() 함수를 사용하는 경우는 이러한 기능이 상당히 방해가 된다. AcceptEx()를 호출하지 않은 상태에서도 포트로 connect이 들어오면 accept를 미리 해버리기 때문이다. 이를 방지하기 위해 다음 코드를 사용할수 있다. 아래 함수를 호출하게 되면 AcceptEx가 호출되지 않을 경우 listen이 자동적으로 처리되지 않는다. 참고로, 이 함수를 호출하게 되면, netstat 를 통해 LISTEN 대기 중인 포트를 보더라도 표시되지 않는다. // AcceptEx()를 사용할 경우, listen() 에서 자동적으로 accept를 받..
lua에서 비트연산을 사용하기 위한 패치를.... lua를 사용해서 알고리즘을 만들다 보면, 불편한것 중에 하나가 비트연산이 없다는 것이다. 아래에 비트연산을 하기위한 패치 파일을 올린다.. 많은 도움이 되시길~~ 이 패치파일은 필요에 따라서 약간의 커스터마이징(일부 연산자를 약간 수정했다)을 한 패치파일임을 밝혀둔다. 지원하는 연산자는 >>(RSHIFT), >4)) a,b=0xF,4 print(hex(a)..""..b,"=",hex(a>>b))
메모리풀 이야기~ 프로그래밍을 할때 가장 많이 호출되는 함수중에 하나가 메모리 할당과 해제에 관련된 함수이다. C개발자라면 메모리 할당과 해제를 직접 제어할수 있지만, C++ 개발자라면 알게 모르게 호출되어진다. 그러다 보니, 메모리의 효율성을 많이 따지게 되는데.. 나 또한 C++ 기반에서 프로그램을 많이 하게 된다. 그래서 자연스럽게 메모리 풀에 관심을 가지게 되고 사용을 한다. 아래에 소개하는 소스는 내가 사용하는 메모리 풀의 헤더파일로, STL과 같은 allocator를 대신해 사용할수 있도록 만들어져 있다. (STL을 사용할때 많은 도움이 된다. -- boost를 사용해도 좋을듯 하다.) template 기반으로 되어 있으니 도움이 되지 않을까 생각해 올린다~ * pool.hpp #ifndef __POOL_HPP..