728x90
반응형
728x90
반응형
반응형
// http://genius.cat-v.org/brian-kernighan/articles/beautiful
// c matches any literal character c
// . matches any single character
// ^ matches the beginning of the input string
// $ matches the end of the input string
// * matches zero or more occurrences of the previous character
/* match: search for regexp anywhere in text */
int match(char *regexp, char *text)
{
if (regexp[0] == '^')
return matchhere(regexp+1, text);
do { /* must look even if string is empty */
if (matchhere(regexp, text))
return 1;
} while (*text++ != '\0');
return 0;
}
/* matchhere: search for regexp at beginning of text */
int matchhere(char *regexp, char *text)
{
if (regexp[0] == '\0')
return 1;
if (regexp[1] == '*')
return matchstar(regexp[0], regexp+2, text);
if (regexp[0] == '$' && regexp[1] == '\0')
return *text == '\0';
if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text))
return matchhere(regexp+1, text+1);
return 0;
}
/* matchstar: search for c*regexp at beginning of text */
int matchstar(int c, char *regexp, char *text)
{
do { /* a * matches zero or more instances */
if (matchhere(regexp, text))
return 1;
} while (*text != '\0' && (*text++ == c || c == '.'));
return 0;
}
728x90
반응형
반응형

 

Membase 서버의 기본 네트워크 소켓 포트

Port

Purpose

Membase Server

Membase Client

Administration Client

8091

Web Administration Port

Yes

No

Yes

11211

Data Port

Yes

Yes

Yes

11210

Internal Cluster Port

Yes

No

No

4369

Erlang Port Mapper (epmd)

Yes

No

No

21100 to 21199 (inclusive)

Node data exchange

Yes

No

No

 

… 결론부터 이야기하면, 설정할 때는 8091 포트로 웹 브라우저에 의한 설정이 필요하지만, 어느 정도 구성 후에는 memcached default port 이기도 한 11211 포트로 소켓 통신을 하면 된다.

728x90
반응형
반응형
// get_libc_ver.cpp
// http://j2doll.tistory.com/467
#include <stdio.h>
#include <gnu/libc-version.h>
int main (int argc, char* argv[])
{
puts (gnu_get_libc_version ());
return 0;
}
728x90
반응형
반응형

리눅스 환경에서 tzset()fork() 간의 잠금 문제 분석 및 해결 방안

리눅스 환경에서 tzset() 함수와 fork() 호출 간의 잠금(lock) 문제는 특정 상황에서 프로세스가 멈추는 현상을 유발할 수 있습니다. 이 글에서는 이러한 문제를 분석하고 해결 방안을 제시합니다.

문제 상황

작성자는 멀티스레드(pthread)를 사용하여 작업을 처리하는 부모 프로세스를 구현했습니다. 이 구조에서는 새로운 요청이 들어오면 fork()를 통해 자식 프로세스를 생성하여 해당 요청을 처리합니다. 그러나 자식 프로세스가 초기화 과정에서 tzset()을 호출할 때, 간헐적으로 잠금 상태가 발생하여 프로세스가 멈추는 현상을 발견했습니다.

테스트 및 재현

문제를 재현하기 위해 작성한 테스트 프로그램은 다음과 같습니다:

  • 스레드에서 반복적으로 tzset() 호출.
  • 동시에 fork()를 통해 자식 프로세스를 생성.
  • 자식 프로세스에서도 tzset() 호출.

이 테스트에서 자식 프로세스가 tzset() 함수 내에서 멈추는 문제가 확인되었습니다.

환경 차이

이 문제는 리눅스(CentOS 5.5) 환경에서 주로 발생했으며, FreeBSD 8.0에서는 동일한 코드가 정상적으로 작동했습니다. 이는 fork() 호출 시 부모 프로세스의 잠금 상태가 자식 프로세스에 복사되면서 발생하는 문제로 보입니다.

해결 방안

이러한 잠금 문제를 방지하기 위해 다음과 같은 방안을 고려할 수 있습니다:

  1. fork() 호출 전에 모든 스레드 작업이 종료되었는지 확인.
  2. tzset() 호출을 적절히 동기화하여 잠금 충돌 방지.

