개요

데이터베이스 혹은 파일시스템에 파일을 저장하는 방법을 기술한다.

Physical Address 혹은 Logical Address를 통해서 접근하며, 전자는 레코드의 진짜 위치에 대한 정보를 나타내고, 후자는 임의의 주소에 해당하는 숫자값을 나타낸다. 이 두개는 Map table을 통해서 서로 교환 가능하다.

이중 Physical Address는 Database address와 Memory Address로 구분될 수 있다. 전자는 seconday storage에 저장된 위치를 가르키는 주소이고 후자는 메모리의 어떤 지점에 데이터 베이스가 존재하는지 가르키는 주소값이다. 이 둘은 Translation table을 통해서 교환가능하다.

Pointer Swizzling

Pointer swizzling이라는 개념을 통해서 Translation table의 look up을 줄이는 노력이 있었다. Translation table은 검색을 해야 한다는 단점이 있음으로 Database의 다음 블럭을 가르키는 offset이나 address에 해당하는 database address가 아니라 memory address를 검색하게 함으로써 translation table look up cost를 줄이는 방법이다. 아 방식은 DB 포인터가 memory에 pinned되어 있지 않다는 장점이 있지만, translation look up time이 길어지는 단점이 있다.

스위즐링 후에, unsizzle과정에서는 변환된 memory address를 반드시 적절한 database address로 교환하여야 한다. 이때 메모리에 위치하는 block을 pinned block이라고 한다. 이 블럭은 디스크로 자유롭게 back할 수 없는데, 왜나하면 이러한 경우를 자유롭게 할 수 있도록 허락하면, swizzled된 포인터가 dangling pointer가 될 수 있기 때문이다 (예를 들면, Block A 가 메모리에 위치한 Block B에 대한 스위즐 포인트를 가지고 있는데 Block B가 지혼자 마음대로 사라지면 참조하는 메모리 영역이 사라지게 된다). unpinned할때는 translation table을 역참조 하여 이 블럭을 참고하는 모든 memory address에 대한 스위즐 포인터를 database address로 바꾸고 pinned된 상태를 해제하게 된다. (이러한 역참고는, 블럭에 저장된 현재 블럭을 가르키는 포인터들의 링크드 리스트를 통해서 이루어진다.)

Swizzling은 다음과 같은 여러 옵션을 통해서 사용될 수 있다.

  1. Automatic swizzling: 자동으로 블럭을 스토리지에서 메모리로 가져오는 동안에 스위즐링 해버린다.
  2. Swizzling on demand: 블럭을 메모리로 가져오는 순간에는 스위즐링 하지 않지만, 다른 블럭에 의해서 참고되어 가져오는 순간 스위즐링 한다. (즉 스위즐링 포인터가 필요한 시점에 스위즐링 한다.)
  3. No swizzling: 스위즐링 하지 않는다.

Fixed-Length Record

데이터 베이스를 고정된 길이로 저장한다. Record 헤더가 있으며 헤더에는 timestamp나 레코드의 길이와 같은 것을 저장한다. 헤더에는 offset table과 같은 것이 저장된다. Offset table이란 헤더에 여러 데이터들의 offset을 저장하는 자료 구조를 의미한다. 이를 통해서 쉽게 삭제, 검색, 추가가 가능하다는 장점이 있다.

Variable-Length Records

다양한 길의 형식을 같은 자료를 저장하기 위한 데이터 구조이다. 레코드 헤더에는 이러한 Variable data에 대한 포인터가 들어가게 된다. 만약 NULL이 들어가 있다면 이 필드에는 값이 없음을 나타낸다.

Repeating field와 같은 경우에는 같은 정보를 여러번 저장할 수도 있지만, 이러한 값을 그룹지어서 반복되는 횟수나 위치 혹은 반복되는 자료에 대한 주소값을 저장하는 방법도 있다.

또한 태그를 사용하여, 데이터에 대한 메타데이터를 저장하는 벙법도 있다. 이러한 경우는 integration Application이나 Flexible schema를 가진 레코드에서 많이 사용된다. 또한 이러한 헤더를 사용하여 데이터를 Spanning하는 기법도 사용된다. 데이터라 하나의 블럭에만 있는 것이 아니라 여러 블럭에 걸쳐서 존재한는 것을 말하는데, 데이터 블럭과 이들을 이어주는 데이터에 대한 메타데이터가 반드시 필요하다. Spanned 블럭은 큰 크기의 데이터를 나타내는데 사용될 수 있다.

이러한 variable length record에 자료를 추가하거나 삭제할때, 데이터를 slide해서 여분의 공간을 만들거나 지우기도 하고, 혹은 데이터에 대한 overflow block을 만들어서 데이터를 그곳에 저장하기도 한다. 삭제된 데이터는 이 데이터가 존재하지 않는다는 tombstone을 배치하여 전체 DB가 reconstructed되기 전까지 데이터가 없음을 나타내어 dangling pointer가 생기는 것을 막아야 한다.