KR20240026080A - 서브미션 큐 엔트리 에이지 추적 - Google Patents

서브미션 큐 엔트리 에이지 추적 Download PDF

Info

Publication number
KR20240026080A
KR20240026080A KR1020230090054A KR20230090054A KR20240026080A KR 20240026080 A KR20240026080 A KR 20240026080A KR 1020230090054 A KR1020230090054 A KR 1020230090054A KR 20230090054 A KR20230090054 A KR 20230090054A KR 20240026080 A KR20240026080 A KR 20240026080A
Authority
KR
South Korea
Prior art keywords
entry
storage device
statement
present disclosure
instruction
Prior art date
Application number
KR1020230090054A
Other languages
English (en)
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 삼성전자주식회사
Publication of KR20240026080A publication Critical patent/KR20240026080A/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/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]
    • 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/0655Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
    • G06F3/0659Command handling arrangements, e.g. command buffers, queues, command scheduling
    • 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/0604Improving or facilitating administration, e.g. storage management
    • 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
    • G06F3/0611Improving I/O performance in relation to response time
    • 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/0644Management of space entities, e.g. partitions, extents, pools
    • 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/0655Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
    • G06F3/0658Controller construction arrangements
    • 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/0683Plurality of storage devices
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/72Details relating to flash memory management
    • G06F2212/7209Validity control, e.g. using flags, time stamps or sequence numbers

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

본 개시의 일 실시예에 따른 스토리지 장치는, 제1 스토리지, 인터페이스, 컨트롤러 및 제2 스토리지를 포함한다. 상기 제1 스토리지는 데이터를 위한 것이다. 상기 인터페이스는 호스트로부터 상기 데이터에 적용가능한 명령을 액세스한다. 상기 컨트롤러는 상기 명령을 실행한다. 상기 제2 스토리지는 타임스탬프를 위한 제1 데이터 필드 및 상기 명령에 대한 참조를 위한 제2 데이터 필드를 포함하는 엔트리를 위한 것이다.

Description