결론

멀티스레드와 fork()를 함께 사용하는 환경에서는 잠재적으로 발생할 수 있는 잠금 문제를 인지하고, 적절한 방어 코드를 작성하는 것이 중요합니다. 이를 통해 프로세스의 안정성과 신뢰성을 확보할 수 있습니다.

참고

728x90
반응형
반응형

 

(원문 : http://www.couchbase.org/wiki/display/membase/Building+Membase+on+Linux+From+Source)

(글 번역도 영어이고, 쓸데없는 내용도 많기에 중간 생략을 하며, 편의상 글도 높임말보다 이래하기 편한 평문으로 구성한다.)

 

membase 는 couchbase 에서 지원하는 memcached의 cluster 버전이다. 라이선스는 현재 아파치 2 라이선스를 적용 중이다. Couchdb 와의 기능을 써도 되지만 안 써도 되는 구조이며, couchbase에서 제시하는 이상적인 사용 전략은 당연히 RDMS à NoSQL à CouchDB 와 cluster/middleware à Membase 이다. 하지만 사용자 취향과 능력에 따라 섞어 짬뽕으로 써도 된다. 실제 membase 의 스폰서 중하나인 nhn도 자체 memcached 클러스터 버전인 arcurs 등을 개발하여 사용한다.

설치본은 community 용은 무료로 설치본을 제공하며, 기업용은 연락처 제시 후 다운로드가 가능하다. 기본 지원으로 redhat rpm, debian deb, windows, mac os x 를 지원한다. (http://www.couchbase.com/downloads/membase-server/community)

물론 소스 코드를 받아서 직접 빌드도 가능하며, 아래는 직접 빌드 방법을 기술한다.

일단 다운로드 싸이트에서 membase-server_src-1.7.0.tar.gz 를 받는다. (현재 1.7임. 1.6.x 도 존재한다.)

 (1) Ubuntu Ubuntu 11.04 사용 시,

# sudo apt-get install erlang libicu-dev libevent-dev libcurl3-dev g++ gcc binutils

…로 필요한 것을 설치함. Couch 계열이 기반 언어가 얼랭이며, memcached를 위해서 libevent는 필요하다. Curl 도 사용하므로 설치 해준다.

 (기본 설치는 /opt/membase/ 에 설치된다.)

(2) Cent OS 5.4 사용 시,

# yum install libevent-devel curl-devel gcc-c++ g++ gcc make

…얼랭 없으면 그것도 설치할 것…

(3) Mac os x

….요건 좀 짜증나는 해설인데,, 거의 알아서 깔아야 한다. MacPorts 등을 이용해서 설치를 하는 방법도 있을 것 같다. (이건 실험 못 해봤음)

(여담으로 본햏도 snow leopard 를 사용하지만, 누가 대용량 서버에 가격대 성능비가 비싼 애플 서버로 도배하것는가?! 99.9%는 리눅스 서버에서 사용할 목적일 것이다. 맥에서 빌드는 그냥 nothing but mac 인 사람에게만 해당된다고 보면 될 듯하다. 이것도 기냥 설치본[기냥 단일 응용 프로그램이다.]을 받아서 깔아서 테스트해보라…)

http://packages.couchbase.com/releases/1.7.0/Membase-Server-Community-1.7.0.zip

 (4) Windows

…mingw, cygwin 등이 먼소리인지도 모르겠다면, 당연히 pre-built 버전을 받아서 설치하라.

http://packages.couchbase.com/releases/1.7.0/membase-server-community_x86_1.7.0.setup.exe

(백신 v3가 있으면 경고를 띄우는데, 신경쓰지 말고 진행하도록 하자 K )

membase는 cluster 와 databse 연동 등도 고려한 구조이기에 memcached 보다는 휠씬 구성이 복잡하다. 따라서 빌드 & 설치가 어려운 사람은 community 버전 것으로 설치하도록 하자.

정상설치 후, 웹 브라우저로 http://서버주소:8091 를 연결하면 membase 구성이 가능하다. 단일 구성도 가능하고, 클러스터 구성도 가능하다. 또한 기존 memcached 만을 사용하는 것도 가능하고, membase 의 주요 컨셉 중 하나인 vBucket 구성도 가능하다. 취향에 맞춰서 구성하도록 하자.

설치 후 테스트는 아래과 같이 텔넷에서 입력 후, 출력도 아래와 같이 나오는 지를 확인해 보면 된다.

$ telnet localhost 11211

set some_greeting 0 0 5

hello

STORED

get some_greeting

VALUE some_greeting 0 5

hello

END

모든 과정이 끝났으면, 이젠 membase 만의 고유 architecture 이해와 클라이언트 개발 방법(전략 및 api )이해로 넘어가면 된다…


728x90
반응형
반응형

…대략 테스트해 본 3가지 C/C++ 기반 JIT COMPILER는 다음과 같았다.

 

GNU Lightning Dotgnu (libjit) Luajit (dynasm)
GNU 단체가 공식 관리 JIT의 사용 인터페이스가 가장 편하다. 다른 언어를 만들고자 할 때 libjit 만을 사용할 수도 있다. ('우스운'도 이걸로 구성하였다.) Dynasm 을 직접 사용하기는 그렇지만,,, Lua 와의 연결이 잘 되어 있음.
가장 최근까지 꾸준한 업데이트가 되고 있다. (여러 cpu 지원됨. 심지어 iphone 테스트 까지…)
최근 업데이트가 거의 없다. 물론 x86, x64 계열은 큰 변화는 없겠지만 아무래도 개발 지원이 끊어진 것 같다. --;… Executable luajit 에 너무 초점이 맞추어져 있다.

 

…결론으로는, 스스로 high level language 를 만들고자 한다면, libjit를 사용하는 것이 나을 듯하다.

…하지만 lua 자체가 이미 뛰어난 고수준 언어이므로 lua를 기반으로한 구성을 하려면 (아예 lua로 떡칠을 할 각오를 하고,,,) luajit이 현명한 판단이 될 것같다.

728x90
반응형

'Lua' 카테고리의 다른 글

luajit 테스트 - (2)  (0) 2011.06.26
luajit 테스트 - (1)  (0) 2011.06.26
[luajit] LUA + JIT  (0) 2010.12.08
반응형
 단순 비교.조건 분기 코드를 테스트해 보았다. 물론 리눅스/하드웨어 사양은 전과 동일했다. 테스트 반복 횟수는 5백만번이었다.

 local function cond1(a,b)
    if  ( a > b ) then
        return a
    else
        return b
    end
end

local function test_condition ()
    local max_repeat = 1000 * 1000 * 50
    local x = os.clock()
    local s = 0
    for i = 1 , max_repeat do
        s = cond1( 1, 2 )
    end
    print(string.format(
        "elapsed time: %.9f\tcount = %u\n",
            os.clock() - x ,
            max_repeat ) )
end

test_condition ()


 # lua t1.lua
elapsed time: 17.900000000    count = 50000000

# luajit -j on t1.lua
elapsed time: 0.080000000    count = 50000000


 인터프리터 방식과 jit 사용은 당연히 비교가 안되었으며, 약 200배 정도의 차이가 발생한 듯하다. 물론 c 나  pascal 등 으로 이를 개발하면 거의 0 초 수준이지만... 소스 코드에서 바로 작업한 수준이 이정도인건 훌륭하다!!

728x90
반응형

'Lua' 카테고리의 다른 글

Jit compiler 테스트 중…  (0) 2011.07.02
luajit 테스트 - (1)  (0) 2011.06.26
[luajit] LUA + JIT  (0) 2010.12.08
반응형

 

웹에 쓸만한 luajit 테스트 결과를 찾지 못해서 직접 테스트를 해보았다. 결론부터 이야기하자면, 결과는 매우 놀라웠으며 Mike Pall(독일 아저씨던데 사진은 못 구했음;)의 jit 엔진이 gnu lightning 이나, libjit 못지 않은 성능을 가지고 있음에도 놀랐다. (참고로 테스트 장비에서 gnu lightening의 incr 테스트는 10^9 반복시 820 밀리초가 소요되었다.)

향후, 기회가 되면 Dual/Quad 등의 멀티코어 테스트 시의 차이도 테스트해보았으면 하고, 루아 공식 지원이 아닌 lua-forgelua-socket 등도 테스트를 해보려고 한다. 그리고 llvm-lua 라는 프로젝트도 진행 중이던데 요건 아직 luajit 만큼은 진행도가 좋지 못하다.


             
 

luajit version 2.0 beta-5, Mike Pall

 
 

Lua SciMark 2010-12-10 based on SciMark 2.0a, Mike Pall

             
 

Linux : Ubuntu 11.04 32bit

     
             
 

CPU : Intel(R) Celeron(R) M processor 900MHz

 
 

Memory : 512 MB

       
             
 

FFT : Fast Fourier Transform

   
 

SOR : Jacobi Successive Over-Relaxation.

 
 

MC : Monte Carlo Integration.

   
 

SPARSE : Sparse Matrix Multiplication.

 
 

LU : Dense Matrix Factorization.

   
             
             

twat option : -small

       

  

FFT

SOR

MC

SPARSE

LU

SciMark

JIT-OFF

11.03

23.99

6.06

13.74

16.6

14.29

JIT-ON

71.96

301.09

46.77

57.49

177.78

131.02

             

test option : -large

       

  

FFT

SOR

MC

SPARSE

LU

SciMark

JIT-OFF

8.32

23.48

6.06

15.02

17.1

14

JIT-ON

24.7

292.54

46.77

72.73

141.24

115.6

             

vs. original scimark2

       

  

FFT

SOR

MC

SPARSE

LU

SciMark

C CODE

61.76

218.97

22.67

92.04

118.93

102.88

  

(N=1024)

(100 x 100)

 

(N=1000, nz=5000)

(M=100, N=100)

  

LUA JIT

24.7

292.54

46.77

72.73

141.24

115.6

(large)

[1048576]

[1000]

  

[100000, 1000000]

[1000]

  

LUA JIT

71.96

301.09

46.77

57.49

177.78

131.02

(small)

[1024]

[100]

  

[1000, 5000]

[100]

  

JIT-OFF

8.32

23.48

6.06

15.02

17.1

14

(large)

  

  

  

  

  

  

JIT-OFF

11.03

23.99

6.06

13.74

16.6

14.29

(small)

  

  

  

  

  

  

 


http://luajit.org/download/scimark.lua

http://math.nist.gov/scimark2/scimark2_1c.zip

728x90
반응형

'Lua' 카테고리의 다른 글

Jit compiler 테스트 중…  (0) 2011.07.02
luajit 테스트 - (2)  (0) 2011.06.26
[luajit] LUA + JIT  (0) 2010.12.08
반응형
728x90
반응형
반응형

 MapReducde는 구글이 제안한 분산 처리를 위한 개발 모델입니다. 조엘은 소프트웨어를 넘어서 에서도 소개되기도 한 이 방법은 대용량 자료의 분산 처리에 유용한 구조입니다.

 이미 하둡 등의 프레임워크가 많이 나와 있으며, 미래의 컴퓨터 언어는 이런 처리를 기본 사양으로 제공해 줄 가능성이 높습니다. 물론 기존의 컴퓨터 언어도 미래형 언어로 변신하려면 이런 기능을 끌어 안아야 할 것입니다.
 그런데 Qt 쪽에도 이런 기능이 있는가 하는 것을 찾아 보다 보니 QtConcurrent 가 있습니다. 주 대상은 멀티코어 프로그램 개발이 필요한 경우에 저수준 인터페이스의 지원을 넘어서, 고수준의 인터페이스 제공을 목적으로 하고 있습니다.

 하지만, 향후 함수형 언어의 사용을 지향하는 MapReduce 모델과 객체지향 기반 모델인 Qt를 융합하는 방향이 어떻게 될 지는 노키아(201x)의 향후 방향을 계속 지켜봐야 할 것입니다. [본문 초안은 2011년에 작성되었습니다.]
 아래는 필자가 작성한 예제이며, 듀얼코어 CPU라면 한번에 두 개까지만의 쓰레드가 실행됨을 확인할 수 있을 것입니다. 물론 두 개의 쓰레드는 듀얼코어에서 사용하기 가장 이상적인 쓰레드 개수입니다.
 예제 실행을 원하면 Nokia Qt 사이트에서 LGPL 지원하는 Qt SDK 를 받아서, 콘솔 예제를 실행해 보면 됩니다.
  

 

#include <climits>
#include <QtGlobal>
#include <QString>
#include <QDebug>
#include <QtCore>
#include <QtCore/QCoreApplication>
#include <QThread>
#include <QtConcurrentRun>
#include <QTime>
#include <QDateTime>
#ifndef QT_NO_CONCURRENT
using namespace QtConcurrent;
void timeConsumingFunction(QString name)
{
qDebug() << QThread::currentThread()
<< "(" << __FUNCTION__ << ")"
<< "[START]\t" << "NAME : " << name;
QTime spanTime;
spanTime.start();
double cardSoldier = 0;
for ( int heart = 1 ; heart < 20000 ; heart ++ )
{
for ( int spade = 1 ; spade < 20000 ; spade ++ )
{
cardSoldier = cardSoldier + ( double(heart) / double(spade) );
}
}
quint32 milliSecond = spanTime.elapsed();
qDebug() << QThread::currentThread()
<< "(" << __FUNCTION__ << ")"
<< "[END]\t" << "NAME : " << name
<< ", elapsed time = " << milliSecond ;
}
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
// the amount of cores on your pc
qDebug() << " IDLE THREAD COUNT : " << QThread::idealThreadCount ();
QFuture<void> helloAlice = run( timeConsumingFunction, QString("Alice") );
QFuture<void> helloWhiteRabbit = run( timeConsumingFunction, QString("White Rabbit") );
QFuture<void> helloMadHatter = run( timeConsumingFunction, QString("Mad Hatter") );
QFuture<void> helloRedQueen = run( timeConsumingFunction, QString("Red Queen") );
QFuture<void> helloHumptyDumpty = run( timeConsumingFunction, QString("Humpty Dumpty") );
QTime spanTime;
spanTime.start();
helloAlice.waitForFinished();
helloWhiteRabbit.waitForFinished();
helloMadHatter.waitForFinished();
helloRedQueen.waitForFinished();
helloHumptyDumpty.waitForFinished();
quint32 milliSecond = spanTime.elapsed();
qDebug() << QThread::currentThread()
<< "(" << __FUNCTION__ << ")"
<< " elapsed time = "<< milliSecond ;
return app.exec();
}
#else
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
qDebug() << "Qt Concurrent is not yet supported on this platform";
return 0;
}
#endif
//
// *** Concurrent Programming for Qt ***
//
// The QtConcurrent namespace provides high-level APIs that make it possible
// to write multi-threaded programs without using low-level threading primitives
// such as mutexes, read-write locks, wait conditions, or semaphores.
// Programs written with QtConcurrent automatically adjust the number of threads
// used according to the number of processor cores available. This means that
// applications written today will continue to scale when deployed on
// multi-core systems in the future.
//
// QtConcurrent includes functional programming style APIs for parallel list p
// rocessing, including a MapReduce and FilterReduce implementation for
// shared-memory (non-distributed) systems, and classes for managing
// asynchronous computations in GUI applications:
//
// * QtConcurrent::map() applies a function to every item in a container,
// modifying the items in-place.
// * QtConcurrent::mapped() is like map(), except that it returns a new
// container with the modifications.
// * QtConcurrent::mappedReduced() is like mapped(), except that the modified
// results are reduced or folded into a single result.
// * QtConcurrent::filter() removes all items from a container based on the
// result of a filter function.
// * QtConcurrent::filtered() is like filter(), except that it returns a new
// container with the filtered results.
// * QtConcurrent::filteredReduced() is like filtered(), except that the
// filtered results are reduced or folded into a single result.
// * QtConcurrent::run() runs a function in another thread.
// * QFuture represents the result of an asynchronous computation.
// * QFutureIterator allows iterating through results available via QFuture.
// * QFutureWatcher allows monitoring a QFuture using signals-and-slots.
// * QFutureSynchronizer is a convenience class that automatically synchronizes
// several QFutures.
//

 

