io_uring_0203
IO_URING cp with liburing
'liburing'를 이용한 cp 프로그램
이전 섹션에서는 'liburing'에서 제공하는 'io_uring'에 대한 고급 인터페이스를 사용하여 Unix cat 유틸리티와 동등한 것을 빌드하는 방법을 살펴보았습니다.
그러나 이 예에서는 동시에 두 개 이상의 요청을 대기열에 추가하지 않았습니다.
'io_uring'의 목표 중 하나는 사용자가 한 번에 여러 작업을 대기열에 추가하여 필요한 시스템 호출 수를 줄이는 것입니다.
커널은 프로그램이 각 I/O 요청에 대해 하나 이상의 시스템 호출을 거치지 않고도 이를 한 번에 선택하여 처리할 수 있습니다.
이를 위해 이번 파트에서는 파일을 복사하는 복사 프로그램을 구축합니다.
대기열 깊이가 허용하는 한 많은 요청을 대기열에 추가하여 최대한 효율적으로 작업하려고 합니다.
몇 가지 코드를 살펴보겠습니다. 필요한 곳에 크레딧을 제공하기 위해 이는 fio 패키지의 프로그램을 기반으로 합니다.
📦 Program structure
대부분의 다른 프로그램과 마찬가지로 이 복사 프로그램은 첫 번째 인수가 가리키는 파일을 두 번째 인수가 가리키는 파일로 복사합니다.
프로그램의 핵심은 copy_file() 함수입니다.
여기서는 외부 while 루프를 설정합니다. 이 루프에는 동일한 수준의 다른 while 루프가 내부에 중첩되어 있습니다.
외부 while 루프는 소스 파일의 모든 바이트가 복사되도록 하는 반면, 첫 번째 중첩 while 루프는 가능한 한 많은 readv(2) 유형 요청을 생성하는 작업을 수행합니다.
실제로 대기열 깊이가 허용하는 만큼 대기열에 추가됩니다.
대기열이 가득 차면 두 번째 중첩 while 루프로 이동합니다.
이 루프는 완료 대기열 항목을 수집하고 대상 파일 쓰기 요청을 제출합니다. 이제 데이터를 읽었습니다.
상태를 추적하는 여러 변수가 있으며 약간 혼란스러울 수 있습니다.
그러나 비동기 파일 복사 프로그램은 얼마나 어려울 수 있습니까? :)
Based on
io_uring By Example: Part 2 – Queuing multiple requests