서브미션 큐 엔트리 에이지 추적{SUBMISSION QUEUE ENTRY AGE TRACKING}
본 개시는 일반적으로 스토리지 장치들에 관한 것으로, 보다 구체적으로는 스토리지 장치의 서브미션 큐의 엔트리들의 에이지(age) 추적에 관한 것이다.
스토리지 장치들은 호스트로부터 명령들을 수신할 수 있다. 스토리지 장치들은 명령을 처리하는데 소요되는 시간, 즉 스토리지 장치가 명령을 수행하기 위한 동작들을 수행하기 시작한 시점부터 스토리지 장치가 명령의 처리를 완료한 때까지의 시간을 추적할 수 있다. 이 정보는 호스트에게 유용할 수 있다. 예를 들어, 스토리지 장치가 약속된 시간 내에 명령들을 처리하고 있는지를 확인하는데 유용할 수 있다.
스토리지 장치들이 명령의 에이지를 추적하는 방법을 개선할 필요가 있다.
본 개시의 일 목적은 명령의 에이지를 추적하는 스토리지 장치 및 스토리지 장치의 동작 방법을 제공하는 것이다.
본 개시의 실시예들은 스토리지 장치를 포함한다. 스토리지 장치는 데이터 구조에 대한 스토리지(storage)를 포함할 수 있다. 호스트가 스토리지 장치에게 새로운 명령을 이용할 수 있다고 통지하는 경우 데이터 구조에 저장된 엔트리들이 타임스탬프를 저장하기 위해 이용될 수 있다. 그 다음 타임스탬프는 명령 에이지를 추적하기 위해 이용될 수 있다.
본 개시의 실시예들에 따른 스토리지 장치는, 호스트가 스토리지 장치에게 명령이 이용가능하다고 알린 시점 이후의 시간 간격을 다양한 방식을 통해 측정하여 명령 에이지를 추적하기 위한 다양하고도 효율적인 방법들을 제공할 수 있다.
아래에서 설명되는 도면들은 본 개시의 실시예들이 구현될 수 있는 방법의 예시들이고, 본 개시의 실시예들을 제한하기 위한 것이 아니다. 본 개시의 개별 실시예들은 특정 도면들에 도시되지 않은 요소들을 포함하거나 특정 도면들에 도시된 요소들을 생략할 수 있다. 도면들은 예시를 제공하기 위한 것이며 축척이 조정되지 않은 것일 수 있다.
도 1은 본 개시의 실시예들에 따른, 에이지(age) 추적을 지원하는 스토리지 장치를 포함하는 시스템을 도시한다.
도 2는 본 개시의 실시예들에 따른, 도 1의 장치의 세부사항들을 도시한다.
도 3은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치의 세부사항들을 도시한다.
도 4는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 명령을 실행할 수 있는 과정을 도시한다.
도 5는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치에 의해 도 4의 명령들을 처리하는 이벤트들의 타임라인을 도시한다.
도 6a는 본 개시의 일부 실시예들에 따른, 데이터 구조의 제1 표현을 도시한다.
도 6b는 본 개시의 일부 실시예들에 따른, 데이터 구조의 제2 표현을 도시한다.
도 6c는 본 개시의 일부 실시예들에 따른, 데이터 구조의 제3 표현을 도시한다.
도 7은 본 개시의 일부 실시예들에 따른, 도 1의 스토리지 장치가 도 4의 명령들에 대한 타임스탬프들을 추적하기 위해 엔트리들을 이용할 수 있는 방법을 도시한다.
도 8은 본 개시의 다른 실시예들에 따른, 도 1의 스토리지 장치가 도 4의 명령들에 대한 도 7의 타임스탬프들을 추적하기 위해 도 7의 엔트리들을 이용할 수 있는 방법을 도시한다.
도 9a는 본 개시의 또 다른 실시예들에 따른, 도 1의 스토리지 장치가 도 4의 명령들에 대한 도 7의 타임스탬프들을 추적하기 위해 도 7의 엔트리들을 이용할 수 있는 방법을 도시한다.
도 9b는 본 개시의 또 다른 실시예들에 따른, 도 1의 스토리지 장치가 도 4의 명령들에 대한 도 7의 타임스탬프들을 추적하기 위해 도 7의 엔트리들에 대한 완화된 마킹(relaxed marking)을 이용하는 방법을 도시한다.
도 9c는 본 개시의 또 다른 실시예들에 따른, 도 1의 스토리지 장치가 도 4의 명령들에 대한 도 7의 타임스탬프들을 추적하기 위해 도 7의 엔트리들에 대한 보수적 마킹(conservative marking)을 이용할 수 있는 방법을 도시한다.
도 10은 본 개시의 실시예들에 따른, 도 3의 컨트롤러의 세부사항들을 도시한다.
도 11은 본 개시의 실시예들에 따른, 도 10의 에이지 계산기의 세부사항들을 도시한다.
도 12는 본 개시의 실시예들에 따른, 도 10의 타임아웃 검출기의 세부사항들을 도시한다.
도 13은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 7 내지 도 9c의 엔트리들을 이용하여 명령 에이지를 추적하기 위한 예시적인 절차(procedure)의 순서도를 도시한다.
도 14는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 1의 호스트로부터 도 4의 새로운 명령이 준비되었다는 통지를 수신하기 위한 예시적인 절차의 순서도를 도시한다.
도 15는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 7 내지 도 9c의 엔트리들을 도 4의 명령들과 연관시키기 위한 예시적인 절차의 순서도를 도시한다.
도 16은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 7 내지 도 9c의 엔트리들을 초기화하기 위한 예시적인 절차의 순서도를 도시한다.
도 17은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 6a 내지 도 6c의 데이터 구조들에 도 7 내지 도 9c의 엔트리들을 추가하기 위한 예시적인 절차의 순서도를 도시한다.
도 18은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 4의 명령을 검색하고 그것의 에이지를 추적하기 위한 예시적인 절차의 순서도를 도시한다.
도 19는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 7 내지 도 9c의 엔트리들을 업데이트하기 위한 예시적인 절차의 순서도를 도시한다.
도 20은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 7 내지 도 9c의 엔트리들을 제거할 때 도 6a 내지 도 9c의 데이터 구조들을 업데이트하기 위한 예시절인 절차의 순서도를 도시한다.
도 21은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 7 내지 도 9c의 엔트리 풀(pool)이 비어있는 경우 명령 에이지를 추적하기 위한 예시적인 절차의 순서도를 도시한다.
도 22는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 4의 명령들에 대한 도 7의 타임스탬프들을 결정하기 위한 예시적인 절차의 순서도를 도시한다.
도 23은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 완화된 마킹을 이용하여 명령 에이지를 추적하기 위한 예시적인 절차의 순서도를 도시한다.
도 24는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 보수적 마킹을 이용하여 명령 에이지를 추적하기 위한 예시적인 절차의 순서도를 도시한다.
도 25는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 9c의 고정 디스크립터(fixed descriptor)를 이용하여 명령 에이지를 추적하기 위한 예시적인 절차의 순서도를 도시한다.
도 26은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 9c의 타임스탬프 버퍼를 이용하여 명령 에이지를 추적하기 위한 예시적인 절차의 순서도를 도시한다.
도 27은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 시간 윈도우들(time windows)을 이용하여 명령 에이지를 추적하기 위한 예시적인 절차의 순서도를 도시한다.
도 28은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 7 내지 도 9c의 엔트리들을 이용하여 타임아웃을 검출하기 위한 예시적인 절차의 순서도를 도시한다.
도 29는 본 개시의 실시예들에 따른, 도 10의 타임아웃 검출기가 타임아웃이 발생하였음을 검출하기 위한 예시적인 절차의 순서도를 도시한다.
이하에서 본 개시의 실시예들이 상세하게 참조될 것이고, 그 예시들은 첨부된 도면들에 도시된다. 아래의 상세한 설명에서 본 개시의 완전한 이해를 돕기 위한 수많은 구체적인 세부사항들이 기술된다. 그러나 통상의 기술자는 이러한 특정 세부사항들 없이도 본 개시를 실시할 수 있다는 것을 이해해야 한다. 다른 경우들에서, 잘 알려진 방법들, 절차들, 구성요소들, 회로들 및 네트워크들은 실시예들의 양상들을 불필요하게 모호하게 하지 않도록 상세하게 설명되지 않았다.
본 개시에서 다양한 요소들을 설명하기 위해 제1, 제2 등의 용어들이 이용될 수 있지만, 이러한 요소들은 이러한 용어들에 의해 제한되어서는 안 된다는 것이 이해될 수 있을 것이다. 이러한 용어들은 하나의 요소를 다른 요소와 구별하기 위해서만 이용된다. 예를 들어, 제1 모듈은 제2 모듈로 명명될 수 있고, 본 개시의 범위를 벗어나지 않으면서 유사하게 제2 모듈은 제1 모듈로 명명될 수 있다.
본 개시의 설명에서 이용된 용어는 특정 실시예들을 설명하기 위한 것일 뿐이고, 본 개시를 제한하기 위한 것이 아니다. 본 개시의 설명 및 첨부된 청구범위에서 이용된 바와 같이, 문맥에서 명백하게 다르게 명시하지 않는 한, 단수 형태는 복수 형태도 포함하도록 의도된다. 또한, 본 개시에서 이용된 “및/또는”이라는 용어는 하나 이상의 관련되고 나열된 항목들의 가능한 모든 조합들을 지칭하고 포괄하는 것으로 이해될 것이다. 본 개시에서 이용되는, “포함한다” 및/또는 “포함하는”이라는 용어들은 명시된 특징들, 정수들, 단계들, 동작들, 요소들, 및/또는 구성요소들의 존재를 명시하지만, 하나 이상의 다른 특징들, 정수들, 단계들, 동작들, 요소들, 구성요소들 및/또는 이들의 그룹들의 존재 또는 추가를 배제하지 않음이 더 이해될 것이다. 도면들의 구성요소들 및 특징들은 반드시 축척에 맞게 도시된 것은 아니다.
호스트는 스토리지 장치에 명령들을 전송할 수 있다. 호스트는 예를 들어, 도어벨(doorbell)을 울리는 것(스토리지 장치의 컨트롤러에 대한 일종의 인터럽트일 수 있음.)에 의해 스토리지 장치로 명령이 처리 대기 중임을 알릴 수 있다. 그 다음에 스토리지 장치는 명령을 검색하고 요청된 동작들을 수행할 수 있다.
스토리지 장치는 스토리지 장치가 명령을 검색하는 시점부터 스토리지 장치로 결과를 호스트에 반환하는 시점까지의 시간(에이지 추적(age tracking)이라 지칭됨)을 추적할 수 있다. 이 정보는 여러 가지 이유들로 유용할 수 있다. 첫째, 호스트는 스토리지 장치가 예상되는 시간 제한들(expected time limits) 내에 명령 처리를 완료하고 있는지를 검증하는 것에 관심이 있을 수 있다. 둘째, 스토리지 장치가 에이지 추적을 이용하여 스스로를 프로파일링할 수 있다.
그러나 도어벨이 울리는 순간, 스토리지 장치들이 명령 처리를 시작하지 않을 수 있다. 예를 들어, 스토리지 장치가 이미 다른 명령들을 처리하는 중인 경우, 명령이 처리되기를 기다릴 수 있다. 유사하게, 호스트가 도어벨을 울리는 경우, 대기 중인 다른 명령들이 있는 경우, 그러한 다른 명령들이 먼저 처리되어 해당 명령의 처리의 시작이 지연될 수 있다.
스토리지 장치는 실제로 명령 처리에 소요된 시간만을 추적할 수 있다. 즉, 스토리지 장치는 스토리지 장치가 명령을 검색할 때 타이머를 시작하고, 스토리지 장치가 명령의 처리를 완료할 때 타이머를 종료할 수 있다. 그러나 호스트가 도어벨을 울린 시점과 스토리지 장치가 명령을 검색하는 시점 사이의 시간은 추적되지 않을 수 있다. 따라서 스토리지 장치에 의해 보고된 에이지 추적은 명령의 에이지를 완전하게 설명하지 못할 수 있다.
또한, 호스트는 스토리지 장치가 명령을 처리하는데 걸리는 시간과 관련하여 특정 예상치들을 가질 수 있다. 명령이 예상되는 시간 내에 처리되지 않는 경우 타임아웃(오류)이 발생했을 수 있다. 그러나 스토리지 장치는 명령이 예상되는 시간을 초과하여 처리 대기 중임을 판단하지 못할 수 있다.
이러한 문제들을 해결하기 위해, 본 개시의 실시예들은 도어벨 이벤트들(doorbell events)의 타임스탬프들(timestamps)을 저장하기 위한 링크드 리스트(linked list)와 같은 데이터 구조를 포함할 수 있다. 호스트가 도어벨을 울리는 경우, 스토리지 장치는 링크드 리스트에 엔트리를 추가하여 호스트가 도어벨을 울린 시점의 타임스탬프를 저장하고 해당 명령을 식별할 수 있다. 스토리지 장치가 명령을 검색하는 경우, 스토리지 장치는 링크드 리스트에서 관련된 엔트리를 검색할 수도 있다. 그 다음에 스토리지 장치는 링크드 리스트에 있는 엔트리의 타임스탬프를 명령 처리를 위한 시작 시간으로서 이용하고 그 다음에 링크드 리스트에서 해당 엔트리를 해제할 수 있다. 스토리지 장치가 명령 처리를 완료하면, 스토리지 장치는 링크드 리스트의 엔트리에 있는 타임스탬프에서 시작하여 명령을 처리하는데 걸린 시간을 판단할 수 있다.
스토리지 장치가 타임스탬프들을 저장하는 방법과 명령들이 저장되는 메모리의 크기에 따라, 링크드 리스트의 각 엔트리는 예를 들어, 타임스탬프를 저장하기 위한 8 바이트 및 해당 큐에서 명령을 가리키기 위한 8 바이트가 필요할 수 있다. 그러나 스토리지 장치는 수백만 또는 수십억 개의 명령들의 큐들을 지원할 수 있다. 링크드 리스트의 엔트리 당 16 바이트의 스토리지에 40억 개의 엔트리들을 곱하면 약 68 기가바이트(GB)의 스토리지가 필요할 것이다. 링크드 리스트는 SRAM(static random access memory) 또는 DRAM(dynamic random access memory)에 저장될 수 있는데, 스토리지 장치에 68 GB의 SRAM 또는 DRAM을 장착하는 것으로 상대적으로 비용이 많이 들 수 있다. 스토리지 장치의 비용을 줄이기 위해, 본 개시의 실시예들은 대기 중인 명령들의 수보다 작은 다수의 링크드 리스트 엔트리들을 위한 스토리지를 포함할 수 있다. 링크드 리스트 엔트리들은 프리 풀(free pool)로부터 할당될 수 있고, 더 이상 필요하지 않을 때 프리 풀로 반환되어, 링크드 리스트를 저장하는데 필요할 수 있는 공간을 감소시킬 수 있다.
그러나 링크드 리스트 엔트리들의 수가 대기 중인 명령들의 수보다 작은 경우, 모든 링크드 리스트 엔트리들이 이용될 수 있다. 이러한 상황을 해결하기 위해, 본 개시의 실시예들은 (명령의 타임스탬프가 추적되지 않는 시간을 제한하기 위해) 링크드 리스트 엔트리가 즉시 재이용될 수 있는지 여부를 결정할 수 있다. 선택적으로, 본 개시의 실시예들은 (특정 도어벨 타임스탬프가 아닌) 시간 간격을 추적하기 위해 링크드 리스트 엔트리들을 이용할 수 있고, 해당 시간 간격 동안 호스트가 도어벨을 울린 모든 명령들에 대해 이용될 수 있다. 선택적으로, 본 개시의 실시예들은 단일 링크드 리스트 엔트리를 이용하여, 프리 링크드 리스트 엔트리들이 없을 때 수신된 하나 이상의 명령들에 대해 가장 최근의 도어벨 이벤트의 타임스탬프를 저장하거나, 더 최근의 도어벨 이벤트와 연관된 명령을 이전에 할당된 링크드 리스트 엔트리에 첨부할 수 있다.
도 1은 본 개시의 실시예들에 따른, 에이지 추적을 지원하는 스토리지 장치를 포함하는 시스템을 도시한다. 도 1에서, 호스트 또는 시스템으로도 지칭될 수 있는 장치(105)는 프로세서(110), 메모리(115) 및 스토리지 장치(120)를 포함할 수 있다. 프로세서(110)는 임의의 다양한 프로세서일 수 있다. (프로세서(110)는, 아래에 설명되는 다른 구성요소들과 함께, 설명의 용이성을 위해 장치의 외부에 도시되어 있다. 본 개시의 실시예들은 장치 내부에 이러한 구성요소들을 포함할 수 있다.) 도 1은 단일 프로세서(110)를 도시하지만, 장치(105)는 임의의 수의 프로세서들을 포함할 수 있고, 각 프로세서는 단일 코어 또는 멀티-코어 프로세서들일 수 있고, 각 프로세서는 (다른 가능성들 중에서) RISC(Reduced Instruction Set Computer) 아키텍쳐 또는 CISC(Complex Instruction Set Computer) 아키텍쳐를 구현할 수 있고, 임의의 바람직한 조합으로 혼합될 수 있다.
프로세서(110)는 메모리(115)에 결합될 수 있다. 메모리(115)는 플래시 메모리, DRAM, SRAM, PRAM(Persistent Random Access Memory), FRAM(Ferroelectric Random Access Memory), 또는 MRAM(Magnetoresistive Random Access Memory) 등과 같은 NVRAM(Non-Volatile Random Access Memory)과 같은 임의의 다양한 메모리일 수 있다. 메모리(115)는 바람직하게는 휘발성 또는 비휘발성 메모리일 수 있다. 메모리(115)는 또한 상이한 메모리 유형들의 임의의 바람직한 조합일 수 있고, 메모리 컨트롤러(125)에 의해 관리될 수 있다. 메모리(115)는 “단기간(short-term)”이라고 할 수 있는 데이터, 즉 장기간 저장될 것으로 예상되지 않는 데이터를 저장하는데 이용될 수 있다. 단기간 데이터의 예들은 임시 파일, 애플리케이션들에 의해 지역적으로(locally) 이용되는 데이터(다른 저장 위치들로부터 복사되었을 수 있음) 등을 포함할 수 있다.
프로세서(110) 및 메모리(115)는 또한 다양한 애플리케이션들이 실행될 수 있는 운영 체제를 지원할 수도 있다. 이러한 애플리케이션들은 메모리(115)로부터 데이터를 읽거나 메모리(115)에 데이터를 쓰기 위한 요청(명령들이라고도 할 수 있음)을 실행할 수 있다. 스토리지 장치(120)가 일종의 파일 시스템을 통해 데이터를 읽거나 쓰는 애플리케이션들을 지원하기 위해 이용되는 경우, 스토리지 장치(120)는 장치 드라이버(130)를 이용하여 액세스될 수 있다. 도 1은 하나의 스토리지 장치(120)를 도시하지만, 장치(105)에는 임의의 수의 스토리지 장치들이 존재할 수 있다. 스토리지 장치(120)는, 예를 들어, NVMe(Non-Volatile Memory Express) 프로토콜을 포함하는 임의의 바람직한 프로토콜(들)을 지원할 수 있다. 상이한 스토리지 장치들(120)은 상이한 프로토콜들 및/또는 인터페이스들을 지원할 수 있다. 예를 들어, 스토리지 장치(120)는 캐시 일관성 인터커넥트 프로토콜(cache coherent interconnect protocol)을 지원할 수 있고, 이는 스토리지 장치(120)의 데이터에 대한 블록-레벨 프로토콜(block-level protocol)(또는 임의의 다른 높은 수준의 세분성(granularity)) 액세스 및 바이트-레벨 프로토콜(byte-level protocol)(또는 임의의 다른 낮은 수준의 세분성) 액세스 모두를 지원할 수 있다. 이러한 캐시 일관성 상호연결 프로토콜의 예로는 CXL(compute express link) 프로토콜이 있고, 이는 CXL.io 프로토콜을 이용하여 블록 단위의 데이터에 액세스하고, CXL.mem 프로토콜을 이용하여 바이트 단위의 데이터에 액세스하는 것을 지원한다. 이러한 방식으로 CXL 스토리지 장치의 데이터는 (솔리드 스테이트 드라이브(SSD)와 같은) 블록-레벨 데이터 또는 (메모리와 같은) 바이트-레벨 데이터로 액세스할 수 있고, CXL 스토리지 장치는 시스템 메모리를 확장하기 위해 이용될 수 있다. 도 1은 “스토리지 장치”라는 일반적인 용어를 이용하지만, 본 개시의 실시예들은 컴퓨팅 저장 유닛들의 이용으로부터 이점을 얻을 수 있는 임의의 스토리지 장치 포맷들을 포함할 수 있고, 그 예로는 하드 디스크 드라이브들 및 SSD들을 포함할 수 있다. 아래의 “SSD”에 대한 모든 참조는 본 개시의 다른 실시예들을 포함하는 것으로 이해되어야 한다. 또한, 상이한 유형의 스토리지 장치들이 혼합될 수 있다. 예를 들어, 하나의 스토리지 장치(120)는 하드 디스크 드라이브일 수 있고, 다른 스토리지 장치(120)는 SSD일 수 있다.
도 2는 본 개시의 실시예들에 따른, 도 1의 장치의 세부사항들을 도시한다. 도 2에서, 전형적으로, 장치(105)는 하나 이상의 프로세서들(110)을 포함하고, 이는 메모리 컨트롤러들(125) 및 클럭들(205)을 포함할 수 있고, 이들은 장치의 구성요소들의 동작들을 조정하기 위해 이용될 수 있다. 프로세서(110)는 또한 메모리들(115)에 결합될 수 있고, 예를 들어, RAM, ROM(read-only memory) 또는 다른 상태 보존 미디어(state preserving media)를 포함할 수 있다. 프로세서들(110)은 또한 스토리지 장치들(120) 및 네트워크 커넥터(210)에 결합될 수 있고, 이는 예를 들어, 이더넷 커넥터 또는 무선 커넥터일 수 있다. 프로세서들(110)은 또한 버스들(215)에 연결될 수 있고, 버스(215)에는 이용이자 인터페이스들(220), 및 다른 구성요소들 중에서도 입출력(I/O) 엔진들(225)을 이용하여 관리될 수 있는 입출력(I/O) 인터페이스 포트들이 부착될 수 있다.
도 3은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치의 세부사항들을 도시한다. 도 3에서, 스토리지 장치(120)의 구현은 SSD에 대한 것으로서 도시된다. 도 3에서, 스토리지 장치(120)는 호스트 인터페이스 레이어(HIL)(305), 컨트롤러(310) 및 다양한 플래시 메모리 칩들(315-1 내지 315-8)(“플래시 메모리 스토리지” 또는 단지 “스토리지”라고도 하고, 통칭하여 플래시 메모리 칩들(315) 또는 스토리지(315)로 지칭될 수 있음)을 포함할 수 있고, 다양한 채널들(320-1 내지 320-4)(통칭하여 채널들(320)로 지칭될 수 있음)로 구성될 수 있다. 호스트 인터페이스 레이어(305)는 스토리지 장치(120)와 (도 1의 프로세서(110)와 같은) 다른 구성요소들 사이의 통신들을 관리할 수 있다. 호스트 인터페이스 레이어(305)는 또한 스토리지 장치(120)로부터 원거리에 있는 장치들과의 통신들을 관리할 수도 있다. 즉, 호스트 인터페이스 레이어(305)는 도 1의 프로세서(110) 외의 장치들(예를 들어, 다른 가능성들 중에서 가속기 또는 네트워크 인터페이스 카드)과의 통신들을 관리할 수 있고, 이는 도 1의 장치(105)에 지역적이거나 장치(105)로부터 원격일 수 있다(예를 들어, 하나 이상의 네트워크 연결들을 통해). 이러한 통신들은 스토리지 장치(120)로부터 데이터를 읽기 위한 읽기 요청들, 스토리지 장치(120)로부터 데이터를 쓰기 위한 쓰기 요청들 및 스토리지 장치(120)로부터 데이터를 삭제하기(delete) 위한 삭제 요청들을 포함할 수 있다.
호스트 인터페이스 레이어(305)는 단일 포트만을 통해 인터페이스를 관리할 수 있고, 다수의 포트들을 통해 인터페이스들을 관리할 수도 있다. 선택적으로, 스토리지 장치(120)는 다수의 포트들을 포함할 수 있고, 각 포트는 해당 포트를 통해 인터페이스들을 관리하기 위한 별도의 호스트 인터페이스 레이어(305)를 가질 수 있다. 본 개시의 실시예들은 또한 이러한 가능성들을 혼합할 수도 있다(예를 들어, 3개의 포트들을 가지는 SSD는 하나의 포트를 관리하기 위한 하나의 호스트 인터페이스 레이어와 다른 2개의 포트들을 관리하기 위한 제2 호스트 인터페이스 레이어를 가질 수 있다.).
컨트롤러(310)는 플래시 메모리 컨트롤러(325)를 이용하여 플래시 메모리 칩들(315)에서, 가비지 컬렉션 및 다른 동작들과 함께, 읽기 및 쓰기 동작들을 관리할 수 있다. 컨트롤러(310)는 또한 도 1의 호스트(105)에 의해 이용되는 (논리 블록 어드레스들(LBAs)과 같은) 논리 어드레스들을 데이터가 스토리지 장치(120)에 실제로 저장되는 (물리 블록 어드레스들(PBAs)과 같은) 물리 어드레스들로 맵핑하는 것을 관리할 수 있는 변환 레이어(330)를 포함할 수 있다. 변환 레이어(330)를 이용함으로써, 데이터가 스토리지 장치(120) 내의 하나의 물리 어드레스로부터 다른 물리 어드레스로 이동되는 경우 도 1의 장치(105)는 통지를 받을 필요가 없다.
본 개시의 일부 실시예들에서, 컨트롤러(310)는 가속기(335)를 포함할 수 있다. 가속기(335)는 도 1의 장치(105)에서 실행되는(또는 장치(105)로 연결된) 애플리케이션들에 의해 활용될 수 있는 기능(functionality)을 스토리지 장치(120)에 추가할 수 있다.
본 개시의 일부 실시예들에서, 컨트롤러(310)는 또한 메모리(340)를 포함할 수 있다. 메모리(340)는 다양한 기능들을 수행하기 위해 컨트롤러(310)에 의해 이용될 수 있는 스토리지 장치(120)에 지역적인 메모리일 수 있다. 메모리(340)는 SRAM 또는 DRAM과 같은 임의의 형태의 메모리일 수 있다. 메모리(340)는 아래의 도 4를 참조하여 더 논의되고, 아래의 도 7 내지 도 9b를 참조하여 더 논의되는 데이터 구조들 및 엔트리들과 같은 정보를 저장하기 위해 이용될 수 있다.
도 3은 스토리지 장치(120)가 4개의 채널들(320)로 구성된 8개의 플래시 메모리 칩들(315)을 포함하는 것으로 도시되어 있지만, 본 개시의 실시예들은 임의의 수의 채널들로 구성된 임의의 수의 플래시 메모리 칩들을 지원할 수 있다. 마찬가지로, 도 3은 SSD의 구조를 도시하고 있으나, 다른 스토리지 장치들(예를 들어, 하드 디스크 드라이브)이 데이터의 읽기 및 쓰기를 관리하기 위해 유사한 잠재적 이점을 가지나 도 3에 도시된 것과 다른 구조를 이용하여 구현될 수 있다.
본 개시의 일부 실시예들에서, 스토리지 장치는 다양한 크기의 저장 단위로 분할될 수 있다. 예를 들어, SSD는 페이지들로 분할될 수 있고, 각 페이지는 약 8 킬로바이트(KB)(214 바이트)의 데이터를 저장할 수 있다. 하나의 블록은 128 페이지들을 포함할 수 있으므로, 하나의 블록은 약 1 메가바이트(MB)(221 바이트)의 크기를 가질 수 있다. 또한 블록들은 함께 그룹화되어 슈퍼블록들을 형성할 수도 있다.
SSD는 다양한 단위 크기들(unit sizes)을 포함할 수 있고, 이는 상이한 동작들(operations)이 상이한 단위들(units)에서 수행될 수 있기 때문이다. 예를 들어, SSD는 데이터의 페이지를 읽거나 쓸 수 있다. 따라서 도 1의 프로세서(110)가 읽기 또는 쓰기 요청을 발행하는 경우, 도 1의 프로세서(110)는 SSD에 쓰여지는 하나의 데이터의 페이지 전부를 제공하거나 SSD로부터 읽게 되는 하나의 데이터의 페이지 전부를 저장하기에 충분히 큰 버퍼를 제공할 수 있다.
그러나 SSD들은 일반적으로 데이터의 덮어쓰기(overwriting)를 지원하지 않는다. 즉, 도 1의 프로세서(110)가 이미 SSD에 쓰인 일부 데이터를 대체하고자 하는 경우, SSD는 대신 업데이트된 데이터를 새로운 페이지에 쓰고, 원래의 페이지를 무효화할 수 있다. 그 다음에 변환 레이블(330)은 업데이트된 데이터가 저장되는 새로운 페이지를 반영하도록 업데이트될 수 있다.
SSD는 페이지를 새로운 데이터로 덮어쓰지 않고 무효화할 수 있기 때문에, 어느 시점에서 SSD는 무효화된 페이지의 데이터를 지울 수 있다(새로운 데이터가 페이지에 쓰일 수 있도록). 이 프로세스를 가비지 컬렉션(garbage collection)이라고 할 수 있다. 그러나 SSD들은 페이지 단위가 아닌 블록(또는 슈퍼블록) 단위로 데이터를 지울 수 있다. 따라서 무효로 표시된 페이지들을 복구하기 위해, SSD는 해당 페이지를 포함하는 블록의 모든 데이터를 지워야 할 수 있다.
SSD가 페이지가 아닌 블록들을 지우려는 경우, SSD는 블록의 모든 페이지들이 지워질 때까지 기다릴 수 있다. 그러나 개별 블록의 모든 페이지들이 언제 무효화될지를(또는 무효화될지 여부도) 알 수 있는 방법은 없다. SSD가 블록의 모든 페이지들이 무효화될 때까지 기다렸다가 블록을 지우면, SSD의 여유 공간이 부족해질 수 있다. 따라서 가비지 컬렉션은 때때로 일부 유효한 데이터가 저장된 블록을 지우는 것을 포함할 수 있다. 데이터 손실을 방지하기 위해, SSD는 유효한 데이터를 프리 페이지로 복사한 다음에 블록을 지울 수 있다(따라서 블록을 프리 블록 풀(pool)로 반환하고 해당 블록의 모든 페이지들을 다시 데이터를 저장하는데 이용할 수 있게 함).
도 4는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 명령을 실행할 수 있는 과정을 도시한다. 명령이 스토리지 장치(120)로 전송되는 경우, 프로세서(110)는 동작(405)으로서 도시된 바와 같이 상기 명령을 저장할 수 있다. 도 4에서, 명령들(410-1 내지 410-6)(통칭하여 명령들(410)로서 지칭될 수 있음)은 도 1의 호스트(105)의 메모리(115)에 저장될 수 있고, 본 개시의 실시예들은 명령들(410)을 임의의 바람직한 위치에 저장할 수 있다. 아래의 설명은 도 3의 SSD(120)와 같은 NVMe 스토리지 장치들을 위해 이용될 수 있지만, 본 개시의 실시예들은 다른 프로토콜들을 이용하는 스토리지 장치들에도 적용될 수 있다.
본 개시의 일부 실시예들에서, 명령들(410)은 서브미션 큐들로 구성될 수 있다. 예를 들어, 프로세서(110)에서 실행되는 상이한 프로세서들은 별도의 서브미션 큐들을 가질 수 있거나, 상이한 서브미션 큐들은 스토리지 장치(120)에 의한 실행에 대해 상이한 우선순위들을 가질 수 있다. 도 4에서, 두 개의 서브미션 큐들(415-1 및 415-2)(통칭하여 서브미션 큐들(415)로 지칭될 수 있음)이 도시되어 있는데, 서브미션 큐(415-1)는 명령들(410-1, 410-2 및 410-3)을 포함하는 것으로 도시되어 있고, 서브미션 큐(415-2)는 명령들(410-4, 410-5 및 410-6)을 포함하는 것으로 도시되어 있다. 상이한 서브미션 큐들을 이용함으로써, 스토리지 장치(120)가 해당 프로세스에 대한 명령의 실행을 완료할 때 프로세서(110)가 정확한 프로세스를 통지하는 것이 가능할 수 있다. 도 4는 두 개의 서브미션 큐들(415)을 도시하지만, 본 개시의 실시예들은 임의의 수(하나 이상)의 서브미션 큐들을 포함할 수 있다. 또한, “서브미션 큐”라는 용어는 예를 들어, 스토리지 장치(120)로 명령들을 제출하기 위해 이용되는 특정한 데이터 구조를 의미하는 것으로 통상적으로 이해될 수 있으나, 본 개시의 실시예들은 “서브미션 큐”라고 불리든 아니든 간에, 임의의 동등하거나 대체 가능한 데이터 구조를 포함할 수 있다. 명령들(410)은 임의의 순서로 서브미션 큐들(415)에 배치될 수 있다. 예를 들어, 도 4에서, 명령들(410-1 및 410-2)은 먼저 서브미션 큐(415-1)에 배치될 수 있고, 그 다음에 명령들(410-4 및 410-5)은 서브미션 큐(415-2)에 배치될 수 있고, 그 다음에 명령(410-3)은 서브미션 큐(415-1)에 배치될 수 있고, 최종적으로 명령(410-6)은 서브미션 큐(415-2)에 배치될 수 있다.
명령(410)이 메모리(115)에 저장되면, 프로세서(110)는 명령(410)이 실행을 위해 이용가능하다고 스토리지 장치(120)에게 알릴 수 있고, 이는 동작(420)으로서 도시된다. 본 개시의 일부 실시예들에서, 프로세서(110)는 스토리지 장치(120)로 알리기 위해 “도어벨(doorbell)을 울릴” 수 있다. 인터럽트와 유사하게, 프로세서(110)는 명령(410)이 메모리에 저장되는 주소를 기입하여 명령을 검색할 수 있는 위치를 스토리지 장치(120)에게 알릴 수 있다. 이 주소는 예를 들어, 도어벨(425-1) 및/또는 도어벨(425-2)(통칭하여 도어벨들(425)로 지칭될 수 있음)에 기입될 수 있다. 도어벨들(425)은 예를 들어, 스토리지 장치(120) 내의 메모리(340)에 있는 레지스터일 수 있다. 스토리지 장치(120)는 도어벨들(425)에서의 주소의 변화를 검출하고, 서브미션 큐(415)에서 명령이 이용가능하다고 인식할 수 있다.
다수의 서브미션 큐들(415)이 이용되는 본 개시의 실시예들에서, 메모리(340)는 다수의 도어벨들(425)을, 각 서브미션 큐(415)에 대해 하나씩, 포함할 수 있다. 이러한 방식으로, 스토리지 장치(120)는 명령(410)을 저장하는 서브미션 큐(415)를 인식할 수 있다. 본 개시의 실시예들은 임의의 수(하나 이상)의 도어벨들(425)을 지원할 수 있다. 또한, “도어벨”이라는 용어는 일반적으로 명령들(410)이 실행을 위해 이용가능하다고 스토리지 장치(120)에게 알리기 위해 이용되는 특정 데이터 구조를 의미하는 것으로 이해될 수 있지만, 본 개시의 실시예들은 “도어벨”이라고 불리든 아니든 간에, 임의의 동등한 또는 대체가능한 데이터 구조를 포함할 수 있다.
스토리지 장치(120)가 명령(410)이 이용가능하다고 인식하면, 스토리지 장치(120)는 메모리(115)로부터 명령(410)을 검색할 수 있고, 이는 동작(430)으로서 도시된다. 스토리지 장치(120)는 임의의 바람직한 방식으로 메모리(115)로부터 명령(410)을 검색할 수 있다. 예를 들어, 도어벨(425)에 저장된 주소를 이용하여 메모리(115)에서 명령을 찾고, 명령을 읽을 수 있다. 그 다음에 스토리지 장치(120)는 명령(410)을 실행할 수 있다.
스토리지 장치(120)가 명령(410)의 실행을 완료하면, 스토리지 장치(120)는 메모리(115)에 그 결과를 저장할 수 있고, 이는 동작(435)으로서 도시된다. 각 명령(410)은 결과를 생성할 수 있다. 따라서 명령들(410-1 내지 410-6)은 결과들(440-1 내지 440-6)(이는 통칭하여 결과들(440)로서 지칭될 수 있음.)을 생성할 수 있다. 명령들(410)이 다수의 서브미션 큐들(415)에 배치될 수 있는 것과 마찬가지로, 결과들(440)은 다수의 컴플리션 큐들에 배치될 수 있다. 도 4는 결과들(440)이 2개의 컴플리션 큐들(445-1 및 445-2)(이는 통칭하여 컴플리션 큐들(445)로 지칭될 수 있음)에 배치되어 있는 것을 도시하지만, 본 개시의 실시예들은 임의의 수의 컴플리션 큐들(445)을 지원할 수 있다. 본 개시의 일부 실시예들에서, 각 서브미션 큐(415)에 대해 하나의 컴플리션 큐(445)가 있을 수 있고, 본 개시의 다른 실시예들에서, 서브미션 큐들(415)의 수와 컴플리션 큐들(445)의 수는 다를 수 있다.
결과(440)가 저장되면, 스토리지 장치(120)는 명령(410)이 실행되었음을 프로세서(110)에게 통지할 수 있고, 이는 동작(450)으로서 도시된다. 도어벨(425)이 울리는 것과 마찬가지로, 스토리지 장치(120)는 인터럽트 또는 다른 방식을 수행하여 프로세서(110)에게 명령(410)이 실행되었음을 알릴 수 있다.
상기 논의는 서브미션 큐(415)에 추가되는 단일 명령(410) 및 개별적으로 프로세서(110)가 각 명령(415)에 대해 스토리지 장치(120)에게 알리는 것에 초점을 맞춘다. 그러나 본 개시의 일부 실시예들에서, 프로세서(110)는 다수(둘 이상)의 명령들을 서브미션 큐들(415)에 추가하고 단일 통지(single notification)를 통해 모든 명령들에 대해 스토리지 장치(120)에게 통지할 수 있다.
도 5는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치에 의해 도 4의 명령들을 처리하는 이벤트들의 타임라인을 도시한다. 도 5에서, 시점(t0)(도 1의 호스트(105)의 동작 동안의 일부 시점)에서, 도 1의 프로세서(110)는 도 4의 도어벨(425)을 울려서 도 1의 스토리지 장치(120)에게 도 4의 명령(410)이 실행을 위해 이용가능하다고 알릴 수 있고, 이는 동작(505)으로서 도시된다. 시점(t1)에서, 스토리지 장치(120)는 도 4의 명령(410)을 검색하고 실행할 수 있고, 이는 동작(510)으로서 도시된다. 그 다음에, 시점(t2)에서, 도 1의 스토리지 장치(120)는 도 4의 명령(410)의 결과를 도 1의 프로세서(110)에게 반환할 수 있고, 이는 동작(515)으로서 도시된다.
에이지 추적이 도 1의 스토리지 장치(120)가 명령(410)을 검색하고 실행하기 시작하는 시점과 도 1의 스토리지 장치(120)가 명령(410)의 실행을 완료하고 그 결과들을 도 1의 프로세서(110)에게로 반환하는 시점 사이의 시간만을 측정하는 경우, 에이지 추적은 시점들(t1 및 t2) 사이의 시간 간격(520)만을 측정한다. 즉, 도 1의 프로세서(110)가 도 1의 스토리지 장치(120)에게 도 4의 명령(410)이 이용가능하다고 알린 시점부터 도 1의 스토리지 장치(120)가 명령(410)을 검색한 시점사이의 시간 간격(시점들(t0 및 t1) 사이의 시간 간격(525))은 측정되지 않는다. 그러나 시간 간격(525)을 추적하지 않음으로써, 도 4의 명령(410)의 에이지는 (시간 간격(525)의 길이에 따라) 부정확할 수 있다. 본 개시의 실시예들은 추가적인 동작(530)을 수행함으로써 타임스탬프(timestamp)를 기록하는 명령들(410)의 에이지 추적을 개선할 수 있다. 이러한 타임스탬프는 시점들(t0 및 t1) 사이의 어딘가에 있는 시점(t3)에서 기록될 수 있다. 동작(530)은 동작(505 직후에 수행되는 것이 이상적이지만, 실제로는, 부정확성을 최소화하기 위해, 동작(505) 후 되도록 빠르게 즉, 시점(t0)과 가까운 시점에 수행될 수 있다. 따라서 시간 간격(525)을 측정하지 않음으로 인한 부정확성은 제거되거나 적어도 최소화될 수 있다.
도 6a는 본 개시의 일부 실시예들에 따른, 데이터 구조의 제1 표현을 도시한다. 도 6a에서, 예를 들어, 도 4의 서브미션 큐(415)에 이용될 수 있는 원형 큐 데이터 구조(605)가 도시된다. 즉, 상기 원형 큐의 각 명령(410)은 원형 큐의 다른 명령(410)에 선행할 뿐만 아니라 뒤따른다. 이러한 방식으로, 원형 큐는 끝도 시작도 갖지 않는다.
원형 큐는 원형이기 때문에, 원형 큐에는 큐에서 명령들(410)의 시작 또는 끝으로 간주될 수 있는 특정 엔트리가 없다. 이를 위해, 헤드 포인터(610) 및 테일 포인터(425)가 이용될 수 있다. 헤드 포인터(610)는 (원형 큐가, 가장 오래된 명령(410)이 다음에 실행되어야 하는 선입선출(first in, first out)(FIFO) 큐를 구현한다고 가정하면) 원형 큐에서 가장 오래된 명령(410)을 가리킬 수 있고, 테일 포인터(425)는 원형 큐에서 가장 새로운 명령(410)을 가리킬 수 있다. 본 개시의 일부 실시예들에서, 테일 포인터(425)는 도 4의 도어벨(425)과 동일한 레지스터일 수 있고 (따라서 참조번호(425)를 재이용함), 본 개시의 다른 실시예들에서, 도 4의 도어벨(425) 과 테일 포인터(425)는 도 1의 스토리지 장치(120)에 의해 관리되는 다른 데이터일 수 있다. 아래의 논의에서는 도 4의 테일 포인터(425)와 도어벨(425)이 동일한 레지스터라고 가정하지만, 이들 요소들이 상이하도록 쉽게 수정될 수 있다.
도 6a에서, 명령들(410-1 내지 410-3)이 원형 큐에 “저장”되지만, 헤드 포인터(610)와 테일 포인터(425)가 가리키는 명령들(410) 사이에 있지는 않다. 원형 큐에 “저장”되어있지만 점선 윤곽선들로 도시된 이러한 명령들(410-1 내지 410-3)은 보류 중인 명령들(410)로 간주되지 않는다.
원형 큐에 있는 명령들(410)의 수는 시간에 따라 변할 수 있다. 즉, 어느 시점에서, 원형 큐는 명령들(410)을 포함하지 않거나, 명령들로 완전히 가득 차 있거나, 일부 명령들을 포함하고 일부 빈 공간을 가질 수도 있다. 헤드 포인터(610) 및 테일 포인터(425)는 이러한 가능성들을 구별하기 위해 이용될 수 있다.
도 4를 참조하여 상술한 바와 같이, 새로운 명령이 도 1의 스토리지 장치(120)가 실행을 위해 이용가능한 경우, 도 1의 프로세서(110)에 의해 테일 포인터(425)는 전진할 수 있다. 병렬적인 방식으로, 스토리지 장치(120)가 도 4의 서브미션 큐(415)에서 명령(410)을 제거하는 경우 헤드 포인터(610)가 전진할 수 있다. 따라서 헤드 포인터(610) 및 테일 포인터(425) 모두가 원형 큐에서 동일한 “명령”(410)을 가리키고 있다면, 스토리지 장치가 실행하기를 기다리는 명령들(410)은 현재 존재하지 않는다. 스토리지 장치(120)는 이 정보를 이용하여 유휴 상태인지를(또는 도 1의 호스트(105)로부터의 요청들에 영향을 미치지 않고 백그라운드 프로세스들을 자유롭게 실행할 수 있는지를) 결정할 수 있다.
반면에, 테일 포인터(425)가 헤드 포인터(610)가 가리키는 명령(410) 이전의 명령(410)을 가리키고 있다면, 원형 큐는 가득차고, 도 1의 프로세서(110)가 원형 큐에 새로운 명령을 배치할 수 있는 슬롯들(slots)은 없다. 프로세서(110)는 이 정보를 이용하여 새로운 명령(410)을 원형 큐에 삽입하기 위해 대기해야 할 수 있음을 결정할 수 있다.
헤드 포인터(610) 및 테일 포인터(425)에 대한 값들의 임의의 다른 조합은 적어도 하나의 명령(410)이 실행 대기 중임을 나타낼 수 있지만, 또한 적어도 하나의 새로운 명령(410)을 순환 큐에 추가할 여지가 있음을 나타낼 수도 있다.
도 6a에 명령들(410-1 내지 410-3)이 도시되어 있지만, 헤드 포인터(610)가 명령(410-4)(데이터 구조(605)로부터 검색될 다음 명령)을 가리키도록 전진되어 있기 때문에, 명령들(410-1 내지 410-3)은 실제로 원형 큐에 있지 않다는 것을 알 수 있을 것이다. 이러한 사실은 본 개시의 일부 실시예들이 서브미션 큐에서 명령들을 지우지 않기 때문이다. 일단 (명령을 지나쳐 헤드 포인터(610)를 전진시킴으로써) 원형 큐에서 “제거”되면, 원형 큐에서 엔트리에 있는 모든 정보는 무시될 수 있다. 도 1의 프로세서(110)가 명령(410-1)을 대체하기 위해 새로운 명령을 추가하는 경우 (그리고 테일 포인터(425)를 전진시키는 경우), 오래된 명령은 새로운 명령으로 덮어쓰여질 수 있다.
도 6a에 도시된 바와 같은 원형 큐가 이용될 수 있는 경우, 저장될 수 있는 명령들(410)의 수는 원형 큐의 크기 및 원형 큐 내의 각 개별 명령(410)의 크기에 기초하여 미리 고정될 수 있다. 임의의 수의 명령들을 지원할 수 있는 대체 가능한 데이터 구조(605)가 도 6b에 도시된 것과 같은 링크드 리스트이다.
도 6b에서, 링크드 리스트 데이터 구조(605)가 도시된다. 링크드 리스트에서, 각 요소는 값(value)과 링크드 리스트의 다음 엔트리에 대한 포인터를 포함한다. 따라서 예를 들어, 명령(410-1)은 명령(410-2)을 가리킬 수 있고, 이는 차례로 명령(410-3) 등을 가리킬 수 있다. 링크드 리스트의 마지막 엔트리(명령(410-8))는 널(null) 포인터를 포함할 수 있다. 널 포인터는 데이터가 저장될 것으로 예상되지 않는 (‘0’과 같은) 특별한 주소에 대한 포인터이다. 도 6b는 단일 링크드 리스트를 이용하는 본 개시의 실시예들을 도시한다. 본 개시의 다른 실시예들은 이중 링크드 리스트(doubly linked list)를 이용할 수 있고, 여기서 각 노드는 링크드 리스트의 다음 노드 및 이전 노드 모두에 대한 포인터를 포함한다.
헤드 포인터(610)는 링크드 리스트 데이터 구조의 첫 번째 엔트리를 가리킬 수 있고, 테일 포인터(425)는 링크드 리스트 데이터 구조의 마지막 엔트리를 가리킬 수 있다. 따라서 헤드 포인터(610)가 가리키는 명령(410-4)은 링크드 리스트에서 액세스될 다음 명령을 나타낼 수 있다. 도 1의 스토리지 장치(120)가 링크드 리스트에서 명령(410-4)을 제거하는 경우, 헤드 포인터(425)는 명령(410-4)에서 포인터에 의해 식별되는 바와 같이 다음 명령(명령(410-5)을 가리키도록 업데이트될 수 있다. 유사하게, 도 1의 프로세서(110)가 링크드 리스트에 새로운 명령을 추가하는 경우, 도 1의 메모리(115)로부터 새로운 엔트리가 할당되고 명령으로 채워질 수 있다(새로운 엔트리가 링크드 리스트의 임의의 다른 엔트리를 가리키지 않음을 나타내기 위해 널 포인터가 이용됨.). 테일 포인터(425)가 가리키는 엔트리(명령(410-8))는 새로운 엔트리를 가리키도록 업데이트된 포인터를 가질 수 있고, 이는 테일 포인터(425)일 수 있으며, 그 후에 새로운 엔트리가 링크드 리스트에 추가될 수 있다.
명령들(410-1 내지 410-3)은 링크드 리스트의 일부로서 도시되지만, 헤드 포인터(610)가 가리키는 엔트리보다 전에 나온다는 것을 알 수 있다. 이러한 엔트리들은 이미 처리되고 링크드 리스트에서 제거된 명령들을 나타낼 수 있다(명령들(410-1 내지 410-3) 주위에 점선들로 도시됨.). 본 개시의 일부 실시예들에서, 이러한 엔트리들은 할당 해제되고 도 1의 메모리(115)로 반환될 수 있다(이러한 할당 해제는, 도 1의 메모리(115)에서 가비지 컬렉션이 수행될 수 있다면, 비록 그 구현이 기술적으로 요구되지 않더라도, 훌륭한 프로그래밍 관행으로 간주될 수 있다.). 그러나 링크드 리스트 “내에” 남겨진다면, 명령들(410-1 내지 410-3)은 비록 액세스가 가능하지 않더라도 기술적으로 여전히 링크드 리스트의 일부로 간주될 수 있다(이들 명령들(410-1 내지 410-3) 중 어느 것에 대해서도 외부 포인터가 없기 때문에, 도 1의 프로세서(110)나 도 1의 스토리지 장치(120)도 명령들(410-1 내지 410-3)을 찾고 액세스할 수는 없다.).
도 6a에 도시된 바와 같은 원형 큐는 도 4의 서브미션 큐들(415)을 관리하는 방법에 대한 훌륭한 추상화(abstraction)를 나타낼 수 있다. 그러나 도 6a에 도시된 바와 같은 원형 큐는 원형 큐에 저장될 수 있는 소정의 수의 명령들(410)을 가질 수 있다는 사실과 별도로, 실제로 원형 큐는 구현하는 것이 더 어려울 수 있다. 일반적으로, 메모리의 주소들은 순차적이고, 한쪽 끝에는 “가장 낮은” 또는 “가장 작은” 주소가 있고, 다른쪽 끝에는 “가장 높은” 또는 “가장 큰” 주소가 있다. 따라서 도 6a에 도시된 것과 같은 진정한 원형 큐는, 몇 가지 변경들 없이 구현하기에는 실용적이지 않을 수 있다.
도 6b에 도시된 링크드 리스트를 이용하는 것의 이점은 (데이터 구조(605)가 이용할 수 있는 메모리 이외에는) 데이터 구조(605)의 명령들의 수에 상한(upper bound)이 없다는 것이다. 그러나 링크드 리스트의 관리는 도 6a에 도시된 원형 큐의 관리보다 더 복잡할 수 있다. 어떤 것이 링크드 리스트를 인터럽트해야만하는 경우, 데이터가 손실될 수 있다. 예를 들어, 어떤 프로세스가 실수로 명령(410-5)을 다른 데이터로 덮어쓴다면(특히 명령(410-6)에 대한 포인터를 덮어쓸 수 있다.), 도 1의 스토리지 장치(120)는 명령들(410-5 내지 410-7)을 액세스하는데 이용되지 못할 수 있다(테일 포인터(425)가 여전히 명령(410-8)을 가리킬 수 있기 때문에 명령(410-8)은 적어도 검색될 수는 있다.). 링크드 리스트가 어느 방향으로든 가로질러 갈 수 있도록(traverse) 링크드 리스트를 수정하는 방법이 있지만, 이러한 수정들은 명령들(410)에 더 많은 데이터를 저장하는 것을 수반할 수 있다. 이러한 수정들은 링크드 리스트에서 명령들(410)을 추가하거나 제거하는데 더 많은 동작들이 수반된다는 것을 의미할 수 있다. 또한, 명령들(410)에 대해 메모리를 할당하거나 할당해제하는 것에는 약간의 추가 시간이 소비될 수 있는 반면, 미리 고정된 데이터 구조에서는 메모리를 할당하거나 할당해제하는 것에 시간을 소비하지 않을 수 있다.
도 6c는 도 4의 서브미션 큐들(415)을 구현하는데 이용될 수 있는 다른 데이터 구조(605)를 나타낸다. 도 6c에서, 데이터 구조(605)는 어레이(또는 이와 동등한 것)로서 구현될 수 있다. 어레이의 각 요소는 명령(410)을 저장하는데 이용될 수 있다. 헤드 포인터(610) 및 테일 포인터(425)는 스토리지 장치(120)가 검색하기 위해 대기 중인 명령들(410)의 헤드 및 테일을 가리킬 수 있다.
도 6c의 어레이가 원형으로 보이지는 않지만, 어레이는 원형 큐처럼 이용될 수 있다. 예를 들어, 테일 포인터(425)는 명령(410-8)을 가리키는 것으로 도시된다. 도 1의 프로세서(110)가 어레이에 다른 명령을 추가할 준비가 된 경우, 해당 명령은 명령(410-1)으로서 추가될 수 있다. 즉, 어레이는 한쪽 끝에서 다른쪽 끝으로 래핑되어(wraps) 원형 큐처럼 기능한다.
어레이가 원형 큐처럼 기능하도록 하기 위해, 도 1의 프로세서(110) 및/또는 도 1의 스토리지 장치(120)는 포인터가 현재 어레이의 마지막 엔트리를 가리키고 있는 시점을 추적하고, 포인터들을 이동할 때 어레이의 첫 번째 엔트리의 주소로 포인터를 업데이트할 수 있다. 그러나 다른 방법도 있다. 어레이의 각 요소는 인덱스들(615)과 같은 인덱스를 가질 수 있다. 특정 요소의 주소를 저장하는 대신에, 헤드 포인터(610)와 테일 포인터(425)는 요소들을 식별하는 인덱스들을 저장할 수 있고, 대신에 인덱스들(615)을 이용하여 명령들(410)에 액세스할 수 있다. 또한, 헤드 포인터(610) 또는 테일 포인터(425)가 현재 명령(410-8)(어레이의 마지막 요소)에 대한 인덱스를 갖는지를 확인하기 위한 테스트를 수행하는 대신, 헤드 포인터(610) 또는 테일 포인터(425)는 그 값을 증가시킨 다음, 어레이의 요소들의 수에 대한 모듈로(modulo) 결과를 취할 수 있다. 예를 들어, 인덱스 값 ‘7’을 저장할 수 있는 테일 포인터(425)를 고려한다. 어레이가 총 8개의 요소들을 포함함에 따라, 새로운 요소가 추가되는 경우, 테일 포인터(425)는 ‘1’씩 증가될 수 있고(값 ‘8’까지), 그 결과에 대해 모듈로 ‘8’을 취할 수 있다(값 ‘0’이 됨.). 어레이의 크기가 2의 거듭제곱인 경우, 모듈로 연산은 값의 고차(higher order) 비트들을 마스킹(masking)하여 수행될 수 있다. 예를 들어, 2진수 ‘7’은 ‘0000 0111’로서 표현될 수 있다. ‘8’로 증가하면, 이진 표현은 ‘0000 1000’이 될 수 있다. 5개의 고차 비트들을 마스킹하면 ‘0000 0000’ 즉 ‘0’이 되며, 이는 배열의 첫 번째 요소를 나타낼 수 있다.
상기 논의는 도 4의 서브미션 큐들(415)을 나타내는데 상이한 데이터 구조들(605)이 어떻게 이용될 수 있는지에 초점을 맞춘다. 다른 데이터 구조들 또한 이용될 수 있다. 또한, 유사한 데이터 구조들이 다른 목적들 예를 들어, 타임스탬프들에 관한 정보를 저장하기 위해 이용될 수 있다. 도 7은 이것이 어떻게 수행될 수 있는지를 예시한다.
도 7에서, 서브미션 큐(415)가 도시되고, 이는 다른 가능한 데이터 구조들뿐만 아니라 상술한 도 6a 내지 도 6c의 데이터 구조(605) 중 임의의 것을 이용할 수 있다. 이러한 논의를 위해, 서브미션 큐(415)는 도 6c에 도시된 바와 같은 어레이를 이용하는 것으로 가정할 수 있다. 본 개시의 실시예들은 타임스탬프 정보를 추적하기 위해 제2 데이터 구조를 이용할 수 있다. 이러한 제2 데이터 구조는 링크드 리스트(705)라 지칭될 수 있다. 상기 제2 데이터 구조는 (위의 도 6b에 도시된 것과 같은) 링크드 리스트를 이용하는 것으로 설명되지만, 본 개시의 실시예들은 도 6a에 도시된 것과 같은 원형 큐, 도 6c에 도시된 것과 같은 어레이 또는 필수 정보(requisite information)를 저장할 수 있는 임의의 대체 데이터 구조를 이용할 수 있다. 그리고 도 7은 링크드 리스트(705)가 5개의 엔트리들(710-1 내지 710-5)(이는 통칭하여 엔트리들(710)로서 지칭될 수 있음.)을 포함하는 것으로 도시되어 있으나, 본 개시의 실시예들은 링크드 리스트(705)에 임의의 수(‘0’ 이상)의 엔트리들을 포함할 수 있다. 본 개시의 일부 실시예들에서, 링크드 리스트(705)의 엔트리들(710)의 수는 실행을 대기하고 있는 명령들(410)의 수와 동일할 것으로 예상될 수 있고, 본 개시의 다른 실시예들에서, 링크드 리스트(705)의 엔트리들(710)의 수는 실행을 대기하고 있는 명령들(410)의 수와 상이할 수 있다.
도 1의 스토리지 장치(120)가 도 1의 프로세서(110)로부터 명령(410)이 실행을 위해 이용가능하다는 통지를 수신한 경우(도 4의 동작(420)), 도 1의 스토리지 장치(120)는 또한 (엔트리(710-5)와 같은) 엔트리를 링크드 리스트(705)에 추가할 수 있다. 엔트리(710-5)는 타임스탬프(715)를 저장할 수 있다. 타임스탬프(715)는 도 1의 스토리지 장치(120)가 도 1의 프로세서(110)로부터 명령(410-8)이 실행을 위해 이용가능하다는 통지를 수신하는 경우에 생성되는 타임스탬프일 수 있다. 이러한 방식으로 도 1의 스토리지 장치(120)는 도 1의 프로세서(110)로부터 명령(410-8)이 수신된 시점을 추적할 수 있고, 이는 명령(410-8)이 서브미션 큐(415)에서 대기하고 있던 시간이 명령(410-8)의 에이지를 계산하는 경우에 고려될 수 있다는 것을 의미한다.
엔트리(710-5)는 또한 명령(410-8)과 연관될 수 있다. 엔트리(710-5)가 명령(410-8)과 연관될 수 있는 다양한 방법들이 있다. 본 개시의 일부 실시예들에서, 엔트리(710-5)는 명령(410-8)에 대한 포인터(720)를 포함할 수 있다. 포인터(720)는 명령(410-8)이 저장되는, 도 1의 메모리(115)의 주소를 저장할 수 있다. 선택적으로, 서브미션 큐(415)가 (도 6c의 어레이 데이터 구조(605)와 같이, 데이터 구조 내의 요소들이 도 6b의 링크드 리스트 데이터 구조(605)와 같이, 추가되고 제거될 수 있는 동적(dynamic) 데이터 구조와 비교될 수 있는) 정적(static)인 구조를 이용하여 구현되는 경우, 포인터(720)는 도 6c의 인덱스(615)를 서브미션 큐(415)에 저장할 수도 있다. 도 6c의 인덱스(615)는 메모리 주소보다 적은 바이트들을 필요로 할 수 있기 때문에, 도 6c의 인덱스(615)를 저장하는 것은 엔트리(710-5)에 필요한 스토리지의 양을 감소시킬 수 있다.
선택적으로, 엔트리(710-5)는 카운트 또는 오프셋을 포함할 수 있다. 카운트는 엔트리(710-5)와 연관된 서브미션 큐(415)에 있는 명령들(410)의 수를 나타낼 수 있다. 오프셋은 엔트리(710-5)와 연관된 마지막 명령까지의 거리를 나타낼 수 있다. 도 7에서, 엔트리(710-5)는 카운트 ‘1’ 또는 오프셋 ‘0’을 가질 수 있다(아래의 도 8을 참조하여 더 논의되는 바와 같이, 엔트리(710)와 연관된 명령들(410)의 수는 ‘1’보다 클 수 있다.).
상기 카운트 또는 오프셋은 서브미션 큐(415)의 특정 명령(410)에 상대적일 수 있다. 예를 들어, 엔트리(710-5)는 포인터(720)(또는 도 6c의 인덱스(615))와 카운트 및 오프셋을 모두 포함할 수 있고, 이 경우 명령(410-8)은 엔트리(710-5)와 연관된 것으로 구체적으로 식별된다. 선택적으로, 상기 카운트 또는 오프셋은 엔트리(710-5)와 연관된 서브미션 큐(415)의 “첫번째” 명령(410)에 대해 상대적일 수 있지만, 그 명령(410)은 직접적으로 식별되지 않을 수 있고, 헤드 포인터(710)와 관련하여 결정될 수 있다. 즉, 엔트리(710-5)와 연관된 명령(들)은 헤드 포인터(725)가 엔트리(710-5)를 가리킬 때까지 엔트리(710-5)에 의해 고유하게 식별되지 않을 수 있다. 그 시점에서, 헤드 포인터(610)는 명령(410-8)을 가리킬 수 있고, 상기 카운트 또는 오프셋은 명령(410-8)과 관련하여 결정될 수 있다.
링크드 리스트(705)가 바로 그 링크드 리스트일 수 있으므로, 링크드 리스트(705)는 헤드 포인터(725)와 테일 포인터(730)를 포함할 수 있다. 헤드 포인터(725) 및 테일 포인터(730)는 서브미션 큐(415)의 헤드 포인터(610) 및 테일 포인터(425)와 유사하게 기능할 수 있다. 그러나 도 1의 프로세서(110)가 링크드 리스트(705)에 액세스할 필요가 없을 수 있으므로, 헤드 포인터(725) 및 테일 포인터(730)는 도 1의 스토리지 장치(120)에서 지역적으로(locally) 조정될 수 있고, 원격으로 액세스되지 않을 수 있다.
도 1의 스토리지 장치(120)가 명령(410)을 실행할 준비가 되는 경우, 도 1의 스토리지 장치(120)는 헤드 포인터(725)에 액세스하여 다음에 이용할 엔트리(710)를 결정할 수 있다. 서브미션 큐(415)의 명령들(410)과 링크드 리스트(705)의 엔트리들(710) 사이에 일대일 대응이 존재하는 본 개시의 실시예들에서, 헤드 포인터(725)가 가리키는 엔트리(710)는 서브미션 큐(415)의 다음 명령(410)에 대응할 수 있다. 그 다음에 도 1의 스토리지 장치(120)는 명령(410)을 실행하고 임의의 결과를 반환할 수 있다. 명령(410)이 완료되면, 도 1의 스토리지 장치(120)는 타임스탬프(715)를 이용하고 이를 현재의 타임스탬프와 비교하여 명령(410)의 에이지를 결정할 수 있다. 적절한 경우, 스토리지 장치(120)는 명령(410)의 에이지를 도 1의 호스트(105)로 반환할 수 있다. 마지막으로, 도 1의 스토리지 장치(120)는 엔트리(710)를 해제하고 링크드 리스트(705)로의 헤드 포인터(725)를 업데이트할 수 있다(서브미션 큐(415)로의 헤드 포인터(610)는, 본 개시의 실시예에 따른, 명령(410)의 실행이 완료되는 시점 또는 도 1의 스토리지 장치(120)가 서브미션 큐(415)에서 명령(410)을 액세스하는 시점 중 하나에서, 유사하게 업데이트될 수 있다.).
서브미션 큐(415)가 단지 하나만 존재하는 본 개시의 실시예들에서, 단지 하나의 링크드 리스트(705)만이 존재할 수 있다. 그러나 하나 이상의 서브미션 큐들(415)이 존재할 수 있는 본 개시의 실시예들에서, 도 1의 스토리지 장치(120)는 (상이한 서브미션 큐들에서 상이한 명령들에 대한 타임스탬프들을 추적할 수 있도록 하기 위해) 각 서브미션 큐(415)와 연관될 수 있는 별도의 링크드 리스트(705)를 필요로 할 수 있다. 그러나 다수의 서브미션 큐들이 지원되는 경우 문제가 있을 수 있다.
예를 들어, NVMe 표준을 고려한다. NVMe 표준은 최대 65,536 개(216 개, 이는 64K 로 나타낼 수 있음.)의 서브미션 큐들을 지원하고, 각 서브미션 큐는 65,537 개의 명령들을 저장할 수 있다. 이는 도 1의 스토리지 장치(120)에 의한 실행을 대기하는 4,294,967,296 (232) 개의 명령들이 있을 수 있음을 의미한다.
도 1의 호스트(105)에 있는 도 1의 메모리(115)는 서브미션 큐들에 이렇게 많은 명령들을 저장하기에 충분히 클 수 있다. 그러나 도 1의 스토리지 장치(120) 내의 도 3의 메모리(340)는 도 1의 메모리(115)만큼 크지 않을 수 있다. 도 1의 스토리지 장치(120)는 명령들을 지역적으로 처리하기위해 충분한 도 3의 메모리(340)를 포함할 수 있다. 그 사용량을 넘어서, 도 1의 스토리지 장치(120)가 도 3의 메모리(340)를 추가로 포함하는 것은 불필요하게 비용이 많이 들 수 있다. 따라서 제조자는 스토리지 장치(120)에 포함된 도 3의 메모리(340)의 양을 최소화하기 위해 노력할 수 있다. 예를 들어, 도 3의 메모리(340)는 약 32 MB의 DRAM, 약 2 MB의 SRAM 또는 대략 이러한 크기들의 DRAM 및 SRAM의 일부 조합일 수 있다(본 개시의 실시예들은, 물론 이러한 양들보다 적거나 많은 다른 양의 DRAM 또는 SRAM을 포함할 수 있다.). 그러나 링크드 리스트(705)에 저장된 정보는 도 1의 프로세서(110)와 관련이 없을 수 있기 때문에, 링크드 리스트(705)는 (도 1의 호스트(105)의 도 1의 메모리(115) 대신에) 도 3의 메모리에 저장될 수 있다. 메모리(340)가 약 40억 개의 엔트리들(710)을 지원하기에 충분히 크지 않은 경우, 엔트리들(710)은 다양한 서브미션 큐들(415)에 대한 링크드 리스트들(705) 사이에서 공유되어야할 수 있다. 예를 들어, 메모리(340)는 도 1의 스토리지 장치(120)에 의한 실행을 대기하고 있을 수 있는 가능한 최대 명령들의 수보다 훨씬 적은 1024 (210) 개의 엔트리들(710)만을 포함할 정도로 클 수 있다.
본 개시의 실시예들은 엔트리들(710)을 공유함으로써 이러한 고려사항을 해결할 수 있다. 즉, 이용하지 않을 때, 엔트리들(710)은 엔트리 풀(735)에 유지될 수 있다. 도 1의 스토리지 장치(120)가 도 1의 프로세서(110)로부터 새로운 명령(410)이 이용가능하다는 통지를 수신한 경우, 도 1의 스토리지 장치(120)는 엔트리 풀(735)로부터 엔트리(710)를 선택할 수 있다. 그 다음에 이러한 엔트리(710)는 타임스탬프(715) 및 명령(410)에 대한 포인터(720)를 저장하기 위해 링크드 리스트(705)에 추가될 수 있다. 본 개시의 실시예들은 서브미션 큐(415)가 단지 한 개만 존재하는 실시예들(따라서 링크드 리스트(705)가 단지 한 개만 존재할 수 있음.)에서도 엔트리 풀(735)의 이용을 지원할 수 있음을 유의한다.
도 1의 스토리지 장치(120)는 엔트리 풀(735)로부터 엔트리(710)를 선택하기 위해 임의의 바람직한 기술을 이용할 수 있다. 본 개시의 일부 실시예들에서, 도 1의 스토리지 장치(120)는 각 엔트리(710)를 통해, 현재 엔트리 풀(735)에 있는 엔트리(710), 즉 링크드 리스트(705)에서 현재 이용되지 않는 엔트리(710)를 찾을 수 있다. 본 개시의 다른 실시예들에서, 엔트리 풀(735)은 헤드 포인터 및 테일 포인터를 갖는 엔트리들(710)의 링크드 리스트로서 구현될 수 있고, 엔트리들(710)은 엔트리(710)가 상기 도 6b에 도시된 링크드 리스트 데이터 구조에서 제거될 수 있는 방법과 유사하게 엔트리 풀(735)로부터 추가되거나 제거될 수 있다. 본 개시의 또 다른 실시예들에서, 엔트리 풀(735)은 스택 또는 후입선출(last in, first out)(LIFO) 큐로 구현될 수 있다. 스택으로 구현되는 경우, 포인터는 스택의 상단(top)을 가리킬 수 있고, 스택 내의 각 엔트리(710)는 다음 엔트리(710)를 가리킬 수 있다. 엔트리(710)를 제거하기 위해, 스택의 상단에 있는 엔트리(710)가 선택될 수 있고, 스택의 상단에 대한 포인터는 (상단 엔트리(710)로부터 다음 엔트리(710)에 대한 포인터에 기초하여) 스택의 다음 엔트리(710)를 가리키도록 조정될 수 있다. 엔트리(710)를 스택으로 반환하기 위해, 반환된 엔트리(710)는 이전에 스택의 상단에 있던 엔트리(710)를 가리키도록 설정될 수 있고, 스택의 상단에 대한 포인터는 반환된 엔트리(710)를 가리키도록 설정될 수 있다. 본 개시의 실시예들은 또한 엔트리 풀(735)로부터 엔트리(710)를 선택하기 위한 다른 방법들을 포함할 수도 있다.
엔트리 풀(735)에서 엔트리들(710)을 유지함으로써, 도 1의 스토리지 장치(120)는 링크드 리스트(705)에 추가될 수 있는 엔트리(710)를 쉽게 찾을 수 있다. 또한, 하나의 서브미션 큐(415)에 상대적으로 많은 수의 명령들(410)이 준비되어 있으나 다른 링크드 리스트(705)에는 준비되어 있지 않은 경우, 첫번째 링크드 리스트(705)는 해당 링크드 리스트(705)가 그것의 “할당된” 엔트리들(710)을 모두 소진할 수도 있다는 우려 없이 더 많은 엔트리들을 이용할 수 있다. 또한, 엔트리 풀(735)에서 미사용 엔트리들(unused entries)(710)을 유지함으로써, 도 1의 스토리지 장치(120)는 링크드 리스트(705)에 엔트리들을 추가하기 위해 메모리를 할당 및/또는 할당해제하는 (상대적으로 느린) 동작들을 피할 수 있고, 또한 (엔트리들을(710)을 위한, 또는 명령들(410) 또는 백그라운드 동작들을 실행하는 것과 같은 도 1의 스토리지 장치(120)의 다른 동작들을 위한) 도 3의 메모리(340)의 이용으로 인해 도 3의 메모리(340)가 고갈되어 새로운 엔트리들(710)이 할당될 수 있는 메모리가 부족할 우려를 피할 수도 있다.
그러나 엔트리 풀(735)의 엔트리들(710)이 (특정 링크드 리스트(705)에 전용적인 것이 아니라) 임의의 링크드 리스트(705)에 이용될 수 있기 때문에, 엔트리들(710)에 대한 일부 수정들이 이루어질 수 있고, 따라서 엔트리들(710)이 임의의 링크드 리스트(705)에 이용될 수 있다. 먼저, 링크드 리스트(705)로서의 역할을 하는 (도 6c에 도시된 어레이와 유사함) 전용 어레이를 가지는 대신, 엔트리 풀(735)이 어레이일 수 있고, 링크드 리스트(705)는 도 6b의 링크드 리스트 데이터 구조에 더 가깝게 동작할 수 있다는 것에 유의한다. 즉, 링크드 리스트(705)는 임의의 순서로 존재할 수 있고 연속적이지 않을 수 있는 다양한 인덱스들(740)을 갖는 엔트리들(710)을 포함할 수 있다. 예를 들어, (헤드 포인터(725)에 의해 가리켜지는) 엔트리(710-1)는 엔트리(710-6)(엔트리 풀(735)에서 인덱스 ‘0’을 갖는 엔트리)가 아니고 엔트리(710-2)(엔트리 풀(735)에서 인덱스 ‘4’를 갖고, 서브미션 큐(415)의 대응하는 명령(410)에 대한 인덱스에 대응할 수도 있는 엔트리)도 아니다. 링크드 리스트(705)의 두번째 엔트리인 엔트리(710-2)는 엔트리 풀(735)에서 인덱스 ‘0’을 가지고, 그 후에 엔트리 풀(735)에서 인덱스 ‘6’을 갖는 엔트리(710-3)로 점프한다. 링크드 리스트(705)에서 엔트리들(710)의 인덱스들에 순서가 없는 것은, 예를 들어, 다른 엔트리들(710)(일반적으로 링크드 리스트(705) 끝의 엔트리 다음의 인덱스를 가질 수 있음.)이 다른 서브미션 큐(415)에 대한 다른 링크드 리스트(705)에서 이용되었을 수 있기 때문에 발생할 수 있다. 따라서 링크드 리스트(705) 내에서 엔트리들(710)을 “순서대로” 유지하기 위해, 엔트리들(710)은 또한 링크드 리스트(705)의 다음 엔트리(710)에 대한 포인터(745)를 포함할 수 있다. 따라서 예를 들어, 엔트리(710-1)는 엔트리(710-2)에 대한 (인덱스 “4”와 같은) 포인터를 포함할 수 있고, 엔트리(710-2)는 엔트리(710-3) 등에 대한 (인덱스 “6”과 같은) 포인터를 포함할 수 있다. 이러한 방식으로, 링크드 리스트(705)는 필요에 따라 헤드로부터 테일로 가로질러 갈 수 있다(traverse).
명령(410)의 에이지를 계산할 때까지(이는 타임스탬프(715)에 기초하고, 명령(410)이 실행을 완료한 후에 결정될 수 있음.) 엔트리들(710)을 유지하는 것이 간편하지만, 이러한 선택은 엔트리들(710)이 명령(410)이 실행을 완료할 때까지 엔트리들(710)이 링크드 리스트(705)에 유지된다는 것을 의미한다. 엔트리들(710)이 엔트리 풀(735)을 이용하여 링크드 리스트들(705) 사이에서 공유되는 경우, 엔트리들(710)을 엔트리 풀(735)로 더 빨리 반환하는 것이 유용할 수 있고, 재이용될 수 있다. 본 개시의 일부 실시예들에서, 도 1의 스토리지 장치(120)는 엔트리(710)로부터 타임스탬프(715)를 복사하여 지역적으로(locally) 어딘가에 저장함으로써 엔트리(710)를 보다 신속하게 엔트리 풀(735)로 반환할 수 있다(이는 엔트리들(710)이 보다 신속하게 재이용될 수 있음을 의미한다.). 본 개시의 그러한 실시예들에서, 엔트리들(710)은 명령(410)이 그 실행을 완료하는 시점이 아니라, 도 1의 스토리지 장치(120)가 서브미션 큐(415)로부터 명령(410)에 액세스하는 시점과 거의 동시에 엔트리 풀(735)로 반환될 수 있다.
링크드 리스트(705)에서 현재 이용 중인 엔트리들을 관리하기 위한 데이터 구조는 도 7에 도시되어 있지 않다(어느 엔트리들은 엔트리 풀(735)에서 점선들로 도시됨.). 별도의 데이터 구조는 엔트리 풀(735)에서 어느 엔트리들(710)이 현재 이용 중인지를 추적하기 위해 이용될 수 있다. 선택적으로, 포인터(745)는 엔트리 풀(735)에서 어느 엔트리들(710)이 현재 이용 중인지를 식별하기 위해 이용될 수 있다. 현재 이용 중이 아닌 엔트리들(710)(따라서 엔트리 풀(735)로부터 이용가능한 엔트리들)은 특별한 값(예를 들어, 널 포인터와 같은 존재하지 않는 주소, 또는 엔트리 풀(735)로 유효한 인덱스를 나타내지 않는 ‘-1’과 같은 인덱스)을 이용하여 그러한 엔트리들(710)이 이용 중이 아님을 식별할 수 있다. 새로운 엔트리(710)가 링크드 리스트(705)에 필요한 경우, 도 1의 스토리지 장치(120)는 엔트리 풀(735)에서 현재 이용 중이 아닌 엔트리(710)를 식별하고, 그 엔트리를 링크드 리스트(705)의 다음 엔트리로 이용할 수 있다. 물론, 링크드 리스트(705)에 엔트리를 추가하는 경우 및 엔트리 풀(735)로 엔트리를 반환하는 경우 모두 데이터 구조들의 적절한 관리가 중요하다. 링크드 리스트(705)로 엔트리를 추가하는 경우 포인터들이 적절하게 초기화될 수 있고(또는 다른 데이터 구조가 수정된 엔트리에 대응하는 식별자를 가질 수 있다.), 엔트리가 엔트리 풀(735)로 반환되는 경우 특별한 값으로 리셋될 수 있다(또는 다른 데이터 구조가 엔트리 리셋에 대응하는 식별자를 가질 수 있다.).
엔트리(710-5)는 또한 마지막 도어벨 시간(750) 및 도어벨 이벤트들의 수(755)를 포함하는 것으로 도시된다. 이러한 필드들은 선택적이고(이러한 필드들이 점선들로 표시되는 이유를 설명함.), 본 개시의 일부 실시예들에서 유용할 수 있다. 마지막 도어벨 시간(750)은 도 1의 스토리지 장치(120)가 도 1의 프로세서(110)로부터 명령(410)이 서브미션 큐(415)에서 준비되었다는 통지를 수신한 마지막 시간을 저장할 수 있고, 도어벨 이벤트들의 수(755)는 얼마나 많은 도어벨 이벤트들이 발생했는지를 추적할 수 있다. 이러한 필드들은 아래의 도 8을 참조하여 더 논의된다.
도 7에서, 서브미션 큐(415)의 명령들(410)과 링크드 리스트(705)의 엔트리들(710) 사이에서 일대일 대응이 있을 수 있고, 포인터(720)가 암시될 수 있다. 즉, 명령들(410)과 엔트리들(710) 사이의 대응은 포인터(720)를 이용하지 않고도 특정 명령(410)을 식별하기에 충분할 수 있다.
상술한 본 개시의 일부 실시예들에서, 서브미션 큐(415)의 명령들(410)과 링크드 리스트(705)의 엔트리들(710) 사이에 일대일 대응이 있을 수 있다. 그러나 상술한 바와 같이, 서브미션 큐(415) 내의 명령들(410)의 수에 따라, 도 1의 스토리지 장치(120)는 일대일 대응을 위한 충분한 엔트리들(710)을 저장하기 위한 도 3의 메모리(340)를 충분히 가지지 않을 수 있다. 엔트리들(710)을 풀링하고(pooling) 링크드 리스트들(705)에 걸쳐 엔트리들(710)을 공유하는 것 외에도, 본 개시의 실시예들은 또한 링크드 리스트들(705)에서 이용되는 엔트리들(710)의 수를 감소시키는 다른 정책들을 지원할 수 있다. 도 8은 본 개시의 그러한 일부 실시예들을 도시한다.
도 8은 본 개시의 다른 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 7의 엔트리들을 이용하여 도 4의 명령들(410)에 대한 도 7의 타임스탬프들(715)을 추적할 수 있는 방법을 도시한다. 도 8에서, 엔트리들(710-1 및 710-5)은 개별 명령들과 각각 연관될 수 있다. 엔트리(710-1)는 명령(410-4)과 연관될 수 있고, 엔트리(710-5)는 명령(410-8)과 연관될 수 있다. 그러나 도 8에서, 엔트리(710-4)는 명령들(410-5 내지 410-7)과 연관될 수 있다. 단일 엔트리(710)를 다수의 명령들(410)과 연관시킴으로써, 이용 중인 엔트리들(710)의 수를 줄일 수 있다.
단일 엔트리(710)가 하나 이상의 명령(410)과 연관될 수 있는 방법들은 여러가지가 있다. 본 개시의 일부 실시예들에서, 도 1의 프로세서(110)는 다수의 명령들(410)을 서브미션 큐(415)에 추가하고 모든 명령들에 대해 도어벨(425)을 한번만 울릴 수 있다. 이러한 상황은 예를 들어, 도 1의 프로세서(110)가 다수의 명령들(410)을 도 1의 프로세서(110)에서 실행되는 다양한 프로세스들(또는 단일 프로세스)로부터 다수의 명령들(410)을 수신하는 경우, 또는 도 1의 프로세서(110)에서 실행 중인 프로세서에 의해 지정된 특정 명령어가 도 1의 스토리지 장치(120)에 의해 수행되는 다수의 명령들을 포함하는 경우에 발생할 수 있다. 특정 예로서, 애플리케이션은 일부 데이터가 도 1의 스토리지 장치(120)에 쓰여지도록 요청하고, 도 3의 가속기(335)는 그 데이터를 처리하고, 그 다음에 도 1의 스토리지 장치(120)는 호스트(105)로 그 결과들을 반환할 수 있다. 이러한 명령어들은 두개 또는 세개(또는 그 이상)의 상이한 명령들(410)을 포함할 수 있다. 도 1의 프로세서(110)는 이러한 명령들(410)을 거의 동시에 서브미션 큐(415)에 로드하고 도어벨(425)을 한번 울려 실행가능한 명령들(410)이 있음을 나타낼 수 있다(이러한 예는 도 1의 프로세서(110)를 지원하는 본 개시의 실시예들이 서브미션 큐(415)에 한번에 추가된 다수의 명령들(410)에 대해 도어벨(425)을 울린다고 가정한다. 서브미션 큐(415)에 명령(410)을 추가할 때마다 도어벨(425)을 자체적으로 울릴 필요가 있는 본 개시의 실시예들에서, 도어벨(425)을 울리는 횟수를 감소시키는 것이 불가능할 수 있고, 이하에서 더 논의되는 바와 같이, 도 1의 스토리지 장치(120)는 다른 접근법들을 이용하여 이용되는 엔트리들(710)의 수를 감소시킬 수 있다.).
단일 엔트리(710)가 하나 이상의 명령(410)과 연관될 수 있는 다른 방법은, 도 1의 스토리지 장치(120)가 도어벨(425)의 울림에 응답하는 경우에만 엔트리(710)를 설정하는 경우일 수 있다. 다시 말해서, 도 1의 프로세서(110)는 도 1의 스토리지 장치(120)가 링크드 리스트(705)에 엔트리들(710)을 추가하기 전에 도어벨(425)을 여러 번 울릴 수 있다. 이러한 상황은 예를 들어, 도 1의 프로세서(110)가 도어벨(425)을 빠르게 연속적으로 여러 번 울리는 경우, 및/또는 도 1의 스토리지 장치(120)가 도어벨(425)에 대한 응답을 일시적으로 지연시키는 다른 작업들을 수행하느라 충분히 바쁜 경우에 발생할 수 있다.
단일 엔트리(710)가 하나 이상의 명령(410)과 연관될 수 있는 또 다른 방법은 도 1의 스토리지 장치(120)가 시간 윈도우들(time windows)을 이용하는 경우일 수 있다. 즉, 엔트리(710)를 링크드 리스트(705)에 추가함으로써 도어벨(425)의 각 울림(ring)에 응답하는 대신, 도 1의 스토리지 장치(120)는 타이머를 작동시킬 수 있다. 임의의 바람직한 기간 예를 들어, ‘1’ 밀리초(ms)가 될 수 있는 시간 윈도우 동안, 도어벨(425)의 모든 울림들은 서로 그룹화되고 도어벨(425)의 하나의 울림으로 취급될 수 있다. 타이머가 종료되는 경우 즉, 시간 윈도우가 닫히는 경우, 도 1의 스토리지 장치(120)는 링크드 리스트(705)에 단일 엔트리(710)를 추가할 수 있고, 이는 시간 윈도우 동안 서브미션 큐(415)에 추가될 수 있는 모든 명령들(410)과 연관될 수 있다(아마도 더 정확하게는, 단일 엔트리(710)는, 시간 윈도우 동안 도 1의 프로세서(110)가 도어벨(425)을 울린(rang) 모든 명령들(410)과 연관될 수 있을 것이다.).
시간 윈도우는 임의의 바람직한 접근법을 이용하여 시작될 수 있다. 본 개시의 일부 실시예들에서, 시간 윈도우는 일정한 간격들로 시작될 수 있다. 예를 들어, 하나의 시간 윈도우가 종료되면, 다른 시간 윈도우가 시작될 수 있다. 본 개시의 이러한 실시예들에서, 도 1의 스토리지 장치(120)는 도 1의 프로세서(110)가 시간 윈도우 동안 적어도 한번 도어벨(425)을 울렸는지를 확인할 수 있다. 그렇지 않은 경우, 엔트리(710)를 링크드 리스트(705)에 추가할 필요가 없다. 본 개시의 다른 실시예들에서, 하나의 시간 윈도우가 종료한 후에, 도 1의 스토리지 장치(120)는 다음의 시간 윈도우가 시작되기 전 도 1의 프로세서(110)가 도어벨(425)을 울릴 때까지 대기할 수 있다. 본 개시의 그러한 실시예들에서, 시간 윈도우 동안 적어도 하나의 도어벨 이벤트가 존재해야 하고, 링크드 리스트(705)의 엔트리(710)와 연관된 명령(410)이 존재하는지를 확인할 필요는 없다.
상술한 바와 같이, 링크드 리스트(705)의 단일 엔트리(710)와 서브미션 큐(415)의 다수의 명령들(410) 사이의 연관을 나타내는 여러 방법들이 있다. 본 개시의 일부 실시예들에서, 엔트리(710)는 도 7의 다수의 포인터들(720)을 포함할 수 있고, 각 포인터는 엔트리(710)와 연관된 명령(410)을 가리킬 수 있다(도 7을 참조하여 상술한 바와 같이, 이러한 포인터들은 메모리 내의 주소들 또는 예를 들어, 도 6c의 인덱스들(615)을 이용하는 것과 같은 서브미션 큐(415)의 명령들(410)에 대한 다른 참조일 수 있다.). 본 개시의 다른 실시예들에서, 엔트리(710)는 엔트리(710)와 연관된 제1 명령(410)에 대한 포인터 및 엔트리(710)와 또한 연관된 다수의 명령들을 포함할 수 있다. 예를 들어, 엔트리(710-4)는 총 3개의 명령들이 엔트리(710-4)와 연관되어 있음을 나타내는 3개의 명령 카운트(command count)와 함께 명령(410-5)에 대한 포인터를 포함할 수 있다. 선택적으로, 엔트리(710-4)는 명령(410-5)에 대한 포인터 및 엔트리(710)와 연관된 마지막 명령(410)을 식별하는 오프셋을 포함할 수 있다. 예를 들어, 엔트리(710-4)는 명령(410-5)에 대한 포인터 및 두 개의 추가적인 명령들(410)(명령들(410-6 및 410-7))도 엔트리(710-4)와 연관되어 있음을 나타내는 오프셋 ‘2’를 포함할 수 있다. 본 개시의 또 다른 실시예들에서, 엔트리(710)는 단순히 엔트리(710)와 연관된 첫번째 명령(410)에 대한 포인터를 포함할 수 있다. 엔트리(710)와 연관된 제1 명령(410)이 처리를 위해 검색된 후에, 엔트리(710)의 도 7의 타임스탬프(715)는 다른 엔트리(710)와 연관된 서브미션 큐(415)의 명령(410)이 발견될 때까지 계속 이용될 수 있다. 유사하게, 엔트리(710)는 엔트리(710)와 연관된 마지막 명령(410)에 대한 포인터를 포함할 수 있다. 일단 그 명령(410)이 발견되면, 시스템은 다음 엔트리(710)에서 도 7의 타임스탬프(715)를 이용하기 시작할 수 있다. 엔트리들(710)에 저장된 정보의 양을 감소시킴으로써, 엔트리들(710)의 크기가 감소될 수 있고, 이는 도 3의 메모리(340)의 크기를 감소시킬 수 있다(또는 도 3의 메모리(340)에 더 많은 엔트리들(710)을 저장할 수 있다.).
본 개시의 다른 실시예들에서, 엔트리(710-5)는 서브미션 큐(415) 내의 특정 명령(410)에 대한 포인터 또는 인덱스를 포함하지 않고 카운트 또는 오프셋만을 포함할 수 있다. 본 개시의 그러한 실시예들에서, 엔트리(710)와 연관된 명령들(410)은 헤드 포인터(725)가 엔트리(710)를 가리키는 경우 결정될 수 있고, 헤드 포인터(610)가 현재 가리키는 명령을 포함할 수 있다. 엔트리(710)와 연관된 명령들(410)은 헤드 포인터(610)에 의존할 수 있기 때문에, 명령들(410)이 서브미션 큐(415)로부터 제거됨에 따라(즉, 헤드 포인터(610)가 서브미션 큐(415)를 따라 전진함에 따라) 카운트 또는 오프셋은 감소될 수 있고, 따라서 엔트리(710)는 다른 엔트리들(710)과 연관된 다른 명령들은 식별하지 않지만 엔트리(710)에 연관된 명령들(410)을 계속 식별할 수 있다.
본 개시의 나머지 부분에서, 적어도 엔트리들(710)과 연관된 명령들(410)을 식별하는 맥락에서, “참조”라는 용어는, 서브미션 큐(415)의 특정 명령(410)이 엔트리(710)와 관련되어 있음을 직접 또는 간접적으로 식별하는 어떤 방법이 있다는 것을 의미하도록 의도된다. 본 개시의 일부 실시예들에서, 이러한 참조는 직접적일 수 있고, 엔트리(710)는 도 7의 포인터(720)를 포함하는 엔트리(710) 또는 서브미션 큐(415) 내의 명령(410)의 도 6c의 인덱스(615)에 의하거나 임의의 다른 바람직한 직접 참조에 의해, 명령(410)이 엔트리(710)와 연관되어 있음을 구체적으로 식별할 수 있다. 본 개시의 일부 실시예들에서, 상기 참조는 간접적일 수 있고, 엔트리(710)는, 엔트리(710)로서 식별되는 명령(410)을 명시적으로 식별하지 않고도 명령(410)이 엔트리(710)와 연관되어 있다고 결론을 내리기에 충분한 정보를 포함할 수 있다. 예를 들어, 엔트리(710)는 서브미션 큐(415) 내의 명령(410)을 식별하는 도 7의 포인터(720)(또는 도 6c의 인덱스(615))를 포함할 수 있고, 다른 명령들(410) 또한 엔트리(710)와 연관될 수 있음을 나타낼 수 있는 명령 카운트 또는 오프셋 중 하나를 포함할 수 있다. 이러한 다른 명령들은, 엔트리(710)와 직접적으로 연관되지는 않지만, 여전히 엔트리(710)와 연관되는 것으로 간주될 수 있다. 또는, 명령(410)은 엔트리(710)가 링크드 리스트(705)의 헤드에 있고(즉, 헤드 포인터(725)에 의해 가리켜지고) 명령(410)이 헤드 포인터(610)에 의해 가리켜진 명령(410)에서 시작하여 엔트리(710)의 카운트 또는 오프셋만큼 계속되는 명령들의 세트에 포함되어 있다는 것에 기초하여 엔트리(710)와 연관될 수 있다. 또한, 도 7의 “포인터(720)”에 대한 임의의 언급은 도 7의 “포인터(720)” 또는 위에서 설명된 “참조”라는 용어에 대한 대안이 될 수 있는 형태들로서 대체가능한 것으로 이해될 수 있다.
도 7에 도시된 바와 같이, 엔트리(710)는 명령(410)에 대한 하나의 포인터(720)를 포함한다. 따라서 다수의 명령들(410)이 단일 엔트리(710)와 어떻게 연관될 수 있는지에 대한 의문이 제기될 수 있다. 엔트리(710)에 추가 포인터들을 추가하는 것이 가능하다. 예를 들어, 본 개시의 일부 실시예들에서, 엔트리(710)는 서브미션 큐(415)에서 명령들(410)에 대한 2개의 포인터들 즉, 엔트리(710)와 연관된 첫번째 명령(410)에 대한 하나의 포인터 및 엔트리(710)와 연관된 마지막 명령(410)에 대한 다른 포인터(예를 들어, 도 7의 포인터(720))를 포함할 수 있다. 암시적으로, 이러한 두개의 포인터들 사이의 서브미션 큐(415)에 있는 임의의 명령들(410) 또한 엔트리(710)와 연관될 수 있다. 그러나 본 개시의 그러한 실시예들은 엔트리들(710)의 크기를 증가시킬 수 있고, 이는 도 3의 메모리(340)에 의해 지원되는 엔트리들(710)의 수를 감소시킬 수 있다. 따라서 본 개시의 다른 실시예들은 마지막 명령(410)을 엔트리(710)와 연관시킬 수 있다. 그 다음에, 암시적으로, 현재와 이전 엔트리들(710) 사이의 임의의 명령들(410)(따라서 다른 엔트리들(710)과는 연관되지 않음)은 엔트리(710)와 연관될 것으로 간주된다. 이러한 선택은 도 8에서 엔트리(710-4)로부터 엔트리들(410-5 및 410-6)까지 점선들을 이용하여 도시되어 있다.
본 개시의 일부 실시예들에서, 엔트리(710)는 도 7의 도어벨 이벤트들(755)의 수를 포함할 수 있다. 도 7의 도어벨 이벤트들(755)의 수는 도 1의 프로세서(110)가 특정 시간 윈도우 동안 도어벨(425)을 울린 횟수의 카운트일 수 있다. 도어벨(425)이 울릴 때마다, 도 7의 도어벨 이벤트들(755)의 수가 증가될 수 있다(새로운 엔트리(410)가 링크드 리스트(705)에 추가되는 경우, 새로운 엔트리에 대한 도 7의 도어벨 이벤트들(755)의 수는 ‘0’으로 설정될 수 있다.). 이 정보는 시간 윈도우 동안 도어벨 이벤트들의 수가 오버플로우(overflow)를 유발하는 경우(예를 들어, 시간 윈도우 동안 너무 많은 도어벨 이벤트들이 발생하는 경우)에 유용할 수 있다.
본 개시의 일부 실시예들에서, 엔트리들(710)은 도 7의 마지막 도어벨 시간(750)을 포함할 수 있다. 도 7의 마지막 도어벨 시간(750)은 시간 윈도우 동안 도 1의 프로세서(110)가 도어벨(425)을 마지막으로(즉, 가장 최근에) 울린 타임스탬프일 수 있다. 예를 들어, 도 7의 마지막 도어벨 시간(750)은 시간 윈도우 동안 오버플로우(예를 들어, 도어벨 이벤트들의 수의 오버플로우)가 발생하는 경우 이용될 수 있다. 도 7의 마지막 도어벨 시간(750)은 임의의 문제들을 해결하는데 이용될 수 있는 추가 정보를 제공할 수 있다. 일부 실시예들에서, 도 7의 마지막 도어벨 시간(750)과 도 7의 타임스탬프(715)는 엔트리(710)의 상이한 필드들이 아니라 동일한 필드일 수 있다.
서브미션 큐(415)에 하나 이상의 명령들(410)이 있기 때문에, 명령들(410)은 서로 다른 시간들에서 서브미션 큐(410)에 추가되었을 수 있다. 예를 들어, 도 1의 프로세서(110)가 도 1의 스토리지 장치(120)가 링크드 리스트(705)에 엔트리(710)를 추가하기 전에 여러 번 도어벨(425)을 울리는 경우, 둘 이상의 명령들(410)이 다른 시간들에서 서브미션 큐(415)에 추가되었을 수 있고, 시간 윈도우가 종료한 후에 엔트리(710)가 링크드 리스트(705)에 추가된 것일 수도 있다. 본 개시의 이러한 실시예들에서, 엔트리(710)에 저장된 도 7의 타임스탬프(715)는 엔트리(710)와 연관된 하나 이상의 명령들(410)에 대하여 다소 부정확할 수 있다. 그러나 도 7의 타임스탬프(715)가 다소 부정확하다는 것은 하나(또는 그 이상)의 명령들(410)에 대해 추적된 에이지가 완전히 정확하지는 않다는 것을 의미할 수 있지만, 추적된 에이지는 여전히 도 1의 스토리지 장치(120)가 명령을 처리하는데 소요되는 시간만을 측정하는 경우보다 더 정확할 수 있다.
서로 다른 시간들에서 서브미션 큐(415)에 추가된 명령들(410)이 단일 엔트리(710)와 연관되는 경우, 도 7의 타임스탬프(715)에 대한 선택이 있을 수 있다. 예를 들어, 엔트리(710)와 연관된 개별 명령(410)이 서브미션 큐(415)에 추가된 시간이 도 7의 타임스탬프(715)로서 이용될 수 있다. 선택적으로, 시간 윈도우에 대해, 상기 시간 윈도우의 시작 시간 또는 종료 시간이 도 7의 타임스탬프(715)로서 이용될 수도 있다.
다수의 명령들(410)이 링크드 리스트(715)의 단일 엔트리(710)와 연관되어 있는 경우, 엔트리(710)의 관리는 다소 다를 수 있다. 하나의 명령(410)이 완료된 경우 도 1의 스토리지 장치(120)에 의해 아직 실행되지 않은 명령들(410)이 있을 수 있기 때문에, 엔트리(710)를 엔트리 풀(735)로 반환하는 것이 적절하지 않을 수 있다. 예를 들어, 도 8의 엔트리(710-4)를 고려해본다. 명령(410-5)이 완료되는 경우, 명령들(410-6 및 410-7)은 여전히 실행 보류 중이거나 실행 대기 중일 수 있다. 명령들(410-6 및 410-7)이 아직 완료되지 않은 경우 엔트리(710-4)를 엔트리 풀(735)로 반환하면, 명령들(410-6 및 410-7)의 에이지를 추적하기가 더 어려워질 수 있다(엔트리(710-4)에서 도 7의 타임스탬프(715)를 더 이상 이용할 수 없을 수 있기 때문이다.). 엔트리(710-4)에서 도 7의 타임스탬프(715)는 도 3의 메모리(340)로 복사되어 엔트리(710-4)가 엔트리 풀(735)로 반환될 수 있으나, 도 1의 스토리지 장치(120)에 의해 다수의 명령들이 병렬적으로 실행되고 있는 경우, 엔트리(710-4)를 조기에 반환하기 위해 도 3의 메모리(340)의 어딘가에 도 7의 타임스탬프(715)를 저장하는 것은 도 7의 어느 타임스탬프(715)가 실행 중인 어느 명령(410)에 대한 것인지의 추적을 더 복잡하게 만들 수 있다(특히 명령들(410)이 서브미션 큐(415)에 추가된 순서와 다른 순서로 완료될 수 있기 때문이다.).
본 개시의 일부 실시예들은 엔트리(710-4)와 연관된 모든 명령들(410)이 실행을 완료할 때까지 링크드 리스트(705)에 엔트리(710-4)를 유지함으로써 이 문제를 해결할 수 있다. 예를 들어, 명령들(410-5, 410-6 및 410-7)이 모두 완료될 때까지, 엔트리(710-4)는 링크드 리스트(705)에서 유지될 수 있다. 명령들(410-)이 서브미션 큐(415)에 추가된 순서와 동일한 순서로 완료되는 경우(예를 들어, 명령(410-5)이 명령(410-6)보다 늦지 않게 완료되도록 보장되고, 명령(410-6)은 명령(410-7)보다 늦지 않게 완료되도록 보장된다.), 엔트리(710-4)를 엔트리 풀(735)로 반환하는 것은 보다 간단할 수 있다. 일단 도 7의 포인터(720)에 의해 식별되는 명령(410)이 실행을 완료하면, 엔트리(710-4)는 엔트리 풀(735)로 반환될 수 있다.
그러나 다수의 명령들(410)을 엔트리(710)에 연관시키더라도, 엔트리 풀(735)이 여전히 비어있을 수 있다. 즉, 도 1의 프로세서(110)가 도어벨(425)을 울리는 경우 엔트리 풀(735)이 여유 엔트리들(free entries)을 가지고 있지 않을 수 있다. 예를 들어, 도 9a를 고려해본다. 도 9a에서, 엔트리 풀(735)은 이용가능한 엔트리들을 가지고 있지 않고, 현재 모두 이용 중이다(링크드 리스트(705)는 이용 중인 엔트리(710-1)만을 도시하지만, 다수의 서브미션 큐들(415)이 있는 경우 이러한 상황이 발생할 수 있고, 이 경우 다른 엔트리들(710)은 다른 서브미션 큐들(415)과 연관된 링크드 리스트들(705)에 의해 이용될 수 있다.). 따라서 도 1의 프로세서(110)가 도 1의 스토리지 장치(120)로 명령들(410-5 내지 410-8)이 이용가능하다고 통지하는 경우, 도 1의 스토리지 장치(120)는 이러한 명령들 중 일부 또는 전부와 연관될 수 있는 엔트리(710)를 가지지 않을 수 있다. 엔트리들(410-5 내지 410-8)이 현재 링크드 리스트(705)의 엔트리(710)와 연관되어 있지 않음을 나타내기 위해 엔트리들(410-5 내지 410-8)은 빗금친 영역으로 도시된다.
따라서 링크드 리스트(705)에 추가하기 위해 이용가능한 엔트리들(710)이 없는 경우 에이지 추적을 처리하기 위한 방법이라는 또 다른 문제가 존재한다. 이러한 상황에서, 에이지 추적은 도 1의 스토리지 장치(120)가 서브미션 큐(415)에서 명령(410)을 제거하는 시간에 기초할 수 있다. 그러나 다른 옵션들도 있다.
도 9b는 본 개시의 또 다른 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 7의 엔트리들(710)에 대한 완화된 마킹(relaxed marking)을 이용하여 도 4의 명령들(410)에 대한 도 7의 타임스탬프들(715)을 추적하는 방법을 도시한다. 완화된 마킹에서, 본 개시의 일부 실시예들에서, 엔트리(710)가 여유있게(free) 되면, 엔트리(710)를 엔트리 풀(735)로 반환한 다음 엔트리(710)를 이용하여 링크드 리스트(705)에 추가하는 대신, 엔트리(710)가 링크드 리스트(705)에서 즉시 재이용될 수 있다. 예를 들어, 도 9b에서, 명령(410-4)이 실행을 완료하고, 그것의 에이지 추적 또한 완료되었다고 가정한다(이 경우, 서브미션 큐(415)에 대한 헤드 포인터(610)는 명령(410-5)을 가리키도록 업데이트될 수 있다.). 엔트리(710-1)를 엔트리 풀(735)로 반환하는 대신, 엔트리(710-1)는 재이용될 수 있고, 도 7의 타임스탬프(715)에 시간을 할당하고, 엔트리(710-1)를 명령들(410-5 내지 410-8)에 연관시킬 수 있다.
도 7의 타임스탬프(715)에 할당된 시간은 명령들(410-5 내지 410-8)과 연관되도록 엔트리(710-1)가 재이용되는 시간일 수 있다. 선택적으로, 도 1의 스토리지 장치(120)가 도 1의 프로세서(110)가 도어벨(425)을 울린 마지막 시간을 추적하는 경우, 그 시간은 도 7의 타임스탬프(715)에 대해 이용될 수 있다. 도 9b는, 도 7의 타임스탬프(715)가 재이용되는 경우 엔트리(710-1)에서 업데이트되는 것처럼, 도 7의 타임스탬프(715)에 저장된 시간이 적어도 하나의 명령(410)이 서브미션 큐에 추가된 시간보다 늦기 때문에 “완화된 마킹”을 이용하는 것으로 설명된다. 도 8을 참조하여 상술한 바와 같이, 명령(410)이 서브미션 큐(415)에 추가된 시간보다 늦은 시간을 저장하는 것은 일부 명령들에 대한 에이지 추적이 다소 부정확하다는 것을 의미할 수는 있지만, 그러한 에이지 추적은 여전히 도 1의 스토리지 장치가 실제로 명령들(410)을 실행하는데 소요되는 시간만을 측정하는 것보다는 양호하다(그리고 에이지 추적은 그러한 측정보다 더 정확할 개연성이 있다.).
완화된 마킹의 대안으로서, 도 9c는 본 개시의 또 다른 실시예에 따른 도 1의 스토리지 장치(120)가 도 7의 엔트리들(710)에 대한 보수적 마킹(conservative marking)을 이용하여 도 4의 명령들(410)에 대한 도 7의 타임스탬프들(715)을 추적하는 방법을 도시한다. 도 9a 및 도 9b와 마찬가지로, 도 9c에서, 도 1의 프로세서(110)는 도 1의 스토리지 장치(120)로 명령들(410-5 내지 410-8)을 이용할 수는 있지만, 링크드 리스트(705)에 추가할 수 있는 어떤 엔트리(710)도 이용할 수 없음을 통지할 수 있다. 그러나 도 9b에 도시된 바와 같은 완화된 마킹과는 달리, 도 1의 스토리지 장치(120)가 명령들(410-5 내지 410-8)을 이용할 수 있다는 통지를 받은 경우, 도 1의 스토리지 장치(120)는 명령들(410-5 내지 410-8)을 이미 설립된 엔트리(710-1)와 연관시킬 수 있다. 따라서 도 7의 포인터(720)는 도 8을 참조하여 상술한 암시적 연관들과 유사하게, (다른 명령들에 대한 암시적 연관들과 함께) 추가되는 명령들(410-5 내지 410-8) 각각을 가리키도록 업데이트될 수 있다.
도 7의 타임스탬프(715)에 할당된 시간은 명령(410-4) 엔트리(710-1)가 링크드 리스트(705)에 처음으로 추가된 경우에 설정될 수 있다. 즉, 명령들(410-5 내지 410-8)이 엔트리(710-1)와 연관된 경우, 도 7의 타임스탬프(715)는 변경되지 않은 상태로 유지될 수 있다. 이러한 선택은 도 9c가 “보수적 마킹”을 이용하는 것으로 기술되는 이유를 설명한다. 도 7의 타임스탬프(715)는 임의의 연관된 명령(410)이 서브미션 큐(415)에 추가된 시점보다 거의 늦지 않을 수 있다(그리고 하나 이상의 연관된 명령(410)이 서브미션 큐(415)에 추가된 시점보다 빠를 수 있다.). 도 1의 스토리지 장치에 의해 계산된 바와 같이, 엔트리(710)와 연관된 임의의 명령(410)의 에이지는 명령(410)의 실제 에이지에 비해 보수적일 수 있다(일부 실시예들에서, 도 7의 타임스탬프(715)는 명령(410)이 엔트리(710)와 연관된 시간으로 업데이트될 수 있고, 보수적 마킹과 완화된 마킹 모두의 양태들을 결합할 수 있다.).
도 7의 타임스탬프(715)는 도 1의 프로세서(110)가 도 1의 스토리지 장치(120)에게 명령들(410)이 이용가능함을 통지했던 시간을 반영하지 않을 수 있기 때문에, 명령들(410)의 에이지들은 완전히 정확하지 않을 수 있다. 완화된 마킹을 이용하면, 명령들(410)의 에이지는 보고된 것보다 더 클 수 있고, 보수적 마킹을 이용하면 명령들(410)의 에이지는 보고된 것보다 더 작을 수 있다. 따라서 완화된 마킹을 이용하면, 도 1의 스토리지 장치(120)는 명령(410)이 예상 시간 내에 완료되지 않았다는 것을 감지하지 못할 수 있고, 보수적 마킹을 이용하면, 도 1의 스토리지 장치(120)는 명령이 실제로 완료된 경우 예상 시간 내에 완료되지 않았다고 판단할 수 있다. 완화된 마킹과 보수적 마킹 사이의 선택은 어떤 결과가 바람직한 것으로 간주되는지에 기초하여 제조자에 의해 결정될 수 있다.
완화된 마킹과 보수적 마킹 모두 잠재적인 우려를 가지고 있는데, 엔트리 풀(735)이 비어있는 경우 이용가능하게 된 명령들(410)과 연관된 엔트리(710)는 그것과 연관된 상당한 수의 명령들을 가질 수 있다. 예를 들어, 도 9b의 엔트리(710-5)는 그것과 연관된 4개의 명령들을 가지고, 도 9c의 엔트리(710-1)는 그것과 연관된 5개의 명령들을 가질 수 있다. 모드 연관된 명령들(410)이 처리된 후, 엔트리들(710)이 엔트리 풀(735)로 반환되는 경우, 이러한 엔트리들은 모든 연관된 명령들이 완전히 처리될 때까지 연장된 기간 동안 링크드 리스트(705)에 유지될 수 있다. 엔트리들(710)을 엔트리 풀(735)로 반환하는 것에서 이러한 지연은 다른 링크드 리스트들(705)에서 새로운 명령들(410)과 연관되도록 이용가능한 엔트리들이 없음을 의미할 수 있고, 이는 뱀이 자신의 꼬리를 먹는 것처럼 이러한 문제가 영구화될 수 있음을 의미할 수 있다.
이러한 문제를 해결하기 위해, 일부 수정들이 이루어질 수 있다. 본 개시의 실시예들에서 이용될 수 있는 하나의 옵션은 링크드 리스트(705)에 대한 적어도 하나의 엔트리(710)를 예약하는 것이다. 각 링크드 리스트(705)가 적어도 하나의 엔트리(710)를 보장받는 경우, 임의의 이용가능한 엔트리가 없는 링크드 리스트(705)를 예상할 수 없을 것이다. 예를 들어, 엔트리(710-1)는 링크드 리스트(705)에 대해 예약될 수 있고, 다르게 엔트리 풀(735)이 비어있고 링크드 리스트(705)가 현재 엔트리(710-1)를 이용하고 있지 않더라도, 다른 어떤 링크드 리스트(705)도 엔트리(710-1)를 이용할 수 없다. 본 개시의 실시예들에서 이용될 수 있는 다른 옵션은 각 링크드 리스트(705)에서 이용될 수 있는 엔트리들(710)의 수를 제한하는 것이다. 링크드 리스트(705)가 엔트리들(710)의 상한에 도달하면, 엔트리 풀(735)에 이용가능한 엔트리들(710)이 있더라도, 링크드 리스트(705)에 어떤 추가 엔트리들(710)이 추가될 수 없다. 이러한 옵션들은 엔트리 풀(735)이 비워지게 되고 완화된 마킹 또는 보수적 마킹을 이용하도록 강제하는 것을 제한하는데 도움이 될 수 있다.
본 개시의 일부 실시예들에서 이용될 수 있는 링크드 리스트(705)에 엔트리(710)를 전용하는(dedicating) 개념의 변형은 (서브미션 큐 디스크립터라고도 지칭될 수 있는) 고정 디스크립터(906)와 같은, 고정 디스크립터(fixed descriptor)를 이용하는 것이다. 고정 디스크립터(905)는 링크드 리스트(705) 전용일 수 있으나, 고정 디스크립터(905)는 링크드 리스트(705)의 헤드 포인터(725)가 가리키는 엔트리(710)의 내용들의 사본일 수 있다. 다시 말해, 링크드 리스트(705)의 다음 엔트리(710)는 서브미션 큐(415)의 헤드에서 명령들의 에이지 추적을 위해 액세스되고, 그 엔트리(710)는 고정 디스크립터(905)로 복사될 수 있고, 엔트리(710-1)는 즉시 엔트리 풀(735)로 반환될 수 있다. 고정 기술자(905)를 이용하는 것은 여러 명령들(410)과 연관된 엔트리(710-1)와 같은 엔트리가 모든 연관된 명령들이 실행되기 전에 엔트리 풀(735)로 반환될 수 있다는 장점을 가진다. 엔트리들(710)을 엔트리 풀(735)로 보다 빠르게 반환함으로써, 완화된 마킹 또는 보수적 마킹의 이용이 최소화될 수 있다(엔트리들(710)이 엔트리 풀(735)로부터 이용될 수 있기 때문이다.).
본 개시의 일부 실시예들에서, 도 1의 스토리지 장치(120)는 타임스탬프 버퍼(910)(버퍼라고도 지칭될 수 있다.)를 포함할 수 있다. 타임스탬프 버퍼(910)는 링크드 리스트(705)에 대한 전용 엔트리(710)의 개념에 대한 다른 변형일 수 있다. 그러나 타임스탬프 버퍼(910)는 전체 엔트리(710)가 아니라, 하나 이상의 명령들(410)과 연관된 타임스탬프에 대한 일시적인 스토리지일 수 있다. 타임스탬프 버퍼(910)는 어떤 엔트리(710)도 링크드 리스트(705)에 추가될 수 없는 경우(예를 들어, 엔트리 풀(735)이 비어있는 경우) 이용될 수 있다. 타임스탬프 버퍼(910)는, 엔트리들(710)과 마찬가지로, 도 7의 포인터(720)와 유사하게, 어떤 명령 또는 명령들(410)이 타임스탬프와 연관되어 있는지를 식별할 수도 있다. 그 다음에, 엔트리(710)가 링크드 리스트(705)에 대해 이용가능하게 되는 경우, 그 엔트리(710)는 타임스탬프 버퍼(910)로부터의 정보로 업데이트될 수 있고, 타임스탬프 버퍼(910)는 필요한 경우에 다시 이용될 수 있도록 이용 중이 아닌 것으로(free) 될 수 있다. 타임스탬프 버퍼(910)가 이용 중이고, 추가 명령들(410)이 이용가능하게 되는 경우, 추가 명령들에 대해 완화된 마킹 또는 보수적 마킹이 여전히 이용될 수 있음에 유의한다. 본 개시의 일부 실시예들에서, 링크드 리스트(705)와 연관된 타임스탬프 버퍼(910)가 하나 이상 있을 수 있다.
본 개시의 일부 실시예들에서, 고정 디스크립터(905) 및/또는 타임스탬프 버퍼(910)는 링크드 리스트(705)의 엔트리들(710)로서 이용될 수 있다(본질적으로, 전용 엔트리가 이용될 수 있는 방법).
도 9c는 하나의 고정 디스크립터(905)와 하나의 타임스탬프 버퍼(910)를 도시하지만, 본 개시의 실시예들은 임의의 수(‘0’ 이상)의 고정 디스크립터들(905) 및/또는 타임스탬프 버퍼들(910)을 포함할 수 있다. 또한, 본 개시의 실시예들은 상이한 수의 고정 디스크립터(905) 및 타임스탬프 버퍼(910)를 포함할 수 있다.
도 4의 하나 이상의 서브미션 큐들(415)이 존재할 수 있는 본 개시의 실시예들에서, 본 개시의 실시예들은 각 데이터 구조(705)에 대해 임의의 수(‘0’ 이상)의 고정 디스크립터들(905) 및/또는 타임스탬프 버퍼들(910)을 가질 수 있다. 각 데이터 구조(705)는 상이한 수의 고정 디스크립터들(905) 및/또는 타임스탬프 버퍼들(910)을 가질 수 있다. 각 데이터 구조(705)가 동일한 수의 고정 디스크립터들(905) 또는 타임스탬프 버퍼들(910)을 가질 필요는 없다.
고정 디스크립터들(905) 및/또는 타임스탬프 버퍼들(910)의 수는 미리 알려질 수 있다. 각 서브미션 큐(415)에 대해 고정 디스크립터(905) 및/또는 타임스탬프 버퍼(910) 각각은 ‘0’ 이상일 수 있다. 예를 들어, 216개의 서브미션 큐들(415)만큼 있을 수 있지만, 실제로 서브미션 큐들(415)의 수는 상대적으로 적을 수 있다. 고정 디스크립터들(905) 및/또는 타임스탬프 버퍼들(910)의 수는 서브미션 큐들(415)의 수의 작은 배수(예를 들어, ‘5’ 이하)일 수 있다. 고정 디스크립터(905) 및/또는 타임스탬프 버퍼(910)는 상대적으로 작을 수 있기 때문에(예를 들어, 각각 약 40 바이트), 고정 디스크립터들(905) 및/또는 타임스탬프 버퍼들(910)에 대해 필요한 전체 스토리지는 (예를 들어, 서브미션 큐들(415) 또는 심지어 링크드 리스트들(705)에 의해 이용되는 스토리지와 비교할 때) 상대적으로 작을 수 있다.
고정 디스크립터(905) 및/또는 타임스탬프 버퍼(910)는, 엔트리들(710)과 같이, 낮은 지연시간을 갖는 것이 바람직하다. 또한, 고정 디스크립터(905) 및/또는 타임스탬프 버퍼(910)는 서브미션 큐(415)와 연관될 수 있기 때문에, 고정 디스크립터(905) 및/또는 타임스탬프 버퍼(910)는 엔트리들(710)과 같이 재이용될 수 없다. 다라서, 고정 디스크립터(905) 및/또는 타임스탬프 버퍼(910)가 도 3의 메모리(340) 내의 주소들에 저장될 수 있지만, 본 개시의 다른 실시예들은 고정 디스크립터들(905) 및/또는 타임스탬프 버퍼(910)를 저장하기 위한 대안적인 장소들을 제공할 수 있다.
본 개시의 일부 실시예들에서, 고정 디스크립터(905) 및/또는 타임스탬프 버퍼(910)는 다른 DRAM과 같은 다른 휘발성 스토리지(도 3에서 미도시) 또는 도 3의 플래시 메모리 칩(315) 또는 다른 비휘발성 스토리지(도 3에서 미도시)와 같은 비휘발성 스토리지에 저장될 수 있다. 본 개시의 다른 실시예들에서, 고정 디스크립터(905) 및/또는 타임스탬프 버퍼(910)는 또 다른 저장 요소(도 3에서 미도시)에 저장될 수도 있다. 이러한 저장 요소는 예를 들어, 도 3의 컨트롤러(310)의 하드웨어 레지스터 또는 SRAM 내의 주소들과 같은, 작지만 빠른 하드웨어 스토리지일 수 있다.
본 개시의 일부 실시예들에서, 도 7 내지 도 9c의 링크드 리스트(705)가 바로 그 링크드 리스트일 수 있다. 그러나 본 개시의 다른 실시예들에서, 링크드 리스트(705)는 도 6a 내지 도 6c에 도시된 것과 같은 임의의 바람직한 데이터 구조로 대체될 수 있다.
상기 논의에서, 포인터라는 용어가 이용된다. 본 개시의 일부 실시예들에서, 포인터는 타겟 데이터가 위치할 수 있는 메모리 내의 주소일 수 있다. 그러나 도 6c를 참조하여 상술한 바와 같이, 어레이에 대한 인덱스가 포인터로서 이용될 수 있다. 메모리가 4 GB (232 비트)의 메모리를 포함하는 경우, 주소를 완벽하게 표현하기 위해 32 비트 (4 바이트)가 필요할 수 있지만, 어레이 자체가 메모리 전체보다 상대적으로 작은 경우, 어레이에 대한 인덱스를 저장하기 위해 더 적은 비트들이 필요할 수 있다. 예를 들어, 어레이가 1024 개의 요소들을 포함하는 경우, 가능한 모든 인덱스들을 표현하는데 10 비트만 필요하다. 본 개시의 나머지 부분에서, 포인터라는 용어는 포인터들 및 어레이 인덱스들을 포함하여 타겟 데이터가 저장될 수 있는 위치를 식별하기 위한 임의의 바람직한 접근 방식을 의미하도록 의도된다.
도 10은 본 개시의 실시예들에 따른, 도 3의 컨트롤러(310)의 세부사항들을 도시한다. 도 10에는, 컨트롤러(310)가 도시된다. 도 10의 컨트롤러(310)에 도시된 구성요소들은 에이지 추적을 위해 이용될 수 있고, 도 3의 플래시 메모리 컨트롤러(325), 도 3의 변환 레이어(330), 도 3의 가속기(335), 및/또는 도 3의 메모리(340)에 부가될 수 있다. 도 10은 컨트롤러(310)가 도 3 또는 도 10에 도시된 구성요소들 중 하나를 포함할 수는 있으나, 도 3 또는 도 10에 도시된 구성요소들 모두를 포함할 수 있음을 제안하기 위한 것은 아니다.
도 10에서, 컨트롤러(310)는 타이머(1005), 에이지 계산기(1010) 및 타임아웃 검출기(1015)를 포함하는 것으로 도시된다. 타이머(1005)는 도 8을 참조하여 상술한 바와 같이, 도 4의 명령들(410)이 시간 윈도우를 이용하여 도 8의 엔트리들(710)과 연관되는 경우에 이용될 수 있다. 따라서 타이머(1005)는 시간 윈도우가 이용되지 않는 경우에는 선택적일 수 있다. 에이지 계산기(1010)는 도 4의 특정 명령(410)의 에이지를 계산하기 위해 이용될 수 있다. 에이지 계산기(1010)는 아래의 도 11을 참조하여 더 논의된다. 타임아웃 검출기(1015)는 백그라운드 프로세스에 의해, 명령(410)이 실행을 위해 너무 오래 대기하고 있는 경우에 타임아웃 이벤트가 발생했는지 여부를 확인하기 위해 이용될 수 있다. 타임아웃 검출기(1015)는 아래의 도 12를 참조하여 더 논의된다.
도 11은 본 개시의 실시예들에 따른, 도 10의 에이지 계산기(1010)의 세부사항들을 도시한다. 도 11에서, 에이지 계산기(1010)는 도 7 내지 도 9c의 엔트리들(710)에 저장된 바와 같이 시작 타임스탬프(715) 및 종료 타임스탬프(1105)를 가지는 것으로 도시된다. 종료 타임스탬프(1105)는 도 1의 스토리지 장치(120)가 도 4의 연관된 명령(410)의 처리를 완료하는 경우의 타임스탬프일 수 있다. 명령 에이지(1110)는 그 다음에 종료 타임스탬프(1105)와 시작 타임스탬프(715) 사이의 차이로서 결정될 수 있다.
도 12는 본 개시의 실시예들에 다른, 도 10의 타임아웃 검출기(1015)의 세부사항들을 도시한다. 도 12에서, 타임아웃 검출기(1015)는 도 7 내지 도 9c의 엔트리들(710)에 저장된 것과 같은 시작 타임스탬프(715), 및 타임스탬프 생성기(1205)에 의해 생성된 타임스탬프를 가지는 것으로 도시된다. 타임아웃 검출기(1015)는 명령이 실행을 위해 너무 오래 대기하고 있는지를 감지하는데 이용될 수 있으므로, 타임스탬프 생성기(1205)는 현재 시간에 대한 타임스탬프를 생성할 수 있다. 타임스탬프 생성기(1205)에 의해 생성된 타임스탬프와 시작 타임스탬프(715) 사이의 차이가 계산될 수 있고, 그 다음에 비교기(1210)는 그 차이를 임계치(1215)와 비교할 수 있다. 임계치(1215)는 도 4의 명령(410)이 실행되기에는 너무 긴 것으로 간주되는, 미리 결정된 임계 시간의 양일 수 있다. 상기 현재 타임스탬프와 시작 타임스탬프(715)의 차이가 비교기(1210)에 의해 결정된 임계치(1215)를 초과하는 경우, 타임아웃 검출기(1015)는 타임아웃이 발생했다고 판단할 수 있다(대안적으로, 명령이 초과된 것으로 판단할 수 있다.). 타임아웃이 발생하는 경우, 도 4의 연관된 명령(410)은 도 4의 서브미션 큐(415)로부터 제거되고, 오류 처리로 되거나 중단(abort)을 트리거할 수 있다.
시작 타임스탬프(715)에 어떤 값을 이용할 것인지에 대한 의문이 제기될 수 있다. 예를 들어, 도 7 내지 도 9c의 링크드 리스트(705)가 도 7 내지 도 9c의 다수의 엔트리들(710)을 포함하는 경우, 이용할 수 있는 다수의 타임스탬프들(715)이 있을 수 있다. 가장 간단한 해결책은 도 7 내지 도 9c의 헤드 포인터(725)에 의해 가리켜지는 도 7 내지 도 9c의 엔트리(710)를 이용하는 것이다. 도 4의 임의의 명령(410)이 실행을 너무 오래 대기하고 있는 경우, 도 1의 스토리지 장치(120)에서 이용할 수 있는 가장 오래된 명령(410)이 될 수 있을 것이다. 일반적으로 도 7 내지 도 9c의 헤드 포인터(725)에 의해 가리켜지는 도 7 내지 도 9c의 엔트리(710)는 실행을 가장 오래 대기하고 있는 도 4의 명령(410)과 연관될 수 있다. 도 4의 다른 명령(410)이 더 이른 시작 타임스탬프(715)를 가질 가능성은 낮다(그러나 가능성은 있다.). 따라서 시작 타임스탬프(715)는 도 7 내지 도 9c의 헤드 포인터(725)에 의해 가리켜지는 도 7 내지 도 9c의 엔트리(710)의 타임스탬프(715)를 이용할 수 있다. 물론, 도 7 내지 도 9c의 헤드 포인터에 의해 가리켜지는 도 7 내지 도 9c의 엔트리(710)가, 도 7 내지 도 9c의 엔트리(710)가 타임아웃될 정도로 충분히 오랜 기간 대기하고 있는 경우, 도 7 내지 도 9c의 다른 엔트리들 또한 타임아웃되었을 수 있다. 타임아웃 검출기(1015)는 도 7 내지 도 9c의 다른 엔트리들(710)과 함께 이용될 수 있다.
그러나 도 7 내지 도 9c의 다수의 링크드 리스트들(705)이 있는 경우, 도 7 내지 도 9c의 각 링크드 리스트(705)의 도 7 내지 도 9c의 헤드 포인터(725)에 의해 가리켜지는 도 7 내지 도 9c의 엔트리(710)의 시작 타임스탬프(715)를 확인하는 것이 바람직할 수 있다. 결국 도 7 내지 도 9c의 각 링크드 리스트의 도 7 내지 도 9c의 헤드 포인터(725)에 의해 가리켜지는 도 7 내지 도 9c의 엔트리(710)가 실행을 가장 오래 대기하고 있는 도 4의 명령(410)과 연관될 수 있는 동안, 도 4의 각 명령(410)과 연관된 시작 타임스탬프들(715) 사이에는 상대적인 순서가 없을 수 있다.
본 개시의 일부 실시예들에서, 타임아웃 검출기(1015)는 주기적으로 이용될 수 있다. 즉, 도 1의 스토리지 장치(120)가 특정 시점에 타임아웃을 경험하지 못했다고 하여 나중에 타임아웃이 발생하지 않을 수 있다는 것을 의미하지는 않는다. 따라서 타임아웃 검출기(1015)를 주기적으로 이용하는 것이 유용할 수 있다. 타임아웃 검출기(1015)는 도 7 내지 도 9c의 링크드 리스트(705) 전체를 스캔하거나 도 7 내지 도 9c의 헤드 포인터(725)에 의해 가리켜지는 도 7 내지 도 9c의 엔트리(710)를 스캔하기 위해 일정한 간격으로 발생하도록 예정될 수 있다. 타임아웃 검출기(1015)는 백그라운드 프로세스로서 이용될 수 있다. 도 1의 스토리지 장치(120)가 도 4의 서브미션 큐(415)로부터 도 4의 하나 이상의 명령들(410)을 페치하는 경우 즉, 도 4의 명령(410)이 페치될 때마다 또는 주기적으로, 타임아웃 검출기(1015)가 실행될 수도 있다.
타임아웃 검출기(1015)는 도 4의 명령(410)의 처리와 독립적으로 동작할 수 있다. 즉, 도 1의 스토리지 장치(120)에 의해 도 4의 서브미션 큐(415)로부터 도 4의 명령(410)이 페치되는 경우 타임아웃 검출기(1015)가 트리거될 수 있으나, 타임아웃 검출기(1015)는 도 4의 명령(410)의 임의의 정보를 이용하지 않고도 기능할 수 있다. 본 개시의 일부 실시예들에서, 타임아웃 검출기(1015)는 도 1의 스토리지 장치(120)에 의해 도 4의 명령들(410)이 도 4의 서브미션 큐(415)로부터 제거되는 방식과 함께 정렬되는 방식으로 동작할 수 있으나, 그러한 정렬이 반드시 요구되는 것은 아니다.
도 13은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 7 내지 도 9c의 엔트리들(710)을 이용하여 도 11의 명령 에이지(1110)를 추적하는 예시적인 절차의 순서도를 도시한다. 도 13에서, 블록(1305)에서, 도 1의 스토리지 장치(120)는 도 4의 명령(410)을 이용할 수 있다는 통지를 도 1의 프로세서(110)로부터 수신할 수 있다. 블록(1310)에서, 도 1의 스토리지 장치(120)는 도 1의 프로세서(110)로부터 통지를 수신한 것에 기초하여 타임스탬프를 결정할 수 있다. 블록(1315)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리 풀(735)로부터 도 7 내지 도 9c의 엔트리(710)를 선택할 수 있다. 블록(1320)에서, 도 1의 스토리지 장치(120)는 도 7의 타임스탬프(715)를 도 7 내지 도 9c의 선택된 엔트리(710)에 저장할 수 있다. 블록(1325)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 선택된 엔트리(710)를 도 4의 명령(410)에 연관시킬 수 있다. 마지막으로, 블록(1330)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 선택된 엔트리(710)를 도 7 내지 도 9c의 엔트리들(710)에 이용된 도 7 내지 도 9c의 데이터 구조(705)에 추가할 수 있다.
도 14는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 1의 호스트(105)로부터 도 4의 새로운 명령(410)이 준비되었다는 통지를 수신하는 예시적인 절차의 순서도를 도시한다. 도 14에서, 블록(1405)에서, 도 1의 스토리지 장치(120)는 도 1의 프로세서(110)(예를 들어, 도 4의 도어벨(425)을 울리는 도 1의 프로세서(110))로부터 도어벨 이벤트를 수신할 수 있다. 이 도어벨 이벤트는 예를 들어, 도 4의 테일 포인터(425)에 대한 업데이트를 포함할 수 있다.
도 15는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 7 내지 도 9c의 엔트리들(710)을 도 4의 명령들(410)과 연관시키는 예시적인 절차의 순서도를 도시한다. 도 15는 도 7 내지 도 9c의 엔트리들(710)과 도 4의 명령들(410)을 연관시키기 위한 두 개의 상이한 접근들을 도시한다. 블록(1505)에서, 도 1의 스토리지 장치(120)는 메모리 주소 또는 도 7 내지 도 9c의 몇몇의 다른 참조와 같은 도 7의 포인터(720)를 설립할 수 있다. 이 포인터는 도 4의 명령(410)이 저장되어 있는 위치를 식별할 수 있다. 대안적으로, 블록(1510)에서, 도 1의 스토리지 장치(120)는 도 6c의 인덱스(615)를 도 4의 서브미션 큐(415)에 저장할 수 있고, 이는 도 4의 서브미션 큐(415) 내에서 도 4의 명령(410)을 식별할 수 있다.
도 16은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 7 내지 도 9c의 엔트리들(710)을 초기화하는 예시적인 절차의 순서도를 도시한다. 도 16에서, 블록(1605)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)를 초기화할 수 있다. 이 초기화는 도 7의 타임스탬프(715), 도 7의 마지막 도어벨 시간(750) 및/또는 도 7의 도어벨 이벤트들(755)의 수와 같은, 도 7 내지 도 9c의 엔트리(710)에 미리 저장된 임의의 데이터를 지우는 것을 포함할 수 있다. 블록(1610)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)가 임의의 도 7 내지 도 9c의 다른 데이터 구조와 더 이상 연결되지 않는 것을 보장하기 위해, 도 7의 포인터들(720 및/또는 745)을 소거하거나 덮어쓸 수 있다.
도 17은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 7 내지 도 9c의 엔트리들(710)을 도 6a 내지 도 6c의 데이터 구조들에 추가하는 예시적인 절차의 순서도를 도시한다. 블록(1705)에서, 도 7 내지 도 9c의 엔트리(710)가 도 4의 서브미션 큐(415)에 추가된, 가장 최근의 도 4의 명령(410)과 연관될 수 있기 때문에, 도 7 내지 도 9c의 엔트리(710)는 도 7 내지 도 9c의 데이터 구조(705)의 마지막에 있을 수 있다. 따라서 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)에서 도 7의 포인터(745)를 널 포인터로서 설립할 수 있다. 블록(1710)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)를 가리키도록 도 7 내지 도 9c의 데이터 구조(705)의 마지막 전에 도 7 내지 도 9c의 엔트리(710)로부터 도 7의 포인터(745)를 설립할 수 있다. 마지막으로, 블록(1715)에서, 테일 포인터(730)는 도 7 내지 도 9c의 엔트리(710)를 가리키도록 설정될 수 있다(도 7 내지 도 9c의 데이터 구조(705)에 추가될 수 있는 미래의 도 7 내지 도 9c의 엔트리들(710)이 도 7 내지 도 9c의 데이터 구조(705)의 마지막에 추가될 수 있도록).
도 18은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 4의 명령(410)을 검색하고 그것의 에이지를 추적하는 예시적인 절차의 순서도를 도시한다. 도 18에서, 블록(1805)에서, 도 1의 스토리지 장치(120)는 도 4의 서브미션 큐(415)로부터 도 4의 명령(410)을 검색할 수 있다. 블록(1810)에서, 도 1의 스토리지 장치(120)는 도 4의 명령(410)과 연관된 도 7 내지 도 9c의 엔트리(710)로부터 도 7의 타임스탬프(715)에 액세스할 수 있다. 본 개시의 일부 실시예들에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 헤드 포인터(725)가 가리킴에 따라 도 7 내지 도 9c의 이 엔트리(710)를 식별할 수 있다.
블록(1815)에서, 도 1의 스토리지 장치(120)는 도 4의 명령(410)을 실행할 수 있다. 블록(1820)에서, 도 1의 스토리지 장치(120)는 도 1의 타임스탬프(1105)를 결정할 수 있고, 이는 도 1의 스토리지 장치(120)가 도 4의 명령(410)의 실행을 완료한 시간을 나타낼 수 있다. 블록(1825)에서, 도 10의 에이지 계산기(1010)는 도 7의 타임스탬프(715) 및 도 11의 타임스탬프(1105)를 이용하여 도 11의 명령 에이지(1110)를 결정할 수 있다.
블록(1830)에서, 도 1의 스토리지 장치(120)는 도 4의 명령(410)을 실행한 결과를 도 1의 프로세서(110)로 반환할 수 있다. 블록(1835)에서, 도 1의 프로세서(110)가 도 11의 명령 에이지(1110)에 대해 관심이 있는 경우, 도 1의 스토리지 장치(120)는 도 1의 프로세서(110)로 도 11의 명령 에이지(1110)를 반환할 수 있다. 마지막으로, 블록(1840)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)를 도 7 내지 도 9c의 엔트리 풀(735)로 반환할 수 있다.
도 4의 서브미션 큐(415)로부터 도 4의 명령(410)을 검색하는 것은 서브미션 큐(415)에서 도 4의 다음 명령(410)을 가리키도록 도 6a 내지 도 6v의 헤드 포인터(610)를 조정하는 것을 포함할 수 있다. 도 6a 내지 도 6c의 헤드 포인터(610)를 업데이트하는 것은 다른 시간에도 수행될 수 있다. 예를 들어, 도 6a 내지 도 6c의 헤드 포인터(610)를 업데이트하는 것은 도 4의 명령(410)을 실행한 결과를 도 1의 프로세서(110)로 반환하는 것(블록(1830))의 일부로서 수행될 수 있다.
도 18은 도 7 내지 도 9c의 엔트리(710)가 도 7 내지 도 9c의 엔트리 풀(735)로 반환되는 블록(1840)이 마지막 동작인 것으로 암시하는 반면, 본 개시의 일부 실시예들은 다른 위치에 블록(1840)을 포함할 수 있다. 예를 들어, 도 9c의 고정 디스크립터(905)를 이용하는 본 개시의 실시예들에서, 블록(1840)은 도 7 내지 도 9c의 엔트리 풀(735)이 비어있을 가능성을 최소화하기 위해 도 7 내지 도 9c의 엔트리의 데이터가 도 9c의 고정 디스크립터(905)로 복사된 후에 수행될 수 있다.
도 19는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 7 내지 도 9c의 엔트리들(710)을 업데이트하는 예시적인 절차의 순서도를 도시한다. 도 7 내지 도 9c의 엔트리들은 예를 들어, 도 7 내지 도 9c의 엔트리들(710)이 도 6a 내지 도 6c의 헤드 포인터(610)에 상대적인 도 4의 명령들(410)에 대한 참조들을 포함하는 경우 업데이트될 필요가 있다. 즉, 도 6a 내지 도 6c의 헤드 포인터(610)가 변함에 따라, 참조들은 업데이트될 필요가 있을 수 있다. 예를 들어, 도 7 내지 도 9c의 엔트리들(710)의 참조들이 카운트 또는 오프셋을 포함하는 경우 이러한 상황이 발생할 수 있다. 예를 들어, 도 7 내지 도 9c의 엔트리(710)가 카운트 ‘3’을 포함하는 경우, 그 카운트는 도 7 내지 도 9c의 엔트리(710)와 연관된 도 4의 서브미션 큐(415)에서 3개의 도 4의 명령들(410)이 있음을 나타낼 수 있다. 그러나 도 4의 명령들(410)이 도 4의 서브미션 큐(415)로부터 제거됨에 따라 카운트가 업데이트되지 않는다면, 도 7 내지 도 9c의 엔트리(710)의 도 7의 타임스탬프(715)는 도 7의 타임스탬프(715)와 연관되지 않기로 되어 있는 도 4의 명령(410)과 연관된 것으로 간주될 수 있다. 따라서 도 4의 명령들(410)이 도 5의 서브미션 큐(415)로부터 제거됨에 따라, 블록(1905)에서, 참조는 도 7 내지 도 9c의 엔트리(710)의 카운트 또는 오프셋을 감소시킴으로써 업데이트될 수 있다. 이러한 방식으로 카운트가 ‘0’에 도달하거나 도 4의 명령(410)이 도 4의 서브미션 큐(415)로부터 제거된 후에 오프셋이 ‘0’이 된 경우, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)를 도 8 내지 도 9c의 엔트리 풀(735)로 반환할 시간임을 알 수 있다.
도 20은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치가 도 7 내지 도 9c의 엔트리들(710)을 제거하자마자 도 6a 내지 도 9c의 데이터 구조들을 업데이트하는 예시적인 절차의 순서도를 도시한다. 블록(2005)에서, 스토리지 장치는 도 7 내지 도 9c의 데이터 구조(705)의 다른 엔트리(710)를 가리키도록 도 7 내지 도 9c의 헤드 포인터(725)를 전진시킬 수 있다.
도 21은 본 개시의 실시예들에 따른, 도 7 내지 도 9c의 엔트리 풀(735)이 비어있는 경우, 도 1의 스토리지 장치(120)가 도 11의 명령 에이지(1110)를 추적하는 예시적인 절차의 순서도를 도시한다. 도 21에서, 블록(2105)에서, 도 1의 스토리지 장치(120)는 도 1의 프로세서(110)로부터 도 4의 명령(410)이 이용가능하다는 통지를 수신할 수 있다. 블록(2110)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리 풀(735)이 비어있다고 결정할 수 있다. 즉, 도 7 내지 도 9c의 엔트리 풀(735)에 이용가능한 도 7 내지 도 9c의 엔트리는 없다. 블록(2115)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 데이터 구조에서 도 7 내지 도 9c의 엔트리(710)가 이미 도 4의 다른 명령(410)과 연관되어 있음을 식별할 수 있다. 마지막으로, 블록(2120)에서, 도 1의 스토리지 장치(120)는 도 4의 명령(410)을 도 7 내지 도 9c의 데이터 구조(705)의 도 7 내지 도 9c의 엔트리(710)와 연관시킬 수 있다.
도 22는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 4의 명령들(410)에 대한 도 7의 타임스탬프들(715)을 결정하는 예시적인 절차의 순서도를 도시한다. 도 22에서, 블록(2205)에서, 도 1의 스토리지 장치(120)는 도 4의 서브미션 큐(415)로부터 도 4의 명령(410)을 검색할 수 있다. 그 다음에, 블록(2210)에서, 도 1의 스토리지 장치(120)는 도 4의 명령(410)에 이용되는 도 7의 타임스탬프(715)를 결정할 수 있다.
본 개시의 일부 실시예들에서, 도 1의 스토리지 장치(120)는 가능한 한 빨리 도 7의 타임스탬프(715)를 결정할 수 있고, 이는 도 1의 스토리지 장치(120)가 도 4의 서브미션 큐(415)로부터 도 4의 명령(410)을 검색하기 전일 수 있다. 본 개시의 그러한 실시예들에서, 블록(2205)은 점선(2215)으로 도시된 바와 같이 효과적으로 스킵될 수 있다. 선택적으로, 블록(2205)이 블록(2210) 이후 언젠가 수행될 수 있다. 그러나 도 1의 스토리지 장치(120)가 도 4의 명령(410)을 검색하기 전 도 7의 타임스탬프(715)를 결정하지 않는 경우, 도 1의 스토리지 장치(120)가 도 4의 서브미션 큐(415)로부터 도 4의 명령(410)을 검색하는 경우에 도 7의 타임스탬프(715)를 결정할 수 있다.
도 23은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 완화된 마킹을 이용하여 도 11의 명령 에이지(1110)를 추적하는 예시적인 절차의 순서도를 도시한다. 도 23에서, 블록(2305)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)가 도 7 내지 도 9c의 데이터 구조(705)로부터 해제되었음을 결정할 수 있다. 본 개시의 일부 실시예들에서, 도 7 내지 도 9c의 엔트리(710)는 도 7 내지 도 9c의 엔트리(710)가 이용될 도 4의 명령(410)을 포함하는 도 4의 서브미션 큐(415)와 연관된 도 7 내지 도 9c의 데이터 구조(705)에 있을 수 있다. 블록(2310)에서 도 1의 스토리지 장치(120)는 도 7의 타임스탬프(715)를 도 7 내지 도 9c의 엔트리(710)에 저장할 수 있다. 타임스탬프(715)는 도 7 내지 도 9c의 엔트리(710)가 이용가능하게 된 시점에 결정되거나 더 이른 시점에 결정(그리고 저장)되어 있을 수 있다. 블록(2315)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)를 다른 도 4의 명령들(410)에 연관시킬 수 있다(도 1의 스토리지 장치(120)가 도 7 내지 도 9c의 엔트리(710)가 이용 중이지 않게 되기까지 대기하는 동안 하나 이상의 도 4의 명령들(410)이 도 1의 스토리지 장치(120)에 대해 이용가능하게 되었을 수 있기 때문이다.). 마지막으로, 블록(2320)에서, 도 7 내지 도 9c의 엔트리(710)는 도 7 내지 도 9c의 데이터 구조(705)의 테일로 이동될 수 있다.
도 24는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 보수적 마킹을 이용하여 도 11의 명령 에이지(1110)를 추적하는 예시적인 절차의 순서도를 도시한다. 도 24에서, 도 1의 스토리지 장치(120)는 도 4의 다른 명령(410)을 식별할 수 있다. 예를 들어, 도 7 내지 도 9c의 데이터 구조(705)의 테일 끝(tail end)의 명령을 식별할 수 있다. 도 1의 블록(2410)에서, 도 1의 스토리지 장치(120)는 블록(2405)에서 식별된 도 4의 명령(410)과 연관된 도 7 내지 도 9c의 엔트리(710)를 식별할 수 있다. 도 7 내지 도 9c의 이 엔트리(710)는 또한 도 4의 명령(410)과 연관될 수 있다.
도 25는 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 9c의 고정 디스크립터를 이용하여 도 11의 명령 에이지(1110)를 추적하는 예시적인 절차의 순서도를 도시한다. 도 25에서, 블록(2505)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)를 도 9c의 고정 디스크립터(905)로 복사할 수 있다. 도 7 내지 도 9c의 엔트리(710)의 내용들을 도 9c의 고정 디스크립터(905)로 복사함으로써 도 7 내지 도 9c의 엔트리(710)가 더 일찍 해제될 수 있고, 이는 도 7 내지 도 9c의 엔트리 풀(735)로부터 이용가능한 도 7 내지 도 9c의 엔트리(710)가 없는 경우 도 1의 프로세서(110)가 도 1의 스토리지 장치(120)에게 도 4의 새로운 명령(410)을 통지할 가능성을 감소시키거나 최소화하는데 도움이 될 수 있다.
도 26은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 9c의 타임스탬프 버퍼를 이용하여 도 11의 명령 에이지(1110)를 추적하는 예시적인 절차의 순서도를 도시한다. 도 26에서, 블록(2605)에서, 도 1의 스토리지 장치(120)는 도 1의 프로세서(110)로부터 도 4의 명령(410)이 이용가능하다는 통지를 수신할 수 있다. 블록(2610)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리 풀(735)이 비어있다고 결정할 수 있다. 즉, 도 7 내지 도 9c의 엔트리 풀(735)은 이용가능한 도 7 내지 도 9c의 엔트리(710)를 가지지 않을 수 있다. 블록(2615)에서, 도 1의 스토리지 장치(120)는 타임스탬프를 결정할 수 있다(예를 들어, 도 1의 스토리지 장치(120)가 도 1의 프로세서(110)로부터 통지를 수신한 시점에 기초하여). 블록(2620)에서, 도 1의 스토리지 장치(120)는 타임스탬프를 도 9c의 타임스탬프 버퍼(910)에 저장할 수 있다. 마지막으로, 블록(2625)에서, 도 1의 스토리지 장치(120)는 도 4의 명령(410)을 도 9c의 타임스탬프 버퍼(910)와 연관시킬 수 있다.
도 27은 본 개시의 실시예들에 다른, 도 1의 스토리지 장치(120)가 시간 윈도우들을 이용하여 도 11의 명령 에이지(1110)를 추적하는 예시적인 절차의 순서도를 도시한다. 도 27에서, 블록(2705)에서, 도 1의 스토리지 장치(120)는 시간 위도우를 개시할 수 있다. 블록(2710)에서, 도 1의 스토리지 장치(120)는 도 1의 프로세서(110)로부터 도 4의 명령(410)이 이용가능하다는 통지를 수신할 수 있다. 이 통지는 상기 시간 위도우 동안 수신될 수 있다. 블록(2715)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리 풀(735)로부터 도 7 내지 도 9c의 엔트리(710)를 선택할 수 있다.
블록(2720)에서, 스토리지 장치는 도 7의 타임스탬프(715)를 도 7 내지 도 9c의 엔트리(710)에 저장할 수 있다. 도 7의 타임스탬프(715)는 상기 시간 윈도우와 연관될 수 있고, 상기 시간 윈도우의 시작 시간, (도 7의 타임스탬프(715)가 시간 위도우가 닫히기 전에 결정되는 경우) (미래의) 종료 시간, 또는 도 1의 스토리지 장치(120)가 도 1의 프로세서(110)로부터 도 4의 명령(410)이 이용가능하다는 통지를 받은 시간일 수 있다. 블록(2725)에서, 도 1의 스토리지 장치(120)는 도 4의 명령(410)을 도 7 내지 도 9c의 엔트리(710)와 연관시킬 수 있다. 블록(2730)에서, 도 1의 스토리지 장치(120)는 도 7 내지 도 9c의 엔트리(710)를 도 7 내지 도 9c의 데이터 구조(705)에 추가할 수 있다.
도 1의 스토리지 장치(120)가 도 1의 프로세서(110)로부터 도 4의 다른 명령들(410)이 이용가능하다는 추가 통지들을 받은 경우, 블록들(2710 및 2725)은 도 4의 각각의 그러한 명령(410)에 대해 필요에 따라 반복될 수 있다.
마지막으로 블록(2735)에서, 도 1의 스토리지 장치(120)는 시간 윈도우를 종료할 수 있다.
도 28은 본 개시의 실시예들에 따른, 도 1의 스토리지 장치(120)가 도 7 내지 도 9c의 엔트리들(710)을 이용하여 타임아웃을 검출하는 예시적인 절차의 순서도를 도시한다. 도 28에서, 블록(2805)에서, 도 10의 타임아웃 검출기(1015)는 도 7 내지 도 9c의 데이터 구조(705)로부터 도 7 내지 도 9c의 엔트리(710)에 액세스할 수 있다. 본 개시의 일부 실시예들에서, 도 7 내지 도 9c의 엔트리(710)는 가장 오래 대기하고 있는 도 4의 명령(410)과 연관된 엔트리일 수 있으므로, 도 10의 타임아웃 검출기(1015)는 도 7 내지 도 9c의 헤드 포인터(725)에 의해 가리켜지는 도 7 내지 도 9c의 엔트리(710)에 액세스할 수 있다. 도 4의 어떤 명령(410)이 타임아웃된 경우, 가장 오래 대기하고 있는 도 4의 명령(410)이 될 수 있을 것이다. 블록(2810)에서, 도 10의 타임아웃 검출기(1015)는 도 7 내지 도 9c의 엔트리(710)로부터 도 7의 타임스탬프(715)를 검출할 수 있다. 블록(2815)에서, 도 12의 타임아웃 생성기(1205)는 현재 시간에 대한 타임스탬프와 같은 제2 타임스탬프를 결정할 수 있다. 마지막으로, 블록(2820)에서, 도 10의 타임아웃 검출기(1015)는 도 7의 타임스탬프(715) 및 도 12의 타임스탬프 생성기(1205)에 의해 결정된 타임스탬프를 기초로, 비교기(12210)를 이용하여 타임아웃이 발생했는지 여부를 결정할 수 있다.
도 29는 본 개시의 실시예들에 따른, 도 10의 타임아웃 검출기(1015)가 타임아웃이 발생했음을 검출하는 예시적인 절차의 순서도를 도시한다. 도 29에서, 블록(2905)에서, 도 10의 타임아웃 검출기(1015)는 도 12의 임계치(1215)를 결정할 수 있다. 도 12의 임계치(1215)는 도 1의 스토리지 장치(120)의 제조자에 의해 설정될 수 있고, 도 1의 모든 스토리지 장치들(120)에 걸친 디폴트 임계치이거나, 스토리지 장치(120)에 특정될 수도 있다. 도 12의 임계치(1215)는 또한 고객에 의해 설립될 수 있고, 고객의 요청에 따라 도 1의 스토리지 장치(120)에 프로그래밍되거나 고객에 의해 도 1의 스토리지 장치(120)에 구성될 수 있다. 블록(2910)에서, 도 10의 타임아웃 검출기(1015)는 도 7의 타임스탬프(715)와 도 12의 타임스탬프 생성기(1205)에 의해 결정된 타임스탬프 사이의 차이를 결정할 수 있다. 블록(2915)에서, 비교기(1210)는 블록(2910)에서 결정된 상기 차이를 도 12의 임계치(1215)와 비교할 수 있다. 블록(2910)에서 결정된 상기 차이가 도 12의 임계치(1215)보다 큰 경우, 타임아웃이 발생했을 수 있다. 마지막으로, 블록(2920)에서 도 1의 스토리지 장치(120)는 도 1의 호스트(105)로 타임아웃을 보고할 수 있다.
도 13 내지 도 29에서, 본 개시의 일부 실시예들이 도시되어 있다. 그러나 통상의 기술자는 블록들의 순서를 변경하거나, 블록들을 생략하거나 또는 도면들에 도시되지 않은 링크들을 포함시킴으로써 본 개시의 다른 실시예들도 가능하다는 것을 인식할 것이다. 순서도들의 그러한 모든 변형들은 명시적으로 설명되었는지 여부에 관계없이 본 개시의 실시예들로 간주된다.
도 6a 내지 도 29는 본 개시의 다양한 실시예들을 설명한다. 본 개시의 이러한 실시예들은 개별적으로 또는 조합하여 이용될 수 있다. 예를 들어, 도 7의 데이터 구조(705)에서 도 7의 엔트리들(710)을 이용하는 아이디어는, 도 7의 엔트리 풀(735)이 도 4의 명령(410)에 대해 도 7의 타임스탬프(715)를 저장하기 위한 도 7의 엔트리(710)를 가지고 있지 않은 경우, 수신된 도 4의 명령들(410)을 다루기 위한 도 9a 내지 도 9c에 도시된 임의의 접근들과 결합될 수 있다. 또한 예를 들어, 그러한 조합들은 도 8에 도시된 바와 같이, 도 4의 다수의 명령들(410)과 도 7의 단일 엔트리(710)를 연관시키는 것을 포함하거나 생략할 수 있다.
본 개시의 실시예들은 호스트로부터 명령들이 수신되는 경우 타임스탬프들을 저장할 수 있는 데이터 구조를 포함하는 스토리지 장치를 가질 수 있다. 명령들이 호스트로부터 수신되는 경우 타임스탬프들을 저장함으로써, 본 개시의 실시예들은 명령 에이지를 추적하는 것에 기술적 이점을 제공한다. 추적된 명령 에이지는 스토리지 장치가 명령을 처리하는데 소요되는 시간보다는 호스트가 명령이 처리되기를 대기하는데 소요되는 시간에 더 가까울 수 있다.
설명된 NVMe(Non-Volatile Memory Express) 명령 수명주기에서, 호스트는 명령 엔트리들을 서브미션 큐(SQ)에 추가할 수 있다. 그 다음에 호스트는 SQ 테일 도어벨(TDB)을 울려 NVMe 장치에 새 명령들을 알릴 수 있다. 장치는 SQ 헤드 포인터로부터 SQ 테일 포인터까지 명령들을 페치할 수 있다. 그 다음에 장치는 명령(들)을 완료하기 위해 필요한 작업을 실행할 수 있다. 마지막으로, 장치는 컴플리션 큐(CQ) 엔트리들을 CQ에 발송하고 호스트에게 인터럽트를 통해 엔트리들의 존재를 알릴 수 있다.
일부 설명된 NVMe 장치들은 명령이 NVMe 서브미션 큐로부터 페치된 후에 명령 에이지를 추적하기 시작한다. 호스트가 SQ TDB를 업데이트하는 것과 장치가 SQ를 페치하는 것 사이의 시간 간격은 측정되거나 모니터링되지 않을 수 있는데, 이는 딥 SQ들에 대해 그렇게 하는 것이 비용이 많이 들거나 장치가 많은 SQ들을 지원하는 경우일 수 있기 때문이다. 그 결과 명령의 수명의 상당한 부분은 SQ에 머무는데 소요될 수 있다. 또한, 장치 문제로 인해 페치가 발생하지 않을 수 있고, 이러한 문제를 플래그하지 않을 수 있다.
본 개시의 실시예들은 SQ TDB 기반의 에이지 추적을 이용하여 그러한 문제들을 해결할 수 있다. NVMe 장치는 서브미션 큐마다의 링크드 리스트(SQ LL) 및 프리(free) 링크드 리스트 엔트리들(프리 풀)을 유지할 수 있다. 각 링크드 리스트 엔트리는 연관된 SQ TDB 이벤트의 타임스탬프, SQ TDB 이벤트와 연관된 SQ 테일 포인터 값일 수 있는 SQ 엔트리 포인터 및 다음 링크드 리스트 엔트리로의 포인터를 포함할 수 있다.
SQ TDB 이벤트에서, NVMe 장치는 타임스탬프와 SQ 테일 포인터 값을 추적하기 위해 링크드 리스트 엔트리를 할당할 수 있다. 그 다음에 NVMe 장치는 링크드 리스트 엔트리를 연관된 SQ 링크드 리스트의 마지막에 추가할 수 있다.
NVMe 장치가 페치 이벤트를 수행하는 경우, NVMe 장치는 SQ 링크드 리스트 헤드 엔트리 타임스탬프를 페치된 명령 구조로 이동시킬 수 있다. SQ 엔트리 포인터가 SQ 링크드 리스트 엔트리 포인터의 엔트리와 같은 경우, 링크드 리스트 엔트리는 SQ 링크드 리스트로부터 제거될 수 있고, 프리 풀(Free Pool)로 해제될 수 있다.
NVMe 장치는 비활성/타임아웃을 검출하기 위해 SQ 링크드 리스트 헤드 엔트리들의 타임스탬프들을 스캔/모니터링하는 프로세스를 포함할 수 있다.
본 개시의 일부 실시예들에서, 링크드 리스트 엔트리를 해제하고 프리 풀이 비어있는 경우, NVMe 장치는 링크드 리스트 엔트리가 즉시 SQ에 재할당될 수 있는지를 평가할 수 있다. 이러한 수정은 “알 수 없는 에이지” 기간을 제한할 수 있다.
본 개시의 일부 실시예들은, SQ TDB가 발생하고 프리 풀이 비어 있는 경우, 테일 SQ 링크드 리스트 엔트리는 새로운 테일 포인터에 재할당될 수 있다. NVMe 장치는 재할당된 링크드 리스트 엔트리가 상속할 수 있는 모든 SQ에 대한 “마지막 SQ TDB” 시간을 추적할 수 있다.
본 개시의 일부 실시예들에서, 다중-SQ 또는 테넌트 환경에서, 링크드 리스트 엔트리들은 SQ를 위해 예약될 수 있거나, 또는 SQ에 의해 이용되는 링크드 리스트 엔트리들의 수가 제한될 수 있다.
본 개시의 일부 실시예들에서, 하나의 추적기는 주어진 시간(예를 들어, 1 밀리초) 내에 발생하는 다수의 SQ TDB 이벤트들에 대해 이용될 수 있다. 이러한 수정은 타임스탬프의 정확도를 희생시키면서 리소스 압력(추적기들의 개수, 타임스탬프 비트들)을 감소시킬 수 있다.
본 개시의 일부 실시예들에서, 추가 데이터는 링크드 리스트 엔트리에 저장될 수 있다(예를 들어, 마지막 SQ TDB 시간 또는 시간 윈도우의 오버플로우들의 도어벨 카운트).
본 개시의 실시예들은 개선된 NVMe 명령 타임아웃 및 에이지 추적을 지원할 수 있다. 본 개시의 실시예들은 “SQ 엔트리 페치 중단” 문제들을 100 % 검출할 수 있다. 일반적인 장치 이용 사례들(제한된 수의 SQ들 및 SQ 크기)에서, 본 개시의 실시예들은 보다 정확한 엔드-투-엔드 명령 에이지 추적 및 명령 타임아웃 검출을 가능하게 할 수 있다. 본 개시의 실시예들은 디버그 또는 인-필드(더 큰 관심의 SQ들에 대해 더 많은 추적기들을 집중)를 위한 유연성을 가능하게 할 수 있다. 본 개시의 실시예들은 SQ 크기와 독립적인 하드웨어 리소스 크기를 지원할 수 있다. 본 개시의 실시예들은 확장될 수 있다(더 많은 에이지 추적기들=더 넓은 이용 사례 범위).
다음의 논의는 본 개시의 특정 양상들이 구현될 수 있는 적합한 장치 또는 장치들에 대한 간략하고 일반적인 설명을 제공하기 위해 의도된다. 장치 또는 장치들은 적어도 부분적으로 키보드, 마우스 등과 같은 통상적인 입력 장치들로부터의 입력뿐만 아니라 다른 장치들로부터 수신된 지시들, 가상 현실(VR) 환경과의 상호작용, 생체 인식 피드백 또는 기타 입력 신호에 의해 제어될 수 있다. 본 개시에서 이용된, “머신”이라는 용어는 단일 머신, 가상 머신 또는 통신적으로 결합된 머신들, 가상 머신들 또는 함께 동작하는 장치들의 시스템을 광범위하게 포함하도록 의도되었다. 예시적인 머신들은 개인용 컴퓨터, 워크스테이션들, 서버들, 휴대용 컴퓨터들, 휴대용 장치들, 전화기들, 태블릿들 등과 같은 컴퓨팅 장치들뿐만 아니라 자동차들, 기차들, 택시들 등과 같은 개인 또는 대중교통 수단과 같은 운송 장치들을 포함한다.
머신 또는 머신들은 프로그램가능 또는 비-프로그램 가능 로직 장치들 또는 어레이들, ASIC(Application Specific Integrated Circuit)들, 임베디드 컴퓨터들, 스마트 카드들 등과 같은 임베디드 컨트롤러들을 포함할 수 있다. 머신 또는 머신들은 네트워크 인터페이스, 모뎀 또는 기타 통신 연결을 통하는 것과 같이 하나 이상의 원격 머신들에 대한 하나 이상의 연결들을 활용할 수 있다. 머신들은 인트라넷, 인터넷, 근거리 통신망, 광역 통신망 등과 같은 물리적 및/또는 논리적 네트워크를 통해 상호연결될 수 있다. 통상의 기술자는 네트워크 통신이 무선 주파수(RF), 위성, 마이크로파, IEEE(Institute of Electrical and Electronics Engineers) 802.11, 블루투스®, 광학, 적외선, 케이블, 레이저 등을 포함하는 다양한 유선 및/또는 무선 단거리 또는 장거리 캐리어들 및 프로토콜들을 활용할 수 있음을 잘 알고 있을 것이다.
본 개시의 실시예들은 머신에 의해 액세스되는 경우 머신이 작업들을 수행하거나 추상 데이터 타입들 또는 저수준 하드웨어 컨텍스트들을 정의하는 결과들을 초래하는 함수들, 절차들, 데이터 구조들, 애플리케이션 프로그램들 등을 포함하는 연관된 데이터를 참조하거나 그와 함께 설명될 수 있다. 연관된 데이터는 예를 들어, 휘발성 및/또는 비휘발성 메모리(예를 들어, RAM, ROM 등) 또는 하드 드라이브들, 플로피 디스크들, 광학 스토리지, 테이프들, 플래시 메모리, 메모리 스틱들, 디지털 비디오디스크들, 생물학적 스토리지 등을 포함하는 기타 스토리지 장치들 및 그들의 관련 저장 매체에 저장될 수 있다. 연관된 데이터는 물리적 및/또는 논리적 네트워크를 포함하는 전송 환경들 등을 통해 패킷들, 직렬 데이터, 병렬 데이터, 전파 신호들 등의 형태로 전달될 수 있고, 압축된 또는 암호화된 포맷으로 이용될 수 있다. 연관된 데이터는 분산 환경에서 이용될 수 있고, 머신 액세스를 위해 지역적으로 및/또는 원격으로 저장될 수 있다.
본 개시의 실시예들은 하나 이상의 프로세서들에 의해 실행가능한 명령어들을 포함하는 유형적이고, 비일시적인 머신 판독 가능 매체를 포함할 수 있고, 명령어들은 본 개시에서 설명된 바와 같이 본 개시의 요소들을 수행하기 위한 명령어들을 포함한다.
상술한 방법들의 다양한 동작들은 다양한 하드웨어 및/또는 소프트웨어 구성요소(들), 회로들 및/또는 모듈(들)과 같은 동작들을 수행할 수 있는 임의의 적절한 수단들에 의해 수행될 수 있다. 소프트웨어는 논리 기능들을 수형하기 위한 실행가능한 명령어들의 정렬된 목록으로 구성될 수 있고, 단일 또는 다중 코어 프로세서 또는 프로세서 포함 시스템과 같은 명령어 실행 시스템 또는 장치에 의해 또는 이와 관련하여 이용하기 위한 임의의 “프로세서 판독 가능 매체”에 구현될 수 있다.
본 개시의 실시예들과 관련하여 설명된 방법 또는 알고리즘 및 기능들의 블록들 또는 단계들은 하드웨어, 프로세서에 의해 실행되는 소프트웨어 모듈 또는 이 둘의 조합으로 직접적으로 구현될 수 있다. 소프트웨어로 구현되는 경우, 기능들은 유형적이고 비일시적인 컴퓨터 판독 가능 매체에 하나 이상의 명령어 또는 코드로서 저장되거나 전송될 수 있다. 소프트웨어 모듈은 RAM(Random Access Memory), ROM(Read Only Memory), EPROM(Electrically Programmable ROM), EEPROM(Electrically Erasable Programmable ROM), 레지스터들, 하드디스크, 이동식 디스크, CD 롬 또는 통상의 기술자에게 알려진 다른 형태의 저장 매체 내에 존재할 수 있다.
예시된 실시예들을 참조하여 본 개시의 원리를 설명하고 예시하였으므로, 예시된 실시예들은 그러한 원리에서 벗어나지 않고 배치 및 세부사항이 변경될 수 있으며, 임의의 바람직한 방식으로 결합될 수 있음이 인식될 것이다. 그리고 상술한 논의는 특정 실시예에 초점을 맞추었지만 다른 구성들이 고려될 수 있다. 특히, “본 개시의 실시예들에 따른” 등과 같은 표현이 본 개시에서 이용되더라도, 이러한 문구는 일반적으로 실시예들의 가능성을 참조하기 위한 것이고, 본 개시를 특정한 실시예의 구성들로 제한하기 위한 것이 아니다. 본 개시에서 이용되는 바와 같이, 이들 용어들은 다른 실시예들로 결합 가능한 동일하거나 다른 실시예들을 참조할 수 있다.
상술한 예시적인 실시예들은 본 개시를 제한하는 것으로 해석되어서는 안 된다. 비록 몇 가지 실시예들이 설명되었지만, 통상의 기술자들은 본 개시의 새로운 가르침들과 이점들을 실질적으로 벗어나지 않고도 이러한 실시예들에 대한 많은 수정들이 가능하다는 것을 쉽게 인식할 것이다. 따라서 그러한 모든 수정들은 청구범위에 정의된 바와 같이 본 개시의 범위 내에 포함되도록 의도된다.
본 개시의 실시예들은, 이에 제한되지 않고 다음의 진술들로 확장될 수 있다.
진술 1. 본 개시의 일 실시예는 스토리지 장치를 포함한다.
상기 스토리지 장치는,
데이터를 위한 제1 스토리지;
호스트로부터 명령을 액세스하는 인터페이스;
상기 명령을 실행하는 컨트롤러; 및
제1 데이터 필드 및 제2 데이터 필드를 포함하는 엔트리를 위한 제2 스토리지를 포함한다. 상기 명령은 상기 데이터에 적용가능하고, 상기 제1 데이터 필드는 타임스탬프를 위한 것이고, 상기 제2 데이터 필드는 상기 명령에 대한 참조를 위한 것이다.
진술 2. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함한다. 상기 제2 스토리지는 적어도 하나의 SRAM(Static Random Access Memory) 또는 DRAM(Dynamic Random Access Memory)을 포함한다.
진술 3. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 제2 스토리지는 제2 엔트리를 포함한다.
진술 4. 본 개시의 일 실시예는 진술 3에 따른 상기 스토리지 장치를 포함하고, 상기 제2 스토리지는,
상기 엔트리를 포함하는 데이터 구조; 및
상기 제2 엔트리를 포함하는 엔트리 풀을 포함한다.
진술 5. 본 개시의 일 실시예는 진술 3에 따른 상기 스토리지 장치를 포함하고, 상기 제2 스토리지는,
상기 엔트리를 포함하는 제1 데이터 구조; 및
상기 제2 엔트리를 포함하는 제2 데이터 구조를 포함한다.
진술 6. 본 개시의 일 실시예는 진술 5에 따른 상기 스토리지 장치를 포함하고, 상기 제1 데이터 구조는 제1 서브미션 큐와 연관되고, 그리고 상기 제2 데이터 구조는 제2 서브미션 큐와 연관된다.
진술 7. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 스토리지 장치는 NVMe(Non-Volatile Memory Express) 스토리지 장치를 포함한다.
진술 8. 본 개시의 일 실시예는 진술 7에 따른 상기 스토리지 장치를 포함하고, 상기 NVMe 스토리지 장치는 NVMe 솔리드 스테이트 드라이브(SSD)를 포함한다.
진술 9. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 스토리지 장치는 상기 호스트로부터 상기 명령이 이용가능하다는 통지를 수신한다.
진술 10. 본 개시의 일 실시예는 진술 9에 따른 상기 스토리지 장치를 포함하고, 상기 스토리지 장치는 상기 호스트로부터 상기 통지로서 도어벨 이벤트(doorbell event)를 수신한다.
진술 11. 본 개시의 일 실시예는 진술 11에 따른 상기 스토리지 장치를 포함하고, 상기 스토리지 장치는 적어도 부분적으로 상기 호스트로부터 상기 명령이 이용가능하다는 상기 통지를 수신한 것에 기초하여 상기 엔트리를 데이터 구조에 추가한다.
진술 12. 본 개시의 일 실시예는 진술 11에 따른 상기 스토리지 장치를 포함하고, 상기 스토리지 장치는 적어도 부분적으로 상기 호스트로부터 상기 명령이 이용가능하다는 상기 통지를 수신한 것에 기초하여, 상기 타임스탬프를 상기 엔트리의 상기 제1 데이터 필드에 추가하고 상기 명령에 대한 상기 참조를 상기 엔트리의 상기 제2 데이터 필드에 추가한다.
진술 13. 본 개시의 일 실시예는 진술 11에 따른 상기 스토리지 장치를 포함하고, 상기 데이터 구조는 링크드 리스트 데이터 구조(linked list data structure)를 포함한다.
진술 14. 본 개시의 일 실시예는 진술 13에 따른 상기 스토리지 장치를 포함하고, 상기 컨트롤러는 상기 엔트리로부터 널 포인터(null pointer)를 설정하고(establish) 상기 링크드 리스트 데이터 구조의 제2 엔트리로부터 상기 엔트리에 대한 포인터를 설정한다.
진술 15. 본 개시의 일 실시예는 진술 13에 따른 상기 스토리지 장치를 포함하고, 상기 컨트롤러는 상기 링크드 리스트 데이터 구조의 테일 포인터(tail pointer)를 상기 엔트리에 대해 설정한다.
진술 16. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 컨트롤러는 서브미션 큐(submission queue)로부터 상기 명령에 액세스하는 명령 액세서(command accessor)를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 17. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 컨트롤러는 적어도 부분적으로 상기 명령을 실행한 것에 기초하여 상기 엔트리를 업데이트한다.
진술 18. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 참조는 카운트 또는 오프셋을 포함하고, 그리고 상기 컨트롤러는 적어도 부분적으로 상기 명령을 실행한 것에 기초하여 상기 카운트 또는 상기 오프셋을 감소시킨다.
진술 19. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 컨트롤러는 적어도 부분적으로 상기 명령을 실행한 것에 기초하여 상기 엔트리를 엔트리 풀(pool of entires)로 반환한다.
진술 20. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 에이지 계산기(age calculator)를 더 포함한다. 상기 에이지 계산기는 적어도 부분적으로 상기 엔트리의 상기 제1 데이터 필드의 상기 타임스탬프 및 제2 타임스탬프에 기초하여 상기 명령의 에이지를 결정한다.
진술 21. 본 개시의 일 실시예는 진술 20에 따른 상기 스토리지 장치를 포함하고, 상기 에이지 계산기는 적어도 상기 컨트롤러가 상기 명령을 실행한 것에 기초하여 상기 제2 타임스탬프를 결정한다.
진술 22. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 엔트리는,
제2 타임스탬프를 위한 제3 데이터 필드; 및
카운터(counter)를 위한 제4 데이터 필드를 포함한다.
진술 23. 본 개시의 일 실시예는 진술 22에 따른 상기 스토리지 장치를 포함하고, 상기 컨트롤러는 상기 제2 타임스탬프를 결정하는 타이머(timer)를 포함한다.
진술 24. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 컨트롤러는 타임아웃 검출기(timeout detector)를 포함하고, 상기 타임아웃 검출기는 적어도 부분적으로 상기 엔트리에 기초하여 타임아웃이 발생했는지를 결정한다.
진술 25. 본 개시의 일 실시예는 진술 24에 따른 상기 스토리지 장치를 포함하고, 상기 타임아웃 검출기는,
제2 타임스탬프를 결정하는 타임스탬프 생성기(timestamp generator); 및
상기 타임스탬프와 상기 제2 타임스탬프 사이의 차이를 결정하고, 상기 차이를 임계치와 비교하는 비교기(comparator)를 포함한다.
진술 26. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 상기 엔트리는 제2 명령과 연관된다.
진술 27. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고,
상기 스토리지 장치는 서브미션 큐 디스크립터(submission queue descriptor)를 더 포함하고, 그리고
상기 컨트롤러는 상기 타임스탬프 및 상기 참조를 상기 엔트리로부터 상기 서브미션 큐 디스크립터로 복사하고, 적어도 부분적으로 상기 컨트롤러가 상기 명령을 실행한 것에 기초하여 상기 엔트리를 상기 엔트리 풀로 반환한다.
진술 28. 본 개시의 일 실시예는 진술 27에 따른 상기 스토리지 장치를 포함하고,
상기 제2 스토리지는 제1 데이터 구조 및 제2 데이터 구조를 더 포함하고,
상기 스토리지 장치는 제2 서브미션 큐 디스크립터를 더 포함하고,
상기 서브미션 큐 디스크립터는 상기 제1 데이터 구조와 연관되고, 그리고
상기 제2 서브미션 큐 디스크립터는 상기 제2 데이터 구조와 연관된다.
진술 29. 본 개시의 일 실시예는 진술 1에 따른 상기 스토리지 장치를 포함하고, 버퍼를 더 포함한다. 상기 버퍼는 제2 타임스탬프를 위한 제3 데이터 필드를 포함하고, 상기 버퍼는 제2 명령과 연관된다.
진술 30. 본 개시의 일 실시예는 진술 29에 따른 상기 스토리지 장치를 포함하고, 상기 버퍼는 서브미션 큐의 제2 명령에 대한 제2 참조를 위한 제4 데이터 필드를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 31. 본 개시의 일 실시예는 진술 30에 따른 상기 스토리지 장치를 포함하고, 상기 제2 참조는 상기 제2 명령을 포함하는 상기 서브미션 큐의 요소(element)를 식별하는 인덱스(index)를 포함한다.
진술 32. 본 개시의 일 실시예는 진술 29에 따른 상기 스토리지 장치를 포함하고, 제2 버퍼를 더 포함한다. 상기 제2 버퍼는 제3 타임스탬프를 위한 제4 데이터 필드를 포함하고, 상기 제2 버퍼는 제3 명령과 연관된다.
진술 33. 본 개시의 일 실시예는 진술 32에 따른 상기 스토리지 장치를 포함하고, 상기 제2 버퍼는 서브미션 큐의 상기 제3 명령에 대한 제3 참조를 위한 제5 데이터 필드를 더 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 34. 본 개시의 일 실시예는 진술 33에 따른 상기 스토리지 장치를 포함하고, 상기 제3 참조는 상기 제3 명령을 포함하는 상기 서브미션 큐의 요소를 식별하는 인덱스를 포함한다.
진술 35. 본 개시의 일 실시예는 진술 29에 따른 상기 스토리지 장치를 포함하고,
상기 제2 스토리지는 제1 데이터 구조 및 제2 데이터 구조를 더 포함하고,
상기 스토리지 장치는 제2 버퍼를 포함하고,
상기 버퍼는 상기 제1 데이터 구조와 연관되고, 그리고
상기 제2 버퍼는 상기 제2 데이터 구조와 연관된다.
진술 36. 본 개시의 일 실시예는 방법을 포함한다. 상기 방법은,
스토리지 장치에서 상기 호스트로부터 명령이 이용가능하다는 통지를 수신하는 단계;
적어도 부분적으로 상기 통지에 기초하여 타임스탬프를 결정하는 단계;
상기 스토리지 장치의 스토리지의 엔트리 풀로부터 엔트리를 선택하는 단계;
상기 엔트리의 상기 타임스탬프를 저장하는 단계;
상기 명령을 상기 엔트리와 연관시키는 단계; 및
상기 엔트리를 상기 스토리지 장치의 데이터 구조로 추가하는 단계를 포함한다.
진술 37. 본 개시의 일 실시예는 진술 36에 따른 상기 방법을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 스토리지 장치에서 상기 호스트로부터 도어벨 이벤트를 수신하는 단계를 포함한다.
진술 38. 본 개시의 일 실시예는 진술 37에 따른 상기 방법을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 도어벨 이벤트를 수신하는 단계는, 상기 호스트로부터 상기 테일 포인터에 대한 업데이트를 수신하는 단계를 포함한다.
진술 39. 본 개시의 일 실시예는 진술 36에 따른 상기 방법을 포함하고, 상기 명령을 상기 엔트리와 연관시키는 단계는, 상기 엔트리로부터 상기 명령으로의 참조를 설정하는 단계를 포함한다.
진술 40. 본 개시의 일 실시예는 진술 39에 따른 상기 방법을 포함하고, 상기 엔트리로부터 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 엔트리로부터 상기 명령으로의 상기 참조를 서브미션 큐에 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 41. 본 개시의 일 실시예는 진술 40에 따른 상기 방법을 포함하고,
상기 호스트는 제2 서브미션 큐를 더 포함하고,
상기 데이터 구조는 상기 서브미션 큐와 연관되고, 그리고
상기 스토리지 장치는 상기 제2 서브미션 큐와 연관된 제2 데이터 구조를 포함한다.
진술 42. 본 개시의 일 실시예는 진술 41에 따른 상기 방법을 포함하고,
상기 스토리지 장치에서 상기 호스트로부터 상기 제2 서브미션 큐에 있는 제2 명령이 이용가능하다는 제2 통지를 수신하는 단계;
적어도 부분적으로 상기 제2 통지에 기초하여 제2 타임스탬프를 결정하는 단계;
상기 스토리지 장치의 상기 스토리지의 상기 엔트리 풀로부터 제2 엔트리를 선택하는 단계;
상기 제2 타임스탬프를 상기 제2 엔트리에 저장하는 단계;
상기 제2 명령을 상기 제2 엔트리와 연관시키는 단계; 및
상기 제2 엔트리를 상기 스토리지 장치의 상기 제2 데이터 구조에 추가하는 단계를 더 포함한다.
진술 43. 본 개시의 일 실시예는 진술 39에 따른 상기 방법을 포함하고, 상기 엔트리로부터 상기 명령으로의 상기 참조를 설정하는 단계는,
상기 명령을 포함하는 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 44. 본 개시의 일 실시예는 진술 36에 따른 상기 방법을 포함하고, 상기 스토리지 장치의 스토리지의 상기 엔트리 풀로부터 상기 엔트리를 선택하는 단계는, 상기 엔트리를 초기화하는 단계를 포함한다.
진술 45. 본 개시의 일 실시예는 진술 44에 따른 상기 방법을 포함하고, 상기 엔트리를 초기화하는 단계는 상기 엔트리에서 참조를 클리어링 (clearing)하는 단계를 포함한다.
진술 46. 본 개시의 일 실시예는 진술 36에 따른 상기 방법을 포함하고, 상기 엔트리를 상기 스토리지 장치의 데이터 구조에 추가하는 단계는, 상기 엔트리를 링크드 리스트 데이터 구조에 추가하는 단계를 포함한다.
진술 47. 본 개시의 일 실시예는 진술 46에 따른 상기 방법을 포함하고, 상기 엔트리를 상기 링크드 리스트 데이터 구조에 추가하는 단계는,
상기 엔트리로부터 널 참조(null reference)를 설정하는 단계; 및
상기 링크드 리스트 데이터 구조의 제2 엔트리로부터 상기 엔트리로의 참조를 설정하는 단계를 포함한다.
진술 48. 본 개시의 일 실시예는 진술 46에 따른 상기 방법을 포함하고, 상기 엔트리를 상기 링크드 리스트 데이터 구조에 추가하는 단계는,
상기 링크드 리스트 데이터 구조의 테일 포인터를 상기 엔트리로 설정하는 단계를 포함한다.
진술 49. 본 개시의 일 실시예는 진술 36에 따른 상기 방법을 포함하고,
상기 스토리지 장치에 의해 상기 명령을 검색하는 단계;
상기 엔트리로부터 상기 타임스탬프에 액세스하는 단계;
결과를 생성하기 위한 상기 명령을 실행하는 단계;
적어도 부분적으로 상기 결과에 기초하여 제2 타임스탬프를 결정하는 단계;
적어도 부분적으로 상기 타임스탬프 및 상기 제2 타임스탬프에 기초하여 상기 명령의 에이지를 결정하는 단계;
상기 스토리지 장치로부터 상기 호스트로 상기 결과를 반환하는 단계; 및
상기 스토리지 장치로부터 상기 호스트로 상기 명령의 상기 에이지를 반환하는 단계를 포함한다.
진술 50. 본 개시의 일 실시예는 진술 49에 따른 상기 방법을 포함하고, 상기 엔트리를 상기 엔트리 풀로 반환하는 단계를 더 포함한다.
진술 51. 본 개시의 일 실시예는 진술 50에 따른 상기 방법을 포함하고, 상기 데이터 구조는 링크드 리스트 데이터 구조를 포함하고, 그리고
상기 엔트리를 상기 엔트리 풀로 반환하는 단계는, 적어도 부분적으로 상기 엔트리에 기초하여 상기 링크드 리스트 데이터 구조의 헤드 포인터를 제2 엔트리로 설정하는 단계를 포함한다.
진술 52. 본 개시의 일 실시예는 진술 49에 따른 상기 방법을 포함하고, 적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리를 업데이트하는 단계를 더 포함한다.
진술 53. 본 개시의 일 실시예는 진술 52에 따른 상기 방법을 포함하고,
상기 엔트리는 카운트 또는 오프셋을 포함하는 참조를 포함하고, 그리고
적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리를 업데이트하는 단계는, 적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리의 상기 카운트 또는 상기 오프셋을 감소시키는 단계를 포함한다.
진술 54. 본 개시의 일 실시예는 방법을 포함한다. 상기 방법은,
스토리지 장치에서 호스트로부터 제1 명령이 이용가능하다는 통지를 수신하는 단계;
엔트리 풀이 비어있다고 결정하는 단계;
데이터 구조에서 제2 명령과 연관된 엔트리를 식별하는 단계; 및
상기 제1 명령을 상기 엔트리와 연관시키는 단계를 포함한다.
진술 55. 본 개시의 일 실시예는 진술 54에 따른 상기 방법을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 제1 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 스토리지 장치에서 상기 호스트로부터 도어벨 이벤트를 수신하는 단계를 포함한다.
진술 56. 본 개시의 일 실시예는 진술 55에 따른 상기 방법을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 도어벨 이벤트를 수신하는 단계는 상기 호스트로부터 테일 포인터에 대한 업데이트를 수신하는 단계를 포함한다.
진술 57. 본 개시의 일 실시예는 진술 54에 따른 상기 방법을 포함하고, 상기 데이터 구조에서 상기 엔트리를 식별하는 단계는,
상기 엔트리가 이용가능하다고 결정하는 단계; 및
타임스탬프를 상기 엔트리에 저장하는 단계를 포함한다.
진술 58. 본 개시의 일 실시예는 진술 57에 따른 상기 방법을 포함하고, 상기 제1 명령을 상기 엔트리와 연관시키는 단계는, 상기 제1 명령 및 제3 명령을 상기 엔트리와 연관시키는 단계를 포함한다.
진술 59. 본 개시의 일 실시예는 진술 57에 따른 상기 방법을 포함하고, 상기 제1 명령을 상기 엔트리와 연관시키는 단계는, 상기 엔트리로부터 상기 제1 명령으로의 참조를 설정하는 단계를 포함한다.
진술 60. 본 개시의 일 실시예는 진술 59에 따른 상기 방법을 포함하고, 상기 엔트리로부터 상기 제1 명령으로의 상기 참조를 설정하는 단계는, 상기 엔트리로부터 상기 제1 명령으로의 상기 참조를 서브미션 큐에 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 61. 본 개시의 일 실시예는 진술 59에 따른 상기 방법을 포함하고, 상기 엔트리로부터 상기 제1 명령으로의 상기 참조를 설정하는 단계는, 상기 제1 명령을 포함하는 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 62. 본 개시의 일 실시예는 진술 57에 따른 상기 방법을 포함하고, 상기 데이터 구조에서 상기 엔트리를 식별하는 단계는, 링크드 리스트 데이터 구조에서 상기 엔트리를 식별하는 단계를 더 포함한다.
진술 63. 본 개시의 일 실시예는 진술 62에 따른 상기 방법을 포함하고, 상기 제1 명령을 상기 엔트리에 연관시키는 단계는, 상기 엔트리를 상기 링크드 리스트 데이터 구조의 마지막(end)으로 이동시키는 단계를 포함한다.
진술 64. 본 개시의 일 실시예는 진술 62에 따른 상기 방법을 포함하고, 상기 제1 명령을 상기 엔트리와 연관시키는 단계는,
상기 엔트리로부터 널 참조를 설정하는 단계; 및
상기 링크드 리스트 데이터의 구조의 제2 엔트리로부터 상기 엔트리로의 참조를 설정하는 단계를 포함한다.
진술 65. 본 개시의 일 실시예는 진술 62에 따른 상기 방법을 포함하고, 상기 제1 명령을 상기 엔트리와 연관시키는 단계는, 상기 링크드 리스트 데이터 구조의 테일 포인터를 상기 엔트리로 설정하는 단계를 포함한다.
진술 66. 본 개시의 일 실시예는 진술 57에 따른 상기 방법을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 제1 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 제1 명령을 위한 상기 타임스탬프를 결정하는 단계를 포함한다.
진술 67. 본 개시의 일 실시예는 진술 66에 따른 상기 방법을 포함하고, 상기 제1 명령을 위한 상기 타임스탬프를 결정하는 단계는, 적어도 부분적으로 상기 스토리지 장치가 상기 호스트로부터 상기 제1 명령이 이용가능하다는 통지를 수신한 것에 기초하여 상기 타임스탬프를 결정하는 단계를 포함한다.
진술 68. 본 개시의 일 실시예는 진술 66에 따른 상기 방법을 포함하고, 상기 방법은,
상기 명령을 검색하는 단계; 및
상기 제1 명령을 위한 상기 타임스탬프를 결정하는 단계를 더 포함하고, 상기 제1 명령을 위한 상기 타임스탬프를 결정하는 단계는 적어도 부분적으로 상기 명령을 검색한 것에 기초하여 상기 타임스탬프를 결정하는 단계를 포함한다.
진술 69. 본 개시의 일 실시예는 진술 54에 따른 상기 방법을 포함하고, 상기 데이터 구조에서 상기 엔트리를 식별하는 단계는,
상기 제2 명령을 식별하는 단계; 및
적어도 부분적으로 상기 제2 명령에 기초하여 상기 데이터 구조에서 상기 엔트리를 식별하는 단계를 포함한다.
진술 70. 본 개시의 일 실시예는 진술 69에 따른 상기 방법을 포함하고, 상기 엔트리는 적어도 부분적으로 상기 제2 명령에 기초한 타임스탬프를 포함한다.
진술 71. 본 개시의 일 실시예는 진술 69에 따른 상기 방법을 포함하고, 적어도 부분적으로 상기 제2 명령에 기초하여 상기 데이터 구조에서 상기 엔트리를 식별하는 단계는, 적어도 부분적으로 상기 제2 명령에 기초하여 링크드 리스트 데이터 구조에서 상기 엔트리를 식별하는 단계를 더 포함한다.
진술 72. 본 개시의 일 실시예는 진술 69에 따른 상기 방법을 포함하고,
상기 스토리지 장치에 의해 제3 명령을 검색하는 단계;
상기 제3 명령과 연관된 제2 엔트리에 액세스하는 단계;
상기 제2 엔트리의 제1 타임스탬프 및 상기 제2 엔트리의 참조를 서브미션 큐 디스크립터로 복사하는 단계;
상기 제2 엔트리를 상기 엔트리 풀로 반환하는 단계;
결과를 생성하기 위한 상기 제3 명령을 실행하는 단계;
적어도 부분적으로 상기 결과에 기초하여 제2 타임스탬프를 결정하는 단계;
적어도 부분적으로 상기 제1 타임스탬프 및 상기 제2 타임스탬프에 기초하여 상기 제3 명령의 에이지를 결정하는 단계;
상기 스토리지 장치로부터 상기 호스트로 상기 결과를 반환하는 단계; 및
상기 스토리지 장치로부터 상기 호스트로 상기 제3 명령의 상기 에이지를 반환하는 단계를 포함한다.
진술 73. 본 개시의 일 실시예는 진술 72에 따른 상기 방법을 포함하고, 상기 제2 엔트리의 상기 제1 타임스탬프 및 상기 제2 엔트리의 상기 참조를 상기 서브미션 큐 디스크립터로 복사하는 단계는, 상기 제2 엔트리의 상기 제1 타임스탬프 및 상기 제2 엔트리의 상기 명령을 포함하는 서브미션 큐의 요소를 식별하는 인덱스를 서브미션 큐 디스크립터로 복사하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 74. 본 개시의 일 실시예는 진술 72에 따른 상기 방법을 포함하고, 적어도 부분적으로 상기 결과를 생성하기 위한 상기 제3 명령을 실행한 것에 기초하여 상기 서브미션 큐 디스크립터를 업데이트하는 단계를 더 포함한다.
진술 75. 본 개시의 일 실시예는 진술 74에 따른 상기 방법을 포함하고, 상기 참조는 카운트 또는 오프셋을 포함하고, 그리고
적어도 부분적으로 상기 결과를 생성하기 위한 상기 제3 명령을 실행한 것에 기초하여 서브미션 큐 디스크립터를 업데이트하는 단계는, 적어도 부분적으로 상기 결과를 생성하기 위한 상기 제3 명령을 실행한 것에 기초하여 상기 서브미션 큐 디스크립터의 상기 카운트 또는 상기 오프셋을 감소시키는 단계를 포함한다.
진술 76. 본 개시의 일 실시예는 방법을 포함하고, 상기 방법은,
스토리지 장치에서 호스트로부터 명령이 이용가능하다는 통지를 수신하는 단계;
엔트리 풀이 비어있다고 결정하는 단계;
적어도 부분적으로 상기 통지를 수신한 것에 기초하여 타임스탬프를 결정하는 단계;
상기 타임스탬프를 버퍼에 저장하는 단계; 및
상기 명령을 상기 버퍼와 연관시키는 단계를 포함한다.
진술 77. 본 개시의 일 실시예는 진술 76에 따른 상기 방법을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 스토리지 장치에서 상기 호스트로부터 도어벨 이벤트를 수신하는 단계를 포함한다.
진술 78. 본 개시의 일 실시예는 진술 77에 따른 상기 방법을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 도어벨 이벤트를 수신하는 단계는, 상기 호스트로부터 테일 포인터에 대한 업데이트를 수신하는 단계를 포함한다.
진술 79. 본 개시의 일 실시예는 진술 76에 따른 상기 방법을 포함하고, 상기 명령을 상기 버퍼와 연관시키는 단계는 상기 버퍼로부터 상기 명령으로의 참조를 설정하는 단계를 포함한다.
진술 80. 본 개시의 일 실시예는 진술 79에 따른 상기 방법을 포함하고, 상기 버퍼로부터 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 버퍼로부터 서브미션 큐의 상기 명령으로의 상기 참조를 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 81. 본 개시의 일 실시예는 진술 79에 따른 상기 방법을 포함하고, 상기 버퍼로부터 상기 서브미션 큐의 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 명령을 포함하는 상기 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함한다.
진술 82. 본 개시의 일 실시예는 진술 76에 따른 상기 방법을 포함하고,
상기 스토리지 장치에서 상기 호스트로부터 제2 명령이 이용가능하다는 제2 통지를 수신하는 단계;
상기 엔트리 풀이 비어있다고 결정하는 단계;
적어도 부분적으로 상기 제2 통지를 수신한 것에 기초하여 제2 타임스탬프를 결정하는 단계;
상기 제2 타임스탬프를 제2 버퍼에 저장하는 단계; 및
상기 제2 명령을 상기 제2 버퍼와 연관시키는 단계를 포함한다.
진술 83. 본 개시의 일 실시예는 진술 82에 따른 상기 방법을 포함하고, 상기 제2 명령을 상기 제2 버퍼와 연관시키는 단계는, 상기 제2 버퍼로부터 서브미션 큐의 상기 제2 명령으로의 참조를 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 84. 본 개시의 일 실시예는 진술 83에 따른 상기 방법을 포함하고, 상기 제2 버퍼로부터 상기 서브미션 큐의 상기 제2 명령으로의 상기 참조를 설정하는 단계는, 상기 제2 명령을 포함하는 상기 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함한다.
진술 85. 본 개시의 일 실시예는 진술 82에 따른 상기 방법을 포함하고, 상기 명령은 서브미션 큐에 있고, 상기 호스트는 상기 서브미션 큐를 포함하고, 상기 제2 명령은 상기 서브미션 큐에 있다.
진술 86. 본 개시의 일 실시예는 진술 82에 따른 상기 방법을 포함하고, 상기 명령은 서브미션 큐에 있고, 상기 호스트는 상기 서브미션 큐를 포함하고, 상기 제2 명령은 제2 서브미션 큐에 있고, 상기 호스트는 상기 제2 서브미션 큐를 포함한다.
진술 87. 본 개시의 일 실시예는 방법을 포함한다. 상기 방법은,
스토리지 장치에서 시간 윈도우(time window)를 시작하는 단계;
상기 스토리지 장치에서 상기 시간 윈도우 동안 상기 호스트로부터 제1 명령이 이용가능하다는 통지를 수신하는 단계;
상기 스토리지 장치의 스토리지의 엔트리 풀로부터 엔트리를 선택하는 단계;
상기 시간 윈도우와 연관된 타임스탬프를 상기 엔트리에 저장하는 단계;
상기 명령과 상기 엔트리를 연관시키는 단계;
상기 엔트리를 상기 스토리지 장치의 데이터 구조에 추가하는 단계; 및
상기 스토리지 장치에서 상기 시간 윈도우를 종료하는 단계를 포함한다.
진술 88. 본 개시의 일 실시예는 진술 87에 따른 상기 방법을 포함하고, 상기 타임스탬프는 상기 시간 윈도우의 시작 시간 또는 상기 시작 윈도우의 종료 시간 중 적어도 하나를 포함한다.
진술 89. 본 개시의 일 실시예는 진술 87에 따른 상기 방법을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 스토리지 장치에서 상기 호스트로부터 도어벨 이벤트를 수신하는 단계를 포함한다.
진술 90. 본 개시의 일 실시예는 진술 98에 따른 상기 방법을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 도어벨 이벤트를 수신하는 단계는, 상기 호스트로부터 테일 포인터에 대한 업데이트를 수신하는 단계를 포함한다.
진술 91. 본 개시의 일 실시예는 진술 87에 따른 상기 방법을 포함하고,
상기 스토리지 장치에서 상기 호스트로부터 상기 시간 윈도우 동안 제2 명령이 이용가능하다는 제2 통지를 수신하는 단계; 및
상기 제2 명령과 상기 엔트리를 연관시키는 단계를 포함한다.
진술 92. 본 개시의 일 실시예는 진술 87에 따른 상기 방법을 포함하고, 상기 명령과 상기 엔트리를 연관시키는 단계는 상기 엔트리로부터 상기 명령으로의 참조를 설정하는 단계를 포함한다.
진술 93. 본 개시의 일 실시예는 진술 92에 따른 상기 방법을 포함하고, 상기 엔트리로부터 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 엔트리로부터 서브미션 큐의 상기 명령으로의 상기 참조를 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 94. 본 개시의 일 실시예는 진술 93에 따른 상기 방법을 포함하고, 상기 엔트리로부터 상기 서브미션 큐의 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 명령을 포함하는 상기 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 95. 본 개시의 일 실시예는 진술 92에 따른 상기 방법을 포함하고,
상기 호스트는 제2 서브미션 큐를 더 포함하고,
상기 데이터 구조는 상기 서브미션 큐와 연관되고,
상기 스토리지 장치는 상기 제2 서브미션 큐와 연관된 제2 데이터 구조를 포함한다.
진술 96. 본 개시의 일 실시예는 진술 95에 따른 상기 방법을 포함하고,
상기 스토리지 장치에서 제2 시간 윈도우를 시작하는 단계;
상기 스토리지 장치에서 상기 호스트로부터 상기 제2 시간 윈도우 동안 제2 명령이 이용가능하다는 제2 통지를 수신하는 단계;
상기 스토리지 장치의 상기 스토리지의 엔트리 풀로부터 제2 엔트리를 선택하는 단계;
제2 타임스탬프를 상기 제2 엔트리에 저장하는 단계;
상기 제2 명령을 상기 제2 엔트리와 연관시키는 단계;
상기 제2 엔트리를 상기 스토리지 장치의 상기 제2 데이터 구조에 추가하는 단계; 및
상기 스토리지 장치의 상기 제2 시간 윈도우를 종료하는 단계를 더 포함한다.
진술 97. 본 개시의 일 실시예는 진술 96에 따른 상기 방법을 포함하고, 상기 제1 시간 윈도우는 상기 제2 시간 윈도우이다.
진술 98. 본 개시의 일 실시예는 진술 87에 따른 상기 방법을 포함하고, 상기 스토리지 장치의 스토리지의 엔트리 풀로부터 상기 엔트리를 선택하는 단계는, 상기 엔트리를 초기화하는 단계를 포함한다.
진술 99. 본 개시의 일 실시예는 진술 98에 따른 상기 방법을 포함하고, 상기 엔트리를 초기화하는 단계는, 상기 엔트리에서 참조를 클리어링하는 단계를 포함한다.
진술 100. 본 개시의 일 실시예는 진술 87에 따른 상기 방법을 포함하고, 상기 엔트리를 상기 스토리지 장치의 데이터 구조에 추가하는 단계는, 상기 엔트리를 링크드 리스트 데이터 구조에 추가하는 단계를 포함한다.
진술 101. 본 개시의 일 실시예는 진술 100에 따른 상기 방법을 포함하고, 상기 엔트리를 상기 링크드 리스트 데이터 구조에 추가하는 단계는,
상기 엔트리로부터 널 참조를 설정하는 단계; 및
상기 링크드 리스트의 제2 엔트리로부터 상기 엔트리로의 참조를 설정하는 단계를 포함한다.
진술 102. 본 개시의 일 실시예는 진술 100에 따른 상기 방법을 포함하고, 상기 엔트리를 상기 링크드 리스트 데이터 구조에 추가하는 단계는, 상기 링크드 리스트 데이터 구조의 테일 포인터를 상기 엔트리로 설정하는 단계를 포함한다.
진술 103. 본 개시의 일 실시예는 진술 87에 따른 상기 방법을 포함하고,
상기 스토리지 장치에 의해 상기 명령을 검색하는 단계;
상기 엔트리로부터 상기 타임스탬프에 액세스하는 단계;
결과를 생성하기 위한 상기 명령을 실행하는 단계;
적어도 부분적으로 상기 결과에 기초하여 제2 타임스탬프를 결정하는 단계;
적어도 부분적으로 상기 타임스탬프 및 상기 제2 타임스탬프에 기초하여 상기 명령의 에이지를 결정하는 단계;
상기 스토리지 장치로부터 상기 호스트로 상기 결과를 반환하는 단계; 및
상기 스토리지 장치로부터 상기 호스트로 상기 명령의 상기 에이지를 반환하는 단계를 포함한다.
진술 104. 본 개시의 일 실시예는 진술 103에 따른 상기 방법을 포함하고, 상기 엔트리를 상기 엔트리 풀로 반환하는 단계를 더 포함한다.
진술 105. 본 개시의 일 실시예는 진술 104에 따른 상기 방법을 포함하고,
상기 데이터 구조는 링크드 리스트 데이터 구조를 포함하고,
상기 엔트리를 상기 엔트리 풀로 반환하는 단계는, 적어도 부분적으로 상기 엔트리에 기초하여 상기 링크드 리스트 데이터 구조의 헤드 포인터를 제2 엔트리로 설정하는 단계를 포함한다.
진술 106. 본 개시의 일 실시예는 진술 103에 따른 상기 방법을 포함하고, 적어도 부분적으로 상기 결과를 생성하기 위한 상기 명령을 실행한 것에 기초하여 상기 엔트리를 업데이트하는 단계를 더 포함한다.
진술 107. 본 개시의 일 실시예는 진술 106에 따른 상기 방법을 포함하고,
상기 엔트리는 카운트 또는 오프셋을 포함하는 참조를 포함하고,
적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리를 업데이트하는 단계는, 적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리의 상기 카운트 또는 상기 오프셋을 감소시키는 단계를 포함한다.
진술 108. 본 개시의 일 실시예는 방법을 포함한다. 상기 방법은,
스토리지 장치에서 데이터 구조의 엔트리에 액세스하는 단계;
상기 엔트리로부터 제1 타임스탬프를 결정하는 단계;
제2 타임스탬프를 결정하는 단계; 및
적어도 부분적으로 상기 제1 타임스탬프 및 상기 제2 타임스탬프에 기초하여 타임아웃이 발생했음을 결정하는 단계를 포함한다.
진술 109. 본 개시의 일 실시예는 진술 108에 따른 상기 방법을 포함하고, 적어도 부분적으로 상기 제1 타임스탬프 및 상기 제2 타임스탬프에 기초하여 상기 타임아웃이 발생했음을 결정하는 단계는,
임계치를 결정하는 단계;
상기 제1 타임스탬프 및 상기 제2 타임스탬프 사이의 차이를 결정하는 단계; 및
적어도 부분적으로 상기 차이 및 상기 임계치에 기초하여 상기 타임아웃이 발생했음을 결정하는 단계를 포함한다.
진술 110. 본 개시의 일 실시예는 진술 108에 따른 상기 방법을 포함하고, 상기 스토리지 장치로부터 호스트로 상기 타이아웃을 보고하는 단계를 더 포함한다.
진술 111. 본 개시의 일 실시예는 비일시적 저장 매체를 포함하는 물품을 포함하고, 상기 비일시적 저장 매체는 장치에 의해 실행되는 경우 방법을 수행하게 하는 명령들을 저장하고, 상기 방법은,
스토리지 장치에서 호스트로부터 명령이 이용가능하다는 통지를 수신하는 단계;
적어도 부분적으로 상기 통지에 기초하여 타임스탬프를 결정하는 단계;
상기 스토리지 장치의 스토리지의 엔트리 풀로부터 엔트리를 선택하는 단계;
상기 타임스탬프를 상기 엔트리에 저장하는 단계;
상기 명령을 상기 엔트리와 연관시키는 단계; 및
상기 엔트리를 상기 스토리지 장치의 데이터 구조에 추가하는 단계를 포함한다.
진술 112. 본 개시의 일 실시예는 진술 111의 상기 물품을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 스토리지 장치에서 상기 호스트로부터 도어벨 이벤트를 수신하는 단계를 포함한다.
진술 113. 본 개시의 일 실시예는 진술 112에 따른 상기 물품을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 도어벨 이벤트를 수신하는 단계는, 상기 호스트로부터 테일 포인터에 대한 업데이트를 수신하는 단계를 포함한다.
진술 114. 본 개시의 일 실시예는 진술 111에 따른 상기 물품을 포함하고, 상기 명령을 상기 엔트리와 연관시키는 단계는, 상기 엔트리로부터 상기 명령으로의 참조를 설정하는 단계를 포함한다.
진술 115. 본 개시의 일 실시예는 진술 114에 따른 상기 물품을 포함하고, 상기 엔트리로부터 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 엔트리로부터 서브미션 큐의 상기 명령으로의 상기 참조를 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 116. 본 개시의 일 실시예는 진술 115에 따른 상기 물품을 포함하고,
상기 호스트는 제2 서브미션 큐를 더 포함하고,
상기 데이터 구조는 상기 서브미션 큐와 연관되고,
상기 스토리지 장치는 상기 제2 서브미션 큐와 연관된 제2 데이터 구조를 포함한다.
진술 117. 본 개시의 일 실시예는 진술 116에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은,
상기 스토리지 장치에서 상기 호스트로부터 상기 제2 서브미션 큐에 있는 제2 명령이 이용가능하다는 제2 통지를 수신하는 단계;
적어도 부분적으로 상기 제2 통지에 기초하여 제2 타임스탬프를 결정하는 단계;
상기 스토리지 장치의 상기 스토리지의 상기 엔트리 풀로부터 제2 엔트리를 선택하는 단계;
상기 제2 타임스탬프를 상기 제2 엔트리에 저장하는 단계;
상기 제2 명령을 상기 제2 엔트리와 연관시키는 단계; 및
상기 제2 엔트리를 상기 스토리지 장치의 상기 제2 데이터 구조로 추가하는 단계를 더 포함한다.
진술 118. 본 개시의 일 실시예는 진술 114에 따른 상기 물품을 포함하고, 상기 엔트리로부터 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 명령을 포함하는 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함하고, 상기 호스트는 서브미션 큐를 포함한다.
진술 119. 본 개시의 일 실시예는 진술 111에 따른 상기 물품을 포함하고, 상기 스토리지 장치의 스토리지의 상기 엔트리 풀로부터 상기 엔트리를 선택하는 단계는, 상기 엔트리를 초기화하는 단계를 포함한다.
진술 120. 본 개시의 일 실시예는 진술 119에 따른 상기 물품을 포함하고, 상기 엔트리를 초기화하는 단계는, 상기 엔트리에서 참조를 클리어링하는 단계를 포함한다.
진술 121. 본 개시의 일 실시예는 진술 111에 따른 상기 물품을 포함하고, 상기 엔트리를 상기 스토리지 장치의 데이터 구조에 추가하는 단계는, 상기 엔트리를 링크드 리스트 데이터 구조에 추가하는 단계를 포함한다.
진술 122. 본 개시의 일 실시예는 진술 121에 따른 상기 물품을 포함하고, 상기 엔트리를 상기 링크드 리스트 데이터 구조에 추가하는 단계는,
상기 엔트리로부터 널 참조를 설정하는 단계; 및
상기 링크드 리스트 데이터 구조의 제2 엔트리로부터 상기 엔트리로의 참조를 설정하는 단계를 포함한다.
진술 123. 본 개시의 일 실시예는 진술 121에 따른 상기 물품을 포함하고, 상기 엔트리를 상기 링크드 리스트 데이터 구조에 추가하는 단계는, 상기 링크드 리스트 데이터 구조의 테일 포인터를 상기 엔트리로 설정하는 단계를 포함한다.
진술 124. 본 개시의 일 실시예는 진술 111에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은,
상기 스토리지 장치에 의해 상기 명령을 검색하는 단계;
상기 엔트리로부터 상기 타임스탬프에 액세스하는 단계;
결과를 생성하기 위해 상기 명령을 실행하는 단계;
적어도 부분적으로 상기 결과에 기초하여 제2 타임스탬프를 결정하는 단계;
적어도 부분적으로 상기 타임스탬프 및 상기 제2 타임스탬프에 기초하여 상기 명령의 에이지를 결정하는 단계;
상기 스토리지 장치로부터 상기 호스트로 상기 결과를 반환하는 단계; 및
상기 스토리지 장치로부터 상기 호스트로 상기 명령의 상기 에이지를 반환하는 단계를 더 포함한다.
진술 125. 본 개시의 일 실시예는 진술 124에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은, 상기 엔트리를 상기 엔트리 풀로 반환하는 단계를 더 포함한다.
진술 126. 본 개시의 일 실시예는 진술 125에 따른 상기 물품을 포함하고,
상기 데이터 구조는 링크드 리스트 데이터 구조를 포함하고,
상기 엔트리를 상기 엔트리 풀로 반환하는 단계는, 적어도 부분적으로 상기 엔트리에 기초하여 상기 링크드 리스트 데이터 구조의 헤드 포인터를 제2 엔트리로 설정하는 단계를 포함한다.
진술 127. 본 개시의 일 실시예는 진술 124에 따른 물품을 포함하고, 상기 방법은, 적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리를 업데이트하는 단계를 더 포함한다.
진술 128. 본 개시의 일 실시예는 진술 127에 따른 상기 물품을 포함하고,
상기 엔트리는 카운트 또는 오프셋을 포함하는 참조를 포함하고,
적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리를 업데이트하는 단계는, 적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리의 상기 카운트 또는 상기 오프셋을 감소시키는 단계를 더 포함한다.
진술 129. 본 개시의 일 실시예는 비일시적 저장 매체를 포함하는 물품을 포함하고, 상기 비일시적 저장 매체는 장치에 의해 실행되는 경우 방법을 수행하게 하는 명령들을 저장하고, 상기 방법은,
스토리지 장치에서 호스트로부터 제1 명령이 이용가능하다는 통지를 수신하는 단계;
엔트리 풀이 비어있다고 결정하는 단계;
데이터 구조에서 제2 명령과 연관된 엔트리를 식별하는 단계; 및
상기 제1 명령을 상기 엔트리와 연관시키는 단계를 포함한다.
진술 130. 본 개시의 일 실시예는 진술 129에 따른 상기 물품을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 제1 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 스토리지 장치에서 상기 호스트로부터 도어벨 이벤트를 수신하는 단계를 포함한다.
진술 131. 본 개시의 일 실시예는 진술 130에 따른 상기 물품을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 도어벨 이벤트를 수신하는 단계는, 상기 호스트로부터 테일 포인터에 대한 업데이트를 수신하는 단계를 포함한다.
진술 132. 본 개시의 일 실시예는 진술 129에 따른 상기 물품을 포함하고, 상기 데이터 구조에서 상기 엔트리를 식별하는 단계는,
상기 엔트리가 이용가능하다고 결정하는 단계; 및
타임스탬프를 상기 엔트리에 저장하는 단계를 포함한다.
진술 133. 본 개시의 일 실시예는 진술 132에 따른 상기 물품을 포함하고, 상기 제1 명령과 상기 엔트리를 연관시키는 단계는, 상기 제1 명령과 상기 엔트리의 제3 명령을 연관시키는 단계를 포함한다.
진술 134. 본 개시의 일 실시예는 진술 132에 따른 상기 물품을 포함하고, 상기 제1 명령을 상기 엔트리와 연관시키는 단계는, 상기 엔트리로부터 상기 제1 명령으로의 참조를 설정하는 단계를 포함한다.
진술 135. 본 개시의 일 실시예는 진술 134에 따른 상기 물품을 포함하고, 상기 엔트리로부터 상기 제1 명령으로의 상기 참조를 설정하는 단계는, 상기 엔트리로부터 서브미션 큐의 상기 제1 명령으로의 상기 참조를 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 136. 본 개시의 일 실시예는 진술 134에 따른 상기 물품을 포함하고, 상기 엔트리로부터 상기 제1 명령으로의 상기 참조를 설정하는 단계는, 상기 제1 명령을 포함하는 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 137. 본 개시의 일 실시예는 진술 132에 따른 상기 물품을 포함하고, 상기 데이터 구조에서 상기 엔트리를 식별하는 단계는, 링크드 리스트 데이터 구조에서 상기 엔트리를 식별하는 단계를 더 포함한다.
진술 138. 본 개시의 일 실시예는 진술 137에 따른 상기 물품을 포함하고, 상기 제1 명령을 상기 엔트리와 연관시키는 단계는, 상기 엔트리를 상기 링크드 리스트 데이터 구조의 마지막으로 이동시키는 단계를 포함한다.
진술 139. 본 개시의 일 실시예는 진술 137에 따른 상기 물품을 포함하고, 상기 제1 명령을 상기 엔트리와 연관시키는 단계는,
상기 엔트리로부터 널 참조를 설정하는 단계; 및
상기 링크드 리스트 데이터 구조의 제2 엔트리로부터 상기 엔트리로의 참조를 설정하는 단계를 포함한다.
진술 140. 본 개시의 일 실시예는 진술 137에 따른 상기 물품을 포함하고, 상기 제1 명령을 상기 엔트리와 연관시키는 단계는, 상기 링크드 리스트 데이터 구조의 테일 포인터를 상기 엔트리로 설정하는 단계를 포함한다.
진술 141. 본 개시의 일 실시예는 진술 132에 따른 상기 물품을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 제1 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 제1 명령에 대한 상기 타임스탬프를 결정하는 단계를 포함한다.
진술 142. 본 개시의 일 실시예는 진술 141에 따른 상기 물품을 포함하고, 상기 제1 명령에 대한 상기 타임스탬프를 결정하는 단계는, 적어도 부분적으로 상기 스토리지 장치에서 상기 호스트로부터 상기 제1 명령이 이용가능하다는 상기 통지를 수신한 것에 기초하여 상기 타임스탬프를 결정하는 단계를 포함한다.
진술 143. 본 개시의 일 실시예는 진술 141에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은,
상기 명령을 검색하는 단계; 및
상기 제1 명령에 대한 상기 타임스탬프를 결정하는 단계를 더 포함하고, 상기 제1 명령에 대한 상기 타임스탬프를 결정하는 단계는 적어도 부분적으로 상기 명령을 검색한 것에 기초하여 상기 타임스탬프를 결정하는 단계를 포함한다.
진술 144. 본 개시의 일 실시예는 진술 129에 따른 상기 물품을 포함하고, 상기 데이터 구조에서 상기 엔트리를 식별하는 단계는,
상기 제2 명령을 식별하는 단계; 및
적어도 부분적으로 상기 제2 명령에 기초하여 상기 데이터 구조에서 상기 엔트리를 식별하는 단계를 포함한다.
진술 145. 본 개시의 일 실시예는 진술 144에 따른 상기 물품을 포함하고, 상기 엔트리는 적어도 부분적으로 상기 제2 명령에 기초한 타임스탬프를 포함한다.
진술 146. 본 개시의 일 실시예는 진술 144에 따른 상기 물품을 포함하고, 적어도 부분적으로 상기 제2 명령에 기초하여 상기 데이터 구조에서 상기 엔트리를 식별하는 단계는, 적어도 부분적으로 상기 제2 명령에 기초하여 링크드 리스트 데이터 구조에서 상기 엔트리를 식별하는 단계를 더 포함한다.
진술 147. 본 개시의 일 실시예는 진술 144에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은,
상기 스토리지 장치에 의해 제3 명령을 검색하는 단계;
상기 제3 명령과 연관된 제2 엔트리에 액세스하는 단계;
상기 제2 엔트리의 제1 타임스탬프 및 상기 제2 엔트리의 참조를 서브미션 큐 디스크립터로 복사하는 단계;
상기 제2 엔트리를 상기 엔트리 풀로 반환하는 단계;
결과를 생성하기 위한 상기 제3 명령을 실행하는 단계;
적어도 부분적으로 상기 결과에 기초하여 제2 타임스탬프를 결정하는 단계;
적어도 부분적으로 상기 제1 타임스탬프 및 상기 제2 타임스탬프에 기초하여 상기 제3 명령에 대한 에이지를 결정하는 단계;
상기 결과를 상기 스토리지 장치로부터 상기 호스트로 반환하는 단계; 및
상기 스토리지 장치로부터 상기 호스트로 상기 제3 명령에 대한 상기 에이지를 반환하는 단계를 포함한다.
진술 148. 본 개시의 일 실시예는 진술 147에 따른 상기 물품을 포함하고, 상기 제2 엔트리의 상기 제1 타임스탬프 및 상기 제2 엔트리의 상기 참조를 서브미션 큐 디스크립터로 복사하는 단계는, 상기 제2 엔트리의 상기 제1 타임스탬프 및 상기 제2 엔트리의 상기 명령을 포함하는 서브미션 큐의 요소를 식별하는 인덱스를 서브미션 큐 디스크립터로 복사하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 149. 본 개시의 일 실시예는 진술 147에 따른 상기 방법을 포함하고, 적어도 부분적으로 상기 결과를 생성하기 위한 상기 제3 명령을 실행한 것에 기초하여 상기 서브미션 큐 디스크립터를 업데이트하는 단계를 더 포함한다.
진술 150. 본 개시의 일 실시예는 진술 149에 따른 상기 방법을 포함하고,
상기 참조는 카운트 또는 오프셋을 포함하고,
적어도 부분적으로 상기 결과를 생성하기 위해 상기 제3 명령을 실행한 것에 기초하여 서브미션 큐 디스크립터를 업데이트하는 단계는, 적어도 부분적으로 상기 결과를 생성하기 위해 상기 제3 명령을 실행한 것에 기초하여 상기 서브미션 큐 디스크립터의 상기 카운트 또는 사익 오프셋을 감소시키는 단계를 포함한다.
진술 151. 본 개시의 일 실시예는 비일시적 저장 매체를 포함하는 물품을 포함하고, 상기 비일시적 저장 매체는 장치에 의해 실행되는 경우 방법을 수행하게 하는 명령들을 저장하고, 상기 방법은,
스토리지 장치에서 호스트로부터 명령이 이용가능하다는 통지를 수신하는 단계;
엔트리 풀이 비어있다고 결정하는 단계;
적어도 부분적으로 상기 통지를 수신한 것에 기초하여 타임스탬프를 결정하는 단계;
상기 타임스탬프를 버퍼에 저장하는 단계; 및
상기 명령을 상기 버퍼와 연관시키는 단계를 포함한다.
진술 152. 본 개시의 일 실시예는 진술 151에 따른 상기 물품을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 스토리지 장치에서 상기 호스트로부터 도어벨 이벤트를 수신하는 단계를 포함한다.
진술 153. 본 개시의 일 실시예는 진술 152에 따른 상기 물품을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 도어벨 이벤트를 수신하는 단계는, 상기 호스트로부터 테일 포인터에 대한 업데이트를 수신하는 단계를 포함한다.
진술 154. 본 개시의 일 실시예는 진술 151에 대한 상기 물품을 포함하고, 상기 명령을 상기 버퍼와 연관시키는 단계는, 상기 버퍼로부터 상기 명령으로의 참조를 설정하는 단계를 포함한다.
진술 155. 본 개시의 일 실시예는 진술 154에 따른 상기 물품을 포함하고, 상기 버퍼로부터 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 버퍼로부터 서브미션 큐의 상기 명령으로의 상기 참조를 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 156. 본 개시의 일 실시예는 진술 154에 따른 상기 물품을 포함하고, 상기 버퍼로부터 상기 서브미션 큐의 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 명령을 포함하는 상기 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함한다.
진술 157. 본 개시의 일 실시예는 진술 151에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은,
상기 스토리지 장치에서 상기 호스트로부터 제2 명령이 이용가능하다는 제2 통지를 수신하는 단계;
상기 엔트리 풀이 비어있다고 결정하는 단계;
적어도 부분적으로 상기 제2 통지를 수신한 것에 기초하여 제2 타임스탬프를 결정하는 단계;
상기 제2 타임스탬프를 제2 버퍼에 저장하는 단계; 및
상기 제2 명령을 사기 제2 버퍼와 연관시키는 단계를 포함한다.
진술 158. 본 개시의 일 실시예는 진술 157에 따른 상기 물품을 포함하고, 상기 제2 명령을 상기 제2 버퍼와 연관시키는 단계는, 상기 제2 버퍼로부터 서브미션 큐의 상기 제2 명령으로의 참조를 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 159. 본 개시의 일 실시예는 진술 158에 따른 상기 물품을 포함하고, 상기 제2 버퍼로부터 상기 서브미션 큐의 상기 제2 명령으로의 상기 참조를 설정하는 단계는, 상기 제2 명령을 포함하는 상기 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함한다.
진술 160. 본 개시의 일 실시예는 진술 157에 따른 상기 물품을 포함하고, 상기 명령은 서브미션 큐에 있고, 상기 호스트는 상기 서브미션 큐를 포함하고, 상기 제2 명령은 상기 서브미션 큐에 있다.
진술 161. 본 개시의 일 실시예는 진술 157에 따른 상기 물품을 포함하고, 상기 명령은 서브미션 큐에 있고, 상기 호스트는 상기 서브미션 큐를 포함하고, 상기 제2 명령은 제2 서브미션 큐에 있고, 상기 호스트는 상기 제2 서브미션 큐를 포함한다.
진술 162. 본 개시의 일 실시예는 비일시적 저장 매체를 포함하는 물품을 포함하고, 상기 비일시적 저장 매체는 장치에 의해 실행되는 경우 방법을 수행하게 하는 명령들을 저장하고, 상기 방법은,
스토리지 장치에서 시간 윈도우를 시작하는 단계;
상기 스토리지 장치에서 호스트로부터 상기 시간 윈도우 동안 제1 명령이 이용가능하다는 통지를 수신하는 단계;
상기 스토리지 장치의 스토리지의 엔트리 풀로부터 엔트리를 선택하는 단계;
상기 시간 윈도우와 연관된 타임스탬프를 상기 엔트리에 저장하는 단계;
상기 명령을 상기 엔트리와 연관시키는 단계;
상기 엔트리를 상기 스토리지 장치의 데이터 구조에 추가하는 단계; 및
상기 스토리지 장치의 상기 시간 위도우를 종료하는 단계를 포함한다.
진술 163. 본 개시의 일 실시예는 진술 162에 따른 상기 물품을 포함하고, 상기 타임스탬프는 상기 시간 위도우의 시작 시간 또는 상기 시작 윈도우의 종료 시간 중 적어도 하나를 포함한다.
진술 164. 본 개시의 일 실시예는 진술 162에 따른 상기 물품을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 명령이 이용가능하다는 상기 통지를 수신하는 단계는, 상기 스토리지 장치에서 상기 호스트로부터 도어벨 이벤트를 수신하는 단계를 포함한다.
진술 165. 본 개시의 일 실시예는 진술 166에 따른 상기 물품을 포함하고, 상기 스토리지 장치에서 상기 호스트로부터 상기 도어벨 이벤트를 수신하는 단계는, 상기 호스트로부터 테일 포인터에 대한 업데이트를 수신하는 단계를 포함한다.
진술 166. 본 개시의 일 실시예는 진술 162에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은,
상기 스토리지 장치에서 상기 호스트로부터 상기 시간 윈도우 동안 제2 명령이 이용가능하다는 제2 통지를 수신하는 단계; 및
상기 제2 명령과 상기 엔트리를 연관시키는 단계를 포함한다.
진술 167. 본 개시의 일 실시예는 진술 162에 따른 상기 물품을 포함하고, 상기 명령을 상기 엔트리와 연관시키는 단계는, 상기 엔트리로부터 상기 명령으로의 참조를 설정하는 단계를 포함한다.
진술 168. 본 개시의 일 실시예는 진술 167에 따른 상기 물품을 포함하고, 상기 엔트리로부터 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 엔트리로부터 서브미션 큐의 상기 명령으로의 상기 참조를 설정하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 169. 본 개시의 일 실시예는 진술 168에 따른 상기 물품을 포함하고, 상기 엔트리로부터 상기 서브미션 큐의 상기 명령으로의 상기 참조를 설정하는 단계는, 상기 명령을 포함하는 상기 서브미션 큐의 요소를 식별하는 인덱스를 저장하는 단계를 포함하고, 상기 호스트는 상기 서브미션 큐를 포함한다.
진술 170. 본 개시의 일 실시예는 진술 167에 따른 상기 물품을 포함하고,
상기 호스트는 제2 서브미션 큐를 더 포함하고,
상기 데이터 구조는 상기 서브미션 큐와 연관되고,
상기 스토리지 장치는 상기 제2 서브미션 큐와 연관된 제2 데이터 구조를 포함한다.
진술 171. 본 개시의 일 실시예는 진술 170에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은,
상기 스토리지 장치에서 제2 시간 윈도우를 시작하는 단계;
상기 스토리지 장치에서 상기 호스트로부터 상기 제2 시간 윈도우 동안 제2 명령이 이용가능하다는 제2 통지를 수신하는 단계;
상기 스토리지 장치의 상기 스토리지의 상기 엔트리 풀로부터 제2 엔트리를 선택하는 단계;
제2 타임스탬프를 상기 제2 엔트리에 저장하는 단계;
상기 제2 명령을 상기 제2 엔트리와 연관시키는 단계;
상기 네2 엔트리를 상기 스토리지 장치의 상기 제2 데이터 구조에 추가하는 단계; 및
상기 스토리지 장치의 상기 제2 시간 위도우를 종료하는 단계를 포함한다.
진술 172. 본 개시의 일 실시예는 진술 171에 따른 상기 물품을 포함하고, 상기 제1 시간 윈도우는 상기 제2 시간 윈도우이다.
진술 173. 본 개시의 일 실시예는 진술 162에 따른 상기 물품을 포함하고, 상기 스토리지 장치의 스토리지의 상기 엔트리 풀로부터 상기 엔트리를 선택하는 단계는, 상기 엔트리를 초기화하는 단계를 포함한다.
진술 174. 본 개시의 일 실시예는 진술 173에 따른 상기 물품을 포함하고, 상기 엔트리를 초기화하는 단계는, 상기 엔트리에서 참조를 클리어링하는 단계를 포함한다.
진술 175. 본 개시의 일 실시예는 진술 162에 따른 상기 물품을 포함하고, 상기 엔트리를 상기 스토리지 장치의 데이터 구조에 추가하는 단계는, 상기 엔트리를 링크드 리스트 데이터 구조에 추가하는 단계를 포함한다.
진술 176. 본 개시의 일 실시예는 진술 175에 따른 상기 물품을 포함하고, 상기 엔트리를 상기 링크드 리스트 데이터 구조에 추가하는 단계는,
상기 엔트리로부터 널 참조를 설정하는 단계; 및
상기 링크드 리스트 데이터 구조의 제2 엔트리로부터 상기 엔트리로의 참조를 설정하는 단계를 포함한다.
진술 177. 본 개시의 일 실시예는 진술 175에 따른 상기 물품을 포함하고, 상기 엔트리를 상기 링크드 리스트 데이터 구조에 추가하는 단계는, 상기 링크드 리스트 데이터의 구조의 테일 포인터를 상기 엔트리로 설정하는 단계를 포함한다.
진술 178. 본 개시의 일 실시예는 진술 162에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은,
상기 스토리지 장치에 의해 상기 명령을 검색하는 단계;
상기 엔트리로부터 상기 타임스탬프에 액세스하는 단계;
결과를 생성하기 위해 상기 명령을 실행하는 단계;
적어도 부분적으로 상기 결과에 기초하여 제2 타임스탬프를 결정하는 단계;
적어도 부분적으로 상기 타임스탬프 및 상기 제2 타임스탬프에 기초하여 상기 명령의 에이지를 결정하는 단계;
상기 스토리지 장치로부터 상기 호스트로 상기 결과를 반환하는 단계; 및
상기 스토리지 장치로부터 상기 호스트로 상기 명령의 상기 에이지를 반환하는 단계를 포함한다.
진술 179. 본 개시의 일 실시예는 진술 178에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 상기 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은,
상기 엔트리를 상기 엔트리 풀로 반환하는 단계를 포함한다.
진술 180. 본 개시의 일 실시예는 진술 179에 따른 상기 물품을 포함하고,
상기 데이터 구조는 링크드 리스트 데이터 구조를 포함하고,
상기 엔트리를 상기 엔트리 풀로 반환하는 단계는, 적어도 부분적으로 상기 엔트리에 기초하여 상기 링크드 리스트 데이터 구조의 상기 헤드 포인터를 제2 엔트리로 설정하는 단계를 포함한다.
진술 181. 본 개시의 일 실시예는 진술 178에 따른 상기 물품을 포함하고, 적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리를 업데이트하는 단계를 더 포함한다.
진술 182. 본 개시의 일 실시예는 진술 171에 따른 상기 물품을 포함하고,
상기 엔트리는 카운트 또는 오프셋을 포함하는 참조를 포함하고,
적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리를 업데이트하는 단계는, 적어도 부분적으로 상기 결과를 생성하기 위해 상기 명령을 실행한 것에 기초하여 상기 엔트리의 상기 카운트 또는 상기 오프셋을 감소시키는 단계를 포함한다.
진술 183. 본 개시의 일 실시예는 비일시적 저장 매체를 포함하는 물품을 포함하고, 상기 비일시적 저장 매체는 장치에 의해 실행되는 경우 방법을 수행하게 하는 명령들을 저장하고, 상기 방법은,
스토리지 장치에서 데이터 구조의 엔트리에 액세스하는 단계;
상기 엔트리로부터 제1 타임스탬프를 결정하는 단계;
상기 제2 타임스탬프를 결정하는 단계; 및
적어도 부분적으로 상기 제1 타임스탬프 및 상기 제2 타임스탬프에 기초하여 타임아웃이 발생했음을 결정하는 단계를 포함한다.
진술 184. 본 개시의 일 실시예는 진술 183에 따른 상기 물품을 포함하고, 적어도 부분적으로 상기 제1 타임스탬프 및 상기 제2 타임스탬프에 기초하여 상기 타임아웃이 발생했음을 결정하는 단계는,
임계치를 결정하는 단계;
상기 제1 타임스탬프 및 상기 제2 타임스탬프 사이의 차이를 결정하는 단계; 및
적어도 부분적으로 상기 차이 및 상기 임계치에 기초하여 상기 타임아웃이 발생했음을 결정하는 단계를 포함한다.
진술 185. 본 개시의 일 실시예는 진술 183에 따른 상기 물품을 포함하고, 상기 비일시적 저장 매체는 상기 장치에 의해 실행되는 경우 방법을 수행하게 하는 명령들을 더 저장하고, 상기 방법은, 상기 스토리지 장치로부터 호스트로 상기 타임아웃을 보고하는 단계를 포함한다.
결론적으로, 본 개시에서 기술된 실시예들에 대한 다양한 변형들의 관점에서, 본 상세한 설명 및 첨부된 자료는 예시적인 것일 뿐이고, 본 개시의 범위를 제안하는 것으로 받아들여져서는 안 된다. 따라서 본 개시로서 청구되는 것은 다음의 청구범위 및 이에 대응하는 균등물의 범위 및 사상에 포함될 수 있는 모든 수정들이다.
110: 프로세서
115: 메모리
120: 스토리지 장치
125: 메모리 컨트롤러
130: 장치 드라이버
340: 메모리
425-1: 도어벨1
425-2: 도어벨2
425: 테일 포인터
610: 헤드 포인터

