23
1 캔 클러스터 파일 시스템의 설계 및 구현 Design and Implementation of CAN Cluster File System 황인철(In-Chul Hwang) 한국과학기술원 전자전산학과 전산학전공 컴퓨터구조연구실 2004년 07월 20일

캔 클러스터 파일 시스템의 설계 및 구현 - KAIST캔 클러스터 파일 시스템의 설계 및 구현 Design and Implementation of CAN Cluster File System 황인철(In-Chul

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

1

캔 클러스터 파일 시스템의 설계 및 구현

Design and Implementation of CAN Cluster File System

황인철(In-Chul Hwang)

한국과학기술원 전자전산학과 전산학전공 컴퓨터구조연구실

2004년 07월 20일

2

목차

1. 서론

2. 파일 시스템 Layout 및 data 구조

2.1 Super block

2.2 Inode bitmap

2.3 Data bitmap

2.4 Inode block

2.5 Data block

3. 캐쉬 일관성 정책

3.1 수퍼 블록의 캐쉬 일관성 정책

3.2 아이노드 비트맵&데이터 비트맵의 캐쉬 일관성 정책

3.3 아이노드 블록의 캐쉬 일관성 정책

3.4 데이터 블록의 캐쉬 일관성 정책

4. 각 함수 구현

4.1 Cache hash

3

4.2 Cache

4.3 Super

4.4 Inode

4.5 Directory

4.6 File

4.7 Name

4.8 통신 쓰레드

5. 결론 및 향후 과제

4

1. 서론

요즘 네트워과 PC의 성능이 향상됨에 따라 값싼 PC를 빠른 네트웍으로 묶

어 높은 성능을 내고자 하는 클러스터 컴퓨팅이 많이 연구 되어 왔다. 클러

스터 컴퓨팅에서는 사용자가 효율적으로 노드를 사용할 수 있도록 기존에

연구되던 다른 컴퓨팅 환경과 다른 방법의 지원이 필요하다. 기존의 단일

PC에서와 같이 클러스터 컴퓨팅에서도 I/O의 성능이 다른 성능- CPU나 메

모리, 네트웍 등등-보다 매우 나쁘기 때문에 사용자에게 클러스터의 잊점을

효율적으로 제공하기 위해서는 무엇보다 효율적인 파일 시스템의 개발이 필

요하다.

클러스터 파일 시스템은 기존 분산 시스템의 파일 시스템을 그대로 사용하

는 경우가 많았다. 기존 분산 파일 시스템들은 클러스터 컴퓨팅과 유사한 부

분들이 존재 하지만 다른 부분도 존재한다. 따라서 본 보고서에서는 기존의

분산 파일 시스템과 다른 특징을 지니는 캔 클러스터 파일 시스템을 설계하

고 구현하였다. 캔 클러스터 파일 시스템은 기존 분산 파일 시스템들이 문제

로 삼던 캐쉬의 일관성과 거의 유사하게 캐쉬의 일관성을 보장 시켜준다. 하

지만 기존 분산 파일 시스템과 달리 저장소 서브 시스템이 각 노드에 있는

디스크를 효율적을 묶는 단일 디스크 입출력 모듈을 이용함으로서 기존 분

산 파일 시스템과 다른 캐쉬 관리나 블록의 활용을 이용하게 된다.

5

본 논문에서는 캔 클러스터 파일 시스템을 설계하고 구현하였다. 다음 그림

은 캔 클러스터 파일 시스템의 모습을 나타낸 그림이다.

그림 1. 캔 클러스터 파일 시스템의 구조

캔 클러스터 파일 시스템은 각 노드의 디스크를 효율적으로 하나의 모습으

로 보여주는 단일 디스크 입출력 시스템을 기반으로 구성되며 파일 시스템

과 단일 디스크 입출력을 위한 커널 모듈 사이에는 상호 협력 캐쉬가 캐슁

을 수행함으로서 높은 성능을 저장할 수 있게 된다.

본 보고서는 다음과 같이 구성된다. 2장에서는 파일 시스템의 데이터 배열

이 어떻게 되는지 살펴보고 3장에서는 데이터 일관성을 위한 캐쉬 관리 정

책에 대해 살펴본다. 4장에서는 파일 시스템 인터페이스를 유지하기 위한 여

러 함수들이 어떻게 구현되었는지 살펴보도록한다.

6

2. 캔 클러스터 파일 시스템 데이터 배열

효율적인 파일 시스템의 구성을 위해서는 파일 시스템 레이아웃의 구성이

매우 중요하다. 하지만 본 파일 시스템은 추후 확장을 위하여 간단한 프로토

타입으로 구성되기 때문에 데이터 배열도 복잡하지 않고 단순하게 구성되었

다.

캔 클러스터 파일 시스템의 데이터 배열은 다음 그림 2와 같다.

그림 2. 캔 클러스터 파일시스템의 Layout

각 노드들은 자신이 무슨 데이터를 가지고 있는지 모르고 위 그림 2과 같

은 구조로 데이터가 배열되어 있다고 생각하여 동작하게 된다. 각 노드별로

데이터를 분산시키기 위하여 위 배열에서 각 block 하나 하나는 여러 노드

에 분산시키게 된다. 자세한 내용은 3장에서 다시 언급하도록 하겠다.

7

2.1 Super block

수퍼 블록은 파일시스템의 중요한 정보를 담고 있는 블록으로 캔 클러스터

파일 시스템에서는 처음 블록을 수퍼 블록으로 사용한다. 수퍼 블록은 다음

과 같은 structure를 저장하고 있다.

struct ccfs_super_block {

__u32 s_inodes_count; /* Inodes count */

__u32 s_blocks_count; /* Blocks count */

__u32 s_r_blocks_count; /* Reserved blocks count */

__u32 s_free_blocks_count; /* Free blocks count */

__u32 s_free_inodes_count; /* Free inodes count */

__u32 s_first_data_block; /* First Data Block */

__u32 s_log_block_size; /* Block size */

__u32 s_mtime; /* Mount time */

__u32 s_wtime; /* Write time */

__u16 s_mnt_count; /* Mount count */

__s16 s_max_mnt_count; /* Maximal mount count */

__u32 inode_free; /* Free Inode Count */

__u32 inode_alloc; /* Inode Count */

__u32 first_inode; /* First Free Inode Number */

__u32 first_data; /* First Free Data Block Number */

};

데이터 배열에서 처음 N(노드의 개수)블록이 이 데이터로 채워져 있다. 즉

각 노드당 하나의 수퍼블럭을 저장하고 있게 된다. 이 중 master노드(각 노

드중에 하나가 master 노드이다)만이 정확한 아이노드 개수와 유휴 아이노

드 개수를 저장하고 나머지 노드들은 각자 자신의 수퍼 블록 정보를 지니고

있게 됨으로서 자신만의 data- 자신의 블록중 처음인것, 자신의 아이노드중

8

처음인 것-를 저장할 수 있게된다.

2.2 Inode bitmap

아이노드 비트맵은 아이노드가 할당된 상태를 나타낸다. 아이노드 비트맵

은 수퍼 블록 다음에 위치하게 되며 총 N*1블럭 이다. 즉 각 노드는 하나의

블록에 자신의 아이노드 블록에 대한 비트맵을 지니게 되며 캔 클러스터 파

일 시스템은 N*1024*8개의 아이노드를 지원하게 된다. 각 노드별로 1024*8

의 아이노드를 저장한다.

2.3 Data bitmap

데이터 비트맵은 데이터 블록이 할당된 상태를 나타낸다. 데이터 비트맵은

아이노드 비트맵 이후 저장된다. 총 개수는 N*126개의 블록에 저장되며 이

때 캔 클러스터 파일 시스템이 저장할 수 있는 블록의 개수는

N*126*1024*8블록이고 약 N기가의 데이터를 저장할 수 있다. 데이터 비트

데이터 비트맵도 각 노드별로 126개의 블록을 저장하게 하고 각 노드가 제

공하여 주는 데이터 블록에 대한 정보를 저장하게 된다.

2.4 Inode block

아이노드 블록은 할당된 아이노드의 정보를 저장하는데 사용된다. 아이노

드 블록은 데이터 비트맵 다음에 위치하며 위 아이노드 비트맵에서 언급한

바와 같이 총 개수는 N*1024*8개 이다. 즉, 각 노드별로 1024*8개의 블록

9

을 아이노드 블록으로 저장한다.

다음은 캔 클러스터 파일 시스템에서 아이노드 블록에 저장하는 정보를 나

타내는 데이터 구조이다.

struct ccfs_inode {

__u16 i_mode; /* File mode */

__u16 i_uid; /* Low 16 bits of Owner Uid */

__u32 i_size; /* Size in bytes */

__u32 i_atime; /* Access time */

__u32 i_ctime; /* Creation time */

__u32 i_mtime; /* Modification time */

__u32 i_dtime; /* Deletion Time */

__u16 i_gid; /* Low 16 bits of Group Id */

__u16 i_links_count; /* Links count */

__u32 i_blocks; /* Blocks count */

__u32 i_flags; /* File flags */

__u32 i_block[CCFS_N_BLOCKS];/* Pointers to blocks */

struct ccfs_data_block* dirty_block;

};

각 아이노드 블록은 각각의 시간에대한 정보와 링크 개수, 사이즈 등등의

중요한 정보를 가지고 있게 된다. 그리고 아이노드에 연결된 데이터 블록들

중 더티한 블록에대한 포인터를 가지고 있어서 나중에 아이느도가 사라질

때 업데이트 할 수 있도록 한다.

2.5 Data block

데이터 블록은 파일의 데이터를 저장하는데 사용되며 아이노드 블록 이후

10

에 위치하여 저장된다. 사용 가능한 데이터 블록의 수는 데이터 비트맵에서

언급했듯이 N*1024*8*126이며 캔 클러스터 파일 시스템에서 지원가능한 파

일 사이즈는 약 N Gbyte이다.

데이터 블록은 실제 파일 데이터 뿐 아니라 디렉토리의 내용을 저장하는

것에도 사용되며 이럴경우 다음과 같은 구조를 저장한다.

struct ccfs_dir_entry{

int total_num;

int name_len[BLOCK_PER_FILE];

char name[BLOCK_PER_FILE][CCFS_NAME_LEN];/* File name */

unsigned long inode_num[BLOCK_PER_FILE];

unsigned char type[BLOCK_PER_FILE];

};

디렉토리에는 총 개수와 각 이름의 길이, 이름, 아이노드 번호, 엔트리의

타입을 저장하게된다.

11

3. 캐쉬 일관성 정책

캔 클러스터 파일 시스템은 기존 리눅스에서 사용하는 페이지 캐쉬나 버퍼

캐쉬를 사용하지 않고 자신의 고유한 메모리 영역을 잡아서 그곳에 캐슁을

하고 캐쉬 관리자사이에 협력을 통하여 효율적인 데이터 공유를 한다. 이러

한 캐슁을 수행할 때 고려해야 할 점은 각 노드에 분산되어 캐슁되어있는

데이터들의 일관성을 고려해 주어야 한다.

우선 파일 시스템의 모든 데이터는 캐슁이 될 수 있기 때문에 일관성을 유

지해야 하는 구조들은 슈퍼블럭, 아이노드 비트맵, 데이터 비트맵, 아이노드

블록, 데이터 블록들을 일관성을 유지시켜야한다. 각 데이터 구조들은 각각

의 특징을 지니고 있기 때문에 같은 일관성정책을 통하여 수행하는 것은 성

능상의 나쁜영향을 미치게 되므로 각 데이터의 특성에 맞는 데이터 일관성

정책을 정해 상용하여야 한다.

다음은 각 데이터별로 적용한 캐쉬 일관성 정책이다.

3.1 슈퍼블럭의 캐쉬 일관성 정책

슈퍼블럭에 있는 데이터중 중요한 정보는 할당된 아이노드 개수, 남는 아이

노드 개수, 할당된 데이터 개수, 유휴한 데이터 개수를 유지시켜주는 것 이

외에 나머지는 각 노드별로 유지하는 것이 좋다. 그리고 위 몇가지 데이터들

은 모든 노드에서 정확한 정보를 유지하는게 필요하기 보다는 하나의 노드

12

에만 update하면서 정확한 정보를 유지시켜주면 된다. 따라서 한 노드를

master노드로 정하고 그곳에서만 정확하게 유지시킨다. 그리고 만약 다른

노드에서 데이터들이 필요할 때 얻어가게 한다.

3.2 아이노드 비트맵과 데이터 비트맵

아이노드 비트맵과 데이터 비트맵은 자신의 노드에 저장된 정보를 저장하

고 있기 때문에 노드들 사이에 공유를 하지 않는다. 만약 다른 노드에 저장

하고 있는 비트맵에 대한 정보를 얻거나 update할 필요가 있을경우 직접 그

노드에 요청하여 처리하도록 함으로서 그 일관성을 유지시킨다.

3.3 아이노드 블록의 캐쉬 일관성 정책

아이노드 블록은 여러 노드에 공유될 경우 update를 기본으로 하는 캐쉬

일관성 정책을 사용한다. 만약 update가 아닌 invalidation 기본으로 하는 캐

쉬 일관성 정책을 사용할 경우 리눅스 VFS레이어에서 사용하는 inode나

dentry를 모두 없얘주어야 하는 큰 부하가 걸리게 된다. 따라서 이미 공유하

고 있는 아이노드끼리의 일관성은 하나의 노드라도 아이노드를 update하면

전체가 다 update되도록 한다.

그리고 아이노드 블록에 저장되어 있는 데이터 구조들 중에 접근 시간이라

던지 만든 시간과 같은 정보는 정확한 일관성을 유지시켜 주지 않아도 되기

때문에 그러한 정보는 update되더라도 캐슁된 아이노드 블록을 update시키

13

지 않는다. 정확한 정보를 유지시켜야 하는 size와 mode, 그리고 block의

개수들이 udpate될 때 update시키는 정책을 사용하였다.

3.4 데이터 블록의 캐쉬 일관성 정책

데이터 블록은 모두 invalidation정책을 이용하여 일관성을 유지시킨다. 이

는 공유되는 데이터 블록을 update시킬 경우 차후 사용하지 않을 데이터를

update하는 비용이 비싸기 때문에 각 홈노드만 정확한 정보를 지니게 하고

나머지 블록들은 invalidation시켜서 나중에 필요하면 데이터를 전송받게 하

는 정책을 사용하였다.

14

4. 각 함수 구현

4.1 Cache hash functions

캔 클러스터 파일 시스템은 기존 파일 시스템과 달리 리눅스의 페이지 캐

쉬나 버퍼 캐쉬를 사용하지 않고 커널 메모리를 할당받아 캐슁을 할 수 있

는 고유의 캐쉬 layer를 구성하여 작성되었다. 이러한 캐슁된 데이터를 빨리

찾기 위하여 해쉬 테이블을 이용한다. 캔 클러스터 파일 시스템에서는 아이

노드 해쉬테이블과 데이터 해쉬테이블이 따로 존재한다. 캐쉬된 데이터에 대

한 해쉬 테이블 function들은 다음과 같다.

- void init_hash() : 각 inode와 data 블록을 hash할 hash table을 초기화 한다.

- struct ccfs_inode_block_desc* ccfs_find_inode_cache(unsigned long inode_num) :

inode 번호에 맞는 inode block을 찾아서 return 시킨다. 없으면 NULL을 return

- struct ccfs_data_block* ccfs_find_data_cache(unsigned long block_num) : 블록 번호에

맞는 데이터 블록을 찾아서 return 시킨다. 없으면 NULL을 return

- void ccfs_add_inode_cache(struct ccfs_inode_block_desc* cibd) : inode 블록을 해쉬

에 추가시킨다.

- void ccfs_add_data_cache(struct ccfs_data_block* cdb) : 데이터 블록을 해쉬에 추가시

킨다.

15

- void ccfs_del_inode_cache(unsigned long inode_num) : 아이노드 번호를 갖는 블록을

지운다. 자신이 그 블록의 홈일 경우는 다른 노드에 캐슁된 아이노드 블록도 invalidation

시킨다. 홈이 아닐경우는 홈 노드에게 아이노드 블럭을 지우라는 요청을 한다.

- void ccfs_del_data_cache(unsigned long block_num) : 블록 번호를 갖는 데이터 블록을

해쉬에서 지운다. 이것도 마찬가지로 자신의 홈이면 다른 노드에 캐슁된 데이터 블록을 지

운다. 홈이 아닐경우 홈노드에게 데이터 블록을 지우라는 요청을 한다.

- void ccfs_destory_all_cache() : 해쉬 테이블에 캐슁되어 있는 모든 데이터 뿐 아니라 수

퍼블럭, 비트맵 등도 디스크로 flushing 시킨다.

4.2 Cache functions

캐쉬 함수들은 실제 CCFS interface와 캐쉬된 데이터를 엮어주는 함수들로

구성되어 있다.

- struct coopc_inode_block* ccfs_get_inode_block(unsigned long inode_num) : inode 에

맞는 inode block을 찾아온다. 만약 자신이 홈 노드이면 자신의 캐쉬를 뒤진다음 없으면 자

신의 디스크로부터 내용을 읽어와 return한다. 만약 다른 노드가 홈 노드일 경우 홈 노드에

게 요청하여 그 내용을 얻어오도록 한다.

- void ccfs_update_inode_block(unsigned long inode_num) : inode_num에 맞는 inode

block을 홈 노드에 update 시킨다.

16

- void ccfs_delete_inode_block(unsigned long inode_num) : 아이노드 번호에 맞는 아이

노드 블록을 지운다. 해쉬함수들 중 del_inode_cache함수를 이용하여 제거한다.

- struct coopc_inode_block* ccfs_new_inode_block(unsigned long inode_num) : 아이노

드 번호를 같는 아이노드 블록을 할당하여 return 한다.

- int ccfs_check_inode_bitmap(unsigned long inode_num) : 아이노드 번호에 맞는

bitmap의 bit가 설정되어있는지 check한다. 만약 아이노드의 홈이다른 노드일 경우 그 홈

노드에게 check 요청을 한 후 결과를 받아 온다.

- void ccfs_set_inode_bitmap(unsigned long inode_num) : 아이노드 번호에 맞는 아이노

드를 새로 만들 경우 그 번호에 맞는 비트맵의 비트를 셑팅한다.

- void ccfs_clear_inode_bitmap(unsigned long inode_num) : 아이노드 번호에 맞는 아이

노드를 해제하였을 경우 그 번호에 맞는 비트맵을 클리어 시킨다.

- struct coopc_data_block* ccfs_get_data_block(unsigned long block_num) : 블록 번호

에 맞는 데이터를 찾아온다. 자신의 캐쉬에 있을경우는 그것을 리턴시키고, 없을경우 자신

이 홈이면 자신의 디스크로부터 읽어오고 다른 노드가 홈일경우에는 다른 노드로부터 읽어

온다.

- void ccfs_update_data_block(unsigned long block_num) : 블록 번호에 맞는 블록의 내

용을 홈 노드에 flushing시킨다.

- void ccfs_delete_data_block(unsigned long block_num) : 블록 본호에 맞는 캐슁 블록

17

들을 지운다. 이 함수는 해쉬 펑션의 del_data_cache함수를 이용하여 지운다.

- struct coopc_data_block* ccfs_new_data_block(void) : 새로운 데이터 블록을 할당 받

는다.(새로 할당하여)

- int ccfs_check_data_bitmap(unsigned long block_num) : 블록 번호에 맞는 비트맵의 비

트를 체크하여 본다.

- void ccfs_set_data_bitmap(unsigned long block_num) : 블록 번호에 맞는 비트맵 비트

를 세팅한다.

- void ccfs_clear_data_bitmap(unsigned long block_num) : 블록 번호에 맞는 비트맵 비

트를 클리어시킨다.

- void ccfs_update_super(void), ccfs_clear_super(void) : 수퍼블럭을 디스크에 flushing시

키거나 없얜다.

- void ccfs_update_first_inode(void) : 자신의 비트맵을 살펴보고 자신의 디스크의 아이노

드 블록중 유휴한 처음의 아이노드 블록 번호를 다시한번 갱신한다.

- void ccfs_update_first_data(void) : 자신의 데이터 비트맵을 살펴보고 유휴한 데이터 블

록중 가장 작은 데이터 블록 번호를 갱신한다.

- void ccfs_put_data_block(char* temp, unsigned long offset, int end, struct

coopc_data_block* cdb) : 데이터 블록의 쓰기가 일어났을 때 불리우는 함수로 홈 노드에

그 내용을 보내 갱신 시킨다.

18

- void ccfs_put_inode_block(struct coopc_inode_block* cib) : 중요한 아이노드 정보가

갱신되었을 때 그 내용을 홈노드에 보내어 갱신 시킨다.

4.3 Super fuctions

- void ccfs_put_super(struct super_block *) : 수퍼블럭을 flushing시킨다.

- void ccfs_write_super(struct super_block *) : 수퍼블럭을 적는다.

- int ccfs_statfs(struct super_block *, struct statfs *): 수퍼블럭을 보면서 그 파일시스템

의 정보를 채워넣는다.

-struct super_block* ccfs_read_super(struct super_block*, void *, int) : 수퍼블럭의 내용

을 디스크로부터 읽어와 저장한다.

4.4 Inode functions

- int ccfs_readpage(struct file *, struct page *) : 페이지에 파일의 내용을읽어노는 함수

- int ccfs_writepage(struct page* page) : 페이지에 있는 내용을 파일에 적는 역할을 수행

한다.

- void ccfs_read_inode(struct inode *) : 아이노드를 읽어온다. 아이노드가 할당되어있을

경우에만 정상적으로 동작하며 다른 노드가 홈일경우는 다른 노드로부터 그내용을 가져온다.

- void ccfs_write_inode(struct inode *, int) : 아이노드의 내용을 적는다. 적기를 한 후에는

자신이 홈일 경우 캐슁된 모든 아이노드 블록을 갱신 해 주어야 한다. 홈이 아닐경우는 홈

에게 갱신 요청을 보내어 모든 캐슁 블록이 갱신되도록 한다.

19

- void ccfs_put_inode(struct inode *) : 아이노드를 적는다.

- void ccfs_delete_inode(struct inode *) : 아이노드를 지우는 역할을 수행한다.

- void ccfs_clear_inode(struct inode *) : 위와 동일

4.5 Directory functions

- int ccfs_readdir(struct file *file, void *d, filldir_t filld) : 디렉토리 엔트리로부터 디렉토리

내부의 이름들을 읽어온다.

- int ccfs_add_link(struct dentry *dentry, struct inode *inode) : 디렉토리에 새로운

inode를 추가시킨다.

- int ccfs_empty_dir(struct inode* dir) : 디렉토리가 공 디렉토리인지 체크한다.

- void ccfs_make_empty(struct inode* inode, struct inode* dir, struct coopc_data_block*

cdb); : 새로운 디렉토리를 만든후 디렉토리의 내용을 공란으로 체운다.

- int ccfs_create (struct inode *inode,struct dentry *dentry,int i) : 새로운 inode를 만들어

서 dentry와 연결 시킨다.

- struct dentry* ccfs_lookup(struct inode *inode,struct dentry *dentry) : 아이노드의 이름

이 디렉토리에 있는지 살펴본다.

- int ccfs_link(struct dentry *dentry,struct inode *inode,struct dentry *den) : 디렉토리에

아이노드에 대한 링크를 만든다.

- int ccfs_unlink(struct inode *inode,struct dentry *dentry) : 디렉토리에서 아이노드의 링

20

크를 없앤다.

- int ccfs_mkdir(struct inode *inode,struct dentry *dentry,int mode) : 새로운 디렉토리를

만든다.

- int ccfs_rmdir(struct inode *inode,struct dentry *dentry) : 디렉토리를 삭제한다.

- int ccfs_rename(struct inode *inode, struct dentry *dentry,struct inode *b, struct dentry

*c) : old entry를 new entry로 옮긴다.

4.6 File functions

- void ccfs_truncate(struct inode *): 아이노드 길이를 줄이거나 늘인다.

- loff_t ccfs_llseek(struct file *, loff_t, int) : 오프셑을 옮긴다.

- ssize_t ccfs_read(struct file *, char *, size_t, loff_t *) : 파일의 내용을 읽는다.

- ssize_t ccfs_write(struct file *, const char *, size_t, loff_t *) : 파일의 내용을 적는다. 이

때 아이노드의 업데이터와 데이터 업데이트를 수행시켜 데이터 일관성을 유지시킨다.

4.7 Name functions

- int ccfs_check_file_name_in_dir(struct coopc_data_block* cbd, char* name, int

namelen): 디렉토리에 같은 이름이 있는 지 살펴본다.

- void ccfs_add_file_name_in_dir(struct coopc_data_block* cdb, char* name, int

namelen, struct inode* inode, struct inode* dir) : 파일 이름을 추가시킨다.

void ccfs_delete_file_name_in_dir(struct coopc_data_block* cbd, char* name,int

21

namelen) : 파일 이름을 지운다.

4.8 통신 쓰레드

통신 쓰레드는 다른 노드들로부터의 요청을 처리하기 위해여 동작하는 쓰

레드 이다. 각 노드는 자신의 요청을 보낼 소켓과 다른 노드의 요청을 받아

들일 소켓을 만든후 요청을 받는 쓰레드를 만들어 다른 노드로부터의 요청

을 처리하게된다.

다음은 통신 쓰레드에서 처리하는 여러가지 요청과 그에 따른 행동을 나타

낸다.

#define BLOCK_REQ 0 : 데이터 블록이나 아이노드 블록을 전송한다. 자신이 홈 노드일

경우에만 이 요청이 요구된다.

#define WRITE_REQ 1 : 데이터 블록이나 아이노드 블록에 대한 쓰기 요청이다. 이도 자신

이 홈 노드일 경우에만 이 요청이 들어오게된다. 이 요청은 우선 내용을 갱신 시킨후 공유

하고 있는 다른 노드에 있는 캐슁 블록을 캐쉬 일관성 정책에 의해 일관성을 유지시켜준다.

#define INVAL_REQ 2 : 이 요청은 데이터 블록에 대한 요청만이 오게되고 블록 번호에 맞

는 데이터 블록을 해쉬에서 찾아 지운다.

#define INIT_JOIN 3 : 처음 노드들 같의 통신 셑업을 위한 메시지

#define INIT_CONN 4 : 모든 노드들이 접속하였을경우 서로간의 통신 채널을 설정하라는

22

메시지

#define BITMAP_CHECK 5 : 이 요청을 받은 노드의 비트맵중 아이노드/데이터 블록 번호

에 맞는 비트맵이 체크되어 있는지 체크하는 역할을 수행한다.

#define BITMAP_SET 6 : 위와 유사

#define BITMAP_CLEAR 7 : 위와 유사

#define DEL_INODE_BLOCK 8 : 아이노드 블록을 지워버린다.

#define DEL_DATA_BLOCK 9 : 데이터 블록을 지운다.

#define SUPER_UPDATE 10 : 수퍼블럭을 적는다.

#define SUPER_READ 11 : 수퍼블럭을 읽어온다.

#define SUPER_I_INC 12 : 아이노드 개수를 늘인다. 이 요청은 master노드에게만 간다.

#define SUPER_I_DEC 13 : 위와 유사

#define SUPER_D_INC 14 : 위와 유사

#define SUPER_D_DEC 15 : 위와 유사

#define UPDATE_REQ 16 : 아이노드 블록이나 데이터 블록을 업데이트하게 한다.

23

5. 결론 및 향후 과제

본 보고서에서 살펴본 바와 같이 싼 값의 PC를 이용한 클러스터 컴퓨팅에

서 효율적인 데이터 서비스를 위해서는 단일 디스크 입출력, 상호협력 캐쉬

가 필요하다. 단일 디스크 입출력은 여러 노드의 디스크를 하나의 이미지로

보여주면서 병렬성을 제공하고 상호 협력 캐쉬는 효율적인 캐쉬를 통하여

높은 성능을 제공하여 줄 수 있다.

본 보고서에서는 이와 같은 것을 하나로 통합하여 캔 클러스터 파일 시스

템을 설계하고 구현하였다.

아직은 프로토타입이고 아이노드 할당 및 디스크 블록의 할당에 있어서 약

점이 존재하고 있다. 그리고 성능 평가를 하지 않아서 성능의 문제점을 파악

하지 못하고 있는 실정이다. 따라서 앞으로 성능평가를 통하여 여러 문제점

을 파악하고 이를 해결하도록 노력하겠다. 또한 효울적인 캐슁 관리 및 데이

터 할당 정책들에 대한 연구도 수행할 예정이다.