728x90
반응형
반응형
 
luajit 는 루아의 기능에 JIT 컴파일 기능을 추가하려는 계획으로 구성된 Mike Pall 이 구성한 프로젝트이다. 기본 구성은 루아 코드를 사용하지만, 동적으로 루아 코드를 파싱하는 방안이 아닌 x86또는 x64에 호환 가능한 코드로 구성된 코드로 변환하여 실행하는 방안으로 되어있다. 즉, 일반 루아와는 다르게 성능의 차이가 크다. 세부 코드를 보면 x86/x64 계열에서 사용하는 어셈블리 사용하게 되어 있고, 이는 DynASM 이라는 네이티브 코드 생성 엔진을 사용하게 되어 있다.  이는 ocamlc/mono 등에서 사용하는 방안이기도 한데, 모든 CPU와 OS에서 적용할 수는 없으며 특정한 환경에서만 사용 가능하다.
 개인이 구성한 프로젝트로는 매우 훌륭한 컨셉의 프로젝트이고, 장기적으로 오픈 소스 조직 또는 비영리 단체가  인수하여 프로젝트의 활성화가 되기를 기원한다...
   
728x90
반응형

'Lua' 카테고리의 다른 글

Jit compiler 테스트 중…  (0) 2011.07.02
luajit 테스트 - (2)  (0) 2011.06.26
luajit 테스트 - (1)  (0) 2011.06.26
반응형