Claims (10)

  1. 데이터를 위한 제1 스토리지;
    호스트로부터 상기 데이터에 적용가능한 명령을 액세스하는 인터페이스;
    상기 명령을 실행하는 컨트롤러; 및
    타임스탬프를 위한 제1 데이터 필드 및 상기 명령에 대한 참조를 위한 제2데이터 필드를 포함하는 엔트리를 위한 제2 스토리지를 포함하는 스토리지 장치.
  2. 제1 항에 있어서, 상기 제2 스토리지는,
    상기 엔트리를 포함하는 데이터 구조; 및
    제2 엔트리를 포함하는 엔트리 풀을 포함하는 스토리지 장치.
  3. 제1 항에 있어서, 상기 제2 스토리지는,
    상기 엔트리를 포함하는 제1 데이터 구조; 및
    제2 엔트리를 포함하는 제2 데이터 구조를 포함하는 스토리지 장치.
  4. 제1 항에 있어서, 상기 스토리지 장치는,
    상기 호스트로부터 상기 명령이 이용가능하다는 통지를 수신하는 스토리지 장치.
  5. 제1 항에 있어서, 상기 컨트롤러는,
    적어도 부분적으로 상기 명령을 실행한 것에 기초하여 상기 엔트리를 엔트리 풀로 반환하는 스토리지 장치.
  6. 제1 항에 있어서,
    적어도 부분적으로 상기 엔트리의 상기 제1 데이터 필드의 상기 타임스탬프 및 제2 타임스탬프에 기초하여, 상기 명령의 에이지(age)를 결정하는 에이지 계산기를 더 포함하는 스토리지 장치.
  7. 제1 항에 있어서, 상기 컨트롤러는,
    적어도 부분적으로 상기 엔트리에 기초하여 타임아웃이 발생했음을 결정하는 타임아웃 검출기를 포함하는 스토리지 장치.
  8. 제1 항에 있어서,
    상기 스토리지 장치는, 서브미션 큐 디스크립터를 더 포함하고,
    상기 컨트롤러는,
    적어도 부분적으로 상기 명령을 실행하는 상기 컨트롤러에 기초하여, 상기 타임스탬프 및 상기 참조를 상기 엔트리로부터 상기 서브미션 큐 디스크립터로 복사하고, 상기 엔트리를 엔트리 풀로 반환하는 스토리지 장치.
  9. 제1 항에 있어서,
    버퍼를 더 포함하고,
    상기 버퍼는 제2 타임스탬프를 위한 제3 데이터 필드를 포함하고,
    상기 버퍼는 제2 명령과 연관되는 스토리지 장치.
  10. 스토리지 장치에서, 호스트로부터 명령이 이용가능하다는 통지를 수신하는 단계;
    적어도 부분적으로 상기 통지에 기초하여 타임스탬프를 결정하는 단계;
    상기 스토리지 장치의 스토리지에 있는 엔트리 풀로부터 엔트리를 선택하는 단계;
    상기 타임스탬프를 상기 엔트리에 저장하는 단계;
    상기 명령을 상기 엔트리와 연관시키는 단계; 및
    상기 엔트리를 상기 스토리지 장치의 데이터 구조에 추가하는 단계를 포함하는 스토리지 장치의 동작 방법.
