이전 글에서 설명한 가변길이 레코드 방식을 실제로 구현해보았다. 레코드파일 person.c의 구조는 다음과 같다.
- 레코드 파일
1. 레코드 파일은 헤더 영역과 데이터 영역으로 이루어져있다.
2. 헤더 영역에는 헤더 레코드가 존재하고 데이터 영역에는 여러 개의 데이터 페이지가 존재한다.
- 헤더 레코드
1. 헤더 레코드는 전체 데이터 페이지 수 4바이트, 레코드 파일에 존재하는 모든 레코드 수 4바이트, 마지막 8바이트에는 4바이트씩 삭제 레코드를 관리하기 위해 가장 최근에 삭제된 레코드의 페이지 번호와 레코드 번호를 가지고 있다. 2. 만약 삭제 레코드가 존재하지 않는다면 헤더 레코드의 마지막 8바이트의 값은 모두 -1이다.
3. 레코드가 삭제되었을 때 헤더 레코드의 페이지 수나 모든 레코드의 수는 수정하지 않는다.
4. 삭제 레코드는 연결리스트 방식으로 관리된다.
- 데이터 페이지
1. 데이터 페이지는 헤더 영역과 데이터 영역으로 나누어져있다.
2. 헤더 영역에는 페이지에 저장된 레코드의 수, 각 레코드의 주소, 길이(offset, length)가 있으며 데이터 영역에는 실제 저장하려는 레코드가 저장된다.
3. 레코드의 수, 주소, 길이는 각각 4바이트이며 첫 번째 레코드의 주소는 0이다.
4. 데이터 페이지의 번호는 0부터 부여한다.
- 레코드
1. 레코드는 가변길이 방식으로 저장한다.
2. 레코드의 필드는 구분자(delimiter)를 이용한다. 이때 구분자로 '#'을 사용한다.
3. 새로운 레코드는 파일의 마지막 페이지의 마지막 레코드 다음 위치에 저장되고 공간이 부족할 경우 데이터 페이지를 새로 할당하여 저장한다.
4. 만약 삭제레코드에 새로운 레코드를 저장할 수 있는 경우 삭제 레코드에 저장한다. 이때 first-fit 방식을 이용한다.
5. 삭제 레코드에 추가할 경우 연결리스트의 앞과 뒤를 연결해주어야한다.
6. 삭제 레코드 중에 추가할 수 없는 경우 3번과 같이 추가한다.
7. 레코드를 삭제할 경우 delete mark로 '*'를 사용하며 delete mark 뒤에 연결리스트에 사용될 다음 삭제 레코드의 페이지 번호와 레코드 번호가 4바이트씩 binary integer 형식으로 저장된다.
8. internal fragmentation은 고려하지 않는다.
레코드는 다음과 같이 이루어져있다.
#define MAX_RECORD_SIZE 100 // including 6 delimeters
#define PAGE_SIZE 256 // 임의로 지정
#define HEADER_AREA_SIZE (PAGE_SIZE/10)
#define DATA_AREA_SIZE (PAGE_SIZE - HEADER_AREA_SIZE)
typedef struct _Person
{
char id[14];
char name[18];
char age[4];
char addr[22];
char phone[16];
char email[26];
} Person;
#endif
위의 6개의 정보로 이루어진 구조체가 하나의 레코드로 저장된다.
완성된 코드는 아래 링크에서 확인할 수 있다.
https://github.com/Seo-sang/variable_length_record
Seo-sang/variable_length_record
Contribute to Seo-sang/variable_length_record development by creating an account on GitHub.
github.com
개발 환경은
OS Linux Ubuntu 20.04
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
이다.
'파일처리' 카테고리의 다른 글
simple index 파일을 활용한 레코드 파일 관리 (0) | 2021.07.14 |
---|---|
파일에서의 레코드 삭제 방법과 관리(File Processing) (0) | 2021.06.25 |
파일 구조(File structure) : 고정길이 방식과 가변길이 방식(fixed length, variable length) (0) | 2021.06.25 |
Binary Search Tree(BST)와 B-Tree,B+Tree (0) | 2021.06.23 |
파일처리(File Processing)와 파일 구조(File Structure) (0) | 2021.06.23 |