Windows 명령 프롬프트(cmd.exe) 글꼴 변경 및 추가 방법

  • Windows 명령 프롬프트에서 글꼴을 변경하거나 새로운 글꼴을 추가하고 싶다면 아래 단계를 따라 진행하세요.

1. 레지스트리 편집기 실행

  • Win + R 키를 눌러 실행 창을 열고, 'regedit'를 입력한 후 Enter를 누릅니다.

2. 레지스트리 경로 이동

  • 다음 경로로 이동합니다:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont

3. 새 문자열 값 추가

  1. 해당 키에서 마우스 오른쪽 버튼을 클릭합니다.
  2. '새로 만들기 > 문자열 값'을 선택합니다.
  3. 새 문자열 값의 이름을 '0'으로 지정합니다. (이미 '0'이 존재한다면, '00', '000' 등으로 지정 가능합니다.)
  4. 새로 만든 문자열 값을 더블 클릭한 뒤, 값 데이터에 추가할 글꼴의 이름을 입력합니다.
    예: Consolas

4. 명령 프롬프트에서 글꼴 변경

  • 레지스트리 편집 후, 명령 프롬프트를 열고 창의 제목 표시줄을 오른쪽 클릭합니다.
  • '속성'을 선택한 뒤, '글꼴' 탭에서 방금 추가한 글꼴을 선택하고 '확인'을 눌러 적용합니다.


주의사항

  1. 레지스트리를 잘못 수정하면 시스템에 문제가 발생할 수 있습니다. 변경 전 반드시 레지스트리를 백업하세요.
  2. 추가하려는 글꼴은 반드시 시스템에 설치되어 있어야 하며, TrueType 글꼴이어야 합니다.
  3. 일부 글꼴은 명령 프롬프트에서 제대로 표시되지 않을 수 있습니다.

위 단계를 따르면 원하는 글꼴을 명령 프롬프트에서 사용할 수 있습니다.

728x90
반응형

'글꼴' 카테고리의 다른 글

글꼴 (나눔 D2 KoPub)  (0) 2024.04.10
Fixedsys 글꼴 (Truetype)  (0) 2011.05.01
Fixedsys 글꼴 : 트루타입(Truetype)  (0) 2010.06.02

+ Recent posts