KR1020230090054A 2022-08-19 2023-07-11 서브미션 큐 엔트리 에이지 추적 KR20240026080A (ko)

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
US202263399578P 2022-08-19 2022-08-19
US63/399,578 2022-08-19
US17/972,574 US20240061580A1 (en) 2022-08-19 2022-10-24 Submission queue entry age tracking
US17/972,574 2022-10-24

Publications (1)

Publication Number Publication Date
KR20240026080A true KR20240026080A (ko) 2024-02-27

Family

ID=87136593

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020230090054A KR20240026080A (ko) 2022-08-19 2023-07-11 서브미션 큐 엔트리 에이지 추적

Country Status (3)

Country Link
US (1) US20240061580A1 (ko)
EP (1) EP4325347A1 (ko)
KR (1) KR20240026080A (ko)

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10379747B2 (en) * 2015-12-21 2019-08-13 Western Digital Technologies, Inc. Automated latency monitoring
US10564853B2 (en) * 2017-04-26 2020-02-18 Western Digital Technologies, Inc. System and method for locality detection to identify read or write streams in a memory device
US10409739B2 (en) * 2017-10-24 2019-09-10 Micron Technology, Inc. Command selection policy
JP2019175292A (ja) * 2018-03-29 2019-10-10 東芝メモリ株式会社 電子機器、コンピュータシステム、および制御方法
US11392320B2 (en) * 2018-07-03 2022-07-19 Western Digital Technologies, Inc. Quality of service based arbitrations optimized for enterprise solid state drives

