C언어

내가 해보고 싶은 분산 컴퓨팅

고요한하늘... 2008. 12. 12. 16:10

컴퓨터 하드웨어가 아무리 빨리 발전한다고 해도 사람의 욕심을 채우긴 영원히 힘들것이다.

15년전과 비교해서 컴퓨터가 눈부실 정도로 좋아졌지만 아직도 성능에 만족하는 사람은 그리 많지 않은것 같다.

나같이 데이터를 다루는 사람이라면 발전하는 컴퓨터 성능보다 몇 배로 늘어나는 데이터를 보며,

그저 무어의 법칙만을 믿고 기다리기에는 인생이 너무 짧다.

 

짧은 인생동안 해볼수 있는 방법중에 가장 먼저  생각해 볼수 있는 방법이 분산처리이다.

분산처리 방법에는 구글에서 GFS를 기반으로 MapReduce라는것도 있고 HDFS 기반의 Hadoop도 있다.

하지만 그런 툴들의 사용법 보다는 그 시스템 자체가 더 흥미롭다.

 

리눅스에는 SO(Shared Object)라는 파일이 존재한다. 윈도위의 DLL정도 되겠다.

so 파일의 특징은 함수를  run time시에 binding 한다는 점이다.

이 점을 잘 이용하면 원하는 기능을 다른 서버에서 처리하고 결과값만 받아올수도 있을것 같다.

 

         C

------+-------

|        |         |

S1     S2        S3

 

위와 같이 구성되어 있다고 하면

C에서 S1,2,3로 자신이 원하는 함수가 구현되어 있는 SO를 보내고( tcp/ip ) 파일이 완료되면 파일을 읽어서 binding을 하고 function call을 하면 쉽게 구현이 가능할것 같다.

 

범용적으로 하기 위해서는

intialize, processing, finalize 3개 정도 함수로 구성하고, void *로 입력과 출력을 하면 될것 같다.

typedef void* (*init_t)(void *);
typedef void* (*proc_t)(void *);
typedef void* (*final_t)(void *);

int main(int argc, char *argv[])
{
        char so_home[BUFSIZE];
        char line[BUFSIZE];
        char output[BUFSIZE];

        init_t init;
        proc_t proc;
        final_t final;
        void *so_object;
        void *data;

        sprintf( so_home,"%s/libtest.so",dic_path );
        fprintf( stderr,"%s/libtest.so\n",dic_path  );
        if((so_object = dlopen(so_home,RTLD_LAZY)) == NULL)
        {
                fprintf(stdout, "%s %s %s %s [%d] cannot open shared object\n", __DATE__, __TIME__, __FILE__, __func__, __LINE__);
                return 0;
        }


        init  = dlsym(so_object,"test_init");
        proc  = dlsym(so_object,"test_proc");
        final = dlsym(so_object,"test_final");

        data=init(data);
        proc(data);
        final(data);
        dlclose(so_object);


        return 0;
}

 

문제는 처리할 데이터인데 GFS나 HDFS같이 NFS가 전제 되어야 효과가 있을것 같다.