~에서io_uring에 관한 논문, 커밋 링에는 커밋 이벤트 자체가 저장되는 커밋 배열에 대한 인덱스가 포함되어 있습니다. 설명서에서는 이러한 간접 수준을 다음과 같이 설명합니다.
중요한 차이점은 CQ 링이 cqes의 공유 배열을 직접 인덱싱하는 반면 커밋 측은 이들 사이에 간접 배열을 갖는다는 것입니다. 따라서 커밋 측 링 버퍼는 이 배열에 대한 인덱스이며, 이 배열에는 sqes에 대한 인덱스가 포함됩니다. 언뜻 보면 이상하고 혼란스러워 보일 수 있지만 그 뒤에는 몇 가지 이유가 있습니다. 일부 애플리케이션은 내부 데이터 구조에 요청 단위를 포함할 수 있으며, 이는 단일 작업으로 여러 SQLS를 제출하는 기능을 유지하면서 이를 수행할 수 있는 유연성을 제공합니다. 그러면 해당 애플리케이션을 io_uring 인터페이스로 더 쉽게 변환할 수 있습니다.
그러나 "애플리케이션이 내부 데이터 구조에 요청 단위를 삽입할 수 있다"는 것이 무엇을 의미하는지 이해하지 못하며 간접 계층이 이를 통해 달성하는 것에 대한 직관도 이해하지 못합니다.
이 간접 계층의 이점이 무엇인지 다른 말로 설명할 수 있는 사람이 있습니까?
답변1
나는 논문의 저자에게 연락하여 몇 가지 설명을 들었습니다.
간접 계층이 존재하는 이유는 일부 응용 프로그램이 해당 응용 프로그램별 데이터 구조에 커밋 이벤트 데이터를 저장하려고 할 수 있기 때문입니다. 어레이가 이벤트를 보유하도록 함으로써 애플리케이션은 효과적으로 어레이에 있는 슬롯의 장기 소유권을 가져오고 이를 애플리케이션 자체에서 참조합니다. 시간이 지나면 채워주세요. IO를 커밋할 준비가 되면 이벤트 인덱스를 링에 넣을 수 있습니다.
그러나 배열은 없지만 링에 이벤트가 보관되어 있는 경우 IO 커밋 중에 이벤트를 애플리케이션 구조에서 링으로 복사해야 합니다. 링은 이벤트 삽입 시간에 따라 정렬되므로 애플리케이션이 이벤트를 "예약"할 수 없기 때문입니다. 미리 삽입하여 사용하세요. 이는 배열로 피할 수 있는 일련의 추가 복사본입니다.