KR20100056685A - Ssd 관리 장치 및 방법 - Google Patents

Ssd 관리 장치 및 방법 Download PDF

Info

Publication number
KR20100056685A
KR20100056685A KR1020080115607A KR20080115607A KR20100056685A KR 20100056685 A KR20100056685 A KR 20100056685A KR 1020080115607 A KR1020080115607 A KR 1020080115607A KR 20080115607 A KR20080115607 A KR 20080115607A KR 20100056685 A KR20100056685 A KR 20100056685A
Authority
KR
South Korea
Prior art keywords
logical block
ssd
write request
sectors
bandwidth
Prior art date
Application number
KR1020080115607A
Other languages
English (en)
Other versions
KR100970537B1 (ko
Inventor
노삼혁
이동희
최종무
김은삼
현철승
오용석
Original Assignee
서울시립대학교 산학협력단
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 서울시립대학교 산학협력단 filed Critical 서울시립대학교 산학협력단
Priority to KR1020080115607A priority Critical patent/KR100970537B1/ko
Publication of KR20100056685A publication Critical patent/KR20100056685A/ko
Application granted granted Critical
Publication of KR100970537B1 publication Critical patent/KR100970537B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/064Management of blocks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/061Improving I/O performance
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system
    • G06F3/0673Single storage device
    • G06F3/0679Non-volatile semiconductor memory device, e.g. flash memory, one time programmable memory [OTP]

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Human Computer Interaction (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

솔리드 스테이트 드라이브(Solid State Drive: SSD)의 저장 공간을 적어도 하나의 논리 블록(Logical Block)으로 분할하고, 상기 SSD에 대해 적어도 하나의 쓰기(write) 요청이 발생하는 경우, 상기 적어도 하나의 논리 블록 중에서 어느 하나의 논리 블록에 대해 상기 적어도 하나의 쓰기 요청을 할당하여 상기 어느 하나의 논리 블록 단위로 쓰기 요청을 수행하는 SSD 관리 장치가 개시된다.
SSD, 논리 블록, 쓰기, 관리

Description

SSD 관리 장치 및 방법{METHOD AND DEVICE FOR MANAGING SOLID STATE DRIVE}
솔리드 스테이트 드라이브(Solid State Drive: SSD) 관리 장치 및 방법이 개시된다. 특히, SSD의 쓰기 연산 과정에 대한 성능 향상을 통해 SSD 전반에 대해 성능을 향상시킬 수 있는 SSD 관리 장치 및 방법이 개시된다.
데이터를 저장하는 스토리지 장치로는 자기 디스크(magnetic disk), 반도체 메모리 등이 있을 수 있다. 스토리지 장치는 종류 별로 서로 다른 물리적 특성을 가지기 때문에 물리적 특성에 상응하는 관리 방법이 필요하다.
종래의 스토리지 장치로는 자기 디스크가 널리 사용되어 왔다. 자기 디스크는 평균적으로 킬로바이트(kilobyte) 당 수 밀리초(millisecond)의 읽기 및 쓰기 시간을 특성으로 가진다. 또한, 자기 디스크는 데이터가 저장된 물리적 위치에 따라 암(arm)이 도달하는 시간이 다르기 때문에 읽기 및 쓰기 시간이 달라지는 특성을 가진다.
최근에는 자기 디스크에 비하여 읽기 및 쓰기 시간이 짧고 작은 전력을 소모하며 작은 부피를 차지하는 비휘발성 메모리 장치가 급속하게 자기 디스크를 대 체하고 있다. 이는 비휘발성 메모리 장치의 대용량화가 이루어졌기 때문에 가능한 결과이다.
비휘발성 메모리 장치는 전기적으로 읽기(read), 쓰기(write) 및 소거(erase)가 가능하며, 공급 전원이 없는 상태에서도 저장된 데이터를 유지할 수 있는 반도체 메모리 장치이다. 비휘발성 메모리 장치에 대한 데이터의 저장 과정은 쓰기 외에도 프로그래밍(programming)이라고 불리기도 한다.
비휘발성 메모리 장치에 대한 프로그래밍은 페이지 단위로 수행될 수 있고 소거는 블록 단위로 수행될 수 있다. 블록은 복수의 페이지들을 포함할 수 있다. 비휘발성 메모리 장치의 컨트롤러는 외부의 호스트(host) 또는 프로세서(processor)에 논리 주소(logical address)를 제공하고, 비휘발성 메모리 장치에 대해서는 물리 주소(physical address)를 제공할 수 있다. 컨트롤러는 물리 주소를 이용하여 비휘발성 메모리 장치를 관리하고, 물리 주소를 논리 주소로 변환할 수 있다. 이처럼 물리 주소 및 논리 주소의 변환이 수행되는 계층을 플래시 변환 계층(Flash Translation Layer: FTL)라 하기도 한다.
최근에는 비휘발성 메모리 장치 중 하나인 플래시 메모리를 이용한 솔리드 스테이트 드라이브(Solid State Drive: SSD)라고 하는 대용량 스토리지 장치가 많은 관심을 받고 있다. SSD는 다수의 플래시 메모리 칩과 버스, 컨트롤러 및 호스트 시스템의 요청을 버퍼링하는 메모리로 구성되어 있다. SSD는 기존의 자기 디스크와는 달리 읽기와 쓰기를 수행할 때 필요한 시간이 비대칭이라는 특징을 가지고 있다. 따라서, SSD는 쓰기 연산을 얼마나 효율적으로 수행하는지 여부가 시스템 성능에 가장 큰 영향을 줄 수 있다.
그러므로, SSD의 쓰기 연산을 고려하여 SSD의 성능 향상을 최대화할 수 있도록 하는 기술에 대해 연구가 필요하다.
솔리드 스테이트 드라이브(Solid State Drive: SSD)의 저장 공간을 논리 블록(Logical Block)으로 분할하고, SSD에서 발생하는 다수의 쓰기(write) 요청을 논리 블록에 할당하여 SSD에 대해 논리 블록 단위로 쓰기 요청을 수행하는 SSD 관리 장치 및 방법을 제공함으로써 SSD의 성능을 향상시키고자 한다.
본 발명의 일실시예에 따른 SSD 관리 장치는 솔리드 스테이트 드라이브(Solid State Drive: SSD)의 저장 공간을 선정된(predetermined) 크기의 적어도 하나의 논리 블록(Logical Block)으로 분할하는 분할부 및 상기 SSD에 대해 적어도 하나의 쓰기(write) 요청이 발생하는 경우, 상기 적어도 하나의 논리 블록 중에서 어느 하나의 논리 블록에 대해 상기 적어도 하나의 쓰기 요청을 할당하여 상기 어느 하나의 논리 블록 단위로 쓰기 요청을 수행하는 제어부를 포함한다.
또한, 본 발명의 일실시예에 따른 SSD 관리 방법은 솔리드 스테이트 드라이브(Solid State Drive: SSD)의 저장 공간을 선정된(predetermined) 크기의 적어도 하나의 논리 블록(Logical Block)으로 분할하는 단계 및 상기 SSD에 대해 적어도 하나의 쓰기(write) 요청이 발생하는 경우, 상기 적어도 하나의 논리 블록 중에서 어느 하나의 논리 블록에 대해 상기 적어도 하나의 쓰기 요청을 할당하여 상기 어느 하나의 논리 블록 단위로 쓰기 요청을 수행하는 단계를 포함한다.
솔리드 스테이트 드라이브(Solid State Drive: SSD)의 저장 공간을 논리 블록(Logical Block)으로 분할하고, SSD에서 발생하는 다수의 쓰기(write) 요청을 논리 블록에 할당하여 SSD에 대해 논리 블록 단위로 쓰기 요청을 수행하는 SSD 관리 장치 및 방법을 제공함으로써 SSD의 성능 향상을 기대할 수 있다.
이하에서는 첨부된 도면을 참조하여 본 발명의 실시예를 상세히 설명하기로 한다.
도 1은 본 발명의 일실시예에 따른 솔리드 스테이트 드라이브(Solid State Drive: SSD) 관리 장치의 구조를 도시한 도면이다.
도 1을 참조하면 SSD 관리 장치(110)가 도시되어 있다.
SSD 관리 장치(110)는 분할부(111) 및 제어부(112)를 포함할 수 있다.
분할부(111)는 SSD의 저장 공간을 선정된(predetermined) 크기의 적어도 하나의 논리 블록(Logical Block)으로 분할한다.
일반적으로 SSD는 다수의 플래시 메모리 칩과 버스, 플래시 변환 계층(Flash Translation Layer: FTL)을 수행하는 컨트롤러 및 호스트 시스템의 요청을 버퍼링하는 메모리로 구성되어 있다. 이러한 구조로 인해 SSD는 다수의 칩과 버스를 병렬로 동작시킴으로써 높은 성능을 획득할 수 있다. SSD내에 포함되어 있는 FTL은 다수의 칩에서 논리적으로 동일한 블록 번호를 갖는 블록들과 논리적으로 동일한 페이지 번호를 갖는 페이지들을 각각 블록 그룹과 페이지 그룹이라는 논리적인 단위로 구성하여 연산을 수행한다. 이때, FTL은 상기 페이지 그룹에 대한 읽 기(read) 및 쓰기(write) 연산을 모든 칩에서 병렬적으로 수행함으로써 SSD 전반의 성능 향상에 기여할 수 있다. 또한, FTL은 상기 블록 그룹에 대한 소거 연산의 경우에도 모든 칩의 블록들에 대해 병렬적으로 수행함으로써 SSD의 성능 향상에 기여할 수 있다. 이상과 같이 SSD에서는 읽기 및 쓰기 연산을 병렬적으로 수행할 수 있도록 하는 요청의 크기가 존재하며, 이를 논리 블록이라고 한다.
따라서, 분할부(111)는 SSD의 저장 공간을 앞서 설명한 논리 블록의 단위로 분할함으로써 상기 SSD가 읽기 및 쓰기 연산을 병렬적으로 수행하도록 할 수 있다.
본 발명의 일실시예에 따르면, 분할부(111)는 상기 SSD와 매핑(mapping)된 장치 파일에 대해 쓰기 요청의 크기를 변화 시키면서, 순차 쓰기를 수행할 경우의 제1 대역폭과 랜덤 쓰기를 수행할 경우의 제2 대역폭을 비교하여 상기 제1 대역폭과 상기 제2 대역폭이 동일한 경우에 해당하는 쓰기 요청의 크기를 상기 선정된 크기로 결정할 수 있다.
SSD에서 논리 블록을 통해 칩과 버스를 병렬적으로 동작시키고 병합 연산의 비용을 최소화하기 위해서는 SSD의 대역폭이 최대가 되는 논리 블록의 크기를 결정해야 한다.
이를 위해 본 발명의 일실시예에 따른 분할부(111)는 상기 SSD와 매핑된 장치 파일을 O_SYNC 모드로 열고, 상기 장치 파일에 대해 쓰기 요청의 크기를 변화시키면서 순차 쓰기와 랜덤 쓰기를 수행할 수 있다.
이때, 특정 위치에 상기 쓰기 요청이 이루어진 경우, 상기 특정 위치에 대해 다시 쓰기 요청이 이루어지지 않도록 할 수 있다.
그리고 나서, 상기 순차 쓰기를 수행할 경우 획득한 상기 제1 대역폭과 상기 랜덤 쓰기를 수행할 경우 획득한 상기 제2 대역폭을 비교하여 상기 제1 대역폭과 상기 제2 대역폭이 동일할 경우에 해당하는 쓰기 요청의 크기를 상기 논리 블록의 크기로 결정할 수 있다.
예컨대, 상기 장치 파일에 상기 순차 쓰기와 상기 랜덤 쓰기를 1GB만큼 수행한다고 가정하자.
이때, 상기 쓰기 요청의 크기를 4KB부터 증가시키면서 상기 순차 쓰기와 랜덤 쓰기를 한다고 할 때, 만약, 상기 쓰기 요청의 크기가 4KB인 경우, 상기 제1 대역폭과 상기 제2 대역폭이 동일해졌다면, 상기 논리 블록은 4KB가 될 수 있다.
만약, 상기 제1 대역폭과 상기 제2 대역폭을 비교한 결과, 상기 제1 대역폭과 상기 제2 대역폭이 서로 동일하지 않다면, 상기 쓰기 요청의 크기를 n배 증폭하여 전술한 과정을 되풀이한다.
이와 같이 상기 쓰기 요청의 크기를 증폭시키면서 제1 대역폭과 제2 대역폭이 동일해 질 때까지 전술한 과정을 되풀이함으로써 상기 논리 블록의 크기를 결정할 수 있다.
단, 여기서 상기 제1 대역폭과 상기 제2 대역폭이 동일하다는 의미는 상기 제1 대역폭과 상기 제2 대역폭이 정확히 일치하는 경우를 의미할 뿐만 아니라, 상기 제1 대역폭과 상기 제2 대역폭이 다소간의 오차 범위 내에서 동일한 경우도 포함하는 것으로 상기 오차는 무시할 수 있을 정도로 작은 경우를 의미한다.
제어부(112)는 상기 SSD에 대해 적어도 하나의 쓰기 요청이 발생하는 경우, 상기 적어도 하나의 논리 블록 중에서 어느 하나의 논리 블록에 대해 상기 적어도 하나의 쓰기 요청을 할당하여 상기 어느 하나의 논리 블록 단위로 쓰기 요청을 수행한다.
일반적을 SSD는 기존의 자기 디스크와는 달리 읽기와 쓰기를 수행할 때 필요한 시간이 비대칭이라는 특징을 가지고 있다. 따라서, SSD는 쓰기 연산을 얼마나 효율적으로 수행하는지 여부가 시스템 성능에 가장 큰 영향을 줄 수 있다.
따라서, SSD가 어느 정도 사용되어 안정적인 상태가 되었을 때, SSD에서 하나의 섹터에 대한 쓰기 요청에 필요한 시간을 연산함으로써 SSD의 성능을 나타낼 수 있다.
상기 쓰기 요청에 필요한 시간은 한번의 병합 연산과 호스트 컴퓨터에서 SSD까지 섹터 단위의 데이터가 전송되는 시간을 이용하여 나타낼 수 있다.
여기서, 병합 연산이란 하이브리드 매핑 기법을 사용하는 플래시 메모리에서 로그 블록이 전부 소모된 경우, 블록 재활용을 위해 수행되는 기법을 의미한다.
이와 관련하여 도 2 내지 도 3을 참조하여 상기 병합 연산에 대해 상세히 설명하기로 한다.
도 2는 본 발명의 일실시예에 따라 SSD의 병합 연산 과정을 도시한 개념도이다.
일반적으로 플래시 메모리는 한 페이지에 데이터가 기록되면, 상기 데이터가 기록된 페이지가 속해있는 블록 전체를 소거하기 전까지는 상기 페이지에 데이터를 기록할 수 없는 특징을 가지고 있다. 즉, 덮어 쓰기(overwrite)가 불가능하 다.
따라서, 플래시 메모리의 이러한 제약 사항을 극복하기 위해, FTL을 통한 다양한 알고리즘을 이용하는데, 보통 log-based 기법이 많이 사용된다.
log-based 기법은 도 2에 도시된 바와 같이 데이터 블록(BLK)에 저장된 데이터가 업데이트되면, 업데이트된 데이터를 로그 블록(Log)에 기록하는 방식을 의미한다.
도 2는 동일한 논리 블록에 데이터가 반복적으로 업데이트된 경우를 도시한 것으로 먼저, 도면 부호 210을 참조하면, 데이터 블록(BLK)의 첫 번째 페이지와 두 번째 페이지에 저장된 데이터가 업데이트되는 경우, 로그 블록(Log)은 out of order로 데이터를 저장하므로, 업데이트된 데이터는 로그 블록(Log)의 첫 번째 페이지와 두 번째 페이지에 저장된다. 이때, 데이터 블록(BLK)의 첫 번째 페이지와 두 번째 페이지에 저장되어 있던 데이터는 무효(invalid)인 데이터가 된다.
그리고, 로그 블록(Log)의 첫 번째 페이지와 두 번째 페이지에 저장된 데이터가 업데이트되는 경우, 업데이트된 데이터는 로그 블록(Log)의 세 번째 페이지와 네 번째 페이지에 저장되고, 로그 블록(Log)의 첫 번째 페이지와 두 번째 페이지에 저장되어 있던 데이터는 무효(invalid)인 데이터가 된다.
만약, 로그 블록(Log)의 세 번째 페이지와 네 번째 페이지에 저장된 데이터가 업데이트되는 경우, 로그 블록(Log)이 모두 소모되었기 때문에 플래시 메모리는 데이터 블록(BLK)과 로그 블록(Log)을 병합하여 빈 블록을 획득한다.
여기서, 빈 블록(Free)은 그 성질이 데이터 블록에 해당하므로 상기 데이터 들이 in-order로 저장된다.
이와 관련하여 도면 부호 220을 참조하면, 로그 블록(Log)의 세 번째 페이지와 네 번째 페이지에 저장되어 있는 데이터는 빈 블록(Free)의 첫 번째 페이지와 두 번째 페이지로 복사된다. 그리고 이때, 데이터 블록(BLK)의 세 번째 페이지와 네 번째 페이지에 저장되어 있던 데이터는 빈 블록(Free)의 세 번째 페이지와 네 번째 페이지에 복사된다.
그리고, 데이터 블록(BLK)과 로그 블록(Log)은 소거된다.
그 결과, 도면 부호 230에서 볼 수 있듯이 기존의 데이터 블록(BLK)과 로그 블록(Log)은 모두 빈 블록(Free)이 되고, 기존의 빈 블록(Free)이 데이터 블록(BLK)이 된다.
이상, 도 2를 참조하여 병합 연산 과정에 대해 설명하였다. 이하에서는 도 3을 참조하여 교환 병합 연산 과정에 대해 설명하기로 한다.
도 3은 본 발명의 일실시예에 따라 SSD의 교환 병합 연산 과정을 도시한 개념도이다.
교환 병합 연산 과정은 도 2에 도시된 병합 연산 과정과는 달리 데이터 블록에 데이터가 연속적으로 업데이트되는 경우에 수행되는 병합과정이다.
먼저, 도면 부호 310을 참조하면, 데이터 블록(BLK)의 첫 번째 페이지, 두 번째 페이지, 세 번째 페이지 및 네 번째 페이지에 저장되어 있는 데이터가 업데이트되는 경우, 업데이트된 데이터는 로그 블록(Log)에 out of order로 저장된다. 즉, 로그 블록(Log)의 첫 번째 페이지, 두 번째 페이지, 세 번째 페이지 및 네 번 째 페이지에 연속적으로 저장된다. 이때, 데이터 블록(BLK)의 첫 번째 페이지, 두 번째 페이지, 세 번째 페이지 및 네 번째 페이지에 저장되어 있던 데이터는 무효(invalid)인 데이터가 된다.
그리고, 로그 블록(Log)이 모두 소모되었기 때문에 플래시 메모리는 도면 부호 320에 도시된 바와 같이 기존의 로그 블록(Log)이 데이터 블록(BLK)으로, 기존의 데이터 블록(BLK)이 로그 블록(Log)으로 교환되도록 매핑 정보를 업데이트한다.
이상으로 SSD의 병합 연산 과정을 설명하였다. 일반적으로 SSD에는 다수의 플래시 메모리 칩이 포함되어 있기 때문에 SSD가 어느 정도 사용되어 안정적인 상태가 되었을 때, 상기 SSD에서 쓰기 요청에 필요한 시간은 병합 연산에 소요되는 시간 정보가 포함될 수 있다.
이와 관련하여 상기 쓰기 요청에 필요한 시간은 하기의 수학식 1로 나타낼 수 있다.
Figure 112008080018414-PAT00001
여기서, TSSD는 SSD에서 하나의 섹터에 대한 쓰기 요청에 필요한 시간, Tmerge 는 SSD에서 병합 연산에 소요되는 시간, S는 바이트 단위의 섹터의 크기 및 B는 SSD의 대역폭을 의미한다.
만약, 하나의 논리 블록의 크기만큼 쓰기가 요청되는 경우, 이때, 쓰기 요청에 필요한 시간은 하기의 수학식 2와 같이 나타낼 수 있다.
Figure 112008080018414-PAT00002
여기서, n은 논리 블록의 크기를 의미한다. 즉, 상기 수학식 2로부터 알 수 있듯이 논리 블록 단위로 쓰기 요청을 수행하면, SSD에서 최대의 성능 얻을 수 있다.
그러나, 파일 시스템이나 데이터 베이스 시스템과 같이 데이터를 저장하고 관리하는 시스템에서는 쓰기 요청을 항상 논리 블록 단위로 수행할 수 없다. 따라서, 이 경우에는 쓰기 요청에 필요한 시간 TSSD을 연산하기 위해, 쓰기 요청이 특정 논리 블록으로 향하는 비율을 고려해야 한다. 만약, 쓰기 요청이 특정 논리 블록으로 향하는 비율을 f라고 하고, 쓰기 요청의 수를 R이라고 하면, 쓰기 요청에 필요한 시간 TSSD는 하기의 수학식 3으로 나타낼 수 있다.
Figure 112008080018414-PAT00003
결국, 쓰기 요청에 필요한 시간 TSSD를 감소시켜 SSD의 성능을 향상시키기 위해서는 쓰기 요청이 논리 블록으로 향하는 비율 f을 증가시켜야 한다.
따라서, 본 발명의 일실시예에 따른 제어부(112)는 SSD에 적어도 하나의 쓰기 요청이 발생하는 경우, 분할부(111)가 분할한 적어도 하나의 논리 블록 중에서 어느 하나의 논리 블록에 대해 상기 적어도 하나의 쓰기 요청을 할당하여 상기 어느 하나의 논리 블록 단위로 쓰기 요청을 수행함으로써 쓰기 요청에 필요한 시간 TSSD를 감소시킬 수 있다.
이와 관련하여, 도 4를 참조하여 본 발명의 일실시예에 따른 SSD 관리 장치가 쓰기 요청을 할당하는 과정을 상세히 설명하기로 한다.
도 4는 본 발명의 일실시예에 따라 SSD 관리 장치가 쓰기 요청을 할당하는 과정을 도시한 개념도이다.
분할부(111)는 SSD의 저장 공간을 도 4에 도시된 바와 같이 적어도 하나의 논리 블록(410)으로 분할한다.
여기서, SSD의 저장 공간에 A, B, C, D, E의 다섯 가지 파일이 저장되어 있다고 가정하자. 그리고, 상기 파일들은 각각 A = {A1, A2, A3}, B = {B1, B2}, C = {C1, C2, C3, C4}, D = {D1}, E = {E1}의 섹터(또는 블록)로 구성되어 있다고 가정하자.
만약, SSD에 적어도 하나의 쓰기 요청(420)이 발생하는 경우, 제어부(112)는 적어도 하나의 논리 블록(410) 중에서 어느 하나의 논리 블록(411)에 대해 적어도 하나의 쓰기 요청(420)을 할당하여 어느 하나의 논리 블록(411) 단위로 쓰기 요청을 수행한다.
이때, 적어도 하나의 쓰기 요청(420) 중에서 A3, C4, C3은 이미 저장 공간에 기록되어 있던 섹터(또는 블록)이므로 제어부(112)는 A3, C4, C3에 대해 어느 하나의 논리 블록(411)에 할당하지 않고, 제자리 갱신을 수행하며, 새롭게 기록될 A4, A5, C5, E2, E3, E4, E5에 대해서는 어느 하나의 논리 블록(411)에 할당하여 어느 하나의 논리 블록(411) 단위로 쓰기 요청을 수행할 수 있다.
결국, 본 발명의 일실시예에 따른 SSD 관리 장치는 SSD에 다수의 쓰기 요청이 발생하는 경우, 상기 다수의 쓰기 요청을 특정 논리 블록에 할당하여 상기 특정 논리 블록의 단위로 상기 SSD에 대해 쓰기 요청을 수행함으로써 상기 수학식 3에서 f값을 증가시킬 수 있고, 이로 인해 쓰기 요청에 필요한 시간 TSSD를 최소화할 수 있다.
본 발명의 일실시예에 따르면, 제어부(112)는 선택부(113)를 포함할 수 있다.
선택부(113)는 상기 적어도 하나의 논리 블록 중에서 상기 어느 하나의 논 리 블록을 선택한다.
이때, 본 발명의 일실시예에 따르면, 선택부(113)는 상기 적어도 하나의 논리 블록 중에서 사용되지 않는 섹터의 개수가 최대가 되는 논리 블록을 상기 어느 하나의 논리 블록으로 선택할 수 있다.
또한, 본 발명의 일실시예에 따르면, 선택부(113)는 상기 적어도 하나의 논리 블록을, 사용되는 섹터의 개수 또는 사용되지 않는 섹터의 개수 중 어느 하나의 순서를 기준으로 정렬한 후 상기 SSD에 적어도 하나의 쓰기 요청이 발생하는 경우, 상기 사용되지 않는 섹터의 개수가 최대가 되는 논리 블록을 상기 어느 하나의 논리 블록으로 선택할 수 있다.
즉, 선택부(113)는 상기 적어도 하나의 논리 블록 중에서 사용되지 않는 섹터의 개수가 최대가 되는 논리 블록을 선택하여, 사용되지 않는 섹터의 개수가 최대가 되는 논리 블록에 쓰기 요청들이 할당되도록 함으로써, 상기 수학식 3에서 f의 값을 증가시켜 SSD의 성능을 향상시킬 수 있다.
이때, 선택부(113)가 상기 어느 하나의 논리 블록을 선택하는 과정을 소위 Greedy-space 기법이라 명명 가능하다.
본 발명의 일실시예에 따르면, 선택부(113)는 상기 적어도 하나의 논리 블록 각각에 대해, 사용되고 있는 섹터의 개수를 기준 값(threshold)과 비교하여 상기 섹터의 개수가 상기 기준 값 미만인 논리 블록을 상기 어느 하나의 논리 블록으로 선택할 수 있다.
이와 같은 방식을 소위 Clock-Space 기법이라 명명 가능하다.
이하에서는 도 5를 참조하여 선택부(113)가 상기 Clock-Space 기법을 이용하여 상기 어느 하나의 논리 블록을 선택하는 과정을 상세히 설명하기로 한다.
도 5는 본 발명의 일실시예에 따라 SSD 관리 장치가 논리 블록을 선택하는 과정을 도시한 개념도이다.
먼저, 도면 부호 510을 참조하면, 선택부(113)는 논리 블록 a에 대해, 상기 논리 블록 a에서 사용되고 있는 섹터의 개수와 기준 값을 비교한다.
여기서, 논리 블록 a에서 사용되고 있는 섹터의 개수가 상기 기준 값 미만이 아니므로, 선택부(113)는 도면 부호 520에 도시된 바와 같이 논리 블록 b에 대해, 상기 논리 블록 b에서 사용되고 있는 섹터의 개수와 기준 값을 비교한다.
이러한 비교 과정을 거쳐, 도면 부호 530에서 도시된 바와 같이 논리 블록 e는 상기 논리 블록 e에서 사용되고 있는 섹터의 개수가 기준 값 미만이므로, 선택부(113)는 상기 논리 블록 e를 상기 어느 하나의 논리 블록으로 선택한다.
결국, 선택부(113)는 분할부(111)가 분할한 적어도 하나의 논리 블록 중에서 사용되고 있지 않는 섹터의 개수가 가장 많은 논리 블록을 상기 어느 하나의 논리 블록으로 선택함으로써, 상기 수학식 3에서 f값을 감소시켜, SSD 성능을 향상시킬 수 있다.
이때, 본 발명의 일실시예에 따르면, 선택부(113)는 상기 적어도 하나의 논리 블록 전체에서 사용되고 있는 섹터의 비율을 이용하여 상기 적어도 하나의 논리 블록 각각에서 사용되고 있는 섹터의 비율 중 최소 값을 연산하고, 상기 최소 값을 기초로 상기 기준 값을 선정할 수 있다.
이와 관련하여 상기 적어도 하나의 논리 블록 전체에서 사용되고 있는 섹터의 비율과 상기 적어도 하나의 논리 블록 각각에서 사용되고 있는 섹터의 비율 중 최소 값 사이의 관계는 하기의 수학식 4로 나타낼 수 있다.
Figure 112008080018414-PAT00004
여기서, ASO는 상기 적어도 하나의 논리 블록 전체에서 사용되고 있는 섹터의 비율을 의미하고, BSO는 각각의 논리 블록에서 사용되고 있는 섹터의 비율 중 최소 값을 의미한다.
결국, 선택부(113)는 SSD의 저장 공간 사용률을 고려하여 상기 수학식 4로부터 BSO 값을 연산하여 이를 기초로 기준 값을 선정할 수 있다.
또한, 본 발명의 일실시예에 따르면, 선택부(113)는 ASO 값의 변화에 따라 상기 수학식 4를 이용하여 미리 연산된 BSO 값이 저장된 테이블을 참조하여 상기 기준 값을 선정할 수 있다.
이와 관련하여, 하기의 표 1은 ASO 값이 0.1부터 0.9까지 변할 경우에 상기 수학식 4를 통해 연산된 BSO 값을 기재한 표이다.
ASO 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
BSO 0.1 0.1 0.1 0.1 0.2 0.3 0.45 0.6 0.8
도 6은 본 발명의 일실시예에 따른 SSD 관리 방법을 도시한 순서도이다.
단계(S610)에서는 SSD의 저장 공간을 선정된 크기의 적어도 하나의 논리 블록으로 분할한다.
본 발명의 일실시예에 따르면, 단계(S610)에서는 상기 SSD와 매핑된 장치 파일에 대해 쓰기 요청의 크기를 변화시키면서, 순차 쓰기를 수행할 경우의 제1 대역폭과 랜덤 쓰기를 수행할 경우의 제2 대역폭을 비교하여 상기 제1 대역폭과 상기 제2 대역폭이 동일한 경우에 해당하는 쓰기 요청의 크기를 상기 선정된 크기로 결정할 수 있다.
단계(S620)에서는 상기 SSD에 대해 적어도 하나의 쓰기 요청이 발생하는 경우, 상기 적어도 하나의 논리 블록 중에서 어느 하나의 논리 블록에 대해 상기 적어도 하나의 쓰기 요청을 할당하여 상기 어느 하나의 논리 블록 단위로 쓰기 요청을 수행한다.
결국, 본 발명의 일실시예에 따른 SSD 관리 방법은 SSD에 적어도 하나의 쓰기 요청이 발생하는 경우, 단계(S610)에서 분할된 적어도 하나의 논리 블록 중에서 어느 하나의 논리 블록에 대해 상기 적어도 하나의 쓰기 요청을 할당하여 상기 어느 하나의 논리 블록 단위로 쓰기 요청을 수행함으로써 상기 수학식 3에서 f 값을 증가시켜 결과적으로 쓰기 요청에 필요한 시간 TSSD를 감소시킬 수 있다.
본 발명의 일실시예에 따르면, 단계(S620)에서는 상기 적어도 하나의 논리 블록 중에서 상기 어느 하나의 논리 블록을 선택하는 단계를 포함할 수 있다.
이때, 본 발명의 일실시예에 따르면, 상기 어느 하나의 논리 블록을 선택하는 단계는 상기 적어도 하나의 논리 블록 중에서 사용되지 않는 섹터의 개수가 최대가 되는 논리 블록을 상기 어느 하나의 논리 블록으로 선택할 수 있다.
또한, 본 발명의 일실시예에 따르면, 상기 어느 하나의 논리 블록을 선택하는 단계는 상기 적어도 하나의 논리 블록을, 사용되는 섹터의 개수 또는 사용되지 않는 섹터의 개수 중 어느 하나의 순서를 기준으로 정렬한 후 상기 SSD에 대해 상기 적어도 하나의 쓰기 요청이 발생하는 경우, 상기 사용되지 않는 섹터의 개수가 최대가 되는 논리 블록을 상기 어느 하나의 논리 블록으로 선택할 수 있다.
또한, 본 발명의 일실시예에 따르면, 상기 어느 하나의 논리 블록을 선택하는 단계는 상기 적어도 하나의 논리 블록 각각에 대해 사용되고 있는 섹터의 개수를 기준 값과 비교하여 상기 섹터의 개수가 상기 기준 값 미만인 논리 블록을 상기 어느 하나의 논리 블록으로 선택할 수 있다.
이때, 본 발명의 일실시예에 따르면, 상기 어느 하나의 논리 블록을 선택하는 단계는 상기 적어도 하나의 논리 블록 전체에서 사용되고 있는 섹터의 비율을 이용하여 상기 적어도 하나의 논리 블록 각각에서 사용되고 있는 섹터의 비율 중 최소 값을 연산하고, 상기 최소 값을 기초로 상기 기준 값을 선정할 수 있다.
이때, 본 발명의 일실시예에 따르면, 상기 최소 값은 상기 수학식 4를 이용하여 연산할 수 있다.
이상, 도 6을 참조하여 본 발명의 일실시예에 따른 SSD 관리 방법에 대해 설명하였다. 여기서, 본 발명의 일실시예에 따른 SSD 관리 방법은 도 1 내지 도 5를 이용하여 설명한 SSD 관리 장치의 구성과 매우 유사하므로 이에 대한 상세한 설명은 생략하기로 한다.
본 발명에 따른 SSD 관리 방법은 다양한 컴퓨터 수단을 통하여 수행될 수 있는 프로그램 명령 형태로 구현되어 컴퓨터 판독 가능 매체에 기록될 수 있다. 상기 컴퓨터 판독 가능 매체는 프로그램 명령, 데이터 파일, 데이터 구조 등을 단독으로 또는 조합하여 포함할 수 있다. 상기 매체에 기록되는 프로그램 명령은 본 발명을 위하여 특별히 설계되고 구성된 것들이거나 컴퓨터 소프트웨어 당업자에게 공지되어 사용 가능한 것일 수도 있다. 컴퓨터 판독 가능 기록 매체의 예에는 하드 디스크, 플로피 디스크 및 자기 테이프와 같은 자기 매체(magnetic media), CD-ROM, DVD와 같은 광기록 매체(optical media), 플롭티컬 디스크(floptical disk)와 같은 자기-광 매체(magneto-optical media), 및 롬(ROM), 램(RAM), 플래시 메모리 등과 같은 프로그램 명령을 저장하고 수행하도록 특별히 구성된 하드웨어 장치가 포함된다. 프로그램 명령의 예에는 컴파일러에 의해 만들어지는 것과 같은 기계어 코드뿐만 아니라 인터프리터 등을 사용해서 컴퓨터에 의해서 실행될 수 있는 고급 언어 코드를 포함한다. 상기된 하드웨어 장치는 본 발명의 동작을 수행하기 위해 하나 이상의 소프트웨어 모듈로서 작동하도록 구성될 수 있으며, 그 역도 마찬가지이다.
이상과 같이 본 발명은 비록 한정된 실시예와 도면에 의해 설명되었으나, 본 발명은 상기의 실시예에 한정되는 것은 아니며, 본 발명이 속하는 분야에서 통상의 지식을 가진 자라면 이러한 기재로부터 다양한 수정 및 변형이 가능하다.
그러므로, 본 발명의 범위는 설명된 실시예에 국한되어 정해져서는 아니 되며, 후술하는 특허청구범위뿐 아니라 이 특허청구범위와 균등한 것들에 의해 정해져야 한다.
도 1은 본 발명의 일실시예에 따른 SSD 관리 장치의 구조를 도시한 도면이다.
도 2는 본 발명의 일실시예에 따라 SSD의 병합 연산 과정을 도시한 개념도이다.
도 3은 본 발명의 일실시예에 따라 SSD의 교환 병합 연산 과정을 도시한 개념도이다.
도 4는 본 발명의 일실시예에 따라 SSD 관리 장치가 쓰기 요청을 할당하는 과정을 도시한 개념도이다.
도 5는 본 발명의 일실시예에 따라 SSD 관리 장치가 논리 블록을 선택하는 과정을 도시한 개념도이다.
도 6은 본 발명의 일실시예에 따른 SSD 관리 방법을 도시한 순서도이다.
<도면의 주요부분에 대한 부호의 설명>
110: SSD 관리 장치
111: 분할부 112: 제어부 113: 선택부

Claims (15)

  1. 솔리드 스테이트 드라이브(Solid State Drive: SSD)의 저장 공간을 선정된(predetermined) 크기의 적어도 하나의 논리 블록(Logical Block)으로 분할하는 분할부; 및
    상기 SSD에 대해 적어도 하나의 쓰기(write) 요청이 발생하는 경우, 상기 적어도 하나의 논리 블록 중에서 어느 하나의 논리 블록에 대해 상기 적어도 하나의 쓰기 요청을 할당하여 상기 어느 하나의 논리 블록 단위로 쓰기 요청을 수행하는 제어부
    를 포함하는 것을 특징으로 하는 SSD 관리 장치.
  2. 제1항에 있어서,
    상기 분할부는,
    상기 SSD와 매핑(mapping)된 장치 파일에 대해 쓰기 요청의 크기를 변화시키면서, 순차 쓰기를 수행할 경우의 제1 대역폭과 랜덤 쓰기를 수행할 경우의 제2 대역폭을 비교하여 상기 제1 대역폭과 상기 제2 대역폭이 동일한 경우에 해당하는 쓰기 요청의 크기를 상기 선정된 크기로 결정하는 것을 특징으로 하는 SSD 관리 장치.
  3. 제1항에 있어서,
    상기 제어부는,
    상기 적어도 하나의 논리 블록 중에서 상기 어느 하나의 논리 블록을 선택하는 선택부
    를 더 포함하는 것을 특징으로 하는 SSD 관리 장치.
  4. 제3항에 있어서,
    상기 선택부는,
    상기 적어도 하나의 논리 블록 중에서 사용되지 않는 섹터(sector)의 개수가 최대가 되는 논리 블록을 상기 어느 하나의 논리 블록으로 선택하는 것을 특징으로 하는 SSD 관리 장치.
  5. 제4항에 있어서,
    상기 선택부는,
    상기 적어도 하나의 논리 블록을, 사용되는 섹터의 개수 또는 사용되지 않는 섹터의 개수 중 어느 하나의 순서를 기준으로 정렬한 후 상기 SSD에 대해 상기 적어도 하나의 쓰기 요청이 발생하는 경우, 상기 어느 하나의 논리 블록을 선택하는 것을 특징으로 하는 SSD 관리 장치.
  6. 제3항에 있어서,
    상기 선택부는,
    상기 적어도 하나의 논리 블록 각각에 대해, 사용되고 있는 섹터의 개수를 기준 값(threshold)과 비교하여 상기 섹터의 개수가 상기 기준 값 미만인 논리 블록을 상기 어느 하나의 논리 블록으로 선택하는 것을 특징으로 하는 SSD 관리 장치.
  7. 제6항에 있어서,
    상기 선택부는,
    상기 적어도 하나의 논리 블록 전체에서 사용되고 있는 섹터의 비율을 이용하여 상기 적어도 하나의 논리 블록 각각에서 사용되고 있는 섹터의 비율 중 최소 값을 연산하고, 상기 최소 값을 기초로 상기 기준 값을 선정하는 것을 특징으로 하는 SSD 관리 장치.
  8. 솔리드 스테이트 드라이브(Solid State Drive: SSD)의 저장 공간을 선정된(predetermined) 크기의 적어도 하나의 논리 블록(Logical Block)으로 분할하는 단계; 및
    상기 SSD에 대해 적어도 하나의 쓰기(write) 요청이 발생하는 경우, 상기 적어도 하나의 논리 블록 중에서 어느 하나의 논리 블록에 대해 상기 적어도 하나의 쓰기 요청을 할당하여 상기 어느 하나의 논리 블록 단위로 쓰기 요청을 수행하는 단계
    를 포함하는 것을 특징으로 하는 SSD 관리 방법.
  9. 제8항에 있어서,
    상기 분할하는 단계는,
    상기 SSD와 매핑(mapping)된 장치 파일에 대해 쓰기 요청의 크기를 변화시키면서, 순차 쓰기를 수행할 경우의 제1 대역폭과 랜덤 쓰기를 수행할 경우의 제2 대역폭을 비교하여 상기 제1 대역폭과 상기 제2 대역폭이 동일한 경우에 해당하는 쓰기 요청의 크기를 상기 선정된 크기로 결정하는 것을 특징으로 하는 SSD 관리 방법.
  10. 제8항에 있어서,
    상기 쓰기 요청을 수행하는 단계는,
    상기 적어도 하나의 논리 블록 중에서 상기 어느 하나의 논리 블록을 선택하는 단계
    를 더 포함하는 것을 특징으로 하는 SSD 관리 방법.
  11. 제10항에 있어서,
    상기 선택하는 단계는,
    상기 적어도 하나의 논리 블록 중에서 사용되지 않는 섹터(sector)의 개수가 최대가 되는 논리 블록을 상기 어느 하나의 논리 블록으로 선택하는 것을 특징으로 하는 SSD 관리 방법.
  12. 제11항에 있어서,
    상기 선택하는 단계는,
    상기 적어도 하나의 논리 블록을, 사용되는 섹터의 개수 또는 사용되지 않는 섹터의 개수 중 어느 하나의 순서를 기준으로 정렬한 후 상기 SSD에 대해 상기 적어도 하나의 쓰기 요청이 발생하는 경우, 상기 어느 하나의 논리 블록을 선택하는 것을 특징으로 하는 SSD 관리 방법.
  13. 제10항에 있어서,
    상기 선택하는 단계는,
    상기 적어도 하나의 논리 블록 각각에 대해, 사용되고 있는 섹터의 개수를 기준 값(threshold)과 비교하여 상기 섹터의 개수가 상기 기준 값 미만인 논리 블록을 상기 어느 하나의 논리 블록으로 선택하는 것을 특징으로 하는 SSD 관리 방법.
  14. 제13항에 있어서,
    상기 선택하는 단계는,
    상기 적어도 하나의 논리 블록 전체에서 사용되고 있는 섹터의 비율을 이용하여 상기 적어도 하나의 논리 블록 각각에서 사용되고 있는 섹터의 비율 중 최소 값을 연산하고, 상기 최소 값을 기초로 상기 기준 값을 선정하는 것을 특징으로 하 는 SSD 관리 방법.
  15. 제8항 내지 제14항 중 어느 한 항의 방법을 수행하는 프로그램을 기록한 컴퓨터 판독 가능 기록 매체.
KR1020080115607A 2008-11-20 2008-11-20 Ssd 관리 장치 및 방법 KR100970537B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020080115607A KR100970537B1 (ko) 2008-11-20 2008-11-20 Ssd 관리 장치 및 방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020080115607A KR100970537B1 (ko) 2008-11-20 2008-11-20 Ssd 관리 장치 및 방법

Publications (2)

Publication Number Publication Date
KR20100056685A true KR20100056685A (ko) 2010-05-28
KR100970537B1 KR100970537B1 (ko) 2010-07-16

Family

ID=42280655

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020080115607A KR100970537B1 (ko) 2008-11-20 2008-11-20 Ssd 관리 장치 및 방법

Country Status (1)

Country Link
KR (1) KR100970537B1 (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20230103000A (ko) 2021-12-30 2023-07-07 중앙대학교 산학협력단 메모리 시스템, 메모리 시스템의 입출력 관리 방법 및 이를 수행하기 위한 컴퓨팅 장치

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10261897B2 (en) 2017-01-20 2019-04-16 Samsung Electronics Co., Ltd. Tail latency aware foreground garbage collection algorithm

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100389867B1 (ko) * 2001-06-04 2003-07-04 삼성전자주식회사 플래시 메모리 관리방법
DE10341618A1 (de) * 2003-09-10 2005-05-04 Hyperstone Ag Verwaltung gelöschter Blöcke in Flash-Speichern
KR100924021B1 (ko) * 2007-10-02 2009-10-28 주식회사 휴원 플래시 메모리의 사상 관리 방법

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20230103000A (ko) 2021-12-30 2023-07-07 중앙대학교 산학협력단 메모리 시스템, 메모리 시스템의 입출력 관리 방법 및 이를 수행하기 위한 컴퓨팅 장치

Also Published As

Publication number Publication date
KR100970537B1 (ko) 2010-07-16

Similar Documents

Publication Publication Date Title
US9678676B2 (en) Method for storage devices to achieve low write amplification with low over provision
US8015371B2 (en) Storage apparatus and method of managing data storage area
KR101083673B1 (ko) 반도체 스토리지 시스템 및 그 제어 방법
US20200073586A1 (en) Information processor and control method
US10884630B2 (en) Storage system
US9792073B2 (en) Method of LUN management in a solid state disk array
KR100974215B1 (ko) 반도체 스토리지 시스템 및 그 제어 방법
US9092320B2 (en) Storage system which includes non-volatile semiconductor storage medium, and storage control method of storage system
US20150095555A1 (en) Method of thin provisioning in a solid state disk array
US8832356B2 (en) Apparatus and method for flash memory address translation
US20140068152A1 (en) Method and system for storage address re-mapping for a multi-bank memory device
JPWO2014184941A1 (ja) ストレージ装置
US8954658B1 (en) Method of LUN management in a solid state disk array
KR102347841B1 (ko) 메모리제어장치 및 메모리제어장치의 동작 방법
JP2022171208A (ja) メモリシステムおよび制御方法
US8671257B2 (en) Memory system having multiple channels and method of generating read commands for compaction in memory system
KR100970537B1 (ko) Ssd 관리 장치 및 방법
US11934264B2 (en) ECC parity biasing for Key-Value data storage devices
US20240012580A1 (en) Systems, methods, and devices for reclaim unit formation and selection in a storage device
US8838878B2 (en) Method of writing to a NAND memory block based file system with log based buffering
KR20230097866A (ko) 메모리 컨트롤러를 포함하는 스토리지 장치 및 스토리지 장치의 동작 방법
JP2024033081A (ja) メモリシステムおよび制御方法
KR20090113624A (ko) 솔리드 스테이트 드라이브 및 그 동작 제어방법
WO2014141545A1 (ja) ストレージ制御装置、及びストレージ制御システム

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20130708

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20140703

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20150707

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20160503

Year of fee payment: 7

LAPS Lapse due to unpaid annual fee