Also Published As

Publication number Publication date
US20240061580A1 (en) 2024-02-22
EP4325347A1 (en) 2024-02-21

Similar Documents

Publication Publication Date Title
US9183136B2 (en) Storage control apparatus and storage control method
US20190073372A1 (en) Creating Snapshots Of A Storage Volume In A Distributed Storage System
US8166233B2 (en) Garbage collection for solid state disks
US20080195833A1 (en) Systems, methods and computer program products for operating a data processing system in which a file system's unit of memory allocation is coordinated with a storage system's read/write operation unit
EP1729218A1 (en) Nonvolatile storage system
US11630767B2 (en) Garbage collection—automatic data placement
JP2013530448A (ja) キャッシュストレージアダプタアーキテクチャ
AU2012279345B2 (en) Techniques for moving data between memory types
US10140031B2 (en) Hierarchical flash translation layer structure and method for designing the same
US20130166828A1 (en) Data update apparatus and method for flash memory file system
US10552045B2 (en) Storage operation queue
US20200081833A1 (en) Apparatus and method for managing valid data in memory system
CN111399750B (zh) 闪存数据写入方法及计算机可读取存储介质
KR20210063764A (ko) 메모리 시스템의 동작 방법 및 장치
KR20230012440A (ko) 이기종 메모리 시스템에서의 로드 밸런싱을 위한 시스템 및 방법
EP4372540A1 (en) Techniques for zoned namespace (zns) storage using multiple zones
US9104325B2 (en) Managing read operations, write operations and extent change operations
KR20240026080A (ko) 서브미션 큐 엔트리 에이지 추적
US20080059706A1 (en) Storage apparatus, storage system and control method for storage apparatus
US11494113B2 (en) Computer program product and method and apparatus for scheduling execution of host commands
KR20200014175A (ko) 소요시간을 예측하여 가비지 컬렉션을 수행하는 방법 및 장치
CN112148203B (zh) 存储器管理方法、装置、电子设备及存储介质
CN117591439A (zh) 提交队列条目使用期限跟踪
KR20200126531A (ko) 메모리 시스템 및 그의 커맨드 수행 방법
US9304918B2 (en) Computer system and cache control method